132a6e48fSopenharmony_ci/*
232a6e48fSopenharmony_ci * Copyright (c) 2021-2023 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 "surface_buffer_impl.h"
1732a6e48fSopenharmony_ci
1832a6e48fSopenharmony_ci#include <mutex>
1932a6e48fSopenharmony_ci
2032a6e48fSopenharmony_ci#include <message_parcel.h>
2132a6e48fSopenharmony_ci#include <parameters.h>
2232a6e48fSopenharmony_ci#include <securec.h>
2332a6e48fSopenharmony_ci#include <sys/mman.h>
2432a6e48fSopenharmony_ci#include "buffer_log.h"
2532a6e48fSopenharmony_ci#include "buffer_extra_data_impl.h"
2632a6e48fSopenharmony_ci#include "v1_1/buffer_handle_meta_key_type.h"
2732a6e48fSopenharmony_ci#include "v1_2/display_buffer_type.h"
2832a6e48fSopenharmony_ci#include "v1_2/include/idisplay_buffer.h"
2932a6e48fSopenharmony_ci
3032a6e48fSopenharmony_cinamespace OHOS {
3132a6e48fSopenharmony_cinamespace {
3232a6e48fSopenharmony_ciusing IDisplayBufferSptr = std::shared_ptr<OHOS::HDI::Display::Buffer::V1_2::IDisplayBuffer>;
3332a6e48fSopenharmony_cistatic IDisplayBufferSptr g_displayBuffer;
3432a6e48fSopenharmony_cistatic std::mutex g_displayBufferMutex;
3532a6e48fSopenharmony_ciclass DisplayBufferDiedRecipient : public OHOS::IRemoteObject::DeathRecipient {
3632a6e48fSopenharmony_cipublic:
3732a6e48fSopenharmony_ci    DisplayBufferDiedRecipient() = default;
3832a6e48fSopenharmony_ci    virtual ~DisplayBufferDiedRecipient() = default;
3932a6e48fSopenharmony_ci    void OnRemoteDied(const OHOS::wptr<OHOS::IRemoteObject>& remote) override
4032a6e48fSopenharmony_ci    {
4132a6e48fSopenharmony_ci        std::lock_guard<std::mutex> bufferLock(g_displayBufferMutex);
4232a6e48fSopenharmony_ci        g_displayBuffer = nullptr;
4332a6e48fSopenharmony_ci        BLOGD("IDisplayBuffer died and g_displayBuffer is nullptr");
4432a6e48fSopenharmony_ci    };
4532a6e48fSopenharmony_ci};
4632a6e48fSopenharmony_ci
4732a6e48fSopenharmony_ciIDisplayBufferSptr GetDisplayBuffer()
4832a6e48fSopenharmony_ci{
4932a6e48fSopenharmony_ci    std::lock_guard<std::mutex> bufferLock(g_displayBufferMutex);
5032a6e48fSopenharmony_ci    if (g_displayBuffer != nullptr) {
5132a6e48fSopenharmony_ci        return g_displayBuffer;
5232a6e48fSopenharmony_ci    }
5332a6e48fSopenharmony_ci    return nullptr;
5432a6e48fSopenharmony_ci}
5532a6e48fSopenharmony_ci
5632a6e48fSopenharmony_ciIDisplayBufferSptr GetOrResetDisplayBuffer()
5732a6e48fSopenharmony_ci{
5832a6e48fSopenharmony_ci    std::lock_guard<std::mutex> bufferLock(g_displayBufferMutex);
5932a6e48fSopenharmony_ci    if (g_displayBuffer != nullptr) {
6032a6e48fSopenharmony_ci        return g_displayBuffer;
6132a6e48fSopenharmony_ci    }
6232a6e48fSopenharmony_ci
6332a6e48fSopenharmony_ci    g_displayBuffer.reset(OHOS::HDI::Display::Buffer::V1_2::IDisplayBuffer::Get());
6432a6e48fSopenharmony_ci    if (g_displayBuffer == nullptr) {
6532a6e48fSopenharmony_ci        BLOGE("IDisplayBuffer::Get return nullptr.");
6632a6e48fSopenharmony_ci        return nullptr;
6732a6e48fSopenharmony_ci    }
6832a6e48fSopenharmony_ci    sptr<IRemoteObject::DeathRecipient> recipient = new DisplayBufferDiedRecipient();
6932a6e48fSopenharmony_ci    g_displayBuffer->AddDeathRecipient(recipient);
7032a6e48fSopenharmony_ci    return g_displayBuffer;
7132a6e48fSopenharmony_ci}
7232a6e48fSopenharmony_ci
7332a6e48fSopenharmony_ciconstexpr int32_t INVALID_ARGUMENT = -1;
7432a6e48fSopenharmony_ciconstexpr uint64_t INVALID_PHYADDR = 0;
7532a6e48fSopenharmony_ciconstexpr uint32_t INVALID_SIZE = 0;
7632a6e48fSopenharmony_ciconstexpr uint64_t INVALID_USAGE = std::numeric_limits<std::uint64_t>::max();
7732a6e48fSopenharmony_ci}
7832a6e48fSopenharmony_ci
7932a6e48fSopenharmony_cisptr<SurfaceBuffer> SurfaceBuffer::Create()
8032a6e48fSopenharmony_ci{
8132a6e48fSopenharmony_ci    sptr<SurfaceBuffer> surfaceBufferImpl = new SurfaceBufferImpl();
8232a6e48fSopenharmony_ci    return surfaceBufferImpl;
8332a6e48fSopenharmony_ci}
8432a6e48fSopenharmony_ci
8532a6e48fSopenharmony_ciSurfaceBufferImpl::SurfaceBufferImpl()
8632a6e48fSopenharmony_ci{
8732a6e48fSopenharmony_ci    {
8832a6e48fSopenharmony_ci        static std::mutex mutex;
8932a6e48fSopenharmony_ci        mutex.lock();
9032a6e48fSopenharmony_ci
9132a6e48fSopenharmony_ci        static uint32_t sequence_number_ = 0;
9232a6e48fSopenharmony_ci        // 0xFFFF is pid mask. 16 is pid offset.
9332a6e48fSopenharmony_ci        sequenceNumber_ = (static_cast<uint32_t>(getpid()) & 0xFFFF) << 16;
9432a6e48fSopenharmony_ci        // 0xFFFF is seqnum mask.
9532a6e48fSopenharmony_ci        sequenceNumber_ |= (sequence_number_++ & 0xFFFF);
9632a6e48fSopenharmony_ci
9732a6e48fSopenharmony_ci        mutex.unlock();
9832a6e48fSopenharmony_ci    }
9932a6e48fSopenharmony_ci    metaDataCache_.clear();
10032a6e48fSopenharmony_ci    bedata_ = new BufferExtraDataImpl;
10132a6e48fSopenharmony_ci    BLOGD("SurfaceBufferImpl ctor, seq: %{public}u", sequenceNumber_);
10232a6e48fSopenharmony_ci}
10332a6e48fSopenharmony_ci
10432a6e48fSopenharmony_ciSurfaceBufferImpl::SurfaceBufferImpl(uint32_t seqNum)
10532a6e48fSopenharmony_ci{
10632a6e48fSopenharmony_ci    metaDataCache_.clear();
10732a6e48fSopenharmony_ci    sequenceNumber_ = seqNum;
10832a6e48fSopenharmony_ci    bedata_ = new BufferExtraDataImpl;
10932a6e48fSopenharmony_ci    BLOGD("SurfaceBufferImpl ctor, seq: %{public}u", sequenceNumber_);
11032a6e48fSopenharmony_ci}
11132a6e48fSopenharmony_ci
11232a6e48fSopenharmony_ciSurfaceBufferImpl::~SurfaceBufferImpl()
11332a6e48fSopenharmony_ci{
11432a6e48fSopenharmony_ci    BLOGD("~SurfaceBufferImpl dtor, seq: %{public}u", sequenceNumber_);
11532a6e48fSopenharmony_ci    FreeBufferHandleLocked();
11632a6e48fSopenharmony_ci}
11732a6e48fSopenharmony_ci
11832a6e48fSopenharmony_cibool SurfaceBufferImpl::MetaDataCachedLocked(const uint32_t key, const std::vector<uint8_t>& value)
11932a6e48fSopenharmony_ci{
12032a6e48fSopenharmony_ci    auto iter = metaDataCache_.find(key);
12132a6e48fSopenharmony_ci    if (iter != metaDataCache_.end() && (*iter).second == value) {
12232a6e48fSopenharmony_ci        return true;
12332a6e48fSopenharmony_ci    }
12432a6e48fSopenharmony_ci    return false;
12532a6e48fSopenharmony_ci}
12632a6e48fSopenharmony_ci
12732a6e48fSopenharmony_ciGSError SurfaceBufferImpl::Alloc(const BufferRequestConfig& config)
12832a6e48fSopenharmony_ci{
12932a6e48fSopenharmony_ci    IDisplayBufferSptr displayBuffer = GetOrResetDisplayBuffer();
13032a6e48fSopenharmony_ci    if (displayBuffer == nullptr) {
13132a6e48fSopenharmony_ci        return GSERROR_INTERNAL;
13232a6e48fSopenharmony_ci    }
13332a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
13432a6e48fSopenharmony_ci    FreeBufferHandleLocked();
13532a6e48fSopenharmony_ci
13632a6e48fSopenharmony_ci    GSError ret = CheckBufferConfig(config.width, config.height, config.format, config.usage);
13732a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
13832a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
13932a6e48fSopenharmony_ci    }
14032a6e48fSopenharmony_ci
14132a6e48fSopenharmony_ci    OHOS::HDI::Display::Buffer::V1_0::AllocInfo info = {config.width, config.height, config.usage, config.format};
14232a6e48fSopenharmony_ci    static bool debugHebcDisabled =
14332a6e48fSopenharmony_ci        std::atoi((system::GetParameter("persist.graphic.debug_hebc.disabled", "0")).c_str()) != 0;
14432a6e48fSopenharmony_ci    if (debugHebcDisabled) {
14532a6e48fSopenharmony_ci        info.usage |= (BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA);
14632a6e48fSopenharmony_ci    }
14732a6e48fSopenharmony_ci    auto dRet = displayBuffer->AllocMem(info, handle_);
14832a6e48fSopenharmony_ci    if (dRet == GRAPHIC_DISPLAY_SUCCESS && handle_ != nullptr) {
14932a6e48fSopenharmony_ci        dRet = displayBuffer->RegisterBuffer(*handle_);
15032a6e48fSopenharmony_ci        if (dRet != GRAPHIC_DISPLAY_SUCCESS && dRet != GRAPHIC_DISPLAY_NOT_SUPPORT) {
15132a6e48fSopenharmony_ci            BLOGE("AllocMem RegisterBuffer Failed with %{public}d", dRet);
15232a6e48fSopenharmony_ci            return GSERROR_HDI_ERROR;
15332a6e48fSopenharmony_ci        }
15432a6e48fSopenharmony_ci        surfaceBufferColorGamut_ = static_cast<GraphicColorGamut>(config.colorGamut);
15532a6e48fSopenharmony_ci        transform_ = static_cast<GraphicTransformType>(config.transform);
15632a6e48fSopenharmony_ci        surfaceBufferWidth_ = config.width;
15732a6e48fSopenharmony_ci        surfaceBufferHeight_ = config.height;
15832a6e48fSopenharmony_ci        bufferRequestConfig_ = config;
15932a6e48fSopenharmony_ci        BLOGD("handle w: %{public}d h: %{public}d t: %{public}d, seq: %{public}u",
16032a6e48fSopenharmony_ci            handle_->width, handle_->height, config.transform, sequenceNumber_);
16132a6e48fSopenharmony_ci        return GSERROR_OK;
16232a6e48fSopenharmony_ci    }
16332a6e48fSopenharmony_ci    BLOGW("Alloc Failed with %{public}d, seq: %{public}u", dRet, sequenceNumber_);
16432a6e48fSopenharmony_ci    return GSERROR_HDI_ERROR;
16532a6e48fSopenharmony_ci}
16632a6e48fSopenharmony_ci
16732a6e48fSopenharmony_ciGSError SurfaceBufferImpl::Map()
16832a6e48fSopenharmony_ci{
16932a6e48fSopenharmony_ci    IDisplayBufferSptr displayBuffer = GetOrResetDisplayBuffer();
17032a6e48fSopenharmony_ci    if (displayBuffer == nullptr) {
17132a6e48fSopenharmony_ci        return GSERROR_INTERNAL;
17232a6e48fSopenharmony_ci    }
17332a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
17432a6e48fSopenharmony_ci    if (handle_ == nullptr) {
17532a6e48fSopenharmony_ci        return GSERROR_INVALID_OPERATING;
17632a6e48fSopenharmony_ci    } else if (handle_->virAddr != nullptr) {
17732a6e48fSopenharmony_ci        BLOGD("handle_->virAddr has been maped, seq: %{public}u", sequenceNumber_);
17832a6e48fSopenharmony_ci        return GSERROR_OK;
17932a6e48fSopenharmony_ci    }
18032a6e48fSopenharmony_ci    if (handle_->usage & BUFFER_USAGE_PROTECTED) {
18132a6e48fSopenharmony_ci        BLOGD("usage is BUFFER_USAGE_PROTECTED, do not Map, seq: %{public}u", sequenceNumber_);
18232a6e48fSopenharmony_ci        return GSERROR_OK;
18332a6e48fSopenharmony_ci    }
18432a6e48fSopenharmony_ci
18532a6e48fSopenharmony_ci    void* virAddr = displayBuffer->Mmap(*handle_);
18632a6e48fSopenharmony_ci    if (virAddr == nullptr || virAddr == MAP_FAILED) {
18732a6e48fSopenharmony_ci        return GSERROR_HDI_ERROR;
18832a6e48fSopenharmony_ci    }
18932a6e48fSopenharmony_ci    return GSERROR_OK;
19032a6e48fSopenharmony_ci}
19132a6e48fSopenharmony_ci
19232a6e48fSopenharmony_ciGSError SurfaceBufferImpl::Unmap()
19332a6e48fSopenharmony_ci{
19432a6e48fSopenharmony_ci    IDisplayBufferSptr displayBuffer = GetOrResetDisplayBuffer();
19532a6e48fSopenharmony_ci    if (displayBuffer == nullptr) {
19632a6e48fSopenharmony_ci        return GSERROR_INTERNAL;
19732a6e48fSopenharmony_ci    }
19832a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
19932a6e48fSopenharmony_ci    if (handle_ == nullptr) {
20032a6e48fSopenharmony_ci        return GSERROR_INVALID_OPERATING;
20132a6e48fSopenharmony_ci    } else if (handle_->virAddr == nullptr) {
20232a6e48fSopenharmony_ci        BLOGW("handle has been unmaped, seq: %{public}u", sequenceNumber_);
20332a6e48fSopenharmony_ci        return GSERROR_OK;
20432a6e48fSopenharmony_ci    }
20532a6e48fSopenharmony_ci    auto dRet = displayBuffer->Unmap(*handle_);
20632a6e48fSopenharmony_ci    if (dRet == GRAPHIC_DISPLAY_SUCCESS) {
20732a6e48fSopenharmony_ci        handle_->virAddr = nullptr;
20832a6e48fSopenharmony_ci        return GSERROR_OK;
20932a6e48fSopenharmony_ci    }
21032a6e48fSopenharmony_ci    BLOGW("Unmap Failed with %{public}d, seq: %{public}u", dRet, sequenceNumber_);
21132a6e48fSopenharmony_ci    return GSERROR_HDI_ERROR;
21232a6e48fSopenharmony_ci}
21332a6e48fSopenharmony_ci
21432a6e48fSopenharmony_ciGSError SurfaceBufferImpl::FlushCache()
21532a6e48fSopenharmony_ci{
21632a6e48fSopenharmony_ci    IDisplayBufferSptr displayBuffer = GetOrResetDisplayBuffer();
21732a6e48fSopenharmony_ci    if (displayBuffer == nullptr) {
21832a6e48fSopenharmony_ci        return GSERROR_INTERNAL;
21932a6e48fSopenharmony_ci    }
22032a6e48fSopenharmony_ci
22132a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
22232a6e48fSopenharmony_ci    if (handle_ == nullptr) {
22332a6e48fSopenharmony_ci        return GSERROR_INVALID_OPERATING;
22432a6e48fSopenharmony_ci    }
22532a6e48fSopenharmony_ci    auto dRet = displayBuffer->FlushCache(*handle_);
22632a6e48fSopenharmony_ci    if (dRet == GRAPHIC_DISPLAY_SUCCESS) {
22732a6e48fSopenharmony_ci        return GSERROR_OK;
22832a6e48fSopenharmony_ci    }
22932a6e48fSopenharmony_ci    BLOGW("FlushCache Failed with %{public}d, seq: %{public}u", dRet, sequenceNumber_);
23032a6e48fSopenharmony_ci    return GSERROR_HDI_ERROR;
23132a6e48fSopenharmony_ci}
23232a6e48fSopenharmony_ci
23332a6e48fSopenharmony_ciGSError SurfaceBufferImpl::GetImageLayout(void* layout)
23432a6e48fSopenharmony_ci{
23532a6e48fSopenharmony_ci    IDisplayBufferSptr displayBuffer = GetOrResetDisplayBuffer();
23632a6e48fSopenharmony_ci    if (displayBuffer == nullptr) {
23732a6e48fSopenharmony_ci        return GSERROR_INTERNAL;
23832a6e48fSopenharmony_ci    }
23932a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
24032a6e48fSopenharmony_ci    if (handle_ == nullptr) {
24132a6e48fSopenharmony_ci        return GSERROR_INVALID_OPERATING;
24232a6e48fSopenharmony_ci    } else if (planesInfo_.planeCount != 0) {
24332a6e48fSopenharmony_ci        return GSERROR_OK;
24432a6e48fSopenharmony_ci    }
24532a6e48fSopenharmony_ci
24632a6e48fSopenharmony_ci    auto dRet = displayBuffer->GetImageLayout(*handle_,
24732a6e48fSopenharmony_ci        *(static_cast<OHOS::HDI::Display::Buffer::V1_2::ImageLayout*>(layout)));
24832a6e48fSopenharmony_ci    if (dRet == GRAPHIC_DISPLAY_SUCCESS) {
24932a6e48fSopenharmony_ci        return GSERROR_OK;
25032a6e48fSopenharmony_ci    }
25132a6e48fSopenharmony_ci    BLOGW("GetImageLayout Failed with %{public}d, seq: %{public}u", dRet, sequenceNumber_);
25232a6e48fSopenharmony_ci    return GSERROR_HDI_ERROR;
25332a6e48fSopenharmony_ci}
25432a6e48fSopenharmony_ci
25532a6e48fSopenharmony_ciGSError SurfaceBufferImpl::InvalidateCache()
25632a6e48fSopenharmony_ci{
25732a6e48fSopenharmony_ci    IDisplayBufferSptr displayBuffer = GetOrResetDisplayBuffer();
25832a6e48fSopenharmony_ci    if (displayBuffer == nullptr) {
25932a6e48fSopenharmony_ci        return GSERROR_INTERNAL;
26032a6e48fSopenharmony_ci    }
26132a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
26232a6e48fSopenharmony_ci    if (handle_ == nullptr) {
26332a6e48fSopenharmony_ci        return GSERROR_INVALID_OPERATING;
26432a6e48fSopenharmony_ci    }
26532a6e48fSopenharmony_ci
26632a6e48fSopenharmony_ci    auto dRet = displayBuffer->InvalidateCache(*handle_);
26732a6e48fSopenharmony_ci    if (dRet == GRAPHIC_DISPLAY_SUCCESS) {
26832a6e48fSopenharmony_ci        return GSERROR_OK;
26932a6e48fSopenharmony_ci    }
27032a6e48fSopenharmony_ci    BLOGW("InvalidateCache Failed with %{public}d, seq: %{public}u", dRet, sequenceNumber_);
27132a6e48fSopenharmony_ci    return GSERROR_HDI_ERROR;
27232a6e48fSopenharmony_ci}
27332a6e48fSopenharmony_ci
27432a6e48fSopenharmony_civoid SurfaceBufferImpl::FreeBufferHandleLocked()
27532a6e48fSopenharmony_ci{
27632a6e48fSopenharmony_ci    metaDataCache_.clear();
27732a6e48fSopenharmony_ci    if (handle_) {
27832a6e48fSopenharmony_ci        IDisplayBufferSptr displayBuffer = GetDisplayBuffer();
27932a6e48fSopenharmony_ci        if (displayBuffer == nullptr) {
28032a6e48fSopenharmony_ci            FreeBufferHandle(handle_);
28132a6e48fSopenharmony_ci            handle_ = nullptr;
28232a6e48fSopenharmony_ci            return;
28332a6e48fSopenharmony_ci        }
28432a6e48fSopenharmony_ci        if (handle_->virAddr != nullptr) {
28532a6e48fSopenharmony_ci            displayBuffer->Unmap(*handle_);
28632a6e48fSopenharmony_ci            handle_->virAddr = nullptr;
28732a6e48fSopenharmony_ci        }
28832a6e48fSopenharmony_ci        displayBuffer->FreeMem(*handle_);
28932a6e48fSopenharmony_ci        handle_ = nullptr;
29032a6e48fSopenharmony_ci    }
29132a6e48fSopenharmony_ci}
29232a6e48fSopenharmony_ci
29332a6e48fSopenharmony_ci// return BufferHandle* is dangerous, need to refactor
29432a6e48fSopenharmony_ciBufferHandle* SurfaceBufferImpl::GetBufferHandle() const
29532a6e48fSopenharmony_ci{
29632a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
29732a6e48fSopenharmony_ci    return handle_;
29832a6e48fSopenharmony_ci}
29932a6e48fSopenharmony_ci
30032a6e48fSopenharmony_civoid SurfaceBufferImpl::SetSurfaceBufferColorGamut(const GraphicColorGamut& colorGamut)
30132a6e48fSopenharmony_ci{
30232a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
30332a6e48fSopenharmony_ci    if (surfaceBufferColorGamut_ != colorGamut) {
30432a6e48fSopenharmony_ci        surfaceBufferColorGamut_ = colorGamut;
30532a6e48fSopenharmony_ci    }
30632a6e48fSopenharmony_ci}
30732a6e48fSopenharmony_ci
30832a6e48fSopenharmony_ciGraphicColorGamut SurfaceBufferImpl::GetSurfaceBufferColorGamut() const
30932a6e48fSopenharmony_ci{
31032a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
31132a6e48fSopenharmony_ci    return surfaceBufferColorGamut_;
31232a6e48fSopenharmony_ci}
31332a6e48fSopenharmony_ci
31432a6e48fSopenharmony_civoid SurfaceBufferImpl::SetSurfaceBufferTransform(const GraphicTransformType& transform)
31532a6e48fSopenharmony_ci{
31632a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
31732a6e48fSopenharmony_ci    if (transform_ != transform) {
31832a6e48fSopenharmony_ci        transform_ = transform;
31932a6e48fSopenharmony_ci    }
32032a6e48fSopenharmony_ci}
32132a6e48fSopenharmony_ci
32232a6e48fSopenharmony_ciGraphicTransformType SurfaceBufferImpl::GetSurfaceBufferTransform() const
32332a6e48fSopenharmony_ci{
32432a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
32532a6e48fSopenharmony_ci    return transform_;
32632a6e48fSopenharmony_ci}
32732a6e48fSopenharmony_ci
32832a6e48fSopenharmony_ciint32_t SurfaceBufferImpl::GetSurfaceBufferWidth() const
32932a6e48fSopenharmony_ci{
33032a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
33132a6e48fSopenharmony_ci    return surfaceBufferWidth_;
33232a6e48fSopenharmony_ci}
33332a6e48fSopenharmony_ci
33432a6e48fSopenharmony_ciint32_t SurfaceBufferImpl::GetSurfaceBufferHeight() const
33532a6e48fSopenharmony_ci{
33632a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
33732a6e48fSopenharmony_ci    return surfaceBufferHeight_;
33832a6e48fSopenharmony_ci}
33932a6e48fSopenharmony_ci
34032a6e48fSopenharmony_civoid SurfaceBufferImpl::SetSurfaceBufferWidth(int32_t width)
34132a6e48fSopenharmony_ci{
34232a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
34332a6e48fSopenharmony_ci    surfaceBufferWidth_ = width;
34432a6e48fSopenharmony_ci}
34532a6e48fSopenharmony_ci
34632a6e48fSopenharmony_civoid SurfaceBufferImpl::SetSurfaceBufferHeight(int32_t height)
34732a6e48fSopenharmony_ci{
34832a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
34932a6e48fSopenharmony_ci    surfaceBufferHeight_ = height;
35032a6e48fSopenharmony_ci}
35132a6e48fSopenharmony_ci
35232a6e48fSopenharmony_ciint32_t SurfaceBufferImpl::GetWidth() const
35332a6e48fSopenharmony_ci{
35432a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
35532a6e48fSopenharmony_ci    if (handle_ == nullptr) {
35632a6e48fSopenharmony_ci        return INVALID_ARGUMENT;
35732a6e48fSopenharmony_ci    }
35832a6e48fSopenharmony_ci    return handle_->width;
35932a6e48fSopenharmony_ci}
36032a6e48fSopenharmony_ci
36132a6e48fSopenharmony_ciint32_t SurfaceBufferImpl::GetHeight() const
36232a6e48fSopenharmony_ci{
36332a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
36432a6e48fSopenharmony_ci    if (handle_ == nullptr) {
36532a6e48fSopenharmony_ci        return INVALID_ARGUMENT;
36632a6e48fSopenharmony_ci    }
36732a6e48fSopenharmony_ci    return handle_->height;
36832a6e48fSopenharmony_ci}
36932a6e48fSopenharmony_ci
37032a6e48fSopenharmony_ciint32_t SurfaceBufferImpl::GetStride() const
37132a6e48fSopenharmony_ci{
37232a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
37332a6e48fSopenharmony_ci    if (handle_ == nullptr) {
37432a6e48fSopenharmony_ci        return INVALID_ARGUMENT;
37532a6e48fSopenharmony_ci    }
37632a6e48fSopenharmony_ci    return handle_->stride;
37732a6e48fSopenharmony_ci}
37832a6e48fSopenharmony_ci
37932a6e48fSopenharmony_ciint32_t SurfaceBufferImpl::GetFormat() const
38032a6e48fSopenharmony_ci{
38132a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
38232a6e48fSopenharmony_ci    if (handle_ == nullptr) {
38332a6e48fSopenharmony_ci        return INVALID_ARGUMENT;
38432a6e48fSopenharmony_ci    }
38532a6e48fSopenharmony_ci    return handle_->format;
38632a6e48fSopenharmony_ci}
38732a6e48fSopenharmony_ci
38832a6e48fSopenharmony_ciuint64_t SurfaceBufferImpl::GetUsage() const
38932a6e48fSopenharmony_ci{
39032a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
39132a6e48fSopenharmony_ci    if (handle_ == nullptr) {
39232a6e48fSopenharmony_ci        return INVALID_USAGE;
39332a6e48fSopenharmony_ci    }
39432a6e48fSopenharmony_ci    return handle_->usage;
39532a6e48fSopenharmony_ci}
39632a6e48fSopenharmony_ci
39732a6e48fSopenharmony_ciuint64_t SurfaceBufferImpl::GetPhyAddr() const
39832a6e48fSopenharmony_ci{
39932a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
40032a6e48fSopenharmony_ci    if (handle_ == nullptr) {
40132a6e48fSopenharmony_ci        return INVALID_PHYADDR;
40232a6e48fSopenharmony_ci    }
40332a6e48fSopenharmony_ci    return handle_->phyAddr;
40432a6e48fSopenharmony_ci}
40532a6e48fSopenharmony_ci
40632a6e48fSopenharmony_civoid* SurfaceBufferImpl::GetVirAddr()
40732a6e48fSopenharmony_ci{
40832a6e48fSopenharmony_ci    GSError ret = this->Map();
40932a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
41032a6e48fSopenharmony_ci        return nullptr;
41132a6e48fSopenharmony_ci    }
41232a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
41332a6e48fSopenharmony_ci    if (handle_ == nullptr) {
41432a6e48fSopenharmony_ci        return nullptr;
41532a6e48fSopenharmony_ci    }
41632a6e48fSopenharmony_ci    return handle_->virAddr;
41732a6e48fSopenharmony_ci}
41832a6e48fSopenharmony_ci
41932a6e48fSopenharmony_ciint32_t SurfaceBufferImpl::GetFileDescriptor() const
42032a6e48fSopenharmony_ci{
42132a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
42232a6e48fSopenharmony_ci    if (handle_ == nullptr) {
42332a6e48fSopenharmony_ci        return INVALID_ARGUMENT;
42432a6e48fSopenharmony_ci    }
42532a6e48fSopenharmony_ci    return handle_->fd;
42632a6e48fSopenharmony_ci}
42732a6e48fSopenharmony_ci
42832a6e48fSopenharmony_ciuint32_t SurfaceBufferImpl::GetSize() const
42932a6e48fSopenharmony_ci{
43032a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
43132a6e48fSopenharmony_ci    if (handle_ == nullptr) {
43232a6e48fSopenharmony_ci        return INVALID_SIZE;
43332a6e48fSopenharmony_ci    }
43432a6e48fSopenharmony_ci    return handle_->size;
43532a6e48fSopenharmony_ci}
43632a6e48fSopenharmony_ci
43732a6e48fSopenharmony_ciGSError SurfaceBufferImpl::GetPlanesInfo(void** planesInfo)
43832a6e48fSopenharmony_ci{
43932a6e48fSopenharmony_ci    if (planesInfo == nullptr) {
44032a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
44132a6e48fSopenharmony_ci    }
44232a6e48fSopenharmony_ci    OHOS::HDI::Display::Buffer::V1_2::ImageLayout layout;
44332a6e48fSopenharmony_ci    GSError ret = GetImageLayout(&layout);
44432a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
44532a6e48fSopenharmony_ci        BLOGW("GetImageLayout failed, ret:%d, seq: %{public}u", ret, sequenceNumber_);
44632a6e48fSopenharmony_ci        return ret;
44732a6e48fSopenharmony_ci    }
44832a6e48fSopenharmony_ci
44932a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
45032a6e48fSopenharmony_ci    if (planesInfo_.planeCount != 0) {
45132a6e48fSopenharmony_ci        *planesInfo = static_cast<void*>(&planesInfo_);
45232a6e48fSopenharmony_ci        return GSERROR_OK;
45332a6e48fSopenharmony_ci    }
45432a6e48fSopenharmony_ci    planesInfo_.planeCount = layout.planes.size();
45532a6e48fSopenharmony_ci    for (uint32_t i = 0; i < planesInfo_.planeCount && i < 4; i++) { // 4: max plane count
45632a6e48fSopenharmony_ci        planesInfo_.planes[i].offset = layout.planes[i].offset;
45732a6e48fSopenharmony_ci        planesInfo_.planes[i].rowStride = layout.planes[i].hStride;
45832a6e48fSopenharmony_ci        planesInfo_.planes[i].columnStride = layout.planes[i].vStride;
45932a6e48fSopenharmony_ci    }
46032a6e48fSopenharmony_ci
46132a6e48fSopenharmony_ci    *planesInfo = static_cast<void*>(&planesInfo_);
46232a6e48fSopenharmony_ci    return GSERROR_OK;
46332a6e48fSopenharmony_ci}
46432a6e48fSopenharmony_ci
46532a6e48fSopenharmony_civoid SurfaceBufferImpl::SetExtraData(sptr<BufferExtraData> bedata)
46632a6e48fSopenharmony_ci{
46732a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
46832a6e48fSopenharmony_ci    bedata_ = bedata;
46932a6e48fSopenharmony_ci}
47032a6e48fSopenharmony_ci
47132a6e48fSopenharmony_cisptr<BufferExtraData> SurfaceBufferImpl::GetExtraData() const
47232a6e48fSopenharmony_ci{
47332a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
47432a6e48fSopenharmony_ci    return bedata_;
47532a6e48fSopenharmony_ci}
47632a6e48fSopenharmony_ci
47732a6e48fSopenharmony_civoid SurfaceBufferImpl::SetBufferHandle(BufferHandle* handle)
47832a6e48fSopenharmony_ci{
47932a6e48fSopenharmony_ci    if (handle == nullptr) {
48032a6e48fSopenharmony_ci        return;
48132a6e48fSopenharmony_ci    }
48232a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
48332a6e48fSopenharmony_ci    if (handle_ == handle) {
48432a6e48fSopenharmony_ci        return;
48532a6e48fSopenharmony_ci    }
48632a6e48fSopenharmony_ci    FreeBufferHandleLocked();
48732a6e48fSopenharmony_ci
48832a6e48fSopenharmony_ci    handle_ = handle;
48932a6e48fSopenharmony_ci    IDisplayBufferSptr displayBuffer = GetDisplayBuffer();
49032a6e48fSopenharmony_ci    if (displayBuffer == nullptr) {
49132a6e48fSopenharmony_ci        return;
49232a6e48fSopenharmony_ci    }
49332a6e48fSopenharmony_ci    auto dRet = displayBuffer->RegisterBuffer(*handle_);
49432a6e48fSopenharmony_ci    if (dRet != GRAPHIC_DISPLAY_SUCCESS && dRet != GRAPHIC_DISPLAY_NOT_SUPPORT) {
49532a6e48fSopenharmony_ci        BLOGE("SetBufferHandle RegisterBuffer Failed with %{public}d", dRet);
49632a6e48fSopenharmony_ci        return;
49732a6e48fSopenharmony_ci    }
49832a6e48fSopenharmony_ci}
49932a6e48fSopenharmony_ci
50032a6e48fSopenharmony_ciGSError SurfaceBufferImpl::WriteBufferRequestConfig(MessageParcel& parcel)
50132a6e48fSopenharmony_ci{
50232a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
50332a6e48fSopenharmony_ci    if (!parcel.WriteInt32(bufferRequestConfig_.width) || !parcel.WriteInt32(bufferRequestConfig_.height) ||
50432a6e48fSopenharmony_ci        !parcel.WriteInt32(bufferRequestConfig_.strideAlignment) || !parcel.WriteInt32(bufferRequestConfig_.format) ||
50532a6e48fSopenharmony_ci        !parcel.WriteUint64(bufferRequestConfig_.usage) || !parcel.WriteInt32(bufferRequestConfig_.timeout) ||
50632a6e48fSopenharmony_ci        !parcel.WriteUint32(static_cast<uint32_t>(bufferRequestConfig_.colorGamut)) ||
50732a6e48fSopenharmony_ci        !parcel.WriteUint32(static_cast<uint32_t>(bufferRequestConfig_.transform))) {
50832a6e48fSopenharmony_ci        BLOGE("parcel write fail, seq: %{public}u.", sequenceNumber_);
50932a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
51032a6e48fSopenharmony_ci    }
51132a6e48fSopenharmony_ci    return GSERROR_OK;
51232a6e48fSopenharmony_ci}
51332a6e48fSopenharmony_ci
51432a6e48fSopenharmony_ciGSError SurfaceBufferImpl::WriteToMessageParcel(MessageParcel& parcel)
51532a6e48fSopenharmony_ci{
51632a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
51732a6e48fSopenharmony_ci    if (handle_ == nullptr) {
51832a6e48fSopenharmony_ci        return GSERROR_NOT_INIT;
51932a6e48fSopenharmony_ci    }
52032a6e48fSopenharmony_ci    bool ret = WriteBufferHandle(parcel, *handle_);
52132a6e48fSopenharmony_ci    if (ret == false) {
52232a6e48fSopenharmony_ci        return GSERROR_API_FAILED;
52332a6e48fSopenharmony_ci    }
52432a6e48fSopenharmony_ci
52532a6e48fSopenharmony_ci    return GSERROR_OK;
52632a6e48fSopenharmony_ci}
52732a6e48fSopenharmony_ci
52832a6e48fSopenharmony_ciGSError SurfaceBufferImpl::ReadBufferRequestConfig(MessageParcel& parcel)
52932a6e48fSopenharmony_ci{
53032a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
53132a6e48fSopenharmony_ci    uint32_t colorGamut = 0;
53232a6e48fSopenharmony_ci    uint32_t transform = 0;
53332a6e48fSopenharmony_ci    if (!parcel.ReadInt32(bufferRequestConfig_.width) || !parcel.ReadInt32(bufferRequestConfig_.height) ||
53432a6e48fSopenharmony_ci        !parcel.ReadInt32(bufferRequestConfig_.strideAlignment) || !parcel.ReadInt32(bufferRequestConfig_.format) ||
53532a6e48fSopenharmony_ci        !parcel.ReadUint64(bufferRequestConfig_.usage) || !parcel.ReadInt32(bufferRequestConfig_.timeout) ||
53632a6e48fSopenharmony_ci        !parcel.ReadUint32(colorGamut) || !parcel.ReadUint32(transform)) {
53732a6e48fSopenharmony_ci        BLOGE("parcel read fail, seq: %{public}u.", sequenceNumber_);
53832a6e48fSopenharmony_ci        return GSERROR_API_FAILED;
53932a6e48fSopenharmony_ci    }
54032a6e48fSopenharmony_ci    bufferRequestConfig_.colorGamut = static_cast<GraphicColorGamut>(colorGamut);
54132a6e48fSopenharmony_ci    bufferRequestConfig_.transform = static_cast<GraphicTransformType>(transform);
54232a6e48fSopenharmony_ci    return GSERROR_OK;
54332a6e48fSopenharmony_ci}
54432a6e48fSopenharmony_ci
54532a6e48fSopenharmony_ciGSError SurfaceBufferImpl::ReadFromMessageParcel(MessageParcel& parcel)
54632a6e48fSopenharmony_ci{
54732a6e48fSopenharmony_ci    auto handle = ReadBufferHandle(parcel);
54832a6e48fSopenharmony_ci    SetBufferHandle(handle);
54932a6e48fSopenharmony_ci    return handle ? GSERROR_OK : GSERROR_API_FAILED;
55032a6e48fSopenharmony_ci}
55132a6e48fSopenharmony_ci
55232a6e48fSopenharmony_ci// return OH_NativeBuffer* is dangerous, need to refactor
55332a6e48fSopenharmony_ciOH_NativeBuffer* SurfaceBufferImpl::SurfaceBufferToNativeBuffer()
55432a6e48fSopenharmony_ci{
55532a6e48fSopenharmony_ci    return reinterpret_cast<OH_NativeBuffer *>(this);
55632a6e48fSopenharmony_ci}
55732a6e48fSopenharmony_ci
55832a6e48fSopenharmony_ciuint32_t SurfaceBufferImpl::GetSeqNum() const
55932a6e48fSopenharmony_ci{
56032a6e48fSopenharmony_ci    return sequenceNumber_;
56132a6e48fSopenharmony_ci}
56232a6e48fSopenharmony_ci
56332a6e48fSopenharmony_ciGSError SurfaceBufferImpl::CheckBufferConfig(int32_t width, int32_t height,
56432a6e48fSopenharmony_ci                                             int32_t format, uint64_t usage)
56532a6e48fSopenharmony_ci{
56632a6e48fSopenharmony_ci    if (width <= 0 || height <= 0) {
56732a6e48fSopenharmony_ci        BLOGE("width %{public}d height %{public}d", width, height);
56832a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
56932a6e48fSopenharmony_ci    }
57032a6e48fSopenharmony_ci
57132a6e48fSopenharmony_ci    if (format < 0 || format > GRAPHIC_PIXEL_FMT_BUTT) {
57232a6e48fSopenharmony_ci        BLOGE("format is %{public}d", format);
57332a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
57432a6e48fSopenharmony_ci    }
57532a6e48fSopenharmony_ci
57632a6e48fSopenharmony_ci    return GSERROR_OK;
57732a6e48fSopenharmony_ci}
57832a6e48fSopenharmony_ci
57932a6e48fSopenharmony_ciBufferWrapper SurfaceBufferImpl::GetBufferWrapper()
58032a6e48fSopenharmony_ci{
58132a6e48fSopenharmony_ci    return {};
58232a6e48fSopenharmony_ci}
58332a6e48fSopenharmony_ci
58432a6e48fSopenharmony_civoid SurfaceBufferImpl::SetBufferWrapper(BufferWrapper wrapper) {}
58532a6e48fSopenharmony_ci
58632a6e48fSopenharmony_ciGSError SurfaceBufferImpl::SetMetadata(uint32_t key, const std::vector<uint8_t>& value)
58732a6e48fSopenharmony_ci{
58832a6e48fSopenharmony_ci    if (key == 0 || key >= HDI::Display::Graphic::Common::V1_1::ATTRKEY_END) {
58932a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
59032a6e48fSopenharmony_ci    }
59132a6e48fSopenharmony_ci    IDisplayBufferSptr displayBuffer = GetOrResetDisplayBuffer();
59232a6e48fSopenharmony_ci    if (displayBuffer == nullptr) {
59332a6e48fSopenharmony_ci        return GSERROR_INTERNAL;
59432a6e48fSopenharmony_ci    }
59532a6e48fSopenharmony_ci
59632a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
59732a6e48fSopenharmony_ci    if (handle_ == nullptr) {
59832a6e48fSopenharmony_ci        return GSERROR_NOT_INIT;
59932a6e48fSopenharmony_ci    }
60032a6e48fSopenharmony_ci
60132a6e48fSopenharmony_ci    if (MetaDataCachedLocked(key, value)) {
60232a6e48fSopenharmony_ci        return GSERROR_OK;
60332a6e48fSopenharmony_ci    }
60432a6e48fSopenharmony_ci
60532a6e48fSopenharmony_ci    auto dRet = displayBuffer->SetMetadata(*handle_, key, value);
60632a6e48fSopenharmony_ci    if (dRet == GRAPHIC_DISPLAY_SUCCESS) {
60732a6e48fSopenharmony_ci        // cache metaData
60832a6e48fSopenharmony_ci        metaDataCache_[key] = value;
60932a6e48fSopenharmony_ci        return GSERROR_OK;
61032a6e48fSopenharmony_ci    }
61132a6e48fSopenharmony_ci    BLOGE("SetMetadata Failed with %{public}d", dRet);
61232a6e48fSopenharmony_ci    return GSERROR_HDI_ERROR;
61332a6e48fSopenharmony_ci}
61432a6e48fSopenharmony_ci
61532a6e48fSopenharmony_ciGSError SurfaceBufferImpl::GetMetadata(uint32_t key, std::vector<uint8_t>& value)
61632a6e48fSopenharmony_ci{
61732a6e48fSopenharmony_ci    if (key == 0 || key >= HDI::Display::Graphic::Common::V1_1::ATTRKEY_END) {
61832a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
61932a6e48fSopenharmony_ci    }
62032a6e48fSopenharmony_ci    IDisplayBufferSptr displayBuffer = GetOrResetDisplayBuffer();
62132a6e48fSopenharmony_ci    if (displayBuffer == nullptr) {
62232a6e48fSopenharmony_ci        return GSERROR_INTERNAL;
62332a6e48fSopenharmony_ci    }
62432a6e48fSopenharmony_ci
62532a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
62632a6e48fSopenharmony_ci    if (handle_ == nullptr) {
62732a6e48fSopenharmony_ci        return GSERROR_NOT_INIT;
62832a6e48fSopenharmony_ci    }
62932a6e48fSopenharmony_ci    auto dRet = displayBuffer->GetMetadata(*handle_, key, value);
63032a6e48fSopenharmony_ci    if (dRet == GRAPHIC_DISPLAY_SUCCESS) {
63132a6e48fSopenharmony_ci        return GSERROR_OK;
63232a6e48fSopenharmony_ci    }
63332a6e48fSopenharmony_ci    BLOGD("GetMetadata Failed with %{public}d", dRet);
63432a6e48fSopenharmony_ci    return GSERROR_HDI_ERROR;
63532a6e48fSopenharmony_ci}
63632a6e48fSopenharmony_ci
63732a6e48fSopenharmony_ciGSError SurfaceBufferImpl::ListMetadataKeys(std::vector<uint32_t>& keys)
63832a6e48fSopenharmony_ci{
63932a6e48fSopenharmony_ci    IDisplayBufferSptr displayBuffer = GetOrResetDisplayBuffer();
64032a6e48fSopenharmony_ci    if (displayBuffer == nullptr) {
64132a6e48fSopenharmony_ci        return GSERROR_INTERNAL;
64232a6e48fSopenharmony_ci    }
64332a6e48fSopenharmony_ci    keys.clear();
64432a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
64532a6e48fSopenharmony_ci    if (handle_ == nullptr) {
64632a6e48fSopenharmony_ci        return GSERROR_NOT_INIT;
64732a6e48fSopenharmony_ci    }
64832a6e48fSopenharmony_ci    auto dRet = displayBuffer->ListMetadataKeys(*handle_, keys);
64932a6e48fSopenharmony_ci    if (dRet == GRAPHIC_DISPLAY_SUCCESS) {
65032a6e48fSopenharmony_ci        return GSERROR_OK;
65132a6e48fSopenharmony_ci    }
65232a6e48fSopenharmony_ci    BLOGE("ListMetadataKeys Failed with %{public}d", dRet);
65332a6e48fSopenharmony_ci    return GSERROR_HDI_ERROR;
65432a6e48fSopenharmony_ci}
65532a6e48fSopenharmony_ci
65632a6e48fSopenharmony_ciGSError SurfaceBufferImpl::EraseMetadataKey(uint32_t key)
65732a6e48fSopenharmony_ci{
65832a6e48fSopenharmony_ci    if (key == 0 || key >= HDI::Display::Graphic::Common::V1_1::ATTRKEY_END) {
65932a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
66032a6e48fSopenharmony_ci    }
66132a6e48fSopenharmony_ci    IDisplayBufferSptr displayBuffer = GetOrResetDisplayBuffer();
66232a6e48fSopenharmony_ci    if (displayBuffer == nullptr) {
66332a6e48fSopenharmony_ci        return GSERROR_INTERNAL;
66432a6e48fSopenharmony_ci    }
66532a6e48fSopenharmony_ci
66632a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
66732a6e48fSopenharmony_ci    if (handle_ == nullptr) {
66832a6e48fSopenharmony_ci        return GSERROR_NOT_INIT;
66932a6e48fSopenharmony_ci    }
67032a6e48fSopenharmony_ci    auto dRet = displayBuffer->EraseMetadataKey(*handle_, key);
67132a6e48fSopenharmony_ci    if (dRet == GRAPHIC_DISPLAY_SUCCESS) {
67232a6e48fSopenharmony_ci        metaDataCache_.erase(key);
67332a6e48fSopenharmony_ci        return GSERROR_OK;
67432a6e48fSopenharmony_ci    }
67532a6e48fSopenharmony_ci    BLOGE("EraseMetadataKey Failed with %{public}d", dRet);
67632a6e48fSopenharmony_ci    return GSERROR_HDI_ERROR;
67732a6e48fSopenharmony_ci}
67832a6e48fSopenharmony_ci
67932a6e48fSopenharmony_ciBufferRequestConfig SurfaceBufferImpl::GetBufferRequestConfig() const
68032a6e48fSopenharmony_ci{
68132a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
68232a6e48fSopenharmony_ci    return bufferRequestConfig_;
68332a6e48fSopenharmony_ci}
68432a6e48fSopenharmony_ci
68532a6e48fSopenharmony_civoid SurfaceBufferImpl::SetBufferRequestConfig(const BufferRequestConfig& config)
68632a6e48fSopenharmony_ci{
68732a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
68832a6e48fSopenharmony_ci    bufferRequestConfig_ = config;
68932a6e48fSopenharmony_ci}
69032a6e48fSopenharmony_ci
69132a6e48fSopenharmony_civoid SurfaceBufferImpl::SetConsumerAttachBufferFlag(bool value)
69232a6e48fSopenharmony_ci{
69332a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
69432a6e48fSopenharmony_ci    isConsumerAttachBufferFlag_ = value;
69532a6e48fSopenharmony_ci}
69632a6e48fSopenharmony_ci
69732a6e48fSopenharmony_cibool SurfaceBufferImpl::GetConsumerAttachBufferFlag()
69832a6e48fSopenharmony_ci{
69932a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
70032a6e48fSopenharmony_ci    return isConsumerAttachBufferFlag_;
70132a6e48fSopenharmony_ci}
70232a6e48fSopenharmony_ci} // namespace OHOS
703