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 "consumer_surface.h"
1732a6e48fSopenharmony_ci
1832a6e48fSopenharmony_ci#include <cinttypes>
1932a6e48fSopenharmony_ci
2032a6e48fSopenharmony_ci#include "buffer_log.h"
2132a6e48fSopenharmony_ci#include "buffer_queue_producer.h"
2232a6e48fSopenharmony_ci#include "sync_fence.h"
2332a6e48fSopenharmony_ci
2432a6e48fSopenharmony_cinamespace OHOS {
2532a6e48fSopenharmony_cisptr<Surface> Surface::CreateSurfaceAsConsumer(std::string name, bool isShared)
2632a6e48fSopenharmony_ci{
2732a6e48fSopenharmony_ci    sptr<ConsumerSurface> surf = new ConsumerSurface(name, isShared);
2832a6e48fSopenharmony_ci    if (surf->Init() != GSERROR_OK) {
2932a6e48fSopenharmony_ci        BLOGE("consumer surf init failed");
3032a6e48fSopenharmony_ci        return nullptr;
3132a6e48fSopenharmony_ci    }
3232a6e48fSopenharmony_ci    return surf;
3332a6e48fSopenharmony_ci}
3432a6e48fSopenharmony_ci
3532a6e48fSopenharmony_cisptr<IConsumerSurface> IConsumerSurface::Create(std::string name, bool isShared)
3632a6e48fSopenharmony_ci{
3732a6e48fSopenharmony_ci    sptr<ConsumerSurface> surf = new ConsumerSurface(name, isShared);
3832a6e48fSopenharmony_ci    if (surf->Init() != GSERROR_OK) {
3932a6e48fSopenharmony_ci        BLOGE("consumer surf init failed");
4032a6e48fSopenharmony_ci        return nullptr;
4132a6e48fSopenharmony_ci    }
4232a6e48fSopenharmony_ci    return surf;
4332a6e48fSopenharmony_ci}
4432a6e48fSopenharmony_ci
4532a6e48fSopenharmony_ciConsumerSurface::ConsumerSurface(const std::string& name, bool isShared)
4632a6e48fSopenharmony_ci    : name_(name), isShared_(isShared)
4732a6e48fSopenharmony_ci{
4832a6e48fSopenharmony_ci    consumer_ = nullptr;
4932a6e48fSopenharmony_ci    producer_ = nullptr;
5032a6e48fSopenharmony_ci}
5132a6e48fSopenharmony_ci
5232a6e48fSopenharmony_ciConsumerSurface::~ConsumerSurface()
5332a6e48fSopenharmony_ci{
5432a6e48fSopenharmony_ci    if (consumer_ != nullptr) {
5532a6e48fSopenharmony_ci        consumer_->OnConsumerDied();
5632a6e48fSopenharmony_ci        consumer_->SetStatus(false);
5732a6e48fSopenharmony_ci    }
5832a6e48fSopenharmony_ci    if (producer_ != nullptr) {
5932a6e48fSopenharmony_ci        BLOGI("~ConsumerSurface, producer_ sptrCnt: %{public}d, uniqueId: %{public}" PRIu64 ".",
6032a6e48fSopenharmony_ci            producer_->GetSptrRefCount(), uniqueId_);
6132a6e48fSopenharmony_ci    }
6232a6e48fSopenharmony_ci    consumer_ = nullptr;
6332a6e48fSopenharmony_ci    producer_ = nullptr;
6432a6e48fSopenharmony_ci}
6532a6e48fSopenharmony_ci
6632a6e48fSopenharmony_ciGSError ConsumerSurface::Init()
6732a6e48fSopenharmony_ci{
6832a6e48fSopenharmony_ci    sptr<BufferQueue> queue_ = new BufferQueue(name_, isShared_);
6932a6e48fSopenharmony_ci    producer_ = new BufferQueueProducer(queue_);
7032a6e48fSopenharmony_ci    consumer_ = new BufferQueueConsumer(queue_);
7132a6e48fSopenharmony_ci    uniqueId_ = GetUniqueId();
7232a6e48fSopenharmony_ci    BLOGD("ConsumerSurface Init, uniqueId: %{public}" PRIu64 ".", uniqueId_);
7332a6e48fSopenharmony_ci    return GSERROR_OK;
7432a6e48fSopenharmony_ci}
7532a6e48fSopenharmony_ci
7632a6e48fSopenharmony_cibool ConsumerSurface::IsConsumer() const
7732a6e48fSopenharmony_ci{
7832a6e48fSopenharmony_ci    return true;
7932a6e48fSopenharmony_ci}
8032a6e48fSopenharmony_ci
8132a6e48fSopenharmony_cisptr<IBufferProducer> ConsumerSurface::GetProducer() const
8232a6e48fSopenharmony_ci{
8332a6e48fSopenharmony_ci    return producer_;
8432a6e48fSopenharmony_ci}
8532a6e48fSopenharmony_ci
8632a6e48fSopenharmony_ciGSError ConsumerSurface::GetProducerInitInfo(ProducerInitInfo& info)
8732a6e48fSopenharmony_ci{
8832a6e48fSopenharmony_ci    return GSERROR_NOT_SUPPORT;
8932a6e48fSopenharmony_ci}
9032a6e48fSopenharmony_ci
9132a6e48fSopenharmony_ciGSError ConsumerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
9232a6e48fSopenharmony_ci                                       int64_t& timestamp, Rect& damage)
9332a6e48fSopenharmony_ci{
9432a6e48fSopenharmony_ci    std::vector<Rect> damages;
9532a6e48fSopenharmony_ci    GSError ret = AcquireBuffer(buffer, fence, timestamp, damages);
9632a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
9732a6e48fSopenharmony_ci        return ret;
9832a6e48fSopenharmony_ci    }
9932a6e48fSopenharmony_ci    if (damages.size() == 1) {
10032a6e48fSopenharmony_ci        damage = damages[0];
10132a6e48fSopenharmony_ci        return GSERROR_OK;
10232a6e48fSopenharmony_ci    }
10332a6e48fSopenharmony_ci    BLOGE("damages is %{public}zu, uniqueId: %{public}" PRIu64 ".", damages.size(), uniqueId_);
10432a6e48fSopenharmony_ci    return GSERROR_INVALID_ARGUMENTS;
10532a6e48fSopenharmony_ci}
10632a6e48fSopenharmony_ci
10732a6e48fSopenharmony_ciGSError ConsumerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
10832a6e48fSopenharmony_ci                                       int64_t& timestamp, std::vector<Rect>& damages)
10932a6e48fSopenharmony_ci{
11032a6e48fSopenharmony_ci    if (consumer_ == nullptr) {
11132a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
11232a6e48fSopenharmony_ci    }
11332a6e48fSopenharmony_ci    return consumer_->AcquireBuffer(buffer, fence, timestamp, damages);
11432a6e48fSopenharmony_ci}
11532a6e48fSopenharmony_ci
11632a6e48fSopenharmony_ciGSError ConsumerSurface::AcquireBuffer(AcquireBufferReturnValue &returnValue, int64_t expectPresentTimestamp,
11732a6e48fSopenharmony_ci                                       bool isUsingAutoTimestamp)
11832a6e48fSopenharmony_ci{
11932a6e48fSopenharmony_ci    if (consumer_ == nullptr) {
12032a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
12132a6e48fSopenharmony_ci    }
12232a6e48fSopenharmony_ci    return consumer_->AcquireBuffer(returnValue, expectPresentTimestamp, isUsingAutoTimestamp);
12332a6e48fSopenharmony_ci}
12432a6e48fSopenharmony_ci
12532a6e48fSopenharmony_ciGSError ConsumerSurface::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence)
12632a6e48fSopenharmony_ci{
12732a6e48fSopenharmony_ci    if (buffer == nullptr || consumer_ == nullptr) {
12832a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
12932a6e48fSopenharmony_ci    }
13032a6e48fSopenharmony_ci    return consumer_->ReleaseBuffer(buffer, fence);
13132a6e48fSopenharmony_ci}
13232a6e48fSopenharmony_ci
13332a6e48fSopenharmony_ciGSError ConsumerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, int32_t& fence,
13432a6e48fSopenharmony_ci                                       int64_t& timestamp, Rect& damage)
13532a6e48fSopenharmony_ci{
13632a6e48fSopenharmony_ci    sptr<SyncFence> syncFence = SyncFence::InvalidFence();
13732a6e48fSopenharmony_ci    auto ret = AcquireBuffer(buffer, syncFence, timestamp, damage);
13832a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
13932a6e48fSopenharmony_ci        fence = -1;
14032a6e48fSopenharmony_ci        return ret;
14132a6e48fSopenharmony_ci    }
14232a6e48fSopenharmony_ci    fence = syncFence->Dup();
14332a6e48fSopenharmony_ci    return GSERROR_OK;
14432a6e48fSopenharmony_ci}
14532a6e48fSopenharmony_ci
14632a6e48fSopenharmony_ciGSError ConsumerSurface::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, int32_t fence)
14732a6e48fSopenharmony_ci{
14832a6e48fSopenharmony_ci    sptr<SyncFence> syncFence = new SyncFence(fence);
14932a6e48fSopenharmony_ci    return ReleaseBuffer(buffer, syncFence);
15032a6e48fSopenharmony_ci}
15132a6e48fSopenharmony_ci
15232a6e48fSopenharmony_ciGSError ConsumerSurface::AttachBufferToQueue(sptr<SurfaceBuffer> buffer)
15332a6e48fSopenharmony_ci{
15432a6e48fSopenharmony_ci    if (buffer == nullptr || consumer_ == nullptr) {
15532a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
15632a6e48fSopenharmony_ci    }
15732a6e48fSopenharmony_ci    buffer->SetConsumerAttachBufferFlag(true);
15832a6e48fSopenharmony_ci    return consumer_->AttachBufferToQueue(buffer);
15932a6e48fSopenharmony_ci}
16032a6e48fSopenharmony_ci
16132a6e48fSopenharmony_ciGSError ConsumerSurface::DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)
16232a6e48fSopenharmony_ci{
16332a6e48fSopenharmony_ci    if (buffer == nullptr || consumer_ == nullptr) {
16432a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
16532a6e48fSopenharmony_ci    }
16632a6e48fSopenharmony_ci    buffer->SetConsumerAttachBufferFlag(false);
16732a6e48fSopenharmony_ci    return consumer_->DetachBufferFromQueue(buffer);
16832a6e48fSopenharmony_ci}
16932a6e48fSopenharmony_ci
17032a6e48fSopenharmony_ciGSError ConsumerSurface::AttachBuffer(sptr<SurfaceBuffer>& buffer)
17132a6e48fSopenharmony_ci{
17232a6e48fSopenharmony_ci    if (buffer == nullptr || consumer_ == nullptr) {
17332a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
17432a6e48fSopenharmony_ci    }
17532a6e48fSopenharmony_ci    return consumer_->AttachBuffer(buffer);
17632a6e48fSopenharmony_ci}
17732a6e48fSopenharmony_ci
17832a6e48fSopenharmony_ciGSError ConsumerSurface::AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut)
17932a6e48fSopenharmony_ci{
18032a6e48fSopenharmony_ci    if (buffer == nullptr || consumer_ == nullptr) {
18132a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
18232a6e48fSopenharmony_ci    }
18332a6e48fSopenharmony_ci    return consumer_->AttachBuffer(buffer, timeOut);
18432a6e48fSopenharmony_ci}
18532a6e48fSopenharmony_ci
18632a6e48fSopenharmony_ciGSError ConsumerSurface::DetachBuffer(sptr<SurfaceBuffer>& buffer)
18732a6e48fSopenharmony_ci{
18832a6e48fSopenharmony_ci    if (buffer == nullptr || consumer_ == nullptr) {
18932a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
19032a6e48fSopenharmony_ci    }
19132a6e48fSopenharmony_ci    return consumer_->DetachBuffer(buffer);
19232a6e48fSopenharmony_ci}
19332a6e48fSopenharmony_ci
19432a6e48fSopenharmony_ciGSError ConsumerSurface::RegisterSurfaceDelegator(sptr<IRemoteObject> client)
19532a6e48fSopenharmony_ci{
19632a6e48fSopenharmony_ci    if (client == nullptr || consumer_ == nullptr) {
19732a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
19832a6e48fSopenharmony_ci    }
19932a6e48fSopenharmony_ci    return consumer_->RegisterSurfaceDelegator(client, this);
20032a6e48fSopenharmony_ci}
20132a6e48fSopenharmony_ci
20232a6e48fSopenharmony_cibool ConsumerSurface::QueryIfBufferAvailable()
20332a6e48fSopenharmony_ci{
20432a6e48fSopenharmony_ci    if (consumer_ == nullptr) {
20532a6e48fSopenharmony_ci        return false;
20632a6e48fSopenharmony_ci    }
20732a6e48fSopenharmony_ci    return consumer_->QueryIfBufferAvailable();
20832a6e48fSopenharmony_ci}
20932a6e48fSopenharmony_ci
21032a6e48fSopenharmony_ciuint32_t ConsumerSurface::GetQueueSize()
21132a6e48fSopenharmony_ci{
21232a6e48fSopenharmony_ci    if (producer_ == nullptr) {
21332a6e48fSopenharmony_ci        return 0;
21432a6e48fSopenharmony_ci    }
21532a6e48fSopenharmony_ci    return producer_->GetQueueSize();
21632a6e48fSopenharmony_ci}
21732a6e48fSopenharmony_ci
21832a6e48fSopenharmony_ciGSError ConsumerSurface::SetQueueSize(uint32_t queueSize)
21932a6e48fSopenharmony_ci{
22032a6e48fSopenharmony_ci    if (producer_ == nullptr) {
22132a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
22232a6e48fSopenharmony_ci    }
22332a6e48fSopenharmony_ci    return producer_->SetQueueSize(queueSize);
22432a6e48fSopenharmony_ci}
22532a6e48fSopenharmony_ci
22632a6e48fSopenharmony_ciconst std::string& ConsumerSurface::GetName()
22732a6e48fSopenharmony_ci{
22832a6e48fSopenharmony_ci    return name_;
22932a6e48fSopenharmony_ci}
23032a6e48fSopenharmony_ci
23132a6e48fSopenharmony_ciGSError ConsumerSurface::SetDefaultWidthAndHeight(int32_t width, int32_t height)
23232a6e48fSopenharmony_ci{
23332a6e48fSopenharmony_ci    if (consumer_ == nullptr) {
23432a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
23532a6e48fSopenharmony_ci    }
23632a6e48fSopenharmony_ci    return consumer_->SetDefaultWidthAndHeight(width, height);
23732a6e48fSopenharmony_ci}
23832a6e48fSopenharmony_ci
23932a6e48fSopenharmony_ciint32_t ConsumerSurface::GetDefaultWidth()
24032a6e48fSopenharmony_ci{
24132a6e48fSopenharmony_ci    if (producer_ == nullptr) {
24232a6e48fSopenharmony_ci        return -1;
24332a6e48fSopenharmony_ci    }
24432a6e48fSopenharmony_ci    return producer_->GetDefaultWidth();
24532a6e48fSopenharmony_ci}
24632a6e48fSopenharmony_ci
24732a6e48fSopenharmony_ciint32_t ConsumerSurface::GetDefaultHeight()
24832a6e48fSopenharmony_ci{
24932a6e48fSopenharmony_ci    if (producer_ == nullptr) {
25032a6e48fSopenharmony_ci        return -1;
25132a6e48fSopenharmony_ci    }
25232a6e48fSopenharmony_ci    return producer_->GetDefaultHeight();
25332a6e48fSopenharmony_ci}
25432a6e48fSopenharmony_ci
25532a6e48fSopenharmony_ciGSError ConsumerSurface::SetDefaultUsage(uint64_t usage)
25632a6e48fSopenharmony_ci{
25732a6e48fSopenharmony_ci    if (consumer_ == nullptr) {
25832a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
25932a6e48fSopenharmony_ci    }
26032a6e48fSopenharmony_ci    return consumer_->SetDefaultUsage(usage);
26132a6e48fSopenharmony_ci}
26232a6e48fSopenharmony_ci
26332a6e48fSopenharmony_ciuint64_t ConsumerSurface::GetDefaultUsage()
26432a6e48fSopenharmony_ci{
26532a6e48fSopenharmony_ci    if (producer_ == nullptr) {
26632a6e48fSopenharmony_ci        return 0;
26732a6e48fSopenharmony_ci    }
26832a6e48fSopenharmony_ci    return producer_->GetDefaultUsage();
26932a6e48fSopenharmony_ci}
27032a6e48fSopenharmony_ci
27132a6e48fSopenharmony_ciGSError ConsumerSurface::SetUserData(const std::string& key, const std::string& val)
27232a6e48fSopenharmony_ci{
27332a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lockGuard(lockMutex_);
27432a6e48fSopenharmony_ci    if (userData_.size() >= SURFACE_MAX_USER_DATA_COUNT) {
27532a6e48fSopenharmony_ci        BLOGE("userData_ size(%{public}zu) out, uniqueId: %{public}" PRIu64 ".", userData_.size(), uniqueId_);
27632a6e48fSopenharmony_ci        return GSERROR_OUT_OF_RANGE;
27732a6e48fSopenharmony_ci    }
27832a6e48fSopenharmony_ci
27932a6e48fSopenharmony_ci    auto iterUserData = userData_.find(key);
28032a6e48fSopenharmony_ci    if (iterUserData != userData_.end() && iterUserData->second == val) {
28132a6e48fSopenharmony_ci        BLOGE("not find key:%{public}s, val:%{public}s exist, uniqueId: %{public}" PRIu64 ".",
28232a6e48fSopenharmony_ci            key.c_str(), val.c_str(), uniqueId_);
28332a6e48fSopenharmony_ci        return GSERROR_API_FAILED;
28432a6e48fSopenharmony_ci    }
28532a6e48fSopenharmony_ci
28632a6e48fSopenharmony_ci    userData_[key] = val;
28732a6e48fSopenharmony_ci    auto iter = onUserDataChange_.begin();
28832a6e48fSopenharmony_ci    while (iter != onUserDataChange_.end()) {
28932a6e48fSopenharmony_ci        if (iter->second != nullptr) {
29032a6e48fSopenharmony_ci            iter->second(key, val);
29132a6e48fSopenharmony_ci        }
29232a6e48fSopenharmony_ci        iter++;
29332a6e48fSopenharmony_ci    }
29432a6e48fSopenharmony_ci
29532a6e48fSopenharmony_ci    return GSERROR_OK;
29632a6e48fSopenharmony_ci}
29732a6e48fSopenharmony_ci
29832a6e48fSopenharmony_cistd::string ConsumerSurface::GetUserData(const std::string& key)
29932a6e48fSopenharmony_ci{
30032a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lockGuard(lockMutex_);
30132a6e48fSopenharmony_ci    if (userData_.find(key) != userData_.end()) {
30232a6e48fSopenharmony_ci        return userData_[key];
30332a6e48fSopenharmony_ci    }
30432a6e48fSopenharmony_ci
30532a6e48fSopenharmony_ci    return "";
30632a6e48fSopenharmony_ci}
30732a6e48fSopenharmony_ci
30832a6e48fSopenharmony_ciGSError ConsumerSurface::RegisterConsumerListener(sptr<IBufferConsumerListener>& listener)
30932a6e48fSopenharmony_ci{
31032a6e48fSopenharmony_ci    if (listener == nullptr || consumer_ == nullptr) {
31132a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
31232a6e48fSopenharmony_ci    }
31332a6e48fSopenharmony_ci    return consumer_->RegisterConsumerListener(listener);
31432a6e48fSopenharmony_ci}
31532a6e48fSopenharmony_ci
31632a6e48fSopenharmony_ciGSError ConsumerSurface::RegisterConsumerListener(IBufferConsumerListenerClazz *listener)
31732a6e48fSopenharmony_ci{
31832a6e48fSopenharmony_ci    if (listener == nullptr || consumer_ == nullptr) {
31932a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
32032a6e48fSopenharmony_ci    }
32132a6e48fSopenharmony_ci    return consumer_->RegisterConsumerListener(listener);
32232a6e48fSopenharmony_ci}
32332a6e48fSopenharmony_ci
32432a6e48fSopenharmony_ciGSError ConsumerSurface::RegisterReleaseListener(OnReleaseFunc func)
32532a6e48fSopenharmony_ci{
32632a6e48fSopenharmony_ci    if (func == nullptr || consumer_ == nullptr) {
32732a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
32832a6e48fSopenharmony_ci    }
32932a6e48fSopenharmony_ci    return consumer_->RegisterReleaseListener(func);
33032a6e48fSopenharmony_ci}
33132a6e48fSopenharmony_ci
33232a6e48fSopenharmony_ciGSError ConsumerSurface::RegisterDeleteBufferListener(OnDeleteBufferFunc func, bool isForUniRedraw)
33332a6e48fSopenharmony_ci{
33432a6e48fSopenharmony_ci    if (func == nullptr || consumer_ == nullptr) {
33532a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
33632a6e48fSopenharmony_ci    }
33732a6e48fSopenharmony_ci    return consumer_->RegisterDeleteBufferListener(func, isForUniRedraw);
33832a6e48fSopenharmony_ci}
33932a6e48fSopenharmony_ci
34032a6e48fSopenharmony_ciGSError ConsumerSurface::UnregisterConsumerListener()
34132a6e48fSopenharmony_ci{
34232a6e48fSopenharmony_ci    if (consumer_ == nullptr) {
34332a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
34432a6e48fSopenharmony_ci    }
34532a6e48fSopenharmony_ci    return consumer_->UnregisterConsumerListener();
34632a6e48fSopenharmony_ci}
34732a6e48fSopenharmony_ci
34832a6e48fSopenharmony_ciGSError ConsumerSurface::RegisterUserDataChangeListener(const std::string& funcName, OnUserDataChangeFunc func)
34932a6e48fSopenharmony_ci{
35032a6e48fSopenharmony_ci    if (func == nullptr) {
35132a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
35232a6e48fSopenharmony_ci    }
35332a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lockGuard(lockMutex_);
35432a6e48fSopenharmony_ci    if (onUserDataChange_.find(funcName) != onUserDataChange_.end()) {
35532a6e48fSopenharmony_ci        BLOGD("already register func: %{public}s, uniqueId: %{public}" PRIu64 ".",
35632a6e48fSopenharmony_ci            funcName.c_str(), uniqueId_);
35732a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
35832a6e48fSopenharmony_ci    }
35932a6e48fSopenharmony_ci
36032a6e48fSopenharmony_ci    onUserDataChange_[funcName] = func;
36132a6e48fSopenharmony_ci    return GSERROR_OK;
36232a6e48fSopenharmony_ci}
36332a6e48fSopenharmony_ci
36432a6e48fSopenharmony_ciGSError ConsumerSurface::UnRegisterUserDataChangeListener(const std::string& funcName)
36532a6e48fSopenharmony_ci{
36632a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lockGuard(lockMutex_);
36732a6e48fSopenharmony_ci    if (onUserDataChange_.erase(funcName) == 0) {
36832a6e48fSopenharmony_ci        BLOGD("no register funcName: %{public}s, uniqueId: %{public}" PRIu64 ".",
36932a6e48fSopenharmony_ci            funcName.c_str(), uniqueId_);
37032a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
37132a6e48fSopenharmony_ci    }
37232a6e48fSopenharmony_ci
37332a6e48fSopenharmony_ci    return GSERROR_OK;
37432a6e48fSopenharmony_ci}
37532a6e48fSopenharmony_ci
37632a6e48fSopenharmony_ciGSError ConsumerSurface::ClearUserDataChangeListener()
37732a6e48fSopenharmony_ci{
37832a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lockGuard(lockMutex_);
37932a6e48fSopenharmony_ci    onUserDataChange_.clear();
38032a6e48fSopenharmony_ci    return GSERROR_OK;
38132a6e48fSopenharmony_ci}
38232a6e48fSopenharmony_ci
38332a6e48fSopenharmony_ciGSError ConsumerSurface::GoBackground()
38432a6e48fSopenharmony_ci{
38532a6e48fSopenharmony_ci    if (consumer_ == nullptr) {
38632a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
38732a6e48fSopenharmony_ci    }
38832a6e48fSopenharmony_ci    if (producer_ != nullptr) {
38932a6e48fSopenharmony_ci        BLOGD("GoBackground, uniqueId: %{public}" PRIu64 ".", uniqueId_);
39032a6e48fSopenharmony_ci    }
39132a6e48fSopenharmony_ci    return consumer_->GoBackground();
39232a6e48fSopenharmony_ci}
39332a6e48fSopenharmony_ci
39432a6e48fSopenharmony_ciuint64_t ConsumerSurface::GetUniqueId() const
39532a6e48fSopenharmony_ci{
39632a6e48fSopenharmony_ci    if (producer_ == nullptr) {
39732a6e48fSopenharmony_ci        return 0;
39832a6e48fSopenharmony_ci    }
39932a6e48fSopenharmony_ci    return producer_->GetUniqueId();
40032a6e48fSopenharmony_ci}
40132a6e48fSopenharmony_ci
40232a6e48fSopenharmony_civoid ConsumerSurface::Dump(std::string& result) const
40332a6e48fSopenharmony_ci{
40432a6e48fSopenharmony_ci    if (consumer_ == nullptr) {
40532a6e48fSopenharmony_ci        return;
40632a6e48fSopenharmony_ci    }
40732a6e48fSopenharmony_ci    return consumer_->Dump(result);
40832a6e48fSopenharmony_ci}
40932a6e48fSopenharmony_ci
41032a6e48fSopenharmony_ciGSError ConsumerSurface::SetTransform(GraphicTransformType transform)
41132a6e48fSopenharmony_ci{
41232a6e48fSopenharmony_ci    if (producer_ == nullptr) {
41332a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
41432a6e48fSopenharmony_ci    }
41532a6e48fSopenharmony_ci    return producer_->SetTransform(transform);
41632a6e48fSopenharmony_ci}
41732a6e48fSopenharmony_ci
41832a6e48fSopenharmony_ciGraphicTransformType ConsumerSurface::GetTransform() const
41932a6e48fSopenharmony_ci{
42032a6e48fSopenharmony_ci    if (consumer_ == nullptr) {
42132a6e48fSopenharmony_ci        return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
42232a6e48fSopenharmony_ci    }
42332a6e48fSopenharmony_ci    return consumer_->GetTransform();
42432a6e48fSopenharmony_ci}
42532a6e48fSopenharmony_ci
42632a6e48fSopenharmony_ciGSError ConsumerSurface::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
42732a6e48fSopenharmony_ci{
42832a6e48fSopenharmony_ci    if (producer_ == nullptr || scalingMode < ScalingMode::SCALING_MODE_FREEZE ||
42932a6e48fSopenharmony_ci        scalingMode > ScalingMode::SCALING_MODE_SCALE_FIT) {
43032a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
43132a6e48fSopenharmony_ci    }
43232a6e48fSopenharmony_ci    return producer_->SetScalingMode(sequence, scalingMode);
43332a6e48fSopenharmony_ci}
43432a6e48fSopenharmony_ci
43532a6e48fSopenharmony_ciGSError ConsumerSurface::SetScalingMode(ScalingMode scalingMode)
43632a6e48fSopenharmony_ci{
43732a6e48fSopenharmony_ci    if (producer_ == nullptr || scalingMode < ScalingMode::SCALING_MODE_FREEZE ||
43832a6e48fSopenharmony_ci        scalingMode > ScalingMode::SCALING_MODE_SCALE_FIT) {
43932a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
44032a6e48fSopenharmony_ci    }
44132a6e48fSopenharmony_ci    return producer_->SetScalingMode(scalingMode);
44232a6e48fSopenharmony_ci}
44332a6e48fSopenharmony_ci
44432a6e48fSopenharmony_ciGSError ConsumerSurface::GetScalingMode(uint32_t sequence, ScalingMode& scalingMode)
44532a6e48fSopenharmony_ci{
44632a6e48fSopenharmony_ci    if (consumer_ == nullptr) {
44732a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
44832a6e48fSopenharmony_ci    }
44932a6e48fSopenharmony_ci    return consumer_->GetScalingMode(sequence, scalingMode);
45032a6e48fSopenharmony_ci}
45132a6e48fSopenharmony_ci
45232a6e48fSopenharmony_ciGSError ConsumerSurface::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData>& metaData)
45332a6e48fSopenharmony_ci{
45432a6e48fSopenharmony_ci    if (producer_ == nullptr || metaData.size() == 0) {
45532a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
45632a6e48fSopenharmony_ci    }
45732a6e48fSopenharmony_ci    return producer_->SetMetaData(sequence, metaData);
45832a6e48fSopenharmony_ci}
45932a6e48fSopenharmony_ci
46032a6e48fSopenharmony_ciGSError ConsumerSurface::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
46132a6e48fSopenharmony_ci                                        const std::vector<uint8_t>& metaData)
46232a6e48fSopenharmony_ci{
46332a6e48fSopenharmony_ci    if (producer_ == nullptr || key < GraphicHDRMetadataKey::GRAPHIC_MATAKEY_RED_PRIMARY_X ||
46432a6e48fSopenharmony_ci        key > GraphicHDRMetadataKey::GRAPHIC_MATAKEY_HDR_VIVID || metaData.size() == 0) {
46532a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
46632a6e48fSopenharmony_ci    }
46732a6e48fSopenharmony_ci    return producer_->SetMetaDataSet(sequence, key, metaData);
46832a6e48fSopenharmony_ci}
46932a6e48fSopenharmony_ci
47032a6e48fSopenharmony_ciGSError ConsumerSurface::QueryMetaDataType(uint32_t sequence, HDRMetaDataType& type) const
47132a6e48fSopenharmony_ci{
47232a6e48fSopenharmony_ci    if (consumer_ == nullptr) {
47332a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
47432a6e48fSopenharmony_ci    }
47532a6e48fSopenharmony_ci    return consumer_->QueryMetaDataType(sequence, type);
47632a6e48fSopenharmony_ci}
47732a6e48fSopenharmony_ci
47832a6e48fSopenharmony_ciGSError ConsumerSurface::GetMetaData(uint32_t sequence, std::vector<GraphicHDRMetaData>& metaData) const
47932a6e48fSopenharmony_ci{
48032a6e48fSopenharmony_ci    if (consumer_ == nullptr) {
48132a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
48232a6e48fSopenharmony_ci    }
48332a6e48fSopenharmony_ci    return consumer_->GetMetaData(sequence, metaData);
48432a6e48fSopenharmony_ci}
48532a6e48fSopenharmony_ci
48632a6e48fSopenharmony_ciGSError ConsumerSurface::GetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey& key,
48732a6e48fSopenharmony_ci                                        std::vector<uint8_t>& metaData) const
48832a6e48fSopenharmony_ci{
48932a6e48fSopenharmony_ci    if (consumer_ == nullptr) {
49032a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
49132a6e48fSopenharmony_ci    }
49232a6e48fSopenharmony_ci    return consumer_->GetMetaDataSet(sequence, key, metaData);
49332a6e48fSopenharmony_ci}
49432a6e48fSopenharmony_ci
49532a6e48fSopenharmony_ciGSError ConsumerSurface::SetTunnelHandle(const GraphicExtDataHandle *handle)
49632a6e48fSopenharmony_ci{
49732a6e48fSopenharmony_ci    if (producer_ == nullptr || handle == nullptr || handle->reserveInts == 0) {
49832a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
49932a6e48fSopenharmony_ci    }
50032a6e48fSopenharmony_ci    return producer_->SetTunnelHandle(handle);
50132a6e48fSopenharmony_ci}
50232a6e48fSopenharmony_ci
50332a6e48fSopenharmony_cisptr<SurfaceTunnelHandle> ConsumerSurface::GetTunnelHandle() const
50432a6e48fSopenharmony_ci{
50532a6e48fSopenharmony_ci    if (consumer_ == nullptr) {
50632a6e48fSopenharmony_ci        return nullptr;
50732a6e48fSopenharmony_ci    }
50832a6e48fSopenharmony_ci    return consumer_->GetTunnelHandle();
50932a6e48fSopenharmony_ci}
51032a6e48fSopenharmony_ci
51132a6e48fSopenharmony_civoid ConsumerSurface::SetBufferHold(bool hold)
51232a6e48fSopenharmony_ci{
51332a6e48fSopenharmony_ci    if (consumer_ == nullptr) {
51432a6e48fSopenharmony_ci        return;
51532a6e48fSopenharmony_ci    }
51632a6e48fSopenharmony_ci    consumer_->SetBufferHold(hold);
51732a6e48fSopenharmony_ci}
51832a6e48fSopenharmony_ci
51932a6e48fSopenharmony_ciGSError ConsumerSurface::SetPresentTimestamp(uint32_t sequence, const GraphicPresentTimestamp& timestamp)
52032a6e48fSopenharmony_ci{
52132a6e48fSopenharmony_ci    if (consumer_ == nullptr || timestamp.type == GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_UNSUPPORTED) {
52232a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
52332a6e48fSopenharmony_ci    }
52432a6e48fSopenharmony_ci    return consumer_->SetPresentTimestamp(sequence, timestamp);
52532a6e48fSopenharmony_ci}
52632a6e48fSopenharmony_ci
52732a6e48fSopenharmony_civoid ConsumerSurface::ConsumerRequestCpuAccess(bool on)
52832a6e48fSopenharmony_ci{
52932a6e48fSopenharmony_ci    if (consumer_ == nullptr) {
53032a6e48fSopenharmony_ci        return;
53132a6e48fSopenharmony_ci    }
53232a6e48fSopenharmony_ci    consumer_->ConsumerRequestCpuAccess(on);
53332a6e48fSopenharmony_ci}
53432a6e48fSopenharmony_ci
53532a6e48fSopenharmony_ciGraphicTransformType ConsumerSurface::GetTransformHint() const
53632a6e48fSopenharmony_ci{
53732a6e48fSopenharmony_ci    if (producer_ == nullptr) {
53832a6e48fSopenharmony_ci        return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
53932a6e48fSopenharmony_ci    }
54032a6e48fSopenharmony_ci    GraphicTransformType transformHint = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
54132a6e48fSopenharmony_ci    if (producer_->GetTransformHint(transformHint) != GSERROR_OK) {
54232a6e48fSopenharmony_ci        BLOGE("GetTransformHint failed, uniqueId: %{public}" PRIu64 ".", uniqueId_);
54332a6e48fSopenharmony_ci        return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
54432a6e48fSopenharmony_ci    }
54532a6e48fSopenharmony_ci    return transformHint;
54632a6e48fSopenharmony_ci}
54732a6e48fSopenharmony_ci
54832a6e48fSopenharmony_ciGSError ConsumerSurface::SetTransformHint(GraphicTransformType transformHint)
54932a6e48fSopenharmony_ci{
55032a6e48fSopenharmony_ci    if (producer_ == nullptr) {
55132a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
55232a6e48fSopenharmony_ci    }
55332a6e48fSopenharmony_ci    return producer_->SetTransformHint(transformHint);
55432a6e48fSopenharmony_ci}
55532a6e48fSopenharmony_ci
55632a6e48fSopenharmony_ciGSError ConsumerSurface::SetSurfaceSourceType(OHSurfaceSource sourceType)
55732a6e48fSopenharmony_ci{
55832a6e48fSopenharmony_ci    if (producer_ == nullptr) {
55932a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
56032a6e48fSopenharmony_ci    }
56132a6e48fSopenharmony_ci    return producer_->SetSurfaceSourceType(sourceType);
56232a6e48fSopenharmony_ci}
56332a6e48fSopenharmony_ci
56432a6e48fSopenharmony_ciOHSurfaceSource ConsumerSurface::GetSurfaceSourceType() const
56532a6e48fSopenharmony_ci{
56632a6e48fSopenharmony_ci    if (producer_ == nullptr) {
56732a6e48fSopenharmony_ci        return OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
56832a6e48fSopenharmony_ci    }
56932a6e48fSopenharmony_ci    OHSurfaceSource sourceType = OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
57032a6e48fSopenharmony_ci    if (producer_->GetSurfaceSourceType(sourceType) != GSERROR_OK) {
57132a6e48fSopenharmony_ci        BLOGE("GetSurfaceSourceType failed, uniqueId: %{public}" PRIu64 ".", uniqueId_);
57232a6e48fSopenharmony_ci        return OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
57332a6e48fSopenharmony_ci    }
57432a6e48fSopenharmony_ci    return sourceType;
57532a6e48fSopenharmony_ci}
57632a6e48fSopenharmony_ci
57732a6e48fSopenharmony_ciGSError ConsumerSurface::SetSurfaceAppFrameworkType(std::string appFrameworkType)
57832a6e48fSopenharmony_ci{
57932a6e48fSopenharmony_ci    if (producer_ == nullptr) {
58032a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
58132a6e48fSopenharmony_ci    }
58232a6e48fSopenharmony_ci    return producer_->SetSurfaceAppFrameworkType(appFrameworkType);
58332a6e48fSopenharmony_ci}
58432a6e48fSopenharmony_ci
58532a6e48fSopenharmony_cistd::string ConsumerSurface::GetSurfaceAppFrameworkType() const
58632a6e48fSopenharmony_ci{
58732a6e48fSopenharmony_ci    if (producer_ == nullptr) {
58832a6e48fSopenharmony_ci        return "";
58932a6e48fSopenharmony_ci    }
59032a6e48fSopenharmony_ci    std::string appFrameworkType = "";
59132a6e48fSopenharmony_ci    if (producer_->GetSurfaceAppFrameworkType(appFrameworkType) != GSERROR_OK) {
59232a6e48fSopenharmony_ci        BLOGE("GetSurfaceAppFrameworkType failed, uniqueId: %{public}" PRIu64 ".", uniqueId_);
59332a6e48fSopenharmony_ci        return "";
59432a6e48fSopenharmony_ci    }
59532a6e48fSopenharmony_ci    return appFrameworkType;
59632a6e48fSopenharmony_ci}
59732a6e48fSopenharmony_ci
59832a6e48fSopenharmony_civoid ConsumerSurface::SetRequestWidthAndHeight(int32_t width, int32_t height)
59932a6e48fSopenharmony_ci{
60032a6e48fSopenharmony_ci    (void)width;
60132a6e48fSopenharmony_ci    (void)height;
60232a6e48fSopenharmony_ci}
60332a6e48fSopenharmony_ci
60432a6e48fSopenharmony_ciint32_t ConsumerSurface::GetRequestWidth()
60532a6e48fSopenharmony_ci{
60632a6e48fSopenharmony_ci    return 0;
60732a6e48fSopenharmony_ci}
60832a6e48fSopenharmony_ci
60932a6e48fSopenharmony_ciint32_t ConsumerSurface::GetRequestHeight()
61032a6e48fSopenharmony_ci{
61132a6e48fSopenharmony_ci    return 0;
61232a6e48fSopenharmony_ci}
61332a6e48fSopenharmony_ci
61432a6e48fSopenharmony_ciGSError ConsumerSurface::SetHdrWhitePointBrightness(float brightness)
61532a6e48fSopenharmony_ci{
61632a6e48fSopenharmony_ci    (void)brightness;
61732a6e48fSopenharmony_ci    return GSERROR_OK;
61832a6e48fSopenharmony_ci}
61932a6e48fSopenharmony_ci
62032a6e48fSopenharmony_ciGSError ConsumerSurface::SetSdrWhitePointBrightness(float brightness)
62132a6e48fSopenharmony_ci{
62232a6e48fSopenharmony_ci    (void)brightness;
62332a6e48fSopenharmony_ci    return GSERROR_OK;
62432a6e48fSopenharmony_ci}
62532a6e48fSopenharmony_ci
62632a6e48fSopenharmony_cifloat ConsumerSurface::GetHdrWhitePointBrightness() const
62732a6e48fSopenharmony_ci{
62832a6e48fSopenharmony_ci    if (consumer_ == nullptr) {
62932a6e48fSopenharmony_ci        return 0;
63032a6e48fSopenharmony_ci    }
63132a6e48fSopenharmony_ci    return consumer_->GetHdrWhitePointBrightness();
63232a6e48fSopenharmony_ci}
63332a6e48fSopenharmony_ci
63432a6e48fSopenharmony_cifloat ConsumerSurface::GetSdrWhitePointBrightness() const
63532a6e48fSopenharmony_ci{
63632a6e48fSopenharmony_ci    if (consumer_ == nullptr) {
63732a6e48fSopenharmony_ci        return 0;
63832a6e48fSopenharmony_ci    }
63932a6e48fSopenharmony_ci    return consumer_->GetSdrWhitePointBrightness();
64032a6e48fSopenharmony_ci}
64132a6e48fSopenharmony_ci
64232a6e48fSopenharmony_ciGSError ConsumerSurface::GetSurfaceBufferTransformType(sptr<SurfaceBuffer> buffer,
64332a6e48fSopenharmony_ci    GraphicTransformType *transformType)
64432a6e48fSopenharmony_ci{
64532a6e48fSopenharmony_ci    if (buffer == nullptr || transformType == nullptr) {
64632a6e48fSopenharmony_ci        return SURFACE_ERROR_INVALID_PARAM;
64732a6e48fSopenharmony_ci    }
64832a6e48fSopenharmony_ci    *transformType = buffer->GetSurfaceBufferTransform();
64932a6e48fSopenharmony_ci    return GSERROR_OK;
65032a6e48fSopenharmony_ci}
65132a6e48fSopenharmony_ci
65232a6e48fSopenharmony_ciGSError ConsumerSurface::IsSurfaceBufferInCache(uint32_t seqNum, bool& isInCache)
65332a6e48fSopenharmony_ci{
65432a6e48fSopenharmony_ci    if (consumer_ == nullptr) {
65532a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
65632a6e48fSopenharmony_ci    }
65732a6e48fSopenharmony_ci    return consumer_->IsSurfaceBufferInCache(seqNum, isInCache);
65832a6e48fSopenharmony_ci}
65932a6e48fSopenharmony_ci
66032a6e48fSopenharmony_ciGSError ConsumerSurface::AcquireLastFlushedBuffer(sptr<SurfaceBuffer> &buffer, sptr<SyncFence> &fence,
66132a6e48fSopenharmony_ci    float matrix[16], uint32_t matrixSize, bool isUseNewMatrix)
66232a6e48fSopenharmony_ci{
66332a6e48fSopenharmony_ci    return GSERROR_NOT_SUPPORT;
66432a6e48fSopenharmony_ci}
66532a6e48fSopenharmony_ci
66632a6e48fSopenharmony_ciGSError ConsumerSurface::ReleaseLastFlushedBuffer(sptr<SurfaceBuffer> buffer)
66732a6e48fSopenharmony_ci{
66832a6e48fSopenharmony_ci    return GSERROR_NOT_SUPPORT;
66932a6e48fSopenharmony_ci}
67032a6e48fSopenharmony_ci
67132a6e48fSopenharmony_ciGSError ConsumerSurface::SetGlobalAlpha(int32_t alpha)
67232a6e48fSopenharmony_ci{
67332a6e48fSopenharmony_ci    (void)alpha;
67432a6e48fSopenharmony_ci    return GSERROR_NOT_SUPPORT;
67532a6e48fSopenharmony_ci}
67632a6e48fSopenharmony_ci
67732a6e48fSopenharmony_ciGSError ConsumerSurface::GetGlobalAlpha(int32_t &alpha)
67832a6e48fSopenharmony_ci{
67932a6e48fSopenharmony_ci    if (consumer_ == nullptr) {
68032a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
68132a6e48fSopenharmony_ci    }
68232a6e48fSopenharmony_ci    return consumer_->GetGlobalAlpha(alpha);
68332a6e48fSopenharmony_ci}
68432a6e48fSopenharmony_ci
68532a6e48fSopenharmony_ciuint32_t ConsumerSurface::GetAvailableBufferCount() const
68632a6e48fSopenharmony_ci{
68732a6e48fSopenharmony_ci    if (consumer_ == nullptr) {
68832a6e48fSopenharmony_ci        return 0;
68932a6e48fSopenharmony_ci    }
69032a6e48fSopenharmony_ci    return consumer_->GetAvailableBufferCount();
69132a6e48fSopenharmony_ci}
69232a6e48fSopenharmony_ci} // namespace OHOS
693