]> git.sesse.net Git - vlc/commitdiff
Mise en place du m�canisme de d�tection de changement de flux dans la synchro
authorJean-Marc Dressler <polux@videolan.org>
Sun, 21 Nov 1999 14:26:20 +0000 (14:26 +0000)
committerJean-Marc Dressler <polux@videolan.org>
Sun, 21 Nov 1999 14:26:20 +0000 (14:26 +0000)
Polux

include/input.h
include/input_pcr.h
src/input/input_pcr.c

index e08240c277bacdc3f332968378c5ff92dcaf4a9d..010c5dfe59cc54fe4659c1b8834fa7020d53a4af 100644 (file)
@@ -212,6 +212,8 @@ typedef struct pcr_descriptor_struct
     mtime_t                 delta_clock;
     mtime_t                 delta_decode;
                             /* represents decoder_time - pcr_time in usecondes */
+    mtime_t                 last_pcr;
+
     count_t                 c_average;
                              /* counter used to compute dynamic average values */
     count_t                 c_pts;
index c1d7ccfa7d46411b9a67391b3700f753e2831836..ebe0a32b192eae58cf447b2ed436c1d38f695d8a 100644 (file)
@@ -9,6 +9,9 @@
  * new_average = (old_average * c_average + new_sample_value) / (c_average +1) */
 #define PCR_MAX_AVERAGE_COUNTER 40
 
+/* Maximum allowed gap between two PCRs. */
+#define PCR_MAX_GAP 1000000
+
 /******************************************************************************
  * Prototypes
  ******************************************************************************/
index 7ed0551318b458d393f2a588d82500a52956e5d9..289778ae9f697279fdf303764ebaa8ab511e60ba 100644 (file)
@@ -29,11 +29,10 @@ void input_PcrReInit( input_thread_t *p_input )
 {
     ASSERT(p_input);
 
-    pthread_mutex_lock( &p_input->p_pcr->lock );
-
     p_input->p_pcr->delta_clock = 0;
     p_input->p_pcr->c_average = 0;
     p_input->p_pcr->c_pts = 0;
+    p_input->p_pcr->last_pcr = 0;
 
 #ifdef STATS
     p_input->p_pcr->c_average_jitter = 0;
@@ -42,8 +41,6 @@ void input_PcrReInit( input_thread_t *p_input )
     /* For the printf in input_PcrDecode() (for debug purpose only) */
     printf("\n");
 #endif
-
-    pthread_mutex_unlock( &p_input->p_pcr->lock );
 }
 
 /******************************************************************************
@@ -77,11 +74,6 @@ void input_PcrDecode( input_thread_t *p_input, es_descriptor_t *p_es,
     ASSERT(p_es);
 
     p_pcr = p_input->p_pcr;
-    if( p_es->b_discontinuity )
-    {
-        input_PcrReInit(p_input);
-        p_es->b_discontinuity = 0;
-    }
     
     /* Express the PCR in microseconde
      * WARNING: do not remove the casts in the following calculation ! */
@@ -91,6 +83,17 @@ void input_PcrDecode( input_thread_t *p_input, es_descriptor_t *p_es,
     
     pthread_mutex_lock( &p_pcr->lock );
     
+    if( p_es->b_discontinuity ||
+        ( p_pcr->last_pcr != 0 && 
+         ( (p_pcr->last_pcr - pcr_time) > PCR_MAX_GAP
+           || (p_pcr->last_pcr - pcr_time) < - PCR_MAX_GAP ) ) )
+    {
+        intf_DbgMsg("input debug: input_PcrReInit()\n");
+        input_PcrReInit(p_input);
+        p_es->b_discontinuity = 0;
+    }
+    p_pcr->last_pcr = pcr_time;
+
     if( p_pcr->c_average == PCR_MAX_AVERAGE_COUNTER )
     {
         p_pcr->delta_clock = (delta_clock + (p_pcr->delta_clock * (PCR_MAX_AVERAGE_COUNTER-1)))