From 46acf4993c0ae01d277c757006a7abcfd6b61d9f Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Mon, 31 Jan 2000 05:03:45 +0000 Subject: [PATCH] =?UTF-8?q?=20.=20initialisation=20du=20d=EF=BF=BDcodeur?= =?UTF-8?q?=20de=20sous-titres=20=20.=20correction=20du=20bug=20de=20quit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/spu_decoder.h | 1 + src/input/input.c | 2 -- src/input/input_ctrl.c | 2 +- src/spu_decoder/spu_decoder.c | 37 ++++++++++++++++++++++++++++++++--- 4 files changed, 36 insertions(+), 6 deletions(-) diff --git a/include/spu_decoder.h b/include/spu_decoder.h index 27ca704b6c..55ee93ec44 100644 --- a/include/spu_decoder.h +++ b/include/spu_decoder.h @@ -37,3 +37,4 @@ typedef struct spudec_thread_s ******************************************************************************/ spudec_thread_t * spudec_CreateThread( input_thread_t * p_input ); void spudec_DestroyThread( spudec_thread_t * p_spudec ); + diff --git a/src/input/input.c b/src/input/input.c index c57ef6b87b..79b71f5ec8 100644 --- a/src/input/input.c +++ b/src/input/input.c @@ -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) ); break; 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) ); break; case 0: @@ -1072,7 +1071,6 @@ static __inline__ void input_DemuxPES( input_thread_t *p_input, case DVD_SPU_ES: /* we skip 4 bytes at the beginning of the subpicture payload */ p_ts->i_payload_start += 4; - fprintf(stderr, "input.h : launching spudec\n"); p_fifo = &(((spudec_thread_t *)(p_es_descriptor->p_dec))->fifo); break; diff --git a/src/input/input_ctrl.c b/src/input/input_ctrl.c index f84ba32b6b..d6a8c71a71 100644 --- a/src/input/input_ctrl.c +++ b/src/input/input_ctrl.c @@ -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) = 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 ); return( -1 ); } diff --git a/src/spu_decoder/spu_decoder.c b/src/spu_decoder/spu_decoder.c index 4b705f06ab..7ae19aec1f 100644 --- a/src/spu_decoder/spu_decoder.c +++ b/src/spu_decoder/spu_decoder.c @@ -48,7 +48,6 @@ spudec_thread_t * spudec_CreateThread( input_thread_t * p_input ) spudec_thread_t * p_spudec; 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 */ 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 ) p_spudec->b_die = 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 */ if ( vlc_thread_create(&p_spudec->thread_id, "spu decoder", (vlc_thread_func_t)RunThread, (void *)p_spudec) ) @@ -91,6 +100,9 @@ void spudec_DestroyThread( spudec_thread_t *p_spudec ) /* Ask thread to kill itself */ 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 */ /* Remove this as soon as the "status" flag is implemented */ vlc_thread_join( p_spudec->thread_id ); @@ -107,9 +119,26 @@ void spudec_DestroyThread( 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); + /* 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 */ intf_DbgMsg("spudec debug: InitThread(%p) succeeded\n", p_spudec); return( 0 ); @@ -142,7 +171,9 @@ static void RunThread( spudec_thread_t *p_spudec ) */ 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); }