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

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

Merge "Revert "CCodec: hold locks only for needed part"" am: c7a9ab69

Original change: https://android-review.googlesource.com/c/platform/frameworks/av/+/1679312

Change-Id: Iebd92595b1896698fb8221d94d1d156bdd50934d
parents 0adf1ea5 c7a9ab69
Loading
Loading
Loading
Loading
+78 −92
Original line number Diff line number Diff line
@@ -1796,7 +1796,6 @@ void CCodec::release(bool sendCallback) {
}

status_t CCodec::setSurface(const sp<Surface> &surface) {
    {
    Mutexed<std::unique_ptr<Config>>::Locked configLocked(mConfig);
    const std::unique_ptr<Config> &config = *configLocked;
    if (config->mTunneled && config->mSidebandHandle != nullptr) {
@@ -1810,7 +1809,6 @@ status_t CCodec::setSurface(const sp<Surface> &surface) {
            return err;
        }
    }
    }
    return mChannel->setSurface(surface);
}

@@ -2149,12 +2147,9 @@ void CCodec::onMessageReceived(const sp<AMessage> &msg) {
            }

            // handle configuration changes in work done
            const C2StreamInitDataInfo::output *initData = nullptr;
            sp<AMessage> outputFormat = nullptr;
            {
            Mutexed<std::unique_ptr<Config>>::Locked configLocked(mConfig);
            const std::unique_ptr<Config> &config = *configLocked;
                Config::Watcher<C2StreamInitDataInfo::output> initDataWatcher =
            Config::Watcher<C2StreamInitDataInfo::output> initData =
                config->watch<C2StreamInitDataInfo::output>();
            if (!work->worklets.empty()
                    && (work->worklets.front()->output.flags
@@ -2167,13 +2162,10 @@ void CCodec::onMessageReceived(const sp<AMessage> &msg) {
                    updates.push_back(C2Param::Copy(*param));
                }
                unsigned stream = 0;
                    std::vector<std::shared_ptr<C2Buffer>> &outputBuffers =
                        work->worklets.front()->output.buffers;
                    for (const std::shared_ptr<C2Buffer> &buf : outputBuffers) {
                for (const std::shared_ptr<C2Buffer> &buf : work->worklets.front()->output.buffers) {
                    for (const std::shared_ptr<const C2Info> &info : buf->info()) {
                        // move all info into output-stream #0 domain
                            updates.emplace_back(
                                    C2Param::CopyAsStream(*info, true /* output */, stream));
                        updates.emplace_back(C2Param::CopyAsStream(*info, true /* output */, stream));
                    }

                    const std::vector<C2ConstGraphicBlock> blocks = buf->data().graphicBlocks();
@@ -2184,17 +2176,16 @@ void CCodec::onMessageReceived(const sp<AMessage> &msg) {
                        //      block.crop().width, block.crop().height,
                        //      block.width(), block.height());
                        const C2ConstGraphicBlock &block = blocks[0];
                            updates.emplace_back(new C2StreamCropRectInfo::output(
                                    stream, block.crop()));
                        updates.emplace_back(new C2StreamCropRectInfo::output(stream, block.crop()));
                        updates.emplace_back(new C2StreamPictureSizeInfo::output(
                                stream, block.crop().width, block.crop().height));
                    }
                    ++stream;
                }

                    sp<AMessage> oldFormat = config->mOutputFormat;
                sp<AMessage> outputFormat = config->mOutputFormat;
                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
                // may overwrite the actual intermediate value with a final value)
@@ -2208,7 +2199,7 @@ void CCodec::onMessageReceived(const sp<AMessage> &msg) {
                    C2StreamPixelAspectRatioInfo::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()) {
                        for (C2Param::Index ix : stdGfxInfos) {
                            if (!buf->hasInfo(ix)) {
@@ -2227,10 +2218,9 @@ void CCodec::onMessageReceived(const sp<AMessage> &msg) {
            if (config->mInputSurface) {
                config->mInputSurface->onInputBufferDone(work->input.ordinal.frameIndex);
            }
                initData = initDataWatcher.hasChanged() ? initDataWatcher.update().get() : nullptr;
                outputFormat = config->mOutputFormat;
            }
            mChannel->onWorkDone(std::move(work), outputFormat, initData);
            mChannel->onWorkDone(
                    std::move(work), config->mOutputFormat,
                    initData.hasChanged() ? initData.update().get() : nullptr);
            break;
        }
        case kWhatWatch: {
@@ -2315,13 +2305,9 @@ void CCodec::initiateReleaseIfStuck() {
            pendingDeadline = true;
        }
    }
    bool tunneled = false;
    {
    Mutexed<std::unique_ptr<Config>>::Locked configLocked(mConfig);
    const std::unique_ptr<Config> &config = *configLocked;
        tunneled = config->mTunneled;
    }
    if (!tunneled && name.empty()) {
    if (config->mTunneled == false && name.empty()) {
        constexpr std::chrono::steady_clock::duration kWorkDurationThreshold = 3s;
        std::chrono::steady_clock::duration elapsed = mChannel->elapsed();
        if (elapsed >= kWorkDurationThreshold) {