Commit 19248128 authored by Laurent Aimar's avatar Laurent Aimar

* rtp: added port-audio and port-video option (for default port).

parent dc30ef14
...@@ -54,6 +54,15 @@ ...@@ -54,6 +54,15 @@
#define PORT_TEXT N_("Port") #define PORT_TEXT N_("Port")
#define PORT_LONGTEXT N_( \ #define PORT_LONGTEXT N_( \
"Allows you to specify the base port used for the RTP streaming." ) "Allows you to specify the base port used for the RTP streaming." )
#define PORT_AUDIO_TEXT N_("Audio port")
#define PORT_AUDIO_LONGTEXT N_( \
"Allows you to specify the default audio port used for the RTP streaming." )
#define PORT_VIDEO_TEXT N_("Video port")
#define PORT_VIDEO_LONGTEXT N_( \
"Allows you to specify the default video port used for the RTP streaming." )
#define TTL_TEXT N_("Time to live") #define TTL_TEXT N_("Time to live")
#define TTL_LONGTEXT N_( \ #define TTL_LONGTEXT N_( \
"Allows you to specify the time to live for the output stream." ) "Allows you to specify the time to live for the output stream." )
...@@ -77,8 +86,13 @@ vlc_module_begin(); ...@@ -77,8 +86,13 @@ vlc_module_begin();
add_string( SOUT_CFG_PREFIX "mux", "", NULL, MUX_TEXT, add_string( SOUT_CFG_PREFIX "mux", "", NULL, MUX_TEXT,
MUX_LONGTEXT, VLC_TRUE ); MUX_LONGTEXT, VLC_TRUE );
add_integer( SOUT_CFG_PREFIX "port", 1234, NULL, PORT_TEXT, add_integer( SOUT_CFG_PREFIX "port-audio", 1234, NULL, PORT_AUDIO_TEXT,
PORT_LONGTEXT, VLC_TRUE );
add_integer( SOUT_CFG_PREFIX "port-video", 1236, NULL, PORT_VIDEO_TEXT,
PORT_LONGTEXT, VLC_TRUE );
add_integer( SOUT_CFG_PREFIX "port", 1238, NULL, PORT_TEXT,
PORT_LONGTEXT, VLC_TRUE ); PORT_LONGTEXT, VLC_TRUE );
add_integer( SOUT_CFG_PREFIX "ttl", 0, NULL, TTL_TEXT, add_integer( SOUT_CFG_PREFIX "ttl", 0, NULL, TTL_TEXT,
TTL_LONGTEXT, VLC_TRUE ); TTL_LONGTEXT, VLC_TRUE );
...@@ -89,7 +103,7 @@ vlc_module_end(); ...@@ -89,7 +103,7 @@ vlc_module_end();
* Exported prototypes * Exported prototypes
*****************************************************************************/ *****************************************************************************/
static const char *ppsz_sout_options[] = { static const char *ppsz_sout_options[] = {
"dst", "name", "port", "sdp", "ttl", "mux", NULL "dst", "name", "port", "port-audio", "port-video", "sdp", "ttl", "mux", NULL
}; };
static sout_stream_id_t *Add ( sout_stream_t *, es_format_t * ); static sout_stream_id_t *Add ( sout_stream_t *, es_format_t * );
...@@ -140,6 +154,8 @@ struct sout_stream_sys_t ...@@ -140,6 +154,8 @@ struct sout_stream_sys_t
/* */ /* */
char *psz_destination; char *psz_destination;
int i_port; int i_port;
int i_port_audio;
int i_port_video;
int i_ttl; int i_ttl;
/* when need to use a private one or when using muxer */ /* when need to use a private one or when using muxer */
...@@ -240,9 +256,16 @@ static int Open( vlc_object_t *p_this ) ...@@ -240,9 +256,16 @@ static int Open( vlc_object_t *p_this )
var_Get( p_stream, SOUT_CFG_PREFIX "name", &val ); var_Get( p_stream, SOUT_CFG_PREFIX "name", &val );
p_sys->psz_session_name = *val.psz_string ? val.psz_string : NULL; p_sys->psz_session_name = *val.psz_string ? val.psz_string : NULL;
var_Get( p_stream, SOUT_CFG_PREFIX "port", &val ); p_sys->i_port = var_GetInteger( p_stream, SOUT_CFG_PREFIX "port" );
p_sys->i_port = val.i_int; 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" );
if( p_sys->i_port_audio == p_sys->i_port_video )
{
msg_Err( p_stream, "audio and video port cannot be the same" );
p_sys->i_port_audio = 0;
p_sys->i_port_video = 0;
}
if( !p_sys->psz_session_name ) if( !p_sys->psz_session_name )
{ {
...@@ -629,6 +652,8 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt ) ...@@ -629,6 +652,8 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt )
sout_stream_sys_t *p_sys = p_stream->p_sys; sout_stream_sys_t *p_sys = p_stream->p_sys;
sout_stream_id_t *id; sout_stream_id_t *id;
sout_access_out_t *p_access = NULL; sout_access_out_t *p_access = NULL;
int i_port;
char *psz_sdp;
if( p_sys->p_mux != NULL ) if( p_sys->p_mux != NULL )
{ {
...@@ -645,10 +670,34 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt ) ...@@ -645,10 +670,34 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt )
id->p_input = p_input; id->p_input = p_input;
id->pf_packetize= NULL; id->pf_packetize= NULL;
id->p_rtsp_url = NULL; id->p_rtsp_url = NULL;
id->i_port = 0;
return id; return id;
} }
/* Choose the port */
i_port = 0;
if( p_fmt->i_cat == AUDIO_ES && p_sys->i_port_audio > 0 )
{
i_port = p_sys->i_port_audio;
p_sys->i_port_audio = 0;
}
else if( p_fmt->i_cat == VIDEO_ES && p_sys->i_port_video > 0 )
{
i_port = p_sys->i_port_video;
p_sys->i_port_video = 0;
}
while( i_port == 0 )
{
if( p_sys->i_port != p_sys->i_port_audio && p_sys->i_port != p_sys->i_port_video )
{
i_port = p_sys->i_port;
p_sys->i_port += 2;
break;
}
p_sys->i_port += 2;
}
if( p_sys->psz_destination ) if( p_sys->psz_destination )
{ {
char access[100]; char access[100];
...@@ -663,7 +712,7 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt ) ...@@ -663,7 +712,7 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt )
{ {
sprintf( access, "udp{raw}" ); sprintf( access, "udp{raw}" );
} }
sprintf( url, "%s:%d", p_sys->psz_destination, p_sys->i_port ); sprintf( url, "%s:%d", p_sys->psz_destination, i_port );
if( ( p_access = sout_AccessOutNew( p_sout, access, url ) ) == NULL ) if( ( p_access = sout_AccessOutNew( p_sout, access, url ) ) == NULL )
{ {
msg_Err( p_stream, "cannot create the access out for %s://%s", msg_Err( p_stream, "cannot create the access out for %s://%s",
...@@ -682,7 +731,7 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt ) ...@@ -682,7 +731,7 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt )
id->psz_rtpmap = NULL; id->psz_rtpmap = NULL;
id->psz_fmtp = NULL; id->psz_fmtp = NULL;
id->psz_destination = p_sys->psz_destination ? strdup( p_sys->psz_destination ) : NULL; id->psz_destination = p_sys->psz_destination ? strdup( p_sys->psz_destination ) : NULL;
id->i_port = p_sys->i_port; id->i_port = i_port;
id->p_rtsp_url = NULL; id->p_rtsp_url = NULL;
vlc_mutex_init( p_stream, &id->lock_rtsp ); vlc_mutex_init( p_stream, &id->lock_rtsp );
id->i_rtsp_access = 0; id->i_rtsp_access = 0;
...@@ -819,30 +868,24 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt ) ...@@ -819,30 +868,24 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt )
/* Update p_sys context */ /* Update p_sys context */
/* update port used (2 -> 1 rtp, 1 rtcp )*/
vlc_mutex_lock( &p_sys->lock_es ); vlc_mutex_lock( &p_sys->lock_es );
TAB_APPEND( p_sys->i_es, p_sys->es, id ); TAB_APPEND( p_sys->i_es, p_sys->es, id );
vlc_mutex_unlock( &p_sys->lock_es ); vlc_mutex_unlock( &p_sys->lock_es );
if( p_sys->p_mux == NULL ) psz_sdp = SDPGenerate( p_stream, p_sys->psz_destination, VLC_FALSE );
{
char *psz_sdp;
p_sys->i_port += 2;
psz_sdp = SDPGenerate( p_stream, p_sys->psz_destination, VLC_FALSE );
vlc_mutex_lock( &p_sys->lock_sdp ); vlc_mutex_lock( &p_sys->lock_sdp );
free( p_sys->psz_sdp ); free( p_sys->psz_sdp );
p_sys->psz_sdp = psz_sdp; p_sys->psz_sdp = psz_sdp;
vlc_mutex_unlock( &p_sys->lock_sdp ); vlc_mutex_unlock( &p_sys->lock_sdp );
p_sys->i_sdp_version++; p_sys->i_sdp_version++;
fprintf( stderr, "sdp=%s", p_sys->psz_sdp ); fprintf( stderr, "sdp=%s", p_sys->psz_sdp );
/* Update SDP (sap/file) */ /* Update SDP (sap/file) */
if( p_sys->b_export_sap ) SapSetup( p_stream ); if( p_sys->b_export_sap ) SapSetup( p_stream );
if( p_sys->b_export_sdp_file ) FileSetup( p_stream ); if( p_sys->b_export_sdp_file ) FileSetup( p_stream );
}
return id; return id;
} }
...@@ -855,6 +898,15 @@ static int Del( sout_stream_t *p_stream, sout_stream_id_t *id ) ...@@ -855,6 +898,15 @@ static int Del( sout_stream_t *p_stream, sout_stream_id_t *id )
TAB_REMOVE( p_sys->i_es, p_sys->es, id ); TAB_REMOVE( p_sys->i_es, p_sys->es, id );
vlc_mutex_unlock( &p_sys->lock_es ); vlc_mutex_unlock( &p_sys->lock_es );
/* Release port */
if( id->i_port > 0 )
{
if( id->i_cat == AUDIO_ES && p_sys->i_port_audio == 0 )
p_sys->i_port_audio = id->i_port;
else if( id->i_cat == VIDEO_ES && p_sys->i_port_video == 0 )
p_sys->i_port_video = id->i_port;
}
if( id->p_access ) if( id->p_access )
{ {
if( id->psz_rtpmap ) if( id->psz_rtpmap )
......
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