]> git.sesse.net Git - vlc/blobdiff - src/input/clock.c
* modules/audio_output/directx.c: backported directx audio output fix from trunk...
[vlc] / src / input / clock.c
index e39e65330b4bd24b7b0003292537204e605546c4..3e5fd1bd968b0d0c221886fcce8de5b0a6686b0d 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
  * input_clock.c: Clock/System date convertions, stream management
  *****************************************************************************
- * Copyright (C) 1999-2004 VideoLAN
+ * Copyright (C) 1999-2004 the VideoLAN team
  * $Id$
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
@@ -133,10 +133,11 @@ void input_ClockInit( input_clock_t *cl, vlc_bool_t b_master, int i_cr_average )
 
     cl->last_cr = 0;
     cl->last_pts = 0;
+    cl->last_sysdate = 0;
     cl->cr_ref = 0;
     cl->sysdate_ref = 0;
     cl->delta_cr = 0;
-    cl->c_average_count = 0;
+    cl->i_delta_cr_residue = 0;
 
     cl->i_cr_average = i_cr_average;
 
@@ -264,8 +265,9 @@ void input_ClockSetPCR( input_thread_t *p_input,
         else
         {
             cl->last_cr = 0;
+            cl->last_sysdate = 0;
             cl->delta_cr = 0;
-            cl->c_average_count = 0;
+            cl->i_delta_cr_residue = 0;
         }
     }
     else
@@ -308,27 +310,23 @@ void input_ClockSetPCR( input_thread_t *p_input,
             input_ClockManageControl( p_input, cl, i_clock );
 #endif
         }
-        else
+        else if ( mdate() - cl->last_sysdate > 200000 )
         {
             /* Smooth clock reference variations. */
-            mtime_t     i_extrapoled_clock = ClockCurrent( p_input, cl );
+            mtime_t i_extrapoled_clock = ClockCurrent( p_input, cl );
+            mtime_t delta_cr;
 
             /* Bresenham algorithm to smooth variations. */
-            if( cl->c_average_count == cl->i_cr_average )
-            {
-                cl->delta_cr = ( cl->delta_cr
-                                        * (cl->i_cr_average - 1)
-                                      + ( i_extrapoled_clock - i_clock ) )
-                                    / cl->i_cr_average;
-            }
-            else
-            {
-                cl->delta_cr = ( cl->delta_cr
-                                        * cl->c_average_count
-                                      + ( i_extrapoled_clock - i_clock ) )
-                                    / (cl->c_average_count + 1);
-                cl->c_average_count++;
-            }
+            delta_cr = ( cl->delta_cr * (cl->i_cr_average - 1)
+                               + ( i_extrapoled_clock - i_clock )
+                               + cl->i_delta_cr_residue )
+                           / cl->i_cr_average;
+            cl->i_delta_cr_residue = ( cl->delta_cr * (cl->i_cr_average - 1)
+                                       + ( i_extrapoled_clock - i_clock )
+                                       + cl->i_delta_cr_residue )
+                                    % cl->i_cr_average;
+            cl->delta_cr = delta_cr;
+            cl->last_sysdate = mdate();
         }
     }
 }