mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-21 10:55:51 +02:00
lavc/mediacodec_wrapper: factorize MediaCodec creation functions
This commit is contained in:
parent
8bf4e6d3ce
commit
f3cffd121b
@ -1132,13 +1132,18 @@ fail:
|
||||
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;
|
||||
JNIEnv *env = NULL;
|
||||
FFAMediaCodec *codec = NULL;
|
||||
jstring codec_name = NULL;
|
||||
jstring jarg = NULL;
|
||||
jobject object = NULL;
|
||||
jmethodID create_id = NULL;
|
||||
|
||||
codec = av_mallocz(sizeof(FFAMediaCodec));
|
||||
if (!codec) {
|
||||
@ -1156,12 +1161,23 @@ FFAMediaCodec* ff_AMediaCodec_createCodecByName(const char *name)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
codec_name = ff_jni_utf_chars_to_jstring(env, name, codec);
|
||||
if (!codec_name) {
|
||||
jarg = ff_jni_utf_chars_to_jstring(env, arg, codec);
|
||||
if (!jarg) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
object = (*env)->CallStaticObjectMethod(env, codec->jfields.mediacodec_class, codec->jfields.create_by_codec_name_id, codec_name);
|
||||
switch (method) {
|
||||
case CREATE_CODEC_BY_NAME: create_id = codec->jfields.create_by_codec_name_id; break;
|
||||
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,
|
||||
create_id,
|
||||
jarg);
|
||||
if (ff_jni_exception_check(env, 1, codec) < 0) {
|
||||
goto fail;
|
||||
}
|
||||
@ -1181,8 +1197,8 @@ FFAMediaCodec* ff_AMediaCodec_createCodecByName(const char *name)
|
||||
|
||||
ret = 0;
|
||||
fail:
|
||||
if (codec_name) {
|
||||
(*env)->DeleteLocalRef(env, codec_name);
|
||||
if (jarg) {
|
||||
(*env)->DeleteLocalRef(env, jarg);
|
||||
}
|
||||
|
||||
if (object) {
|
||||
@ -1197,135 +1213,15 @@ fail:
|
||||
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;
|
||||
#define DECLARE_FF_AMEDIACODEC_CREATE_FUNC(name, method) \
|
||||
FFAMediaCodec *ff_AMediaCodec_##name(const char *arg) \
|
||||
{ \
|
||||
return codec_create(method, arg); \
|
||||
} \
|
||||
|
||||
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_CODEC_BY_NAME)
|
||||
DECLARE_FF_AMEDIACODEC_CREATE_FUNC(createDecoderByType, CREATE_DECODER_BY_TYPE)
|
||||
DECLARE_FF_AMEDIACODEC_CREATE_FUNC(createEncoderByType, CREATE_ENCODER_BY_TYPE)
|
||||
|
||||
int ff_AMediaCodec_delete(FFAMediaCodec* codec)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user