sapenc: Free AVStream->info on cleanup
[ffmpeg.git] / libavformat / sapenc.c
index 862f114..088f7bd 100644 (file)
@@ -25,6 +25,7 @@
 #include "libavutil/intreadwrite.h"
 #include "internal.h"
 #include "network.h"
+#include "os_support.h"
 #include "rtpenc_chain.h"
 
 struct SAPState {
@@ -47,6 +48,7 @@ static int sap_write_close(AVFormatContext *s)
         url_fclose(rtpctx->pb);
         av_metadata_free(&rtpctx->streams[0]->metadata);
         av_metadata_free(&rtpctx->metadata);
+        av_free(rtpctx->streams[0]->info);
         av_free(rtpctx->streams[0]);
         av_free(rtpctx);
         s->streams[i]->priv_data = NULL;
@@ -69,7 +71,7 @@ static int sap_write_header(AVFormatContext *s)
     struct SAPState *sap = s->priv_data;
     char host[1024], path[1024], url[1024], announce_addr[50] = "";
     char *option_list;
-    int port, base_port = 5004, i, pos = 0, same_port = 0, ttl = 255;
+    int port = 9875, base_port = 5004, i, pos = 0, same_port = 0, ttl = 255;
     AVFormatContext **contexts = NULL;
     int ret = 0;
     struct sockaddr_storage localaddr;
@@ -80,17 +82,17 @@ static int sap_write_header(AVFormatContext *s)
         return AVERROR(EIO);
 
     /* extract hostname and port */
-    av_url_split(NULL, 0, NULL, 0, host, sizeof(host), &port,
+    av_url_split(NULL, 0, NULL, 0, host, sizeof(host), &base_port,
                  path, sizeof(path), s->filename);
-    if (port < 0)
-        port = 9875;
+    if (base_port < 0)
+        base_port = 5004;
 
     /* search for options */
     option_list = strrchr(path, '?');
     if (option_list) {
         char buf[50];
-        if (find_info_tag(buf, sizeof(buf), "base_port", option_list)) {
-            base_port = strtol(buf, NULL, 10);
+        if (find_info_tag(buf, sizeof(buf), "announce_port", option_list)) {
+            port = strtol(buf, NULL, 10);
         }
         if (find_info_tag(buf, sizeof(buf), "same_port", option_list)) {
             same_port = strtol(buf, NULL, 10);
@@ -106,7 +108,7 @@ static int sap_write_header(AVFormatContext *s)
     if (!announce_addr[0]) {
         struct addrinfo hints, *ai = NULL;
         memset(&hints, 0, sizeof(hints));
-        hints.ai_family = PF_UNSPEC;
+        hints.ai_family = AF_UNSPEC;
         if (getaddrinfo(host, NULL, &hints, &ai)) {
             av_log(s, AV_LOG_ERROR, "Unable to resolve %s\n", host);
             ret = AVERROR(EIO);
@@ -115,11 +117,13 @@ static int sap_write_header(AVFormatContext *s)
         if (ai->ai_family == AF_INET) {
             /* Also known as sap.mcast.net */
             av_strlcpy(announce_addr, "224.2.127.254", sizeof(announce_addr));
+#if HAVE_STRUCT_SOCKADDR_IN6
         } else if (ai->ai_family == AF_INET6) {
             /* With IPv6, you can use the same destination in many different
              * multicast subnets, to choose how far you want it routed.
              * This one is intended to be routed globally. */
             av_strlcpy(announce_addr, "ff0e::2:7ffe", sizeof(announce_addr));
+#endif
         } else {
             freeaddrinfo(ai);
             av_log(s, AV_LOG_ERROR, "Host %s resolved to unsupported "
@@ -167,7 +171,11 @@ static int sap_write_header(AVFormatContext *s)
         ret = AVERROR(EIO);
         goto fail;
     }
-    if (localaddr.ss_family != AF_INET && localaddr.ss_family != AF_INET6) {
+    if (localaddr.ss_family != AF_INET
+#if HAVE_STRUCT_SOCKADDR_IN6
+        && localaddr.ss_family != AF_INET6
+#endif
+        ) {
         av_log(s, AV_LOG_ERROR, "Unsupported protocol family\n");
         ret = AVERROR(EIO);
         goto fail;
@@ -178,7 +186,12 @@ static int sap_write_header(AVFormatContext *s)
         ret = AVERROR(EIO);
         goto fail;
     }
-    sap->ann[pos++] = (1 << 5) | ((localaddr.ss_family == AF_INET6) << 4);
+    sap->ann[pos] = (1 << 5);
+#if HAVE_STRUCT_SOCKADDR_IN6
+    if (localaddr.ss_family == AF_INET6)
+        sap->ann[pos] |= 0x10;
+#endif
+    pos++;
     sap->ann[pos++] = 0; /* Authentication length */
     AV_WB16(&sap->ann[pos], av_get_random_seed());
     pos += 2;
@@ -186,10 +199,12 @@ static int sap_write_header(AVFormatContext *s)
         memcpy(&sap->ann[pos], &((struct sockaddr_in*)&localaddr)->sin_addr,
                sizeof(struct in_addr));
         pos += sizeof(struct in_addr);
+#if HAVE_STRUCT_SOCKADDR_IN6
     } else {
         memcpy(&sap->ann[pos], &((struct sockaddr_in6*)&localaddr)->sin6_addr,
                sizeof(struct in6_addr));
         pos += sizeof(struct in6_addr);
+#endif
     }
 
     av_strlcpy(&sap->ann[pos], "application/sdp", sap->ann_size - pos);
@@ -236,7 +251,7 @@ static int sap_write_packet(AVFormatContext *s, AVPacket *pkt)
     return ff_write_chained(rtpctx, 0, pkt, s);
 }
 
-AVOutputFormat sap_muxer = {
+AVOutputFormat ff_sap_muxer = {
     "sap",
     NULL_IF_CONFIG_SMALL("SAP output format"),
     NULL,