#include <vlc_network.h>
#include <vlc_charset.h>
#include <vlc_strings.h>
+#include <vlc_rand.h>
#include <srtp.h>
#include "rtp.h"
set_subcategory( SUBCAT_SOUT_STREAM )
add_string( SOUT_CFG_PREFIX "dst", "", NULL, DEST_TEXT,
- DEST_LONGTEXT, true );
+ DEST_LONGTEXT, true )
add_string( SOUT_CFG_PREFIX "sdp", "", NULL, SDP_TEXT,
- SDP_LONGTEXT, true );
+ SDP_LONGTEXT, true )
add_string( SOUT_CFG_PREFIX "mux", "", NULL, MUX_TEXT,
- MUX_LONGTEXT, true );
+ MUX_LONGTEXT, true )
add_bool( SOUT_CFG_PREFIX "sap", false, NULL, SAP_TEXT, SAP_LONGTEXT,
- true );
+ true )
add_string( SOUT_CFG_PREFIX "name", "", NULL, NAME_TEXT,
- NAME_LONGTEXT, true );
+ NAME_LONGTEXT, true )
add_string( SOUT_CFG_PREFIX "description", "", NULL, DESC_TEXT,
- DESC_LONGTEXT, true );
+ DESC_LONGTEXT, true )
add_string( SOUT_CFG_PREFIX "url", "", NULL, URL_TEXT,
- URL_LONGTEXT, true );
+ URL_LONGTEXT, true )
add_string( SOUT_CFG_PREFIX "email", "", NULL, EMAIL_TEXT,
- EMAIL_LONGTEXT, true );
+ EMAIL_LONGTEXT, true )
add_string( SOUT_CFG_PREFIX "phone", "", NULL, PHONE_TEXT,
- PHONE_LONGTEXT, true );
+ PHONE_LONGTEXT, true )
add_string( SOUT_CFG_PREFIX "proto", "udp", NULL, PROTO_TEXT,
- PROTO_LONGTEXT, false );
+ PROTO_LONGTEXT, false )
change_string_list( ppsz_protos, ppsz_protocols, NULL );
add_integer( SOUT_CFG_PREFIX "port", 5004, NULL, PORT_TEXT,
- PORT_LONGTEXT, true );
+ PORT_LONGTEXT, true )
add_integer( SOUT_CFG_PREFIX "port-audio", 0, NULL, PORT_AUDIO_TEXT,
- PORT_AUDIO_LONGTEXT, true );
+ PORT_AUDIO_LONGTEXT, true )
add_integer( SOUT_CFG_PREFIX "port-video", 0, NULL, PORT_VIDEO_TEXT,
- PORT_VIDEO_LONGTEXT, true );
+ PORT_VIDEO_LONGTEXT, true )
add_integer( SOUT_CFG_PREFIX "ttl", -1, NULL, TTL_TEXT,
- TTL_LONGTEXT, true );
+ TTL_LONGTEXT, true )
add_bool( SOUT_CFG_PREFIX "rtcp-mux", false, NULL,
- RTCP_MUX_TEXT, RTCP_MUX_LONGTEXT, false );
+ RTCP_MUX_TEXT, RTCP_MUX_LONGTEXT, false )
add_string( SOUT_CFG_PREFIX "key", "", NULL,
- SRTP_KEY_TEXT, SRTP_KEY_LONGTEXT, false );
+ SRTP_KEY_TEXT, SRTP_KEY_LONGTEXT, false )
add_string( SOUT_CFG_PREFIX "salt", "", NULL,
- SRTP_SALT_TEXT, SRTP_SALT_LONGTEXT, false );
+ SRTP_SALT_TEXT, SRTP_SALT_LONGTEXT, false )
add_bool( SOUT_CFG_PREFIX "mp4a-latm", 0, NULL, RFC3016_TEXT,
- RFC3016_LONGTEXT, false );
+ RFC3016_LONGTEXT, false )
set_callbacks( Open, Close )
vlc_module_end ()
p_sys->i_port = var_GetInteger( p_stream, SOUT_CFG_PREFIX "port" );
p_sys->i_port_audio = var_GetInteger( p_stream, SOUT_CFG_PREFIX "port-audio" );
p_sys->i_port_video = var_GetInteger( p_stream, SOUT_CFG_PREFIX "port-video" );
- p_sys->rtcp_mux = var_GetBool( p_stream, SOUT_CFG_PREFIX "rtcp-mux" );
+ p_sys->rtcp_mux = var_GetBool( p_stream, SOUT_CFG_PREFIX "rtcp-mux" );
p_sys->psz_sdp_file = NULL;
- if( p_sys->i_port_audio == p_sys->i_port_video )
+ if( p_sys->i_port_audio && p_sys->i_port_video == p_sys->i_port_audio )
{
- msg_Err( p_stream, "audio and video port cannot be the same" );
- p_sys->i_port_audio = 0;
- p_sys->i_port_video = 0;
+ msg_Err( p_stream, "audio and video RTP port must be distinct" );
+ free( p_sys->psz_destination );
+ free( p_sys );
+ return VLC_EGENERIC;
}
for( p_cfg = p_stream->p_cfg; p_cfg != NULL; p_cfg = p_cfg->p_next )
free( psz );
vlc_mutex_destroy( &p_sys->lock_sdp );
vlc_mutex_destroy( &p_sys->lock_es );
+ free( p_sys->psz_destination );
free( p_sys );
return VLC_EGENERIC;
}
sout_AccessOutDelete( p_sys->p_grab );
vlc_mutex_destroy( &p_sys->lock_sdp );
vlc_mutex_destroy( &p_sys->lock_es );
+ free( p_sys->psz_destination );
free( p_sys );
return VLC_EGENERIC;
}
sout_AccessOutDelete( p_sys->p_grab );
vlc_mutex_destroy( &p_sys->lock_sdp );
vlc_mutex_destroy( &p_sys->lock_es );
+ free( p_sys->psz_destination );
free( p_sys );
return VLC_EGENERIC;
}
id->psz_enc, id->i_clock_rate, id->i_channels,
id->psz_fmtp);
+ if( !p_sys->rtcp_mux && (id->i_port & 1) ) /* cf RFC4566 ยง5.14 */
+ sdp_AddAttribute ( &psz_sdp, "rtcp", "%u", id->i_port + 1 );
+
if( rtsp_url != NULL )
{
assert( strlen( rtsp_url ) > 0 );
sout_stream_id_t *id;
int i_port, cscov = -1;
char *psz_sdp;
+ int i_port_audio_option = var_GetInteger( p_stream, "port-audio" );
+ int i_port_video_option = var_GetInteger( p_stream, "port-video" );
if (0xffffffff == p_sys->payload_bitmap)
{
while( i_port == 0 )
{
- if( p_sys->i_port != p_sys->i_port_audio
- && p_sys->i_port != p_sys->i_port_video )
+ if( p_sys->i_port != i_port_audio_option
+ && p_sys->i_port != i_port_video_option )
{
i_port = p_sys->i_port;
- p_sys->i_port += 2;
- break;
}
p_sys->i_port += 2;
}
id->p_stream = p_stream;
- id->i_sequence = rand()&0xffff;
/* Look for free dymanic payload type */
id->i_payload_type = 96;
while (p_sys->payload_bitmap & (1 << (id->i_payload_type - 96)))
id->i_payload_type++;
assert (id->i_payload_type < 128);
- id->ssrc[0] = rand()&0xff;
- id->ssrc[1] = rand()&0xff;
- id->ssrc[2] = rand()&0xff;
- id->ssrc[3] = rand()&0xff;
+ vlc_rand_bytes (&id->i_sequence, sizeof (id->i_sequence));
+ vlc_rand_bytes (id->ssrc, sizeof (id->ssrc));
id->psz_enc = NULL;
id->psz_fmtp = NULL;
id->p_fifo = block_FifoNew();
if( vlc_thread_create( id, "RTP send thread", ThreadSend,
- VLC_THREAD_PRIORITY_HIGHEST, false ) )
+ VLC_THREAD_PRIORITY_HIGHEST ) )
goto error;
/* Update p_sys context */