]> git.sesse.net Git - vlc/commitdiff
. initialisation du d�codeur de sous-titres
authorSam Hocevar <sam@videolan.org>
Mon, 31 Jan 2000 05:03:45 +0000 (05:03 +0000)
committerSam Hocevar <sam@videolan.org>
Mon, 31 Jan 2000 05:03:45 +0000 (05:03 +0000)
 . correction du bug de quit

include/spu_decoder.h
src/input/input.c
src/input/input_ctrl.c
src/spu_decoder/spu_decoder.c

index 27ca704b6c0b8e71c5de2a3417cbf98f0bef7b71..55ee93ec44de7f85b86437f95151574ce72da709 100644 (file)
@@ -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 );
+
index c57ef6b87b05dd4e461a51bf6d2eec869c711f3f..79b71f5ec8db3b9cf087b0149d264f35363a4f00 100644 (file)
@@ -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;
 
index f84ba32b6b90dacc0422967ee432e0530c4ea523..d6a8c71a7109afdeb7110a7b68dc200873496db4 100644 (file)
@@ -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 );
                         }
index 4b705f06ab1d29502239e564507045298c050e27..7ae19aec1f535ead8f8e4170bc3a3e5e34b1126c 100644 (file)
@@ -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);
     }