Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-04-08 22:55:02 +0400
committerMichael Niedermayer <michaelni@gmx.at>2012-04-08 22:55:11 +0400
commit5d6a40bc747da93bd4ee41a446c35fc60a399671 (patch)
tree613c91012a37b3646f1575955d6124ffc4fdefe7 /libavformat/rtsp.c
parent4f043c8a119101ffe8f6a57b18a47f602a350c30 (diff)
parent9294f538e924dcb8f3938e4e3476340f1e5b552f (diff)
Merge remote-tracking branch 'qatar/master'
* qatar/master: rtsp: Don't use av_malloc(0) if there are no streams rtsp: Don't use uninitialized data if there are no streams vaapi: mpeg2: fix slice_vertical_position calculation. hwaccel: mpeg2: decode first field, if requested. cosmetics: Fix indentation rtsp: Don't expose the MS-RTSP RTX data stream to the caller Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/rtsp.c')
-rw-r--r--libavformat/rtsp.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index 9961b5a33c..fb6df692ac 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);
}
}
@@ -1245,8 +1252,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);
@@ -1378,7 +1386,7 @@ int ff_rtsp_make_setup_request(AVFormatContext *s, const char *host, int port,
goto fail;
}
- if (reply->timeout > 0)
+ if (rt->nb_rtsp_streams && reply->timeout > 0)
rt->timeout = reply->timeout;
if (rt->server_type == RTSP_SERVER_REAL)