Commit 46acf499 authored by Sam Hocevar's avatar Sam Hocevar

. initialisation du d�codeur de sous-titres

 . correction du bug de quit
parent d8f0cef9
...@@ -37,3 +37,4 @@ typedef struct spudec_thread_s ...@@ -37,3 +37,4 @@ typedef struct spudec_thread_s
******************************************************************************/ ******************************************************************************/
spudec_thread_t * spudec_CreateThread( input_thread_t * p_input ); 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 );
...@@ -414,7 +414,6 @@ static void EndThread( input_thread_t * p_input ) ...@@ -414,7 +414,6 @@ static void EndThread( input_thread_t * p_input )
ac3dec_DestroyThread( (ac3dec_thread_t *)(p_input->pp_selected_es[i_es_loop]->p_dec) ); ac3dec_DestroyThread( (ac3dec_thread_t *)(p_input->pp_selected_es[i_es_loop]->p_dec) );
break; break;
case DVD_SPU_ES: case DVD_SPU_ES:
fprintf(stderr, "input.h : destroying spudec\n");
spudec_DestroyThread( (spudec_thread_t *)(p_input->pp_selected_es[i_es_loop]->p_dec) ); spudec_DestroyThread( (spudec_thread_t *)(p_input->pp_selected_es[i_es_loop]->p_dec) );
break; break;
case 0: case 0:
...@@ -1072,7 +1071,6 @@ static __inline__ void input_DemuxPES( input_thread_t *p_input, ...@@ -1072,7 +1071,6 @@ static __inline__ void input_DemuxPES( input_thread_t *p_input,
case DVD_SPU_ES: case DVD_SPU_ES:
/* we skip 4 bytes at the beginning of the subpicture payload */ /* we skip 4 bytes at the beginning of the subpicture payload */
p_ts->i_payload_start += 4; p_ts->i_payload_start += 4;
fprintf(stderr, "input.h : launching spudec\n");
p_fifo = &(((spudec_thread_t *)(p_es_descriptor->p_dec))->fifo); p_fifo = &(((spudec_thread_t *)(p_es_descriptor->p_dec))->fifo);
break; break;
......
...@@ -117,7 +117,7 @@ int input_AddPgrmElem( input_thread_t *p_input, int i_current_id ) ...@@ -117,7 +117,7 @@ int input_AddPgrmElem( input_thread_t *p_input, int i_current_id )
if ( ((spudec_thread_t *)(p_input->p_es[i_es_loop].p_dec) = if ( ((spudec_thread_t *)(p_input->p_es[i_es_loop].p_dec) =
spudec_CreateThread(p_input)) == NULL ) spudec_CreateThread(p_input)) == NULL )
{ {
intf_ErrMsg( "Could not start subtitle decoder\n" ); intf_ErrMsg( "Could not start spu decoder\n" );
vlc_mutex_unlock( &p_input->es_lock ); vlc_mutex_unlock( &p_input->es_lock );
return( -1 ); return( -1 );
} }
......
...@@ -48,7 +48,6 @@ spudec_thread_t * spudec_CreateThread( input_thread_t * p_input ) ...@@ -48,7 +48,6 @@ spudec_thread_t * spudec_CreateThread( input_thread_t * p_input )
spudec_thread_t * p_spudec; spudec_thread_t * p_spudec;
intf_DbgMsg("spudec debug: creating spu decoder thread\n"); intf_DbgMsg("spudec debug: creating spu decoder thread\n");
fprintf(stderr, "spudec debug: creating spu decoder thread\n");
/* Allocate the memory needed to store the thread's structure */ /* Allocate the memory needed to store the thread's structure */
if ( (p_spudec = (spudec_thread_t *)malloc( sizeof(spudec_thread_t) )) == NULL ) if ( (p_spudec = (spudec_thread_t *)malloc( sizeof(spudec_thread_t) )) == NULL )
...@@ -63,6 +62,16 @@ spudec_thread_t * spudec_CreateThread( input_thread_t * p_input ) ...@@ -63,6 +62,16 @@ spudec_thread_t * spudec_CreateThread( input_thread_t * p_input )
p_spudec->b_die = 0; p_spudec->b_die = 0;
p_spudec->b_error = 0; p_spudec->b_error = 0;
/*
* Initialize the input properties
*/
/* Initialize the decoder fifo's data lock and conditional variable and set
* its buffer as empty */
vlc_mutex_init( &p_spudec->fifo.data_lock );
vlc_cond_init( &p_spudec->fifo.data_wait );
p_spudec->fifo.i_start = 0;
p_spudec->fifo.i_end = 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",
(vlc_thread_func_t)RunThread, (void *)p_spudec) ) (vlc_thread_func_t)RunThread, (void *)p_spudec) )
...@@ -91,6 +100,9 @@ void spudec_DestroyThread( spudec_thread_t *p_spudec ) ...@@ -91,6 +100,9 @@ void spudec_DestroyThread( spudec_thread_t *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 */
vlc_cond_signal( &p_spudec->fifo.data_wait );
/* 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 */
vlc_thread_join( p_spudec->thread_id ); vlc_thread_join( p_spudec->thread_id );
...@@ -107,9 +119,26 @@ void spudec_DestroyThread( spudec_thread_t *p_spudec ) ...@@ -107,9 +119,26 @@ void spudec_DestroyThread( spudec_thread_t *p_spudec )
*******************************************************************************/ *******************************************************************************/
static int InitThread( spudec_thread_t *p_spudec ) static int InitThread( spudec_thread_t *p_spudec )
{ {
intf_DbgMsg("spudec debug: initializing spu decoder thread %p\n", p_spudec); intf_DbgMsg("spudec debug: initializing spu decoder thread %p\n", p_spudec);
/* Our first job is to initialize the bit stream structure with the
* beginning of the input stream */
vlc_mutex_lock( &p_spudec->fifo.data_lock );
while ( DECODER_FIFO_ISEMPTY(p_spudec->fifo) && !p_spudec->b_die )
{
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.i_byte = p_spudec->bit_stream.p_ts->i_payload_start;
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 );
...@@ -142,7 +171,9 @@ static void RunThread( spudec_thread_t *p_spudec ) ...@@ -142,7 +171,9 @@ static void RunThread( spudec_thread_t *p_spudec )
*/ */
while( (!p_spudec->b_die) && (!p_spudec->b_error) ) while( (!p_spudec->b_die) && (!p_spudec->b_error) )
{ {
fprintf(stderr, "I'm a spu decoder !\n");
fprintf(stderr, "I'm in the spu decoder main loop !\n");
sleep(1); sleep(1);
} }
......
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