vlc | branch: master | Thomas Guillem <[email protected]> | Tue May 12 18:10:41 2015 +0200| [adc305b6e6dff650f4b0e7eb0b902987a91c1030] | committer: Thomas Guillem
mediacodec: flush if SPS/PPS change but not the video size > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=adc305b6e6dff650f4b0e7eb0b902987a91c1030 --- modules/codec/omxil/android_mediacodec.c | 58 ++++++++++++++++++------------ 1 file changed, 36 insertions(+), 22 deletions(-) diff --git a/modules/codec/omxil/android_mediacodec.c b/modules/codec/omxil/android_mediacodec.c index 4d1757d..42014e5 100644 --- a/modules/codec/omxil/android_mediacodec.c +++ b/modules/codec/omxil/android_mediacodec.c @@ -1382,6 +1382,35 @@ static void HEVCProcessBlock(decoder_t *p_dec, block_t *p_block, VLC_UNUSED(p_size_changed); } +static int DecodeFlush(decoder_t *p_dec, JNIEnv *env) +{ + decoder_sys_t *p_sys = p_dec->p_sys; + + if (p_sys->decoded) + { + p_sys->i_preroll_end = 0; + timestamp_FifoEmpty(p_sys->timestamp_fifo); + /* Invalidate all pictures that are currently in flight + * since flushing make all previous indices returned by + * MediaCodec invalid. */ + if (p_sys->direct_rendering) + InvalidateAllPictures(p_dec); + } + + if (p_sys->decoded || p_sys->i_csd_send > 0) + { + (*env)->CallVoidMethod(env, p_sys->codec, jfields.flush); + if (CHECK_EXCEPTION()) { + msg_Warn(p_dec, "Exception occurred in MediaCodec.flush"); + return VLC_EGENERIC; + } + /* resend CODEC_CONFIG buffer after a flush */ + p_sys->i_csd_send = 0; + } + p_sys->decoded = false; + return VLC_SUCCESS; +} + static picture_t *DecodeVideo(decoder_t *p_dec, block_t **pp_block) { decoder_sys_t *p_sys = p_dec->p_sys; @@ -1414,28 +1443,8 @@ static picture_t *DecodeVideo(decoder_t *p_dec, block_t **pp_block) } if (p_block && p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED)) { - if (p_sys->decoded) - { - p_sys->i_preroll_end = 0; - timestamp_FifoEmpty(p_sys->timestamp_fifo); - /* Invalidate all pictures that are currently in flight - * since flushing make all previous indices returned by - * MediaCodec invalid. */ - if (p_sys->direct_rendering) - InvalidateAllPictures(p_dec); - } - - if (p_sys->decoded || p_sys->i_csd_send > 0) - { - (*env)->CallVoidMethod(env, p_sys->codec, jfields.flush); - if (CHECK_EXCEPTION()) { - msg_Warn(p_dec, "Exception occurred in MediaCodec.flush"); - b_error = true; - } - /* resend CODEC_CONFIG buffer after a flush */ - p_sys->i_csd_send = 0; - } - p_sys->decoded = false; + if (DecodeFlush(p_dec, env) != VLC_SUCCESS) + b_error = true; goto endclean; } @@ -1456,6 +1465,11 @@ static picture_t *DecodeVideo(decoder_t *p_dec, block_t **pp_block) msg_Err(p_dec, "SPS/PPS changed during playback and " "video size are different. Restart it !"); CloseMediaCodec(p_dec, env); + } else + { + msg_Err(p_dec, "SPS/PPS changed during playback. Flush it"); + if (DecodeFlush(p_dec, env) != VLC_SUCCESS) + b_error = true; } } if (!p_sys->codec) _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
