summaryrefslogtreecommitdiffstats
path: root/media/jni/android_media_MediaCodecList.cpp
diff options
context:
space:
mode:
authorLajos Molnar <lajos@google.com>2014-07-18 12:10:33 -0700
committerLajos Molnar <lajos@google.com>2014-07-19 02:14:00 -0700
commitb58dc3132272a5ec1ad4792c3c9d48b4198bd57f (patch)
treeec3e6a0ec682799444c58652aee69d6a18abd601 /media/jni/android_media_MediaCodecList.cpp
parent713964504960b27a15d4b780501d938961338913 (diff)
downloadframeworks_base-b58dc3132272a5ec1ad4792c3c9d48b4198bd57f.zip
frameworks_base-b58dc3132272a5ec1ad4792c3c9d48b4198bd57f.tar.gz
frameworks_base-b58dc3132272a5ec1ad4792c3c9d48b4198bd57f.tar.bz2
Extend MediaCodecInfo to describe usable codec limits and features
Bug: 11990470 Bug: 12065651 Bug: 16131974 Change-Id: I841b8507e823f1ddf14754e34029a9bed4f402d8
Diffstat (limited to 'media/jni/android_media_MediaCodecList.cpp')
-rw-r--r--media/jni/android_media_MediaCodecList.cpp71
1 files changed, 54 insertions, 17 deletions
diff --git a/media/jni/android_media_MediaCodecList.cpp b/media/jni/android_media_MediaCodecList.cpp
index caa594e..ed1eeb9 100644
--- a/media/jni/android_media_MediaCodecList.cpp
+++ b/media/jni/android_media_MediaCodecList.cpp
@@ -19,11 +19,13 @@
#include <utils/Log.h>
#include <media/stagefright/foundation/ADebug.h>
+#include <media/stagefright/foundation/AMessage.h>
#include <media/stagefright/MediaCodecList.h>
#include "android_runtime/AndroidRuntime.h"
#include "jni.h"
#include "JNIHelp.h"
+#include "android_media_Utils.h"
using namespace android;
@@ -111,10 +113,19 @@ static jobject android_media_MediaCodecList_getCodecCapabilities(
Vector<MediaCodecList::ProfileLevel> profileLevels;
Vector<uint32_t> colorFormats;
uint32_t flags;
+ sp<AMessage> capabilities;
+
+ sp<AMessage> defaultFormat = new AMessage();
+ defaultFormat->setString("mime", typeStr);
+
+ // TODO query default-format also from codec/codec list
status_t err =
MediaCodecList::getInstance()->getCodecCapabilities(
- index, typeStr, &profileLevels, &colorFormats, &flags);
+ index, typeStr, &profileLevels, &colorFormats, &flags,
+ &capabilities);
+
+ bool isEncoder = MediaCodecList::getInstance()->isEncoder(index);
env->ReleaseStringUTFChars(type, typeStr);
typeStr = NULL;
@@ -124,15 +135,21 @@ static jobject android_media_MediaCodecList_getCodecCapabilities(
return NULL;
}
+ jobject defaultFormatObj = NULL;
+ if (ConvertMessageToMap(env, defaultFormat, &defaultFormatObj)) {
+ return NULL;
+ }
+
+ jobject infoObj = NULL;
+ if (ConvertMessageToMap(env, capabilities, &infoObj)) {
+ env->DeleteLocalRef(defaultFormatObj);
+ return NULL;
+ }
+
jclass capsClazz =
env->FindClass("android/media/MediaCodecInfo$CodecCapabilities");
CHECK(capsClazz != NULL);
- jfieldID flagsField =
- env->GetFieldID(capsClazz, "flags", "I");
-
- jobject caps = env->AllocObject(capsClazz);
-
jclass profileLevelClazz =
env->FindClass("android/media/MediaCodecInfo$CodecProfileLevel");
CHECK(profileLevelClazz != NULL);
@@ -160,6 +177,22 @@ static jobject android_media_MediaCodecList_getCodecCapabilities(
profileLevelObj = NULL;
}
+ jintArray colorFormatsArray = env->NewIntArray(colorFormats.size());
+
+ for (size_t i = 0; i < colorFormats.size(); ++i) {
+ jint val = colorFormats.itemAt(i);
+ env->SetIntArrayRegion(colorFormatsArray, i, 1, &val);
+ }
+
+ jmethodID capsConstructID = env->GetMethodID(capsClazz, "<init>",
+ "([Landroid/media/MediaCodecInfo$CodecProfileLevel;[IZI"
+ "Ljava/util/Map;Ljava/util/Map;)V");
+
+ jobject caps = env->NewObject(capsClazz, capsConstructID,
+ profileLevelArray, colorFormatsArray, isEncoder, flags,
+ defaultFormatObj, infoObj);
+
+#if 0
jfieldID profileLevelsField = env->GetFieldID(
capsClazz,
"profileLevels",
@@ -167,26 +200,30 @@ static jobject android_media_MediaCodecList_getCodecCapabilities(
env->SetObjectField(caps, profileLevelsField, profileLevelArray);
- env->SetIntField(caps, flagsField, flags);
-
- env->DeleteLocalRef(profileLevelArray);
- profileLevelArray = NULL;
-
- jintArray colorFormatsArray = env->NewIntArray(colorFormats.size());
+ jfieldID flagsField =
+ env->GetFieldID(capsClazz, "mFlagsVerified", "I");
- for (size_t i = 0; i < colorFormats.size(); ++i) {
- jint val = colorFormats.itemAt(i);
- env->SetIntArrayRegion(colorFormatsArray, i, 1, &val);
- }
+ env->SetIntField(caps, flagsField, flags);
jfieldID colorFormatsField = env->GetFieldID(
capsClazz, "colorFormats", "[I");
env->SetObjectField(caps, colorFormatsField, colorFormatsArray);
+#endif
+
+ env->DeleteLocalRef(profileLevelArray);
+ profileLevelArray = NULL;
+
env->DeleteLocalRef(colorFormatsArray);
colorFormatsArray = NULL;
+ env->DeleteLocalRef(defaultFormatObj);
+ defaultFormatObj = NULL;
+
+ env->DeleteLocalRef(infoObj);
+ infoObj = NULL;
+
return caps;
}
@@ -194,7 +231,7 @@ static void android_media_MediaCodecList_native_init(JNIEnv *env) {
}
static JNINativeMethod gMethods[] = {
- { "getCodecCount", "()I", (void *)android_media_MediaCodecList_getCodecCount },
+ { "native_getCodecCount", "()I", (void *)android_media_MediaCodecList_getCodecCount },
{ "getCodecName", "(I)Ljava/lang/String;",
(void *)android_media_MediaCodecList_getCodecName },
{ "isEncoder", "(I)Z", (void *)android_media_MediaCodecList_isEncoder },