vlc | branch: master | Alexandre Janniaux <alexandre.janni...@gmail.com> | Mon Jul 9 18:30:09 2018 +0200| [71a0e80e40a2c6e4a5d910315cfbba4ecdb15b62] | committer: Jean-Baptiste Kempf
mediacodec: separate configure behaviour from start start was creating the codec, configuring it and eventually starting it in the end. Splitting this behaviour into configure + start allows code sharing with mediacodec encoder. Signed-off-by: Jean-Baptiste Kempf <j...@videolan.org> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=71a0e80e40a2c6e4a5d910315cfbba4ecdb15b62 --- modules/codec/omxil/mediacodec.c | 7 +- modules/codec/omxil/mediacodec.h | 3 +- modules/codec/omxil/mediacodec_jni.c | 146 ++++++++++++++++++++--------------- modules/codec/omxil/mediacodec_ndk.c | 85 +++++++++++--------- 4 files changed, 141 insertions(+), 100 deletions(-) diff --git a/modules/codec/omxil/mediacodec.c b/modules/codec/omxil/mediacodec.c index 284bd5854b..2a87dbe5c0 100644 --- a/modules/codec/omxil/mediacodec.c +++ b/modules/codec/omxil/mediacodec.c @@ -515,7 +515,12 @@ static int StartMediaCodec(decoder_t *p_dec) args.audio.i_channel_count = 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 fe8804cf8e..bcc7d665d4 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 0868086fbb..fa0f66e7ae 100644 --- a/modules/codec/omxil/mediacodec_jni.c +++ b/modules/codec/omxil/mediacodec_jni.c @@ -479,56 +479,9 @@ loopclean: } /***************************************************************************** - * Stop + * ConfigureDecoder *****************************************************************************/ -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, 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; JNIEnv* env = NULL; @@ -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,7 +576,85 @@ 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 bccd380681..c8a8680772 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; _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits