From 80c4437ebfe3e679267a64e4c9d7bdd585b7afce Mon Sep 17 00:00:00 2001 From: Lajos Molnar Date: Fri, 10 May 2013 09:24:12 -0700 Subject: [PATCH] MediaCodecInfo.java: Added isFeatureSupported method to CodecCapabilities Added isFeatureSupported method to CodecCapabilities, so that applications can query whether codecs support various features. For now added one video-decoder feature: FEATURE_AdaptivePlayback Media playback applications can query it to see if the codec supports seamless resolution changes during decoding. Change-Id: I56b2cf1429f39f9b9e0243a990c95e7a64dd7ff7 Signed-off-by: Lajos Molnar Related-to-bug: 7093648 --- api/current.txt | 2 ++ media/java/android/media/MediaCodecInfo.java | 21 +++++++++++++++++++- media/jni/android_media_MediaCodecList.cpp | 8 +++++++- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/api/current.txt b/api/current.txt index 6026cc52d1dba..509941e14622a 100644 --- a/api/current.txt +++ b/api/current.txt @@ -12100,6 +12100,7 @@ package android.media { public static final class MediaCodecInfo.CodecCapabilities { ctor public MediaCodecInfo.CodecCapabilities(); + method public final boolean isFeatureSupported(java.lang.String); field public static final int COLOR_Format12bitRGB444 = 3; // 0x3 field public static final int COLOR_Format16bitARGB1555 = 5; // 0x5 field public static final int COLOR_Format16bitARGB4444 = 4; // 0x4 @@ -12146,6 +12147,7 @@ package android.media { field public static final int COLOR_FormatYUV444Interleaved = 29; // 0x1d field public static final int COLOR_QCOM_FormatYUV420SemiPlanar = 2141391872; // 0x7fa30c00 field public static final int COLOR_TI_FormatYUV420PackedSemiPlanar = 2130706688; // 0x7f000100 + field public static final java.lang.String FEATURE_AdaptivePlayback = "adaptive-playback"; field public int[] colorFormats; field public android.media.MediaCodecInfo.CodecProfileLevel[] profileLevels; } diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java index aeed7d4b53906..90c12c635c78e 100644 --- a/media/java/android/media/MediaCodecInfo.java +++ b/media/java/android/media/MediaCodecInfo.java @@ -72,7 +72,8 @@ public final class MediaCodecInfo { /** * Encapsulates the capabilities of a given codec component. * For example, what profile/level combinations it supports and what colorspaces - * it is capable of providing the decoded data in. + * it is capable of providing the decoded data in, as well as some + * codec-type specific capability flags. *

You can get an instance for a given {@link MediaCodecInfo} object with * {@link MediaCodecInfo#getCapabilitiesForType getCapabilitiesForType()}, passing a MIME type. */ @@ -139,6 +140,24 @@ public final class MediaCodecInfo { * OMX_COLOR_FORMATTYPE. */ public int[] colorFormats; + + private final static int FLAG_SupportsAdaptivePlayback = (1 << 0); + private int flags; + + /** + * video decoder only: codec supports seamless resolution changes. + */ + public final static String FEATURE_AdaptivePlayback = "adaptive-playback"; + + /** + * Query codec feature capabilities. + */ + public final boolean isFeatureSupported(String name) { + if (name.equals(FEATURE_AdaptivePlayback)) { + return (flags & FLAG_SupportsAdaptivePlayback) != 0; + } + return false; + } }; /** diff --git a/media/jni/android_media_MediaCodecList.cpp b/media/jni/android_media_MediaCodecList.cpp index 04430ec26609c..caa594e654b77 100644 --- a/media/jni/android_media_MediaCodecList.cpp +++ b/media/jni/android_media_MediaCodecList.cpp @@ -110,10 +110,11 @@ static jobject android_media_MediaCodecList_getCodecCapabilities( Vector profileLevels; Vector colorFormats; + uint32_t flags; status_t err = MediaCodecList::getInstance()->getCodecCapabilities( - index, typeStr, &profileLevels, &colorFormats); + index, typeStr, &profileLevels, &colorFormats, &flags); env->ReleaseStringUTFChars(type, typeStr); typeStr = NULL; @@ -127,6 +128,9 @@ static jobject android_media_MediaCodecList_getCodecCapabilities( env->FindClass("android/media/MediaCodecInfo$CodecCapabilities"); CHECK(capsClazz != NULL); + jfieldID flagsField = + env->GetFieldID(capsClazz, "flags", "I"); + jobject caps = env->AllocObject(capsClazz); jclass profileLevelClazz = @@ -163,6 +167,8 @@ static jobject android_media_MediaCodecList_getCodecCapabilities( env->SetObjectField(caps, profileLevelsField, profileLevelArray); + env->SetIntField(caps, flagsField, flags); + env->DeleteLocalRef(profileLevelArray); profileLevelArray = NULL;