Loading media/codec2/hal/client/client.cpp +3 −0 Original line number Diff line number Diff line Loading @@ -1722,6 +1722,8 @@ c2_status_t Codec2Client::Component::setOutputSurface( static_cast<uint64_t>(blockPoolId), bqId == 0 ? nullHgbp : igbp); mOutputBufferQueue->expireOldWaiters(); if (!transStatus.isOk()) { LOG(ERROR) << "setOutputSurface -- transaction failed."; return C2_TRANSACTION_FAILED; Loading Loading @@ -1763,6 +1765,7 @@ void Codec2Client::Component::stopUsingOutputSurface( << status << "."; } } mOutputBufferQueue->expireOldWaiters(); } c2_status_t Codec2Client::Component::connectToInputSurface( Loading media/codec2/hal/client/include/codec2/hidl/output.h +6 −0 Original line number Diff line number Diff line Loading @@ -50,6 +50,10 @@ struct OutputBufferQueue { int maxDequeueBufferCount, std::shared_ptr<V1_2::SurfaceSyncObj> *syncObj); // If there are waiters to allocate from the old surface, wake up and expire // them. void expireOldWaiters(); // Stop using the current output surface. Pending buffer opeations will not // perform anymore. void stop(); Loading Loading @@ -86,6 +90,8 @@ private: std::weak_ptr<_C2BlockPoolData> mPoolDatas[BufferQueueDefs::NUM_BUFFER_SLOTS]; std::shared_ptr<C2SurfaceSyncMemory> mSyncMem; bool mStopped; std::mutex mOldMutex; std::shared_ptr<C2SurfaceSyncMemory> mOldMem; bool registerBuffer(const C2ConstGraphicBlock& block); }; Loading media/codec2/hal/client/output.cpp +17 −1 Original line number Diff line number Diff line Loading @@ -217,6 +217,7 @@ bool OutputBufferQueue::configure(const sp<IGraphicBufferProducer>& igbp, sp<GraphicBuffer> buffers[BufferQueueDefs::NUM_BUFFER_SLOTS]; std::weak_ptr<_C2BlockPoolData> poolDatas[BufferQueueDefs::NUM_BUFFER_SLOTS]; std::shared_ptr<C2SurfaceSyncMemory> oldMem; { std::scoped_lock<std::mutex> l(mMutex); bool stopped = mStopped; Loading @@ -238,7 +239,7 @@ bool OutputBufferQueue::configure(const sp<IGraphicBufferProducer>& igbp, } return false; } std::shared_ptr<C2SurfaceSyncMemory> oldMem = mSyncMem; oldMem = mSyncMem; C2SyncVariables *oldSync = mSyncMem ? mSyncMem->mem() : nullptr; if (oldSync) { oldSync->lock(); Loading Loading @@ -314,11 +315,26 @@ bool OutputBufferQueue::configure(const sp<IGraphicBufferProducer>& igbp, newSync->unlock(); } } { std::scoped_lock<std::mutex> l(mOldMutex); mOldMem = oldMem; } ALOGD("remote graphic buffer migration %zu/%zu", success, tryNum); return true; } void OutputBufferQueue::expireOldWaiters() { std::scoped_lock<std::mutex> l(mOldMutex); if (mOldMem) { C2SyncVariables *oldSync = mOldMem->mem(); if (oldSync) { oldSync->notifyAll(); } mOldMem.reset(); } } void OutputBufferQueue::stop() { std::scoped_lock<std::mutex> l(mMutex); mStopped = true; Loading media/codec2/vndk/include/C2SurfaceSyncObj.h +5 −0 Original line number Diff line number Diff line Loading @@ -112,6 +112,11 @@ struct C2SyncVariables { */ c2_status_t waitForChange(uint32_t waitId, c2_nsecs_t timeoutNs); /** * Wake up and expire all waitors. */ void notifyAll(); C2SyncVariables() {} private: Loading media/codec2/vndk/platform/C2SurfaceSyncObj.cpp +6 −0 Original line number Diff line number Diff line Loading @@ -244,6 +244,12 @@ c2_status_t C2SyncVariables::waitForChange(uint32_t waitId, c2_nsecs_t timeoutNs return C2_BAD_VALUE; } void C2SyncVariables::notifyAll() { this->lock(); this->broadcast(); this->unlock(); } int C2SyncVariables::signal() { mCond++; Loading Loading
media/codec2/hal/client/client.cpp +3 −0 Original line number Diff line number Diff line Loading @@ -1722,6 +1722,8 @@ c2_status_t Codec2Client::Component::setOutputSurface( static_cast<uint64_t>(blockPoolId), bqId == 0 ? nullHgbp : igbp); mOutputBufferQueue->expireOldWaiters(); if (!transStatus.isOk()) { LOG(ERROR) << "setOutputSurface -- transaction failed."; return C2_TRANSACTION_FAILED; Loading Loading @@ -1763,6 +1765,7 @@ void Codec2Client::Component::stopUsingOutputSurface( << status << "."; } } mOutputBufferQueue->expireOldWaiters(); } c2_status_t Codec2Client::Component::connectToInputSurface( Loading
media/codec2/hal/client/include/codec2/hidl/output.h +6 −0 Original line number Diff line number Diff line Loading @@ -50,6 +50,10 @@ struct OutputBufferQueue { int maxDequeueBufferCount, std::shared_ptr<V1_2::SurfaceSyncObj> *syncObj); // If there are waiters to allocate from the old surface, wake up and expire // them. void expireOldWaiters(); // Stop using the current output surface. Pending buffer opeations will not // perform anymore. void stop(); Loading Loading @@ -86,6 +90,8 @@ private: std::weak_ptr<_C2BlockPoolData> mPoolDatas[BufferQueueDefs::NUM_BUFFER_SLOTS]; std::shared_ptr<C2SurfaceSyncMemory> mSyncMem; bool mStopped; std::mutex mOldMutex; std::shared_ptr<C2SurfaceSyncMemory> mOldMem; bool registerBuffer(const C2ConstGraphicBlock& block); }; Loading
media/codec2/hal/client/output.cpp +17 −1 Original line number Diff line number Diff line Loading @@ -217,6 +217,7 @@ bool OutputBufferQueue::configure(const sp<IGraphicBufferProducer>& igbp, sp<GraphicBuffer> buffers[BufferQueueDefs::NUM_BUFFER_SLOTS]; std::weak_ptr<_C2BlockPoolData> poolDatas[BufferQueueDefs::NUM_BUFFER_SLOTS]; std::shared_ptr<C2SurfaceSyncMemory> oldMem; { std::scoped_lock<std::mutex> l(mMutex); bool stopped = mStopped; Loading @@ -238,7 +239,7 @@ bool OutputBufferQueue::configure(const sp<IGraphicBufferProducer>& igbp, } return false; } std::shared_ptr<C2SurfaceSyncMemory> oldMem = mSyncMem; oldMem = mSyncMem; C2SyncVariables *oldSync = mSyncMem ? mSyncMem->mem() : nullptr; if (oldSync) { oldSync->lock(); Loading Loading @@ -314,11 +315,26 @@ bool OutputBufferQueue::configure(const sp<IGraphicBufferProducer>& igbp, newSync->unlock(); } } { std::scoped_lock<std::mutex> l(mOldMutex); mOldMem = oldMem; } ALOGD("remote graphic buffer migration %zu/%zu", success, tryNum); return true; } void OutputBufferQueue::expireOldWaiters() { std::scoped_lock<std::mutex> l(mOldMutex); if (mOldMem) { C2SyncVariables *oldSync = mOldMem->mem(); if (oldSync) { oldSync->notifyAll(); } mOldMem.reset(); } } void OutputBufferQueue::stop() { std::scoped_lock<std::mutex> l(mMutex); mStopped = true; Loading
media/codec2/vndk/include/C2SurfaceSyncObj.h +5 −0 Original line number Diff line number Diff line Loading @@ -112,6 +112,11 @@ struct C2SyncVariables { */ c2_status_t waitForChange(uint32_t waitId, c2_nsecs_t timeoutNs); /** * Wake up and expire all waitors. */ void notifyAll(); C2SyncVariables() {} private: Loading
media/codec2/vndk/platform/C2SurfaceSyncObj.cpp +6 −0 Original line number Diff line number Diff line Loading @@ -244,6 +244,12 @@ c2_status_t C2SyncVariables::waitForChange(uint32_t waitId, c2_nsecs_t timeoutNs return C2_BAD_VALUE; } void C2SyncVariables::notifyAll() { this->lock(); this->broadcast(); this->unlock(); } int C2SyncVariables::signal() { mCond++; Loading