diff options
author | Lajos Molnar <lajos@google.com> | 2014-07-18 12:10:33 -0700 |
---|---|---|
committer | Lajos Molnar <lajos@google.com> | 2014-07-19 02:14:00 -0700 |
commit | b58dc3132272a5ec1ad4792c3c9d48b4198bd57f (patch) | |
tree | ec3e6a0ec682799444c58652aee69d6a18abd601 /media/jni/android_media_MediaCodecList.cpp | |
parent | 713964504960b27a15d4b780501d938961338913 (diff) | |
download | frameworks_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.cpp | 71 |
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 }, |