#define NAME_LONGTEXT N_( \
"This is the name of the session that will be announced in the SDP " \
"(Session Descriptor)." )
-#define DESC_TEXT N_("Session description")
+#define DESC_TEXT N_("Session descriptipn")
#define DESC_LONGTEXT N_( \
- "This allows you to give a broader description of the stream, that will " \
- "be announced in the SDP (Session Descriptor)." )
+ "This allows you to give a short description with details about the stream, " \
+ "that will be announced in the SDP (Session Descriptor)." )
#define URL_TEXT N_("Session URL")
#define URL_LONGTEXT N_( \
"This allows you to give an URL with more details about the stream " \
"be announced in the SDP (Session Descriptor)." )
#define EMAIL_TEXT N_("Session email")
#define EMAIL_LONGTEXT N_( \
- "This allows you to give a contact mail address for the stream, that will " \
- "be announced in the SDP (Session Descriptor)." )
+ "This allows you to give a contact mail address for the stream, that will " \
+ "be announced in the SDP (Session Descriptor)." )
+#define PHONE_TEXT N_("Session phone number")
+#define PHONE_LONGTEXT N_( \
+ "This allows you to give a contact telephone number for the stream, that will " \
+ "be announced in the SDP (Session Descriptor)." )
+
#define PORT_TEXT N_("Port")
#define PORT_LONGTEXT N_( \
"This allows you to specify the base port for the RTP streaming." )
URL_LONGTEXT, VLC_TRUE );
add_string( SOUT_CFG_PREFIX "email", "", NULL, EMAIL_TEXT,
EMAIL_LONGTEXT, VLC_TRUE );
+ add_string( SOUT_CFG_PREFIX "phone", "", NULL, PHONE_TEXT,
+ PHONE_LONGTEXT, VLC_TRUE );
add_integer( SOUT_CFG_PREFIX "port", 1234, NULL, PORT_TEXT,
PORT_LONGTEXT, VLC_TRUE );
*****************************************************************************/
static const char *ppsz_sout_options[] = {
"dst", "name", "port", "port-audio", "port-video", "*sdp", "ttl", "mux",
- "description", "url", "email",
+ "description", "url", "email", "phone",
"dccp", "tcp", "udplite",
"mp4a-latm", NULL
};
char *psz_sdp;
vlc_mutex_t lock_sdp;
- char *psz_session_name;
- char *psz_session_description;
- char *psz_session_url;
- char *psz_session_email;
-
/* SDP to disk */
vlc_bool_t b_export_sdp_file;
char *psz_sdp_file;
return VLC_ENOMEM;
p_sys->psz_destination = var_GetNonEmptyString( p_stream, SOUT_CFG_PREFIX "dst" );
- p_sys->psz_session_name = var_GetNonEmptyString( p_stream, SOUT_CFG_PREFIX "name" );
- p_sys->psz_session_description = var_GetNonEmptyString( p_stream, SOUT_CFG_PREFIX "description" );
- p_sys->psz_session_url = var_GetNonEmptyString( p_stream, SOUT_CFG_PREFIX "url" );
- p_sys->psz_session_email = var_GetNonEmptyString( p_stream, SOUT_CFG_PREFIX "email" );
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 = 0;
}
- if( !p_sys->psz_session_name )
- {
- if( p_sys->psz_destination )
- p_sys->psz_session_name = strdup( p_sys->psz_destination );
- else
- p_sys->psz_session_name = strdup( "NONE" );
- }
-
for( p_cfg = p_stream->p_cfg; p_cfg != NULL; p_cfg = p_cfg->p_next )
{
if( !strcmp( p_cfg->psz_name, "sdp" )
if( p_sys->p_httpd_host )
httpd_HostDelete( p_sys->p_httpd_host );
- free( p_sys->psz_session_name );
- free( p_sys->psz_session_description );
- free( p_sys->psz_session_url );
- free( p_sys->psz_session_email );
free( p_sys->psz_sdp );
if( p_sys->b_export_sdp_file )
dstlen = sizeof( struct sockaddr_in );
}
- psz_sdp = sdp_Start( p_sys->psz_session_name,
- p_sys->psz_session_description,
- p_sys->psz_session_url, p_sys->psz_session_email,
- NULL, NULL, 0, (struct sockaddr *)&dst, dstlen );
+ psz_sdp = vlc_sdp_Start( VLC_OBJECT( p_stream ), SOUT_CFG_PREFIX,
+ NULL, 0, (struct sockaddr *)&dst, dstlen );
if( psz_sdp == NULL )
return NULL;
-
/* TODO: a=source-filter */
if( rtsp_url != NULL )
id->psz_rtpmap, id->psz_fmtp);
if( rtsp_url != NULL )
- sdp_AddAttribute ( &psz_sdp, "control", "%s/trackID=%d",
+ {
+ assert( strlen( rtsp_url ) > 0 );
+ vlc_bool_t addslash = ( rtsp_url[strlen( rtsp_url ) - 1] != '/' );
+ sdp_AddAttribute ( &psz_sdp, "control",
+ addslash ? "%s/trackID=%u" : "%strackID=%u",
rtsp_url, i );
+ }
}
return psz_sdp;
sout_stream_sys_t *p_sys = p_stream->p_sys;
vlc_object_kill( id );
+ block_FifoWake( id->p_fifo );
vlc_mutex_lock( &p_sys->lock_es );
TAB_REMOVE( p_sys->i_es, p_sys->es, id );
{
sout_stream_sys_t *p_sys = p_stream->p_sys;
sout_instance_t *p_sout = p_stream->p_sout;
- announce_method_t *p_method = sout_SAPMethod();
/* Remove the previous session */
if( p_sys->p_session != NULL)
{
sout_AnnounceUnRegister( p_sout, p_sys->p_session);
- sout_AnnounceSessionDestroy( p_sys->p_session );
p_sys->p_session = NULL;
}
if( ( p_sys->i_es > 0 || p_sys->p_mux ) && p_sys->psz_sdp && *p_sys->psz_sdp )
{
+ announce_method_t *p_method = sout_SAPMethod();
p_sys->p_session = sout_AnnounceRegisterSDP( p_sout, SOUT_CFG_PREFIX,
p_sys->psz_sdp,
p_sys->psz_destination,
p_method );
+ sout_MethodRelease( p_method );
}
- sout_MethodRelease( p_method );
return VLC_SUCCESS;
}
if( ( f = utf8_fopen( p_sys->psz_sdp_file, "wt" ) ) == NULL )
{
- msg_Err( p_stream, "cannot open file '%s' (%s)",
- p_sys->psz_sdp_file, strerror(errno) );
+ msg_Err( p_stream, "cannot open file '%s' (%m)",
+ p_sys->psz_sdp_file );
return VLC_EGENERIC;
}
while( !id->b_die )
{
block_t *out = block_FifoGet( id->p_fifo );
+ if( out == NULL )
+ continue; /* Forced wakeup */
+
mtime_t i_date = out->i_dts + i_caching;
ssize_t len = out->i_buffer;