* 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
* 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
#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)
#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)
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();
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;
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 );
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" );
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;
/*****************************************************************************
- * __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;
{
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;