changeset 6457:2e3e76e8ada4 libavformat

Send NAT punching messages to the address specified in the Transport: message, if available (RFC 2326, section 12.39), fixes issue 2212. Patch by John Wimer <john at god vtic net>.
author rbultje
date Fri, 03 Sep 2010 19:25:59 +0000
parents 8743935975f2
children d1500c270acc
files os_support.h rtsp.c rtsp.h
diffstat 3 files changed, 19 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/os_support.h	Fri Sep 03 14:59:18 2010 +0000
+++ b/os_support.h	Fri Sep 03 19:25:59 2010 +0000
@@ -55,6 +55,10 @@
 #define closesocket close
 #endif
 
+#ifndef INET6_ADDRSTRLEN
+#define INET6_ADDRSTRLEN INET_ADDRSTRLEN
+#endif
+
 #if CONFIG_FFSERVER
 #if !HAVE_POLL_H
 typedef unsigned long nfds_t;
--- a/rtsp.c	Fri Sep 03 14:59:18 2010 +0000
+++ b/rtsp.c	Fri Sep 03 19:25:59 2010 +0000
@@ -701,7 +701,14 @@
                     get_word_sep(buf, sizeof(buf), ";,", &p);
                     get_sockaddr(buf, &th->destination);
                 }
+            } else if (!strcmp(parameter, "source")) {
+                if (*p == '=') {
+                    p++;
+                    get_word_sep(buf, sizeof(buf), ";,", &p);
+                    av_strlcpy(th->source, buf, sizeof(th->source));
+                }
             }
+
             while (*p != ';' && *p != '\0' && *p != ',')
                 p++;
             if (*p == ';')
@@ -1154,9 +1161,15 @@
         case RTSP_LOWER_TRANSPORT_UDP: {
             char url[1024];
 
-            /* XXX: also use address if specified */
+            /* Use source address if specified */
+            if (reply->transports[0].source[0]) {
+                ff_url_join(url, sizeof(url), "rtp", NULL,
+                            reply->transports[0].source,
+                            reply->transports[0].server_port_min, NULL);
+            } else {
             ff_url_join(url, sizeof(url), "rtp", NULL, host,
                         reply->transports[0].server_port_min, NULL);
+            }
             if (!(rt->server_type == RTSP_SERVER_WMS && i > 1) &&
                 rtp_set_remote_url(rtsp_st->rtp_handle, url) < 0) {
                 err = AVERROR_INVALIDDATA;
--- a/rtsp.h	Fri Sep 03 14:59:18 2010 +0000
+++ b/rtsp.h	Fri Sep 03 19:25:59 2010 +0000
@@ -97,6 +97,7 @@
     int ttl;
 
     struct sockaddr_storage destination; /**< destination IP address */
+    char source[INET6_ADDRSTRLEN + 1]; /**< source IP address */
 
     /** data/packet transport protocol; e.g. RTP or RDT */
     enum RTSPTransport transport;