diff options
author | Ronald S. Bultje <rsbultje@gmail.com> | 2008-03-19 14:05:08 +0000 |
---|---|---|
committer | Ronald S. Bultje <rsbultje@gmail.com> | 2008-03-19 14:05:08 +0000 |
commit | 8a8754d80f5ff03cbd2adb355d93737cc61f12ad (patch) | |
tree | f5d203f0acff368065be971c775eaf814b6f013f /libavformat/rtsp.c | |
parent | b58412f10640489ed9fe929a0f2ca116d9d19e53 (diff) | |
download | ffmpeg-8a8754d80f5ff03cbd2adb355d93737cc61f12ad.tar.gz |
Allow cycling between different protocols (TCP, UDP or multicast) so that if
one doesn't work, we can try the next one (i.e. trial-error protocol auto-
probing).
Discussed and approved in "[PATCH] RTSP alternate protocol 2-3/3".
Originally committed as revision 12504 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/rtsp.c')
-rw-r--r-- | libavformat/rtsp.c | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c index e1ef8c21ff..b8adfe6ba5 100644 --- a/libavformat/rtsp.c +++ b/libavformat/rtsp.c @@ -922,6 +922,10 @@ make_setup_request (AVFormatContext *s, const char *host, int port, int protocol "Transport: %s\r\n", rtsp_st->control_url, transport); rtsp_send_cmd(s, cmd, reply, NULL); + if (reply->status_code == 461 /* Unsupported protocol */ && i == 0) { + err = 1; + goto fail; + } else if (reply->status_code != RTSP_STATUS_OK || reply->nb_transports != 1) { err = AVERROR_INVALIDDATA; @@ -1003,6 +1007,12 @@ make_setup_request (AVFormatContext *s, const char *host, int port, int protocol return 0; fail: + for (i=0; i<rt->nb_rtsp_streams; i++) { + if (rt->rtsp_streams[i]->rtp_handle) { + url_close(rt->rtsp_streams[i]->rtp_handle); + rt->rtsp_streams[i]->rtp_handle = NULL; + } + } return err; } @@ -1045,7 +1055,7 @@ static int rtsp_read_header(AVFormatContext *s, } if (!protocol_mask) - protocol_mask = rtsp_default_protocols; + protocol_mask = (1 << RTSP_PROTOCOL_RTP_LAST) - 1; /* open the tcp connexion */ snprintf(tcpname, sizeof(tcpname), "tcp://%s:%d", host, port); @@ -1077,9 +1087,18 @@ static int rtsp_read_header(AVFormatContext *s, goto fail; } - err = make_setup_request(s, host, port, protocol_mask); - if (err) + do { + int protocol = protocol_mask & ~(protocol_mask - 1); + + err = make_setup_request(s, host, port, protocol); + if (err < 0) goto fail; + protocol_mask &= ~protocol; + if (protocol_mask == 0 && err == 1) { + err = AVERROR(EPROTONOSUPPORT); + goto fail; + } + } while (err); rt->state = RTSP_STATE_IDLE; rt->seek_timestamp = 0; /* default is to start stream at position |