[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