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