aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2012-04-06 23:07:12 +0300
committerMartin Storsjö <martin@martin.st>2012-04-08 12:04:22 +0300
commit456001486ee8fe1cd906e497b603f98159191175 (patch)
tree674e9168fc98d378a6bc4c2278f6a61543a73906
parentd293e3464db647e72fffad50a678eca89546b65f (diff)
downloadffmpeg-456001486ee8fe1cd906e497b603f98159191175.tar.gz
rtsp: Don't expose the MS-RTSP RTX data stream to the caller
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ö <martin@martin.st>
-rw-r--r--libavformat/rtpdec.c2
-rw-r--r--libavformat/rtpdec_amr.c3
-rw-r--r--libavformat/rtpdec_asf.c2
-rw-r--r--libavformat/rtpdec_h264.c9
-rw-r--r--libavformat/rtpdec_latm.c3
-rw-r--r--libavformat/rtpdec_mpeg4.c3
-rw-r--r--libavformat/rtpdec_xiph.c3
-rw-r--r--libavformat/rtsp.c22
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);