- demux_sys_t *p_sys = p_demux->p_sys;
- /*
- * PCR is 33bit. If PCR reaches to 0x1FFFFFFFF (26:30:43.717), ressets from 0.
- * So, need to add 0x1FFFFFFFF, for calculating duration or current position.
- */
- mtime_t i_adjust = 0;
- int64_t i_pos = stream_Tell( p_sys->stream );
- int i;
- for( i = 1; i < p_sys->i_pcrs_num && p_sys->p_pos[i] <= i_pos; ++i )
- {
- if( p_sys->p_pcrs[i-1] > p_sys->p_pcrs[i] )
- i_adjust += 0x1FFFFFFFF;
- }
- if( p_sys->p_pcrs[i-1] > i_pcr )
- i_adjust += 0x1FFFFFFFF;
-
- return i_pcr + i_adjust;
-}
-
-static mtime_t AdjustPTSWrapAround( demux_t *p_demux, mtime_t i_pts )
-{
- demux_sys_t *p_sys = p_demux->p_sys;
- mtime_t i_pcr = p_sys->i_current_pcr;
-
- mtime_t i_adjustremain = i_pcr % 0x1FFFFFFFF;
- mtime_t i_adjustbase = i_pcr - i_adjustremain;
-
- mtime_t i_pts_adjust = i_adjustbase;
-
- /* PTS has rolled first */
- if( i_adjustremain >= 0xFFFFFFFF && i_pts < 0xFFFFFFFF )
- {
- i_pts_adjust += 0x1FFFFFFFF;
- }
- /* PCR has rolled first (PTS is late!) */
- else if( i_adjustremain < 0xFFFFFFFF && i_pts >= 0xFFFFFFFF )
- {
- if( i_adjustbase >= 0x1FFFFFFFF ) /* we need to remove current roll */
- i_pts_adjust -= 0x1FFFFFFFF;
- }