]> git.sesse.net Git - vlc/commitdiff
clock: Fixed rounding error in clock smoothing algorithm.
authorSigmund Augdal Helberg <sigmunau@videolan.org>
Wed, 9 Nov 2005 09:48:02 +0000 (09:48 +0000)
committerSigmund Augdal Helberg <sigmunau@videolan.org>
Wed, 9 Nov 2005 09:48:02 +0000 (09:48 +0000)
Also removed a long unused member from the clock struct.

src/input/clock.c
src/input/input_internal.h

index badac152a49ccdc54316a8ae9df2ae5077e87add..6afca87a61307c24013e64af7ef3894dde41abc4 100644 (file)
@@ -136,7 +136,7 @@ void input_ClockInit( input_clock_t *cl, vlc_bool_t b_master, int i_cr_average )
     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;
 
@@ -265,7 +265,7 @@ void input_ClockSetPCR( input_thread_t *p_input,
         {
             cl->last_cr = 0;
             cl->delta_cr = 0;
-            cl->c_average_count = 0;
+            cl->i_delta_cr_residue = 0;
         }
     }
     else
@@ -312,11 +312,18 @@ void input_ClockSetPCR( input_thread_t *p_input,
         {
             /* Smooth clock reference variations. */
             mtime_t i_extrapoled_clock = ClockCurrent( p_input, cl );
+            mtime_t delta_cr;
 
             /* Bresenham algorithm to smooth variations. */
-            cl->delta_cr = ( cl->delta_cr * (cl->i_cr_average - 1)
-                               + ( i_extrapoled_clock - i_clock ) )
+            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;
         }
     }
 }
index 2ea7348fc02d9f37439a3f95b78caa88eb0dcc54..a9a0b3fe783422731ecdc0e7cac84591421cbbb6 100644 (file)
@@ -136,14 +136,13 @@ typedef struct
     mtime_t                 last_cr; /* reference to detect unexpected stream
                                       * discontinuities                      */
     mtime_t                 last_pts;
-    count_t                 c_average_count;
-                           /* counter used to compute dynamic average values */
     int                     i_synchro_state;
 
     vlc_bool_t              b_master;
 
     /* Config */
     int                     i_cr_average;
+    int                     i_delta_cr_residue;
 } input_clock_t;
 
 void input_ClockInit( input_clock_t *, vlc_bool_t b_master, int i_cr_average );