From fbc9359d859fd45e9a2ed0a9259b54459c0820fd Mon Sep 17 00:00:00 2001 From: Matthieu Bouron Date: Tue, 17 May 2016 10:26:48 +0200 Subject: [PATCH] lavc/mediacodec: factorize static fields initialization --- libavcodec/mediacodec_wrapper.c | 167 +++++++++++--------------------- 1 file changed, 57 insertions(+), 110 deletions(-) diff --git a/libavcodec/mediacodec_wrapper.c b/libavcodec/mediacodec_wrapper.c index 6b3f905205..0f9dcbafa0 100644 --- a/libavcodec/mediacodec_wrapper.c +++ b/libavcodec/mediacodec_wrapper.c @@ -958,83 +958,101 @@ struct FFAMediaCodec { int has_get_i_o_buffer; }; -FFAMediaCodec* ff_AMediaCodec_createCodecByName(const char *name) +static int codec_init_static_fields(FFAMediaCodec *codec) { + int ret = 0; int attached = 0; JNIEnv *env = NULL; - FFAMediaCodec *codec = NULL; - jstring codec_name = NULL; - codec = av_mallocz(sizeof(FFAMediaCodec)); - if (!codec) { - return NULL; - } - codec->class = &amediacodec_class; + JNI_ATTACH_ENV_OR_RETURN(env, &attached, codec, AVERROR_EXTERNAL); - env = ff_jni_attach_env(&attached, codec); - if (!env) { - av_freep(&codec); - return NULL; + codec->INFO_TRY_AGAIN_LATER = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.info_try_again_later_id); + if ((ret = ff_jni_exception_check(env, 1, codec)) < 0) { + goto fail; } - if (ff_jni_init_jfields(env, &codec->jfields, jni_amediacodec_mapping, 1, codec) < 0) { + codec->BUFFER_FLAG_CODEC_CONFIG = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.buffer_flag_codec_config_id); + if ((ret = ff_jni_exception_check(env, 1, codec)) < 0) { goto fail; } - codec_name = ff_jni_utf_chars_to_jstring(env, name, codec); - if (!codec_name) { + codec->BUFFER_FLAG_END_OF_STREAM = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.buffer_flag_end_of_stream_id); + if ((ret = ff_jni_exception_check(env, 1, codec)) < 0) { goto fail; } - codec->object = (*env)->CallStaticObjectMethod(env, codec->jfields.mediacodec_class, codec->jfields.create_by_codec_name_id, codec_name); - if (ff_jni_exception_check(env, 1, codec) < 0) { - goto fail; + if (codec->jfields.buffer_flag_key_frame_id) { + codec->BUFFER_FLAG_KEY_FRAME = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.buffer_flag_key_frame_id); + if ((ret = ff_jni_exception_check(env, 1, codec)) < 0) { + goto fail; + } } - codec->object = (*env)->NewGlobalRef(env, codec->object); - if (!codec->object) { + codec->CONFIGURE_FLAG_ENCODE = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.configure_flag_encode_id); + if ((ret = ff_jni_exception_check(env, 1, codec)) < 0) { goto fail; } codec->INFO_TRY_AGAIN_LATER = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.info_try_again_later_id); - if (ff_jni_exception_check(env, 1, codec) < 0) { + if ((ret = ff_jni_exception_check(env, 1, codec)) < 0) { goto fail; } - codec->BUFFER_FLAG_CODEC_CONFIG = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.buffer_flag_codec_config_id); - if (ff_jni_exception_check(env, 1, codec) < 0) { + codec->INFO_OUTPUT_BUFFERS_CHANGED = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.info_output_buffers_changed_id); + if ((ret = ff_jni_exception_check(env, 1, codec)) < 0) { goto fail; } - codec->BUFFER_FLAG_END_OF_STREAM = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.buffer_flag_end_of_stream_id); - if (ff_jni_exception_check(env, 1, codec) < 0) { + codec->INFO_OUTPUT_FORMAT_CHANGED = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.info_output_format_changed_id); + if ((ret = ff_jni_exception_check(env, 1, codec)) < 0) { goto fail; } - if (codec->jfields.buffer_flag_key_frame_id) { - codec->BUFFER_FLAG_KEY_FRAME = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.buffer_flag_key_frame_id); - if (ff_jni_exception_check(env, 1, codec) < 0) { - goto fail; - } +fail: + JNI_DETACH_ENV(attached, NULL); + + return ret; +} + +FFAMediaCodec* ff_AMediaCodec_createCodecByName(const char *name) +{ + int attached = 0; + JNIEnv *env = NULL; + FFAMediaCodec *codec = NULL; + jstring codec_name = NULL; + + codec = av_mallocz(sizeof(FFAMediaCodec)); + if (!codec) { + return NULL; } + codec->class = &amediacodec_class; - codec->CONFIGURE_FLAG_ENCODE = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.configure_flag_encode_id); - if (ff_jni_exception_check(env, 1, codec) < 0) { + env = ff_jni_attach_env(&attached, codec); + if (!env) { + av_freep(&codec); + return NULL; + } + + if (ff_jni_init_jfields(env, &codec->jfields, jni_amediacodec_mapping, 1, codec) < 0) { goto fail; } - codec->INFO_TRY_AGAIN_LATER = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.info_try_again_later_id); - if (ff_jni_exception_check(env, 1, codec) < 0) { + codec_name = ff_jni_utf_chars_to_jstring(env, name, codec); + if (!codec_name) { goto fail; } - codec->INFO_OUTPUT_BUFFERS_CHANGED = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.info_output_buffers_changed_id); + codec->object = (*env)->CallStaticObjectMethod(env, codec->jfields.mediacodec_class, codec->jfields.create_by_codec_name_id, codec_name); if (ff_jni_exception_check(env, 1, codec) < 0) { goto fail; } - codec->INFO_OUTPUT_FORMAT_CHANGED = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.info_output_format_changed_id); - if (ff_jni_exception_check(env, 1, codec) < 0) { + codec->object = (*env)->NewGlobalRef(env, codec->object); + if (!codec->object) { + goto fail; + } + + if (codec_init_static_fields(codec) < 0) { goto fail; } @@ -1093,40 +1111,7 @@ FFAMediaCodec* ff_AMediaCodec_createDecoderByType(const char *mime) goto fail; } - codec->BUFFER_FLAG_CODEC_CONFIG = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.buffer_flag_codec_config_id); - if (ff_jni_exception_check(env, 1, codec) < 0) { - goto fail; - } - - codec->BUFFER_FLAG_END_OF_STREAM = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.buffer_flag_end_of_stream_id); - if (ff_jni_exception_check(env, 1, codec) < 0) { - goto fail; - } - - if (codec->jfields.buffer_flag_key_frame_id) { - codec->BUFFER_FLAG_KEY_FRAME = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.buffer_flag_key_frame_id); - if (ff_jni_exception_check(env, 1, codec) < 0) { - goto fail; - } - } - - codec->CONFIGURE_FLAG_ENCODE = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.configure_flag_encode_id); - if (ff_jni_exception_check(env, 1, codec) < 0) { - goto fail; - } - - codec->INFO_TRY_AGAIN_LATER = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.info_try_again_later_id); - if (ff_jni_exception_check(env, 1, codec) < 0) { - goto fail; - } - - codec->INFO_OUTPUT_BUFFERS_CHANGED = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.info_output_buffers_changed_id); - if (ff_jni_exception_check(env, 1, codec) < 0) { - goto fail; - } - - codec->INFO_OUTPUT_FORMAT_CHANGED = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.info_output_format_changed_id); - if (ff_jni_exception_check(env, 1, codec) < 0) { + if (codec_init_static_fields(codec) < 0) { goto fail; } @@ -1189,45 +1174,7 @@ FFAMediaCodec* ff_AMediaCodec_createEncoderByType(const char *mime) goto fail; } - codec->INFO_TRY_AGAIN_LATER = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.info_try_again_later_id); - if (ff_jni_exception_check(env, 1, codec) < 0) { - goto fail; - } - - codec->BUFFER_FLAG_CODEC_CONFIG = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.buffer_flag_codec_config_id); - if (ff_jni_exception_check(env, 1, codec) < 0) { - goto fail; - } - - codec->BUFFER_FLAG_END_OF_STREAM = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.buffer_flag_end_of_stream_id); - if (ff_jni_exception_check(env, 1, codec) < 0) { - goto fail; - } - - if (codec->jfields.buffer_flag_key_frame_id) { - codec->BUFFER_FLAG_KEY_FRAME = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.buffer_flag_key_frame_id); - if (ff_jni_exception_check(env, 1, codec) < 0) { - goto fail; - } - } - - codec->CONFIGURE_FLAG_ENCODE = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.configure_flag_encode_id); - if (ff_jni_exception_check(env, 1, codec) < 0) { - goto fail; - } - - codec->INFO_TRY_AGAIN_LATER = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.info_try_again_later_id); - if (ff_jni_exception_check(env, 1, codec) < 0) { - goto fail; - } - - codec->INFO_OUTPUT_BUFFERS_CHANGED = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.info_output_buffers_changed_id); - if (ff_jni_exception_check(env, 1, codec) < 0) { - goto fail; - } - - codec->INFO_OUTPUT_FORMAT_CHANGED = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.info_output_format_changed_id); - if (ff_jni_exception_check(env, 1, codec) < 0) { + if (codec_init_static_fields(codec) < 0) { goto fail; }