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 &timestamp, 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 &timestamp)
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