vlc/vlc-2.2 | branch: master | Francois Cartegnie <[email protected]> | Mon Apr 6 18:45:12 2015 +0200| [841908514df172c3ec650f523ca631f1a3d4fe5a] | committer: Jean-Baptiste Kempf
demux: ogg: don't send invalid dts stamps and use last pts as chained pcr (cherry picked from commit 918f44532669674303f492d0781fa408d0169dd5) Signed-off-by: Jean-Baptiste Kempf <[email protected]> > http://git.videolan.org/gitweb.cgi/vlc/vlc-2.2.git/?a=commit;h=841908514df172c3ec650f523ca631f1a3d4fe5a --- modules/demux/ogg.c | 20 ++++++++++++++++---- modules/demux/ogg.h | 1 + 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/modules/demux/ogg.c b/modules/demux/ogg.c index 2e77c42..9982367 100644 --- a/modules/demux/ogg.c +++ b/modules/demux/ogg.c @@ -302,6 +302,7 @@ static int Demux( demux_t * p_demux ) } Ogg_EndOfStream( p_demux ); p_sys->b_chained_boundary = true; + p_sys->i_nzpcr_offset = p_sys->i_nzlast_pts; } if( Ogg_BeginningOfStream( p_demux ) != VLC_SUCCESS ) @@ -397,8 +398,7 @@ static int Demux( demux_t * p_demux ) { msg_Err( p_demux, "Broken Ogg stream (serialno) mismatch" ); Ogg_ResetStream( p_stream ); - p_sys->i_nzpcr_offset = (p_sys->i_pcr >= VLC_TS_INVALID) ? - p_sys->i_pcr - VLC_TS_0 : 0; + p_sys->i_nzpcr_offset = p_sys->i_nzlast_pts; ogg_stream_reset_serialno( &p_stream->os, ogg_page_serialno( &p_sys->current_page ) ); } @@ -1101,8 +1101,19 @@ static void Ogg_SendOrQueueBlocks( demux_t *p_demux, logical_stream_t *p_stream, temp = temp->p_next; tosend->p_next = NULL; - DemuxDebug( msg_Dbg( p_demux, "block sent from preparse > pts %"PRId64" spcr %"PRId64" pcr %"PRId64, - tosend->i_pts, p_stream->i_pcr, p_ogg->i_pcr ); ) + if( tosend->i_pts < VLC_TS_0 ) + { + /* Don't send metadata from chained streams */ + block_Release( tosend ); + continue; + } + else if( tosend->i_dts < VLC_TS_0 ) + { + tosend->i_dts = tosend->i_pts; + } + + DemuxDebug( msg_Dbg( p_demux, "block sent from preparse > dts %"PRId64" pts %"PRId64" spcr %"PRId64" pcr %"PRId64, + tosend->i_dts, tosend->i_pts, p_stream->i_pcr, p_ogg->i_pcr ); ) es_out_Send( p_demux->out, p_stream->p_es, tosend ); if ( p_ogg->i_pcr < VLC_TS_0 && i_firstpts > VLC_TS_INVALID ) @@ -1116,6 +1127,7 @@ static void Ogg_SendOrQueueBlocks( demux_t *p_demux, logical_stream_t *p_stream, if ( p_block ) { + p_ogg->i_nzlast_pts = (p_block->i_pts > VLC_TS_INVALID) ? p_block->i_pts - VLC_TS_0 : 0; DemuxDebug( msg_Dbg( p_demux, "block sent directly > pts %"PRId64" spcr %"PRId64" pcr %"PRId64, p_block->i_pts, p_stream->i_pcr, p_ogg->i_pcr ) ); es_out_Send( p_demux->out, p_stream->p_es, p_block ); diff --git a/modules/demux/ogg.h b/modules/demux/ogg.h index ff6d538..c30b799 100644 --- a/modules/demux/ogg.h +++ b/modules/demux/ogg.h @@ -179,6 +179,7 @@ struct demux_sys_t * the sub-streams */ mtime_t i_pcr; mtime_t i_nzpcr_offset; + mtime_t i_nzlast_pts; /* informative only */ mtime_t i_pcr_jitter; int64_t i_access_delay; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
