summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavformat/rdt.c3
-rw-r--r--libavformat/rtpdec.h2
-rw-r--r--libavformat/rtpdec_mpegts.c3
-rw-r--r--libavformat/rtsp.c30
4 files changed, 23 insertions, 15 deletions
diff --git a/libavformat/rdt.c b/libavformat/rdt.c
index 2574496d2f..96b9eeb4c5 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 8992c38d3b..6087b7e055 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 72e11a8af2..eb88873577 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 50cefb09bc..49a89dfae8 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: <codec_name>/<clock_rate>[/<other params>] */
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);