From 81db2a0b4206573e3294f078d97ae44e06f10341 Mon Sep 17 00:00:00 2001 From: Jean-Marc Dressler Date: Sun, 21 Nov 1999 14:26:20 +0000 Subject: [PATCH] =?UTF-8?q?Mise=20en=20place=20du=20m=EF=BF=BDcanisme=20de?= =?UTF-8?q?=20d=EF=BF=BDtection=20de=20changement=20de=20flux=20dans=20la?= =?UTF-8?q?=20synchro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Polux --- include/input.h | 2 ++ include/input_pcr.h | 3 +++ src/input/input_pcr.c | 21 ++++++++++++--------- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/include/input.h b/include/input.h index e08240c277..010c5dfe59 100644 --- a/include/input.h +++ b/include/input.h @@ -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; diff --git a/include/input_pcr.h b/include/input_pcr.h index c1d7ccfa7d..ebe0a32b19 100644 --- a/include/input_pcr.h +++ b/include/input_pcr.h @@ -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 ******************************************************************************/ diff --git a/src/input/input_pcr.c b/src/input/input_pcr.c index 7ed0551318..289778ae9f 100644 --- a/src/input/input_pcr.c +++ b/src/input/input_pcr.c @@ -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)))