MediaCodecInfo: add codec attributes and performance points.
Bug: 112374531
Bug: 119631295
Bug: 112370870
Change-Id: Icf8db614a616bd5c815bc272093ce77d05eb4406
diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp
index 7b07bea3..9c51996 100644
--- a/media/jni/android_media_MediaCodec.cpp
+++ b/media/jni/android_media_MediaCodec.cpp
@@ -648,7 +648,6 @@
capabilities->getSupportedColorFormats(&colorFormats);
capabilities->getSupportedProfileLevels(&profileLevels);
- uint32_t flags = capabilities->getFlags();
sp<AMessage> details = capabilities->getDetails();
jobject defaultFormatObj = NULL;
@@ -687,7 +686,7 @@
return env->NewObject(
gCodecInfo.capsClazz, gCodecInfo.capsCtorId,
- profileLevelArray.get(), colorFormatsArray.get(), isEncoder, flags,
+ profileLevelArray.get(), colorFormatsArray.get(), isEncoder,
defaultFormatRef.get(), detailsRef.get());
}
@@ -700,23 +699,28 @@
return err;
}
+ // TODO: get alias
ScopedLocalRef<jstring> nameObject(env,
env->NewStringUTF(codecInfo->getCodecName()));
+ ScopedLocalRef<jstring> canonicalNameObject(env,
+ env->NewStringUTF(codecInfo->getCodecName()));
+
+ MediaCodecInfo::Attributes attributes = codecInfo->getAttributes();
bool isEncoder = codecInfo->isEncoder();
- Vector<AString> mimes;
- codecInfo->getSupportedMimes(&mimes);
+ Vector<AString> mediaTypes;
+ codecInfo->getSupportedMediaTypes(&mediaTypes);
ScopedLocalRef<jobjectArray> capsArrayObj(env,
- env->NewObjectArray(mimes.size(), gCodecInfo.capsClazz, NULL));
+ env->NewObjectArray(mediaTypes.size(), gCodecInfo.capsClazz, NULL));
- for (size_t i = 0; i < mimes.size(); i++) {
+ for (size_t i = 0; i < mediaTypes.size(); i++) {
const sp<MediaCodecInfo::Capabilities> caps =
- codecInfo->getCapabilitiesFor(mimes[i].c_str());
+ codecInfo->getCapabilitiesFor(mediaTypes[i].c_str());
ScopedLocalRef<jobject> capsObj(env, getCodecCapabilitiesObject(
- env, mimes[i].c_str(), isEncoder, caps));
+ env, mediaTypes[i].c_str(), isEncoder, caps));
env->SetObjectArrayElement(capsArrayObj.get(), i, capsObj.get());
}
@@ -729,7 +733,7 @@
"(Ljava/lang/String;Z[Landroid/media/MediaCodecInfo$CodecCapabilities;)V");
*codecInfoObject = env->NewObject(codecInfoClazz.get(), codecInfoCtorID,
- nameObject.get(), isEncoder, capsArrayObj.get());
+ nameObject.get(), canonicalNameObject.get(), attributes, capsArrayObj.get());
return OK;
}
@@ -2079,7 +2083,7 @@
gCodecInfo.capsClazz = (jclass)env->NewGlobalRef(clazz.get());
method = env->GetMethodID(clazz.get(), "<init>",
- "([Landroid/media/MediaCodecInfo$CodecProfileLevel;[IZI"
+ "([Landroid/media/MediaCodecInfo$CodecProfileLevel;[IZ"
"Ljava/util/Map;Ljava/util/Map;)V");
CHECK(method != NULL);
gCodecInfo.capsCtorId = method;
@@ -2217,7 +2221,7 @@
{ "getImage", "(ZI)Landroid/media/Image;",
(void *)android_media_MediaCodec_getImage },
- { "getName", "()Ljava/lang/String;",
+ { "getCanonicalName", "()Ljava/lang/String;",
(void *)android_media_MediaCodec_getName },
{ "getOwnCodecInfo", "()Landroid/media/MediaCodecInfo;",
diff --git a/media/jni/android_media_MediaCodecList.cpp b/media/jni/android_media_MediaCodecList.cpp
index 8de11ca..cf14942 100644
--- a/media/jni/android_media_MediaCodecList.cpp
+++ b/media/jni/android_media_MediaCodecList.cpp
@@ -41,6 +41,21 @@
return mcl;
}
+static sp<MediaCodecInfo> getCodecInfo(JNIEnv *env, jint index) {
+ sp<IMediaCodecList> mcl = getCodecList(env);
+ if (mcl == NULL) {
+ // Runtime exception already pending.
+ return NULL;
+ }
+
+ sp<MediaCodecInfo> info = mcl->getCodecInfo(index);
+ if (info == NULL) {
+ jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
+ }
+
+ return info;
+}
+
static jint android_media_MediaCodecList_getCodecCount(
JNIEnv *env, jobject /* thiz */) {
sp<IMediaCodecList> mcl = getCodecList(env);
@@ -53,15 +68,22 @@
static jstring android_media_MediaCodecList_getCodecName(
JNIEnv *env, jobject /* thiz */, jint index) {
- sp<IMediaCodecList> mcl = getCodecList(env);
- if (mcl == NULL) {
+ sp<MediaCodecInfo> info = getCodecInfo(env, index);
+ if (info == NULL) {
// Runtime exception already pending.
return NULL;
}
- const sp<MediaCodecInfo> &info = mcl->getCodecInfo(index);
+ // TODO: support aliases
+ const char *name = info->getCodecName();
+ return env->NewStringUTF(name);
+}
+
+static jstring android_media_MediaCodecList_getCanonicalName(
+ JNIEnv *env, jobject /* thiz */, jint index) {
+ sp<MediaCodecInfo> info = getCodecInfo(env, index);
if (info == NULL) {
- jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
+ // Runtime exception already pending.
return NULL;
}
@@ -94,39 +116,27 @@
return ret;
}
-static jboolean android_media_MediaCodecList_isEncoder(
+static jboolean android_media_MediaCodecList_getAttributes(
JNIEnv *env, jobject /* thiz */, jint index) {
- sp<IMediaCodecList> mcl = getCodecList(env);
- if (mcl == NULL) {
- // Runtime exception already pending.
- return false;
- }
-
- const sp<MediaCodecInfo> &info = mcl->getCodecInfo(index);
+ sp<MediaCodecInfo> info = getCodecInfo(env, index);
if (info == NULL) {
- jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
- return false;
+ // Runtime exception already pending.
+ return 0;
}
- return info->isEncoder();
+ return info->getAttributes();
}
static jarray android_media_MediaCodecList_getSupportedTypes(
JNIEnv *env, jobject /* thiz */, jint index) {
- sp<IMediaCodecList> mcl = getCodecList(env);
- if (mcl == NULL) {
+ sp<MediaCodecInfo> info = getCodecInfo(env, index);
+ if (info == NULL) {
// Runtime exception already pending.
return NULL;
}
- const sp<MediaCodecInfo> &info = mcl->getCodecInfo(index);
- if (info == NULL) {
- jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
- return NULL;
- }
-
Vector<AString> types;
- info->getSupportedMimes(&types);
+ info->getSupportedMediaTypes(&types);
jclass clazz = env->FindClass("java/lang/String");
CHECK(clazz != NULL);
@@ -150,17 +160,12 @@
return NULL;
}
- sp<IMediaCodecList> mcl = getCodecList(env);
- if (mcl == NULL) {
+ sp<MediaCodecInfo> info = getCodecInfo(env, index);
+ if (info == NULL) {
// Runtime exception already pending.
return NULL;
}
- const sp<MediaCodecInfo> &info = mcl->getCodecInfo(index);
- if (info == NULL) {
- jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
- return NULL;
- }
const char *typeStr = env->GetStringUTFChars(type, NULL);
if (typeStr == NULL) {
@@ -186,7 +191,6 @@
capabilities->getSupportedColorFormats(&colorFormats);
capabilities->getSupportedProfileLevels(&profileLevels);
- uint32_t flags = capabilities->getFlags();
sp<AMessage> details = capabilities->getDetails();
bool isEncoder = info->isEncoder();
@@ -240,11 +244,11 @@
}
jmethodID capsConstructID = env->GetMethodID(capsClazz, "<init>",
- "([Landroid/media/MediaCodecInfo$CodecProfileLevel;[IZI"
+ "([Landroid/media/MediaCodecInfo$CodecProfileLevel;[IZ"
"Ljava/util/Map;Ljava/util/Map;)V");
jobject caps = env->NewObject(capsClazz, capsConstructID,
- profileLevelArray, colorFormatsArray, isEncoder, flags,
+ profileLevelArray, colorFormatsArray, isEncoder,
defaultFormatObj, infoObj);
env->DeleteLocalRef(profileLevelArray);
@@ -288,9 +292,15 @@
static const JNINativeMethod gMethods[] = {
{ "native_getCodecCount", "()I", (void *)android_media_MediaCodecList_getCodecCount },
+
+ { "getCanonicalName", "(I)Ljava/lang/String;",
+ (void *)android_media_MediaCodecList_getCanonicalName },
+
{ "getCodecName", "(I)Ljava/lang/String;",
(void *)android_media_MediaCodecList_getCodecName },
- { "isEncoder", "(I)Z", (void *)android_media_MediaCodecList_isEncoder },
+
+ { "getAttributes", "(I)I", (void *)android_media_MediaCodecList_getAttributes },
+
{ "getSupportedTypes", "(I)[Ljava/lang/String;",
(void *)android_media_MediaCodecList_getSupportedTypes },