Module: ffmpeg
Branch: master
Commit: 00952be424ba7403d71c338933354d2172df8e67

Author: David Fries <[email protected]>
Date:   Mon Feb  7 23:14:43 2011 +0200

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ö <[email protected]>
Signed-off-by: Ronald S. Bultje <[email protected]>

---

 libavformat/udp.c |   17 +++++++++++++++--
 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 */

_______________________________________________
ffmpeg-commits mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/ffmpeg-commits

Reply via email to