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

Commit 49605e8a authored by Lajos Molnar's avatar Lajos Molnar
Browse files

stagefright: fix deadlock and NPE in GraphicBufferSource

Bug: 22202388
Change-Id: I04f2f783ecc0e0c50adf16a666f6d7ab4221e285
parent 20657105
Loading
Loading
Loading
Loading
+4 −9
Original line number Diff line number Diff line
@@ -111,6 +111,7 @@ GraphicBufferSource::GraphicBufferSource(
        uint32_t bufferWidth,
        uint32_t bufferHeight,
        uint32_t bufferCount,
        uint32_t consumerUsage,
        const sp<IGraphicBufferConsumer> &consumer) :
    mInitCheck(UNKNOWN_ERROR),
    mNodeInstance(nodeInstance),
@@ -154,16 +155,10 @@ GraphicBufferSource::GraphicBufferSource(
        BufferQueue::createBufferQueue(&mProducer, &mConsumer);
        mConsumer->setConsumerName(name);

        // query consumer usage bits from encoder, but always add HW_VIDEO_ENCODER
        // use consumer usage bits queried from encoder, but always add HW_VIDEO_ENCODER
        // for backward compatibility.
        uint32_t usageBits;
        status_t err = mNodeInstance->getParameter(
                (OMX_INDEXTYPE)OMX_IndexParamConsumerUsageBits, &usageBits, sizeof(usageBits));
        if (err != OK) {
            usageBits = 0;
        }
        usageBits |= GRALLOC_USAGE_HW_VIDEO_ENCODER;
        mConsumer->setConsumerUsageBits(usageBits);
        consumerUsage |= GRALLOC_USAGE_HW_VIDEO_ENCODER;
        mConsumer->setConsumerUsageBits(consumerUsage);

        mInitCheck = mConsumer->setMaxAcquiredBufferCount(bufferCount);
        if (mInitCheck != NO_ERROR) {
+1 −0
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@ public:
            uint32_t bufferWidth,
            uint32_t bufferHeight,
            uint32_t bufferCount,
            uint32_t consumerUsage,
            const sp<IGraphicBufferConsumer> &consumer = NULL
    );

+10 −1
Original line number Diff line number Diff line
@@ -834,7 +834,8 @@ status_t OMXNodeInstance::updateGraphicBufferInMeta_l(
    }

    CLOG_BUFFER(updateGraphicBufferInMeta, "%s:%u, %#x := %p",
            portString(portIndex), portIndex, buffer, graphicBuffer->handle);
            portString(portIndex), portIndex, buffer,
            graphicBuffer == NULL ? NULL : graphicBuffer->handle);
    return OK;
}

@@ -885,10 +886,18 @@ status_t OMXNodeInstance::createGraphicBufferSource(
        return INVALID_OPERATION;
    }

    uint32_t usageBits;
    oerr = OMX_GetParameter(
            mHandle, (OMX_INDEXTYPE)OMX_IndexParamConsumerUsageBits, &usageBits);
    if (oerr != OMX_ErrorNone) {
        usageBits = 0;
    }

    sp<GraphicBufferSource> bufferSource = new GraphicBufferSource(this,
            def.format.video.nFrameWidth,
            def.format.video.nFrameHeight,
            def.nBufferCountActual,
            usageBits,
            bufferConsumer);

    if ((err = bufferSource->initCheck()) != OK) {