[vlc-commits] mediacodec: improve performances

Thomas Guillem git at videolan.org
Mon Apr 13 12:07:17 CEST 2015


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Mon Apr 13 11:40:02 2015 +0200| [0953e658252e393436ee17b3f5f25246a353f09f] | committer: Thomas Guillem

mediacodec: improve performances

Don't abort DecodeVideo when there is no p_block. It allows to fetch more than
one output buffer consequently.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=0953e658252e393436ee17b3f5f25246a353f09f
---

 modules/codec/omxil/android_mediacodec.c |   24 +++++++++++-------------
 1 file changed, 11 insertions(+), 13 deletions(-)

diff --git a/modules/codec/omxil/android_mediacodec.c b/modules/codec/omxil/android_mediacodec.c
index 976ebfe..5d78953 100644
--- a/modules/codec/omxil/android_mediacodec.c
+++ b/modules/codec/omxil/android_mediacodec.c
@@ -1024,9 +1024,7 @@ static picture_t *DecodeVideo(decoder_t *p_dec, block_t **pp_block)
     decoder_sys_t *p_sys = p_dec->p_sys;
     picture_t *p_pic = NULL;
     JNIEnv *env = NULL;
-
-    if (!pp_block || !*pp_block)
-        return NULL;
+    block_t *p_block = pp_block ? *pp_block : NULL;
 
     if (p_sys->error_state)
         goto endclean;
@@ -1034,8 +1032,8 @@ static picture_t *DecodeVideo(decoder_t *p_dec, block_t **pp_block)
     if (!(env = jni_get_env(THREAD_NAME)))
         goto endclean;
 
-    if ((*pp_block)->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED)) {
-        block_Release(*pp_block);
+    if (p_block && p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED)) {
+        block_Release(p_block);
         *pp_block = NULL;
         p_sys->i_preroll_end = 0;
         timestamp_FifoEmpty(p_sys->timestamp_fifo);
@@ -1068,12 +1066,11 @@ static picture_t *DecodeVideo(decoder_t *p_dec, block_t **pp_block)
     jlong timeout = 0;
     int i_output_ret = 0;
     int i_input_ret = 0;
-    /* return when pp_block is processed or when we got an output pic */
-    while (i_input_ret != 1 && i_output_ret != 1) {
-        if (i_input_ret == 0) {
-            i_input_ret = PutInput(p_dec, env, *pp_block, timeout);
+    do {
+        if (p_block && i_input_ret == 0) {
+            i_input_ret = PutInput(p_dec, env, p_block, timeout);
             if (i_input_ret == 1) {
-                block_Release(*pp_block);
+                block_Release(p_block);
                 *pp_block = NULL;
             } else if (i_input_ret == -1) {
                 p_sys->error_state = true;
@@ -1117,13 +1114,14 @@ static picture_t *DecodeVideo(decoder_t *p_dec, block_t **pp_block)
             }
         }
         timeout = 10 * 1000; // 10 ms
-    }
+        /* loop until input is processed or when we got an output pic */
+    } while (p_block && i_input_ret != 1 && i_output_ret != 1);
 
 endclean:
     if (p_sys->error_state) {
-        if( pp_block && *pp_block )
+        if( p_block )
         {
-            block_Release(*pp_block);
+            block_Release(p_block);
             *pp_block = NULL;
         }
         if (p_pic)



More information about the vlc-commits mailing list