Commit dbb405d1 authored by Michel Kaempf's avatar Michel Kaempf

* spu_decoder/spu_decoder.c :

- �a devrait bien se passer maintenant :-)
parent 741fd7ec
...@@ -71,6 +71,11 @@ spudec_thread_t * spudec_CreateThread( input_thread_t * p_input ) ...@@ -71,6 +71,11 @@ spudec_thread_t * spudec_CreateThread( input_thread_t * p_input )
vlc_cond_init( &p_spudec->fifo.data_wait ); vlc_cond_init( &p_spudec->fifo.data_wait );
p_spudec->fifo.i_start = 0; p_spudec->fifo.i_start = 0;
p_spudec->fifo.i_end = 0; p_spudec->fifo.i_end = 0;
/* Initialize the bit stream structure */
p_spudec->bit_stream.p_input = p_input;
p_spudec->bit_stream.p_decoder_fifo = &p_spudec->fifo;
p_spudec->bit_stream.fifo.buffer = 0;
p_spudec->bit_stream.fifo.i_available = 0;
/* Spawn the spu decoder thread */ /* Spawn the spu decoder thread */
if ( vlc_thread_create(&p_spudec->thread_id, "spu decoder", if ( vlc_thread_create(&p_spudec->thread_id, "spu decoder",
...@@ -95,13 +100,14 @@ spudec_thread_t * spudec_CreateThread( input_thread_t * p_input ) ...@@ -95,13 +100,14 @@ spudec_thread_t * spudec_CreateThread( input_thread_t * p_input )
void spudec_DestroyThread( spudec_thread_t *p_spudec ) void spudec_DestroyThread( spudec_thread_t *p_spudec )
{ {
intf_DbgMsg("spudec debug: requesting termination of spu decoder thread %p\n", p_spudec); intf_DbgMsg("spudec debug: requesting termination of spu decoder thread %p\n", p_spudec);
// fprintf(stderr, "spudec debug: requesting termination of spu decoder thread %p\n", p_spudec);
/* Ask thread to kill itself */ /* Ask thread to kill itself */
p_spudec->b_die = 1; p_spudec->b_die = 1;
/* Warn the decoder that we're quitting */ /* Warn the decoder that we're quitting */
vlc_mutex_lock( &p_spudec->fifo.data_lock );
vlc_cond_signal( &p_spudec->fifo.data_wait ); vlc_cond_signal( &p_spudec->fifo.data_wait );
vlc_mutex_unlock( &p_spudec->fifo.data_lock );
/* Waiting for the decoder thread to exit */ /* Waiting for the decoder thread to exit */
/* Remove this as soon as the "status" flag is implemented */ /* Remove this as soon as the "status" flag is implemented */
...@@ -124,24 +130,23 @@ static int InitThread( spudec_thread_t *p_spudec ) ...@@ -124,24 +130,23 @@ static int InitThread( spudec_thread_t *p_spudec )
/* Our first job is to initialize the bit stream structure with the /* Our first job is to initialize the bit stream structure with the
* beginning of the input stream */ * beginning of the input stream */
vlc_mutex_lock( &p_spudec->fifo.data_lock ); vlc_mutex_lock( &p_spudec->fifo.data_lock );
while ( DECODER_FIFO_ISEMPTY(p_spudec->fifo) && !p_spudec->b_die ) while ( DECODER_FIFO_ISEMPTY(p_spudec->fifo) )
{ {
if ( p_spudec->b_die )
{
vlc_mutex_unlock( &p_spudec->fifo.data_lock );
return( 1 );
}
vlc_cond_wait( &p_spudec->fifo.data_wait, &p_spudec->fifo.data_lock ); vlc_cond_wait( &p_spudec->fifo.data_wait, &p_spudec->fifo.data_lock );
} }
if( p_spudec->b_die )
{
vlc_mutex_unlock( &p_spudec->fifo.data_lock );
return( 0 );
}
p_spudec->bit_stream.p_ts = DECODER_FIFO_START( p_spudec->fifo )->p_first_ts; p_spudec->bit_stream.p_ts = DECODER_FIFO_START( p_spudec->fifo )->p_first_ts;
p_spudec->bit_stream.i_byte = p_spudec->bit_stream.p_ts->i_payload_start; p_spudec->bit_stream.i_byte = p_spudec->bit_stream.p_ts->i_payload_start;
vlc_mutex_unlock( &p_spudec->fifo.data_lock ); vlc_mutex_unlock( &p_spudec->fifo.data_lock );
/* Mark thread as running and return */ /* Mark thread as running and return */
intf_DbgMsg("spudec debug: InitThread(%p) succeeded\n", p_spudec); intf_DbgMsg( "spudec debug: InitThread(%p) succeeded\n", p_spudec );
return( 0 ); return( 0 );
} }
/******************************************************************************* /*******************************************************************************
...@@ -153,41 +158,45 @@ static int InitThread( spudec_thread_t *p_spudec ) ...@@ -153,41 +158,45 @@ static int InitThread( spudec_thread_t *p_spudec )
static void RunThread( spudec_thread_t *p_spudec ) static void RunThread( spudec_thread_t *p_spudec )
{ {
intf_DbgMsg("spudec debug: running spu decoder thread (%p) (pid == %i)\n", intf_DbgMsg("spudec debug: running spu decoder thread (%p) (pid == %i)\n",
p_spudec, getpid()); p_spudec, getpid());
/* /*
* Initialize thread and free configuration * Initialize thread and free configuration
*/ */
p_spudec->b_error = InitThread( p_spudec ); p_spudec->b_error = InitThread( p_spudec );
if( p_spudec->b_error )
{
return;
}
p_spudec->b_run = 1; p_spudec->b_run = 1;
/* /*
* Main loop - it is not executed if an error occured during * Main loop - it is not executed if an error occured during
* initialization * initialization
*/ */
vlc_mutex_lock( &p_spudec->fifo.data_lock );
while( (!p_spudec->b_die) && (!p_spudec->b_error) ) while( (!p_spudec->b_die) && (!p_spudec->b_error) )
{ {
/* Trash all received PES packets */
while( !DECODER_FIFO_ISEMPTY(p_spudec->fifo) )
// fprintf(stderr, "I'm in the spu decoder main loop !\n"); {
sleep(1); input_NetlistFreePES( p_spudec->bit_stream.p_input, DECODER_FIFO_START(p_spudec->fifo) );
} DECODER_FIFO_INCSTART( p_spudec->fifo );
}
/* Waiting for the input thread to put new PES packets in the fifo */
vlc_cond_wait( &p_spudec->fifo.data_wait, &p_spudec->fifo.data_lock );
}
vlc_mutex_unlock( &p_spudec->fifo.data_lock );
/* /*
* Error loop * Error loop
*/ */
if( p_spudec->b_error ) if( p_spudec->b_error )
{ {
ErrorThread( p_spudec ); ErrorThread( p_spudec );
} }
p_spudec->b_run = 0;
/* End of thread */ /* End of thread */
EndThread( p_spudec ); EndThread( p_spudec );
p_spudec->b_run = 0;
} }
/******************************************************************************* /*******************************************************************************
...@@ -199,11 +208,26 @@ static void RunThread( spudec_thread_t *p_spudec ) ...@@ -199,11 +208,26 @@ static void RunThread( spudec_thread_t *p_spudec )
*******************************************************************************/ *******************************************************************************/
static void ErrorThread( spudec_thread_t *p_spudec ) static void ErrorThread( spudec_thread_t *p_spudec )
{ {
/* Wait until a `die' order */ /* We take the lock, because we are going to read/write the start/end
* indexes of the decoder fifo */
vlc_mutex_lock( &p_spudec->fifo.data_lock );
/* Wait until a `die' order is sent */
while( !p_spudec->b_die ) while( !p_spudec->b_die )
{ {
// foo(); /* Trash all received PES packets */
while( !DECODER_FIFO_ISEMPTY(p_spudec->fifo) )
{
input_NetlistFreePES( p_spudec->bit_stream.p_input, DECODER_FIFO_START(p_spudec->fifo) );
DECODER_FIFO_INCSTART( p_spudec->fifo );
}
/* Waiting for the input thread to put new PES packets in the fifo */
vlc_cond_wait( &p_spudec->fifo.data_wait, &p_spudec->fifo.data_lock );
} }
/* We can release the lock before leaving */
vlc_mutex_unlock( &p_spudec->fifo.data_lock );
} }
/******************************************************************************* /*******************************************************************************
...@@ -214,6 +238,7 @@ static void ErrorThread( spudec_thread_t *p_spudec ) ...@@ -214,6 +238,7 @@ static void ErrorThread( spudec_thread_t *p_spudec )
*******************************************************************************/ *******************************************************************************/
static void EndThread( spudec_thread_t *p_spudec ) static void EndThread( spudec_thread_t *p_spudec )
{ {
intf_DbgMsg("spudec debug: EndThread(%p)\n", p_spudec); intf_DbgMsg( "spudec debug: destroying spu decoder thread %p\n", p_spudec );
free( p_spudec );
intf_DbgMsg( "spudec debug: spu decoder thread %p destroyed\n", p_spudec);
} }
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