Le 2014-10-09 23:17, Luca Barbato a écrit :
---
 libavformat/rtsp.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index 646712e..cadf025 100644
--- a/libavformat/rtsp.c
+++ b/libavformat/rtsp.c
@@ -1589,7 +1589,9 @@ void ff_rtsp_close_connections(AVFormatContext *s)
 int ff_rtsp_connect(AVFormatContext *s)
 {
     RTSPState *rt = s->priv_data;
- char host[1024], path[1024], tcpname[1024], cmd[2048], auth[128];
+    char proto[128], host[1024], path[1024];
+    char tcpname[1024], cmd[2048], auth[128];
+    const char *lower_rtsp_proto = "tcp";
     int port, err, tcp_fd;
     RTSPMessageHeader reply1 = {0}, *reply = &reply1;
     int lower_transport_mask = 0;
@@ -1621,8 +1623,12 @@ int ff_rtsp_connect(AVFormatContext *s)
 redirect:
     lower_transport_mask = rt->lower_transport_mask;
     /* extract hostname and port */
-    av_url_split(NULL, 0, auth, sizeof(auth),
+    av_url_split(proto, sizeof(proto), auth, sizeof(auth),
                  host, sizeof(host), &port, path, sizeof(path),
s->filename);
+
+    if (!strcmp(proto, "rtsps"))
+        lower_rtsp_proto = "tls";

That seems much too simplistic to be rtsps. For a start, where is the default RTSP/TLS port number (332)?

More importantly, the user should expect that the media content proper will be hashed and encrypted when using rtsps. This seems to merely encrypt the control connection, which will fail that expectation. And of course, it makes TLS arguably totally useless. So for the time being, I think interleaved RTP should be forced (over TLS) and no other RTP transport should be negotiated by the client.

+
     if (*auth) {
         av_strlcpy(rt->auth, auth, sizeof(rt->auth));
     }
@@ -1647,7 +1653,7 @@ redirect:
/* Construct the URI used in request; this is similar to s->filename, * but with authentication credentials removed and RTSP specific options
      * stripped out. */
- ff_url_join(rt->control_uri, sizeof(rt->control_uri), "rtsp", NULL, + ff_url_join(rt->control_uri, sizeof(rt->control_uri), proto, NULL,
                 host, port, "%s", path);

     if (rt->control_transport == RTSP_MODE_TUNNEL) {
@@ -1726,7 +1732,8 @@ redirect:
         }
     } else {
         /* open the tcp connection */
-        ff_url_join(tcpname, sizeof(tcpname), "tcp", NULL, host,
port, NULL);
+ ff_url_join(tcpname, sizeof(tcpname), lower_rtsp_proto, NULL,
+                    host, port, NULL);
         if (ffurl_open(&rt->rtsp_hd, tcpname, AVIO_FLAG_READ_WRITE,
                        &s->interrupt_callback, NULL) < 0) {
             err = AVERROR(EIO);

--
Rémi Denis-Courmont

_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to