Commit 81db2a0b authored by Jean-Marc Dressler's avatar Jean-Marc Dressler

Mise en place du m�canisme de d�tection de changement de flux dans la synchro

Polux
parent 59fd3a2a
...@@ -212,6 +212,8 @@ typedef struct pcr_descriptor_struct ...@@ -212,6 +212,8 @@ typedef struct pcr_descriptor_struct
mtime_t delta_clock; mtime_t delta_clock;
mtime_t delta_decode; mtime_t delta_decode;
/* represents decoder_time - pcr_time in usecondes */ /* represents decoder_time - pcr_time in usecondes */
mtime_t last_pcr;
count_t c_average; count_t c_average;
/* counter used to compute dynamic average values */ /* counter used to compute dynamic average values */
count_t c_pts; count_t c_pts;
......
...@@ -9,6 +9,9 @@ ...@@ -9,6 +9,9 @@
* new_average = (old_average * c_average + new_sample_value) / (c_average +1) */ * new_average = (old_average * c_average + new_sample_value) / (c_average +1) */
#define PCR_MAX_AVERAGE_COUNTER 40 #define PCR_MAX_AVERAGE_COUNTER 40
/* Maximum allowed gap between two PCRs. */
#define PCR_MAX_GAP 1000000
/****************************************************************************** /******************************************************************************
* Prototypes * Prototypes
******************************************************************************/ ******************************************************************************/
......
...@@ -29,11 +29,10 @@ void input_PcrReInit( input_thread_t *p_input ) ...@@ -29,11 +29,10 @@ void input_PcrReInit( input_thread_t *p_input )
{ {
ASSERT(p_input); ASSERT(p_input);
pthread_mutex_lock( &p_input->p_pcr->lock );
p_input->p_pcr->delta_clock = 0; p_input->p_pcr->delta_clock = 0;
p_input->p_pcr->c_average = 0; p_input->p_pcr->c_average = 0;
p_input->p_pcr->c_pts = 0; p_input->p_pcr->c_pts = 0;
p_input->p_pcr->last_pcr = 0;
#ifdef STATS #ifdef STATS
p_input->p_pcr->c_average_jitter = 0; p_input->p_pcr->c_average_jitter = 0;
...@@ -42,8 +41,6 @@ void input_PcrReInit( input_thread_t *p_input ) ...@@ -42,8 +41,6 @@ void input_PcrReInit( input_thread_t *p_input )
/* For the printf in input_PcrDecode() (for debug purpose only) */ /* For the printf in input_PcrDecode() (for debug purpose only) */
printf("\n"); printf("\n");
#endif #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, ...@@ -77,11 +74,6 @@ void input_PcrDecode( input_thread_t *p_input, es_descriptor_t *p_es,
ASSERT(p_es); ASSERT(p_es);
p_pcr = p_input->p_pcr; 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 /* Express the PCR in microseconde
* WARNING: do not remove the casts in the following calculation ! */ * 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, ...@@ -91,6 +83,17 @@ void input_PcrDecode( input_thread_t *p_input, es_descriptor_t *p_es,
pthread_mutex_lock( &p_pcr->lock ); 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 ) if( p_pcr->c_average == PCR_MAX_AVERAGE_COUNTER )
{ {
p_pcr->delta_clock = (delta_clock + (p_pcr->delta_clock * (PCR_MAX_AVERAGE_COUNTER-1))) p_pcr->delta_clock = (delta_clock + (p_pcr->delta_clock * (PCR_MAX_AVERAGE_COUNTER-1)))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment