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

Commit 0cd4fbce authored by Sungtak Lee's avatar Sungtak Lee Committed by Cherrypicker Worker
Browse files

GraphicBufferSource: Use 64bit consumer usage

Bug: 185896428
Change-Id: I7319e37766f636b86b831f9a2e784f9dde684935
(cherry picked from commit dc30665f)
Merged-In: I7319e37766f636b86b831f9a2e784f9dde684935
parent c6c64496
Loading
Loading
Loading
Loading
+3 −4
Original line number Diff line number Diff line
@@ -1669,8 +1669,8 @@ c2_status_t Codec2Client::Component::setOutputSurface(
    uint64_t consumerUsage = kDefaultConsumerUsage;
    {
        if (surface) {
            int usage = 0;
            status_t err = surface->query(NATIVE_WINDOW_CONSUMER_USAGE_BITS, &usage);
            uint64_t usage = 0;
            status_t err = surface->getConsumerUsage(&usage);
            if (err != NO_ERROR) {
                ALOGD("setOutputSurface -- failed to get consumer usage bits (%d/%s). ignoring",
                        err, asString(err));
@@ -1683,8 +1683,7 @@ c2_status_t Codec2Client::Component::setOutputSurface(
                // they do not exist inside of C2 scope. Any buffer usage shall be communicated
                // through the sideband channel.

                // do an unsigned conversion as bit-31 may be 1
                consumerUsage = (uint32_t)usage | kDefaultConsumerUsage;
                consumerUsage = usage | kDefaultConsumerUsage;
            }
        }

+1 −1
Original line number Diff line number Diff line
@@ -145,7 +145,7 @@ struct InputSurfaceConnection::Impl : public ComponentWrapper {
        //         C2AndroidMemoryUsage(C2MemoryUsage(usage.value)).
        //         asGrallocUsage();

        uint32_t grallocUsage =
        uint64_t grallocUsage =
                mSinkName.compare(0, 11, "c2.android.") == 0 ?
                GRALLOC_USAGE_SW_READ_OFTEN :
                GRALLOC_USAGE_HW_VIDEO_ENCODER;
+13 −0
Original line number Diff line number Diff line
@@ -230,6 +230,12 @@ status_t C2OMXNode::getParameter(OMX_INDEXTYPE index, void *params, size_t size)
            err = OK;
            break;
        }
        case OMX_IndexParamConsumerUsageBits64: {
            OMX_U64 *usage = (OMX_U64 *)params;
            *usage = mUsage;
            err = OK;
            break;
        }
        case OMX_IndexParamPortDefinition: {
            if (size < sizeof(OMX_PARAM_PORTDEFINITIONTYPE)) {
                return BAD_VALUE;
@@ -293,6 +299,13 @@ status_t C2OMXNode::setParameter(OMX_INDEXTYPE index, const void *params, size_t
            }
            mUsage = *((OMX_U32 *)params);
            return OK;

        case OMX_IndexParamConsumerUsageBits64:
            if (size != sizeof(OMX_U64)) {
                return BAD_VALUE;
            }
            mUsage = *((OMX_U64 *)params);
            return OK;
    }
    return ERROR_UNSUPPORTED;
}
+12 −5
Original line number Diff line number Diff line
@@ -206,12 +206,19 @@ public:
        mNode = new C2OMXNode(comp);
        mOmxNode = new hardware::media::omx::V1_0::utils::TWOmxNode(mNode);
        mNode->setFrameSize(mWidth, mHeight);

        // Usage is queried during configure(), so setting it beforehand.
        // 64 bit set parameter is existing only in C2OMXNode.
        OMX_U64 usage64 = mConfig.mUsage;
        status_t res = mNode->setParameter(
                (OMX_INDEXTYPE)OMX_IndexParamConsumerUsageBits64,
                &usage64, sizeof(usage64));

        if (res != OK) {
            OMX_U32 usage = mConfig.mUsage & 0xFFFFFFFF;
            (void)mNode->setParameter(
                    (OMX_INDEXTYPE)OMX_IndexParamConsumerUsageBits,
                    &usage, sizeof(usage));
        }

        return GetStatus(mSource->configure(
                mOmxNode, static_cast<hardware::graphics::common::V1_0::Dataspace>(mDataSpace)));
+20 −3
Original line number Diff line number Diff line
@@ -143,7 +143,7 @@ Return<Status> TWGraphicBufferSource::configure(

    // use consumer usage bits queried from encoder, but always add
    // HW_VIDEO_ENCODER for backward compatibility.
    uint32_t  consumerUsage;
    uint64_t  consumerUsage;
    void *_params = &consumerUsage;
    uint8_t *params = static_cast<uint8_t*>(_params);
    fnStatus = UNKNOWN_ERROR;
@@ -155,15 +155,32 @@ Return<Status> TWGraphicBufferSource::configure(
                        outParams.data() + outParams.size(),
                        params);
            });

    // try 64 bit consumer usage first
    auto transStatus = omxNode->getParameter(
            static_cast<uint32_t>(OMX_IndexParamConsumerUsageBits),
            static_cast<uint32_t>(OMX_IndexParamConsumerUsageBits64),
            inHidlBytes(&consumerUsage, sizeof(consumerUsage)),
            _hidl_cb);
    if (!transStatus.isOk()) {
        return toStatus(FAILED_TRANSACTION);
    }
    if (fnStatus != OK) {
        // try 32 bit consumer usage upon failure
        uint32_t usage;
        _params = &usage;
        params = static_cast<uint8_t*>(_params);
        transStatus = omxNode->getParameter(
                static_cast<uint32_t>(OMX_IndexParamConsumerUsageBits),
                inHidlBytes(&usage, sizeof(usage)),
                _hidl_cb);
        if (!transStatus.isOk()) {
            return toStatus(FAILED_TRANSACTION);
        }
        if (fnStatus != OK) {
            consumerUsage = 0;
        } else {
            consumerUsage = usage;
        }
    }

    OMX_PARAM_PORTDEFINITIONTYPE def;
Loading