* live.cpp : live.com support.
*****************************************************************************
* Copyright (C) 2003 VideoLAN
- * $Id: livedotcom.cpp,v 1.8 2003/11/20 22:10:55 fenrir Exp $
+ * $Id: livedotcom.cpp,v 1.13 2003/12/04 18:13:28 gbazin Exp $
*
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
*
add_submodule();
set_description( _("RTSP/RTP describe") );
add_shortcut( "rtsp" );
+ add_shortcut( "sdp" );
set_capability( "access", 0 );
set_callbacks( AccessOpen, AccessClose );
add_category_hint( N_("RTSP"), NULL, VLC_TRUE );
};
static ssize_t Read ( input_thread_t *, byte_t *, size_t );
+static ssize_t MRLRead( input_thread_t *, byte_t *, size_t );
static int Demux ( input_thread_t * );
static int Control( input_thread_t *, int, va_list );
vlc_value_t val;
char *psz_url;
- if( p_input->psz_access == NULL || strcasecmp( p_input->psz_access, "rtsp" ) )
+ if( p_input->psz_access == NULL || ( strcasecmp( p_input->psz_access, "rtsp" ) && strcasecmp( p_input->psz_access, "sdp" ) ) )
{
msg_Warn( p_input, "RTSP access discarded" );
return VLC_EGENERIC;
}
- if( ( scheduler = BasicTaskScheduler::createNew() ) == NULL )
+ if( !strcasecmp( p_input->psz_access, "rtsp" ) )
{
- msg_Err( p_input, "BasicTaskScheduler::createNew failed" );
- return VLC_EGENERIC;
- }
- if( ( env = BasicUsageEnvironment::createNew(*scheduler) ) == NULL )
- {
- delete scheduler;
- msg_Err( p_input, "BasicUsageEnvironment::createNew failed" );
- return VLC_EGENERIC;
- }
- if( ( rtsp = RTSPClient::createNew(*env, 1/*verbose*/, "VLC Media Player" ) ) == NULL )
- {
- delete env;
- delete scheduler;
- msg_Err( p_input, "RTSPClient::createNew failed" );
- return VLC_EGENERIC;
- }
+ if( ( scheduler = BasicTaskScheduler::createNew() ) == NULL )
+ {
+ msg_Err( p_input, "BasicTaskScheduler::createNew failed" );
+ return VLC_EGENERIC;
+ }
+ if( ( env = BasicUsageEnvironment::createNew(*scheduler) ) == NULL )
+ {
+ delete scheduler;
+ msg_Err( p_input, "BasicUsageEnvironment::createNew failed" );
+ return VLC_EGENERIC;
+ }
+ if( ( rtsp = RTSPClient::createNew(*env, 1/*verbose*/, "VLC Media Player" ) ) == NULL )
+ {
+ delete env;
+ delete scheduler;
+ msg_Err( p_input, "RTSPClient::createNew failed" );
+ return VLC_EGENERIC;
+ }
- psz_url = (char*)malloc( strlen( p_input->psz_name ) + 8 );
- sprintf( psz_url, "rtsp://%s", p_input->psz_name );
+ psz_url = (char*)malloc( strlen( p_input->psz_name ) + 8 );
+ sprintf( psz_url, "rtsp://%s", p_input->psz_name );
- p_sys = (access_sys_t*)malloc( sizeof( access_sys_t ) );
- p_sys->p_sdp = rtsp->describeURL( psz_url );
+ p_sys = (access_sys_t*)malloc( sizeof( access_sys_t ) );
+ p_sys->p_sdp = rtsp->describeURL( psz_url );
- if( p_sys->p_sdp == NULL )
- {
- msg_Err( p_input, "describeURL failed (%s)", env->getResultMsg() );
+ if( p_sys->p_sdp == NULL )
+ {
+ msg_Err( p_input, "describeURL failed (%s)", env->getResultMsg() );
+ free( psz_url );
+ delete env;
+ delete scheduler;
+ free( p_sys );
+ return VLC_EGENERIC;
+ }
free( psz_url );
- delete env;
- delete scheduler;
- free( p_sys );
- return VLC_EGENERIC;
- }
- free( psz_url );
- p_sys->i_sdp = strlen( p_sys->p_sdp );
- p_sys->i_pos = 0;
+ p_sys->i_sdp = strlen( p_sys->p_sdp );
+ p_sys->i_pos = 0;
- //fprintf( stderr, "sdp=%s\n", p_sys->p_sdp );
+ //fprintf( stderr, "sdp=%s\n", p_sys->p_sdp );
- delete env;
- delete scheduler;
+ delete env;
+ delete scheduler;
- var_Create( p_input, "rtsp-tcp", VLC_VAR_BOOL|VLC_VAR_DOINHERIT );
- var_Get( p_input, "rtsp-tcp", &val );
+ var_Create( p_input, "rtsp-tcp", VLC_VAR_BOOL|VLC_VAR_DOINHERIT );
+ var_Get( p_input, "rtsp-tcp", &val );
- p_input->p_access_data = p_sys;
- p_input->i_mtu = 0;
+ p_input->p_access_data = p_sys;
+ p_input->i_mtu = 0;
- /* Set exported functions */
- p_input->pf_read = Read;
- p_input->pf_seek = NULL;
- p_input->pf_set_program = input_SetProgram;
- p_input->pf_set_area = NULL;
- p_input->p_private = NULL;
+ /* Set exported functions */
+ p_input->pf_read = Read;
+ p_input->pf_seek = NULL;
+ p_input->pf_set_program = input_SetProgram;
+ p_input->pf_set_area = NULL;
+ p_input->p_private = NULL;
- p_input->psz_demux = "live";
+ p_input->psz_demux = "live";
- /* Finished to set some variable */
- vlc_mutex_lock( &p_input->stream.stream_lock );
- /* FIXME that's not true but eg over tcp, server send data too fast */
- p_input->stream.b_pace_control = val.b_bool;
- p_input->stream.p_selected_area->i_tell = 0;
- p_input->stream.b_seekable = 1; /* Hack to display time */
- p_input->stream.p_selected_area->i_size = 0;
- p_input->stream.i_method = INPUT_METHOD_NETWORK;
- vlc_mutex_unlock( &p_input->stream.stream_lock );
+ /* Finished to set some variable */
+ vlc_mutex_lock( &p_input->stream.stream_lock );
+ /* FIXME that's not true but eg over tcp, server send data too fast */
+ p_input->stream.b_pace_control = val.b_bool;
+ p_input->stream.p_selected_area->i_tell = 0;
+ p_input->stream.b_seekable = 1; /* Hack to display time */
+ p_input->stream.p_selected_area->i_size = 0;
+ p_input->stream.i_method = INPUT_METHOD_NETWORK;
+ vlc_mutex_unlock( &p_input->stream.stream_lock );
- /* Update default_pts to a suitable value for RTSP access */
- var_Create( p_input, "rtsp-caching", VLC_VAR_INTEGER|VLC_VAR_DOINHERIT );
- var_Get( p_input, "rtsp-caching", &val );
- p_input->i_pts_delay = val.i_int * 1000;
+ /* Update default_pts to a suitable value for RTSP access */
+ var_Create( p_input, "rtsp-caching", VLC_VAR_INTEGER|VLC_VAR_DOINHERIT );
+ var_Get( p_input, "rtsp-caching", &val );
+ p_input->i_pts_delay = val.i_int * 1000;
- return VLC_SUCCESS;
+ return VLC_SUCCESS;
+ }
+ else
+ {
+ p_input->p_access_data = (access_sys_t*)0;
+ p_input->i_mtu = 0;
+ p_input->pf_read = MRLRead;
+ p_input->pf_seek = NULL;
+ p_input->pf_set_program = input_SetProgram;
+ p_input->pf_set_area = NULL;
+ p_input->p_private = NULL;
+ p_input->psz_demux = "live";
+ /* Finished to set some variable */
+ vlc_mutex_lock( &p_input->stream.stream_lock );
+ p_input->stream.b_pace_control = VLC_TRUE;
+ p_input->stream.p_selected_area->i_tell = 0;
+ p_input->stream.b_seekable = VLC_FALSE;
+ p_input->stream.p_selected_area->i_size = 0;
+ p_input->stream.i_method = INPUT_METHOD_NETWORK;
+ vlc_mutex_unlock( &p_input->stream.stream_lock );
+
+ return VLC_SUCCESS;
+ }
}
/*****************************************************************************
{
input_thread_t *p_input = (input_thread_t *)p_this;
access_sys_t *p_sys = p_input->p_access_data;
-
- delete[] p_sys->p_sdp;
- free( p_sys );
+ if( !strcasecmp( p_input->psz_access, "rtsp" ) )
+ {
+ delete[] p_sys->p_sdp;
+ free( p_sys );
+ }
}
/*****************************************************************************
}
return i_copy;
}
+/*****************************************************************************
+ * MRLRead: read data from the mrl
+ *****************************************************************************/
+static ssize_t MRLRead ( input_thread_t *p_input, byte_t *p_buffer, size_t i_len )
+{
+ int i_done = (int)p_input->p_access_data;
+ int i_copy = __MIN( (int)i_len, (int)strlen(p_input->psz_name) - i_done );
+
+ if( i_copy > 0 )
+ {
+ memcpy( p_buffer, &p_input->psz_name[i_done], i_copy );
+ i_done += i_copy;
+ p_input->p_access_data = (access_sys_t*)i_done;
+ }
+ return i_copy;
+}
/*****************************************************************************
p_sys->i_start = 0;
/* Gather the complete sdp file */
+ vlc_mutex_lock( &p_input->stream.stream_lock );
+ if( input_InitStream( p_input, 0 ) == -1)
+ {
+ vlc_mutex_unlock( &p_input->stream.stream_lock );
+ msg_Err( p_input, "cannot init stream" );
+ goto error;
+ }
+ vlc_mutex_unlock( &p_input->stream.stream_lock );
+
i_sdp = 0;
i_sdp_max = 1000;
p_sdp = (uint8_t*)malloc( i_sdp_max );
if( tk->p_es || tk->b_quicktime )
{
- TAB_APPEND( p_sys->i_track, (void**)p_sys->track, (void*)tk );
+ TAB_APPEND( p_sys->i_track, p_sys->track, tk );
tk->readSource = sub->readSource();
tk->rtpSource = sub->rtpSource();
}
live_track_t *tk = (live_track_t*)p_private;
input_thread_t *p_input = tk->p_input;
demux_sys_t *p_sys = p_input->p_demux_data;
- pes_packet_t *p_pes;
- data_packet_t *p_data;
+ block_t *p_block;
- mtime_t i_pts = (mtime_t)pts.tv_sec * 1000000LL + (mtime_t)pts.tv_usec;
+ mtime_t i_pts = (mtime_t)pts.tv_sec * 1000000LL + (mtime_t)pts.tv_usec;
if( tk->b_quicktime && tk->p_es == NULL )
{
i_size,
pts.tv_sec * 1000000LL + pts.tv_usec );
#endif
- /* Create a PES */
- if( ( p_pes = input_NewPES( p_input->p_method_data ) ) == NULL )
- {
- return;
- }
if( i_size > 65536 )
{
msg_Warn( p_input, "buffer overflow" );
}
/* FIXME could i_size be > buffer size ? */
- p_data = input_NewPacket( p_input->p_method_data, i_size );
-
- memcpy( p_data->p_payload_start, tk->buffer, i_size );
- p_data->p_payload_end = p_data->p_payload_start + i_size;
+ p_block = block_New( p_input, i_size );
- p_pes->p_first = p_pes->p_last = p_data;
- p_pes->i_nb_data = 1;
- p_pes->i_pes_size = i_size;
- p_pes->i_rate = p_input->stream.control.i_rate;
+ memcpy( p_block->p_buffer, tk->buffer, i_size );
+ //p_block->i_rate = p_input->stream.control.i_rate;
if( i_pts != tk->i_pts )
{
- p_pes->i_dts =
- p_pes->i_pts = input_ClockGetTS( p_input,
+ p_block->i_dts =
+ p_block->i_pts = input_ClockGetTS( p_input,
p_input->stream.p_selected_program,
i_pts * 9 / 100 );
}
else
{
- p_pes->i_dts = 0;
- p_pes->i_pts = 0;
+ p_block->i_dts = 0;
+ p_block->i_pts = 0;
}
//fprintf( stderr, "tk -> dpts=%lld\n", i_pts - tk->i_pts );
- es_out_Send( p_input->p_es_out, tk->p_es, p_pes );
+ es_out_Send( p_input->p_es_out, tk->p_es, p_block );
/* warm that's ok */
p_sys->event = 0xff;