--- libavcodec/mediacodec_wrapper.c | 262 +++++++++++----------------------------- 1 file changed, 70 insertions(+), 192 deletions(-)
diff --git a/libavcodec/mediacodec_wrapper.c b/libavcodec/mediacodec_wrapper.c index f34450a6d8..4660e895ca 100644 --- a/libavcodec/mediacodec_wrapper.c +++ b/libavcodec/mediacodec_wrapper.c @@ -1132,200 +1132,78 @@ fail: return ret; } -FFAMediaCodec* ff_AMediaCodec_createCodecByName(const char *name) -{ - int ret = -1; - JNIEnv *env = NULL; - FFAMediaCodec *codec = NULL; - jstring codec_name = NULL; - jobject object = NULL; - - codec = av_mallocz(sizeof(FFAMediaCodec)); - if (!codec) { - return NULL; - } - codec->class = &amediacodec_class; - - env = ff_jni_get_env(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_name = ff_jni_utf_chars_to_jstring(env, name, codec); - if (!codec_name) { - goto fail; - } - - 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->object = (*env)->NewGlobalRef(env, object); - if (!codec->object) { - goto fail; - } - - if (codec_init_static_fields(codec) < 0) { - goto fail; - } - - if (codec->jfields.get_input_buffer_id && codec->jfields.get_output_buffer_id) { - codec->has_get_i_o_buffer = 1; - } - - ret = 0; -fail: - if (codec_name) { - (*env)->DeleteLocalRef(env, codec_name); - } - - if (object) { - (*env)->DeleteLocalRef(env, object); - } - - if (ret < 0) { - ff_jni_reset_jfields(env, &codec->jfields, jni_amediacodec_mapping, 1, codec); - av_freep(&codec); - } - - return codec; +#define DECLARE_FF_AMEDIACODEC_CREATE_FUNC(func, jfunc) \ +FFAMediaCodec* ff_AMediaCodec_##func(const char *arg) \ +{ \ + int ret = -1; \ + JNIEnv *env = NULL; \ + FFAMediaCodec *codec = NULL; \ + jstring jarg = NULL; \ + jobject object = NULL; \ + \ + codec = av_mallocz(sizeof(FFAMediaCodec)); \ + if (!codec) { \ + return NULL; \ + } \ + codec->class = &amediacodec_class; \ + \ + env = ff_jni_get_env(codec); \ + if (!env) { \ + av_freep(&codec); \ + return NULL; \ + } \ + \ + if (ff_jni_init_jfields(env, &codec->jfields, jni_amediacodec_mapping, 1, codec) < 0) { \ + goto fail; \ + } \ + \ + jarg = ff_jni_utf_chars_to_jstring(env, arg, codec); \ + if (!jarg) { \ + goto fail; \ + } \ + \ + object = (*env)->CallStaticObjectMethod(env, \ + codec->jfields.mediacodec_class, \ + codec->jfields.jfunc, \ + jarg); \ + if (ff_jni_exception_check(env, 1, codec) < 0) { \ + goto fail; \ + } \ + \ + codec->object = (*env)->NewGlobalRef(env, object); \ + if (!codec->object) { \ + goto fail; \ + } \ + \ + if (codec_init_static_fields(codec) < 0) { \ + goto fail; \ + } \ + \ + if (codec->jfields.get_input_buffer_id && codec->jfields.get_output_buffer_id) { \ + codec->has_get_i_o_buffer = 1; \ + } \ + \ + ret = 0; \ +fail: \ + if (jarg) { \ + (*env)->DeleteLocalRef(env, jarg); \ + } \ + \ + if (object) { \ + (*env)->DeleteLocalRef(env, object); \ + } \ + \ + if (ret < 0) { \ + ff_jni_reset_jfields(env, &codec->jfields, jni_amediacodec_mapping, 1, codec); \ + av_freep(&codec); \ + } \ + \ + return codec; \ } -FFAMediaCodec* ff_AMediaCodec_createDecoderByType(const char *mime) -{ - int ret = -1; - JNIEnv *env = NULL; - FFAMediaCodec *codec = NULL; - jstring mime_type = NULL; - jobject object = NULL; - - codec = av_mallocz(sizeof(FFAMediaCodec)); - if (!codec) { - return NULL; - } - codec->class = &amediacodec_class; - - env = ff_jni_get_env(codec); - if (!env) { - av_freep(&codec); - return NULL; - } - - if (ff_jni_init_jfields(env, &codec->jfields, jni_amediacodec_mapping, 1, codec) < 0) { - goto fail; - } - - mime_type = ff_jni_utf_chars_to_jstring(env, mime, codec); - if (!mime_type) { - goto fail; - } - - object = (*env)->CallStaticObjectMethod(env, codec->jfields.mediacodec_class, codec->jfields.create_decoder_by_type_id, mime_type); - if (ff_jni_exception_check(env, 1, codec) < 0) { - goto fail; - } - - codec->object = (*env)->NewGlobalRef(env, object); - if (!codec->object) { - goto fail; - } - - if (codec_init_static_fields(codec) < 0) { - goto fail; - } - - if (codec->jfields.get_input_buffer_id && codec->jfields.get_output_buffer_id) { - codec->has_get_i_o_buffer = 1; - } - - ret = 0; -fail: - if (mime_type) { - (*env)->DeleteLocalRef(env, mime_type); - } - - if (object) { - (*env)->DeleteLocalRef(env, object); - } - - if (ret < 0) { - ff_jni_reset_jfields(env, &codec->jfields, jni_amediacodec_mapping, 1, codec); - av_freep(&codec); - } - - return codec; -} - -FFAMediaCodec* ff_AMediaCodec_createEncoderByType(const char *mime) -{ - int ret = -1; - JNIEnv *env = NULL; - FFAMediaCodec *codec = NULL; - jstring mime_type = NULL; - jobject object = NULL; - - codec = av_mallocz(sizeof(FFAMediaCodec)); - if (!codec) { - return NULL; - } - codec->class = &amediacodec_class; - - env = ff_jni_get_env(codec); - if (!env) { - av_freep(&codec); - return NULL; - } - - if (ff_jni_init_jfields(env, &codec->jfields, jni_amediacodec_mapping, 1, codec) < 0) { - goto fail; - } - - mime_type = ff_jni_utf_chars_to_jstring(env, mime, codec); - if (!mime_type) { - goto fail; - } - - object = (*env)->CallStaticObjectMethod(env, codec->jfields.mediacodec_class, codec->jfields.create_encoder_by_type_id, mime_type); - if (ff_jni_exception_check(env, 1, codec) < 0) { - goto fail; - } - - codec->object = (*env)->NewGlobalRef(env, object); - if (!codec->object) { - goto fail; - } - - if (codec_init_static_fields(codec) < 0) { - goto fail; - } - - if (codec->jfields.get_input_buffer_id && codec->jfields.get_output_buffer_id) { - codec->has_get_i_o_buffer = 1; - } - - ret = 0; -fail: - if (mime_type) { - (*env)->DeleteLocalRef(env, mime_type); - } - - if (object) { - (*env)->DeleteLocalRef(env, object); - } - - if (ret < 0) { - ff_jni_reset_jfields(env, &codec->jfields, jni_amediacodec_mapping, 1, codec); - av_freep(&codec); - } - - return codec; -} +DECLARE_FF_AMEDIACODEC_CREATE_FUNC(createCodecByName, create_by_codec_name_id) +DECLARE_FF_AMEDIACODEC_CREATE_FUNC(createDecoderByType, create_decoder_by_type_id) +DECLARE_FF_AMEDIACODEC_CREATE_FUNC(createEncoderByType, create_encoder_by_type_id) int ff_AMediaCodec_delete(FFAMediaCodec* codec) { -- 2.15.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel