diff --git a/libavformat/rdt.c b/libavformat/rdt.c index 2574496d2fd1f3839248ba11b9ebb131301300a1..96b9eeb4c552515c80b61f2a01a2bd4c2b92cd20 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 8992c38d3b3fc81b22938785b40554339094bce0..6087b7e055d6e8f5e45b10c08e7a15008f26b79a 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 72e11a8af24e35812e241b45f3f2a35e6ae2abb7..eb88873577ffd923736211b5950d88033eb02d24 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 50cefb09bcc79b8954469f780c7d6189d48f7d09..49a89dfae89f78acd3c32d4394e7269e11060544 100644 --- a/libavformat/rtsp.c +++ b/libavformat/rtsp.c @@ -193,6 +193,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, @@ -261,9 +280,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; } @@ -444,8 +461,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) { @@ -469,9 +485,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);