]> git.sesse.net Git - vlc/commitdiff
UDP-Lite access output
authorRémi Denis-Courmont <rem@videolan.org>
Mon, 5 Feb 2007 17:21:56 +0000 (17:21 +0000)
committerRémi Denis-Courmont <rem@videolan.org>
Mon, 5 Feb 2007 17:21:56 +0000 (17:21 +0000)
NEWS
include/vlc_network.h
modules/access_output/udp.c
src/network/udp.c

diff --git a/NEWS b/NEWS
index d38ef9e3fb7c5522d945f42bf4a056d22fd311d6..46cf79076bdae94391abab301b334e7cf0181cf6 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -29,7 +29,7 @@ Playlist:
     * Audioscrobbler/last.fm support
 
 Input/Demuxers:
-  * Support for UDP-Lite (requires OS support) for UDP-Raw and RTP
+  * UDP-Lite (requires OS support) for raw and RTP encapsulation
 
 Decoders:
  * VP60/VP61 codecs support
@@ -41,6 +41,9 @@ Video output:
  * Rewrite motion detection video filter
  * New extract video filter (extract Red, Green and Blue components from a video)
 
+Stream output:
+ * UDP-Lite (requires OS support) for raw and RTP/TS encapsulation
+
 Interfaces:
  * Windows/Linux
    * Brand new interface for Linux and Windows, based on the Qt toolkit
index ff27b231fd4232ce5fe4853818accee57a4105ad..946960d5beed00f95150343e551c0e31f429fcf0 100644 (file)
@@ -83,12 +83,17 @@ VLC_EXPORT( int *, __net_ListenTCP, ( vlc_object_t *, const char *, int ) );
 #define net_Accept(a, b, c) __net_Accept(VLC_OBJECT(a), b, c)
 VLC_EXPORT( int, __net_Accept, ( vlc_object_t *, int *, mtime_t ) );
 
-#define net_ConnectUDP(a, b, c, d ) __net_ConnectUDP(VLC_OBJECT(a), b, c, d)
-VLC_EXPORT( int, __net_ConnectUDP, ( vlc_object_t *p_this, const char *psz_host, int i_port, int hlim ) );
+#define net_ConnectDgram(a, b, c, d, e ) __net_ConnectDgram(VLC_OBJECT(a), b, c, d, e)
+VLC_EXPORT( int, __net_ConnectDgram, ( vlc_object_t *p_this, const char *psz_host, int i_port, int hlim, int proto ) );
+
+static inline int net_ConnectUDP (vlc_object_t *obj, const char *host, int port, int hlim)
+{
+    return net_ConnectDgram (obj, host, port, hlim, 0);
+}
 
 static inline int net_ListenUDP1 (vlc_object_t *obj, const char *host, int port)
 {
-       return net_ListenSingle (obj, host, port, AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP);
+    return net_ListenSingle (obj, host, port, AF_UNSPEC, SOCK_DGRAM, 0);
 }
 
 #define net_OpenDgram( a, b, c, d, e, g, h ) __net_OpenDgram(VLC_OBJECT(a), b, c, d, e, g, h)
index cdccd0c37ecb75754ec9db77f4d7d8b11b7070b6..a7c86fe65bb665d3c934b95a2235e48e5a794a1e 100644 (file)
 
 #include <vlc_network.h>
 
+#if defined (HAVE_NETINET_UDPLITE_H)
+# include <netinet/udplite.h>
+#elif defined (__linux__)
+# define UDPLITE_SEND_CSCOV     10
+# define UDPLITE_RECV_CSCOV     11
+#endif
+
+#ifndef IPPROTO_UDPLITE
+# define IPPROTO_UDPLITE 136 /* from IANA */
+#endif
+#ifndef SOL_UDPLITE
+# define SOL_UDPLITE IPPROTO_UDPLITE
+#endif
+
 #define MAX_EMPTY_BLOCKS 200
 
 #if defined(WIN32) || defined(UNDER_CE)
