/*****************************************************************************
* 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>
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;
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
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();
}
}
}