From e330f596fd76646cccecf3a5b9c82e97b52d7499 Mon Sep 17 00:00:00 2001 From: Pavel Labovich Date: Wed, 2 Nov 2022 00:52:23 +0000 Subject: [PATCH] Merge "Improve performance by resolving MediaCodec.BufferInfo members outside of the frequently called code (like dequeueOutputBuffer)" am: 9687a71214 am: cc6014d9bc am: 0dc922ae17 Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2280249 Change-Id: I92fd9a07082f37edf4c253d7bae98cfc0dc2d542 Signed-off-by: Automerger Merge Worker (cherry picked from commit cb5f169f3ce8b4cb6baf9b85afe3306283cfef12) Bug: 246482624 --- media/jni/android_media_MediaCodec.cpp | 32 +++++++++++++++----------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp index 95599bd41e8d2..1183ca3b49777 100644 --- a/media/jni/android_media_MediaCodec.cpp +++ b/media/jni/android_media_MediaCodec.cpp @@ -174,6 +174,12 @@ static struct { jfieldID typeId; } gDescriptorInfo; +static struct { + jclass clazz; + jmethodID ctorId; + jmethodID setId; +} gBufferInfo; + struct fields_t { jmethodID postEventFromNativeID; jmethodID lockAndGetContextID; @@ -460,11 +466,7 @@ status_t JMediaCodec::dequeueOutputBuffer( return err; } - ScopedLocalRef clazz( - 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); + env->CallVoidMethod(bufferInfo, gBufferInfo.setId, (jint)offset, (jint)size, timeUs, flags); return OK; } @@ -1091,13 +1093,7 @@ void JMediaCodec::handleCallback(const sp &msg) { CHECK(msg->findInt64("timeUs", &timeUs)); CHECK(msg->findInt32("flags", (int32_t *)&flags)); - ScopedLocalRef clazz( - env, env->FindClass("android/media/MediaCodec$BufferInfo")); - jmethodID ctor = env->GetMethodID(clazz.get(), "", "()V"); - jmethodID method = env->GetMethodID(clazz.get(), "set", "(IIJI)V"); - - obj = env->NewObject(clazz.get(), ctor); - + obj = env->NewObject(gBufferInfo.clazz, gBufferInfo.ctorId); if (obj == NULL) { if (env->ExceptionCheck()) { ALOGE("Could not create MediaCodec.BufferInfo."); @@ -1107,7 +1103,7 @@ void JMediaCodec::handleCallback(const sp &msg) { return; } - env->CallVoidMethod(obj, method, (jint)offset, (jint)size, timeUs, flags); + env->CallVoidMethod(obj, gBufferInfo.setId, (jint)offset, (jint)size, timeUs, flags); break; } @@ -3235,6 +3231,16 @@ static void android_media_MediaCodec_native_init(JNIEnv *env, jclass) { gDescriptorInfo.typeId = env->GetFieldID(clazz.get(), "mType", "I"); 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(), "", "()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(