@@ -105,6 +119,8 @@ vlc_module_begin();
     set_capability( "sout access", 100 );
     add_shortcut( "udp" );
     add_shortcut( "rtp" ); // Will work only with ts muxer
+    add_shortcut( "udplite" );
+    add_shortcut( "rtplite" );
     set_callbacks( Open, Close );
 vlc_module_end();
 
@@ -180,7 +196,8 @@ static int Open( vlc_object_t *p_this )
 
     char                *psz_parser;
     char                *psz_dst_addr;
-    int                 i_dst_port;
+    int                 i_dst_port, proto = IPPROTO_UDP, cscov = 8;
+    const char          *protoname = "UDP";
 
     int                 i_handle;
 
@@ -199,14 +216,16 @@ static int Open( vlc_object_t *p_this )
     memset( p_sys, 0, sizeof(sout_access_out_sys_t) );
     p_access->p_sys = p_sys;
 
-    if( p_access->psz_access != NULL &&
-        !strcmp( p_access->psz_access, "rtp" ) )
+    if( p_access->psz_access != NULL )
     {
-        p_sys->b_rtpts = 1;
-    }
-    else
-    {
-        p_sys->b_rtpts = 0;
+        if (strncmp (p_access->psz_access, "rtp", 3) == 0)
+        {
+            p_sys->b_rtpts = 1;
+            cscov += RTP_HEADER_LENGTH;
+        }
+        if ((strlen (p_access->psz_access) >= 3)
+         && (strcmp (p_access->psz_access + 3, "lite") == 0))
+            proto = IPPROTO_UDPLITE;
     }
 
     psz_parser = strdup( p_access->psz_name );
@@ -251,7 +270,7 @@ static int Open( vlc_object_t *p_this )
     p_sys->p_thread->p_fifo = block_FifoNew( p_access );
     p_sys->p_thread->p_empty_blocks = block_FifoNew( p_access );
 
-    i_handle = net_ConnectUDP( p_this, psz_dst_addr, i_dst_port, -1 );
+    i_handle = net_ConnectDgram( p_this, psz_dst_addr, i_dst_port, -1, proto );
     if( i_handle == -1 )
     {
          msg_Err( p_access, "failed to create UDP socket" );
@@ -260,6 +279,9 @@ static int Open( vlc_object_t *p_this )
 
     p_sys->p_thread->i_handle = i_handle;
     net_StopRecv( i_handle );
+    if (proto == IPPROTO_UDPLITE)
+        setsockopt (i_handle, SOL_UDPLITE, UDPLITE_SEND_CSCOV,
+                    &cscov, sizeof (cscov));
 
     var_Get( p_access, SOUT_CFG_PREFIX "caching", &val );
     p_sys->p_thread->i_caching = (int64_t)val.i_int * 1000;
index b8c522ea5b810cd6d9eead35be2c6d81db33a061..bd443f8ec1098cae22b20dbd918dfc746c5df4d8 100644 (file)
@@ -511,13 +511,13 @@ int net_SetDSCP( int fd, uint8_t dscp )
 
 
 /*****************************************************************************
- * __net_ConnectUDP:
+ * __net_ConnectDgram:
  *****************************************************************************
- * Open a UDP socket to send data to a defined destination, with an optional
- * hop limit.
+ * Open a datagram socket to send data to a defined destination, with an
+ * optional hop limit.
  *****************************************************************************/
-int __net_ConnectUDP( vlc_object_t *p_this, const char *psz_host, int i_port,
-                      int i_hlim )
+int __net_ConnectDgram( vlc_object_t *p_this, const char *psz_host, int i_port,
+                        int i_hlim, int proto )
 {
     struct addrinfo hints, *res, *ptr;
     int             i_val, i_handle = -1;
@@ -546,7 +546,7 @@ int __net_ConnectUDP( vlc_object_t *p_this, const char *psz_host, int i_port,
     {
         char *str;
         int fd = net_Socket (p_this, ptr->ai_family, ptr->ai_socktype,
-                             ptr->ai_protocol);
+                             proto ?: ptr->ai_protocol);
         if (fd == -1)
             continue;