# HG changeset patch # User rbultje # Date 1283541959 0 # Node ID 2e3e76e8ada495b561a0dcb4c4117ba851082801 # Parent 8743935975f2b84ce212b513956ef5d2ebe01603 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 . diff -r 8743935975f2 -r 2e3e76e8ada4 os_support.h --- 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; diff -r 8743935975f2 -r 2e3e76e8ada4 rtsp.c --- 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; diff -r 8743935975f2 -r 2e3e76e8ada4 rtsp.h --- 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;