[vlc-devel] [PATCH 5/5] mediacodec: flush if SPS/PPS change but not the video size
Thomas Guillem
thomas at gllm.fr
Tue May 12 18:13:08 CEST 2015
---
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 9b99fa7..0610332 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)
--
2.1.4
More information about the vlc-devel
mailing list