aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2015-02-24 13:18:10 +0200
committerMartin Storsjö <martin@martin.st>2015-02-24 23:07:39 +0200
commit078d43e23a7a3d64aafee8a58b380d3e139b3020 (patch)
tree48429645f5c20aecd67571e8d4b9b1902c0e1cc4
parentbb4a310bb85f43e62240145a656b1e5285b14239 (diff)
downloadffmpeg-078d43e23a7a3d64aafee8a58b380d3e139b3020.tar.gz
rtpdec: Free depacketizers if the init function failed
This is different from how it is handled in codecs/demuxers/muxers though (where the close function isn't called if the open function failed), but since the number of depacketizers that have an .init function is quite limited, this is easy to change. The main point is that if the init function failed, we shouldn't try to use that depacketizer at all - this makes sure that the parse function doesn't need to check for the things that were initialized in the init function. Signed-off-by: Martin Storsjö <martin@martin.st>
-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);