diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2015-02-25 00:31:39 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2015-02-25 00:32:06 +0100 |
commit | 79052cd4ce4a8857cd1088cc69ba59506dfb1b81 (patch) | |
tree | 0fd3a32dc325c6eeec6cf17c47d8616b2e59016e /libavformat | |
parent | fa80b76b110c663809671f7254bc07513710c061 (diff) | |
parent | 078d43e23a7a3d64aafee8a58b380d3e139b3020 (diff) | |
download | ffmpeg-79052cd4ce4a8857cd1088cc69ba59506dfb1b81.tar.gz |
Merge commit '078d43e23a7a3d64aafee8a58b380d3e139b3020'
* commit '078d43e23a7a3d64aafee8a58b380d3e139b3020':
rtpdec: Free depacketizers if the init function failed
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/rdt.c | 3 | ||||
-rw-r--r-- | libavformat/rtpdec.h | 2 | ||||
-rw-r--r-- | libavformat/rtpdec_mpegts.c | 3 | ||||
-rw-r--r-- | libavformat/rtsp.c | 30 |
4 files changed, 23 insertions, 15 deletions
diff --git a/libavformat/rdt.c b/libavformat/rdt.c index 3d28be7b92..27c5f9e669 100644 --- a/libavformat/rdt.c +++ b/libavformat/rdt.c @@ -298,9 +298,6 @@ rdt_parse_packet (AVFormatContext *ctx, PayloadContext *rdt, AVStream *st, int seq = 1, res; AVIOContext pb; - if (!rdt->rmctx) - return AVERROR(EINVAL); - if (rdt->audio_pkt_cnt == 0) { int pos; diff --git a/libavformat/rtpdec.h b/libavformat/rtpdec.h index 23329b6df3..356449aefa 100644 --- a/libavformat/rtpdec.h +++ b/libavformat/rtpdec.h @@ -129,7 +129,7 @@ struct RTPDynamicProtocolHandler { PayloadContext *priv_data, const char *line); /** 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 - * caller. */ + * caller. This is called even if the init method failed. */ void (*free)(PayloadContext *protocol_data); /** Parse handler for this dynamic packet */ DynamicPayloadPacketHandlerProc parse_packet; diff --git a/libavformat/rtpdec_mpegts.c b/libavformat/rtpdec_mpegts.c index c0c07fd0f8..6b9c6768dd 100644 --- a/libavformat/rtpdec_mpegts.c +++ b/libavformat/rtpdec_mpegts.c @@ -60,9 +60,6 @@ static int mpegts_handle_packet(AVFormatContext *ctx, PayloadContext *data, // different ranges. *timestamp = RTP_NOTS_VALUE; - if (!data->ts) - return AVERROR(EINVAL); - if (!buf) { if (data->read_buf_index >= data->read_buf_size) return AVERROR(EAGAIN); diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c index 32ff18ec03..890b77d866 100644 --- a/libavformat/rtsp.c +++ b/libavformat/rtsp.c @@ -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>] */ static int sdp_parse_rtpmap(AVFormatContext *s, AVStream *st, RTSPStream *rtsp_st, @@ -266,9 +285,7 @@ static int sdp_parse_rtpmap(AVFormatContext *s, default: break; } - if (rtsp_st->dynamic_handler && rtsp_st->dynamic_handler->init) - rtsp_st->dynamic_handler->init(s, st->index, - rtsp_st->dynamic_protocol_context); + finalize_rtp_handler_init(s, rtsp_st, st); return 0; } @@ -451,8 +468,7 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1, handler = ff_rtp_handler_find_by_id( rtsp_st->sdp_payload_type, AVMEDIA_TYPE_DATA); init_rtp_handler(handler, rtsp_st, NULL); - if (handler && handler->init) - handler->init(s, -1, rtsp_st->dynamic_protocol_context); + finalize_rtp_handler_init(s, rtsp_st, NULL); } } else if (rt->server_type == RTSP_SERVER_WMS && codec_type == AVMEDIA_TYPE_DATA) { @@ -476,9 +492,7 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1, handler = ff_rtp_handler_find_by_id( rtsp_st->sdp_payload_type, st->codec->codec_type); init_rtp_handler(handler, rtsp_st, st); - if (handler && handler->init) - handler->init(s, st->index, - rtsp_st->dynamic_protocol_context); + finalize_rtp_handler_init(s, rtsp_st, st); } if (rt->default_lang[0]) av_dict_set(&st->metadata, "language", rt->default_lang, 0); |