summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Fries <David@Fries.net>2011-02-07 23:14:43 +0200
committerMichael Niedermayer <michaelni@gmx.at>2011-02-11 02:54:08 +0100
commit9087a46d5570f6443f0c784c6bc4e41bc4bc4cbc (patch)
tree7502eaacda5f549bb9b4598433ea6a34bc2c3f14
parentc3052f1dcc4d6bbf54e3b79828408ee975a5854a (diff)
downloadffmpeg-streaming-9087a46d5570f6443f0c784c6bc4e41bc4bc4cbc.zip
ffmpeg-streaming-9087a46d5570f6443f0c784c6bc4e41bc4bc4cbc.tar.gz
udp: Enable address reuse by default for multicast
Keep the original corner case behaviour, where reuse is enabled for the case where no argument is given to the reuse url option. Signed-off-by: Martin Storsjö <martin@martin.st> Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com> (cherry picked from commit 00952be424ba7403d71c338933354d2172df8e67)
-rw-r--r--libavformat/udp.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/libavformat/udp.c b/libavformat/udp.c
index aa17c97..4c4db2a 100644
--- a/libavformat/udp.c
+++ b/libavformat/udp.c
@@ -313,6 +313,7 @@ static int udp_open(URLContext *h, const char *uri, int flags)
char buf[256];
struct sockaddr_storage my_addr;
int len;
+ int reuse_specified = 0;
h->is_streamed = 1;
h->max_packet_size = 1472;
@@ -329,7 +330,14 @@ static int udp_open(URLContext *h, const char *uri, int flags)
p = strchr(uri, '?');
if (p) {
- s->reuse_socket = find_info_tag(buf, sizeof(buf), "reuse", p);
+ if (find_info_tag(buf, sizeof(buf), "reuse", p)) {
+ const char *endptr=NULL;
+ s->reuse_socket = strtol(buf, &endptr, 10);
+ /* assume if no digits were found it is a request to enable it */
+ if (buf == endptr)
+ s->reuse_socket = 1;
+ reuse_specified = 1;
+ }
if (find_info_tag(buf, sizeof(buf), "ttl", p)) {
s->ttl = strtol(buf, NULL, 10);
}
@@ -366,9 +374,14 @@ static int udp_open(URLContext *h, const char *uri, int flags)
if (udp_fd < 0)
goto fail;
- if (s->reuse_socket)
+ /* Follow the requested reuse option, unless it's multicast in which
+ * case enable reuse unless explicitely disabled.
+ */
+ if (s->reuse_socket || (s->is_multicast && !reuse_specified)) {
+ s->reuse_socket = 1;
if (setsockopt (udp_fd, SOL_SOCKET, SO_REUSEADDR, &(s->reuse_socket), sizeof(s->reuse_socket)) != 0)
goto fail;
+ }
/* the bind is needed to give a port to the socket now */
/* if multicast, try the multicast address bind first */
OpenPOWER on IntegriCloud