Commit 2a2b219f authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

UDP-Lite access output

parent 7605da80
...@@ -29,7 +29,7 @@ Playlist: ...@@ -29,7 +29,7 @@ Playlist:
* Audioscrobbler/last.fm support * Audioscrobbler/last.fm support
Input/Demuxers: 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: Decoders:
* VP60/VP61 codecs support * VP60/VP61 codecs support
...@@ -41,6 +41,9 @@ Video output: ...@@ -41,6 +41,9 @@ Video output:
* Rewrite motion detection video filter * Rewrite motion detection video filter
* New extract video filter (extract Red, Green and Blue components from a video) * 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: Interfaces:
* Windows/Linux * Windows/Linux
* Brand new interface for Linux and Windows, based on the Qt toolkit * Brand new interface for Linux and Windows, based on the Qt toolkit
......
...@@ -83,12 +83,17 @@ VLC_EXPORT( int *, __net_ListenTCP, ( vlc_object_t *, const char *, int ) ); ...@@ -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) #define net_Accept(a, b, c) __net_Accept(VLC_OBJECT(a), b, c)
VLC_EXPORT( int, __net_Accept, ( vlc_object_t *, int *, mtime_t ) ); 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) #define net_ConnectDgram(a, b, c, d, e ) __net_ConnectDgram(VLC_OBJECT(a), b, c, d, e)
VLC_EXPORT( int, __net_ConnectUDP, ( vlc_object_t *p_this, const char *psz_host, int i_port, int hlim ) ); 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) 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) #define net_OpenDgram( a, b, c, d, e, g, h ) __net_OpenDgram(VLC_OBJECT(a), b, c, d, e, g, h)
......
...@@ -52,6 +52,20 @@ ...@@ -52,6 +52,20 @@
#include <vlc_network.h> #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 #define MAX_EMPTY_BLOCKS 200
#if defined(WIN32) || defined(UNDER_CE) #if defined(WIN32) || defined(UNDER_CE)
...@@ -105,6 +119,8 @@ vlc_module_begin(); ...@@ -105,6 +119,8 @@ vlc_module_begin();
set_capability( "sout access", 100 ); set_capability( "sout access", 100 );
add_shortcut( "udp" ); add_shortcut( "udp" );
add_shortcut( "rtp" ); // Will work only with ts muxer add_shortcut( "rtp" ); // Will work only with ts muxer
add_shortcut( "udplite" );
add_shortcut( "rtplite" );
set_callbacks( Open, Close ); set_callbacks( Open, Close );
vlc_module_end(); vlc_module_end();
...@@ -180,7 +196,8 @@ static int Open( vlc_object_t *p_this ) ...@@ -180,7 +196,8 @@ static int Open( vlc_object_t *p_this )
char *psz_parser; char *psz_parser;
char *psz_dst_addr; char *psz_dst_addr;
int i_dst_port; int i_dst_port, proto = IPPROTO_UDP, cscov = 8;
const char *protoname = "UDP";
int i_handle; int i_handle;
...@@ -199,14 +216,16 @@ static int Open( vlc_object_t *p_this ) ...@@ -199,14 +216,16 @@ static int Open( vlc_object_t *p_this )
memset( p_sys, 0, sizeof(sout_access_out_sys_t) ); memset( p_sys, 0, sizeof(sout_access_out_sys_t) );
p_access->p_sys = p_sys; p_access->p_sys = p_sys;
if( p_access->psz_access != NULL && if( p_access->psz_access != NULL )
!strcmp( p_access->psz_access, "rtp" ) )
{ {
p_sys->b_rtpts = 1; if (strncmp (p_access->psz_access, "rtp", 3) == 0)
} {
else p_sys->b_rtpts = 1;
{ cscov += RTP_HEADER_LENGTH;
p_sys->b_rtpts = 0; }
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 ); psz_parser = strdup( p_access->psz_name );
...@@ -251,7 +270,7 @@ static int Open( vlc_object_t *p_this ) ...@@ -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_fifo = block_FifoNew( p_access );
p_sys->p_thread->p_empty_blocks = 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 ) if( i_handle == -1 )
{ {
msg_Err( p_access, "failed to create UDP socket" ); msg_Err( p_access, "failed to create UDP socket" );
...@@ -260,6 +279,9 @@ static int Open( vlc_object_t *p_this ) ...@@ -260,6 +279,9 @@ static int Open( vlc_object_t *p_this )
p_sys->p_thread->i_handle = i_handle; p_sys->p_thread->i_handle = i_handle;
net_StopRecv( 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 ); var_Get( p_access, SOUT_CFG_PREFIX "caching", &val );
p_sys->p_thread->i_caching = (int64_t)val.i_int * 1000; p_sys->p_thread->i_caching = (int64_t)val.i_int * 1000;
......
...@@ -511,13 +511,13 @@ int net_SetDSCP( int fd, uint8_t dscp ) ...@@ -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 * Open a datagram socket to send data to a defined destination, with an
* hop limit. * optional hop limit.
*****************************************************************************/ *****************************************************************************/
int __net_ConnectUDP( vlc_object_t *p_this, const char *psz_host, int i_port, int __net_ConnectDgram( vlc_object_t *p_this, const char *psz_host, int i_port,
int i_hlim ) int i_hlim, int proto )
{ {
struct addrinfo hints, *res, *ptr; struct addrinfo hints, *res, *ptr;
int i_val, i_handle = -1; 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, ...@@ -546,7 +546,7 @@ int __net_ConnectUDP( vlc_object_t *p_this, const char *psz_host, int i_port,
{ {
char *str; char *str;
int fd = net_Socket (p_this, ptr->ai_family, ptr->ai_socktype, int fd = net_Socket (p_this, ptr->ai_family, ptr->ai_socktype,
ptr->ai_protocol); proto ?: ptr->ai_protocol);
if (fd == -1) if (fd == -1)
continue; continue;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment