vlc | branch: master | Francois Cartegnie <[email protected]> | Tue Jun 5 12:25:09 2018 +0200| [d718b89b7cf2bf443db113e725f8d6062309524f] | committer: Francois Cartegnie
demux: ogg: interleave pcr > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=d718b89b7cf2bf443db113e725f8d6062309524f --- modules/demux/ogg.c | 48 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/modules/demux/ogg.c b/modules/demux/ogg.c index 63dfd0fc9e..c313c88d10 100644 --- a/modules/demux/ogg.c +++ b/modules/demux/ogg.c @@ -129,7 +129,12 @@ static int Ogg_ReadPage ( demux_t *, ogg_page * ); static void Ogg_DecodePacket ( demux_t *, logical_stream_t *, ogg_packet * ); static unsigned Ogg_OpusPacketDuration( ogg_packet * ); static void Ogg_QueueBlocks( demux_t *, logical_stream_t *, block_t * ); -static void Ogg_SendQueuedBlocks( demux_t *, logical_stream_t * ); +static void Ogg_SendQueuedBlock( demux_t *, logical_stream_t * ); + +static inline bool Ogg_HasQueuedBlocks( const logical_stream_t *p_stream ) +{ + return ( p_stream->queue.p_blocks != NULL ); +} static void Ogg_CreateES( demux_t *p_demux ); static int Ogg_BeginningOfStream( demux_t *p_demux ); @@ -336,17 +341,27 @@ static void Ogg_OutputQueues( demux_t *p_demux, bool b_drain ) if( p_sys->i_pcr != VLC_TS_INVALID ) { - for( int i_stream = 0; i_stream < p_sys->i_streams; i_stream++ ) - Ogg_SendQueuedBlocks( p_demux, p_sys->pp_stream[i_stream] ); - - /* Generate Current PCR */ - i_pcr = Ogg_GeneratePCR( p_demux, b_drain ); - if( i_pcr != VLC_TS_INVALID && i_pcr != p_sys->i_pcr ) + bool b_continue; + do { - p_sys->i_pcr = i_pcr; - if( likely( !p_sys->b_slave ) ) - es_out_SetPCR( p_demux->out, p_sys->i_pcr ); - } + b_continue = false; + for( int i_stream = 0; i_stream < p_sys->i_streams; i_stream++ ) + { + logical_stream_t *p_stream = p_sys->pp_stream[i_stream]; + if( Ogg_HasQueuedBlocks( p_stream ) ) + Ogg_SendQueuedBlock( p_demux, p_stream ); + b_continue |= Ogg_HasQueuedBlocks( p_stream ); + } + + /* Generate Current PCR */ + i_pcr = Ogg_GeneratePCR( p_demux, b_drain ); + if( i_pcr != VLC_TS_INVALID && i_pcr != p_sys->i_pcr ) + { + p_sys->i_pcr = i_pcr; + if( likely( !p_sys->b_slave ) ) + es_out_SetPCR( p_demux->out, p_sys->i_pcr ); + } + } while ( b_continue ); } } @@ -1071,11 +1086,11 @@ static void Ogg_QueueBlocks( demux_t *p_demux, logical_stream_t *p_stream, block (char*)&p_stream->fmt.i_codec, p_block->i_dts, p_stream->i_pcr, p_sys->i_pcr ); ) } -static void Ogg_SendQueuedBlocks( demux_t *p_demux, logical_stream_t *p_stream ) +static void Ogg_SendQueuedBlock( demux_t *p_demux, logical_stream_t *p_stream ) { demux_sys_t *p_sys = p_demux->p_sys; - while( p_stream->queue.p_blocks ) + if( Ogg_HasQueuedBlocks( p_stream ) ) { block_t *p_queued = p_stream->queue.p_blocks; p_stream->queue.p_blocks = p_queued->p_next; @@ -1090,7 +1105,7 @@ static void Ogg_SendQueuedBlocks( demux_t *p_demux, logical_stream_t *p_stream ) p_stream->fmt.i_extra > 0 ) /* Don't send metadata if configured by extradata */ { block_Release( p_queued ); - continue; + goto end; } p_queued->i_flags &= ~BLOCK_FLAG_HEADER; } @@ -1131,8 +1146,9 @@ static void Ogg_SendQueuedBlocks( demux_t *p_demux, logical_stream_t *p_stream ) block_Release( p_queued ); } - assert( p_stream->queue.p_blocks == NULL ); - p_stream->queue.pp_append = &p_stream->queue.p_blocks; +end: + if( p_stream->queue.p_blocks == NULL ) + p_stream->queue.pp_append = &p_stream->queue.p_blocks; } static bool Ogg_IsHeaderPacket( const logical_stream_t *p_stream, _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
