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

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

Merge "CCodec: hold locks only for needed part" am: 7403e7ea

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

Change-Id: If859bb8a2ca4a12bbc437e6e731e2032121ae48f
parents c7a3fc10 7403e7ea
Loading
Loading
Loading
Loading
+92 −78
Original line number Diff line number Diff line
@@ -1796,6 +1796,7 @@ 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) {
@@ -1809,6 +1810,7 @@ status_t CCodec::setSurface(const sp<Surface> &surface) {
                return err;
            }
        }
    }
    return mChannel->setSurface(surface);
}

@@ -2147,9 +2149,12 @@ 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> initData =
                Config::Watcher<C2StreamInitDataInfo::output> initDataWatcher =
                    config->watch<C2StreamInitDataInfo::output>();
                if (!work->worklets.empty()
                        && (work->worklets.front()->output.flags
@@ -2162,10 +2167,13 @@ void CCodec::onMessageReceived(const sp<AMessage> &msg) {
                        updates.push_back(C2Param::Copy(*param));
                    }
                    unsigned stream = 0;
                for (const std::shared_ptr<C2Buffer> &buf : work->worklets.front()->output.buffers) {
                    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<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();
@@ -2176,16 +2184,17 @@ 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> outputFormat = config->mOutputFormat;
                    sp<AMessage> oldFormat = config->mOutputFormat;
                    config->updateConfiguration(updates, config->mOutputDomain);
                RevertOutputFormatIfNeeded(outputFormat, config->mOutputFormat);
                    RevertOutputFormatIfNeeded(oldFormat, config->mOutputFormat);

                    // copy standard infos to graphic buffers if not already present (otherwise, we
                    // may overwrite the actual intermediate value with a final value)
@@ -2199,7 +2208,7 @@ void CCodec::onMessageReceived(const sp<AMessage> &msg) {
                        C2StreamPixelAspectRatioInfo::output::PARAM_TYPE,
                        C2StreamSurfaceScalingInfo::output::PARAM_TYPE
                    };
                for (const std::shared_ptr<C2Buffer> &buf : work->worklets.front()->output.buffers) {
                    for (const std::shared_ptr<C2Buffer> &buf : outputBuffers) {
                        if (buf->data().graphicBlocks().size()) {
                            for (C2Param::Index ix : stdGfxInfos) {
                                if (!buf->hasInfo(ix)) {
@@ -2218,9 +2227,10 @@ void CCodec::onMessageReceived(const sp<AMessage> &msg) {
                if (config->mInputSurface) {
                    config->mInputSurface->onInputBufferDone(work->input.ordinal.frameIndex);
                }
            mChannel->onWorkDone(
                    std::move(work), config->mOutputFormat,
                    initData.hasChanged() ? initData.update().get() : nullptr);
                initData = initDataWatcher.hasChanged() ? initDataWatcher.update().get() : nullptr;
                outputFormat = config->mOutputFormat;
            }
            mChannel->onWorkDone(std::move(work), outputFormat, initData);
            break;
        }
        case kWhatWatch: {
@@ -2305,9 +2315,13 @@ void CCodec::initiateReleaseIfStuck() {
            pendingDeadline = true;
        }
    }
    bool tunneled = false;
    {
        Mutexed<std::unique_ptr<Config>>::Locked configLocked(mConfig);
        const std::unique_ptr<Config> &config = *configLocked;
    if (config->mTunneled == false && name.empty()) {
        tunneled = config->mTunneled;
    }
    if (!tunneled && name.empty()) {
        constexpr std::chrono::steady_clock::duration kWorkDurationThreshold = 3s;
        std::chrono::steady_clock::duration elapsed = mChannel->elapsed();
        if (elapsed >= kWorkDurationThreshold) {