diff -rNu ffmpeg-0.7.1/configure ffmpeg-0.7.1.new/configure
--- ffmpeg-0.7.1/configure	2011-06-21 21:29:25.000000000 +0200
+++ ffmpeg-0.7.1.new/configure	2011-07-28 14:28:03.000000000 +0200
@@ -1109,6 +1109,7 @@
     strerror_r
     strtok_r
     struct_addrinfo
+    struct_ifreq
     struct_ipv6_mreq
     struct_sockaddr_in6
     struct_sockaddr_sa_len
@@ -1116,6 +1117,7 @@
     symver
     symver_gnu_asm
     symver_asm_label
+    sys_ioctl_h
     sys_mman_h
     sys_resource_h
     sys_select_h
@@ -2801,7 +2803,9 @@
     check_type netinet/in.h "struct ipv6_mreq" -D_DARWIN_C_SOURCE
     check_type netinet/in.h "struct sockaddr_in6"
     check_type "sys/types.h sys/socket.h" "struct sockaddr_storage"
+    check_type net/if.h "struct ifreq" -D_SVID_SOURCE
     check_struct "sys/types.h sys/socket.h" "struct sockaddr" sa_len
+    check_header sys/ioctl.h
     # Prefer arpa/inet.h over winsock2
     if check_header arpa/inet.h ; then
         check_func closesocket
diff -rNu ffmpeg-0.7.1/libavformat/network.h ffmpeg-0.7.1.new/libavformat/network.h
--- ffmpeg-0.7.1/libavformat/network.h	2011-06-21 21:29:25.000000000 +0200
+++ ffmpeg-0.7.1.new/libavformat/network.h	2011-07-28 14:25:08.000000000 +0200
@@ -56,6 +56,14 @@
 #define ff_neterrno() AVERROR(errno)
 #endif
 
+#if HAVE_STRUCT_IFREQ
+#include <net/if.h>
+#endif
+
+#if HAVE_SYS_IOCTL_H
+#include <sys/ioctl.h>
+#endif
+
 #if HAVE_ARPA_INET_H
 #include <arpa/inet.h>
 #endif
diff -rNu ffmpeg-0.7.1/libavformat/udp.c ffmpeg-0.7.1.new/libavformat/udp.c
--- ffmpeg-0.7.1/libavformat/udp.c	2011-06-23 02:38:53.000000000 +0200
+++ ffmpeg-0.7.1.new/libavformat/udp.c	2011-07-28 14:38:46.000000000 +0200
@@ -30,6 +30,7 @@
 #include "avio_internal.h"
 #include "libavutil/parseutils.h"
 #include "libavutil/fifo.h"
+#include "libavutil/avstring.h"
 #include <unistd.h>
 #include "internal.h"
 #include "network.h"
@@ -55,6 +56,7 @@
     int local_port;
     int reuse_socket;
     struct sockaddr_storage dest_addr;
+    struct in_addr if_addr;
     int dest_addr_len;
     int is_connected;
 
@@ -92,14 +94,14 @@
     return 0;
 }
 
-static int udp_join_multicast_group(int sockfd, struct sockaddr *addr)
+static int udp_join_multicast_group(int sockfd, struct sockaddr *addr, struct in_addr *ifaddr)
 {
 #ifdef IP_ADD_MEMBERSHIP
     if (addr->sa_family == AF_INET) {
         struct ip_mreq mreq;
 
         mreq.imr_multiaddr.s_addr = ((struct sockaddr_in *)addr)->sin_addr.s_addr;
-        mreq.imr_interface.s_addr= INADDR_ANY;
+        mreq.imr_interface.s_addr= ifaddr->s_addr;
         if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const void *)&mreq, sizeof(mreq)) < 0) {
             av_log(NULL, AV_LOG_ERROR, "setsockopt(IP_ADD_MEMBERSHIP): %s\n", strerror(errno));
             return -1;
@@ -121,14 +123,14 @@
     return 0;
 }
 
