* 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
******************************************************************************/
{
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;
/* For the printf in input_PcrDecode() (for debug purpose only) */
printf("\n");
#endif
-
- pthread_mutex_unlock( &p_input->p_pcr->lock );
}
/******************************************************************************
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 ! */
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)))