[vlc-devel] [PATCH 2/2] mediacodec: separate configure behaviour from start

Alexandre Janniaux alexandre.janniaux at gmail.com
Mon May 28 12:02:46 CEST 2018


start was creating the codec, configuring it and eventually starting it
in the end. Splitting this behaviour into configure + start allows for sharing
code with mediacodec encoder.
---
 modules/codec/omxil/mediacodec.c     |   7 +-
 modules/codec/omxil/mediacodec.h     |   3 +-
 modules/codec/omxil/mediacodec_jni.c | 148 +++++++++++++++------------
 modules/codec/omxil/mediacodec_ndk.c |  85 ++++++++-------
 4 files changed, 142 insertions(+), 101 deletions(-)

diff --git a/modules/codec/omxil/mediacodec.c b/modules/codec/omxil/mediacodec.c
index 3d4a50e37c..77638fc986 100644
--- a/modules/codec/omxil/mediacodec.c
+++ b/modules/codec/omxil/mediacodec.c
@@ -511,7 +511,12 @@ static int StartMediaCodec(decoder_t *p_dec)
         args.audio.i_channel_count  = p_dec->p_sys->audio.i_channels;
     }
 
-    return p_sys->api.start(&p_sys->api, &args);
+    if (p_sys->api.configure_decoder(&p_sys->api, &args) != 0)
+    {
+        return MC_API_ERROR;
+    }
+
+    return p_sys->api.start(&p_sys->api);
 }
 
 /*****************************************************************************
diff --git a/modules/codec/omxil/mediacodec.h b/modules/codec/omxil/mediacodec.h
index 431f93a916..2be28b83ff 100644
--- a/modules/codec/omxil/mediacodec.h
+++ b/modules/codec/omxil/mediacodec.h
@@ -126,7 +126,8 @@ struct mc_api
 
     void (*clean)(mc_api *);
     int (*prepare)(mc_api *, int i_profile);
-    int (*start)(mc_api *, union mc_api_args *p_args);
+    int (*configure_decoder)(mc_api *, union mc_api_args* p_args);
+    int (*start)(mc_api *);
     int (*stop)(mc_api *);
     int (*flush)(mc_api *);
 
diff --git a/modules/codec/omxil/mediacodec_jni.c b/modules/codec/omxil/mediacodec_jni.c
index b8bfc5a08b..3e65c7ca95 100644
--- a/modules/codec/omxil/mediacodec_jni.c
+++ b/modules/codec/omxil/mediacodec_jni.c
@@ -479,58 +479,11 @@ loopclean:
 }
 
 /*****************************************************************************
- * Stop
- *****************************************************************************/
-static int Stop(mc_api *api)
-{
-    mc_api_sys *p_sys = api->p_sys;
-    JNIEnv *env;
-
-    api->b_direct_rendering = false;
-
-    GET_ENV();
-
-    if (p_sys->input_buffers)
-    {
-        (*env)->DeleteGlobalRef(env, p_sys->input_buffers);
-        p_sys->input_buffers = NULL;
-    }
-    if (p_sys->output_buffers)
-    {
-        (*env)->DeleteGlobalRef(env, p_sys->output_buffers);
-        p_sys->output_buffers = NULL;
-    }
-    if (p_sys->codec)
-    {
-        if (api->b_started)
-        {
-            (*env)->CallVoidMethod(env, p_sys->codec, jfields.stop);
-            if (CHECK_EXCEPTION())
-                msg_Err(api->p_obj, "Exception in MediaCodec.stop");
-            api->b_started = false;
-        }
-
-        (*env)->CallVoidMethod(env, p_sys->codec, jfields.release);
-        if (CHECK_EXCEPTION())
-            msg_Err(api->p_obj, "Exception in MediaCodec.release");
-        (*env)->DeleteGlobalRef(env, p_sys->codec);
-        p_sys->codec = NULL;
-    }
-    if (p_sys->buffer_info)
-    {
-        (*env)->DeleteGlobalRef(env, p_sys->buffer_info);
-        p_sys->buffer_info = NULL;
-    }
-    msg_Dbg(api->p_obj, "MediaCodec via JNI closed");
-    return 0;
-}
-
-/*****************************************************************************
- * Start
+ * ConfigureDecoder
  *****************************************************************************/
-static int Start(mc_api *api, union mc_api_args *p_args)
+static int ConfigureDecoder(mc_api *api, union mc_api_args* p_args)
 {
-    mc_api_sys *p_sys = api->p_sys;
+     mc_api_sys *p_sys = api->p_sys;
     JNIEnv* env = NULL;
     int i_ret = MC_API_ERROR;
     bool b_direct_rendering = false;
@@ -538,9 +491,6 @@ static int Start(mc_api *api, union mc_api_args *p_args)
     jstring jcodec_name = NULL;
     jobject jcodec = NULL;
     jobject jformat = NULL;
-    jobject jinput_buffers = NULL;
-    jobject joutput_buffers = NULL;
-    jobject jbuffer_info = NULL;
     jobject jsurface = NULL;
 
     assert(api->psz_mime && api->psz_name);
@@ -599,6 +549,7 @@ static int Start(mc_api *api, union mc_api_args *p_args)
                                                  p_args->audio.i_sample_rate,
                                                  p_args->audio.i_channel_count);
     }
