changeset 3149:5a7a7406ab1f libavformat

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".
author rbultje
date Wed, 19 Mar 2008 14:05:08 +0000
parents f00aeedea66a
children 095003bbe73e
files rtsp.c rtsp.h
diffstat 2 files changed, 26 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/rtsp.c	Tue Mar 18 19:54:47 2008 +0000
+++ b/rtsp.c	Wed Mar 19 14:05:08 2008 +0000
@@ -922,6 +922,10 @@
                  "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 @@
     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 @@
     }
 
     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 @@
         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
--- a/rtsp.h	Tue Mar 18 19:54:47 2008 +0000
+++ b/rtsp.h	Wed Mar 19 14:05:08 2008 +0000
@@ -29,6 +29,10 @@
     RTSP_PROTOCOL_RTP_UDP = 0,
     RTSP_PROTOCOL_RTP_TCP = 1,
     RTSP_PROTOCOL_RTP_UDP_MULTICAST = 2,
+    /**
+     * This is not part of public API and shouldn't be used outside of ffmpeg.
+     */
+    RTSP_PROTOCOL_RTP_LAST
 };
 
 #define RTSP_DEFAULT_PORT   554