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: /[/] */ 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);