132a6e48fSopenharmony_ci/*
232a6e48fSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
332a6e48fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
432a6e48fSopenharmony_ci * you may not use this file except in compliance with the License.
532a6e48fSopenharmony_ci * You may obtain a copy of the License at
632a6e48fSopenharmony_ci *
732a6e48fSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
832a6e48fSopenharmony_ci *
932a6e48fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1032a6e48fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1132a6e48fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1232a6e48fSopenharmony_ci * See the License for the specific language governing permissions and
1332a6e48fSopenharmony_ci * limitations under the License.
1432a6e48fSopenharmony_ci */
1532a6e48fSopenharmony_ci
1632a6e48fSopenharmony_ci#include "producer_surface.h"
1732a6e48fSopenharmony_ci
1832a6e48fSopenharmony_ci#include <cinttypes>
1932a6e48fSopenharmony_ci
2032a6e48fSopenharmony_ci#include "buffer_log.h"
2132a6e48fSopenharmony_ci#include "buffer_extra_data_impl.h"
2232a6e48fSopenharmony_ci#include "buffer_producer_listener.h"
2332a6e48fSopenharmony_ci#include "sync_fence.h"
2432a6e48fSopenharmony_ci#include "native_window.h"
2532a6e48fSopenharmony_ci#include "surface_utils.h"
2632a6e48fSopenharmony_ci#include "metadata_helper.h"
2732a6e48fSopenharmony_ci
2832a6e48fSopenharmony_ciusing namespace OHOS::HDI::Display::Graphic::Common::V1_0;
2932a6e48fSopenharmony_cinamespace OHOS {
3032a6e48fSopenharmony_ciconstexpr int32_t FORCE_GLOBAL_ALPHA_MIN = -1;
3132a6e48fSopenharmony_ciconstexpr int32_t FORCE_GLOBAL_ALPHA_MAX = 255;
3232a6e48fSopenharmony_cisptr<Surface> Surface::CreateSurfaceAsProducer(sptr<IBufferProducer>& producer)
3332a6e48fSopenharmony_ci{
3432a6e48fSopenharmony_ci    if (producer == nullptr) {
3532a6e48fSopenharmony_ci        return nullptr;
3632a6e48fSopenharmony_ci    }
3732a6e48fSopenharmony_ci
3832a6e48fSopenharmony_ci    sptr<ProducerSurface> surf = new ProducerSurface(producer);
3932a6e48fSopenharmony_ci    GSError ret = surf->Init();
4032a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
4132a6e48fSopenharmony_ci        BLOGE("producer surf init failed");
4232a6e48fSopenharmony_ci        return nullptr;
4332a6e48fSopenharmony_ci    }
4432a6e48fSopenharmony_ci    auto utils = SurfaceUtils::GetInstance();
4532a6e48fSopenharmony_ci    utils->Add(surf->GetUniqueId(), surf);
4632a6e48fSopenharmony_ci    return surf;
4732a6e48fSopenharmony_ci}
4832a6e48fSopenharmony_ci
4932a6e48fSopenharmony_ciProducerSurface::ProducerSurface(sptr<IBufferProducer>& producer)
5032a6e48fSopenharmony_ci{
5132a6e48fSopenharmony_ci    producer_ = producer;
5232a6e48fSopenharmony_ci    GetProducerInitInfo(initInfo_);
5332a6e48fSopenharmony_ci    windowConfig_.width = initInfo_.width;
5432a6e48fSopenharmony_ci    windowConfig_.height = initInfo_.height;
5532a6e48fSopenharmony_ci    windowConfig_.usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_MEM_DMA;
5632a6e48fSopenharmony_ci    windowConfig_.format = GRAPHIC_PIXEL_FMT_RGBA_8888;
5732a6e48fSopenharmony_ci    windowConfig_.strideAlignment = 8;     // default stride is 8
5832a6e48fSopenharmony_ci    windowConfig_.timeout = 3000;          // default timeout is 3000 ms
5932a6e48fSopenharmony_ci    windowConfig_.colorGamut = GraphicColorGamut::GRAPHIC_COLOR_GAMUT_SRGB;
6032a6e48fSopenharmony_ci    windowConfig_.transform = GraphicTransformType::GRAPHIC_ROTATE_NONE;
6132a6e48fSopenharmony_ci    BLOGD("ProducerSurface ctor");
6232a6e48fSopenharmony_ci}
6332a6e48fSopenharmony_ci
6432a6e48fSopenharmony_ciProducerSurface::~ProducerSurface()
6532a6e48fSopenharmony_ci{
6632a6e48fSopenharmony_ci    BLOGD("~ProducerSurface dtor, name: %{public}s, uniqueId: %{public}" PRIu64 ".", name_.c_str(), queueId_);
6732a6e48fSopenharmony_ci    Disconnect();
6832a6e48fSopenharmony_ci    auto utils = SurfaceUtils::GetInstance();
6932a6e48fSopenharmony_ci    utils->Remove(GetUniqueId());
7032a6e48fSopenharmony_ci}
7132a6e48fSopenharmony_ci
7232a6e48fSopenharmony_ciGSError ProducerSurface::GetProducerInitInfo(ProducerInitInfo& info)
7332a6e48fSopenharmony_ci{
7432a6e48fSopenharmony_ci    if (producer_ == nullptr) {
7532a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
7632a6e48fSopenharmony_ci    }
7732a6e48fSopenharmony_ci    return producer_->GetProducerInitInfo(info);
7832a6e48fSopenharmony_ci}
7932a6e48fSopenharmony_ci
8032a6e48fSopenharmony_ciGSError ProducerSurface::Init()
8132a6e48fSopenharmony_ci{
8232a6e48fSopenharmony_ci    if (inited_.load()) {
8332a6e48fSopenharmony_ci        return GSERROR_OK;
8432a6e48fSopenharmony_ci    }
8532a6e48fSopenharmony_ci    name_ = initInfo_.name;
8632a6e48fSopenharmony_ci    queueId_ = initInfo_.uniqueId;
8732a6e48fSopenharmony_ci    inited_.store(true);
8832a6e48fSopenharmony_ci    BLOGD("Init name: %{public}s, uniqueId: %{public}" PRIu64 ".", name_.c_str(), queueId_);
8932a6e48fSopenharmony_ci    return GSERROR_OK;
9032a6e48fSopenharmony_ci}
9132a6e48fSopenharmony_ci
9232a6e48fSopenharmony_cibool ProducerSurface::IsConsumer() const
9332a6e48fSopenharmony_ci{
9432a6e48fSopenharmony_ci    return false;
9532a6e48fSopenharmony_ci}
9632a6e48fSopenharmony_ci
9732a6e48fSopenharmony_cisptr<IBufferProducer> ProducerSurface::GetProducer() const
9832a6e48fSopenharmony_ci{
9932a6e48fSopenharmony_ci    return producer_;
10032a6e48fSopenharmony_ci}
10132a6e48fSopenharmony_ci
10232a6e48fSopenharmony_ciGSError ProducerSurface::RequestBuffer(sptr<SurfaceBuffer>& buffer,
10332a6e48fSopenharmony_ci                                       sptr<SyncFence>& fence, BufferRequestConfig& config)
10432a6e48fSopenharmony_ci{
10532a6e48fSopenharmony_ci    if (producer_ == nullptr) {
10632a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
10732a6e48fSopenharmony_ci    }
10832a6e48fSopenharmony_ci    IBufferProducer::RequestBufferReturnValue retval;
10932a6e48fSopenharmony_ci    sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
11032a6e48fSopenharmony_ci    GSError ret;
11132a6e48fSopenharmony_ci    {
11232a6e48fSopenharmony_ci        std::lock_guard<std::mutex> lockGuard(mutex_);
11332a6e48fSopenharmony_ci        ret = producer_->RequestBuffer(config, bedataimpl, retval);
11432a6e48fSopenharmony_ci        if (ret != GSERROR_OK) {
11532a6e48fSopenharmony_ci            if (ret == GSERROR_NO_CONSUMER) {
11632a6e48fSopenharmony_ci                CleanCacheLocked(false);
11732a6e48fSopenharmony_ci            }
11832a6e48fSopenharmony_ci            /**
11932a6e48fSopenharmony_ci             * if server is connected, but result is failed.
12032a6e48fSopenharmony_ci             * client needs to synchronize status.
12132a6e48fSopenharmony_ci             */
12232a6e48fSopenharmony_ci            if (retval.isConnected) {
12332a6e48fSopenharmony_ci                isDisconnected_ = false;
12432a6e48fSopenharmony_ci            }
12532a6e48fSopenharmony_ci            BLOGD("RequestBuffer ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
12632a6e48fSopenharmony_ci            return ret;
12732a6e48fSopenharmony_ci        }
12832a6e48fSopenharmony_ci        isDisconnected_ = false;
12932a6e48fSopenharmony_ci        AddCacheLocked(bedataimpl, retval, config);
13032a6e48fSopenharmony_ci    }
13132a6e48fSopenharmony_ci    buffer = retval.buffer;
13232a6e48fSopenharmony_ci    fence = retval.fence;
13332a6e48fSopenharmony_ci
13432a6e48fSopenharmony_ci    OutputRequestBufferLog(buffer);
13532a6e48fSopenharmony_ci
13632a6e48fSopenharmony_ci    ret = SetMetadataValve(buffer);
13732a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
13832a6e48fSopenharmony_ci        BLOGD("SetMetadataValve ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
13932a6e48fSopenharmony_ci    }
14032a6e48fSopenharmony_ci    return ret;
14132a6e48fSopenharmony_ci}
14232a6e48fSopenharmony_ci
14332a6e48fSopenharmony_ciGSError ProducerSurface::SetMetadataValve(sptr<SurfaceBuffer>& buffer)
14432a6e48fSopenharmony_ci{
14532a6e48fSopenharmony_ci    GSError ret = GSERROR_OK;
14632a6e48fSopenharmony_ci    std::vector<uint8_t> metaData;
14732a6e48fSopenharmony_ci    std::string value = GetUserData("ATTRKEY_COLORSPACE_INFO");
14832a6e48fSopenharmony_ci    if (!value.empty()) {
14932a6e48fSopenharmony_ci        ret = MetadataHelper::SetColorSpaceType(buffer, static_cast<CM_ColorSpaceType>(atoi(value.c_str())));
15032a6e48fSopenharmony_ci        if (ret != GSERROR_OK) {
15132a6e48fSopenharmony_ci            BLOGD("SetColorSpaceType ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
15232a6e48fSopenharmony_ci            return ret;
15332a6e48fSopenharmony_ci        }
15432a6e48fSopenharmony_ci    }
15532a6e48fSopenharmony_ci    value = GetUserData("OH_HDR_DYNAMIC_METADATA");
15632a6e48fSopenharmony_ci    if (!value.empty()) {
15732a6e48fSopenharmony_ci        metaData.resize(value.size());
15832a6e48fSopenharmony_ci        metaData.assign(value.begin(), value.end());
15932a6e48fSopenharmony_ci        ret = MetadataHelper::SetHDRStaticMetadata(buffer, metaData);
16032a6e48fSopenharmony_ci        if (ret != GSERROR_OK) {
16132a6e48fSopenharmony_ci            BLOGD("SetHDRStaticMetadata ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
16232a6e48fSopenharmony_ci            return ret;
16332a6e48fSopenharmony_ci        }
16432a6e48fSopenharmony_ci    }
16532a6e48fSopenharmony_ci    value = GetUserData("OH_HDR_STATIC_METADATA");
16632a6e48fSopenharmony_ci    if (!value.empty()) {
16732a6e48fSopenharmony_ci        metaData.resize(value.size());
16832a6e48fSopenharmony_ci        metaData.assign(value.begin(), value.end());
16932a6e48fSopenharmony_ci        ret = MetadataHelper::SetHDRStaticMetadata(buffer, metaData);
17032a6e48fSopenharmony_ci        if (ret != GSERROR_OK) {
17132a6e48fSopenharmony_ci            BLOGD("SetHDRStaticMetadata ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
17232a6e48fSopenharmony_ci            return ret;
17332a6e48fSopenharmony_ci        }
17432a6e48fSopenharmony_ci    }
17532a6e48fSopenharmony_ci    value = GetUserData("OH_HDR_METADATA_TYPE");
17632a6e48fSopenharmony_ci    if (!value.empty()) {
17732a6e48fSopenharmony_ci        ret = MetadataHelper::SetHDRMetadataType(buffer, static_cast<CM_HDR_Metadata_Type>(atoi(value.c_str())));
17832a6e48fSopenharmony_ci        if (ret != GSERROR_OK) {
17932a6e48fSopenharmony_ci            BLOGD("SetHDRMetadataType ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
18032a6e48fSopenharmony_ci        }
18132a6e48fSopenharmony_ci    }
18232a6e48fSopenharmony_ci    return ret;
18332a6e48fSopenharmony_ci}
18432a6e48fSopenharmony_ci
18532a6e48fSopenharmony_civoid ProducerSurface::OutputRequestBufferLog(sptr<SurfaceBuffer>& buffer)
18632a6e48fSopenharmony_ci{
18732a6e48fSopenharmony_ci    if (name_ != "RosenWeb") {
18832a6e48fSopenharmony_ci        return;
18932a6e48fSopenharmony_ci    }
19032a6e48fSopenharmony_ci
19132a6e48fSopenharmony_ci    static uint64_t fdRec[1024] = { 0 };
19232a6e48fSopenharmony_ci    int32_t fd = buffer->GetBufferHandle()->fd;
19332a6e48fSopenharmony_ci    int32_t fdTmp = fd < 1024 ? fd : fd % 1024;
19432a6e48fSopenharmony_ci
19532a6e48fSopenharmony_ci    if (fdRec[fdTmp] != queueId_) {
19632a6e48fSopenharmony_ci        BLOGD("RequestBuffer, surfaceId %{public}" PRIu64 ", bufferFd: %{public}d.", queueId_, fd);
19732a6e48fSopenharmony_ci        fdRec[fdTmp] = queueId_;
19832a6e48fSopenharmony_ci    }
19932a6e48fSopenharmony_ci}
20032a6e48fSopenharmony_ci
20132a6e48fSopenharmony_ciGSError ProducerSurface::AddCacheLocked(sptr<BufferExtraData>& bedataimpl,
20232a6e48fSopenharmony_ci    IBufferProducer::RequestBufferReturnValue& retval, BufferRequestConfig& config)
20332a6e48fSopenharmony_ci{
20432a6e48fSopenharmony_ci    // add cache
20532a6e48fSopenharmony_ci    if (retval.buffer != nullptr) {
20632a6e48fSopenharmony_ci        bufferProducerCache_[retval.sequence] = retval.buffer;
20732a6e48fSopenharmony_ci    } else {
20832a6e48fSopenharmony_ci        auto it = bufferProducerCache_.find(retval.sequence);
20932a6e48fSopenharmony_ci        if (it == bufferProducerCache_.end()) {
21032a6e48fSopenharmony_ci            BLOGE("cache not find buffer(%{public}u), uniqueId: %{public}" PRIu64 ".", retval.sequence, queueId_);
21132a6e48fSopenharmony_ci            return SURFACE_ERROR_UNKOWN;
21232a6e48fSopenharmony_ci        } else {
21332a6e48fSopenharmony_ci            retval.buffer = it->second;
21432a6e48fSopenharmony_ci        }
21532a6e48fSopenharmony_ci    }
21632a6e48fSopenharmony_ci    if (retval.buffer != nullptr) {
21732a6e48fSopenharmony_ci        retval.buffer->SetSurfaceBufferColorGamut(config.colorGamut);
21832a6e48fSopenharmony_ci        retval.buffer->SetSurfaceBufferTransform(config.transform);
21932a6e48fSopenharmony_ci        retval.buffer->SetExtraData(bedataimpl);
22032a6e48fSopenharmony_ci    }
22132a6e48fSopenharmony_ci    for (auto it = retval.deletingBuffers.begin(); it != retval.deletingBuffers.end(); it++) {
22232a6e48fSopenharmony_ci        uint32_t seqNum = static_cast<uint32_t>(*it);
22332a6e48fSopenharmony_ci        bufferProducerCache_.erase(seqNum);
22432a6e48fSopenharmony_ci        auto spNativeWindow = wpNativeWindow_.promote();
22532a6e48fSopenharmony_ci        if (spNativeWindow != nullptr) {
22632a6e48fSopenharmony_ci            auto& bufferCache = spNativeWindow->bufferCache_;
22732a6e48fSopenharmony_ci            auto iter = bufferCache.find(seqNum);
22832a6e48fSopenharmony_ci            if (iter != bufferCache.end()) {
22932a6e48fSopenharmony_ci                NativeObjectUnreference(iter->second);
23032a6e48fSopenharmony_ci                bufferCache.erase(iter);
23132a6e48fSopenharmony_ci            }
23232a6e48fSopenharmony_ci        }
23332a6e48fSopenharmony_ci    }
23432a6e48fSopenharmony_ci    return SURFACE_ERROR_OK;
23532a6e48fSopenharmony_ci}
23632a6e48fSopenharmony_ci
23732a6e48fSopenharmony_ciGSError ProducerSurface::RequestBuffers(std::vector<sptr<SurfaceBuffer>>& buffers,
23832a6e48fSopenharmony_ci    std::vector<sptr<SyncFence>>& fences, BufferRequestConfig& config)
23932a6e48fSopenharmony_ci{
24032a6e48fSopenharmony_ci    if (producer_ == nullptr) {
24132a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
24232a6e48fSopenharmony_ci    }
24332a6e48fSopenharmony_ci    std::vector<IBufferProducer::RequestBufferReturnValue> retvalues;
24432a6e48fSopenharmony_ci    retvalues.resize(SURFACE_MAX_QUEUE_SIZE);
24532a6e48fSopenharmony_ci    std::vector<sptr<BufferExtraData>> bedataimpls;
24632a6e48fSopenharmony_ci    for (size_t i = 0; i < retvalues.size(); ++i) {
24732a6e48fSopenharmony_ci        sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
24832a6e48fSopenharmony_ci        bedataimpls.emplace_back(bedataimpl);
24932a6e48fSopenharmony_ci    }
25032a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lockGuard(mutex_);
25132a6e48fSopenharmony_ci    GSError ret = producer_->RequestBuffers(config, bedataimpls, retvalues);
25232a6e48fSopenharmony_ci    if (ret != GSERROR_NO_BUFFER && ret != GSERROR_OK) {
25332a6e48fSopenharmony_ci        /**
25432a6e48fSopenharmony_ci         * if server is connected, but result is failed.
25532a6e48fSopenharmony_ci         * client needs to synchronize status.
25632a6e48fSopenharmony_ci         */
25732a6e48fSopenharmony_ci        if (retvalues[0].isConnected) {
25832a6e48fSopenharmony_ci            isDisconnected_ = false;
25932a6e48fSopenharmony_ci        }
26032a6e48fSopenharmony_ci        BLOGD("RequestBuffers ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
26132a6e48fSopenharmony_ci        return ret;
26232a6e48fSopenharmony_ci    }
26332a6e48fSopenharmony_ci    isDisconnected_ = false;
26432a6e48fSopenharmony_ci    for (size_t i = 0; i < retvalues.size(); ++i) {
26532a6e48fSopenharmony_ci        AddCacheLocked(bedataimpls[i], retvalues[i], config);
26632a6e48fSopenharmony_ci        buffers.emplace_back(retvalues[i].buffer);
26732a6e48fSopenharmony_ci        fences.emplace_back(retvalues[i].fence);
26832a6e48fSopenharmony_ci    }
26932a6e48fSopenharmony_ci    return GSERROR_OK;
27032a6e48fSopenharmony_ci}
27132a6e48fSopenharmony_ci
27232a6e48fSopenharmony_ciGSError ProducerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer,
27332a6e48fSopenharmony_ci                                     const sptr<SyncFence>& fence, BufferFlushConfig& config)
27432a6e48fSopenharmony_ci{
27532a6e48fSopenharmony_ci    BufferFlushConfigWithDamages configWithDamages;
27632a6e48fSopenharmony_ci    configWithDamages.damages.push_back(config.damage);
27732a6e48fSopenharmony_ci    configWithDamages.timestamp = config.timestamp;
27832a6e48fSopenharmony_ci    configWithDamages.desiredPresentTimestamp = config.desiredPresentTimestamp;
27932a6e48fSopenharmony_ci    return FlushBuffer(buffer, fence, configWithDamages);
28032a6e48fSopenharmony_ci}
28132a6e48fSopenharmony_ci
28232a6e48fSopenharmony_ciGSError ProducerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence,
28332a6e48fSopenharmony_ci                                     BufferFlushConfigWithDamages& config)
28432a6e48fSopenharmony_ci{
28532a6e48fSopenharmony_ci    if (buffer == nullptr || fence == nullptr || producer_ == nullptr) {
28632a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
28732a6e48fSopenharmony_ci    }
28832a6e48fSopenharmony_ci
28932a6e48fSopenharmony_ci    sptr<BufferExtraData> bedata = buffer->GetExtraData();
29032a6e48fSopenharmony_ci    if (bedata == nullptr) {
29132a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
29232a6e48fSopenharmony_ci    }
29332a6e48fSopenharmony_ci    auto ret = producer_->FlushBuffer(buffer->GetSeqNum(), bedata, fence, config);
29432a6e48fSopenharmony_ci    if (ret == GSERROR_NO_CONSUMER) {
29532a6e48fSopenharmony_ci        CleanCache();
29632a6e48fSopenharmony_ci        BLOGD("FlushBuffer ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
29732a6e48fSopenharmony_ci    }
29832a6e48fSopenharmony_ci    return ret;
29932a6e48fSopenharmony_ci}
30032a6e48fSopenharmony_ci
30132a6e48fSopenharmony_ciGSError ProducerSurface::FlushBuffers(const std::vector<sptr<SurfaceBuffer>>& buffers,
30232a6e48fSopenharmony_ci    const std::vector<sptr<SyncFence>>& fences, const std::vector<BufferFlushConfigWithDamages>& configs)
30332a6e48fSopenharmony_ci{
30432a6e48fSopenharmony_ci    if (buffers.size() == 0 || buffers.size() != fences.size() || producer_ == nullptr) {
30532a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
30632a6e48fSopenharmony_ci    }
30732a6e48fSopenharmony_ci    for (size_t i = 0; i < buffers.size(); ++i) {
30832a6e48fSopenharmony_ci        if (buffers[i] == nullptr || fences[i] == nullptr) {
30932a6e48fSopenharmony_ci            BLOGE("buffer or fence is nullptr, i: %{public}zu, uniqueId: %{public}" PRIu64 ".", i, queueId_);
31032a6e48fSopenharmony_ci            return GSERROR_INVALID_ARGUMENTS;
31132a6e48fSopenharmony_ci        }
31232a6e48fSopenharmony_ci    }
31332a6e48fSopenharmony_ci    std::vector<sptr<BufferExtraData>> bedata;
31432a6e48fSopenharmony_ci    bedata.reserve(buffers.size());
31532a6e48fSopenharmony_ci    std::vector<uint32_t> sequences;
31632a6e48fSopenharmony_ci    sequences.reserve(buffers.size());
31732a6e48fSopenharmony_ci    for (uint32_t i = 0; i < buffers.size(); ++i) {
31832a6e48fSopenharmony_ci        bedata.emplace_back(buffers[i]->GetExtraData());
31932a6e48fSopenharmony_ci        sequences.emplace_back(buffers[i]->GetSeqNum());
32032a6e48fSopenharmony_ci    }
32132a6e48fSopenharmony_ci    auto ret = producer_->FlushBuffers(sequences, bedata, fences, configs);
32232a6e48fSopenharmony_ci    if (ret == GSERROR_NO_CONSUMER) {
32332a6e48fSopenharmony_ci        CleanCache();
32432a6e48fSopenharmony_ci        BLOGD("FlushBuffers ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
32532a6e48fSopenharmony_ci    }
32632a6e48fSopenharmony_ci    return ret;
32732a6e48fSopenharmony_ci}
32832a6e48fSopenharmony_ci
32932a6e48fSopenharmony_ciGSError ProducerSurface::GetLastFlushedBuffer(sptr<SurfaceBuffer>& buffer,
33032a6e48fSopenharmony_ci    sptr<SyncFence>& fence, float matrix[16], bool isUseNewMatrix)
33132a6e48fSopenharmony_ci{
33232a6e48fSopenharmony_ci    if (producer_ == nullptr) {
33332a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
33432a6e48fSopenharmony_ci    }
33532a6e48fSopenharmony_ci    return producer_->GetLastFlushedBuffer(buffer, fence, matrix, isUseNewMatrix);
33632a6e48fSopenharmony_ci}
33732a6e48fSopenharmony_ci
33832a6e48fSopenharmony_ciGSError ProducerSurface::RequestBuffer(sptr<SurfaceBuffer>& buffer,
33932a6e48fSopenharmony_ci    int32_t& fence, BufferRequestConfig& config)
34032a6e48fSopenharmony_ci{
34132a6e48fSopenharmony_ci    sptr<SyncFence> syncFence = SyncFence::InvalidFence();
34232a6e48fSopenharmony_ci    auto ret = RequestBuffer(buffer, syncFence, config);
34332a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
34432a6e48fSopenharmony_ci        fence = -1;
34532a6e48fSopenharmony_ci        return ret;
34632a6e48fSopenharmony_ci    }
34732a6e48fSopenharmony_ci    fence = syncFence->Dup();
34832a6e48fSopenharmony_ci    return GSERROR_OK;
34932a6e48fSopenharmony_ci}
35032a6e48fSopenharmony_ci
35132a6e48fSopenharmony_ciGSError ProducerSurface::CancelBuffer(sptr<SurfaceBuffer>& buffer)
35232a6e48fSopenharmony_ci{
35332a6e48fSopenharmony_ci    if (buffer == nullptr || producer_ == nullptr) {
35432a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
35532a6e48fSopenharmony_ci    }
35632a6e48fSopenharmony_ci
35732a6e48fSopenharmony_ci    sptr<BufferExtraData> bedata = buffer->GetExtraData();
35832a6e48fSopenharmony_ci    if (bedata == nullptr) {
35932a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
36032a6e48fSopenharmony_ci    }
36132a6e48fSopenharmony_ci    return producer_->CancelBuffer(buffer->GetSeqNum(), bedata);
36232a6e48fSopenharmony_ci}
36332a6e48fSopenharmony_ci
36432a6e48fSopenharmony_ciGSError ProducerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer,
36532a6e48fSopenharmony_ci    int32_t fence, BufferFlushConfig& config)
36632a6e48fSopenharmony_ci{
36732a6e48fSopenharmony_ci    sptr<SyncFence> syncFence = new SyncFence(fence);
36832a6e48fSopenharmony_ci    return FlushBuffer(buffer, syncFence, config);
36932a6e48fSopenharmony_ci}
37032a6e48fSopenharmony_ci
37132a6e48fSopenharmony_ciGSError ProducerSurface::AttachBufferToQueue(sptr<SurfaceBuffer> buffer)
37232a6e48fSopenharmony_ci{
37332a6e48fSopenharmony_ci    if (buffer == nullptr || producer_ == nullptr) {
37432a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
37532a6e48fSopenharmony_ci    }
37632a6e48fSopenharmony_ci    auto ret = producer_->AttachBufferToQueue(buffer);
37732a6e48fSopenharmony_ci    if (ret == GSERROR_OK) {
37832a6e48fSopenharmony_ci        std::lock_guard<std::mutex> lockGuard(mutex_);
37932a6e48fSopenharmony_ci        if (bufferProducerCache_.find(buffer->GetSeqNum()) != bufferProducerCache_.end()) {
38032a6e48fSopenharmony_ci            BLOGE("Attach buffer %{public}d, uniqueId: %{public}" PRIu64 ".", buffer->GetSeqNum(), queueId_);
38132a6e48fSopenharmony_ci            return SURFACE_ERROR_BUFFER_IS_INCACHE;
38232a6e48fSopenharmony_ci        }
38332a6e48fSopenharmony_ci        bufferProducerCache_[buffer->GetSeqNum()] = buffer;
38432a6e48fSopenharmony_ci    }
38532a6e48fSopenharmony_ci    return ret;
38632a6e48fSopenharmony_ci}
38732a6e48fSopenharmony_ci
38832a6e48fSopenharmony_ciGSError ProducerSurface::DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)
38932a6e48fSopenharmony_ci{
39032a6e48fSopenharmony_ci    if (buffer == nullptr || producer_ == nullptr) {
39132a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
39232a6e48fSopenharmony_ci    }
39332a6e48fSopenharmony_ci    auto ret = producer_->DetachBufferFromQueue(buffer);
39432a6e48fSopenharmony_ci    if (ret == GSERROR_OK) {
39532a6e48fSopenharmony_ci        std::lock_guard<std::mutex> lockGuard(mutex_);
39632a6e48fSopenharmony_ci        auto it = bufferProducerCache_.find(buffer->GetSeqNum());
39732a6e48fSopenharmony_ci        if (it == bufferProducerCache_.end()) {
39832a6e48fSopenharmony_ci            BLOGE("Detach buffer %{public}d, uniqueId: %{public}" PRIu64 ".", buffer->GetSeqNum(), queueId_);
39932a6e48fSopenharmony_ci            return SURFACE_ERROR_BUFFER_NOT_INCACHE;
40032a6e48fSopenharmony_ci        }
40132a6e48fSopenharmony_ci        bufferProducerCache_.erase(it);
40232a6e48fSopenharmony_ci    }
40332a6e48fSopenharmony_ci    return ret;
40432a6e48fSopenharmony_ci}
40532a6e48fSopenharmony_ci
40632a6e48fSopenharmony_ciGSError ProducerSurface::AttachBuffer(sptr<SurfaceBuffer>& buffer)
40732a6e48fSopenharmony_ci{
40832a6e48fSopenharmony_ci    if (buffer == nullptr || producer_ == nullptr) {
40932a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
41032a6e48fSopenharmony_ci    }
41132a6e48fSopenharmony_ci
41232a6e48fSopenharmony_ci    return producer_->AttachBuffer(buffer);
41332a6e48fSopenharmony_ci}
41432a6e48fSopenharmony_ci
41532a6e48fSopenharmony_ciGSError ProducerSurface::AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut)
41632a6e48fSopenharmony_ci{
41732a6e48fSopenharmony_ci    if (buffer == nullptr || producer_ == nullptr) {
41832a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
41932a6e48fSopenharmony_ci    }
42032a6e48fSopenharmony_ci
42132a6e48fSopenharmony_ci    return producer_->AttachBuffer(buffer, timeOut);
42232a6e48fSopenharmony_ci}
42332a6e48fSopenharmony_ci
42432a6e48fSopenharmony_ciGSError ProducerSurface::DetachBuffer(sptr<SurfaceBuffer>& buffer)
42532a6e48fSopenharmony_ci{
42632a6e48fSopenharmony_ci    if (buffer == nullptr || producer_ == nullptr) {
42732a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
42832a6e48fSopenharmony_ci    }
42932a6e48fSopenharmony_ci    return producer_->DetachBuffer(buffer);
43032a6e48fSopenharmony_ci}
43132a6e48fSopenharmony_ci
43232a6e48fSopenharmony_ciGSError ProducerSurface::RegisterSurfaceDelegator(sptr<IRemoteObject> client)
43332a6e48fSopenharmony_ci{
43432a6e48fSopenharmony_ci    if (client == nullptr) {
43532a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
43632a6e48fSopenharmony_ci    }
43732a6e48fSopenharmony_ci    sptr<ProducerSurfaceDelegator> surfaceDelegator = ProducerSurfaceDelegator::Create();
43832a6e48fSopenharmony_ci    if (surfaceDelegator == nullptr) {
43932a6e48fSopenharmony_ci        BLOGE("surfaceDelegator is nullptr");
44032a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
44132a6e48fSopenharmony_ci    }
44232a6e48fSopenharmony_ci    if (!surfaceDelegator->SetClient(client)) {
44332a6e48fSopenharmony_ci        BLOGE("SetClient failed");
44432a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
44532a6e48fSopenharmony_ci    }
44632a6e48fSopenharmony_ci
44732a6e48fSopenharmony_ci    surfaceDelegator->SetSurface(this);
44832a6e48fSopenharmony_ci    {
44932a6e48fSopenharmony_ci        std::lock_guard<std::mutex> lockGuard(delegatorMutex_);
45032a6e48fSopenharmony_ci        wpPSurfaceDelegator_ = surfaceDelegator;
45132a6e48fSopenharmony_ci    }
45232a6e48fSopenharmony_ci
45332a6e48fSopenharmony_ci    auto releaseBufferCallBack = [weakThis = wptr(this)] (const sptr<SurfaceBuffer>& buffer,
45432a6e48fSopenharmony_ci        const sptr<SyncFence>& fence) -> GSError {
45532a6e48fSopenharmony_ci        auto pSurface = weakThis.promote();
45632a6e48fSopenharmony_ci        if (pSurface == nullptr) {
45732a6e48fSopenharmony_ci            BLOGE("pSurface is nullptr");
45832a6e48fSopenharmony_ci            return GSERROR_INVALID_ARGUMENTS;
45932a6e48fSopenharmony_ci        }
46032a6e48fSopenharmony_ci        sptr<ProducerSurfaceDelegator> surfaceDelegator = nullptr;
46132a6e48fSopenharmony_ci        {
46232a6e48fSopenharmony_ci            std::lock_guard<std::mutex> lockGuard(pSurface->delegatorMutex_);
46332a6e48fSopenharmony_ci            surfaceDelegator = pSurface->wpPSurfaceDelegator_.promote();
46432a6e48fSopenharmony_ci        }
46532a6e48fSopenharmony_ci        if (surfaceDelegator == nullptr) {
46632a6e48fSopenharmony_ci            return GSERROR_INVALID_ARGUMENTS;
46732a6e48fSopenharmony_ci        }
46832a6e48fSopenharmony_ci        int error = surfaceDelegator->ReleaseBuffer(buffer, fence);
46932a6e48fSopenharmony_ci        return static_cast<GSError>(error);
47032a6e48fSopenharmony_ci    };
47132a6e48fSopenharmony_ci    RegisterReleaseListener(releaseBufferCallBack);
47232a6e48fSopenharmony_ci    return GSERROR_OK;
47332a6e48fSopenharmony_ci}
47432a6e48fSopenharmony_ci
47532a6e48fSopenharmony_cibool ProducerSurface::QueryIfBufferAvailable()
47632a6e48fSopenharmony_ci{
47732a6e48fSopenharmony_ci    return false;
47832a6e48fSopenharmony_ci}
47932a6e48fSopenharmony_ci
48032a6e48fSopenharmony_ciuint32_t ProducerSurface::GetQueueSize()
48132a6e48fSopenharmony_ci{
48232a6e48fSopenharmony_ci    if (producer_ == nullptr) {
48332a6e48fSopenharmony_ci        return 0;
48432a6e48fSopenharmony_ci    }
48532a6e48fSopenharmony_ci    return producer_->GetQueueSize();
48632a6e48fSopenharmony_ci}
48732a6e48fSopenharmony_ci
48832a6e48fSopenharmony_ciGSError ProducerSurface::SetQueueSize(uint32_t queueSize)
48932a6e48fSopenharmony_ci{
49032a6e48fSopenharmony_ci    if (producer_ == nullptr) {
49132a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
49232a6e48fSopenharmony_ci    }
49332a6e48fSopenharmony_ci    return producer_->SetQueueSize(queueSize);
49432a6e48fSopenharmony_ci}
49532a6e48fSopenharmony_ci
49632a6e48fSopenharmony_ciconst std::string& ProducerSurface::GetName()
49732a6e48fSopenharmony_ci{
49832a6e48fSopenharmony_ci    if (!inited_.load()) {
49932a6e48fSopenharmony_ci        BLOGW("ProducerSurface is not initialized.");
50032a6e48fSopenharmony_ci    }
50132a6e48fSopenharmony_ci    return name_;
50232a6e48fSopenharmony_ci}
50332a6e48fSopenharmony_ci
50432a6e48fSopenharmony_ciint32_t ProducerSurface::GetDefaultWidth()
50532a6e48fSopenharmony_ci{
50632a6e48fSopenharmony_ci    if (producer_ == nullptr) {
50732a6e48fSopenharmony_ci        return -1;
50832a6e48fSopenharmony_ci    }
50932a6e48fSopenharmony_ci    return producer_->GetDefaultWidth();
51032a6e48fSopenharmony_ci}
51132a6e48fSopenharmony_ci
51232a6e48fSopenharmony_ciint32_t ProducerSurface::GetDefaultHeight()
51332a6e48fSopenharmony_ci{
51432a6e48fSopenharmony_ci    if (producer_ == nullptr) {
51532a6e48fSopenharmony_ci        return -1;
51632a6e48fSopenharmony_ci    }
51732a6e48fSopenharmony_ci    return producer_->GetDefaultHeight();
51832a6e48fSopenharmony_ci}
51932a6e48fSopenharmony_ci
52032a6e48fSopenharmony_ciGraphicTransformType ProducerSurface::GetTransformHint() const
52132a6e48fSopenharmony_ci{
52232a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lockGuard(mutex_);
52332a6e48fSopenharmony_ci    return lastSetTransformHint_;
52432a6e48fSopenharmony_ci}
52532a6e48fSopenharmony_ci
52632a6e48fSopenharmony_ciGSError ProducerSurface::SetTransformHint(GraphicTransformType transformHint)
52732a6e48fSopenharmony_ci{
52832a6e48fSopenharmony_ci    if (producer_ == nullptr) {
52932a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
53032a6e48fSopenharmony_ci    }
53132a6e48fSopenharmony_ci    GSError err = producer_->SetTransformHint(transformHint);
53232a6e48fSopenharmony_ci    if (err == GSERROR_OK) {
53332a6e48fSopenharmony_ci        std::lock_guard<std::mutex> lockGuard(mutex_);
53432a6e48fSopenharmony_ci        lastSetTransformHint_ = transformHint;
53532a6e48fSopenharmony_ci    }
53632a6e48fSopenharmony_ci    return err;
53732a6e48fSopenharmony_ci}
53832a6e48fSopenharmony_ci
53932a6e48fSopenharmony_ciGSError ProducerSurface::SetDefaultUsage(uint64_t usage)
54032a6e48fSopenharmony_ci{
54132a6e48fSopenharmony_ci    if (producer_ == nullptr) {
54232a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
54332a6e48fSopenharmony_ci    }
54432a6e48fSopenharmony_ci    return producer_->SetDefaultUsage(usage);
54532a6e48fSopenharmony_ci}
54632a6e48fSopenharmony_ci
54732a6e48fSopenharmony_ciuint64_t ProducerSurface::GetDefaultUsage()
54832a6e48fSopenharmony_ci{
54932a6e48fSopenharmony_ci    if (producer_ == nullptr) {
55032a6e48fSopenharmony_ci        return 0;
55132a6e48fSopenharmony_ci    }
55232a6e48fSopenharmony_ci    return producer_->GetDefaultUsage();
55332a6e48fSopenharmony_ci}
55432a6e48fSopenharmony_ci
55532a6e48fSopenharmony_ciGSError ProducerSurface::SetSurfaceSourceType(OHSurfaceSource sourceType)
55632a6e48fSopenharmony_ci{
55732a6e48fSopenharmony_ci    if (producer_ == nullptr) {
55832a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
55932a6e48fSopenharmony_ci    }
56032a6e48fSopenharmony_ci    return producer_->SetSurfaceSourceType(sourceType);
56132a6e48fSopenharmony_ci}
56232a6e48fSopenharmony_ci
56332a6e48fSopenharmony_ciOHSurfaceSource ProducerSurface::GetSurfaceSourceType() const
56432a6e48fSopenharmony_ci{
56532a6e48fSopenharmony_ci    if (producer_ == nullptr) {
56632a6e48fSopenharmony_ci        return OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
56732a6e48fSopenharmony_ci    }
56832a6e48fSopenharmony_ci    OHSurfaceSource sourceType = OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
56932a6e48fSopenharmony_ci    if (producer_->GetSurfaceSourceType(sourceType) != GSERROR_OK) {
57032a6e48fSopenharmony_ci        BLOGE("GetSurfaceSourceType failed, uniqueId: %{public}" PRIu64 ".", queueId_);
57132a6e48fSopenharmony_ci        return OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
57232a6e48fSopenharmony_ci    }
57332a6e48fSopenharmony_ci    return sourceType;
57432a6e48fSopenharmony_ci}
57532a6e48fSopenharmony_ci
57632a6e48fSopenharmony_ciGSError ProducerSurface::SetSurfaceAppFrameworkType(std::string appFrameworkType)
57732a6e48fSopenharmony_ci{
57832a6e48fSopenharmony_ci    if (producer_ == nullptr) {
57932a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
58032a6e48fSopenharmony_ci    }
58132a6e48fSopenharmony_ci    return producer_->SetSurfaceAppFrameworkType(appFrameworkType);
58232a6e48fSopenharmony_ci}
58332a6e48fSopenharmony_ci
58432a6e48fSopenharmony_cistd::string ProducerSurface::GetSurfaceAppFrameworkType() const
58532a6e48fSopenharmony_ci{
58632a6e48fSopenharmony_ci    if (producer_ == nullptr) {
58732a6e48fSopenharmony_ci        return "";
58832a6e48fSopenharmony_ci    }
58932a6e48fSopenharmony_ci    std::string appFrameworkType = "";
59032a6e48fSopenharmony_ci    if (producer_->GetSurfaceAppFrameworkType(appFrameworkType) != GSERROR_OK) {
59132a6e48fSopenharmony_ci        BLOGE("GetSurfaceAppFrameworkType failed, uniqueId: %{public}" PRIu64 ".", queueId_);
59232a6e48fSopenharmony_ci        return "";
59332a6e48fSopenharmony_ci    }
59432a6e48fSopenharmony_ci    return appFrameworkType;
59532a6e48fSopenharmony_ci}
59632a6e48fSopenharmony_ci
59732a6e48fSopenharmony_ciGSError ProducerSurface::SetUserData(const std::string& key, const std::string& val)
59832a6e48fSopenharmony_ci{
59932a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lockGuard(lockMutex_);
60032a6e48fSopenharmony_ci    if (userData_.size() >= SURFACE_MAX_USER_DATA_COUNT) {
60132a6e48fSopenharmony_ci        BLOGE("userData_ size out: %{public}zu, uniqueId: %{public}" PRIu64 ".", userData_.size(), queueId_);
60232a6e48fSopenharmony_ci        return GSERROR_OUT_OF_RANGE;
60332a6e48fSopenharmony_ci    }
60432a6e48fSopenharmony_ci
60532a6e48fSopenharmony_ci    auto iterUserData = userData_.find(key);
60632a6e48fSopenharmony_ci    if (iterUserData != userData_.end() && iterUserData->second == val) {
60732a6e48fSopenharmony_ci        return GSERROR_API_FAILED;
60832a6e48fSopenharmony_ci    }
60932a6e48fSopenharmony_ci
61032a6e48fSopenharmony_ci    userData_[key] = val;
61132a6e48fSopenharmony_ci    auto iter = onUserDataChange_.begin();
61232a6e48fSopenharmony_ci    while (iter != onUserDataChange_.end()) {
61332a6e48fSopenharmony_ci        if (iter->second != nullptr) {
61432a6e48fSopenharmony_ci            iter->second(key, val);
61532a6e48fSopenharmony_ci        }
61632a6e48fSopenharmony_ci        iter++;
61732a6e48fSopenharmony_ci    }
61832a6e48fSopenharmony_ci
61932a6e48fSopenharmony_ci    return GSERROR_OK;
62032a6e48fSopenharmony_ci}
62132a6e48fSopenharmony_ci
62232a6e48fSopenharmony_cistd::string ProducerSurface::GetUserData(const std::string& key)
62332a6e48fSopenharmony_ci{
62432a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lockGuard(lockMutex_);
62532a6e48fSopenharmony_ci    if (userData_.find(key) != userData_.end()) {
62632a6e48fSopenharmony_ci        return userData_[key];
62732a6e48fSopenharmony_ci    }
62832a6e48fSopenharmony_ci
62932a6e48fSopenharmony_ci    return "";
63032a6e48fSopenharmony_ci}
63132a6e48fSopenharmony_ci
63232a6e48fSopenharmony_ciGSError ProducerSurface::RegisterReleaseListener(OnReleaseFunc func)
63332a6e48fSopenharmony_ci{
63432a6e48fSopenharmony_ci    if (func == nullptr || producer_ == nullptr) {
63532a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
63632a6e48fSopenharmony_ci    }
63732a6e48fSopenharmony_ci    sptr<IProducerListener> listener;
63832a6e48fSopenharmony_ci    {
63932a6e48fSopenharmony_ci        std::lock_guard<std::mutex> lockGuard(listenerMutex_);
64032a6e48fSopenharmony_ci        listener_ = new BufferReleaseProducerListener(func);
64132a6e48fSopenharmony_ci        listener = listener_;
64232a6e48fSopenharmony_ci    }
64332a6e48fSopenharmony_ci    return producer_->RegisterReleaseListener(listener);
64432a6e48fSopenharmony_ci}
64532a6e48fSopenharmony_ci
64632a6e48fSopenharmony_ciGSError ProducerSurface::RegisterReleaseListener(OnReleaseFuncWithFence funcWithFence)
64732a6e48fSopenharmony_ci{
64832a6e48fSopenharmony_ci    if (funcWithFence == nullptr || producer_ == nullptr) {
64932a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
65032a6e48fSopenharmony_ci    }
65132a6e48fSopenharmony_ci    sptr<IProducerListener> listener;
65232a6e48fSopenharmony_ci    {
65332a6e48fSopenharmony_ci        std::lock_guard<std::mutex> lockGuard(listenerMutex_);
65432a6e48fSopenharmony_ci        listener_ = new BufferReleaseProducerListener(nullptr, funcWithFence);
65532a6e48fSopenharmony_ci        listener = listener_;
65632a6e48fSopenharmony_ci    }
65732a6e48fSopenharmony_ci    return producer_->RegisterReleaseListener(listener);
65832a6e48fSopenharmony_ci}
65932a6e48fSopenharmony_ci
66032a6e48fSopenharmony_ciGSError ProducerSurface::UnRegisterReleaseListener()
66132a6e48fSopenharmony_ci{
66232a6e48fSopenharmony_ci    if (producer_ == nullptr) {
66332a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
66432a6e48fSopenharmony_ci    }
66532a6e48fSopenharmony_ci    {
66632a6e48fSopenharmony_ci        std::lock_guard<std::mutex> lockGuard(delegatorMutex_);
66732a6e48fSopenharmony_ci        wpPSurfaceDelegator_ = nullptr;
66832a6e48fSopenharmony_ci    }
66932a6e48fSopenharmony_ci    {
67032a6e48fSopenharmony_ci        std::lock_guard<std::mutex> lockGuard(listenerMutex_);
67132a6e48fSopenharmony_ci        if (listener_ != nullptr) {
67232a6e48fSopenharmony_ci            listener_->ResetReleaseFunc();
67332a6e48fSopenharmony_ci        }
67432a6e48fSopenharmony_ci    }
67532a6e48fSopenharmony_ci    return producer_->UnRegisterReleaseListener();
67632a6e48fSopenharmony_ci}
67732a6e48fSopenharmony_ci
67832a6e48fSopenharmony_ciGSError ProducerSurface::RegisterDeleteBufferListener(OnDeleteBufferFunc func, bool isForUniRedraw)
67932a6e48fSopenharmony_ci{
68032a6e48fSopenharmony_ci    return GSERROR_NOT_SUPPORT;
68132a6e48fSopenharmony_ci}
68232a6e48fSopenharmony_ci
68332a6e48fSopenharmony_ciGSError ProducerSurface::RegisterUserDataChangeListener(const std::string& funcName, OnUserDataChangeFunc func)
68432a6e48fSopenharmony_ci{
68532a6e48fSopenharmony_ci    if (func == nullptr) {
68632a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
68732a6e48fSopenharmony_ci    }
68832a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lockGuard(lockMutex_);
68932a6e48fSopenharmony_ci    if (onUserDataChange_.find(funcName) != onUserDataChange_.end()) {
69032a6e48fSopenharmony_ci        BLOGD("already register func: %{public}s, uniqueId: %{public}" PRIu64 ".",
69132a6e48fSopenharmony_ci            funcName.c_str(), queueId_);
69232a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
69332a6e48fSopenharmony_ci    }
69432a6e48fSopenharmony_ci
69532a6e48fSopenharmony_ci    onUserDataChange_[funcName] = func;
69632a6e48fSopenharmony_ci    return GSERROR_OK;
69732a6e48fSopenharmony_ci}
69832a6e48fSopenharmony_ci
69932a6e48fSopenharmony_ciGSError ProducerSurface::UnRegisterUserDataChangeListener(const std::string& funcName)
70032a6e48fSopenharmony_ci{
70132a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lockGuard(lockMutex_);
70232a6e48fSopenharmony_ci    if (onUserDataChange_.erase(funcName) == 0) {
70332a6e48fSopenharmony_ci        BLOGD("no register funcName: %{public}s, uniqueId: %{public}" PRIu64 ".", funcName.c_str(), queueId_);
70432a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
70532a6e48fSopenharmony_ci    }
70632a6e48fSopenharmony_ci
70732a6e48fSopenharmony_ci    return GSERROR_OK;
70832a6e48fSopenharmony_ci}
70932a6e48fSopenharmony_ci
71032a6e48fSopenharmony_ciGSError ProducerSurface::ClearUserDataChangeListener()
71132a6e48fSopenharmony_ci{
71232a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lockGuard(lockMutex_);
71332a6e48fSopenharmony_ci    onUserDataChange_.clear();
71432a6e48fSopenharmony_ci    return GSERROR_OK;
71532a6e48fSopenharmony_ci}
71632a6e48fSopenharmony_ci
71732a6e48fSopenharmony_cibool ProducerSurface::IsRemote()
71832a6e48fSopenharmony_ci{
71932a6e48fSopenharmony_ci    if (producer_ == nullptr || producer_->AsObject() == nullptr) {
72032a6e48fSopenharmony_ci        return false;
72132a6e48fSopenharmony_ci    }
72232a6e48fSopenharmony_ci    return producer_->AsObject()->IsProxyObject();
72332a6e48fSopenharmony_ci}
72432a6e48fSopenharmony_ci
72532a6e48fSopenharmony_civoid ProducerSurface::CleanAllLocked()
72632a6e48fSopenharmony_ci{
72732a6e48fSopenharmony_ci    bufferProducerCache_.clear();
72832a6e48fSopenharmony_ci    auto spNativeWindow = wpNativeWindow_.promote();
72932a6e48fSopenharmony_ci    if (spNativeWindow != nullptr) {
73032a6e48fSopenharmony_ci        auto& bufferCache = spNativeWindow->bufferCache_;
73132a6e48fSopenharmony_ci        for (auto& [seqNum, buffer] : bufferCache) {
73232a6e48fSopenharmony_ci            NativeObjectUnreference(buffer);
73332a6e48fSopenharmony_ci        }
73432a6e48fSopenharmony_ci        bufferCache.clear();
73532a6e48fSopenharmony_ci    }
73632a6e48fSopenharmony_ci}
73732a6e48fSopenharmony_ci
73832a6e48fSopenharmony_ciGSError ProducerSurface::CleanCacheLocked(bool cleanAll)
73932a6e48fSopenharmony_ci{
74032a6e48fSopenharmony_ci    BLOGD("CleanCacheLocked, uniqueId: %{public}" PRIu64 ".", queueId_);
74132a6e48fSopenharmony_ci    CleanAllLocked();
74232a6e48fSopenharmony_ci    return producer_->CleanCache(cleanAll);
74332a6e48fSopenharmony_ci}
74432a6e48fSopenharmony_ci
74532a6e48fSopenharmony_ciGSError ProducerSurface::CleanCache(bool cleanAll)
74632a6e48fSopenharmony_ci{
74732a6e48fSopenharmony_ci    if (producer_ == nullptr) {
74832a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
74932a6e48fSopenharmony_ci    }
75032a6e48fSopenharmony_ci    BLOGD("CleanCache, uniqueId: %{public}" PRIu64 ".", queueId_);
75132a6e48fSopenharmony_ci    {
75232a6e48fSopenharmony_ci        std::lock_guard<std::mutex> lockGuard(mutex_);
75332a6e48fSopenharmony_ci        CleanAllLocked();
75432a6e48fSopenharmony_ci    }
75532a6e48fSopenharmony_ci    return producer_->CleanCache(cleanAll);
75632a6e48fSopenharmony_ci}
75732a6e48fSopenharmony_ci
75832a6e48fSopenharmony_ciGSError ProducerSurface::GoBackground()
75932a6e48fSopenharmony_ci{
76032a6e48fSopenharmony_ci    if (producer_ == nullptr) {
76132a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
76232a6e48fSopenharmony_ci    }
76332a6e48fSopenharmony_ci    BLOGD("GoBackground, uniqueId: %{public}" PRIu64 ".", queueId_);
76432a6e48fSopenharmony_ci    {
76532a6e48fSopenharmony_ci        std::lock_guard<std::mutex> lockGuard(mutex_);
76632a6e48fSopenharmony_ci        CleanAllLocked();
76732a6e48fSopenharmony_ci    }
76832a6e48fSopenharmony_ci    return producer_->GoBackground();
76932a6e48fSopenharmony_ci}
77032a6e48fSopenharmony_ci
77132a6e48fSopenharmony_ciuint64_t ProducerSurface::GetUniqueId() const
77232a6e48fSopenharmony_ci{
77332a6e48fSopenharmony_ci    if (!inited_.load()) {
77432a6e48fSopenharmony_ci        BLOGW("ProducerSurface is not initialized.");
77532a6e48fSopenharmony_ci    }
77632a6e48fSopenharmony_ci    return queueId_;
77732a6e48fSopenharmony_ci}
77832a6e48fSopenharmony_ci
77932a6e48fSopenharmony_ciGSError ProducerSurface::SetTransform(GraphicTransformType transform)
78032a6e48fSopenharmony_ci{
78132a6e48fSopenharmony_ci    if (producer_ == nullptr) {
78232a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
78332a6e48fSopenharmony_ci    }
78432a6e48fSopenharmony_ci    return producer_->SetTransform(transform);
78532a6e48fSopenharmony_ci}
78632a6e48fSopenharmony_ci
78732a6e48fSopenharmony_ciGraphicTransformType ProducerSurface::GetTransform() const
78832a6e48fSopenharmony_ci{
78932a6e48fSopenharmony_ci    if (producer_ == nullptr) {
79032a6e48fSopenharmony_ci        return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
79132a6e48fSopenharmony_ci    }
79232a6e48fSopenharmony_ci    GraphicTransformType transform = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
79332a6e48fSopenharmony_ci    if (producer_->GetTransform(transform) != GSERROR_OK) {
79432a6e48fSopenharmony_ci        BLOGE("GetTransform failed, uniqueId: %{public}" PRIu64 ".", queueId_);
79532a6e48fSopenharmony_ci        return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
79632a6e48fSopenharmony_ci    }
79732a6e48fSopenharmony_ci    return transform;
79832a6e48fSopenharmony_ci}
79932a6e48fSopenharmony_ci
80032a6e48fSopenharmony_ciGSError ProducerSurface::IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo>& infos,
80132a6e48fSopenharmony_ci                                          std::vector<bool>& supporteds)
80232a6e48fSopenharmony_ci{
80332a6e48fSopenharmony_ci    if (producer_ == nullptr || infos.size() == 0 || infos.size() != supporteds.size()) {
80432a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
80532a6e48fSopenharmony_ci    }
80632a6e48fSopenharmony_ci    return producer_->IsSupportedAlloc(infos, supporteds);
80732a6e48fSopenharmony_ci}
80832a6e48fSopenharmony_ci
80932a6e48fSopenharmony_ciGSError ProducerSurface::Connect()
81032a6e48fSopenharmony_ci{
81132a6e48fSopenharmony_ci    if (producer_ == nullptr) {
81232a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
81332a6e48fSopenharmony_ci    }
81432a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lockGuard(mutex_);
81532a6e48fSopenharmony_ci    if (!isDisconnected_) {
81632a6e48fSopenharmony_ci        BLOGE("Surface has been connect, uniqueId: %{public}" PRIu64 ".", queueId_);
81732a6e48fSopenharmony_ci        return SURFACE_ERROR_CONSUMER_IS_CONNECTED;
81832a6e48fSopenharmony_ci    }
81932a6e48fSopenharmony_ci    BLOGD("Connect, uniqueId: %{public}" PRIu64 ".", queueId_);
82032a6e48fSopenharmony_ci    GSError ret = producer_->Connect();
82132a6e48fSopenharmony_ci    if (ret == GSERROR_OK) {
82232a6e48fSopenharmony_ci        isDisconnected_ = false;
82332a6e48fSopenharmony_ci    }
82432a6e48fSopenharmony_ci    return ret;
82532a6e48fSopenharmony_ci}
82632a6e48fSopenharmony_ci
82732a6e48fSopenharmony_ciGSError ProducerSurface::Disconnect()
82832a6e48fSopenharmony_ci{
82932a6e48fSopenharmony_ci    if (producer_ == nullptr) {
83032a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
83132a6e48fSopenharmony_ci    }
83232a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lockGuard(mutex_);
83332a6e48fSopenharmony_ci    if (isDisconnected_) {
83432a6e48fSopenharmony_ci        BLOGD("Surface is disconnect, uniqueId: %{public}" PRIu64 ".", queueId_);
83532a6e48fSopenharmony_ci        return SURFACE_ERROR_CONSUMER_DISCONNECTED;
83632a6e48fSopenharmony_ci    }
83732a6e48fSopenharmony_ci    BLOGD("Disconnect, uniqueId: %{public}" PRIu64 ".", queueId_);
83832a6e48fSopenharmony_ci    CleanAllLocked();
83932a6e48fSopenharmony_ci    GSError ret = producer_->Disconnect();
84032a6e48fSopenharmony_ci    if (ret == GSERROR_OK) {
84132a6e48fSopenharmony_ci        isDisconnected_ = true;
84232a6e48fSopenharmony_ci    }
84332a6e48fSopenharmony_ci    return ret;
84432a6e48fSopenharmony_ci}
84532a6e48fSopenharmony_ci
84632a6e48fSopenharmony_ciGSError ProducerSurface::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
84732a6e48fSopenharmony_ci{
84832a6e48fSopenharmony_ci    if (producer_ == nullptr || scalingMode < ScalingMode::SCALING_MODE_FREEZE ||
84932a6e48fSopenharmony_ci        scalingMode > ScalingMode::SCALING_MODE_SCALE_FIT) {
85032a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
85132a6e48fSopenharmony_ci    }
85232a6e48fSopenharmony_ci    return producer_->SetScalingMode(sequence, scalingMode);
85332a6e48fSopenharmony_ci}
85432a6e48fSopenharmony_ci
85532a6e48fSopenharmony_ciGSError ProducerSurface::SetScalingMode(ScalingMode scalingMode)
85632a6e48fSopenharmony_ci{
85732a6e48fSopenharmony_ci    if (producer_ == nullptr || scalingMode < ScalingMode::SCALING_MODE_FREEZE ||
85832a6e48fSopenharmony_ci        scalingMode > ScalingMode::SCALING_MODE_SCALE_FIT) {
85932a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
86032a6e48fSopenharmony_ci    }
86132a6e48fSopenharmony_ci    return producer_->SetScalingMode(scalingMode);
86232a6e48fSopenharmony_ci}
86332a6e48fSopenharmony_ci
86432a6e48fSopenharmony_civoid ProducerSurface::SetBufferHold(bool hold)
86532a6e48fSopenharmony_ci{
86632a6e48fSopenharmony_ci    if (producer_ == nullptr) {
86732a6e48fSopenharmony_ci        return;
86832a6e48fSopenharmony_ci    }
86932a6e48fSopenharmony_ci    producer_->SetBufferHold(hold);
87032a6e48fSopenharmony_ci}
87132a6e48fSopenharmony_ci
87232a6e48fSopenharmony_ciGSError ProducerSurface::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData>& metaData)
87332a6e48fSopenharmony_ci{
87432a6e48fSopenharmony_ci    if (producer_ == nullptr || metaData.size() == 0) {
87532a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
87632a6e48fSopenharmony_ci    }
87732a6e48fSopenharmony_ci    return producer_->SetMetaData(sequence, metaData);
87832a6e48fSopenharmony_ci}
87932a6e48fSopenharmony_ci
88032a6e48fSopenharmony_ciGSError ProducerSurface::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
88132a6e48fSopenharmony_ci                                        const std::vector<uint8_t>& metaData)
88232a6e48fSopenharmony_ci{
88332a6e48fSopenharmony_ci    if (producer_ == nullptr || key < GraphicHDRMetadataKey::GRAPHIC_MATAKEY_RED_PRIMARY_X ||
88432a6e48fSopenharmony_ci        key > GraphicHDRMetadataKey::GRAPHIC_MATAKEY_HDR_VIVID || metaData.size() == 0) {
88532a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
88632a6e48fSopenharmony_ci    }
88732a6e48fSopenharmony_ci    return producer_->SetMetaDataSet(sequence, key, metaData);
88832a6e48fSopenharmony_ci}
88932a6e48fSopenharmony_ci
89032a6e48fSopenharmony_ciGSError ProducerSurface::SetTunnelHandle(const GraphicExtDataHandle *handle)
89132a6e48fSopenharmony_ci{
89232a6e48fSopenharmony_ci    if (producer_ == nullptr) {
89332a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
89432a6e48fSopenharmony_ci    }
89532a6e48fSopenharmony_ci    return producer_->SetTunnelHandle(handle);
89632a6e48fSopenharmony_ci}
89732a6e48fSopenharmony_ci
89832a6e48fSopenharmony_ciGSError ProducerSurface::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type,
89932a6e48fSopenharmony_ci                                             int64_t& time) const
90032a6e48fSopenharmony_ci{
90132a6e48fSopenharmony_ci    if (producer_ == nullptr || type <= GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_UNSUPPORTED ||
90232a6e48fSopenharmony_ci        type > GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_TIMESTAMP) {
90332a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
90432a6e48fSopenharmony_ci    }
90532a6e48fSopenharmony_ci    return producer_->GetPresentTimestamp(sequence, type, time);
90632a6e48fSopenharmony_ci}
90732a6e48fSopenharmony_ci
90832a6e48fSopenharmony_ciGSError ProducerSurface::SetWptrNativeWindowToPSurface(void* nativeWindow)
90932a6e48fSopenharmony_ci{
91032a6e48fSopenharmony_ci    if (nativeWindow == nullptr) {
91132a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
91232a6e48fSopenharmony_ci    }
91332a6e48fSopenharmony_ci    NativeWindow *nw = reinterpret_cast<NativeWindow *>(nativeWindow);
91432a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lockGuard(mutex_);
91532a6e48fSopenharmony_ci    wpNativeWindow_ = nw;
91632a6e48fSopenharmony_ci    return GSERROR_OK;
91732a6e48fSopenharmony_ci}
91832a6e48fSopenharmony_ci
91932a6e48fSopenharmony_civoid ProducerSurface::SetRequestWidthAndHeight(int32_t width, int32_t height)
92032a6e48fSopenharmony_ci{
92132a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lockGuard(mutex_);
92232a6e48fSopenharmony_ci    requestWidth_ = width;
92332a6e48fSopenharmony_ci    requestHeight_ = height;
92432a6e48fSopenharmony_ci}
92532a6e48fSopenharmony_ci
92632a6e48fSopenharmony_ciint32_t ProducerSurface::GetRequestWidth()
92732a6e48fSopenharmony_ci{
92832a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lockGuard(mutex_);
92932a6e48fSopenharmony_ci    return requestWidth_;
93032a6e48fSopenharmony_ci}
93132a6e48fSopenharmony_ci
93232a6e48fSopenharmony_ciint32_t ProducerSurface::GetRequestHeight()
93332a6e48fSopenharmony_ci{
93432a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lockGuard(mutex_);
93532a6e48fSopenharmony_ci    return requestHeight_;
93632a6e48fSopenharmony_ci}
93732a6e48fSopenharmony_ci
93832a6e48fSopenharmony_civoid ProducerSurface::SetWindowConfig(const BufferRequestConfig& config)
93932a6e48fSopenharmony_ci{
94032a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lockGuard(mutex_);
94132a6e48fSopenharmony_ci    windowConfig_ = config;
94232a6e48fSopenharmony_ci}
94332a6e48fSopenharmony_ci
94432a6e48fSopenharmony_civoid ProducerSurface::SetWindowConfigWidthAndHeight(int32_t width, int32_t height)
94532a6e48fSopenharmony_ci{
94632a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lockGuard(mutex_);
94732a6e48fSopenharmony_ci    windowConfig_.width = width;
94832a6e48fSopenharmony_ci    windowConfig_.height = height;
94932a6e48fSopenharmony_ci}
95032a6e48fSopenharmony_ci
95132a6e48fSopenharmony_civoid ProducerSurface::SetWindowConfigStride(int32_t stride)
95232a6e48fSopenharmony_ci{
95332a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lockGuard(mutex_);
95432a6e48fSopenharmony_ci    windowConfig_.strideAlignment = stride;
95532a6e48fSopenharmony_ci}
95632a6e48fSopenharmony_ci
95732a6e48fSopenharmony_civoid ProducerSurface::SetWindowConfigFormat(int32_t format)
95832a6e48fSopenharmony_ci{
95932a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lockGuard(mutex_);
96032a6e48fSopenharmony_ci    windowConfig_.format = format;
96132a6e48fSopenharmony_ci}
96232a6e48fSopenharmony_ci
96332a6e48fSopenharmony_civoid ProducerSurface::SetWindowConfigUsage(uint64_t usage)
96432a6e48fSopenharmony_ci{
96532a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lockGuard(mutex_);
96632a6e48fSopenharmony_ci    windowConfig_.usage = usage;
96732a6e48fSopenharmony_ci}
96832a6e48fSopenharmony_ci
96932a6e48fSopenharmony_civoid ProducerSurface::SetWindowConfigTimeout(int32_t timeout)
97032a6e48fSopenharmony_ci{
97132a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lockGuard(mutex_);
97232a6e48fSopenharmony_ci    windowConfig_.timeout = timeout;
97332a6e48fSopenharmony_ci}
97432a6e48fSopenharmony_ci
97532a6e48fSopenharmony_civoid ProducerSurface::SetWindowConfigColorGamut(GraphicColorGamut colorGamut)
97632a6e48fSopenharmony_ci{
97732a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lockGuard(mutex_);
97832a6e48fSopenharmony_ci    windowConfig_.colorGamut = colorGamut;
97932a6e48fSopenharmony_ci}
98032a6e48fSopenharmony_ci
98132a6e48fSopenharmony_civoid ProducerSurface::SetWindowConfigTransform(GraphicTransformType transform)
98232a6e48fSopenharmony_ci{
98332a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lockGuard(mutex_);
98432a6e48fSopenharmony_ci    windowConfig_.transform = transform;
98532a6e48fSopenharmony_ci}
98632a6e48fSopenharmony_ci
98732a6e48fSopenharmony_ciBufferRequestConfig ProducerSurface::GetWindowConfig()
98832a6e48fSopenharmony_ci{
98932a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lockGuard(mutex_);
99032a6e48fSopenharmony_ci    return windowConfig_;
99132a6e48fSopenharmony_ci}
99232a6e48fSopenharmony_ci
99332a6e48fSopenharmony_ciGSError ProducerSurface::SetHdrWhitePointBrightness(float brightness)
99432a6e48fSopenharmony_ci{
99532a6e48fSopenharmony_ci    if (producer_ == nullptr) {
99632a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
99732a6e48fSopenharmony_ci    }
99832a6e48fSopenharmony_ci    if (brightness < 0.0 || brightness > 1.0) {
99932a6e48fSopenharmony_ci        BLOGE("brightness:%{public}f, uniqueId: %{public}" PRIu64 ".", brightness, queueId_);
100032a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
100132a6e48fSopenharmony_ci    }
100232a6e48fSopenharmony_ci    return producer_->SetHdrWhitePointBrightness(brightness);
100332a6e48fSopenharmony_ci}
100432a6e48fSopenharmony_ci
100532a6e48fSopenharmony_ciGSError ProducerSurface::SetSdrWhitePointBrightness(float brightness)
100632a6e48fSopenharmony_ci{
100732a6e48fSopenharmony_ci    if (producer_ == nullptr) {
100832a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
100932a6e48fSopenharmony_ci    }
101032a6e48fSopenharmony_ci    if (brightness < 0.0 || brightness > 1.0) {
101132a6e48fSopenharmony_ci        BLOGE("brightness:%{public}f, uniqueId: %{public}" PRIu64 ".", brightness, queueId_);
101232a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
101332a6e48fSopenharmony_ci    }
101432a6e48fSopenharmony_ci    return producer_->SetSdrWhitePointBrightness(brightness);
101532a6e48fSopenharmony_ci}
101632a6e48fSopenharmony_ci
101732a6e48fSopenharmony_ciGSError ProducerSurface::AcquireLastFlushedBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
101832a6e48fSopenharmony_ci    float matrix[16], uint32_t matrixSize, bool isUseNewMatrix)
101932a6e48fSopenharmony_ci{
102032a6e48fSopenharmony_ci    if (producer_ == nullptr) {
102132a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
102232a6e48fSopenharmony_ci    }
102332a6e48fSopenharmony_ci    return producer_->AcquireLastFlushedBuffer(buffer, fence, matrix, matrixSize, isUseNewMatrix);
102432a6e48fSopenharmony_ci}
102532a6e48fSopenharmony_ci
102632a6e48fSopenharmony_ciGSError ProducerSurface::ReleaseLastFlushedBuffer(sptr<SurfaceBuffer> buffer)
102732a6e48fSopenharmony_ci{
102832a6e48fSopenharmony_ci    if (buffer == nullptr || producer_ == nullptr) {
102932a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
103032a6e48fSopenharmony_ci    }
103132a6e48fSopenharmony_ci    return producer_->ReleaseLastFlushedBuffer(buffer->GetSeqNum());
103232a6e48fSopenharmony_ci}
103332a6e48fSopenharmony_ci
103432a6e48fSopenharmony_ciGSError ProducerSurface::SetGlobalAlpha(int32_t alpha)
103532a6e48fSopenharmony_ci{
103632a6e48fSopenharmony_ci    if (producer_ == nullptr || alpha < FORCE_GLOBAL_ALPHA_MIN || alpha > FORCE_GLOBAL_ALPHA_MAX) {
103732a6e48fSopenharmony_ci        BLOGE("Invalid producer global alpha value: %{public}d, queueId: %{public}" PRIu64 ".", alpha, queueId_);
103832a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
103932a6e48fSopenharmony_ci    }
104032a6e48fSopenharmony_ci    return producer_->SetGlobalAlpha(alpha);
104132a6e48fSopenharmony_ci}
104232a6e48fSopenharmony_ci} // namespace OHOS
1043