* input_ps.c: PS demux and packet management
*****************************************************************************
* Copyright (C) 1998, 1999, 2000 VideoLAN
- * $Id: input_ps.c,v 1.22 2001/05/07 04:42:42 sam Exp $
+ * $Id: input_ps.c,v 1.25 2001/05/30 17:03:12 sam Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
* Cyril Deguet <asmax@via.ecp.fr>
#define input p_function_list->functions.input
p_function_list->pf_probe = PSProbe;
input.pf_init = PSInit;
- input.pf_open = input_FileOpen;
- input.pf_close = input_FileClose;
+ input.pf_open = NULL; /* Set in PSInit */
+ input.pf_close = NULL;
input.pf_end = PSEnd;
input.pf_set_area = NULL;
input.pf_read = PSRead;
return;
}
p_input->p_method_data = (void *)p_packet_cache;
+
+ /* Set callback */
+ p_input->pf_open = p_input->pf_file_open;
+ p_input->pf_close = p_input->pf_file_close;
+
+ /* Initialize packet cache mutex */
+ vlc_mutex_init( &p_packet_cache->lock );
/* allocates the data cache */
p_packet_cache->data.p_stack = malloc( DATA_CACHE_SIZE *
break;
case LPCM_AUDIO_ES:
- /* FIXME ! */
+ if( main_GetIntVariable( INPUT_CHANNEL_VAR, 0 )
+ == ((p_es->i_id & 0x1F00) >> 8) )
+ switch( main_GetIntVariable( INPUT_AUDIO_VAR, 0 ) )
+ {
+ case 0:
+ main_PutIntVariable( INPUT_AUDIO_VAR,
+ REQUESTED_LPCM );
+ case REQUESTED_LPCM:
+ input_SelectES( p_input, p_es );
+ }
break;
}
}
*****************************************************************************/
static void PSEnd( input_thread_t * p_input )
{
+ vlc_mutex_destroy( &((packet_cache_t *)p_input->p_plugin_data)->lock );
free( p_input->p_plugin_data );
}
return NULL;
}
+ vlc_mutex_lock( &p_cache->lock );
+
/* Checks whether the data cache is empty */
if( p_cache->data.l_index == 0 )
{
if ( (p_data = malloc( sizeof(data_packet_t) )) == NULL )
{
intf_ErrMsg( "Out of memory" );
+ vlc_mutex_unlock( &p_cache->lock );
return NULL;
}
#ifdef TRACE_INPUT
== NULL )
{
intf_ErrMsg( "NULL packet in the data cache" );
+ vlc_mutex_unlock( &p_cache->lock );
return NULL;
}
}
{
intf_DbgMsg( "Out of memory" );
free( p_data );
+ vlc_mutex_unlock( &p_cache->lock );
return NULL;
}
#ifdef TRACE_INPUT
{
intf_ErrMsg( "NULL packet in the small buffer cache" );
free( p_data );
+ vlc_mutex_unlock( &p_cache->lock );
return NULL;
}
/* Reallocates the packet if it is too small or too large */
{
intf_ErrMsg( "Out of memory" );
free( p_data );
+ vlc_mutex_unlock( &p_cache->lock );
return NULL;
}
#ifdef TRACE_INPUT
{
intf_ErrMsg( "NULL packet in the small buffer cache" );
free( p_data );
+ vlc_mutex_unlock( &p_cache->lock );
return NULL;
}
/* Reallocates the packet if it is too small or too large */
}
}
+ vlc_mutex_unlock( &p_cache->lock );
+
/* Initialize data */
p_data->p_next = NULL;
p_data->b_discard_payload = 0;
}
#endif
+ vlc_mutex_lock( &p_cache->lock );
+
/* Checks whether the PES cache is empty */
if( p_cache->pes.l_index == 0 )
{
if ( (p_pes = malloc( sizeof(pes_packet_t) )) == NULL )
{
intf_DbgMsg( "Out of memory" );
+ vlc_mutex_unlock( &p_cache->lock );
return NULL;
}
#ifdef TRACE_INPUT
== NULL )
{
intf_ErrMsg( "NULL packet in the data cache" );
+ vlc_mutex_unlock( &p_cache->lock );
return NULL;
}
}
+ vlc_mutex_unlock( &p_cache->lock );
+
p_pes->b_data_alignment = p_pes->b_discontinuity =
p_pes->i_pts = p_pes->i_dts = 0;
p_pes->i_pes_size = 0;
ASSERT( p_data );
+ vlc_mutex_lock( &p_cache->lock );
+
/* Checks whether the data cache is full */
if ( p_cache->data.l_index < DATA_CACHE_SIZE )
{
#endif
}
+ vlc_mutex_unlock( &p_cache->lock );
}
/*****************************************************************************
p_data = p_next;
}
+ vlc_mutex_lock( &p_cache->lock );
+
/* Checks whether the PES cache is full */
if ( p_cache->pes.l_index < PES_CACHE_SIZE )
{
intf_DbgMsg( "PS input: PES packet freed" );
#endif
}
+
+ vlc_mutex_unlock( &p_cache->lock );
}