-static int udp_leave_multicast_group(int sockfd, struct sockaddr *addr)
+static int udp_leave_multicast_group(int sockfd, struct sockaddr *addr, struct in_addr *ifaddr)
 {
 #ifdef IP_DROP_MEMBERSHIP
     if (addr->sa_family == AF_INET) {
         struct ip_mreq mreq;
 
         mreq.imr_multiaddr.s_addr = ((struct sockaddr_in *)addr)->sin_addr.s_addr;
-        mreq.imr_interface.s_addr= INADDR_ANY;
+        mreq.imr_interface.s_addr= ifaddr->s_addr;
         if (setsockopt(sockfd, IPPROTO_IP, IP_DROP_MEMBERSHIP, (const void *)&mreq, sizeof(mreq)) < 0) {
             av_log(NULL, AV_LOG_ERROR, "setsockopt(IP_DROP_MEMBERSHIP): %s\n", strerror(errno));
             return -1;
@@ -246,7 +248,9 @@
  * get the local port first, then you must call this function to set
  * the remote server address.
  *
- * url syntax: udp://host:port[?option=val...]
+ * url syntax: udp://multicastinterface@host:port[?option=val...]
+ * multicastinterface@ is optional
+ * multicastinterface is ether the name or the ip of the interface
  * option: 'ttl=n'       : set the ttl value (for multicast only)
  *         'localport=n' : set the local port
  *         'pkt_size=n'  : set max packet size
@@ -259,11 +263,11 @@
 int ff_udp_set_remote_url(URLContext *h, const char *uri)
 {
     UDPContext *s = h->priv_data;
-    char hostname[256], buf[10];
+    char hostname[256], buf[10], ifaddr[256];
     int port;
     const char *p;
 
-    av_url_split(NULL, 0, NULL, 0, hostname, sizeof(hostname), &port, NULL, 0, uri);
+    av_url_split(NULL, 0, ifaddr, sizeof(ifaddr), hostname, sizeof(hostname), &port, NULL, 0, uri);
 
     /* set the destination address */
     s->dest_addr_len = udp_set_url(&s->dest_addr, hostname, port);
@@ -271,6 +275,30 @@
         return AVERROR(EIO);
     }
     s->is_multicast = ff_is_multicast_address((struct sockaddr*) &s->dest_addr);
+    if (s->is_multicast) {
+	if (!*ifaddr)
+	    s->if_addr.s_addr=INADDR_ANY;
+	else if (!inet_aton(ifaddr,&s->if_addr)) {
+#if defined(HAVE_STRUCT_IFREQ) && defined(HAVE_SYS_IOCTL_H) && defined(SIOCGIFADDR)
+	    int sock_fd;
+	    struct ifreq ifr;
+
+	    memset(&ifr,0,sizeof(ifr));
+	    av_strlcpy(ifr.ifr_name,ifaddr,sizeof(ifr.ifr_name));
+	    sock_fd=socket(AF_INET, SOCK_DGRAM, 0);
+	    if (sock_fd==-1)
+		return AVERROR(EIO);
+	    if (ioctl(sock_fd, SIOCGIFADDR, &ifr) == -1) {
+		close(sock_fd);
+		return AVERROR(EIO);
+	    }
+	    close(sock_fd);
+	    s->if_addr=((struct sockaddr_in *)(&ifr.ifr_addr))->sin_addr;
+#else
+	    return AVERROR(EIO);
+#endif
+	}
+    }
     p = strchr(uri, '?');
     if (p) {
         if (av_find_info_tag(buf, sizeof(buf), "connect", p)) {
@@ -483,7 +511,7 @@
                 goto fail;
         } else {
             /* input */
-            if (udp_join_multicast_group(udp_fd, (struct sockaddr *)&s->dest_addr) < 0)
+            if (udp_join_multicast_group(udp_fd, (struct sockaddr *)&s->dest_addr,&s->if_addr) < 0)
                 goto fail;
         }
     }
@@ -601,7 +629,7 @@
     UDPContext *s = h->priv_data;
 
     if (s->is_multicast && !(h->flags & AVIO_WRONLY))
-        udp_leave_multicast_group(s->udp_fd, (struct sockaddr *)&s->dest_addr);
+        udp_leave_multicast_group(s->udp_fd, (struct sockaddr *)&s->dest_addr, &s->if_addr);
     closesocket(s->udp_fd);
     av_fifo_free(s->fifo);
     av_free(s);
