rtsp: Don't expose the MS-RTSP RTX data stream to the caller

Message ID 1333831707-35627-1-git-send-email-martin@martin.st
State Committed
Commit 456001486ee8fe1cd906e497b603f98159191175
Headers show

Commit Message

Martin Storsjö April 7, 2012, 8:48 p.m.
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.
---
 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(-)

Comments

Ronald Bultje April 7, 2012, 10:58 p.m. | #1
Hi,

On Sat, Apr 7, 2012 at 1:48 PM, Martin Storsjö <martin@martin.st> wrote:
> 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.
> ---
>  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(-)

OK.

Ronald

Patch

diff --git a/libavformat/rtpdec.c b/libavformat/rtpdec.c
index 61653f7..41e6eb4 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 9f5ab26..b2e3d60 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 c1690ef..bbb7609 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 9da79fc..32a57d3 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 ed0a435..5b0ece2 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 99792c9..5ba8817 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 a7f36ef..2de8a68 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 c94ef02..902a28e 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);