[vlc-devel] commit: Factorize preroll code and prepare for correct flush. ( Laurent Aimar )
git version control
git at videolan.org
Thu Oct 9 00:14:22 CEST 2008
vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Thu Oct 2 21:14:37 2008 +0200| [21bb8a7eefb9200fada1e198a57b8be79e296c51] | committer: Laurent Aimar
Factorize preroll code and prepare for correct flush.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=21bb8a7eefb9200fada1e198a57b8be79e296c51
---
src/input/decoder.c | 75 +++++++++++++++++++++++++++-----------------------
1 files changed, 40 insertions(+), 35 deletions(-)
diff --git a/src/input/decoder.c b/src/input/decoder.c
index 5d1d227..b6d065f 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -500,10 +500,8 @@ void input_DecoderFlush( decoder_t *p_dec )
/* Send a special block */
p_null = block_New( p_dec, 128 );
p_null->i_flags |= BLOCK_FLAG_DISCONTINUITY;
- if( p_dec->fmt_in.i_cat == SPU_ES )
- p_null->i_flags |= BLOCK_FLAG_CORE_FLUSH;
- /* FIXME check for p_packetizer or b_packitized from es_format_t of input ? */
- if( p_owner->p_packetizer )
+ p_null->i_flags |= BLOCK_FLAG_CORE_FLUSH;
+ if( !p_dec->fmt_in.b_packetized )
p_null->i_flags |= BLOCK_FLAG_CORRUPTED;
memset( p_null->p_buffer, 0, p_null->i_buffer );
@@ -1330,12 +1328,11 @@ static void DecoderProcessSout( decoder_t *p_dec, block_t *p_block )
/* This function process a video block
*/
-static void DecoderProcessVideo( decoder_t *p_dec, block_t *p_block )
+static void DecoderProcessVideo( decoder_t *p_dec, block_t *p_block, bool b_flush )
{
decoder_owner_sys_t *p_owner = (decoder_owner_sys_t *)p_dec->p_owner;
- if( p_block )
- DecoderUpdatePreroll( &p_owner->i_preroll_end, p_block );
+ // TODO flush
if( p_owner->p_packetizer )
{
@@ -1372,11 +1369,11 @@ static void DecoderProcessVideo( decoder_t *p_dec, block_t *p_block )
/* This function process a audio block
*/
-static void DecoderProcessAudio( decoder_t *p_dec, block_t *p_block )
+static void DecoderProcessAudio( decoder_t *p_dec, block_t *p_block, bool b_flush )
{
decoder_owner_sys_t *p_owner = (decoder_owner_sys_t *)p_dec->p_owner;
- if( p_block )
- DecoderUpdatePreroll( &p_owner->i_preroll_end, p_block );
+
+ // TODO flush
if( p_owner->p_packetizer )
{
@@ -1411,7 +1408,7 @@ static void DecoderProcessAudio( decoder_t *p_dec, block_t *p_block )
/* This function process a subtitle block
*/
-static void DecoderProcessSpu( decoder_t *p_dec, block_t *p_block )
+static void DecoderProcessSpu( decoder_t *p_dec, block_t *p_block, bool b_flush )
{
decoder_owner_sys_t *p_owner = (decoder_owner_sys_t *)p_dec->p_owner;
const bool b_telx = p_dec->fmt_in.i_codec == VLC_FOURCC('t','e','l','x');
@@ -1419,16 +1416,8 @@ static void DecoderProcessSpu( decoder_t *p_dec, block_t *p_block )
input_thread_t *p_input = p_owner->p_input;
vout_thread_t *p_vout;
subpicture_t *p_spu;
- bool b_flushing = p_owner->i_preroll_end == INT64_MAX;
- bool b_flush = false;
- if( p_block )
- {
- DecoderUpdatePreroll( &p_owner->i_preroll_end, p_block );
- b_flush = (p_block->i_flags & BLOCK_FLAG_CORE_FLUSH) != 0;
- }
-
- if( !b_flushing && b_flush && p_owner->p_spu_vout )
+ if( b_flush && p_owner->p_spu_vout )
{
p_vout = vlc_object_find( p_dec, VLC_OBJECT_VOUT, FIND_ANYWHERE );
@@ -1486,6 +1475,8 @@ static void DecoderProcessSpu( decoder_t *p_dec, block_t *p_block )
*/
static int DecoderProcess( decoder_t *p_dec, block_t *p_block )
{
+ decoder_owner_sys_t *p_owner = (decoder_owner_sys_t *)p_dec->p_owner;
+
if( p_block && p_block->i_buffer <= 0 )
{
block_Release( p_block );
@@ -1499,22 +1490,36 @@ static int DecoderProcess( decoder_t *p_dec, block_t *p_block )
}
else
#endif
- if( p_dec->fmt_in.i_cat == AUDIO_ES )
- {
- DecoderProcessAudio( p_dec, p_block );
- }
- else if( p_dec->fmt_in.i_cat == VIDEO_ES )
- {
- DecoderProcessVideo( p_dec, p_block );
- }
- else if( p_dec->fmt_in.i_cat == SPU_ES )
- {
- DecoderProcessSpu( p_dec, p_block );
- }
- else
{
- msg_Err( p_dec, "unknown ES format" );
- p_dec->b_error = true;
+ bool b_flushing = p_owner->i_preroll_end == INT64_MAX;
+ bool b_flush = false;
+
+ if( p_block )
+ {
+ DecoderUpdatePreroll( &p_owner->i_preroll_end, p_block );
+
+ b_flush = !b_flushing && (p_block->i_flags & BLOCK_FLAG_CORE_FLUSH) != 0;
+
+ p_block->i_flags &= ~BLOCK_FLAG_CORE_PRIVATE_MASK;
+ }
+
+ if( p_dec->fmt_in.i_cat == AUDIO_ES )
+ {
+ DecoderProcessAudio( p_dec, p_block, b_flush );
+ }
+ else if( p_dec->fmt_in.i_cat == VIDEO_ES )
+ {
+ DecoderProcessVideo( p_dec, p_block, b_flush );
+ }
+ else if( p_dec->fmt_in.i_cat == SPU_ES )
+ {
+ DecoderProcessSpu( p_dec, p_block, b_flush );
+ }
+ else
+ {
+ msg_Err( p_dec, "unknown ES format" );
+ p_dec->b_error = true;
+ }
}
return p_dec->b_error ? VLC_EGENERIC : VLC_SUCCESS;
More information about the vlc-devel
mailing list