X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fmediacodec_wrapper.c;h=c47c2c9a410a31a981758f8ff01ca56edac194f1;hb=64425e005edf3bdd77c34c078c3e74ab5ecef557;hp=dbc37bf4639bfad65ddb86ced790f2edb5f9f547;hpb=b668a1c8b35d7b45eb32cba465fb99b99355998c;p=ffmpeg diff --git a/libavcodec/mediacodec_wrapper.c b/libavcodec/mediacodec_wrapper.c index dbc37bf4639..c47c2c9a410 100644 --- a/libavcodec/mediacodec_wrapper.c +++ b/libavcodec/mediacodec_wrapper.c @@ -111,6 +111,8 @@ struct JNIAMediaFormatFields { jmethodID init_id; + jmethodID contains_key_id; + jmethodID get_integer_id; jmethodID get_long_id; jmethodID get_float_id; @@ -132,6 +134,8 @@ static const struct FFJniField jni_amediaformat_mapping[] = { { "android/media/MediaFormat", "", "()V", FF_JNI_METHOD, offsetof(struct JNIAMediaFormatFields, init_id), 1 }, + { "android/media/MediaFormat", "containsKey", "(Ljava/lang/String;)Z", FF_JNI_METHOD,offsetof(struct JNIAMediaFormatFields, contains_key_id), 1 }, + { "android/media/MediaFormat", "getInteger", "(Ljava/lang/String;)I", FF_JNI_METHOD, offsetof(struct JNIAMediaFormatFields, get_integer_id), 1 }, { "android/media/MediaFormat", "getLong", "(Ljava/lang/String;)J", FF_JNI_METHOD, offsetof(struct JNIAMediaFormatFields, get_long_id), 1 }, { "android/media/MediaFormat", "getFloat", "(Ljava/lang/String;)F", FF_JNI_METHOD, offsetof(struct JNIAMediaFormatFields, get_float_id), 1 }, @@ -152,7 +156,7 @@ static const struct FFJniField jni_amediaformat_mapping[] = { static const AVClass amediaformat_class = { .class_name = "amediaformat", .item_name = av_default_item_name, - .version = LIBAVCODEC_VERSION_INT, + .version = LIBAVUTIL_VERSION_INT, }; struct FFAMediaFormat { @@ -264,7 +268,7 @@ static const struct FFJniField jni_amediacodec_mapping[] = { static const AVClass amediacodec_class = { .class_name = "amediacodec", .item_name = av_default_item_name, - .version = LIBAVCODEC_VERSION_INT, + .version = LIBAVUTIL_VERSION_INT, }; struct FFAMediaCodec { @@ -465,7 +469,12 @@ char *ff_AMediaCodecList_getCodecNameByType(const char *mime, int profile, int e goto done; } - if (strstr(name, "OMX.google")) { + /* Skip software decoders */ + if ( + strstr(name, "OMX.google") || + strstr(name, "OMX.ffmpeg") || + (strstr(name, "OMX.SEC") && strstr(name, ".sw.")) || + !strcmp(name, "OMX.qcom.video.decoder.hevcswvdec")) { av_freep(&name); goto done_with_type; } @@ -738,6 +747,7 @@ int ff_AMediaFormat_getInt32(FFAMediaFormat* format, const char *name, int32_t * JNIEnv *env = NULL; jstring key = NULL; + jboolean contains_key; av_assert0(format != NULL); @@ -749,6 +759,12 @@ int ff_AMediaFormat_getInt32(FFAMediaFormat* format, const char *name, int32_t * goto fail; } + contains_key = (*env)->CallBooleanMethod(env, format->object, format->jfields.contains_key_id, key); + if (!contains_key || (ret = ff_jni_exception_check(env, 1, format)) < 0) { + ret = 0; + goto fail; + } + *out = (*env)->CallIntMethod(env, format->object, format->jfields.get_integer_id, key); if ((ret = ff_jni_exception_check(env, 1, format)) < 0) { ret = 0; @@ -770,6 +786,7 @@ int ff_AMediaFormat_getInt64(FFAMediaFormat* format, const char *name, int64_t * JNIEnv *env = NULL; jstring key = NULL; + jboolean contains_key; av_assert0(format != NULL); @@ -781,6 +798,12 @@ int ff_AMediaFormat_getInt64(FFAMediaFormat* format, const char *name, int64_t * goto fail; } + contains_key = (*env)->CallBooleanMethod(env, format->object, format->jfields.contains_key_id, key); + if (!contains_key || (ret = ff_jni_exception_check(env, 1, format)) < 0) { + ret = 0; + goto fail; + } + *out = (*env)->CallLongMethod(env, format->object, format->jfields.get_long_id, key); if ((ret = ff_jni_exception_check(env, 1, format)) < 0) { ret = 0; @@ -802,6 +825,7 @@ int ff_AMediaFormat_getFloat(FFAMediaFormat* format, const char *name, float *ou JNIEnv *env = NULL; jstring key = NULL; + jboolean contains_key; av_assert0(format != NULL); @@ -813,6 +837,12 @@ int ff_AMediaFormat_getFloat(FFAMediaFormat* format, const char *name, float *ou goto fail; } + contains_key = (*env)->CallBooleanMethod(env, format->object, format->jfields.contains_key_id, key); + if (!contains_key || (ret = ff_jni_exception_check(env, 1, format)) < 0) { + ret = 0; + goto fail; + } + *out = (*env)->CallFloatMethod(env, format->object, format->jfields.get_float_id, key); if ((ret = ff_jni_exception_check(env, 1, format)) < 0) { ret = 0; @@ -834,6 +864,7 @@ int ff_AMediaFormat_getBuffer(FFAMediaFormat* format, const char *name, void** d JNIEnv *env = NULL; jstring key = NULL; + jboolean contains_key; jobject result = NULL; av_assert0(format != NULL); @@ -846,6 +877,12 @@ int ff_AMediaFormat_getBuffer(FFAMediaFormat* format, const char *name, void** d goto fail; } + contains_key = (*env)->CallBooleanMethod(env, format->object, format->jfields.contains_key_id, key); + if (!contains_key || (ret = ff_jni_exception_check(env, 1, format)) < 0) { + ret = 0; + goto fail; + } + result = (*env)->CallObjectMethod(env, format->object, format->jfields.get_bytebuffer_id, key); if ((ret = ff_jni_exception_check(env, 1, format)) < 0) { ret = 0; @@ -885,6 +922,7 @@ int ff_AMediaFormat_getString(FFAMediaFormat* format, const char *name, const ch JNIEnv *env = NULL; jstring key = NULL; + jboolean contains_key; jstring result = NULL; av_assert0(format != NULL); @@ -897,6 +935,12 @@ int ff_AMediaFormat_getString(FFAMediaFormat* format, const char *name, const ch goto fail; } + contains_key = (*env)->CallBooleanMethod(env, format->object, format->jfields.contains_key_id, key); + if (!contains_key || (ret = ff_jni_exception_check(env, 1, format)) < 0) { + ret = 0; + goto fail; + } + result = (*env)->CallObjectMethod(env, format->object, format->jfields.get_string_id, key); if ((ret = ff_jni_exception_check(env, 1, format)) < 0) { ret = 0; @@ -1643,3 +1687,18 @@ int ff_AMediaCodec_cleanOutputBuffers(FFAMediaCodec *codec) fail: return ret; } + +int ff_Build_SDK_INT(AVCodecContext *avctx) +{ + int ret = -1; + JNIEnv *env = NULL; + jclass versionClass; + jfieldID sdkIntFieldID; + JNI_GET_ENV_OR_RETURN(env, avctx, -1); + + versionClass = (*env)->FindClass(env, "android/os/Build$VERSION"); + sdkIntFieldID = (*env)->GetStaticFieldID(env, versionClass, "SDK_INT", "I"); + ret = (*env)->GetStaticIntField(env, versionClass, sdkIntFieldID); + (*env)->DeleteLocalRef(env, versionClass); + return ret; +}