mirror of
https://code.videolan.org/videolan/vlc
synced 2024-08-18 23:45:06 +02:00
UDP-Lite access output
This commit is contained in:
parent
7605da8016
commit
2a2b219f75
5
NEWS
5
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
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user