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:
* 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
......
......@@ -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)
......
......@@ -52,6 +52,20 @@
#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;
......
......@@ -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;
......
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