vlc | branch: master | Francois Cartegnie <[email protected]> | Sat Apr 2 16:14:55 2016 +0200| [4ed8dd94d0b717a29c9d5b244058fb3c905c467b] | committer: Francois Cartegnie
sout: record: keep interleaving when unbuffering record module outputs buffered data stream by stream which breaks most muxers (as long as we have no sout pcr) > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=4ed8dd94d0b717a29c9d5b244058fb3c905c467b --- modules/stream_out/record.c | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/modules/stream_out/record.c b/modules/stream_out/record.c index 8931111..46b5f80 100644 --- a/modules/stream_out/record.c +++ b/modules/stream_out/record.c @@ -525,29 +525,39 @@ static void OutputStart( sout_stream_t *p_stream ) p_sys->i_dts_start = i_dts; } - /* Send buffered data */ - for( int i = 0; i < p_sys->i_id; i++ ) + sout_stream_id_sys_t *p_cand; + do { - sout_stream_id_sys_t *id = p_sys->id[i]; - - if( !id->id ) - continue; + /* dequeue candidate */ + p_cand = NULL; - block_t *p_block = id->p_first; - while( p_block ) + /* Send buffered data in dts order */ + for( int i = 0; i < p_sys->i_id; i++ ) { - block_t *p_next = p_block->p_next; + sout_stream_id_sys_t *id = p_sys->id[i]; - p_block->p_next = NULL; + if( !id->id || id->p_first == NULL ) + continue; - OutputSend( p_stream, id, p_block ); + if( p_cand == NULL || id->p_first->i_dts < p_cand->p_first->i_dts ) + p_cand = id; + } - p_block = p_next; + if( p_cand != NULL ) + { + block_t *p_block = p_cand->p_first; + p_cand->p_first = p_block->p_next; + if( p_cand->p_first == NULL ) + p_cand->pp_last = &p_cand->p_first; + p_block->p_next = NULL; + + if( p_block->i_dts >= p_sys->i_dts_start ) + OutputSend( p_stream, p_cand, p_block ); + else + block_Release( p_block ); } - id->p_first = NULL; - id->pp_last = &id->p_first; - } + } while( p_cand != NULL ); } static void OutputSend( sout_stream_t *p_stream, sout_stream_id_sys_t *id, block_t *p_block ) _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
