Commit babd19ce authored by Martin Storsjö's avatar Martin Storsjö

rtpproto: Allow specifying the connect option, passed through to udp

By calling connect on the UDP socket, only packets from the chosen
peer address and port are received on the socket. This is one
solution to issue 1688.

Originally committed as revision 26244 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 1ba44140
...@@ -101,7 +101,7 @@ static void url_add_option(char *buf, int buf_size, const char *fmt, ...) ...@@ -101,7 +101,7 @@ static void url_add_option(char *buf, int buf_size, const char *fmt, ...)
static void build_udp_url(char *buf, int buf_size, static void build_udp_url(char *buf, int buf_size,
const char *hostname, int port, const char *hostname, int port,
int local_port, int ttl, int local_port, int ttl,
int max_packet_size) int max_packet_size, int connect)
{ {
ff_url_join(buf, buf_size, "udp", NULL, hostname, port, NULL); ff_url_join(buf, buf_size, "udp", NULL, hostname, port, NULL);
if (local_port >= 0) if (local_port >= 0)
...@@ -110,6 +110,8 @@ static void build_udp_url(char *buf, int buf_size, ...@@ -110,6 +110,8 @@ static void build_udp_url(char *buf, int buf_size,
url_add_option(buf, buf_size, "ttl=%d", ttl); url_add_option(buf, buf_size, "ttl=%d", ttl);
if (max_packet_size >=0) if (max_packet_size >=0)
url_add_option(buf, buf_size, "pkt_size=%d", max_packet_size); url_add_option(buf, buf_size, "pkt_size=%d", max_packet_size);
if (connect)
url_add_option(buf, buf_size, "connect=1");
} }
/** /**
...@@ -119,6 +121,7 @@ static void build_udp_url(char *buf, int buf_size, ...@@ -119,6 +121,7 @@ static void build_udp_url(char *buf, int buf_size,
* 'localrtpport=n' : set the local rtp port to n * 'localrtpport=n' : set the local rtp port to n
* 'localrtcpport=n' : set the local rtcp port to n * 'localrtcpport=n' : set the local rtcp port to n
* 'pkt_size=n' : set max packet size * 'pkt_size=n' : set max packet size
* 'connect=0/1' : do a connect() on the UDP socket
* deprecated option: * deprecated option:
* 'localport=n' : set the local port to n * 'localport=n' : set the local port to n
* *
...@@ -132,7 +135,7 @@ static int rtp_open(URLContext *h, const char *uri, int flags) ...@@ -132,7 +135,7 @@ static int rtp_open(URLContext *h, const char *uri, int flags)
{ {
RTPContext *s; RTPContext *s;
int rtp_port, rtcp_port, int rtp_port, rtcp_port,
is_output, ttl, is_output, ttl, connect,
local_rtp_port, local_rtcp_port, max_packet_size; local_rtp_port, local_rtcp_port, max_packet_size;
char hostname[256]; char hostname[256];
char buf[1024]; char buf[1024];
...@@ -154,6 +157,7 @@ static int rtp_open(URLContext *h, const char *uri, int flags) ...@@ -154,6 +157,7 @@ static int rtp_open(URLContext *h, const char *uri, int flags)
local_rtp_port = -1; local_rtp_port = -1;
local_rtcp_port = -1; local_rtcp_port = -1;
max_packet_size = -1; max_packet_size = -1;
connect = 0;
p = strchr(uri, '?'); p = strchr(uri, '?');
if (p) { if (p) {
...@@ -175,17 +179,22 @@ static int rtp_open(URLContext *h, const char *uri, int flags) ...@@ -175,17 +179,22 @@ static int rtp_open(URLContext *h, const char *uri, int flags)
if (find_info_tag(buf, sizeof(buf), "pkt_size", p)) { if (find_info_tag(buf, sizeof(buf), "pkt_size", p)) {
max_packet_size = strtol(buf, NULL, 10); max_packet_size = strtol(buf, NULL, 10);
} }
if (find_info_tag(buf, sizeof(buf), "connect", p)) {
connect = strtol(buf, NULL, 10);
}
} }
build_udp_url(buf, sizeof(buf), build_udp_url(buf, sizeof(buf),
hostname, rtp_port, local_rtp_port, ttl, max_packet_size); hostname, rtp_port, local_rtp_port, ttl, max_packet_size,
connect);
if (url_open(&s->rtp_hd, buf, flags) < 0) if (url_open(&s->rtp_hd, buf, flags) < 0)
goto fail; goto fail;
if (local_rtp_port>=0 && local_rtcp_port<0) if (local_rtp_port>=0 && local_rtcp_port<0)
local_rtcp_port = udp_get_local_port(s->rtp_hd) + 1; local_rtcp_port = udp_get_local_port(s->rtp_hd) + 1;
build_udp_url(buf, sizeof(buf), build_udp_url(buf, sizeof(buf),
hostname, rtcp_port, local_rtcp_port, ttl, max_packet_size); hostname, rtcp_port, local_rtcp_port, ttl, max_packet_size,
connect);
if (url_open(&s->rtcp_hd, buf, flags) < 0) if (url_open(&s->rtcp_hd, buf, flags) < 0)
goto fail; goto fail;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment