Commit fbc9359d authored by Matthieu Bouron's avatar Matthieu Bouron

lavc/mediacodec: factorize static fields initialization

parent 493db04c
...@@ -958,83 +958,101 @@ struct FFAMediaCodec { ...@@ -958,83 +958,101 @@ struct FFAMediaCodec {
int has_get_i_o_buffer; 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; int attached = 0;
JNIEnv *env = NULL; JNIEnv *env = NULL;
FFAMediaCodec *codec = NULL;
jstring codec_name = NULL;
codec = av_mallocz(sizeof(FFAMediaCodec)); JNI_ATTACH_ENV_OR_RETURN(env, &attached, codec, AVERROR_EXTERNAL);
if (!codec) {
return NULL;
}
codec->class = &amediacodec_class;
env = ff_jni_attach_env(&attached, codec); codec->INFO_TRY_AGAIN_LATER = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.info_try_again_later_id);
if (!env) { if ((ret = ff_jni_exception_check(env, 1, codec)) < 0) {
av_freep(&codec); goto fail;
return NULL;
} }
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; goto fail;
} }
codec_name = ff_jni_utf_chars_to_jstring(env, name, codec); codec->BUFFER_FLAG_END_OF_STREAM = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.buffer_flag_end_of_stream_id);
if (!codec_name) { if ((ret = ff_jni_exception_check(env, 1, codec)) < 0) {
goto fail; goto fail;
} }
codec->object = (*env)->CallStaticObjectMethod(env, codec->jfields.mediacodec_class, codec->jfields.create_by_codec_name_id, codec_name); if (codec->jfields.buffer_flag_key_frame_id) {
if (ff_jni_exception_check(env, 1, codec) < 0) { codec->BUFFER_FLAG_KEY_FRAME = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.buffer_flag_key_frame_id);
goto fail; if ((ret = ff_jni_exception_check(env, 1, codec)) < 0) {
goto fail;
}
} }
codec->object = (*env)->NewGlobalRef(env, codec->object); codec->CONFIGURE_FLAG_ENCODE = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.configure_flag_encode_id);
if (!codec->object) { if ((ret = ff_jni_exception_check(env, 1, codec)) < 0) {
goto fail; goto fail;
} }
codec->INFO_TRY_AGAIN_LATER = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.info_try_again_later_id); 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; goto fail;
} }
codec->BUFFER_FLAG_CODEC_CONFIG = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.buffer_flag_codec_config_id); 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) { if ((ret = ff_jni_exception_check(env, 1, codec)) < 0) {
goto fail; goto fail;
} }
codec->BUFFER_FLAG_END_OF_STREAM = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.buffer_flag_end_of_stream_id); 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 ((ret = ff_jni_exception_check(env, 1, codec)) < 0) {
goto fail; goto fail;
} }
if (codec->jfields.buffer_flag_key_frame_id) { fail:
codec->BUFFER_FLAG_KEY_FRAME = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.buffer_flag_key_frame_id); JNI_DETACH_ENV(attached, NULL);
if (ff_jni_exception_check(env, 1, codec) < 0) {
goto fail; 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); env = ff_jni_attach_env(&attached, codec);
if (ff_jni_exception_check(env, 1, codec) < 0) { if (!env) {
av_freep(&codec);
return NULL;
}
if (ff_jni_init_jfields(env, &codec->jfields, jni_amediacodec_mapping, 1, codec) < 0) {
goto fail; goto fail;
} }
codec->INFO_TRY_AGAIN_LATER = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.info_try_again_later_id); codec_name = ff_jni_utf_chars_to_jstring(env, name, codec);
if (ff_jni_exception_check(env, 1, codec) < 0) { if (!codec_name) {
goto fail; 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) { if (ff_jni_exception_check(env, 1, codec) < 0) {
goto fail; goto fail;
} }
codec->INFO_OUTPUT_FORMAT_CHANGED = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.info_output_format_changed_id); codec->object = (*env)->NewGlobalRef(env, codec->object);
if (ff_jni_exception_check(env, 1, codec) < 0) { if (!codec->object) {
goto fail;
}
if (codec_init_static_fields(codec) < 0) {
goto fail; goto fail;
} }
...@@ -1093,40 +1111,7 @@ FFAMediaCodec* ff_AMediaCodec_createDecoderByType(const char *mime) ...@@ -1093,40 +1111,7 @@ FFAMediaCodec* ff_AMediaCodec_createDecoderByType(const char *mime)
goto fail; goto fail;
} }
codec->BUFFER_FLAG_CODEC_CONFIG = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.buffer_flag_codec_config_id); if (codec_init_static_fields(codec) < 0) {
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) {
goto fail; goto fail;
} }
...@@ -1189,45 +1174,7 @@ FFAMediaCodec* ff_AMediaCodec_createEncoderByType(const char *mime) ...@@ -1189,45 +1174,7 @@ FFAMediaCodec* ff_AMediaCodec_createEncoderByType(const char *mime)
goto fail; goto fail;
} }
codec->INFO_TRY_AGAIN_LATER = (*env)->GetStaticIntField(env, codec->jfields.mediacodec_class, codec->jfields.info_try_again_later_id); if (codec_init_static_fields(codec) < 0) {
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) {
goto fail; goto fail;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment