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

Commit a1780e8e authored by Wonsik Kim's avatar Wonsik Kim Committed by Automerger Merge Worker
Browse files

Merge "CCodec: revise resource releases" into rvc-dev am: 48779be7

Change-Id: Iad95c5bdd9c6c63b0f28e89c4763b6186b643f06
parents 4a3dcc94 48779be7
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -1379,7 +1379,7 @@ void CCodec::initiateStop() {
        state->set(STOPPING);
    }

    mChannel->stop();
    mChannel->reset();
    (new AMessage(kWhatStop, this))->post();
}

@@ -1406,9 +1406,6 @@ void CCodec::stop() {
        // TODO: convert err into status_t
        mCallback->onError(UNKNOWN_ERROR, ACTION_CODE_FATAL);
    }
    // Assure buffers are not owned when stop() was called without flush().
    std::list<std::unique_ptr<C2Work>> flushedWork;
    mChannel->flush(flushedWork);

    {
        Mutexed<std::unique_ptr<Config>>::Locked configLocked(mConfig);
@@ -1468,7 +1465,7 @@ void CCodec::initiateRelease(bool sendCallback /* = true */) {
        }
    }

    mChannel->stop();
    mChannel->reset();
    // thiz holds strong ref to this while the thread is running.
    sp<CCodec> thiz(this);
    std::thread([thiz, sendCallback] { thiz->release(sendCallback); }).detach();
@@ -1495,6 +1492,7 @@ void CCodec::release(bool sendCallback) {
        state->set(RELEASED);
        state->comp.reset();
    }
    (new AMessage(kWhatRelease, this))->post();
    if (sendCallback) {
        mCallback->onReleaseCompleted();
    }
@@ -1759,6 +1757,12 @@ void CCodec::onMessageReceived(const sp<AMessage> &msg) {
            flush();
            break;
        }
        case kWhatRelease: {
            mChannel->release();
            mClient.reset();
            mClientListener.reset();
            break;
        }
        case kWhatCreateInputSurface: {
            // Surface operations may be briefly blocking.
            setDeadline(now, 1500ms, "createInputSurface");
+53 −16
Original line number Diff line number Diff line
@@ -713,7 +713,7 @@ void CCodecBufferChannel::feedInputBufferIfAvailableInternal() {
        return;
    } else {
        Mutexed<Output>::Locked output(mOutput);
        if (output->buffers->numClientBuffers() >= output->numSlots) {
        if (!output->buffers || output->buffers->numClientBuffers() >= output->numSlots) {
            return;
        }
    }
@@ -1401,6 +1401,30 @@ void CCodecBufferChannel::stop() {
    }
}

void CCodecBufferChannel::reset() {
    stop();
    {
        Mutexed<Input>::Locked input(mInput);
        input->buffers.reset(new DummyInputBuffers(""));
    }
    {
        Mutexed<Output>::Locked output(mOutput);
        output->buffers.reset();
    }
}

void CCodecBufferChannel::release() {
    mComponent.reset();
    mInputAllocator.reset();
    mOutputSurface.lock()->surface.clear();
    {
        Mutexed<BlockPools>::Locked blockPools{mBlockPools};
        blockPools->inputPool.reset();
        blockPools->outputPoolIntf.reset();
    }
}


void CCodecBufferChannel::flush(const std::list<std::unique_ptr<C2Work>> &flushedWork) {
    ALOGV("[%s] flush", mName);
    {
@@ -1431,8 +1455,10 @@ void CCodecBufferChannel::flush(const std::list<std::unique_ptr<C2Work>> &flushe
    }
    {
        Mutexed<Output>::Locked output(mOutput);
        if (output->buffers) {
            output->buffers->flush(flushedWork);
        }
    }
    mReorderStash.lock()->flush();
    mPipelineWatcher.lock()->flush();
}
@@ -1469,8 +1495,12 @@ bool CCodecBufferChannel::handleWork(
        std::unique_ptr<C2Work> work,
        const sp<AMessage> &outputFormat,
        const C2StreamInitDataInfo::output *initData) {
    if (outputFormat != nullptr) {
    {
        Mutexed<Output>::Locked output(mOutput);
        if (!output->buffers) {
            return false;
        }
        if (outputFormat != nullptr) {
            ALOGD("[%s] onWorkDone: output format changed to %s",
                    mName, outputFormat->debugString().c_str());
            output->buffers->setFormat(outputFormat);
@@ -1486,6 +1516,7 @@ bool CCodecBufferChannel::handleWork(
                }
            }
        }
    }

    if ((work->input.ordinal.frameIndex - mFirstValidFrameIndex.load()).peek() < 0) {
        // Discard frames from previous generation.
@@ -1606,6 +1637,9 @@ bool CCodecBufferChannel::handleWork(
                        size_t numInputSlots = mInput.lock()->numSlots;
                        {
                            Mutexed<Output>::Locked output(mOutput);
                            if (!output->buffers) {
                                return false;
                            }
                            output->outputDelay = outputDelay.value;
                            numOutputSlots = outputDelay.value + kSmoothnessFactor;
                            if (output->numSlots < numOutputSlots) {
@@ -1695,7 +1729,7 @@ bool CCodecBufferChannel::handleWork(

    if (initData != nullptr) {
        Mutexed<Output>::Locked output(mOutput);
        if (output->buffers->registerCsd(initData, &index, &outBuffer) == OK) {
        if (output->buffers && output->buffers->registerCsd(initData, &index, &outBuffer) == OK) {
            outBuffer->meta()->setInt64("timeUs", timestamp.peek());
            outBuffer->meta()->setInt32("flags", MediaCodec::BUFFER_FLAG_CODECCONFIG);
            ALOGV("[%s] onWorkDone: csd index = %zu [%p]", mName, index, outBuffer.get());
@@ -1758,6 +1792,9 @@ void CCodecBufferChannel::sendOutputBuffers() {
        }

        Mutexed<Output>::Locked output(mOutput);
        if (!output->buffers) {
            return;
        }
        status_t err = output->buffers->registerBuffer(entry.buffer, &index, &outBuffer);
        if (err != OK) {
            bool outputBuffersChanged = false;
+10 −0
Original line number Diff line number Diff line
@@ -138,6 +138,16 @@ public:
     */
    void stop();

    /**
     * Stop queueing buffers to the component and release all buffers.
     */
    void reset();

    /**
     * Release all resources.
     */
    void release();

    void flush(const std::list<std::unique_ptr<C2Work>> &flushedWork);

    /**
+1 −1
Original line number Diff line number Diff line
@@ -416,7 +416,7 @@ public:
            size_t *index,
            sp<Codec2Buffer> *buffer,
            std::function<bool(const sp<Codec2Buffer> &)> match =
                [](const sp<Codec2Buffer> &) { return true; });
                [](const sp<Codec2Buffer> &buffer) { return (buffer != nullptr); });

    /**
     * Return the buffer from the client, and get the C2Buffer object back from
+1 −0
Original line number Diff line number Diff line
@@ -2641,6 +2641,7 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) {
                    }

                    mResourceManagerProxy->removeClient();
                    mReleaseSurface.reset();

                    if (mReplyID != nullptr) {
                        (new AMessage)->postReply(mReplyID);