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