Commit f3cffd12 authored by Matthieu Bouron's avatar Matthieu Bouron

lavc/mediacodec_wrapper: factorize MediaCodec creation functions

parent 8bf4e6d3
...@@ -1132,13 +1132,18 @@ fail: ...@@ -1132,13 +1132,18 @@ fail:
return ret; return ret;
} }
FFAMediaCodec* ff_AMediaCodec_createCodecByName(const char *name) #define CREATE_CODEC_BY_NAME 0
#define CREATE_DECODER_BY_TYPE 1
#define CREATE_ENCODER_BY_TYPE 2
static inline FFAMediaCodec *codec_create(int method, const char *arg)
{ {
int ret = -1; int ret = -1;
JNIEnv *env = NULL; JNIEnv *env = NULL;
FFAMediaCodec *codec = NULL; FFAMediaCodec *codec = NULL;
jstring codec_name = NULL; jstring jarg = NULL;
jobject object = NULL; jobject object = NULL;
jmethodID create_id = NULL;
codec = av_mallocz(sizeof(FFAMediaCodec)); codec = av_mallocz(sizeof(FFAMediaCodec));
if (!codec) { if (!codec) {
...@@ -1156,77 +1161,23 @@ FFAMediaCodec* ff_AMediaCodec_createCodecByName(const char *name) ...@@ -1156,77 +1161,23 @@ FFAMediaCodec* ff_AMediaCodec_createCodecByName(const char *name)
goto fail; goto fail;
} }
codec_name = ff_jni_utf_chars_to_jstring(env, name, codec); jarg = ff_jni_utf_chars_to_jstring(env, arg, codec);
if (!codec_name) { if (!jarg) {
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;
}
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; goto fail;
} }
mime_type = ff_jni_utf_chars_to_jstring(env, mime, codec); switch (method) {
if (!mime_type) { case CREATE_CODEC_BY_NAME: create_id = codec->jfields.create_by_codec_name_id; break;
goto fail; case CREATE_DECODER_BY_TYPE: create_id = codec->jfields.create_decoder_by_type_id; break;
case CREATE_ENCODER_BY_TYPE: create_id = codec->jfields.create_encoder_by_type_id; break;
default:
av_assert0(0);
} }
object = (*env)->CallStaticObjectMethod(env, codec->jfields.mediacodec_class, codec->jfields.create_decoder_by_type_id, mime_type); object = (*env)->CallStaticObjectMethod(env,
codec->jfields.mediacodec_class,
create_id,
jarg);
if (ff_jni_exception_check(env, 1, codec) < 0) { if (ff_jni_exception_check(env, 1, codec) < 0) {
goto fail; goto fail;
} }
...@@ -1246,8 +1197,8 @@ FFAMediaCodec* ff_AMediaCodec_createDecoderByType(const char *mime) ...@@ -1246,8 +1197,8 @@ FFAMediaCodec* ff_AMediaCodec_createDecoderByType(const char *mime)
ret = 0; ret = 0;
fail: fail:
if (mime_type) { if (jarg) {
(*env)->DeleteLocalRef(env, mime_type); (*env)->DeleteLocalRef(env, jarg);
} }
if (object) { if (object) {
...@@ -1262,70 +1213,15 @@ fail: ...@@ -1262,70 +1213,15 @@ fail:
return codec; return codec;
} }
FFAMediaCodec* ff_AMediaCodec_createEncoderByType(const char *mime) #define DECLARE_FF_AMEDIACODEC_CREATE_FUNC(name, method) \
{ FFAMediaCodec *ff_AMediaCodec_##name(const char *arg) \
int ret = -1; { \
JNIEnv *env = NULL; return codec_create(method, arg); \
FFAMediaCodec *codec = NULL; } \
jstring mime_type = NULL;
jobject object = NULL;
codec = av_mallocz(sizeof(FFAMediaCodec)); DECLARE_FF_AMEDIACODEC_CREATE_FUNC(createCodecByName, CREATE_CODEC_BY_NAME)
if (!codec) { DECLARE_FF_AMEDIACODEC_CREATE_FUNC(createDecoderByType, CREATE_DECODER_BY_TYPE)
return NULL; DECLARE_FF_AMEDIACODEC_CREATE_FUNC(createEncoderByType, CREATE_ENCODER_BY_TYPE)
}
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;
}
int ff_AMediaCodec_delete(FFAMediaCodec* codec) int ff_AMediaCodec_delete(FFAMediaCodec* codec)
{ {
......
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