Commit 79052cd4 authored by Michael Niedermayer's avatar Michael Niedermayer

Merge commit '078d43e2'

* commit '078d43e2':
  rtpdec: Free depacketizers if the init function failed
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents fa80b76b 078d43e2
...@@ -298,9 +298,6 @@ rdt_parse_packet (AVFormatContext *ctx, PayloadContext *rdt, AVStream *st, ...@@ -298,9 +298,6 @@ rdt_parse_packet (AVFormatContext *ctx, PayloadContext *rdt, AVStream *st,
int seq = 1, res; int seq = 1, res;
AVIOContext pb; AVIOContext pb;
if (!rdt->rmctx)
return AVERROR(EINVAL);
if (rdt->audio_pkt_cnt == 0) { if (rdt->audio_pkt_cnt == 0) {
int pos; int pos;
......
...@@ -129,7 +129,7 @@ struct RTPDynamicProtocolHandler { ...@@ -129,7 +129,7 @@ struct RTPDynamicProtocolHandler {
PayloadContext *priv_data, const char *line); PayloadContext *priv_data, const char *line);
/** Free any data needed by the rtp parsing for this dynamic data. /** Free any data needed by the rtp parsing for this dynamic data.
* Don't free the protocol_data pointer itself, that is freed by the * Don't free the protocol_data pointer itself, that is freed by the
* caller. */ * caller. This is called even if the init method failed. */
void (*free)(PayloadContext *protocol_data); void (*free)(PayloadContext *protocol_data);
/** Parse handler for this dynamic packet */ /** Parse handler for this dynamic packet */
DynamicPayloadPacketHandlerProc parse_packet; DynamicPayloadPacketHandlerProc parse_packet;
......
...@@ -60,9 +60,6 @@ static int mpegts_handle_packet(AVFormatContext *ctx, PayloadContext *data, ...@@ -60,9 +60,6 @@ static int mpegts_handle_packet(AVFormatContext *ctx, PayloadContext *data,
// different ranges. // different ranges.
*timestamp = RTP_NOTS_VALUE; *timestamp = RTP_NOTS_VALUE;
if (!data->ts)
return AVERROR(EINVAL);
if (!buf) { if (!buf) {
if (data->read_buf_index >= data->read_buf_size) if (data->read_buf_index >= data->read_buf_size)
return AVERROR(EAGAIN); return AVERROR(EAGAIN);
......
...@@ -198,6 +198,25 @@ static void init_rtp_handler(RTPDynamicProtocolHandler *handler, ...@@ -198,6 +198,25 @@ static void init_rtp_handler(RTPDynamicProtocolHandler *handler,
} }
} }
static void finalize_rtp_handler_init(AVFormatContext *s, RTSPStream *rtsp_st,
AVStream *st)
{
if (rtsp_st->dynamic_handler && rtsp_st->dynamic_handler->init) {
int ret = rtsp_st->dynamic_handler->init(s, st ? st->index : -1,
rtsp_st->dynamic_protocol_context);
if (ret < 0) {
if (rtsp_st->dynamic_protocol_context) {
if (rtsp_st->dynamic_handler->free)
rtsp_st->dynamic_handler->free(
rtsp_st->dynamic_protocol_context);
av_free(rtsp_st->dynamic_protocol_context);
}
rtsp_st->dynamic_protocol_context = NULL;
rtsp_st->dynamic_handler = NULL;
}
}
}
/* parse the rtpmap description: <codec_name>/<clock_rate>[/<other params>] */ /* parse the rtpmap description: <codec_name>/<clock_rate>[/<other params>] */
static int sdp_parse_rtpmap(AVFormatContext *s, static int sdp_parse_rtpmap(AVFormatContext *s,
AVStream *st, RTSPStream *rtsp_st, AVStream *st, RTSPStream *rtsp_st,
...@@ -266,9 +285,7 @@ static int sdp_parse_rtpmap(AVFormatContext *s, ...@@ -266,9 +285,7 @@ static int sdp_parse_rtpmap(AVFormatContext *s,
default: default:
break; break;
} }
if (rtsp_st->dynamic_handler && rtsp_st->dynamic_handler->init) finalize_rtp_handler_init(s, rtsp_st, st);
rtsp_st->dynamic_handler->init(s, st->index,
rtsp_st->dynamic_protocol_context);
return 0; return 0;
} }
...@@ -451,8 +468,7 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1, ...@@ -451,8 +468,7 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1,
handler = ff_rtp_handler_find_by_id( handler = ff_rtp_handler_find_by_id(
rtsp_st->sdp_payload_type, AVMEDIA_TYPE_DATA); rtsp_st->sdp_payload_type, AVMEDIA_TYPE_DATA);
init_rtp_handler(handler, rtsp_st, NULL); init_rtp_handler(handler, rtsp_st, NULL);
if (handler && handler->init) finalize_rtp_handler_init(s, rtsp_st, NULL);
handler->init(s, -1, rtsp_st->dynamic_protocol_context);
} }
} else if (rt->server_type == RTSP_SERVER_WMS && } else if (rt->server_type == RTSP_SERVER_WMS &&
codec_type == AVMEDIA_TYPE_DATA) { codec_type == AVMEDIA_TYPE_DATA) {
...@@ -476,9 +492,7 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1, ...@@ -476,9 +492,7 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1,
handler = ff_rtp_handler_find_by_id( handler = ff_rtp_handler_find_by_id(
rtsp_st->sdp_payload_type, st->codec->codec_type); rtsp_st->sdp_payload_type, st->codec->codec_type);
init_rtp_handler(handler, rtsp_st, st); init_rtp_handler(handler, rtsp_st, st);
if (handler && handler->init) finalize_rtp_handler_init(s, rtsp_st, st);
handler->init(s, st->index,
rtsp_st->dynamic_protocol_context);
} }
if (rt->default_lang[0]) if (rt->default_lang[0])
av_dict_set(&st->metadata, "language", rt->default_lang, 0); av_dict_set(&st->metadata, "language", rt->default_lang, 0);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment