[vlc-commits] demux: ogg: fix chained offset on continued pages
Francois Cartegnie
git at videolan.org
Wed Jun 14 00:23:47 CEST 2017
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Tue Jun 13 17:44:47 2017 +0200| [db99e5dddc136cd12d45ef6534c168816de60047] | committer: Francois Cartegnie
demux: ogg: fix chained offset on continued pages
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=db99e5dddc136cd12d45ef6534c168816de60047
---
modules/demux/ogg.c | 23 ++++++++++++++++++++---
modules/demux/ogg.h | 1 -
2 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/modules/demux/ogg.c b/modules/demux/ogg.c
index c932c70e66..bd6b46d2b2 100644
--- a/modules/demux/ogg.c
+++ b/modules/demux/ogg.c
@@ -299,6 +299,15 @@ static int Demux( demux_t * p_demux )
if ( p_sys->i_streams ) /* All finished */
{
msg_Dbg( p_demux, "end of a group of logical streams" );
+
+ mtime_t i_lastpcr = VLC_TS_INVALID;
+ for( i_stream = 0; i_stream < p_sys->i_streams; i_stream++ )
+ {
+ logical_stream_t *p_stream = p_sys->pp_stream[i_stream];
+ if( p_stream->i_pcr > i_lastpcr )
+ i_lastpcr = p_stream->i_pcr;
+ }
+
/* We keep the ES to try reusing it in Ogg_BeginningOfStream
* only 1 ES is supported (common case for ogg web radio) */
if( p_sys->i_streams == 1 )
@@ -306,9 +315,16 @@ static int Demux( demux_t * p_demux )
p_sys->p_old_stream = p_sys->pp_stream[0];
TAB_CLEAN( p_sys->i_streams, p_sys->pp_stream );
}
+
Ogg_EndOfStream( p_demux );
p_sys->b_chained_boundary = true;
- p_sys->i_nzpcr_offset = p_sys->i_nzlast_pts;
+
+ if( i_lastpcr > VLC_TS_INVALID )
+ {
+ p_sys->i_nzpcr_offset = i_lastpcr - VLC_TS_0;
+ es_out_Control( p_demux->out, ES_OUT_SET_PCR, i_lastpcr );
+ }
+ p_sys->i_pcr = VLC_TS_INVALID;
}
if( Ogg_BeginningOfStream( p_demux ) != VLC_SUCCESS )
@@ -401,7 +417,8 @@ 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_nzlast_pts;
+ if( p_stream->i_pcr > VLC_TS_INVALID )
+ p_sys->i_nzpcr_offset = p_stream->i_pcr - VLC_TS_0;
ogg_stream_reset_serialno( &p_stream->os, ogg_page_serialno( &p_sys->current_page ) );
}
@@ -591,6 +608,7 @@ static int Demux( demux_t * p_demux )
if ( b_fixed )
{
+ pagestamp = p_stream->i_previous_pcr; /* as set above */
if ( pagestamp < 0 ) pagestamp = 0;
p_stream->i_pcr = VLC_TS_0 + pagestamp;
p_stream->i_pcr += p_sys->i_nzpcr_offset;
@@ -1141,7 +1159,6 @@ 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 cb312ed24b..872bbd97b2 100644
--- a/modules/demux/ogg.h
+++ b/modules/demux/ogg.h
@@ -183,7 +183,6 @@ 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;
More information about the vlc-commits
mailing list