From 456001486ee8fe1cd906e497b603f98159191175 Mon Sep 17 00:00:00 2001 From: Martin Storsjö Date: Fri, 6 Apr 2012 23:07:12 +0300 Subject: rtsp: Don't expose the MS-RTSP RTX data stream to the caller MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This avoids exposing a dummy AVStream which won't get any data and which will make avformat_find_stream_info wait for info about this stream. Signed-off-by: Martin Storsjö --- libavformat/rtpdec.c | 2 +- libavformat/rtpdec_amr.c | 3 +++ libavformat/rtpdec_asf.c | 2 ++ libavformat/rtpdec_h264.c | 9 +++++++-- libavformat/rtpdec_latm.c | 3 +++ libavformat/rtpdec_mpeg4.c | 3 +++ libavformat/rtpdec_xiph.c | 3 +++ libavformat/rtsp.c | 22 +++++++++++++++------- 8 files changed, 37 insertions(+), 10 deletions(-) diff --git a/libavformat/rtpdec.c b/libavformat/rtpdec.c index 61653f7b39..41e6eb4cab 100644 --- a/libavformat/rtpdec.c +++ b/libavformat/rtpdec.c @@ -385,7 +385,7 @@ RTPDemuxContext *ff_rtp_parse_open(AVFormatContext *s1, AVStream *st, URLContext av_free(s); return NULL; } - } else { + } else if (st) { switch(st->codec->codec_id) { case CODEC_ID_MPEG1VIDEO: case CODEC_ID_MPEG2VIDEO: diff --git a/libavformat/rtpdec_amr.c b/libavformat/rtpdec_amr.c index 9f5ab26aa9..b2e3d6042e 100644 --- a/libavformat/rtpdec_amr.c +++ b/libavformat/rtpdec_amr.c @@ -169,6 +169,9 @@ static int amr_parse_sdp_line(AVFormatContext *s, int st_index, const char *p; int ret; + if (st_index < 0) + return 0; + /* Parse an fmtp line this one: * a=fmtp:97 octet-align=1; interleaving=0 * That is, a normal fmtp: line followed by semicolon & space diff --git a/libavformat/rtpdec_asf.c b/libavformat/rtpdec_asf.c index c1690ef8f1..bbb7609175 100644 --- a/libavformat/rtpdec_asf.c +++ b/libavformat/rtpdec_asf.c @@ -130,6 +130,8 @@ int ff_wms_parse_sdp_a_line(AVFormatContext *s, const char *p) static int asfrtp_parse_sdp_line(AVFormatContext *s, int stream_index, PayloadContext *asf, const char *line) { + if (stream_index < 0) + return 0; if (av_strstart(line, "stream:", &line)) { RTSPState *rt = s->priv_data; diff --git a/libavformat/rtpdec_h264.c b/libavformat/rtpdec_h264.c index 9da79fcbf5..32a57d3ec7 100644 --- a/libavformat/rtpdec_h264.c +++ b/libavformat/rtpdec_h264.c @@ -357,10 +357,15 @@ static void h264_free_context(PayloadContext *data) static int parse_h264_sdp_line(AVFormatContext *s, int st_index, PayloadContext *h264_data, const char *line) { - AVStream *stream = s->streams[st_index]; - AVCodecContext *codec = stream->codec; + AVStream *stream; + AVCodecContext *codec; const char *p = line; + if (st_index < 0) + return 0; + + stream = s->streams[st_index]; + codec = stream->codec; assert(h264_data->cookie == MAGIC_COOKIE); if (av_strstart(p, "framesize:", &p)) { diff --git a/libavformat/rtpdec_latm.c b/libavformat/rtpdec_latm.c index ed0a435514..5b0ece2bfe 100644 --- a/libavformat/rtpdec_latm.c +++ b/libavformat/rtpdec_latm.c @@ -168,6 +168,9 @@ static int latm_parse_sdp_line(AVFormatContext *s, int st_index, { const char *p; + if (st_index < 0) + return 0; + if (av_strstart(line, "fmtp:", &p)) return ff_parse_fmtp(s->streams[st_index], data, p, parse_fmtp); diff --git a/libavformat/rtpdec_mpeg4.c b/libavformat/rtpdec_mpeg4.c index 99792c9628..5ba88173a4 100644 --- a/libavformat/rtpdec_mpeg4.c +++ b/libavformat/rtpdec_mpeg4.c @@ -223,6 +223,9 @@ static int parse_sdp_line(AVFormatContext *s, int st_index, { const char *p; + if (st_index < 0) + return 0; + if (av_strstart(line, "fmtp:", &p)) return ff_parse_fmtp(s->streams[st_index], data, p, parse_fmtp); diff --git a/libavformat/rtpdec_xiph.c b/libavformat/rtpdec_xiph.c index a7f36ef59a..2de8a68b88 100644 --- a/libavformat/rtpdec_xiph.c +++ b/libavformat/rtpdec_xiph.c @@ -376,6 +376,9 @@ static int xiph_parse_sdp_line(AVFormatContext *s, int st_index, { const char *p; + if (st_index < 0) + return 0; + if (av_strstart(line, "fmtp:", &p)) { return ff_parse_fmtp(s->streams[st_index], data, p, xiph_parse_fmtp_pair); diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c index fa761f54a8..403f038875 100644 --- a/libavformat/rtsp.c +++ b/libavformat/rtsp.c @@ -374,6 +374,10 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1, if (!strcmp(ff_rtp_enc_name(rtsp_st->sdp_payload_type), "MP2T")) { /* no corresponding stream */ + } else if (rt->server_type == RTSP_SERVER_WMS && + codec_type == AVMEDIA_TYPE_DATA) { + /* RTX stream, a stream that carries all the other actual + * audio/video streams. Don't expose this to the callers. */ } else { st = avformat_new_stream(s, NULL); if (!st) @@ -430,9 +434,11 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1, /* NOTE: rtpmap is only supported AFTER the 'm=' tag */ get_word(buf1, sizeof(buf1), &p); payload_type = atoi(buf1); - st = s->streams[s->nb_streams - 1]; rtsp_st = rt->rtsp_streams[rt->nb_rtsp_streams - 1]; - sdp_parse_rtpmap(s, st, rtsp_st, payload_type, p); + if (rtsp_st->stream_index >= 0) { + st = s->streams[rtsp_st->stream_index]; + sdp_parse_rtpmap(s, st, rtsp_st, payload_type, p); + } } else if (av_strstart(p, "fmtp:", &p) || av_strstart(p, "framesize:", &p)) { /* NOTE: fmtp is only supported AFTER the 'a=rtpmap:xxx' tag */ @@ -467,14 +473,15 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1, if (rt->server_type == RTSP_SERVER_WMS) ff_wms_parse_sdp_a_line(s, p); if (s->nb_streams > 0) { + rtsp_st = rt->rtsp_streams[rt->nb_rtsp_streams - 1]; + if (rt->server_type == RTSP_SERVER_REAL) - ff_real_parse_sdp_a_line(s, s->nb_streams - 1, p); + ff_real_parse_sdp_a_line(s, rtsp_st->stream_index, p); - rtsp_st = rt->rtsp_streams[rt->nb_rtsp_streams - 1]; if (rtsp_st->dynamic_handler && rtsp_st->dynamic_handler->parse_sdp_a_line) rtsp_st->dynamic_handler->parse_sdp_a_line(s, - s->nb_streams - 1, + rtsp_st->stream_index, rtsp_st->dynamic_protocol_context, buf); } } @@ -1250,8 +1257,9 @@ int ff_rtsp_make_setup_request(AVFormatContext *s, const char *host, int port, * UDP. When trying to set it up for TCP streams, the server * will return an error. Therefore, we skip those streams. */ if (rt->server_type == RTSP_SERVER_WMS && - s->streams[rtsp_st->stream_index]->codec->codec_type == - AVMEDIA_TYPE_DATA) + (rtsp_st->stream_index < 0 || + s->streams[rtsp_st->stream_index]->codec->codec_type == + AVMEDIA_TYPE_DATA)) continue; snprintf(transport, sizeof(transport) - 1, "%s/TCP;", trans_pref); -- cgit v1.2.3