+
     /* No limits for input size */
     SET_INTEGER(jformat, "max-input-size", 0);
 
@@ -613,6 +564,8 @@ static int Start(mc_api *api, union mc_api_args *p_args)
                                  "with an output surface.");
             goto error;
         }
+
+        api->b_direct_rendering = b_direct_rendering;
     }
     else
     {
@@ -623,8 +576,86 @@ static int Start(mc_api *api, union mc_api_args *p_args)
             msg_Warn(api->p_obj, "Exception occurred in MediaCodec.configure");
             goto error;
         }
+        api->b_direct_rendering = false;
     }
 
+    i_ret = 0;
+
+error:
+    if (jmime)
+        (*env)->DeleteLocalRef(env, jmime);
+    if (jcodec_name)
+        (*env)->DeleteLocalRef(env, jcodec_name);
+    if (jcodec)
+        (*env)->DeleteLocalRef(env, jcodec);
+    if (jformat)
+        (*env)->DeleteLocalRef(env, jformat);
+
+    return i_ret;
+}
+
+/*****************************************************************************
+ * Stop
+ *****************************************************************************/
+static int Stop(mc_api *api)
+{
+    mc_api_sys *p_sys = api->p_sys;
+    JNIEnv *env;
+
+    api->b_direct_rendering = false;
+
+    GET_ENV();
+
+    if (p_sys->input_buffers)
+    {
+        (*env)->DeleteGlobalRef(env, p_sys->input_buffers);
+        p_sys->input_buffers = NULL;
+    }
+    if (p_sys->output_buffers)
+    {
+        (*env)->DeleteGlobalRef(env, p_sys->output_buffers);
+        p_sys->output_buffers = NULL;
+    }
+    if (p_sys->codec)
+    {
+        if (api->b_started)
+        {
+            (*env)->CallVoidMethod(env, p_sys->codec, jfields.stop);
+            if (CHECK_EXCEPTION())
+                msg_Err(api->p_obj, "Exception in MediaCodec.stop");
+            api->b_started = false;
+        }
+
+        (*env)->CallVoidMethod(env, p_sys->codec, jfields.release);
+        if (CHECK_EXCEPTION())
+            msg_Err(api->p_obj, "Exception in MediaCodec.release");
+        (*env)->DeleteGlobalRef(env, p_sys->codec);
+        p_sys->codec = NULL;
+    }
+    if (p_sys->buffer_info)
+    {
+        (*env)->DeleteGlobalRef(env, p_sys->buffer_info);
+        p_sys->buffer_info = NULL;
+    }
+    msg_Dbg(api->p_obj, "MediaCodec via JNI closed");
+    return 0;
+}
+
+/*****************************************************************************
+ * Start
+ *****************************************************************************/
+static int Start(mc_api *api)
+{
+    mc_api_sys *p_sys = api->p_sys;
+    JNIEnv* env = NULL;
+    jobject jinput_buffers = NULL;
+    jobject joutput_buffers = NULL;
+    jobject jbuffer_info = NULL;
+
+    GET_ENV();
+
+    int i_ret = MC_API_ERROR;
+
     (*env)->CallVoidMethod(env, p_sys->codec, jfields.start);
     if (CHECK_EXCEPTION())
     {
@@ -635,7 +666,6 @@ static int Start(mc_api *api, union mc_api_args *p_args)
 
     if (jfields.get_input_buffers && jfields.get_output_buffers)
     {
-
         jinput_buffers = (*env)->CallObjectMethod(env, p_sys->codec,
                                                   jfields.get_input_buffers);
         if (CHECK_EXCEPTION())
@@ -658,19 +688,10 @@ static int Start(mc_api *api, union mc_api_args *p_args)
                                      jfields.buffer_info_ctor);
     p_sys->buffer_info = (*env)->NewGlobalRef(env, jbuffer_info);
 
-    api->b_direct_rendering = b_direct_rendering;
     i_ret = 0;
     msg_Dbg(api->p_obj, "MediaCodec via JNI opened");
 
 error:
-    if (jmime)
-        (*env)->DeleteLocalRef(env, jmime);
-    if (jcodec_name)
-        (*env)->DeleteLocalRef(env, jcodec_name);
-    if (jcodec)
-        (*env)->DeleteLocalRef(env, jcodec);
-    if (jformat)
-        (*env)->DeleteLocalRef(env, jformat);
     if (jinput_buffers)
         (*env)->DeleteLocalRef(env, jinput_buffers);
     if (joutput_buffers)
@@ -1022,6 +1043,7 @@ int MediaCodecJni_Init(mc_api *api)
 
     api->clean = Clean;
     api->prepare = Prepare;
+    api->configure_decoder = ConfigureDecoder;
     api->start = Start;
     api->stop = Stop;
     api->flush = Flush;
diff --git a/modules/codec/omxil/mediacodec_ndk.c b/modules/codec/omxil/mediacodec_ndk.c
index bc876acb07..6cf0ba74ff 100644
--- a/modules/codec/omxil/mediacodec_ndk.c
+++ b/modules/codec/omxil/mediacodec_ndk.c
@@ -279,41 +279,11 @@ struct mc_api_sys
 };
 
 /*****************************************************************************
- * Stop
- *****************************************************************************/
-static int Stop(mc_api *api)
-{
-    mc_api_sys *p_sys = api->p_sys;
-
-    api->b_direct_rendering = false;
-
-    if (p_sys->p_codec)
-    {
-        if (api->b_started)
-        {
-            syms.AMediaCodec.stop(p_sys->p_codec);
-            api->b_started = false;
-        }
-        syms.AMediaCodec.delete(p_sys->p_codec);
-        p_sys->p_codec = NULL;
-    }
-    if (p_sys->p_format)
-    {
-        syms.AMediaFormat.delete(p_sys->p_format);
-        p_sys->p_format = NULL;
-    }
-
-    msg_Dbg(api->p_obj, "MediaCodec via NDK closed");
-    return 0;
-}
-
-/*****************************************************************************
- * Start
+ * ConfigureDecoder
  *****************************************************************************/
-static int Start(mc_api *api, union mc_api_args *p_args)
+static int ConfigureDecoder(mc_api *api, union mc_api_args *p_args)
 {
     mc_api_sys *p_sys = api->p_sys;
-    int i_ret = MC_API_ERROR;
     ANativeWindow *p_anw = NULL;
 
     assert(api->psz_mime && api->psz_name);
@@ -323,14 +293,14 @@ static int Start(mc_api *api, union mc_api_args *p_args)
     {
         msg_Err(api->p_obj, "AMediaCodec.createCodecByName for %s failed",
                 api->psz_name);
-        goto error;
+        return MC_API_ERROR;
     }
 
     p_sys->p_format = syms.AMediaFormat.new();
     if (!p_sys->p_format)
     {
         msg_Err(api->p_obj, "AMediaFormat.new failed");
-        goto error;
+        return MC_API_ERROR;
     }
 
     syms.AMediaFormat.setInt32(p_sys->p_format, "encoder", 0);
@@ -363,8 +333,51 @@ static int Start(mc_api *api, union mc_api_args *p_args)
                                    p_anw, NULL, 0) != AMEDIA_OK)
     {
         msg_Err(api->p_obj, "AMediaCodec.configure failed");
-        goto error;
+        return MC_API_ERROR;
+    }
+
+    api->b_direct_rendering = !!p_anw;
+
+    return 0;
+}
+
+/*****************************************************************************
+ * Stop
+ *****************************************************************************/
+static int Stop(mc_api *api)
+{
+    mc_api_sys *p_sys = api->p_sys;
+
+    api->b_direct_rendering = false;
+
+    if (p_sys->p_codec)
+    {
+        if (api->b_started)
+        {
+            syms.AMediaCodec.stop(p_sys->p_codec);
+            api->b_started = false;
+        }
+        syms.AMediaCodec.delete(p_sys->p_codec);
+        p_sys->p_codec = NULL;
+    }
+    if (p_sys->p_format)
+    {
+        syms.AMediaFormat.delete(p_sys->p_format);
+        p_sys->p_format = NULL;
     }
+
+    msg_Dbg(api->p_obj, "MediaCodec via NDK closed");
+    return 0;
+}
+
+/*****************************************************************************
+ * Start
+ *****************************************************************************/
+static int Start(mc_api *api)
+{
+    mc_api_sys *p_sys = api->p_sys;
+    int i_ret = MC_API_ERROR;
+
     if (syms.AMediaCodec.start(p_sys->p_codec) != AMEDIA_OK)
     {
         msg_Err(api->p_obj, "AMediaCodec.start failed");
@@ -372,7 +385,6 @@ static int Start(mc_api *api, union mc_api_args *p_args)
     }
 
     api->b_started = true;
-    api->b_direct_rendering = !!p_anw;
     i_ret = 0;
 
     msg_Dbg(api->p_obj, "MediaCodec via NDK opened");
@@ -634,6 +646,7 @@ int MediaCodecNdk_Init(mc_api *api)
 
     api->clean = Clean;
     api->prepare = Prepare;
+    api->configure_decoder = ConfigureDecoder;
     api->start = Start;
     api->stop = Stop;
     api->flush = Flush;
-- 
2.17.0



More information about the vlc-devel mailing list