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

Commit 2ee14000 authored by Lajos Molnar's avatar Lajos Molnar
Browse files

Check adaptive playback support via CodecCapabilities



Added flags field to CodecCapabilities, so that applications
can query whether codecs support various features.  For now
added one video-decoder feature:

kFlagSupportsAdaptivePlayback

Media playback applications can query it to see if a codec
supports seamless resolution changes, such as by supporting
dynamic output buffers.

Signed-off-by: default avatarLajos Molnar <lajos@google.com>
Change-Id: I09da46e8ab6b8645fa2749e33128e49eda2e865b
Related-to-bug: 7093648
parent b8689b31
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -50,7 +50,8 @@ struct MediaCodecList {
    status_t getCodecCapabilities(
            size_t index, const char *type,
            Vector<ProfileLevel> *profileLevels,
            Vector<uint32_t> *colorFormats) const;
            Vector<uint32_t> *colorFormats,
            uint32_t *flags) const;

private:
    enum Section {
+5 −0
Original line number Diff line number Diff line
@@ -361,9 +361,14 @@ private:
};

struct CodecCapabilities {
    enum {
        kFlagSupportsAdaptivePlayback = 1 << 0,
    };

    String8 mComponentName;
    Vector<CodecProfileLevel> mProfileLevels;
    Vector<OMX_U32> mColorFormats;
    uint32_t mFlags;
};

// Return a vector of componentNames with supported profile/level pairs
+4 −1
Original line number Diff line number Diff line
@@ -509,7 +509,8 @@ status_t MediaCodecList::getSupportedTypes(
status_t MediaCodecList::getCodecCapabilities(
        size_t index, const char *type,
        Vector<ProfileLevel> *profileLevels,
        Vector<uint32_t> *colorFormats) const {
        Vector<uint32_t> *colorFormats,
        uint32_t *flags) const {
    profileLevels->clear();
    colorFormats->clear();

@@ -547,6 +548,8 @@ status_t MediaCodecList::getCodecCapabilities(
        colorFormats->push(caps.mColorFormats.itemAt(i));
    }

    *flags = caps.mFlags;

    return OK;
}

+8 −1
Original line number Diff line number Diff line
@@ -4567,7 +4567,7 @@ status_t QueryCodec(
        CodecCapabilities *caps) {
    if (strncmp(componentName, "OMX.", 4)) {
        // Not an OpenMax component but a software codec.

        caps->mFlags = 0;
        caps->mComponentName = componentName;
        return OK;
    }
@@ -4582,8 +4582,15 @@ status_t QueryCodec(

    OMXCodec::setComponentRole(omx, node, isEncoder, mime);

    caps->mFlags = 0;
    caps->mComponentName = componentName;

    if (!isEncoder && !strncmp(mime, "video/", 6) &&
            omx->storeMetaDataInBuffers(
                    node, 1 /* port index */, OMX_TRUE) == OK) {
        caps->mFlags |= CodecCapabilities::kFlagSupportsAdaptivePlayback;
    }

    OMX_VIDEO_PARAM_PROFILELEVELTYPE param;
    InitOMXParams(&param);