Loading media/codec2/sfplugin/CCodec.cpp +9 −5 Original line number Diff line number Diff line Loading @@ -1379,7 +1379,7 @@ void CCodec::initiateStop() { state->set(STOPPING); } mChannel->stop(); mChannel->reset(); (new AMessage(kWhatStop, this))->post(); } Loading @@ -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); Loading Loading @@ -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(); Loading @@ -1495,6 +1492,7 @@ void CCodec::release(bool sendCallback) { state->set(RELEASED); state->comp.reset(); } (new AMessage(kWhatRelease, this))->post(); if (sendCallback) { mCallback->onReleaseCompleted(); } Loading Loading @@ -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"); Loading media/codec2/sfplugin/CCodecBufferChannel.cpp +53 −16 Original line number Diff line number Diff line Loading @@ -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; } } Loading Loading @@ -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); { Loading Loading @@ -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(); } Loading Loading @@ -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); Loading @@ -1486,6 +1516,7 @@ bool CCodecBufferChannel::handleWork( } } } } if ((work->input.ordinal.frameIndex - mFirstValidFrameIndex.load()).peek() < 0) { // Discard frames from previous generation. Loading Loading @@ -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) { Loading Loading @@ -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()); Loading Loading @@ -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; Loading media/codec2/sfplugin/CCodecBufferChannel.h +10 −0 Original line number Diff line number Diff line Loading @@ -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); /** Loading media/codec2/sfplugin/CCodecBuffers.h +1 −1 Original line number Diff line number Diff line Loading @@ -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 Loading media/libstagefright/MediaCodec.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -2641,6 +2641,7 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) { } mResourceManagerProxy->removeClient(); mReleaseSurface.reset(); if (mReplyID != nullptr) { (new AMessage)->postReply(mReplyID); Loading Loading
media/codec2/sfplugin/CCodec.cpp +9 −5 Original line number Diff line number Diff line Loading @@ -1379,7 +1379,7 @@ void CCodec::initiateStop() { state->set(STOPPING); } mChannel->stop(); mChannel->reset(); (new AMessage(kWhatStop, this))->post(); } Loading @@ -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); Loading Loading @@ -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(); Loading @@ -1495,6 +1492,7 @@ void CCodec::release(bool sendCallback) { state->set(RELEASED); state->comp.reset(); } (new AMessage(kWhatRelease, this))->post(); if (sendCallback) { mCallback->onReleaseCompleted(); } Loading Loading @@ -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"); Loading
media/codec2/sfplugin/CCodecBufferChannel.cpp +53 −16 Original line number Diff line number Diff line Loading @@ -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; } } Loading Loading @@ -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); { Loading Loading @@ -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(); } Loading Loading @@ -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); Loading @@ -1486,6 +1516,7 @@ bool CCodecBufferChannel::handleWork( } } } } if ((work->input.ordinal.frameIndex - mFirstValidFrameIndex.load()).peek() < 0) { // Discard frames from previous generation. Loading Loading @@ -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) { Loading Loading @@ -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()); Loading Loading @@ -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; Loading
media/codec2/sfplugin/CCodecBufferChannel.h +10 −0 Original line number Diff line number Diff line Loading @@ -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); /** Loading
media/codec2/sfplugin/CCodecBuffers.h +1 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
media/libstagefright/MediaCodec.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -2641,6 +2641,7 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) { } mResourceManagerProxy->removeClient(); mReleaseSurface.reset(); if (mReplyID != nullptr) { (new AMessage)->postReply(mReplyID); Loading