Loading media/codec2/sfplugin/CCodec.cpp +78 −92 Original line number Original line Diff line number Diff line Loading @@ -1796,7 +1796,6 @@ void CCodec::release(bool sendCallback) { } } status_t CCodec::setSurface(const sp<Surface> &surface) { status_t CCodec::setSurface(const sp<Surface> &surface) { { Mutexed<std::unique_ptr<Config>>::Locked configLocked(mConfig); Mutexed<std::unique_ptr<Config>>::Locked configLocked(mConfig); const std::unique_ptr<Config> &config = *configLocked; const std::unique_ptr<Config> &config = *configLocked; if (config->mTunneled && config->mSidebandHandle != nullptr) { if (config->mTunneled && config->mSidebandHandle != nullptr) { Loading @@ -1810,7 +1809,6 @@ status_t CCodec::setSurface(const sp<Surface> &surface) { return err; return err; } } } } } return mChannel->setSurface(surface); return mChannel->setSurface(surface); } } Loading Loading @@ -2149,12 +2147,9 @@ void CCodec::onMessageReceived(const sp<AMessage> &msg) { } } // handle configuration changes in work done // handle configuration changes in work done const C2StreamInitDataInfo::output *initData = nullptr; sp<AMessage> outputFormat = nullptr; { Mutexed<std::unique_ptr<Config>>::Locked configLocked(mConfig); Mutexed<std::unique_ptr<Config>>::Locked configLocked(mConfig); const std::unique_ptr<Config> &config = *configLocked; const std::unique_ptr<Config> &config = *configLocked; Config::Watcher<C2StreamInitDataInfo::output> initDataWatcher = Config::Watcher<C2StreamInitDataInfo::output> initData = config->watch<C2StreamInitDataInfo::output>(); config->watch<C2StreamInitDataInfo::output>(); if (!work->worklets.empty() if (!work->worklets.empty() && (work->worklets.front()->output.flags && (work->worklets.front()->output.flags Loading @@ -2167,13 +2162,10 @@ void CCodec::onMessageReceived(const sp<AMessage> &msg) { updates.push_back(C2Param::Copy(*param)); updates.push_back(C2Param::Copy(*param)); } } unsigned stream = 0; unsigned stream = 0; std::vector<std::shared_ptr<C2Buffer>> &outputBuffers = for (const std::shared_ptr<C2Buffer> &buf : work->worklets.front()->output.buffers) { work->worklets.front()->output.buffers; for (const std::shared_ptr<C2Buffer> &buf : outputBuffers) { for (const std::shared_ptr<const C2Info> &info : buf->info()) { for (const std::shared_ptr<const C2Info> &info : buf->info()) { // move all info into output-stream #0 domain // move all info into output-stream #0 domain updates.emplace_back( updates.emplace_back(C2Param::CopyAsStream(*info, true /* output */, stream)); C2Param::CopyAsStream(*info, true /* output */, stream)); } } const std::vector<C2ConstGraphicBlock> blocks = buf->data().graphicBlocks(); const std::vector<C2ConstGraphicBlock> blocks = buf->data().graphicBlocks(); Loading @@ -2184,17 +2176,16 @@ void CCodec::onMessageReceived(const sp<AMessage> &msg) { // block.crop().width, block.crop().height, // block.crop().width, block.crop().height, // block.width(), block.height()); // block.width(), block.height()); const C2ConstGraphicBlock &block = blocks[0]; const C2ConstGraphicBlock &block = blocks[0]; updates.emplace_back(new C2StreamCropRectInfo::output( updates.emplace_back(new C2StreamCropRectInfo::output(stream, block.crop())); stream, block.crop())); updates.emplace_back(new C2StreamPictureSizeInfo::output( updates.emplace_back(new C2StreamPictureSizeInfo::output( stream, block.crop().width, block.crop().height)); stream, block.crop().width, block.crop().height)); } } ++stream; ++stream; } } sp<AMessage> oldFormat = config->mOutputFormat; sp<AMessage> outputFormat = config->mOutputFormat; config->updateConfiguration(updates, config->mOutputDomain); config->updateConfiguration(updates, config->mOutputDomain); RevertOutputFormatIfNeeded(oldFormat, config->mOutputFormat); RevertOutputFormatIfNeeded(outputFormat, config->mOutputFormat); // copy standard infos to graphic buffers if not already present (otherwise, we // copy standard infos to graphic buffers if not already present (otherwise, we // may overwrite the actual intermediate value with a final value) // may overwrite the actual intermediate value with a final value) Loading @@ -2208,7 +2199,7 @@ void CCodec::onMessageReceived(const sp<AMessage> &msg) { C2StreamPixelAspectRatioInfo::output::PARAM_TYPE, C2StreamPixelAspectRatioInfo::output::PARAM_TYPE, C2StreamSurfaceScalingInfo::output::PARAM_TYPE C2StreamSurfaceScalingInfo::output::PARAM_TYPE }; }; for (const std::shared_ptr<C2Buffer> &buf : outputBuffers) { for (const std::shared_ptr<C2Buffer> &buf : work->worklets.front()->output.buffers) { if (buf->data().graphicBlocks().size()) { if (buf->data().graphicBlocks().size()) { for (C2Param::Index ix : stdGfxInfos) { for (C2Param::Index ix : stdGfxInfos) { if (!buf->hasInfo(ix)) { if (!buf->hasInfo(ix)) { Loading @@ -2227,10 +2218,9 @@ void CCodec::onMessageReceived(const sp<AMessage> &msg) { if (config->mInputSurface) { if (config->mInputSurface) { config->mInputSurface->onInputBufferDone(work->input.ordinal.frameIndex); config->mInputSurface->onInputBufferDone(work->input.ordinal.frameIndex); } } initData = initDataWatcher.hasChanged() ? initDataWatcher.update().get() : nullptr; mChannel->onWorkDone( outputFormat = config->mOutputFormat; std::move(work), config->mOutputFormat, } initData.hasChanged() ? initData.update().get() : nullptr); mChannel->onWorkDone(std::move(work), outputFormat, initData); break; break; } } case kWhatWatch: { case kWhatWatch: { Loading Loading @@ -2315,13 +2305,9 @@ void CCodec::initiateReleaseIfStuck() { pendingDeadline = true; pendingDeadline = true; } } } } bool tunneled = false; { Mutexed<std::unique_ptr<Config>>::Locked configLocked(mConfig); Mutexed<std::unique_ptr<Config>>::Locked configLocked(mConfig); const std::unique_ptr<Config> &config = *configLocked; const std::unique_ptr<Config> &config = *configLocked; tunneled = config->mTunneled; if (config->mTunneled == false && name.empty()) { } if (!tunneled && name.empty()) { constexpr std::chrono::steady_clock::duration kWorkDurationThreshold = 3s; constexpr std::chrono::steady_clock::duration kWorkDurationThreshold = 3s; std::chrono::steady_clock::duration elapsed = mChannel->elapsed(); std::chrono::steady_clock::duration elapsed = mChannel->elapsed(); if (elapsed >= kWorkDurationThreshold) { if (elapsed >= kWorkDurationThreshold) { Loading Loading
media/codec2/sfplugin/CCodec.cpp +78 −92 Original line number Original line Diff line number Diff line Loading @@ -1796,7 +1796,6 @@ void CCodec::release(bool sendCallback) { } } status_t CCodec::setSurface(const sp<Surface> &surface) { status_t CCodec::setSurface(const sp<Surface> &surface) { { Mutexed<std::unique_ptr<Config>>::Locked configLocked(mConfig); Mutexed<std::unique_ptr<Config>>::Locked configLocked(mConfig); const std::unique_ptr<Config> &config = *configLocked; const std::unique_ptr<Config> &config = *configLocked; if (config->mTunneled && config->mSidebandHandle != nullptr) { if (config->mTunneled && config->mSidebandHandle != nullptr) { Loading @@ -1810,7 +1809,6 @@ status_t CCodec::setSurface(const sp<Surface> &surface) { return err; return err; } } } } } return mChannel->setSurface(surface); return mChannel->setSurface(surface); } } Loading Loading @@ -2149,12 +2147,9 @@ void CCodec::onMessageReceived(const sp<AMessage> &msg) { } } // handle configuration changes in work done // handle configuration changes in work done const C2StreamInitDataInfo::output *initData = nullptr; sp<AMessage> outputFormat = nullptr; { Mutexed<std::unique_ptr<Config>>::Locked configLocked(mConfig); Mutexed<std::unique_ptr<Config>>::Locked configLocked(mConfig); const std::unique_ptr<Config> &config = *configLocked; const std::unique_ptr<Config> &config = *configLocked; Config::Watcher<C2StreamInitDataInfo::output> initDataWatcher = Config::Watcher<C2StreamInitDataInfo::output> initData = config->watch<C2StreamInitDataInfo::output>(); config->watch<C2StreamInitDataInfo::output>(); if (!work->worklets.empty() if (!work->worklets.empty() && (work->worklets.front()->output.flags && (work->worklets.front()->output.flags Loading @@ -2167,13 +2162,10 @@ void CCodec::onMessageReceived(const sp<AMessage> &msg) { updates.push_back(C2Param::Copy(*param)); updates.push_back(C2Param::Copy(*param)); } } unsigned stream = 0; unsigned stream = 0; std::vector<std::shared_ptr<C2Buffer>> &outputBuffers = for (const std::shared_ptr<C2Buffer> &buf : work->worklets.front()->output.buffers) { work->worklets.front()->output.buffers; for (const std::shared_ptr<C2Buffer> &buf : outputBuffers) { for (const std::shared_ptr<const C2Info> &info : buf->info()) { for (const std::shared_ptr<const C2Info> &info : buf->info()) { // move all info into output-stream #0 domain // move all info into output-stream #0 domain updates.emplace_back( updates.emplace_back(C2Param::CopyAsStream(*info, true /* output */, stream)); C2Param::CopyAsStream(*info, true /* output */, stream)); } } const std::vector<C2ConstGraphicBlock> blocks = buf->data().graphicBlocks(); const std::vector<C2ConstGraphicBlock> blocks = buf->data().graphicBlocks(); Loading @@ -2184,17 +2176,16 @@ void CCodec::onMessageReceived(const sp<AMessage> &msg) { // block.crop().width, block.crop().height, // block.crop().width, block.crop().height, // block.width(), block.height()); // block.width(), block.height()); const C2ConstGraphicBlock &block = blocks[0]; const C2ConstGraphicBlock &block = blocks[0]; updates.emplace_back(new C2StreamCropRectInfo::output( updates.emplace_back(new C2StreamCropRectInfo::output(stream, block.crop())); stream, block.crop())); updates.emplace_back(new C2StreamPictureSizeInfo::output( updates.emplace_back(new C2StreamPictureSizeInfo::output( stream, block.crop().width, block.crop().height)); stream, block.crop().width, block.crop().height)); } } ++stream; ++stream; } } sp<AMessage> oldFormat = config->mOutputFormat; sp<AMessage> outputFormat = config->mOutputFormat; config->updateConfiguration(updates, config->mOutputDomain); config->updateConfiguration(updates, config->mOutputDomain); RevertOutputFormatIfNeeded(oldFormat, config->mOutputFormat); RevertOutputFormatIfNeeded(outputFormat, config->mOutputFormat); // copy standard infos to graphic buffers if not already present (otherwise, we // copy standard infos to graphic buffers if not already present (otherwise, we // may overwrite the actual intermediate value with a final value) // may overwrite the actual intermediate value with a final value) Loading @@ -2208,7 +2199,7 @@ void CCodec::onMessageReceived(const sp<AMessage> &msg) { C2StreamPixelAspectRatioInfo::output::PARAM_TYPE, C2StreamPixelAspectRatioInfo::output::PARAM_TYPE, C2StreamSurfaceScalingInfo::output::PARAM_TYPE C2StreamSurfaceScalingInfo::output::PARAM_TYPE }; }; for (const std::shared_ptr<C2Buffer> &buf : outputBuffers) { for (const std::shared_ptr<C2Buffer> &buf : work->worklets.front()->output.buffers) { if (buf->data().graphicBlocks().size()) { if (buf->data().graphicBlocks().size()) { for (C2Param::Index ix : stdGfxInfos) { for (C2Param::Index ix : stdGfxInfos) { if (!buf->hasInfo(ix)) { if (!buf->hasInfo(ix)) { Loading @@ -2227,10 +2218,9 @@ void CCodec::onMessageReceived(const sp<AMessage> &msg) { if (config->mInputSurface) { if (config->mInputSurface) { config->mInputSurface->onInputBufferDone(work->input.ordinal.frameIndex); config->mInputSurface->onInputBufferDone(work->input.ordinal.frameIndex); } } initData = initDataWatcher.hasChanged() ? initDataWatcher.update().get() : nullptr; mChannel->onWorkDone( outputFormat = config->mOutputFormat; std::move(work), config->mOutputFormat, } initData.hasChanged() ? initData.update().get() : nullptr); mChannel->onWorkDone(std::move(work), outputFormat, initData); break; break; } } case kWhatWatch: { case kWhatWatch: { Loading Loading @@ -2315,13 +2305,9 @@ void CCodec::initiateReleaseIfStuck() { pendingDeadline = true; pendingDeadline = true; } } } } bool tunneled = false; { Mutexed<std::unique_ptr<Config>>::Locked configLocked(mConfig); Mutexed<std::unique_ptr<Config>>::Locked configLocked(mConfig); const std::unique_ptr<Config> &config = *configLocked; const std::unique_ptr<Config> &config = *configLocked; tunneled = config->mTunneled; if (config->mTunneled == false && name.empty()) { } if (!tunneled && name.empty()) { constexpr std::chrono::steady_clock::duration kWorkDurationThreshold = 3s; constexpr std::chrono::steady_clock::duration kWorkDurationThreshold = 3s; std::chrono::steady_clock::duration elapsed = mChannel->elapsed(); std::chrono::steady_clock::duration elapsed = mChannel->elapsed(); if (elapsed >= kWorkDurationThreshold) { if (elapsed >= kWorkDurationThreshold) { Loading