Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c7641deb authored by Lajos Molnar's avatar Lajos Molnar Committed by Android (Google) Code Review
Browse files

Merge "MediaCodecInfo: add codec attributes and performance points."

parents db117605 d2a7f47b
Loading
Loading
Loading
Loading
+50 −0
Original line number Diff line number Diff line
@@ -24146,6 +24146,7 @@ package android.media {
    method public int dequeueOutputBuffer(android.media.MediaCodec.BufferInfo, long);
    method protected void finalize();
    method public void flush();
    method public java.lang.String getCanonicalName();
    method public android.media.MediaCodecInfo getCodecInfo();
    method public java.nio.ByteBuffer getInputBuffer(int);
    method public deprecated java.nio.ByteBuffer[] getInputBuffers();
@@ -24272,10 +24273,15 @@ package android.media {
  }
  public final class MediaCodecInfo {
    method public java.lang.String getCanonicalName();
    method public android.media.MediaCodecInfo.CodecCapabilities getCapabilitiesForType(java.lang.String);
    method public java.lang.String getName();
    method public java.lang.String[] getSupportedTypes();
    method public boolean isAlias();
    method public boolean isEncoder();
    method public boolean isHardwareAccelerated();
    method public boolean isSoftwareOnly();
    method public boolean isVendor();
  }
  public static final class MediaCodecInfo.AudioCapabilities {
@@ -24351,7 +24357,10 @@ package android.media {
    field public static final deprecated int COLOR_QCOM_FormatYUV420SemiPlanar = 2141391872; // 0x7fa30c00
    field public static final deprecated int COLOR_TI_FormatYUV420PackedSemiPlanar = 2130706688; // 0x7f000100
    field public static final java.lang.String FEATURE_AdaptivePlayback = "adaptive-playback";
    field public static final java.lang.String FEATURE_DynamicTimestamp = "dynamic-timestamp";
    field public static final java.lang.String FEATURE_FrameParsing = "frame-parsing";
    field public static final java.lang.String FEATURE_IntraRefresh = "intra-refresh";
    field public static final java.lang.String FEATURE_MultipleFrames = "multiple-frames";
    field public static final java.lang.String FEATURE_PartialFrame = "partial-frame";
    field public static final java.lang.String FEATURE_SecurePlayback = "secure-playback";
    field public static final java.lang.String FEATURE_TunneledPlayback = "tunneled-playback";
@@ -24582,12 +24591,53 @@ package android.media {
    method public android.util.Range<java.lang.Double> getSupportedFrameRatesFor(int, int);
    method public android.util.Range<java.lang.Integer> getSupportedHeights();
    method public android.util.Range<java.lang.Integer> getSupportedHeightsFor(int);
    method public java.util.List<android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint> getSupportedPerformancePoints();
    method public android.util.Range<java.lang.Integer> getSupportedWidths();
    method public android.util.Range<java.lang.Integer> getSupportedWidthsFor(int);
    method public int getWidthAlignment();
    method public boolean isSizeSupported(int, int);
  }
  public static final class MediaCodecInfo.VideoCapabilities.PerformancePoint {
    method public boolean covers(android.media.MediaFormat);
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint FHD_100;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint FHD_120;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint FHD_200;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint FHD_24;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint FHD_240;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint FHD_25;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint FHD_30;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint FHD_50;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint FHD_60;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint HD_100;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint HD_120;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint HD_200;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint HD_24;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint HD_240;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint HD_25;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint HD_30;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint HD_50;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint HD_60;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint SD_24;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint SD_25;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint SD_30;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint SD_48;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint SD_50;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint SD_60;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint UHD_100;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint UHD_120;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint UHD_200;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint UHD_24;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint UHD_240;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint UHD_25;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint UHD_30;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint UHD_50;
    field public static final android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint UHD_60;
    field public final int frameRate;
    field public final int height;
    field public final int width;
  }
  public final class MediaCodecList {
    ctor public MediaCodecList(int);
    method public java.lang.String findDecoderForFormat(android.media.MediaFormat);
+32 −3
Original line number Diff line number Diff line
@@ -1829,9 +1829,14 @@ final public class MediaCodec {

        mBufferLock = new Object();

        // save name used at creation
        mNameAtCreation = nameIsType ? null : name;

        native_setup(name, nameIsType, encoder);
    }

    private String mNameAtCreation;

    @Override
    protected void finalize() {
        native_finalize();
@@ -3317,12 +3322,36 @@ final public class MediaCodec {
    private native void native_setAudioPresentation(int presentationId, int programId);

    /**
     * Get the component name. If the codec was created by createDecoderByType
     * or createEncoderByType, what component is chosen is not known beforehand.
     * Retrieve the codec name.
     *
     * If the codec was created by createDecoderByType or createEncoderByType, what component is
     * chosen is not known beforehand. This method returns the name of the codec that was
     * selected by the platform.
     *
     * <strong>Note:</strong> Implementations may provide multiple aliases (codec
     * names) for the same underlying codec, any of which can be used to instantiate the same
     * underlying codec in {@link MediaCodec#createByCodecName}. This method returns the
     * name used to create the codec in this case.
     *
     * @throws IllegalStateException if in the Released state.
     */
    @NonNull
    public final String getName() {
        // get canonical name to handle exception
        String canonicalName = getCanonicalName();
        return mNameAtCreation != null ? mNameAtCreation : canonicalName;
    }

    /**
     * Retrieve the underlying codec name.
     *
     * This method is similar to {@link #getName}, except that it returns the underlying component
     * name even if an alias was used to create this MediaCodec object by name,
     *
     * @throws IllegalStateException if in the Released state.
     */
    @NonNull
    public native final String getName();
    public native final String getCanonicalName();

    /**
     *  Return Metrics data about the current codec instance.
+298 −10

File changed.

Preview size limit exceeded, changes collapsed.

+4 −2
Original line number Diff line number Diff line
@@ -111,12 +111,14 @@ final public class MediaCodecList {
            caps[typeIx++] = getCodecCapabilities(index, type);
        }
        return new MediaCodecInfo(
                getCodecName(index), isEncoder(index), caps);
                getCodecName(index), getCanonicalName(index), getAttributes(index), caps);
    }

    /* package private */ static native final String getCodecName(int index);

    /* package private */ static native final boolean isEncoder(int index);
    /* package private */ static native final String getCanonicalName(int index);

    /* package private */ static native final int getAttributes(int index);

    /* package private */ static native final String[] getSupportedTypes(int index);

+15 −11
Original line number Diff line number Diff line
@@ -648,7 +648,6 @@ static jobject getCodecCapabilitiesObject(

    capabilities->getSupportedColorFormats(&colorFormats);
    capabilities->getSupportedProfileLevels(&profileLevels);
    uint32_t flags = capabilities->getFlags();
    sp<AMessage> details = capabilities->getDetails();

    jobject defaultFormatObj = NULL;
@@ -687,7 +686,7 @@ static jobject getCodecCapabilitiesObject(

    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 @@ status_t JMediaCodec::getCodecInfo(JNIEnv *env, jobject *codecInfoObject) const
        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 @@ status_t JMediaCodec::getCodecInfo(JNIEnv *env, jobject *codecInfoObject) const
            "(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 @@ static void android_media_MediaCodec_native_init(JNIEnv *env) {
    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 @@ static const JNINativeMethod gMethods[] = {
    { "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;",
Loading