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

Commit 3d6cccc2 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Codec2Client: use IProducerListener for Codec2 hidl1.2" into main am: e0e6e729

parents f16d1088 e0e6e729
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -2372,7 +2372,7 @@ void Codec2Client::Component::stopUsingOutputSurface(

void Codec2Client::Component::onBufferReleasedFromOutputSurface(
        uint32_t generation) {
    (void) generation;
    mOutputBufferQueue->onBufferReleased(generation);
}

c2_status_t Codec2Client::Component::connectToInputSurface(
+4 −0
Original line number Diff line number Diff line
@@ -65,6 +65,10 @@ struct OutputBufferQueue {
            const BnGraphicBufferProducer::QueueBufferInput& input,
            BnGraphicBufferProducer::QueueBufferOutput* output);

    // Nofify a buffer is released from the output surface. If HAL ver is 1.2
    // update the number of dequeueable/allocatable buffers.
    void onBufferReleased(uint32_t generation);

    // Retrieve frame event history from the output surface.
    void pollForRenderedFrames(FrameEventHistoryDelta* delta);

+31 −6
Original line number Diff line number Diff line
@@ -441,10 +441,12 @@ status_t OutputBufferQueue::outputBuffer(
            status = outputIgbp->queueBuffer(static_cast<int>(bqSlot),
                                         input, output);
            if (status == OK) {
                if (output->bufferReplaced) {
                    syncVar->lock();
                    syncVar->notifyQueuedLocked();
                    syncVar->unlock();
                }
            }
        } else {
            status = outputIgbp->queueBuffer(static_cast<int>(bqSlot),
                                         input, output);
@@ -496,10 +498,12 @@ status_t OutputBufferQueue::outputBuffer(
        status = outputIgbp->queueBuffer(static_cast<int>(bqSlot),
                                                  input, output);
        if (status == OK) {
            if (output->bufferReplaced) {
                syncVar->lock();
                syncVar->notifyQueuedLocked();
                syncVar->unlock();
            }
        }
    } else {
        status = outputIgbp->queueBuffer(static_cast<int>(bqSlot),
                                                  input, output);
@@ -514,6 +518,27 @@ status_t OutputBufferQueue::outputBuffer(
    return OK;
}

void OutputBufferQueue::onBufferReleased(uint32_t generation) {
    std::shared_ptr<C2SurfaceSyncMemory> syncMem;
    mMutex.lock();
    if (mStopped) {
        return;
    }
    sp<IGraphicBufferProducer> outputIgbp = mIgbp;
    uint32_t outputGeneration = mGeneration;
    syncMem = mSyncMem;
    mMutex.unlock();

    if (outputIgbp && generation == outputGeneration) {
        auto syncVar = syncMem ? syncMem->mem() : nullptr;
        if (syncVar) {
            syncVar->lock();
            syncVar->notifyQueuedLocked();
            syncVar->unlock();
        }
    }
}

void OutputBufferQueue::pollForRenderedFrames(FrameEventHistoryDelta* delta) {
    if (mIgbp) {
        mIgbp->getFrameTimestamps(delta);