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 "buffer_queue_consumer.h" 1732a6e48fSopenharmony_ci 1832a6e48fSopenharmony_cinamespace OHOS { 1932a6e48fSopenharmony_ciBufferQueueConsumer::BufferQueueConsumer(sptr<BufferQueue>& bufferQueue) 2032a6e48fSopenharmony_ci{ 2132a6e48fSopenharmony_ci bufferQueue_ = bufferQueue; 2232a6e48fSopenharmony_ci if (bufferQueue_ != nullptr) { 2332a6e48fSopenharmony_ci bufferQueue_->GetName(name_); 2432a6e48fSopenharmony_ci } 2532a6e48fSopenharmony_ci} 2632a6e48fSopenharmony_ci 2732a6e48fSopenharmony_ciBufferQueueConsumer::~BufferQueueConsumer() 2832a6e48fSopenharmony_ci{ 2932a6e48fSopenharmony_ci} 3032a6e48fSopenharmony_ci 3132a6e48fSopenharmony_ciGSError BufferQueueConsumer::AcquireBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence, 3232a6e48fSopenharmony_ci int64_t ×tamp, std::vector<Rect> &damages) 3332a6e48fSopenharmony_ci{ 3432a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 3532a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 3632a6e48fSopenharmony_ci } 3732a6e48fSopenharmony_ci return bufferQueue_->AcquireBuffer(buffer, fence, timestamp, damages); 3832a6e48fSopenharmony_ci} 3932a6e48fSopenharmony_ci 4032a6e48fSopenharmony_ciGSError BufferQueueConsumer::AcquireBuffer(IConsumerSurface::AcquireBufferReturnValue &returnValue, 4132a6e48fSopenharmony_ci int64_t expectPresentTimestamp, bool isUsingAutoTimestamp) 4232a6e48fSopenharmony_ci{ 4332a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 4432a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 4532a6e48fSopenharmony_ci } 4632a6e48fSopenharmony_ci return bufferQueue_->AcquireBuffer(returnValue, expectPresentTimestamp, isUsingAutoTimestamp); 4732a6e48fSopenharmony_ci} 4832a6e48fSopenharmony_ci 4932a6e48fSopenharmony_ciGSError BufferQueueConsumer::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence) 5032a6e48fSopenharmony_ci{ 5132a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 5232a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 5332a6e48fSopenharmony_ci } 5432a6e48fSopenharmony_ci return bufferQueue_->ReleaseBuffer(buffer, fence); 5532a6e48fSopenharmony_ci} 5632a6e48fSopenharmony_ci 5732a6e48fSopenharmony_ciGSError BufferQueueConsumer::AttachBufferToQueue(sptr<SurfaceBuffer> buffer) 5832a6e48fSopenharmony_ci{ 5932a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 6032a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 6132a6e48fSopenharmony_ci } 6232a6e48fSopenharmony_ci return bufferQueue_->AttachBufferToQueue(buffer, InvokerType::CONSUMER_INVOKER); 6332a6e48fSopenharmony_ci} 6432a6e48fSopenharmony_ci 6532a6e48fSopenharmony_ciGSError BufferQueueConsumer::DetachBufferFromQueue(sptr<SurfaceBuffer> buffer) 6632a6e48fSopenharmony_ci{ 6732a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 6832a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 6932a6e48fSopenharmony_ci } 7032a6e48fSopenharmony_ci return bufferQueue_->DetachBufferFromQueue(buffer, InvokerType::CONSUMER_INVOKER); 7132a6e48fSopenharmony_ci} 7232a6e48fSopenharmony_ci 7332a6e48fSopenharmony_ciGSError BufferQueueConsumer::AttachBuffer(sptr<SurfaceBuffer>& buffer) 7432a6e48fSopenharmony_ci{ 7532a6e48fSopenharmony_ci return AttachBuffer(buffer, 0); 7632a6e48fSopenharmony_ci} 7732a6e48fSopenharmony_ci 7832a6e48fSopenharmony_ciGSError BufferQueueConsumer::AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut) 7932a6e48fSopenharmony_ci{ 8032a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 8132a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 8232a6e48fSopenharmony_ci } 8332a6e48fSopenharmony_ci return bufferQueue_->AttachBuffer(buffer, timeOut); 8432a6e48fSopenharmony_ci} 8532a6e48fSopenharmony_ci 8632a6e48fSopenharmony_ciGSError BufferQueueConsumer::DetachBuffer(sptr<SurfaceBuffer>& buffer) 8732a6e48fSopenharmony_ci{ 8832a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 8932a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 9032a6e48fSopenharmony_ci } 9132a6e48fSopenharmony_ci return bufferQueue_->DetachBuffer(buffer); 9232a6e48fSopenharmony_ci} 9332a6e48fSopenharmony_ci 9432a6e48fSopenharmony_ciGSError BufferQueueConsumer::RegisterSurfaceDelegator(sptr<IRemoteObject> client, sptr<Surface> cSurface) 9532a6e48fSopenharmony_ci{ 9632a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 9732a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 9832a6e48fSopenharmony_ci } 9932a6e48fSopenharmony_ci return bufferQueue_->RegisterSurfaceDelegator(client, cSurface); 10032a6e48fSopenharmony_ci} 10132a6e48fSopenharmony_ci 10232a6e48fSopenharmony_cibool BufferQueueConsumer::QueryIfBufferAvailable() 10332a6e48fSopenharmony_ci{ 10432a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 10532a6e48fSopenharmony_ci return false; 10632a6e48fSopenharmony_ci } 10732a6e48fSopenharmony_ci return bufferQueue_->QueryIfBufferAvailable(); 10832a6e48fSopenharmony_ci} 10932a6e48fSopenharmony_ci 11032a6e48fSopenharmony_ciGSError BufferQueueConsumer::RegisterConsumerListener(sptr<IBufferConsumerListener>& listener) 11132a6e48fSopenharmony_ci{ 11232a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 11332a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 11432a6e48fSopenharmony_ci } 11532a6e48fSopenharmony_ci return bufferQueue_->RegisterConsumerListener(listener); 11632a6e48fSopenharmony_ci} 11732a6e48fSopenharmony_ci 11832a6e48fSopenharmony_ciGSError BufferQueueConsumer::RegisterConsumerListener(IBufferConsumerListenerClazz *listener) 11932a6e48fSopenharmony_ci{ 12032a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 12132a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 12232a6e48fSopenharmony_ci } 12332a6e48fSopenharmony_ci return bufferQueue_->RegisterConsumerListener(listener); 12432a6e48fSopenharmony_ci} 12532a6e48fSopenharmony_ci 12632a6e48fSopenharmony_ciGSError BufferQueueConsumer::RegisterReleaseListener(OnReleaseFunc func) 12732a6e48fSopenharmony_ci{ 12832a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 12932a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 13032a6e48fSopenharmony_ci } 13132a6e48fSopenharmony_ci return bufferQueue_->RegisterReleaseListener(func); 13232a6e48fSopenharmony_ci} 13332a6e48fSopenharmony_ci 13432a6e48fSopenharmony_ciGSError BufferQueueConsumer::RegisterDeleteBufferListener(OnDeleteBufferFunc func, bool isForUniRedraw) 13532a6e48fSopenharmony_ci{ 13632a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 13732a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 13832a6e48fSopenharmony_ci } 13932a6e48fSopenharmony_ci return bufferQueue_->RegisterDeleteBufferListener(func, isForUniRedraw); 14032a6e48fSopenharmony_ci} 14132a6e48fSopenharmony_ci 14232a6e48fSopenharmony_ciGSError BufferQueueConsumer::UnregisterConsumerListener() 14332a6e48fSopenharmony_ci{ 14432a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 14532a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 14632a6e48fSopenharmony_ci } 14732a6e48fSopenharmony_ci return bufferQueue_->UnregisterConsumerListener(); 14832a6e48fSopenharmony_ci} 14932a6e48fSopenharmony_ci 15032a6e48fSopenharmony_ciGSError BufferQueueConsumer::SetDefaultWidthAndHeight(int32_t width, int32_t height) 15132a6e48fSopenharmony_ci{ 15232a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 15332a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 15432a6e48fSopenharmony_ci } 15532a6e48fSopenharmony_ci return bufferQueue_->SetDefaultWidthAndHeight(width, height); 15632a6e48fSopenharmony_ci} 15732a6e48fSopenharmony_ci 15832a6e48fSopenharmony_ciGSError BufferQueueConsumer::SetDefaultUsage(uint64_t usage) 15932a6e48fSopenharmony_ci{ 16032a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 16132a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 16232a6e48fSopenharmony_ci } 16332a6e48fSopenharmony_ci return bufferQueue_->SetDefaultUsage(usage); 16432a6e48fSopenharmony_ci} 16532a6e48fSopenharmony_ci 16632a6e48fSopenharmony_civoid BufferQueueConsumer::Dump(std::string &result) const 16732a6e48fSopenharmony_ci{ 16832a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 16932a6e48fSopenharmony_ci return; 17032a6e48fSopenharmony_ci } 17132a6e48fSopenharmony_ci return bufferQueue_->Dump(result); 17232a6e48fSopenharmony_ci} 17332a6e48fSopenharmony_ci 17432a6e48fSopenharmony_ciGraphicTransformType BufferQueueConsumer::GetTransform() const 17532a6e48fSopenharmony_ci{ 17632a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 17732a6e48fSopenharmony_ci return GraphicTransformType::GRAPHIC_ROTATE_BUTT; 17832a6e48fSopenharmony_ci } 17932a6e48fSopenharmony_ci return bufferQueue_->GetTransform(); 18032a6e48fSopenharmony_ci} 18132a6e48fSopenharmony_ci 18232a6e48fSopenharmony_ciGSError BufferQueueConsumer::GetScalingMode(uint32_t sequence, ScalingMode &scalingMode) const 18332a6e48fSopenharmony_ci{ 18432a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 18532a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 18632a6e48fSopenharmony_ci } 18732a6e48fSopenharmony_ci return bufferQueue_->GetScalingMode(sequence, scalingMode); 18832a6e48fSopenharmony_ci} 18932a6e48fSopenharmony_ci 19032a6e48fSopenharmony_ciGSError BufferQueueConsumer::QueryMetaDataType(uint32_t sequence, HDRMetaDataType &type) const 19132a6e48fSopenharmony_ci{ 19232a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 19332a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 19432a6e48fSopenharmony_ci } 19532a6e48fSopenharmony_ci return bufferQueue_->QueryMetaDataType(sequence, type); 19632a6e48fSopenharmony_ci} 19732a6e48fSopenharmony_ci 19832a6e48fSopenharmony_ciGSError BufferQueueConsumer::GetMetaData(uint32_t sequence, std::vector<GraphicHDRMetaData> &metaData) const 19932a6e48fSopenharmony_ci{ 20032a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 20132a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 20232a6e48fSopenharmony_ci } 20332a6e48fSopenharmony_ci return bufferQueue_->GetMetaData(sequence, metaData); 20432a6e48fSopenharmony_ci} 20532a6e48fSopenharmony_ci 20632a6e48fSopenharmony_ciGSError BufferQueueConsumer::GetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey &key, 20732a6e48fSopenharmony_ci std::vector<uint8_t> &metaData) const 20832a6e48fSopenharmony_ci{ 20932a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 21032a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 21132a6e48fSopenharmony_ci } 21232a6e48fSopenharmony_ci return bufferQueue_->GetMetaDataSet(sequence, key, metaData); 21332a6e48fSopenharmony_ci} 21432a6e48fSopenharmony_ci 21532a6e48fSopenharmony_cisptr<SurfaceTunnelHandle> BufferQueueConsumer::GetTunnelHandle() const 21632a6e48fSopenharmony_ci{ 21732a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 21832a6e48fSopenharmony_ci return nullptr; 21932a6e48fSopenharmony_ci } 22032a6e48fSopenharmony_ci return bufferQueue_->GetTunnelHandle(); 22132a6e48fSopenharmony_ci} 22232a6e48fSopenharmony_ci 22332a6e48fSopenharmony_ciGSError BufferQueueConsumer::SetPresentTimestamp(uint32_t sequence, const GraphicPresentTimestamp ×tamp) 22432a6e48fSopenharmony_ci{ 22532a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 22632a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 22732a6e48fSopenharmony_ci } 22832a6e48fSopenharmony_ci return bufferQueue_->SetPresentTimestamp(sequence, timestamp); 22932a6e48fSopenharmony_ci} 23032a6e48fSopenharmony_ci 23132a6e48fSopenharmony_cibool BufferQueueConsumer::GetStatus() const 23232a6e48fSopenharmony_ci{ 23332a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 23432a6e48fSopenharmony_ci return false; 23532a6e48fSopenharmony_ci } 23632a6e48fSopenharmony_ci return bufferQueue_->GetStatus(); 23732a6e48fSopenharmony_ci} 23832a6e48fSopenharmony_ci 23932a6e48fSopenharmony_civoid BufferQueueConsumer::SetStatus(bool status) 24032a6e48fSopenharmony_ci{ 24132a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 24232a6e48fSopenharmony_ci return; 24332a6e48fSopenharmony_ci } 24432a6e48fSopenharmony_ci bufferQueue_->SetStatus(status); 24532a6e48fSopenharmony_ci} 24632a6e48fSopenharmony_ci 24732a6e48fSopenharmony_civoid BufferQueueConsumer::SetBufferHold(bool hold) 24832a6e48fSopenharmony_ci{ 24932a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 25032a6e48fSopenharmony_ci return; 25132a6e48fSopenharmony_ci } 25232a6e48fSopenharmony_ci bufferQueue_->SetBufferHold(hold); 25332a6e48fSopenharmony_ci} 25432a6e48fSopenharmony_ci 25532a6e48fSopenharmony_ciGSError BufferQueueConsumer::OnConsumerDied() 25632a6e48fSopenharmony_ci{ 25732a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 25832a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 25932a6e48fSopenharmony_ci } 26032a6e48fSopenharmony_ci return bufferQueue_->OnConsumerDied(); 26132a6e48fSopenharmony_ci} 26232a6e48fSopenharmony_ci 26332a6e48fSopenharmony_ciGSError BufferQueueConsumer::GoBackground() 26432a6e48fSopenharmony_ci{ 26532a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 26632a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 26732a6e48fSopenharmony_ci } 26832a6e48fSopenharmony_ci return bufferQueue_->GoBackground(); 26932a6e48fSopenharmony_ci} 27032a6e48fSopenharmony_ci 27132a6e48fSopenharmony_cifloat BufferQueueConsumer::GetHdrWhitePointBrightness() const 27232a6e48fSopenharmony_ci{ 27332a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 27432a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 27532a6e48fSopenharmony_ci } 27632a6e48fSopenharmony_ci return bufferQueue_->GetHdrWhitePointBrightness(); 27732a6e48fSopenharmony_ci} 27832a6e48fSopenharmony_ci 27932a6e48fSopenharmony_cifloat BufferQueueConsumer::GetSdrWhitePointBrightness() const 28032a6e48fSopenharmony_ci{ 28132a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 28232a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 28332a6e48fSopenharmony_ci } 28432a6e48fSopenharmony_ci return bufferQueue_->GetSdrWhitePointBrightness(); 28532a6e48fSopenharmony_ci} 28632a6e48fSopenharmony_ci 28732a6e48fSopenharmony_ciGSError BufferQueueConsumer::IsSurfaceBufferInCache(uint32_t seqNum, bool &isInCache) 28832a6e48fSopenharmony_ci{ 28932a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 29032a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 29132a6e48fSopenharmony_ci } 29232a6e48fSopenharmony_ci return bufferQueue_->IsSurfaceBufferInCache(seqNum, isInCache); 29332a6e48fSopenharmony_ci} 29432a6e48fSopenharmony_ci 29532a6e48fSopenharmony_ciGSError BufferQueueConsumer::GetGlobalAlpha(int32_t &alpha) 29632a6e48fSopenharmony_ci{ 29732a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 29832a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 29932a6e48fSopenharmony_ci } 30032a6e48fSopenharmony_ci return bufferQueue_->GetGlobalAlpha(alpha); 30132a6e48fSopenharmony_ci} 30232a6e48fSopenharmony_ciuint32_t BufferQueueConsumer::GetAvailableBufferCount() const 30332a6e48fSopenharmony_ci{ 30432a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 30532a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 30632a6e48fSopenharmony_ci } 30732a6e48fSopenharmony_ci return bufferQueue_->GetAvailableBufferCount(); 30832a6e48fSopenharmony_ci} 30932a6e48fSopenharmony_ci} // namespace OHOS 310