changeset 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 043b36cefe89
children f09594ca5f77
files sdp.c
diffstat 1 files changed, 36 insertions(+), 0 deletions(-) [+]
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,