diff sdp.c @ 5525:f484a964bed1 libavformat

Make sure the destination address is written as an IP address in the SDP Patch by Martin Storsjo (martin AT martin DOT st)
author lucabe
date Tue, 12 Jan 2010 10:56:43 +0000
parents 89259491d541
children 7a123cc24a81
line wrap: on
line diff
--- a/sdp.c	Tue Jan 12 07:10:47 2010 +0000
+++ b/sdp.c	Tue Jan 12 10:56:43 2010 +0000
@@ -25,6 +25,9 @@
 #include "internal.h"
 #include "avc.h"
 #include "rtp.h"
+#if CONFIG_NETWORK
+#include "network.h"
+#endif
 
 #if CONFIG_RTP_MUXER
 #define MAX_EXTRADATA_SIZE ((INT_MAX - 10) / 2)
@@ -69,6 +72,37 @@
                             s->start_time, s->end_time);
 }
 
+#if CONFIG_NETWORK
+static void resolve_destination(char *dest_addr, int size)
+{
+    struct addrinfo hints, *ai, *cur;
+
+    if (!dest_addr[0])
+        return;
+
+    /* Resolve the destination, since it must be written
+     * as a numeric IP address in the SDP. */
+
+    memset(&hints, 0, sizeof(hints));
+    /* We only support IPv4 addresses in the SDP at the moment. */
+    hints.ai_family = AF_INET;
+    if (getaddrinfo(dest_addr, NULL, &hints, &ai))
+        return;
+    for (cur = ai; cur; cur = cur->ai_next) {
+        if (cur->ai_family == AF_INET) {
+            getnameinfo(cur->ai_addr, cur->ai_addrlen, dest_addr, size,
+                        NULL, 0, NI_NUMERICHOST);
+            break;
+        }
+    }
+    freeaddrinfo(ai);
+}
+#else
+static void resolve_destination(char *dest_addr, int size)
+{
+}
+#endif
+
 static int sdp_get_address(char *dest_addr, int size, int *ttl, const char *url)
 {
     int port;
@@ -303,6 +337,7 @@
     ttl = 0;
     if (n_files == 1) {
         port = sdp_get_address(dst, sizeof(dst), &ttl, ac[0]->filename);
+        resolve_destination(dst, sizeof(dst));
         if (dst[0]) {
             s.dst_addr = dst;
             s.ttl = ttl;
@@ -314,6 +349,7 @@
     for (i = 0; i < n_files; i++) {
         if (n_files != 1) {
             port = sdp_get_address(dst, sizeof(dst), &ttl, ac[i]->filename);
+            resolve_destination(dst, sizeof(dst));
         }
         for (j = 0; j < ac[i]->nb_streams; j++) {
             sdp_write_media(buff, size,