]> git.sesse.net Git - vlc/commitdiff
IMPORTANT :
authorMichel Kaempf <maxx@videolan.org>
Mon, 31 Jan 2000 01:16:00 +0000 (01:16 +0000)
committerMichel Kaempf <maxx@videolan.org>
Mon, 31 Jan 2000 01:16:00 +0000 (01:16 +0000)
* ce commit devrait corriger les probl�mes de fermeture du vlc, commentaires
souhait�s (et obligatoires) ;
* le probl�me de la synkro initiale de l'audio devrait �tre corrig� : reports
souhait�s (et obligatoires) gr�ce aux messages "aout debug" ;
* en clair FAITES PETER UN MAIL avec vos messages "aout debug" et vos coups
de gueule/coups de coeur quant � la fermeture du vlc ;-)

* ac3_decoder/ac3_decoder.c, audio_decoder/audio_decoder.c :
- rajout d'un msleep() en d�but de fonction RunThread() afin de
contrebalancer le d�lai entre la r�ception d'un paquet TS et la
pr�sentation de son contenu (INPUT_PTS_DELAY) ;
- rajout d'un cond_signal() dans la fonction EndThread() ;

* audio_output/audio_output.c :
- activation des messages de debug ;
- r��criture de la fonction NextFrame() ;

src/ac3_decoder/ac3_decoder.c
src/audio_decoder/audio_decoder.c
src/audio_output/audio_output.c

index f0cdfdda066b9683d0154ab2c38f52f1f97d1919..a2c58fb8ef3f1303ede404de4717242f65ecb813 100644 (file)
@@ -123,6 +123,7 @@ void ac3dec_DestroyThread( ac3dec_thread_t * p_ac3dec )
 
     /* Ask thread to kill itself */
     p_ac3dec->b_die = 1;
+
     /* Make sure the decoder thread leaves the GetByte() function */
     vlc_mutex_lock( &(p_ac3dec->fifo.data_lock) );
     vlc_cond_signal( &(p_ac3dec->fifo.data_wait) );
