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

Commit 2637cb17 authored by James Dong's avatar James Dong Committed by Android (Google) Code Review
Browse files

Merge "Allow OMXCodec to specify an output color format for OMX decoder component" into jb-mr1-dev

parents d8421c54 8fa80e3b
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -276,7 +276,7 @@ private:
            CodecProfileLevel& profileLevel);
            CodecProfileLevel& profileLevel);


    status_t setVideoOutputFormat(
    status_t setVideoOutputFormat(
            const char *mime, OMX_U32 width, OMX_U32 height);
            const char *mime, const sp<MetaData>& meta);


    void setImageOutputFormat(
    void setImageOutputFormat(
            OMX_COLOR_FORMATTYPE format, OMX_U32 width, OMX_U32 height);
            OMX_COLOR_FORMATTYPE format, OMX_U32 width, OMX_U32 height);
+28 −6
Original line number Original line Diff line number Diff line
@@ -546,12 +546,8 @@ status_t OMXCodec::configureCodec(const sp<MetaData> &meta) {
        if (mIsEncoder) {
        if (mIsEncoder) {
            setVideoInputFormat(mMIME, meta);
            setVideoInputFormat(mMIME, meta);
        } else {
        } else {
            int32_t width, height;
            bool success = meta->findInt32(kKeyWidth, &width);
            success = success && meta->findInt32(kKeyHeight, &height);
            CHECK(success);
            status_t err = setVideoOutputFormat(
            status_t err = setVideoOutputFormat(
                    mMIME, width, height);
                    mMIME, meta);


            if (err != OK) {
            if (err != OK) {
                return err;
                return err;
@@ -1172,7 +1168,13 @@ status_t OMXCodec::setupAVCEncoderParameters(const sp<MetaData>& meta) {
}
}


status_t OMXCodec::setVideoOutputFormat(
status_t OMXCodec::setVideoOutputFormat(
        const char *mime, OMX_U32 width, OMX_U32 height) {
        const char *mime, const sp<MetaData>& meta) {

    int32_t width, height;
    bool success = meta->findInt32(kKeyWidth, &width);
    success = success && meta->findInt32(kKeyHeight, &height);
    CHECK(success);

    CODEC_LOGV("setVideoOutputFormat width=%ld, height=%ld", width, height);
    CODEC_LOGV("setVideoOutputFormat width=%ld, height=%ld", width, height);


    OMX_VIDEO_CODINGTYPE compressionFormat = OMX_VIDEO_CodingUnused;
    OMX_VIDEO_CODINGTYPE compressionFormat = OMX_VIDEO_CodingUnused;
@@ -1218,6 +1220,26 @@ status_t OMXCodec::setVideoOutputFormat(
               || format.eColorFormat == OMX_QCOM_COLOR_FormatYVU420SemiPlanar
               || format.eColorFormat == OMX_QCOM_COLOR_FormatYVU420SemiPlanar
               || format.eColorFormat == OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka);
               || format.eColorFormat == OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka);


        int32_t colorFormat;
        if (meta->findInt32(kKeyColorFormat, &colorFormat)
                && colorFormat != OMX_COLOR_FormatUnused
                && colorFormat != format.eColorFormat) {

            while (OMX_ErrorNoMore != err) {
                format.nIndex++;
                err = mOMX->getParameter(
                        mNode, OMX_IndexParamVideoPortFormat,
                            &format, sizeof(format));
                if (format.eColorFormat == colorFormat) {
                    break;
                }
            }
            if (format.eColorFormat != colorFormat) {
                CODEC_LOGE("Color format %d is not supported", colorFormat);
                return ERROR_UNSUPPORTED;
            }
        }

        err = mOMX->setParameter(
        err = mOMX->setParameter(
                mNode, OMX_IndexParamVideoPortFormat,
                mNode, OMX_IndexParamVideoPortFormat,
                &format, sizeof(format));
                &format, sizeof(format));
+36 −1
Original line number Original line Diff line number Diff line
@@ -110,6 +110,31 @@ status_t StagefrightMetadataRetriever::setDataSource(
    return OK;
    return OK;
}
}


static bool isYUV420PlanarSupported(
            OMXClient *client,
            const sp<MetaData> &trackMeta) {

    const char *mime;
    CHECK(trackMeta->findCString(kKeyMIMEType, &mime));

    Vector<CodecCapabilities> caps;
    if (QueryCodecs(client->interface(), mime,
                    true, /* queryDecoders */
                    true, /* hwCodecOnly */
                    &caps) == OK) {

        for (size_t j = 0; j < caps.size(); ++j) {
            CodecCapabilities cap = caps[j];
            for (size_t i = 0; i < cap.mColorFormats.size(); ++i) {
                if (cap.mColorFormats[i] == OMX_COLOR_FormatYUV420Planar) {
                    return true;
                }
            }
        }
    }
    return false;
}

static VideoFrame *extractVideoFrameWithCodecFlags(
static VideoFrame *extractVideoFrameWithCodecFlags(
        OMXClient *client,
        OMXClient *client,
        const sp<MetaData> &trackMeta,
        const sp<MetaData> &trackMeta,
@@ -117,9 +142,19 @@ static VideoFrame *extractVideoFrameWithCodecFlags(
        uint32_t flags,
        uint32_t flags,
        int64_t frameTimeUs,
        int64_t frameTimeUs,
        int seekMode) {
        int seekMode) {

    sp<MetaData> format = source->getFormat();

    // XXX:
    // Once all vendors support OMX_COLOR_FormatYUV420Planar, we can
    // remove this check and always set the decoder output color format
    if (isYUV420PlanarSupported(client, trackMeta)) {
        format->setInt32(kKeyColorFormat, OMX_COLOR_FormatYUV420Planar);
    }

    sp<MediaSource> decoder =
    sp<MediaSource> decoder =
        OMXCodec::Create(
        OMXCodec::Create(
                client->interface(), source->getFormat(), false, source,
                client->interface(), format, false, source,
                NULL, flags | OMXCodec::kClientNeedsFramebuffer);
                NULL, flags | OMXCodec::kClientNeedsFramebuffer);


    if (decoder.get() == NULL) {
    if (decoder.get() == NULL) {