]> git.sesse.net Git - vlc/commitdiff
*Fixed a bug in synchro reinitialisation: we no longer have a shift each
authorStéphane Borel <stef@videolan.org>
Sat, 9 Jun 2001 17:01:22 +0000 (17:01 +0000)
committerStéphane Borel <stef@videolan.org>
Sat, 9 Jun 2001 17:01:22 +0000 (17:01 +0000)
time we restart the synchro (for scr discontinuity for instance)

*In DVD mode, we reinit the synchro only if the scr are not continuous
(instead of each cell)

*Try to improve ac3 spdif to prevent from desynchronization.

include/input_ext-intf.h
plugins/dvd/input_dvd.c
src/ac3_spdif/ac3_spdif.c
src/ac3_spdif/ac3_spdif.h
src/audio_output/aout_spdif.c
src/input/input_clock.c

index 4a94aa24f5fc15000c1a36369006def8a910c8ab..a811d2226b888004508aa3859ac0bac8936fb0a7 100644 (file)
@@ -4,7 +4,7 @@
  * control the pace of reading. 
  *****************************************************************************
  * Copyright (C) 1999, 2000 VideoLAN
- * $Id: input_ext-intf.h,v 1.38 2001/05/30 17:03:11 sam Exp $
+ * $Id: input_ext-intf.h,v 1.39 2001/06/09 17:01:21 stef Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *
@@ -125,6 +125,7 @@ typedef struct pgrm_descriptor_s
     mtime_t                 cr_ref, sysdate_ref;
     mtime_t                 last_cr; /* reference to detect unexpected stream
                                       * discontinuities                      */
+    mtime_t                 last_syscr;
     count_t                 c_average_count;
                            /* counter used to compute dynamic average values */
     int                     i_synchro_state;
index c17188e322317467cd7b1ef57d713faff61bc5e1..5a82c5412228467e10a5f2089170885feaa96c0e 100644 (file)
@@ -10,7 +10,7 @@
  *  -dvd_udf to find files
  *****************************************************************************
  * Copyright (C) 1998-2001 VideoLAN
- * $Id: input_dvd.c,v 1.68 2001/06/07 22:25:42 sam Exp $
+ * $Id: input_dvd.c,v 1.69 2001/06/09 17:01:22 stef Exp $
  *
  * Author: Stéphane Borel <stef@via.ecp.fr>
  *
@@ -796,6 +796,12 @@ static int DVDSetArea( input_thread_t * p_input, input_area_t * p_area )
     
             DVDFindSector( p_dvd );
             p_dvd->i_cell += p_dvd->i_angle_cell;
+
+            if( p_input->stream.pp_programs[0]->i_synchro_state == SYNCHRO_OK )
+            {
+                p_input->stream.pp_programs[0]->i_synchro_state =
+                    SYNCHRO_REINIT;
+            }
         }
         else
         {
@@ -809,7 +815,6 @@ static int DVDSetArea( input_thread_t * p_input, input_area_t * p_area )
     p_input->stream.b_seekable = 1;
     p_input->stream.b_changed = 1;
 
-    p_input->stream.pp_programs[0]->i_synchro_state = SYNCHRO_REINIT;
 
     return 0;
 }
