Merge "Improve performance by resolving MediaCodec.BufferInfo members outside of the frequently called code (like dequeueOutputBuffer)" am: 9687a71214 am: cc6014d9bc

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2280249

Change-Id: I91c77ad40005786ac85d96e0e263db86b664b410
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Pavel Labovich
2022-11-02 00:47:02 +00:00
committed by Automerger Merge Worker

View File

@@ -174,6 +174,12 @@ static struct {
jfieldID typeId; jfieldID typeId;
} gDescriptorInfo; } gDescriptorInfo;
static struct {
jclass clazz;
jmethodID ctorId;
jmethodID setId;
} gBufferInfo;
struct fields_t { struct fields_t {
jmethodID postEventFromNativeID; jmethodID postEventFromNativeID;
jmethodID lockAndGetContextID; jmethodID lockAndGetContextID;
@@ -460,11 +466,7 @@ status_t JMediaCodec::dequeueOutputBuffer(
return err; return err;
} }
ScopedLocalRef<jclass> clazz( env->CallVoidMethod(bufferInfo, gBufferInfo.setId, (jint)offset, (jint)size, timeUs, flags);
env, env->FindClass("android/media/MediaCodec$BufferInfo"));
jmethodID method = env->GetMethodID(clazz.get(), "set", "(IIJI)V");
env->CallVoidMethod(bufferInfo, method, (jint)offset, (jint)size, timeUs, flags);
return OK; return OK;
} }
@@ -1091,13 +1093,7 @@ void JMediaCodec::handleCallback(const sp<AMessage> &msg) {
CHECK(msg->findInt64("timeUs", &timeUs)); CHECK(msg->findInt64("timeUs", &timeUs));
CHECK(msg->findInt32("flags", (int32_t *)&flags)); CHECK(msg->findInt32("flags", (int32_t *)&flags));
ScopedLocalRef<jclass> clazz( obj = env->NewObject(gBufferInfo.clazz, gBufferInfo.ctorId);
env, env->FindClass("android/media/MediaCodec$BufferInfo"));
jmethodID ctor = env->GetMethodID(clazz.get(), "<init>", "()V");
jmethodID method = env->GetMethodID(clazz.get(), "set", "(IIJI)V");
obj = env->NewObject(clazz.get(), ctor);
if (obj == NULL) { if (obj == NULL) {
if (env->ExceptionCheck()) { if (env->ExceptionCheck()) {
ALOGE("Could not create MediaCodec.BufferInfo."); ALOGE("Could not create MediaCodec.BufferInfo.");
@@ -1107,7 +1103,7 @@ void JMediaCodec::handleCallback(const sp<AMessage> &msg) {
return; return;
} }
env->CallVoidMethod(obj, method, (jint)offset, (jint)size, timeUs, flags); env->CallVoidMethod(obj, gBufferInfo.setId, (jint)offset, (jint)size, timeUs, flags);
break; break;
} }
@@ -3235,6 +3231,16 @@ static void android_media_MediaCodec_native_init(JNIEnv *env, jclass) {
gDescriptorInfo.typeId = env->GetFieldID(clazz.get(), "mType", "I"); gDescriptorInfo.typeId = env->GetFieldID(clazz.get(), "mType", "I");
CHECK(gDescriptorInfo.typeId != NULL); CHECK(gDescriptorInfo.typeId != NULL);
clazz.reset(env->FindClass("android/media/MediaCodec$BufferInfo"));
CHECK(clazz.get() != NULL);
gBufferInfo.clazz = (jclass)env->NewGlobalRef(clazz.get());
gBufferInfo.ctorId = env->GetMethodID(clazz.get(), "<init>", "()V");
CHECK(gBufferInfo.ctorId != NULL);
gBufferInfo.setId = env->GetMethodID(clazz.get(), "set", "(IIJI)V");
CHECK(gBufferInfo.setId != NULL);
} }
static void android_media_MediaCodec_native_setup( static void android_media_MediaCodec_native_setup(