vlc | branch: master | Thomas Guillem <[email protected]> | Mon Mar 27 17:59:07 2017 +0200| [8106fb6b7d31347b088e106ab7793aa1c41bdb47] | committer: Thomas Guillem
mediacodec: drain before restart This avoid to loose some frames when SPS/PPS change. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=8106fb6b7d31347b088e106ab7793aa1c41bdb47 --- modules/codec/omxil/mediacodec.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/modules/codec/omxil/mediacodec.c b/modules/codec/omxil/mediacodec.c index af20d6f..2f7fb19 100644 --- a/modules/codec/omxil/mediacodec.c +++ b/modules/codec/omxil/mediacodec.c @@ -50,7 +50,7 @@ #define BLOCK_FLAG_CSD (0x01 << BLOCK_FLAG_PRIVATE_SHIFT) #define DECODE_FLAG_RESTART (0x01) -#define DECODE_FLASH_FLUSH (0x02) +#define DECODE_FLAG_DRAIN (0x02) /** * Callback called when a new block is processed from DecodeBlock. * It returns -1 in case of error, 0 if block should be dropped, 1 otherwise. @@ -1404,6 +1404,8 @@ static int DecodeBlock(decoder_t *p_dec, block_t *p_in_block) if (p_in_block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED)) { + if (p_sys->b_output_ready) + QueueBlockLocked(p_dec, NULL, true); DecodeFlushLocked(p_dec); if (p_sys->b_aborted) goto end; @@ -1432,13 +1434,15 @@ static int DecodeBlock(decoder_t *p_dec, block_t *p_in_block) } goto end; } - if (p_sys->i_decode_flags & (DECODE_FLASH_FLUSH|DECODE_FLAG_RESTART)) + if (p_sys->i_decode_flags & (DECODE_FLAG_DRAIN|DECODE_FLAG_RESTART)) { - msg_Warn(p_dec, "Flushing from DecodeBlock"); + msg_Warn(p_dec, "Draining from DecodeBlock"); const bool b_restart = p_sys->i_decode_flags & DECODE_FLAG_RESTART; p_sys->i_decode_flags = 0; - /* Flush before restart to unblock OutThread */ + /* Drain and flush before restart to unblock OutThread */ + if (p_sys->b_output_ready) + QueueBlockLocked(p_dec, NULL, true); DecodeFlushLocked(p_dec); if (p_sys->b_aborted) goto end; @@ -1539,8 +1543,8 @@ static int VideoHXXX_OnNewBlock(decoder_t *p_dec, block_t **pp_block) p_sys->i_decode_flags |= DECODE_FLAG_RESTART; } else { - msg_Err(p_dec, "SPS/PPS changed during playback. Flush it"); - p_sys->i_decode_flags |= DECODE_FLASH_FLUSH; + msg_Err(p_dec, "SPS/PPS changed during playback. Drain it"); + p_sys->i_decode_flags |= DECODE_FLAG_DRAIN; } } _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
