From 3807a5ed8de33307ca195c8462e72bf83139b2e4 Mon Sep 17 00:00:00 2001 From: Jean-Marc Dressler Date: Thu, 23 Sep 1999 20:56:39 +0000 Subject: [PATCH] =?UTF-8?q?Impl=EF=BF=BDmentation=20rudimentaire=20de=20la?= =?UTF-8?q?=20synchro=20:=20les=20packets=20PES=20sont=20maintenant=20dat?= =?UTF-8?q?=EF=BF=BDs.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -- Polux --- include/input.h | 3 ++- src/input/input.c | 33 +++++++++++++++++++++++++++------ src/input/input_pcr.c | 6 +++++- 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/include/input.h b/include/input.h index 28814878f2..d0ea44dfbb 100644 --- a/include/input.h +++ b/include/input.h @@ -203,7 +203,6 @@ typedef struct * pcr_descriptor_t ******************************************************************************* * Contains informations used to synchronise the decoder with the server - * Only input_PcrDecode() is allowed to modify it *******************************************************************************/ typedef struct pcr_descriptor_struct @@ -211,9 +210,11 @@ typedef struct pcr_descriptor_struct pthread_mutex_t lock; /* pcr modification lock */ s64 delta_clock; + s64 delta_decode; /* represents decoder_time - pcr_time in usecondes */ count_t c_average; /* counter used to compute dynamic average values */ + count_t c_pts; #ifdef STATS /* Stats */ count_t c_average_jitter; diff --git a/src/input/input.c b/src/input/input.c index 76ec1c08f6..4b00df790c 100644 --- a/src/input/input.c +++ b/src/input/input.c @@ -870,12 +870,33 @@ static __inline__ void input_DemuxPES( input_thread_t *p_input, the 14 bytes */ if( p_pes->b_has_pts ) { - /* The PTS field is split in 3 bit records. We have to add - them, and thereafter we substract the 2 marker_bits */ - p_pes->i_pts = ( (p_pes->p_pes_header[9] << 29) + - (U16_AT(p_pes->p_pes_header + 10) << 14) + - (U16_AT(p_pes->p_pes_header + 12) >> 1) - - (1 << 14) - (1 << 29) ); + pcr_descriptor_t *p_pcr; + /* The PTS field is split in 3 bit records. We have to add + them, and thereafter we substract the 2 marker_bits */ + + p_pcr = p_input->p_pcr; + pthread_mutex_lock( &p_pcr->lock ); + if( p_pcr->delta_clock == 0 ) + { + p_pes->i_pts = 0; + } + else + { + p_pes->i_pts = ( ((s64)p_pes->p_pes_header[9] << 29) + + ((s64)U16_AT(p_pes->p_pes_header + 10) << 14) + + ((s64)U16_AT(p_pes->p_pes_header + 12) >> 1) - + (1 << 14) - (1 << 29) ); + p_pes->i_pts *= 300; + p_pes->i_pts /= 27; + p_pes->i_pts += p_pcr->delta_clock; + if( p_pcr->c_pts == 0 ) + { + p_pcr->delta_decode = mdate() - p_pes->i_pts + 500000; + } + p_pes->i_pts += p_pcr->delta_decode; + } + p_pcr->c_pts += 1; + pthread_mutex_unlock( &p_pcr->lock ); } break; } diff --git a/src/input/input_pcr.c b/src/input/input_pcr.c index 602e776dd1..bfefd19d32 100644 --- a/src/input/input_pcr.c +++ b/src/input/input_pcr.c @@ -30,9 +30,12 @@ void input_PcrReInit( input_thread_t *p_input ) pcr_descriptor_t* p_pcr; ASSERT(p_input); - p_pcr = p_input->p_pcr; + pthread_mutex_lock( &p_pcr->lock ); + p_pcr = p_input->p_pcr; + p_pcr->delta_clock = 0; p_pcr->c_average = 0; + p_pcr->c_pts = 0; #ifdef STATS p_pcr->c_average_jitter = 0; @@ -42,6 +45,7 @@ void input_PcrReInit( input_thread_t *p_input ) /* For the printf in input_PcrDecode(), this is used for debug purpose only */ printf("\n"); #endif + pthread_mutex_unlock( &p_pcr->lock ); } /******************************************************************************