vlc | branch: master | Francois Cartegnie <[email protected]> | Sat Apr 2 18:38:57 2016 +0200| [9b8cbde7842050fb96be722759ba3b7012ddf0d3] | committer: Francois Cartegnie
demux: ts: handle PCR on every packet (fix #16780) > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=9b8cbde7842050fb96be722759ba3b7012ddf0d3 --- modules/demux/mpeg/ts.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/modules/demux/mpeg/ts.c b/modules/demux/mpeg/ts.c index 55330c5..2d50734 100644 --- a/modules/demux/mpeg/ts.c +++ b/modules/demux/mpeg/ts.c @@ -171,6 +171,7 @@ static inline int PIDGet( block_t *p ) { return ( (p->p_buffer[1]&0x1f)<<8 )|p->p_buffer[2]; } +static mtime_t GetPCR( const block_t * ); static bool ProcessTSPacket( demux_t *p_demux, ts_pid_t *pid, block_t *p_pkt ); static bool GatherPESData( demux_t *p_demux, ts_pid_t *pid, block_t *p_bk, size_t, bool ); @@ -179,7 +180,7 @@ static void ProgramSetPCR( demux_t *p_demux, ts_pmt_t *p_prg, mtime_t i_pcr ); static block_t* ReadTSPacket( demux_t *p_demux ); static int SeekToTime( demux_t *p_demux, const ts_pmt_t *, int64_t time ); static void ReadyQueuesPostSeek( demux_t *p_demux ); -static void PCRHandle( demux_t *p_demux, ts_pid_t *, block_t * ); +static void PCRHandle( demux_t *p_demux, ts_pid_t *, mtime_t ); static void PCRFixHandle( demux_t *, ts_pmt_t *, block_t * ); #define TS_PACKET_SIZE_188 188 @@ -628,9 +629,13 @@ static int Demux( demux_t *p_demux ) p_pid->i_flags |= FLAG_SEEN; } + /* Adaptation field cannot be scrambled */ + mtime_t i_pcr = GetPCR( p_pkt ); + if( i_pcr > VLC_TS_INVALID ) + PCRHandle( p_demux, p_pid, i_pcr ); + if ( SCRAMBLED(*p_pid) && !p_demux->p_sys->csa ) { - PCRHandle( p_demux, p_pid, p_pkt ); block_Release( p_pkt ); continue; } @@ -685,7 +690,6 @@ static int Demux( demux_t *p_demux ) default: /* We have to handle PCR if present */ - PCRHandle( p_demux, p_pid, p_pkt ); block_Release( p_pkt ); break; } @@ -1632,13 +1636,14 @@ static block_t* ReadTSPacket( demux_t *p_demux ) return p_pkt; } -static mtime_t GetPCR( block_t *p_pkt ) +static mtime_t GetPCR( const block_t *p_pkt ) { const uint8_t *p = p_pkt->p_buffer; mtime_t i_pcr = -1; - if( ( p[3]&0x20 ) && /* adaptation */ + if( likely(p_pkt->i_buffer > 11) && + ( p[3]&0x20 ) && /* adaptation */ ( p[5]&0x10 ) && ( p[4] >= 7 ) ) { @@ -2096,14 +2101,10 @@ static void PCRCheckDTS( demux_t *p_demux, ts_pmt_t *p_pmt, mtime_t i_pcr) } } -static void PCRHandle( demux_t *p_demux, ts_pid_t *pid, block_t *p_bk ) +static void PCRHandle( demux_t *p_demux, ts_pid_t *pid, mtime_t i_pcr ) { demux_sys_t *p_sys = p_demux->p_sys; - mtime_t i_pcr = GetPCR( p_bk ); - if( i_pcr < 0 ) - return; - pid->probed.i_pcr_count++; if( p_sys->i_pmt_es <= 0 ) @@ -2317,8 +2318,6 @@ static bool ProcessTSPacket( demux_t *p_demux, ts_pid_t *pid, block_t *p_pkt ) } } - PCRHandle( p_demux, pid, p_pkt ); - if( i_skip >= 188 ) { block_Release( p_pkt ); _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