@@ -899,7 +904,7 @@ static int DVDRead( input_thread_t * p_input,
         p_input->stream.p_selected_area->i_part = p_dvd->i_chapter;
 
         /* the synchro has to be reinitialized when we change cell */
-        p_input->stream.pp_programs[0]->i_synchro_state = SYNCHRO_REINIT;
+//        p_input->stream.pp_programs[0]->i_synchro_state = SYNCHRO_REINIT;
 
         vlc_mutex_unlock( &p_input->stream.stream_lock );
 
index 5787f6344cd06bc3802c88adef5a453b02a68926..a70da8923cf553880758b018c725f78578efd7e7 100644 (file)
@@ -2,7 +2,7 @@
  * ac3_spdif.c: ac3 pass-through to external decoder with enabled soundcard
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: ac3_spdif.c,v 1.7 2001/05/31 01:37:08 sam Exp $
+ * $Id: ac3_spdif.c,v 1.8 2001/06/09 17:01:22 stef Exp $
  *
  * Authors: Stéphane Borel <stef@via.ecp.fr>
  *          Juha Yrjola <jyrjola@cc.hut.fi>
@@ -190,10 +190,9 @@ static void RunThread( ac3_spdif_thread_t * p_spdif )
     while( !p_spdif->p_fifo->b_die && !p_spdif->p_fifo->b_error )
     {
         /* Handle the dates */
-        if(DECODER_FIFO_START(*p_spdif->p_fifo)->i_pts)
+        if( p_spdif->i_pts != m_last_pts )
         {
-            m_last_pts = DECODER_FIFO_START(*p_spdif->p_fifo)->i_pts;
-            DECODER_FIFO_START(*p_spdif->p_fifo)->i_pts = 0;
+            m_last_pts = p_spdif->i_pts;
         }
         else
         {
@@ -306,8 +305,16 @@ static void EndThread( ac3_spdif_thread_t * p_spdif )
 static void BitstreamCallback ( bit_stream_t * p_bit_stream,
                                         boolean_t b_new_pes)
 {
+    ac3_spdif_thread_t *    p_spdif;
+
     if( b_new_pes )
     {
+        p_spdif = (ac3_spdif_thread_t *)p_bit_stream->p_callback_arg;
+
         p_bit_stream->p_byte += 3;
+
+        p_spdif->i_pts =
+            DECODER_FIFO_START( *p_bit_stream->p_decoder_fifo )->i_pts;
+        DECODER_FIFO_START( *p_bit_stream->p_decoder_fifo )->i_pts = 0;
     }
 }
index 9cf87ff06ad0505c4d529319e9525a1031bca539..24b8a5c52e89035e3c5795f8c98542b8eed6c115 100644 (file)
@@ -2,7 +2,7 @@
  * ac3_spdif.h: header for ac3 pass-through
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: ac3_spdif.h,v 1.3 2001/05/06 18:32:30 stef Exp $
+ * $Id: ac3_spdif.h,v 1.4 2001/06/09 17:01:22 stef Exp $
  *
  * Authors: Stéphane Borel <stef@via.ecp.fr>
  *
@@ -56,6 +56,9 @@ typedef struct ac3_spdif_thread_s
     u8 *                p_ac3;
     u8 *                p_iec;
 
+    /* current pes date */
+    mtime_t             i_pts;
+
     /*
      * Output properties
      */
index c7bd30643bd9de61da7faadfba84be307ddc8dd4..5b55943234ba576fe5f85f656db95327c0c63668 100644 (file)
@@ -2,7 +2,7 @@
  * aout_spdif: ac3 passthrough output
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: aout_spdif.c,v 1.11 2001/05/31 16:10:05 stef Exp $
+ * $Id: aout_spdif.c,v 1.12 2001/06/09 17:01:22 stef Exp $
  *
  * Authors: Michel Kaempf <maxx@via.ecp.fr>
  *          Stéphane Borel <stef@via.ecp.fr>
@@ -74,6 +74,7 @@ void aout_SpdifThread( aout_thread_t * p_aout )
     /* variable used to compute the nnumber of blank frames since the
      * last significant frame */
     i_blank = 0;
+    mdelta = 0;
 
     /* Compute the theorical duration of an ac3 frame */
 
@@ -104,7 +105,7 @@ void aout_SpdifThread( aout_thread_t * p_aout )
                                 l_start_frame];
                     mdelta = mplay - mdate();
 
-                    if( mdelta < ( 2 * SLEEP_TIME ) )
+                    if( mdelta < ( 3 * SLEEP_TIME ) )
                     {
                         intf_WarnMsg( 12, "spdif out (%d):"
                                           "playing frame %lld (%lld)",
@@ -126,6 +127,11 @@ void aout_SpdifThread( aout_thread_t * p_aout )
                         i_frame++;
                         i_blank = 0;
                     }
+                    else
+                    {
+                        intf_WarnMsg( 12, "spdif out (%d): early frame %lld", 
+                                            i_fifo, mdelta );
+                    }
                     vlc_mutex_unlock( &p_aout->fifo[i_fifo].data_lock );
                 }
                 else
@@ -137,16 +143,23 @@ void aout_SpdifThread( aout_thread_t * p_aout )
 
         if( i_frame )
         {
-            /* we leave some time for aout fifo to fill and not to stress
-             * the external decoder too much */
-            msleep( SLEEP_TIME );
+            if( mdelta > 0 )
+            {
+                /* we leave some time for aout fifo to fill and not to stress
+                 * the external decoder too much */
+                msleep( mdelta + SLEEP_TIME );
+            }
+            else if( mdelta > -SLEEP_TIME )
+            {
+                msleep( SLEEP_TIME );
+            }
         }
         else
         {
             /* insert blank frame for stream continuity to
              * the external decoder */
             intf_WarnMsg( 6, "spdif warning: blank frame" );
-            p_aout->pf_play( p_aout, pi_blank, SPDIF_FRAME_SIZE/4 );
+            p_aout->pf_play( p_aout, pi_blank, SPDIF_FRAME_SIZE );
 
             /* we kill the output if we don't have any stream */
             if( ++i_blank > BLANK_FRAME_MAX )
index 97f784054ecf10f02ed42dedffc28f55312f4752..e4d2ea095b57e9127e3f2589691d16ff12c6b78c 100644 (file)
@@ -2,7 +2,7 @@
  * input_clock.c: Clock/System date convertions, stream management
  *****************************************************************************
  * Copyright (C) 1999, 2000 VideoLAN
- * $Id: input_clock.c,v 1.16 2001/05/08 14:53:31 bozo Exp $
+ * $Id: input_clock.c,v 1.17 2001/06/09 17:01:22 stef Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *
@@ -123,7 +123,7 @@ static void ClockNewRef( input_thread_t * p_input, pgrm_descriptor_t * p_pgrm,
                          mtime_t i_clock, mtime_t i_sysdate )
 {
     p_pgrm->cr_ref = i_clock;
-    p_pgrm->sysdate_ref = i_sysdate;
+    p_pgrm->sysdate_ref = p_pgrm->last_syscr ? p_pgrm->last_syscr : i_sysdate;
 }
 
 /*****************************************************************************
@@ -133,6 +133,7 @@ static void ClockNewRef( input_thread_t * p_input, pgrm_descriptor_t * p_pgrm,
 void input_ClockInit( pgrm_descriptor_t * p_pgrm )
 {
     p_pgrm->last_cr = 0;
+    p_pgrm->last_syscr = 0;
     p_pgrm->cr_ref = 0;
     p_pgrm->sysdate_ref = 0;
     p_pgrm->delta_cr = 0;
@@ -145,7 +146,7 @@ void input_ClockInit( pgrm_descriptor_t * p_pgrm )
 void input_ClockManageRef( input_thread_t * p_input,
                            pgrm_descriptor_t * p_pgrm, mtime_t i_clock )
 {
-    if( p_pgrm->i_synchro_state != SYNCHRO_OK )
+    if( ( p_pgrm->i_synchro_state != SYNCHRO_OK ) || ( i_clock == 0 ) )
     {
         /* Feed synchro with a new reference point. */
         ClockNewRef( p_input, p_pgrm, i_clock, mdate() );
@@ -160,6 +161,7 @@ void input_ClockManageRef( input_thread_t * p_input,
         else
         {
             p_pgrm->last_cr = 0;
+            p_pgrm->last_syscr = 0;
             p_pgrm->delta_cr = 0;
             p_pgrm->c_average_count = 0;
         }
@@ -187,7 +189,8 @@ void input_ClockManageRef( input_thread_t * p_input,
             /* Wait a while before delivering the packets to the decoder.
              * In case of multiple programs, we arbitrarily follow the
              * clock of the first program. */
-            mwait( ClockToSysdate( p_input, p_pgrm, i_clock ) );
+            p_pgrm->last_syscr = ClockToSysdate( p_input, p_pgrm, i_clock );
+            mwait( p_pgrm->last_syscr );
 
             /* Now take into account interface changes. */
             vlc_mutex_lock( &p_input->stream.stream_lock );