@@ -214,12 +215,10 @@ static int InitThread( ac3dec_thread_t * p_ac3dec )
  *****************************************************************************/
 static void RunThread( ac3dec_thread_t * p_ac3dec )
 {
-    /*
-    mtime_t mdate = 0;
-    */
-
     intf_DbgMsg( "ac3dec debug: running ac3 decoder thread (%p) (pid == %i)\n", p_ac3dec, getpid() );
 
+    msleep( (3 * INPUT_PTS_DELAY) / 4 );
+
     /* Initializing the ac3 decoder thread */
     if ( InitThread(p_ac3dec) )
     {
@@ -227,16 +226,13 @@ static void RunThread( ac3dec_thread_t * p_ac3dec )
     }
 
     /* ac3 decoder thread's main loop */
+    /* FIXME : do we have enough room to store the decoded frames ? */
     while ( (!p_ac3dec->b_die) && (!p_ac3dec->b_error) )
     {
         p_ac3dec->b_invalid = 0;
 
        decode_find_sync( p_ac3dec );
 
-       /*
-       p_ac3dec->p_aout_fifo->date[p_ac3dec->p_aout_fifo->l_end_frame] = mdate;
-       mdate += 32000;
-       */
        if ( DECODER_FIFO_START(p_ac3dec->fifo)->b_has_pts )
        {
                p_ac3dec->p_aout_fifo->date[p_ac3dec->p_aout_fifo->l_end_frame] = DECODER_FIFO_START(p_ac3dec->fifo)->i_pts;
@@ -445,6 +441,11 @@ static void EndThread( ac3dec_thread_t * p_ac3dec )
     if ( p_ac3dec->p_aout_fifo != NULL )
     {
         aout_DestroyFifo( p_ac3dec->p_aout_fifo );
+
+        /* Make sure the output thread leaves the NextFrame() function */
+        vlc_mutex_lock( &(p_ac3dec->p_aout_fifo->data_lock) );
+        vlc_cond_signal( &(p_ac3dec->p_aout_fifo->data_wait) );
+        vlc_mutex_unlock( &(p_ac3dec->p_aout_fifo->data_lock) );
     }
 
     /* Destroy descriptor */
index 2c10b6187573daac8941b670460e796ade8f2f4e..add0aaeb66339eddcc5a3d9d84d18d777eea58cd 100644 (file)
@@ -143,6 +143,7 @@ void adec_DestroyThread( adec_thread_t * p_adec )
 
     /* Ask thread to kill itself */
     p_adec->b_die = 1;
+
     /* Make sure the decoder thread leaves the GetByte() function */
     vlc_mutex_lock( &(p_adec->fifo.data_lock) );
     vlc_cond_signal( &(p_adec->fifo.data_wait) );
@@ -799,6 +800,8 @@ static void RunThread( adec_thread_t * p_adec )
 
     intf_DbgMsg("adec debug: running audio decoder thread (%p) (pid == %i)\n", p_adec, getpid());
 
+    msleep( (3 * INPUT_PTS_DELAY) / 4 );
+
     /* Initializing the audio decoder thread */
     if ( InitThread(p_adec) )
     {
@@ -861,19 +864,24 @@ static void RunThread( adec_thread_t * p_adec )
 
                         /* Frame 1 */
                         p_adec->p_aout_fifo->l_end_frame = (p_adec->p_aout_fifo->l_end_frame + 1) & AOUT_FIFO_SIZE;
-                        /* Frame 2 */
+
+                       /* Frame 2 */
                         p_adec->p_aout_fifo->date[p_adec->p_aout_fifo->l_end_frame] = LAST_MDATE;
                         p_adec->p_aout_fifo->l_end_frame = (p_adec->p_aout_fifo->l_end_frame + 1) & AOUT_FIFO_SIZE;
-                        /* Frame 3 */
+
+                       /* Frame 3 */
                         p_adec->p_aout_fifo->date[p_adec->p_aout_fifo->l_end_frame] = LAST_MDATE;
                         p_adec->p_aout_fifo->l_end_frame = (p_adec->p_aout_fifo->l_end_frame + 1) & AOUT_FIFO_SIZE;
-                        /* Frame 4 */
+
+                       /* Frame 4 */
                         p_adec->p_aout_fifo->date[p_adec->p_aout_fifo->l_end_frame] = LAST_MDATE;
                         p_adec->p_aout_fifo->l_end_frame = (p_adec->p_aout_fifo->l_end_frame + 1) & AOUT_FIFO_SIZE;
-                        /* Frame 5 */
+
+                       /* Frame 5 */
                         p_adec->p_aout_fifo->date[p_adec->p_aout_fifo->l_end_frame] = LAST_MDATE;
                         p_adec->p_aout_fifo->l_end_frame = (p_adec->p_aout_fifo->l_end_frame + 1) & AOUT_FIFO_SIZE;
-                        /* Frame 6 */
+
+                       /* Frame 6 */
                         p_adec->p_aout_fifo->date[p_adec->p_aout_fifo->l_end_frame] = LAST_MDATE;
                         p_adec->p_aout_fifo->l_end_frame = (p_adec->p_aout_fifo->l_end_frame + 1) & AOUT_FIFO_SIZE;
 
@@ -961,6 +969,11 @@ static void EndThread( adec_thread_t *p_adec )
     if ( p_adec->p_aout_fifo != NULL )
     {
         aout_DestroyFifo( p_adec->p_aout_fifo );
+
+        /* Make sure the output thread leaves the NextFrame() function */
+        vlc_mutex_lock( &(p_adec->p_aout_fifo->data_lock) );
+        vlc_cond_signal( &(p_adec->p_aout_fifo->data_wait) );
+        vlc_mutex_unlock( &(p_adec->p_aout_fifo->data_lock) );
     }
     /* Destroy descriptor */
     free( p_adec );
index 4e53c53438a36cf6c904d8454c051c077baa73bb..655b4c36361ead08677146bd9290e9b52b34dac5 100644 (file)
@@ -457,6 +457,7 @@ static __inline__ int NextFrame( aout_thread_t * p_aout, aout_fifo_t * p_fifo, m
             }
             p_fifo->l_start_frame = (p_fifo->l_start_frame + 1) & AOUT_FIFO_SIZE;
         }
+
         if ( p_fifo->l_start_frame == p_fifo->l_end_frame )
         {
             vlc_mutex_unlock( &p_fifo->data_lock );
@@ -465,7 +466,8 @@ static __inline__ int NextFrame( aout_thread_t * p_aout, aout_fifo_t * p_fifo, m
     }
 
     /* We are looking for the next dated frame */
-    while ( 1 )
+    /* FIXME : is the output fifo full ? */
+    while ( !p_fifo->b_next_frame )
     {
         while ( p_fifo->l_next_frame != p_fifo->l_end_frame )
         {
@@ -474,42 +476,24 @@ static __inline__ int NextFrame( aout_thread_t * p_aout, aout_fifo_t * p_fifo, m
                 p_fifo->b_next_frame = 1;
                 break;
             }
-            else
-            {
-                p_fifo->l_next_frame = (p_fifo->l_next_frame + 1) & AOUT_FIFO_SIZE;
-            }
+            p_fifo->l_next_frame = (p_fifo->l_next_frame + 1) & AOUT_FIFO_SIZE;
         }
 
-        if ( p_fifo->b_next_frame == 1 )
-        {
-            break;
-        }
-        else
+        while ( p_fifo->l_next_frame == p_fifo->l_end_frame )
         {
-            if ( (((p_fifo->l_end_frame + 1) - p_fifo->l_start_frame) & AOUT_FIFO_SIZE) == 0 )
+            vlc_cond_wait( &p_fifo->data_wait, &p_fifo->data_lock );
+            if ( p_fifo->b_die )
             {
-                p_fifo->l_start_frame = 0;
-                p_fifo->b_start_frame = 0;
-                /* p_fifo->l_next_frame = 0; */
-                /* p_fifo->b_next_frame = 0; */
-                p_fifo->l_end_frame = 0;
                 vlc_mutex_unlock( &p_fifo->data_lock );
                 return( -1 );
             }
-            else
-            {
-                while ( p_fifo->l_next_frame == p_fifo->l_end_frame )
-                {
-                    vlc_cond_wait( &p_fifo->data_wait, &p_fifo->data_lock );
-                }
-            }
         }
     }
 
     l_units = ((p_fifo->l_next_frame - p_fifo->l_start_frame) & AOUT_FIFO_SIZE) * (p_fifo->l_frame_size >> p_fifo->b_stereo);
 
     l_rate = p_fifo->l_rate + ((aout_date - p_fifo->date[p_fifo->l_start_frame]) / 256);
-//    fprintf( stderr, "aout debug: %lli (%li);\n", aout_date - p_fifo->date[p_fifo->l_start_frame], l_rate );
+    fprintf( stderr, "aout debug: %lli (%li);\n", aout_date - p_fifo->date[p_fifo->l_start_frame], l_rate );
 
     InitializeIncrement( &p_fifo->unit_increment, l_rate, p_aout->dsp.l_rate );