]> git.sesse.net Git - vlc/commitdiff
Restore some kind of SAP support
authorRémi Denis-Courmont <rem@videolan.org>
Sat, 10 Feb 2007 17:33:27 +0000 (17:33 +0000)
committerRémi Denis-Courmont <rem@videolan.org>
Sat, 10 Feb 2007 17:33:27 +0000 (17:33 +0000)
include/vlc_sout.h
modules/stream_out/standard.c
src/stream_output/announce.c
src/stream_output/sap.c
src/stream_output/stream_output.h

index cb93b43598a0f0e92b9fd51ed1fdac861bd7cc14..e652c08258f76c00712292b853b2497d224b83ed 100644 (file)
@@ -215,6 +215,7 @@ VLC_EXPORT(session_descriptor_t*,sout_AnnounceRegisterSDP, (sout_instance_t *, c
 VLC_EXPORT( int,                sout_AnnounceUnRegister, (sout_instance_t *,session_descriptor_t* ) );
 
 VLC_EXPORT(session_descriptor_t*,sout_AnnounceSessionCreate, (vlc_object_t *obj, const char *cfgpref) );
+VLC_EXPORT(int,                  sout_SessionSetMedia, (vlc_object_t *obj, session_descriptor_t *, char *, char *, int, char *, int) );
 VLC_EXPORT(void,                 sout_AnnounceSessionDestroy, (session_descriptor_t *) );
 VLC_EXPORT(announce_method_t*,   sout_SAPMethod, (void) );
 VLC_EXPORT(void,                 sout_MethodRelease, (announce_method_t *) );
index b8b8122397ea8a12cd0a2a3975040f9398358a44..623745c1849d0629d8c0cb3a1b7c2ed6bfa9b743 100644 (file)
 /*****************************************************************************
  * Preamble
  *****************************************************************************/
-#include <stdlib.h>
-#include <string.h>
-
 #include <vlc/vlc.h>
 #include <vlc_sout.h>
 
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
 #include <vlc_network.h>
 #include "vlc_url.h"
 
@@ -245,8 +246,10 @@ static int Open( vlc_object_t *p_this )
         {
             psz_mux = strdup("asfh");
         }
-        else if( !strncmp( psz_access, "udp", 3 ) ||
-                 !strncmp( psz_access, "rtp", 3 ) )
+        else if (!strcmp (psz_access, "udp")
+              || !strcmp (psz_access, "rtp") || !strcmp (psz_access, "udplite")
+              || !strcmp (psz_access, "tcp") || !strcmp (psz_access, "sctp")
+              || !strcmp (psz_access, "dccp"))
         {
             psz_mux = strdup("ts");
         }
@@ -337,13 +340,69 @@ static int Open( vlc_object_t *p_this )
     msg_Dbg( p_stream, "mux opened" );
 
     /* *** Create the SAP Session structure *** */
-    if( var_GetBool( p_stream, SOUT_CFG_PREFIX"sap" ) &&
-        ( strncmp( psz_access, "udp", 3 ) || strncmp( psz_access , "rtp", 3 ) ) )
+    if( var_GetBool( p_stream, SOUT_CFG_PREFIX"sap" ) )
     {
         session_descriptor_t *p_session;
         announce_method_t *p_method = sout_SAPMethod ();
         vlc_url_t url;
-        p_session = sout_AnnounceSessionCreate (VLC_OBJECT (p_stream), SOUT_CFG_PREFIX);
+        const int payload_type = 33;
+
+        static const struct { const char *access; const char *fmt; } fmts[] =
+            {
+                { "udp",      "udp mpeg" },
+                { "rtp",      "RTP/AVP %d" },
+                { "udplite",  "UDPLite/RTP/AVP %d" },
+                /* Currently unsupported access outputs: */
+                { "dccp",     "DCCP/RTP/AVP %d" },
+                { "tcp",      "TCP/RTP/AVP %d" },
+                /* TLS/DTLS variants (none implemented). */
+                { "dtls",     "UDP/TLS/RTP/AVP %d" },
+                { "dtlslite", "UDPLite/TLS/RTP/AVP %d" },
+                { "dccps",    "DCCP/TLS/RTP/AVP %d" },
+                { "tls",      "TCP/TLS/RTP/AVP %d" },
+                /* SRTP (not implemented) */
+                { "srtp",     "RTP/SAVP %d" },
+                { "sudplite", "UDPLite/RTP/SAVP %d" },
+                { "sdccp",    "DCCP/RTP/SAVP %d" },
+                { "stcp",     "TCP/RTP/SAVP %d" },
+                { NULL,       NULL }
+            };
+        const char *psz_sdp_fmt = NULL;
+        char *fmt, *src, *dst;
+        int sport, dport;
+
+        for (unsigned i = 0; fmts[i].access != NULL; i++)
+            if (strcasecmp (fmts[i].access, psz_access) == 0)
+            {
+                psz_sdp_fmt = fmts[i].fmt;
+                break;
+            }
+
+        src = var_GetNonEmptyString (p_access, "src-addr");
+        dst = var_GetNonEmptyString (p_access, "dst-addr");
+        sport = var_GetInteger (p_access, "src-port");
+        dport = var_GetInteger (p_access, "dst-port");
+        msg_Err (p_stream, "%p, %p, %d, %d", src, dst, sport, dport);
+
+        if ((psz_sdp_fmt == NULL)
+         || (asprintf (&fmt, psz_sdp_fmt, payload_type) == -1))
+            fmt = NULL;
+
+        msg_Dbg( p_stream, "SAP advertized format: %s", fmt);
+        if ((fmt == NULL) || ((src == NULL) && (dst == NULL)))
+        {
+            msg_Err (p_access, "SAP announces not supported for access %s",
+                     psz_access);
+            free (fmt);
+            free (src);
+            free (dst);
+            goto nosap;
+        }
+
+        p_session = sout_AnnounceSessionCreate (VLC_OBJECT (p_stream),
+                                                SOUT_CFG_PREFIX);
+        sout_SessionSetMedia (VLC_OBJECT (p_stream), p_session, fmt,
+                              src, sport, dst, dport);
 
         /* Now, parse the URL to extract host and port */
         vlc_UrlParse( &url, psz_url , 0);
@@ -355,7 +414,6 @@ static int Open( vlc_object_t *p_this )
 #if 0
             p_session->psz_uri = strdup( url.psz_host );
             p_session->i_port = url.i_port;
-            p_session->i_payload = 33;
             p_session->b_rtp = strstr( psz_access, "rtp") ? 1 : 0;
 #endif
             msg_Info( p_this, "SAP Enabled");
@@ -366,6 +424,7 @@ static int Open( vlc_object_t *p_this )
         vlc_UrlClean( &url );
         sout_MethodRelease (p_method);
     }
+nosap:
 
     p_stream->pf_add    = Add;
     p_stream->pf_del    = Del;
index 88052e712befe113ba9570db00d1e857a9fd16ee..582cc178ec8299dc149f048564978a234ec61173 100644 (file)
@@ -192,6 +192,31 @@ session_descriptor_t * sout_AnnounceSessionCreate (vlc_object_t *obj,
     return p_session;
 }
 
+int sout_SessionSetMedia (vlc_object_t *obj, session_descriptor_t *p_session,
+                          char *fmt, char *src, int sport,
+                          char *dst, int dport)
+{
+    p_session->sdpformat = fmt;
+
+    /* GRUIK. We should not convert back-and-forth from string to numbers */
+    struct addrinfo *res;
+    if (vlc_getaddrinfo (obj, dst, dport, NULL, &res) == 0)
+    {
+        if (res->ai_addrlen <= sizeof (p_session->addr))
+            memcpy (&p_session->addr, res->ai_addr,
+                    p_session->addrlen = res->ai_addrlen);
+        freeaddrinfo (res);
+    }
+    if (vlc_getaddrinfo (obj, src, sport, NULL, &res) == 0)
+    {
+        if (res->ai_addrlen <= sizeof (p_session->orig))
+            memcpy (&p_session->orig, res->ai_addr,
+                    p_session->origlen = res->ai_addrlen);
+        freeaddrinfo (res);
+    }
+    return 0;
+}
+
 /**
  * Destroy a session descriptor and free all
  *
index ae1549cffc40f1f81758794e8e08d7bde99746c4..573b88d34df740785caed7a61b113ca5eb38b899 100644 (file)
@@ -382,6 +382,7 @@ static int announce_SAPAnnounceAdd( sap_handler_t *p_sap,
         if( p_address->i_wfd != -1 )
         {
             net_StopRecv( p_address->i_wfd );
+            p_address->origlen = sizeof (p_address->orig);
             getsockname (p_address->i_wfd, (struct sockaddr *)&p_address->orig,
                          &p_address->origlen);
         }
@@ -624,13 +625,12 @@ static char *SDPGenerate( sap_handler_t *p_sap,
         sfilter = NULL;
 
     int res = asprintf (&psz_sdp, "%s" "%s" "%s"
-                        "m=video %d %s %d\r\n",
+                        "m=video %d %s\r\n",
                         head,
                         plgroup ?: "",
                         sfilter ?: "",
                         net_GetPort ((const struct sockaddr *)&p_session->addr),
-                        p_session->b_rtp ? "RTP/AVP" : "udp",
-                        p_session->i_payload);
+                        p_session->sdpformat);
     free (plgroup);
     free (sfilter);
 
index 41129d7deecc5d223ffa3f8f7575f81ab588910b..01b98592193b1a63a9b28163ea324475b7598540 100644 (file)
@@ -83,10 +83,8 @@ struct session_descriptor_t
     struct sockaddr_storage addr;
     socklen_t addrlen;
 
-    int i_payload;   /* SAP Payload type */
-
+    char *sdpformat; // format suitable for SDP
     char *psz_sdp;
-    vlc_bool_t b_rtp;
     vlc_bool_t b_ssm;
 };