bind to the multicast address if possible
authorJindřich Makovička <makovick@gmail.com>
Sun, 7 Dec 2008 17:29:09 +0000 (17:29 +0000)
committerJindřich Makovička <makovick@gmail.com>
Sun, 7 Dec 2008 17:29:09 +0000 (17:29 +0000)
Originally committed as revision 16032 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/udp.c

index bbdb930e4ef7a69632a1f90ff873ce6796f8888c..59ba4188b59698327d4244860e04751d96fd0125 100644 (file)
@@ -336,7 +336,7 @@ int udp_get_file_handle(URLContext *h)
 static int udp_open(URLContext *h, const char *uri, int flags)
 {
     char hostname[1024];
-    int port, udp_fd = -1, tmp;
+    int port, udp_fd = -1, tmp, bind_ret = -1;
     UDPContext *s = NULL;
     int is_output;
     const char *p;
@@ -404,7 +404,13 @@ static int udp_open(URLContext *h, const char *uri, int flags)
             goto fail;
 
     /* the bind is needed to give a port to the socket now */
-    if (bind(udp_fd,(struct sockaddr *)&my_addr, len) < 0)
+    /* if multicast, try the multicast address bind first */
+    if (s->is_multicast && !(h->flags & URL_WRONLY)) {
+        bind_ret = bind(udp_fd,(struct sockaddr *)&s->dest_addr, len);
+    }
+    /* bind to the local address if not multicast or if the multicast
+     * bind failed */
+    if (bind_ret < 0 && bind(udp_fd,(struct sockaddr *)&my_addr, len) < 0)
         goto fail;
 
     len = sizeof(my_addr);