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_producer.h"
1732a6e48fSopenharmony_ci
1832a6e48fSopenharmony_ci#include <cinttypes>
1932a6e48fSopenharmony_ci#include <mutex>
2032a6e48fSopenharmony_ci#include <set>
2132a6e48fSopenharmony_ci
2232a6e48fSopenharmony_ci#include "buffer_extra_data_impl.h"
2332a6e48fSopenharmony_ci#include "buffer_log.h"
2432a6e48fSopenharmony_ci#include "buffer_producer_listener.h"
2532a6e48fSopenharmony_ci#include "buffer_utils.h"
2632a6e48fSopenharmony_ci#include "frame_report.h"
2732a6e48fSopenharmony_ci#include "sync_fence.h"
2832a6e48fSopenharmony_ci
2932a6e48fSopenharmony_ci#define BUFFER_PRODUCER_API_FUNC_PAIR(apiSequenceNum, func) \
3032a6e48fSopenharmony_ci    {apiSequenceNum, [](BufferQueueProducer *that, MessageParcel &arguments, MessageParcel &reply, \
3132a6e48fSopenharmony_ci        MessageOption &option){return that->func(arguments, reply, option);}} \
3232a6e48fSopenharmony_ci
3332a6e48fSopenharmony_cinamespace OHOS {
3432a6e48fSopenharmony_cinamespace {
3532a6e48fSopenharmony_ciconstexpr int32_t BUFFER_MATRIX_SIZE = 16;
3632a6e48fSopenharmony_ci} // namespace
3732a6e48fSopenharmony_ci
3832a6e48fSopenharmony_ciBufferQueueProducer::BufferQueueProducer(sptr<BufferQueue> bufferQueue)
3932a6e48fSopenharmony_ci    : producerSurfaceDeathRecipient_(new ProducerSurfaceDeathRecipient(this))
4032a6e48fSopenharmony_ci{
4132a6e48fSopenharmony_ci    bufferQueue_ = std::move(bufferQueue);
4232a6e48fSopenharmony_ci    if (bufferQueue_ != nullptr) {
4332a6e48fSopenharmony_ci        bufferQueue_->GetName(name_);
4432a6e48fSopenharmony_ci        uniqueId_ = bufferQueue_->GetUniqueId();
4532a6e48fSopenharmony_ci    }
4632a6e48fSopenharmony_ci    memberFuncMap_ = {
4732a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_INIT_INFO, GetProducerInitInfoRemote),
4832a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_REQUEST_BUFFER, RequestBufferRemote),
4932a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_REQUEST_BUFFERS, RequestBuffersRemote),
5032a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_CANCEL_BUFFER, CancelBufferRemote),
5132a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_FLUSH_BUFFER, FlushBufferRemote),
5232a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_FLUSH_BUFFERS, FlushBuffersRemote),
5332a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_ATTACH_BUFFER, AttachBufferRemote),
5432a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_DETACH_BUFFER, DetachBufferRemote),
5532a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_QUEUE_SIZE, GetQueueSizeRemote),
5632a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_QUEUE_SIZE, SetQueueSizeRemote),
5732a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_NAME, GetNameRemote),
5832a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_DEFAULT_WIDTH, GetDefaultWidthRemote),
5932a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_DEFAULT_HEIGHT, GetDefaultHeightRemote),
6032a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_DEFAULT_USAGE, GetDefaultUsageRemote),
6132a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_UNIQUE_ID, GetUniqueIdRemote),
6232a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_CLEAN_CACHE, CleanCacheRemote),
6332a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_REGISTER_RELEASE_LISTENER, RegisterReleaseListenerRemote),
6432a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_TRANSFORM, SetTransformRemote),
6532a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_IS_SUPPORTED_ALLOC, IsSupportedAllocRemote),
6632a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_NAMEANDUNIQUEDID, GetNameAndUniqueIdRemote),
6732a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_DISCONNECT, DisconnectRemote),
6832a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_CONNECT, ConnectRemote),
6932a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_SCALING_MODE, SetScalingModeRemote),
7032a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_METADATA, SetMetaDataRemote),
7132a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_METADATASET, SetMetaDataSetRemote),
7232a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_TUNNEL_HANDLE, SetTunnelHandleRemote),
7332a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GO_BACKGROUND, GoBackgroundRemote),
7432a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_PRESENT_TIMESTAMP, GetPresentTimestampRemote),
7532a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_UNREGISTER_RELEASE_LISTENER, UnRegisterReleaseListenerRemote),
7632a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_LAST_FLUSHED_BUFFER, GetLastFlushedBufferRemote),
7732a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_TRANSFORM, GetTransformRemote),
7832a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_ATTACH_BUFFER_TO_QUEUE, AttachBufferToQueueRemote),
7932a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_DETACH_BUFFER_FROM_QUEUE, DetachBufferFromQueueRemote),
8032a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_DEFAULT_USAGE, SetDefaultUsageRemote),
8132a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_TRANSFORMHINT, GetTransformHintRemote),
8232a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_TRANSFORMHINT, SetTransformHintRemote),
8332a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_BUFFER_HOLD, SetBufferHoldRemote),
8432a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_SCALING_MODEV2, SetScalingModeV2Remote),
8532a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_SOURCE_TYPE, SetSurfaceSourceTypeRemote),
8632a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_SOURCE_TYPE, GetSurfaceSourceTypeRemote),
8732a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_APP_FRAMEWORK_TYPE, SetSurfaceAppFrameworkTypeRemote),
8832a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_APP_FRAMEWORK_TYPE, GetSurfaceAppFrameworkTypeRemote),
8932a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(
9032a6e48fSopenharmony_ci            BUFFER_PRODUCER_SET_HDRWHITEPOINTBRIGHTNESS, SetHdrWhitePointBrightnessRemote),
9132a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(
9232a6e48fSopenharmony_ci            BUFFER_PRODUCER_SET_SDRWHITEPOINTBRIGHTNESS, SetSdrWhitePointBrightnessRemote),
9332a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_ACQUIRE_LAST_FLUSHED_BUFFER, AcquireLastFlushedBufferRemote),
9432a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_RELEASE_LAST_FLUSHED_BUFFER, ReleaseLastFlushedBufferRemote),
9532a6e48fSopenharmony_ci        BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_GLOBALALPHA, SetGlobalAlphaRemote),
9632a6e48fSopenharmony_ci    };
9732a6e48fSopenharmony_ci}
9832a6e48fSopenharmony_ci
9932a6e48fSopenharmony_ciBufferQueueProducer::~BufferQueueProducer()
10032a6e48fSopenharmony_ci{
10132a6e48fSopenharmony_ci    if (token_ && producerSurfaceDeathRecipient_) {
10232a6e48fSopenharmony_ci        token_->RemoveDeathRecipient(producerSurfaceDeathRecipient_);
10332a6e48fSopenharmony_ci        token_ = nullptr;
10432a6e48fSopenharmony_ci    }
10532a6e48fSopenharmony_ci}
10632a6e48fSopenharmony_ci
10732a6e48fSopenharmony_ciGSError BufferQueueProducer::CheckConnectLocked()
10832a6e48fSopenharmony_ci{
10932a6e48fSopenharmony_ci    if (connectedPid_ == 0) {
11032a6e48fSopenharmony_ci        BLOGW("no connections, uniqueId: %{public}" PRIu64 ".", uniqueId_);
11132a6e48fSopenharmony_ci        return SURFACE_ERROR_CONSUMER_DISCONNECTED;
11232a6e48fSopenharmony_ci    }
11332a6e48fSopenharmony_ci
11432a6e48fSopenharmony_ci    if (connectedPid_ != GetCallingPid()) {
11532a6e48fSopenharmony_ci        BLOGW("connected by: %{public}d, uniqueId: %{public}" PRIu64 ".", connectedPid_, uniqueId_);
11632a6e48fSopenharmony_ci        return SURFACE_ERROR_CONSUMER_IS_CONNECTED;
11732a6e48fSopenharmony_ci    }
11832a6e48fSopenharmony_ci
11932a6e48fSopenharmony_ci    return GSERROR_OK;
12032a6e48fSopenharmony_ci}
12132a6e48fSopenharmony_ci
12232a6e48fSopenharmony_ciint32_t BufferQueueProducer::OnRemoteRequest(uint32_t code, MessageParcel &arguments,
12332a6e48fSopenharmony_ci                                             MessageParcel &reply, MessageOption &option)
12432a6e48fSopenharmony_ci{
12532a6e48fSopenharmony_ci    auto it = memberFuncMap_.find(code);
12632a6e48fSopenharmony_ci    if (it == memberFuncMap_.end()) {
12732a6e48fSopenharmony_ci        BLOGE("cannot process %{public}u", code);
12832a6e48fSopenharmony_ci        return IPCObjectStub::OnRemoteRequest(code, arguments, reply, option);
12932a6e48fSopenharmony_ci    }
13032a6e48fSopenharmony_ci
13132a6e48fSopenharmony_ci    if (it->second == nullptr) {
13232a6e48fSopenharmony_ci        BLOGE("memberFuncMap_[%{public}u] is nullptr", code);
13332a6e48fSopenharmony_ci        return ERR_NONE;
13432a6e48fSopenharmony_ci    }
13532a6e48fSopenharmony_ci
13632a6e48fSopenharmony_ci    auto remoteDescriptor = arguments.ReadInterfaceToken();
13732a6e48fSopenharmony_ci    if (GetDescriptor() != remoteDescriptor) {
13832a6e48fSopenharmony_ci        return ERR_INVALID_STATE;
13932a6e48fSopenharmony_ci    }
14032a6e48fSopenharmony_ci
14132a6e48fSopenharmony_ci    auto ret = it->second(this, arguments, reply, option);
14232a6e48fSopenharmony_ci    return ret;
14332a6e48fSopenharmony_ci}
14432a6e48fSopenharmony_ci
14532a6e48fSopenharmony_ciint32_t BufferQueueProducer::RequestBufferRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
14632a6e48fSopenharmony_ci{
14732a6e48fSopenharmony_ci    RequestBufferReturnValue retval;
14832a6e48fSopenharmony_ci    sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
14932a6e48fSopenharmony_ci    BufferRequestConfig config = {};
15032a6e48fSopenharmony_ci    int64_t startTimeNs = 0;
15132a6e48fSopenharmony_ci    int64_t endTimeNs = 0;
15232a6e48fSopenharmony_ci    bool isActiveGame = false;
15332a6e48fSopenharmony_ci    int32_t connectedPid = 0;
15432a6e48fSopenharmony_ci    {
15532a6e48fSopenharmony_ci        std::lock_guard<std::mutex> lock(mutex_);
15632a6e48fSopenharmony_ci        connectedPid = connectedPid_;
15732a6e48fSopenharmony_ci    }
15832a6e48fSopenharmony_ci    isActiveGame = Rosen::FrameReport::GetInstance().IsActiveGameWithPid(connectedPid);
15932a6e48fSopenharmony_ci    if (isActiveGame) {
16032a6e48fSopenharmony_ci        startTimeNs = std::chrono::duration_cast<std::chrono::nanoseconds>(
16132a6e48fSopenharmony_ci            std::chrono::steady_clock::now().time_since_epoch()).count();
16232a6e48fSopenharmony_ci    }
16332a6e48fSopenharmony_ci
16432a6e48fSopenharmony_ci    ReadRequestConfig(arguments, config);
16532a6e48fSopenharmony_ci
16632a6e48fSopenharmony_ci    GSError sRet = RequestBuffer(config, bedataimpl, retval);
16732a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
16832a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
16932a6e48fSopenharmony_ci    }
17032a6e48fSopenharmony_ci    if (sRet == GSERROR_OK &&
17132a6e48fSopenharmony_ci        (WriteSurfaceBufferImpl(reply, retval.sequence, retval.buffer) != GSERROR_OK ||
17232a6e48fSopenharmony_ci            bedataimpl->WriteToParcel(reply) != GSERROR_OK || !retval.fence->WriteToMessageParcel(reply) ||
17332a6e48fSopenharmony_ci            !reply.WriteUInt32Vector(retval.deletingBuffers))) {
17432a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
17532a6e48fSopenharmony_ci    } else if (sRet != GSERROR_OK && !reply.WriteBool(retval.isConnected)) {
17632a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
17732a6e48fSopenharmony_ci    }
17832a6e48fSopenharmony_ci
17932a6e48fSopenharmony_ci    if (isActiveGame) {
18032a6e48fSopenharmony_ci        endTimeNs = std::chrono::duration_cast<std::chrono::nanoseconds>(
18132a6e48fSopenharmony_ci            std::chrono::steady_clock::now().time_since_epoch()).count();
18232a6e48fSopenharmony_ci        Rosen::FrameReport::GetInstance().SetDequeueBufferTime(name_, (endTimeNs - startTimeNs));
18332a6e48fSopenharmony_ci    }
18432a6e48fSopenharmony_ci
18532a6e48fSopenharmony_ci    return ERR_NONE;
18632a6e48fSopenharmony_ci}
18732a6e48fSopenharmony_ci
18832a6e48fSopenharmony_ciint32_t BufferQueueProducer::RequestBuffersRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
18932a6e48fSopenharmony_ci{
19032a6e48fSopenharmony_ci    std::vector<RequestBufferReturnValue> retvalues;
19132a6e48fSopenharmony_ci    std::vector<sptr<BufferExtraData>> bedataimpls;
19232a6e48fSopenharmony_ci    BufferRequestConfig config = {};
19332a6e48fSopenharmony_ci    uint32_t num = 0;
19432a6e48fSopenharmony_ci
19532a6e48fSopenharmony_ci    arguments.ReadUint32(num);
19632a6e48fSopenharmony_ci    ReadRequestConfig(arguments, config);
19732a6e48fSopenharmony_ci    if (num == 0 || num > SURFACE_MAX_QUEUE_SIZE) {
19832a6e48fSopenharmony_ci        return ERR_NONE;
19932a6e48fSopenharmony_ci    }
20032a6e48fSopenharmony_ci    retvalues.resize(num);
20132a6e48fSopenharmony_ci    bedataimpls.reserve(num);
20232a6e48fSopenharmony_ci
20332a6e48fSopenharmony_ci    for (uint32_t i = 0; i < num; ++i) {
20432a6e48fSopenharmony_ci        sptr<BufferExtraData> data = new BufferExtraDataImpl;
20532a6e48fSopenharmony_ci        bedataimpls.emplace_back(data);
20632a6e48fSopenharmony_ci    }
20732a6e48fSopenharmony_ci    GSError sRet = RequestBuffers(config, bedataimpls, retvalues);
20832a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
20932a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
21032a6e48fSopenharmony_ci    }
21132a6e48fSopenharmony_ci    if (sRet == GSERROR_OK || sRet == GSERROR_NO_BUFFER) {
21232a6e48fSopenharmony_ci        num = static_cast<uint32_t>(retvalues.size());
21332a6e48fSopenharmony_ci        if (!reply.WriteUint32(num)) {
21432a6e48fSopenharmony_ci            return IPC_STUB_WRITE_PARCEL_ERR;
21532a6e48fSopenharmony_ci        }
21632a6e48fSopenharmony_ci        for (uint32_t i = 0; i < num; ++i) {
21732a6e48fSopenharmony_ci            if (WriteSurfaceBufferImpl(reply, retvalues[i].sequence, retvalues[i].buffer) != GSERROR_OK ||
21832a6e48fSopenharmony_ci                bedataimpls[i]->WriteToParcel(reply) != GSERROR_OK ||
21932a6e48fSopenharmony_ci                !retvalues[i].fence->WriteToMessageParcel(reply) ||
22032a6e48fSopenharmony_ci                !reply.WriteUInt32Vector(retvalues[i].deletingBuffers)) {
22132a6e48fSopenharmony_ci                return IPC_STUB_WRITE_PARCEL_ERR;
22232a6e48fSopenharmony_ci            }
22332a6e48fSopenharmony_ci        }
22432a6e48fSopenharmony_ci    } else if (sRet != GSERROR_OK && !reply.WriteBool(retvalues[0].isConnected)) {
22532a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
22632a6e48fSopenharmony_ci    }
22732a6e48fSopenharmony_ci    return ERR_NONE;
22832a6e48fSopenharmony_ci}
22932a6e48fSopenharmony_ci
23032a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetProducerInitInfoRemote(MessageParcel &arguments,
23132a6e48fSopenharmony_ci    MessageParcel &reply, MessageOption &option)
23232a6e48fSopenharmony_ci{
23332a6e48fSopenharmony_ci    ProducerInitInfo info;
23432a6e48fSopenharmony_ci    sptr<IRemoteObject> token = arguments.ReadRemoteObject();
23532a6e48fSopenharmony_ci    if (token == nullptr || !arguments.ReadString(info.appName)) {
23632a6e48fSopenharmony_ci        if (!reply.WriteInt32(GSERROR_INVALID_ARGUMENTS)) {
23732a6e48fSopenharmony_ci            return IPC_STUB_WRITE_PARCEL_ERR;
23832a6e48fSopenharmony_ci        }
23932a6e48fSopenharmony_ci        return ERR_INVALID_DATA;
24032a6e48fSopenharmony_ci    }
24132a6e48fSopenharmony_ci    (void)GetProducerInitInfo(info);
24232a6e48fSopenharmony_ci    if (!reply.WriteInt32(info.width) || !reply.WriteInt32(info.height) || !reply.WriteUint64(info.uniqueId) ||
24332a6e48fSopenharmony_ci        !reply.WriteString(info.name) || !reply.WriteBool(info.isInHebcList)) {
24432a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
24532a6e48fSopenharmony_ci    }
24632a6e48fSopenharmony_ci
24732a6e48fSopenharmony_ci    bool result = HandleDeathRecipient(token);
24832a6e48fSopenharmony_ci    if (!reply.WriteInt32(result ? GSERROR_OK : SURFACE_ERROR_UNKOWN)) {
24932a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
25032a6e48fSopenharmony_ci    }
25132a6e48fSopenharmony_ci    return ERR_NONE;
25232a6e48fSopenharmony_ci}
25332a6e48fSopenharmony_ci
25432a6e48fSopenharmony_ciint32_t BufferQueueProducer::CancelBufferRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
25532a6e48fSopenharmony_ci{
25632a6e48fSopenharmony_ci    uint32_t sequence;
25732a6e48fSopenharmony_ci    sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
25832a6e48fSopenharmony_ci
25932a6e48fSopenharmony_ci    sequence = arguments.ReadUint32();
26032a6e48fSopenharmony_ci    if (bedataimpl->ReadFromParcel(arguments) != GSERROR_OK) {
26132a6e48fSopenharmony_ci        return ERR_INVALID_REPLY;
26232a6e48fSopenharmony_ci    }
26332a6e48fSopenharmony_ci
26432a6e48fSopenharmony_ci    GSError sRet = CancelBuffer(sequence, bedataimpl);
26532a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
26632a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
26732a6e48fSopenharmony_ci    }
26832a6e48fSopenharmony_ci    return ERR_NONE;
26932a6e48fSopenharmony_ci}
27032a6e48fSopenharmony_ci
27132a6e48fSopenharmony_ciint32_t BufferQueueProducer::FlushBufferRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
27232a6e48fSopenharmony_ci{
27332a6e48fSopenharmony_ci    uint32_t sequence;
27432a6e48fSopenharmony_ci    BufferFlushConfigWithDamages config;
27532a6e48fSopenharmony_ci    sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
27632a6e48fSopenharmony_ci    int64_t startTimeNs = 0;
27732a6e48fSopenharmony_ci    int64_t endTimeNs = 0;
27832a6e48fSopenharmony_ci    bool isActiveGame = false;
27932a6e48fSopenharmony_ci    int32_t connectedPid = 0;
28032a6e48fSopenharmony_ci    {
28132a6e48fSopenharmony_ci        std::lock_guard<std::mutex> lock(mutex_);
28232a6e48fSopenharmony_ci        connectedPid = connectedPid_;
28332a6e48fSopenharmony_ci    }
28432a6e48fSopenharmony_ci    isActiveGame = Rosen::FrameReport::GetInstance().IsActiveGameWithPid(connectedPid);
28532a6e48fSopenharmony_ci    if (isActiveGame) {
28632a6e48fSopenharmony_ci        startTimeNs = std::chrono::duration_cast<std::chrono::nanoseconds>(
28732a6e48fSopenharmony_ci            std::chrono::steady_clock::now().time_since_epoch()).count();
28832a6e48fSopenharmony_ci    }
28932a6e48fSopenharmony_ci
29032a6e48fSopenharmony_ci    sequence = arguments.ReadUint32();
29132a6e48fSopenharmony_ci    if (bedataimpl->ReadFromParcel(arguments) != GSERROR_OK) {
29232a6e48fSopenharmony_ci        return ERR_INVALID_REPLY;
29332a6e48fSopenharmony_ci    }
29432a6e48fSopenharmony_ci
29532a6e48fSopenharmony_ci    sptr<SyncFence> fence = SyncFence::ReadFromMessageParcel(arguments);
29632a6e48fSopenharmony_ci    if (ReadFlushConfig(arguments, config) != GSERROR_OK) {
29732a6e48fSopenharmony_ci        return ERR_INVALID_REPLY;
29832a6e48fSopenharmony_ci    }
29932a6e48fSopenharmony_ci
30032a6e48fSopenharmony_ci    GSError sRet = FlushBuffer(sequence, bedataimpl, fence, config);
30132a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
30232a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
30332a6e48fSopenharmony_ci    }
30432a6e48fSopenharmony_ci
30532a6e48fSopenharmony_ci    if (isActiveGame) {
30632a6e48fSopenharmony_ci        uint64_t uniqueId = GetUniqueId();
30732a6e48fSopenharmony_ci        endTimeNs = std::chrono::duration_cast<std::chrono::nanoseconds>(
30832a6e48fSopenharmony_ci            std::chrono::steady_clock::now().time_since_epoch()).count();
30932a6e48fSopenharmony_ci        Rosen::FrameReport::GetInstance().SetQueueBufferTime(uniqueId, name_, (endTimeNs - startTimeNs));
31032a6e48fSopenharmony_ci        Rosen::FrameReport::GetInstance().Report(name_);
31132a6e48fSopenharmony_ci    }
31232a6e48fSopenharmony_ci
31332a6e48fSopenharmony_ci    return ERR_NONE;
31432a6e48fSopenharmony_ci}
31532a6e48fSopenharmony_ci
31632a6e48fSopenharmony_ciint32_t BufferQueueProducer::FlushBuffersRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
31732a6e48fSopenharmony_ci{
31832a6e48fSopenharmony_ci    std::vector<uint32_t> sequences;
31932a6e48fSopenharmony_ci    std::vector<BufferFlushConfigWithDamages> configs;
32032a6e48fSopenharmony_ci    std::vector<sptr<BufferExtraData>> bedataimpls;
32132a6e48fSopenharmony_ci    std::vector<sptr<SyncFence>> fences;
32232a6e48fSopenharmony_ci    arguments.ReadUInt32Vector(&sequences);
32332a6e48fSopenharmony_ci    if (sequences.size() == 0 || sequences.size() > SURFACE_MAX_QUEUE_SIZE) {
32432a6e48fSopenharmony_ci        return ERR_NONE;
32532a6e48fSopenharmony_ci    }
32632a6e48fSopenharmony_ci    for (size_t i = 0; i < sequences.size(); ++i) {
32732a6e48fSopenharmony_ci        sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
32832a6e48fSopenharmony_ci        if (bedataimpl->ReadFromParcel(arguments) != GSERROR_OK) {
32932a6e48fSopenharmony_ci            return ERR_INVALID_REPLY;
33032a6e48fSopenharmony_ci        }
33132a6e48fSopenharmony_ci        bedataimpls.emplace_back(bedataimpl);
33232a6e48fSopenharmony_ci        sptr<SyncFence> fence = SyncFence::ReadFromMessageParcel(arguments);
33332a6e48fSopenharmony_ci        fences.emplace_back(fence);
33432a6e48fSopenharmony_ci        BufferFlushConfigWithDamages config;
33532a6e48fSopenharmony_ci        if (ReadFlushConfig(arguments, config) != GSERROR_OK) {
33632a6e48fSopenharmony_ci            return ERR_INVALID_REPLY;
33732a6e48fSopenharmony_ci        }
33832a6e48fSopenharmony_ci        configs.emplace_back(config);
33932a6e48fSopenharmony_ci    }
34032a6e48fSopenharmony_ci
34132a6e48fSopenharmony_ci    GSError sRet = FlushBuffers(sequences, bedataimpls, fences, configs);
34232a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
34332a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
34432a6e48fSopenharmony_ci    }
34532a6e48fSopenharmony_ci    return ERR_NONE;
34632a6e48fSopenharmony_ci}
34732a6e48fSopenharmony_ci
34832a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetLastFlushedBufferRemote(MessageParcel &arguments,
34932a6e48fSopenharmony_ci    MessageParcel &reply, MessageOption &option)
35032a6e48fSopenharmony_ci{
35132a6e48fSopenharmony_ci    sptr<SurfaceBuffer> buffer;
35232a6e48fSopenharmony_ci    sptr<SyncFence> fence;
35332a6e48fSopenharmony_ci    float matrix[BUFFER_MATRIX_SIZE];
35432a6e48fSopenharmony_ci    bool isUseNewMatrix = arguments.ReadBool();
35532a6e48fSopenharmony_ci    GSError sRet = GetLastFlushedBuffer(buffer, fence, matrix, isUseNewMatrix);
35632a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
35732a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
35832a6e48fSopenharmony_ci    }
35932a6e48fSopenharmony_ci    if (sRet == GSERROR_OK) {
36032a6e48fSopenharmony_ci        uint32_t sequence = buffer->GetSeqNum();
36132a6e48fSopenharmony_ci        if (WriteSurfaceBufferImpl(reply, sequence, buffer) != GSERROR_OK ||
36232a6e48fSopenharmony_ci            buffer->WriteBufferRequestConfig(reply) != GSERROR_OK) {
36332a6e48fSopenharmony_ci            return IPC_STUB_WRITE_PARCEL_ERR;
36432a6e48fSopenharmony_ci        }
36532a6e48fSopenharmony_ci        std::vector<float> writeMatrixVector(matrix, matrix + sizeof(matrix) / sizeof(float));
36632a6e48fSopenharmony_ci        if (!fence->WriteToMessageParcel(reply) || !reply.WriteFloatVector(writeMatrixVector)) {
36732a6e48fSopenharmony_ci            return IPC_STUB_WRITE_PARCEL_ERR;
36832a6e48fSopenharmony_ci        }
36932a6e48fSopenharmony_ci    }
37032a6e48fSopenharmony_ci    return ERR_NONE;
37132a6e48fSopenharmony_ci}
37232a6e48fSopenharmony_ci
37332a6e48fSopenharmony_ciint32_t BufferQueueProducer::AttachBufferToQueueRemote(MessageParcel &arguments,
37432a6e48fSopenharmony_ci    MessageParcel &reply, MessageOption &option)
37532a6e48fSopenharmony_ci{
37632a6e48fSopenharmony_ci    sptr<SurfaceBuffer> buffer = nullptr;
37732a6e48fSopenharmony_ci    uint32_t sequence;
37832a6e48fSopenharmony_ci    GSError ret = ReadSurfaceBufferImpl(arguments, sequence, buffer);
37932a6e48fSopenharmony_ci    if (ret != GSERROR_OK || buffer == nullptr) {
38032a6e48fSopenharmony_ci        if (!reply.WriteInt32(SURFACE_ERROR_UNKOWN)) {
38132a6e48fSopenharmony_ci            return IPC_STUB_WRITE_PARCEL_ERR;
38232a6e48fSopenharmony_ci        }
38332a6e48fSopenharmony_ci        return ERR_INVALID_DATA;
38432a6e48fSopenharmony_ci    }
38532a6e48fSopenharmony_ci    ret = buffer->ReadBufferRequestConfig(arguments);
38632a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
38732a6e48fSopenharmony_ci        if (!reply.WriteInt32(SURFACE_ERROR_UNKOWN)) {
38832a6e48fSopenharmony_ci            return IPC_STUB_WRITE_PARCEL_ERR;
38932a6e48fSopenharmony_ci        }
39032a6e48fSopenharmony_ci        return ERR_INVALID_DATA;
39132a6e48fSopenharmony_ci    }
39232a6e48fSopenharmony_ci    ret = AttachBufferToQueue(buffer);
39332a6e48fSopenharmony_ci    if (!reply.WriteInt32(ret)) {
39432a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
39532a6e48fSopenharmony_ci    }
39632a6e48fSopenharmony_ci    return ERR_NONE;
39732a6e48fSopenharmony_ci}
39832a6e48fSopenharmony_ci
39932a6e48fSopenharmony_ciint32_t BufferQueueProducer::DetachBufferFromQueueRemote(MessageParcel &arguments,
40032a6e48fSopenharmony_ci    MessageParcel &reply, MessageOption &option)
40132a6e48fSopenharmony_ci{
40232a6e48fSopenharmony_ci    sptr<SurfaceBuffer> buffer = nullptr;
40332a6e48fSopenharmony_ci    uint32_t sequence;
40432a6e48fSopenharmony_ci    GSError ret = ReadSurfaceBufferImpl(arguments, sequence, buffer);
40532a6e48fSopenharmony_ci    if (ret != GSERROR_OK || buffer == nullptr) {
40632a6e48fSopenharmony_ci        if (!reply.WriteInt32(SURFACE_ERROR_UNKOWN)) {
40732a6e48fSopenharmony_ci            return IPC_STUB_WRITE_PARCEL_ERR;
40832a6e48fSopenharmony_ci        }
40932a6e48fSopenharmony_ci        return ERR_INVALID_DATA;
41032a6e48fSopenharmony_ci    }
41132a6e48fSopenharmony_ci    ret = DetachBufferFromQueue(buffer);
41232a6e48fSopenharmony_ci    if (!reply.WriteInt32(ret)) {
41332a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
41432a6e48fSopenharmony_ci    }
41532a6e48fSopenharmony_ci    return ERR_NONE;
41632a6e48fSopenharmony_ci}
41732a6e48fSopenharmony_ci
41832a6e48fSopenharmony_ciint32_t BufferQueueProducer::AttachBufferRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
41932a6e48fSopenharmony_ci{
42032a6e48fSopenharmony_ci    sptr<SurfaceBuffer> buffer;
42132a6e48fSopenharmony_ci    uint32_t sequence;
42232a6e48fSopenharmony_ci    int32_t timeOut;
42332a6e48fSopenharmony_ci    GSError ret = ReadSurfaceBufferImpl(arguments, sequence, buffer);
42432a6e48fSopenharmony_ci    if (ret != GSERROR_OK || buffer == nullptr) {
42532a6e48fSopenharmony_ci        if (!reply.WriteInt32(ret)) {
42632a6e48fSopenharmony_ci            return IPC_STUB_WRITE_PARCEL_ERR;
42732a6e48fSopenharmony_ci        }
42832a6e48fSopenharmony_ci        return ERR_INVALID_DATA;
42932a6e48fSopenharmony_ci    }
43032a6e48fSopenharmony_ci    timeOut = arguments.ReadInt32();
43132a6e48fSopenharmony_ci
43232a6e48fSopenharmony_ci    ret = AttachBuffer(buffer, timeOut);
43332a6e48fSopenharmony_ci    if (!reply.WriteInt32(ret)) {
43432a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
43532a6e48fSopenharmony_ci    }
43632a6e48fSopenharmony_ci    return ERR_NONE;
43732a6e48fSopenharmony_ci}
43832a6e48fSopenharmony_ci
43932a6e48fSopenharmony_ciint32_t BufferQueueProducer::DetachBufferRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
44032a6e48fSopenharmony_ci{
44132a6e48fSopenharmony_ci    return ERR_NONE;
44232a6e48fSopenharmony_ci}
44332a6e48fSopenharmony_ci
44432a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetQueueSizeRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
44532a6e48fSopenharmony_ci{
44632a6e48fSopenharmony_ci    if (!reply.WriteInt32(GetQueueSize())) {
44732a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
44832a6e48fSopenharmony_ci    }
44932a6e48fSopenharmony_ci    return ERR_NONE;
45032a6e48fSopenharmony_ci}
45132a6e48fSopenharmony_ci
45232a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetQueueSizeRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
45332a6e48fSopenharmony_ci{
45432a6e48fSopenharmony_ci    uint32_t queueSize = arguments.ReadUint32();
45532a6e48fSopenharmony_ci    GSError sRet = SetQueueSize(queueSize);
45632a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
45732a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
45832a6e48fSopenharmony_ci    }
45932a6e48fSopenharmony_ci    return ERR_NONE;
46032a6e48fSopenharmony_ci}
46132a6e48fSopenharmony_ci
46232a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetNameRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
46332a6e48fSopenharmony_ci{
46432a6e48fSopenharmony_ci    std::string name;
46532a6e48fSopenharmony_ci    auto sRet = bufferQueue_->GetName(name);
46632a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
46732a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
46832a6e48fSopenharmony_ci    }
46932a6e48fSopenharmony_ci    if (sRet == GSERROR_OK && !reply.WriteString(name)) {
47032a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
47132a6e48fSopenharmony_ci    }
47232a6e48fSopenharmony_ci    return ERR_NONE;
47332a6e48fSopenharmony_ci}
47432a6e48fSopenharmony_ci
47532a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetNameAndUniqueIdRemote(MessageParcel &arguments, MessageParcel &reply,
47632a6e48fSopenharmony_ci                                                      MessageOption &option)
47732a6e48fSopenharmony_ci{
47832a6e48fSopenharmony_ci    std::string name = "not init";
47932a6e48fSopenharmony_ci    uint64_t uniqueId = 0;
48032a6e48fSopenharmony_ci    auto ret = GetNameAndUniqueId(name, uniqueId);
48132a6e48fSopenharmony_ci    if (!reply.WriteInt32(ret)) {
48232a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
48332a6e48fSopenharmony_ci    }
48432a6e48fSopenharmony_ci    if (ret == GSERROR_OK && (!reply.WriteString(name) || !reply.WriteUint64(uniqueId))) {
48532a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
48632a6e48fSopenharmony_ci    }
48732a6e48fSopenharmony_ci    return ERR_NONE;
48832a6e48fSopenharmony_ci}
48932a6e48fSopenharmony_ci
49032a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetDefaultWidthRemote(MessageParcel &arguments, MessageParcel &reply,
49132a6e48fSopenharmony_ci                                                   MessageOption &option)
49232a6e48fSopenharmony_ci{
49332a6e48fSopenharmony_ci    if (!reply.WriteInt32(GetDefaultWidth())) {
49432a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
49532a6e48fSopenharmony_ci    }
49632a6e48fSopenharmony_ci    return ERR_NONE;
49732a6e48fSopenharmony_ci}
49832a6e48fSopenharmony_ci
49932a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetDefaultHeightRemote(MessageParcel &arguments, MessageParcel &reply,
50032a6e48fSopenharmony_ci                                                    MessageOption &option)
50132a6e48fSopenharmony_ci{
50232a6e48fSopenharmony_ci    if (!reply.WriteInt32(GetDefaultHeight())) {
50332a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
50432a6e48fSopenharmony_ci    }
50532a6e48fSopenharmony_ci    return ERR_NONE;
50632a6e48fSopenharmony_ci}
50732a6e48fSopenharmony_ci
50832a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetDefaultUsageRemote(MessageParcel &arguments, MessageParcel &reply,
50932a6e48fSopenharmony_ci                                                   MessageOption &option)
51032a6e48fSopenharmony_ci{
51132a6e48fSopenharmony_ci    uint64_t usage = arguments.ReadUint64();
51232a6e48fSopenharmony_ci    GSError sRet = SetDefaultUsage(usage);
51332a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
51432a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
51532a6e48fSopenharmony_ci    }
51632a6e48fSopenharmony_ci    return ERR_NONE;
51732a6e48fSopenharmony_ci}
51832a6e48fSopenharmony_ci
51932a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetDefaultUsageRemote(MessageParcel &arguments, MessageParcel &reply,
52032a6e48fSopenharmony_ci                                                   MessageOption &option)
52132a6e48fSopenharmony_ci{
52232a6e48fSopenharmony_ci    if (!reply.WriteUint64(GetDefaultUsage())) {
52332a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
52432a6e48fSopenharmony_ci    }
52532a6e48fSopenharmony_ci    return ERR_NONE;
52632a6e48fSopenharmony_ci}
52732a6e48fSopenharmony_ci
52832a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetUniqueIdRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
52932a6e48fSopenharmony_ci{
53032a6e48fSopenharmony_ci    if (!reply.WriteUint64(GetUniqueId())) {
53132a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
53232a6e48fSopenharmony_ci    }
53332a6e48fSopenharmony_ci    return ERR_NONE;
53432a6e48fSopenharmony_ci}
53532a6e48fSopenharmony_ci
53632a6e48fSopenharmony_ciint32_t BufferQueueProducer::CleanCacheRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
53732a6e48fSopenharmony_ci{
53832a6e48fSopenharmony_ci    bool cleanAll = arguments.ReadBool();
53932a6e48fSopenharmony_ci    if (!reply.WriteInt32(CleanCache(cleanAll))) {
54032a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
54132a6e48fSopenharmony_ci    }
54232a6e48fSopenharmony_ci    return ERR_NONE;
54332a6e48fSopenharmony_ci}
54432a6e48fSopenharmony_ci
54532a6e48fSopenharmony_ciint32_t BufferQueueProducer::GoBackgroundRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
54632a6e48fSopenharmony_ci{
54732a6e48fSopenharmony_ci    if (!reply.WriteInt32(GoBackground())) {
54832a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
54932a6e48fSopenharmony_ci    }
55032a6e48fSopenharmony_ci    return ERR_NONE;
55132a6e48fSopenharmony_ci}
55232a6e48fSopenharmony_ci
55332a6e48fSopenharmony_ciint32_t BufferQueueProducer::RegisterReleaseListenerRemote(MessageParcel &arguments,
55432a6e48fSopenharmony_ci    MessageParcel &reply, MessageOption &option)
55532a6e48fSopenharmony_ci{
55632a6e48fSopenharmony_ci    sptr<IRemoteObject> listenerObject = arguments.ReadRemoteObject();
55732a6e48fSopenharmony_ci    if (listenerObject == nullptr) {
55832a6e48fSopenharmony_ci        if (!reply.WriteInt32(GSERROR_INVALID_ARGUMENTS)) {
55932a6e48fSopenharmony_ci            return IPC_STUB_WRITE_PARCEL_ERR;
56032a6e48fSopenharmony_ci        }
56132a6e48fSopenharmony_ci        return ERR_INVALID_REPLY;
56232a6e48fSopenharmony_ci    }
56332a6e48fSopenharmony_ci    sptr<IProducerListener> listener = iface_cast<IProducerListener>(listenerObject);
56432a6e48fSopenharmony_ci    GSError sRet = RegisterReleaseListener(listener);
56532a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
56632a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
56732a6e48fSopenharmony_ci    }
56832a6e48fSopenharmony_ci    return ERR_NONE;
56932a6e48fSopenharmony_ci}
57032a6e48fSopenharmony_ci
57132a6e48fSopenharmony_ciint32_t BufferQueueProducer::UnRegisterReleaseListenerRemote(MessageParcel &arguments,
57232a6e48fSopenharmony_ci    MessageParcel &reply, MessageOption &option)
57332a6e48fSopenharmony_ci{
57432a6e48fSopenharmony_ci    GSError sRet = UnRegisterReleaseListener();
57532a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
57632a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
57732a6e48fSopenharmony_ci    }
57832a6e48fSopenharmony_ci    return ERR_NONE;
57932a6e48fSopenharmony_ci}
58032a6e48fSopenharmony_ci
58132a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetTransformRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
58232a6e48fSopenharmony_ci{
58332a6e48fSopenharmony_ci    GraphicTransformType transform = static_cast<GraphicTransformType>(arguments.ReadUint32());
58432a6e48fSopenharmony_ci    GSError sRet = SetTransform(transform);
58532a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
58632a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
58732a6e48fSopenharmony_ci    }
58832a6e48fSopenharmony_ci    return ERR_NONE;
58932a6e48fSopenharmony_ci}
59032a6e48fSopenharmony_ci
59132a6e48fSopenharmony_ciint32_t BufferQueueProducer::IsSupportedAllocRemote(MessageParcel &arguments, MessageParcel &reply,
59232a6e48fSopenharmony_ci                                                    MessageOption &option)
59332a6e48fSopenharmony_ci{
59432a6e48fSopenharmony_ci    std::vector<BufferVerifyAllocInfo> infos;
59532a6e48fSopenharmony_ci    ReadVerifyAllocInfo(arguments, infos);
59632a6e48fSopenharmony_ci
59732a6e48fSopenharmony_ci    std::vector<bool> supporteds;
59832a6e48fSopenharmony_ci    GSError sRet = IsSupportedAlloc(infos, supporteds);
59932a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
60032a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
60132a6e48fSopenharmony_ci    }
60232a6e48fSopenharmony_ci    if (sRet == GSERROR_OK && !reply.WriteBoolVector(supporteds)) {
60332a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
60432a6e48fSopenharmony_ci    }
60532a6e48fSopenharmony_ci
60632a6e48fSopenharmony_ci    return ERR_NONE;
60732a6e48fSopenharmony_ci}
60832a6e48fSopenharmony_ci
60932a6e48fSopenharmony_ciint32_t BufferQueueProducer::ConnectRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
61032a6e48fSopenharmony_ci{
61132a6e48fSopenharmony_ci    GSError sRet = Connect();
61232a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
61332a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
61432a6e48fSopenharmony_ci    }
61532a6e48fSopenharmony_ci    return ERR_NONE;
61632a6e48fSopenharmony_ci}
61732a6e48fSopenharmony_ci
61832a6e48fSopenharmony_ciint32_t BufferQueueProducer::DisconnectRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
61932a6e48fSopenharmony_ci{
62032a6e48fSopenharmony_ci    GSError sRet = Disconnect();
62132a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
62232a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
62332a6e48fSopenharmony_ci    }
62432a6e48fSopenharmony_ci    return ERR_NONE;
62532a6e48fSopenharmony_ci}
62632a6e48fSopenharmony_ci
62732a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetScalingModeRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
62832a6e48fSopenharmony_ci{
62932a6e48fSopenharmony_ci    uint32_t sequence = arguments.ReadUint32();
63032a6e48fSopenharmony_ci    ScalingMode scalingMode = static_cast<ScalingMode>(arguments.ReadInt32());
63132a6e48fSopenharmony_ci    GSError sRet = SetScalingMode(sequence, scalingMode);
63232a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
63332a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
63432a6e48fSopenharmony_ci    }
63532a6e48fSopenharmony_ci    return ERR_NONE;
63632a6e48fSopenharmony_ci}
63732a6e48fSopenharmony_ci
63832a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetScalingModeV2Remote(MessageParcel &arguments, MessageParcel &reply,
63932a6e48fSopenharmony_ci                                                    MessageOption &option)
64032a6e48fSopenharmony_ci{
64132a6e48fSopenharmony_ci    ScalingMode scalingMode = static_cast<ScalingMode>(arguments.ReadInt32());
64232a6e48fSopenharmony_ci    GSError sRet = SetScalingMode(scalingMode);
64332a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
64432a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
64532a6e48fSopenharmony_ci    }
64632a6e48fSopenharmony_ci    return ERR_NONE;
64732a6e48fSopenharmony_ci}
64832a6e48fSopenharmony_ci
64932a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetBufferHoldRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
65032a6e48fSopenharmony_ci{
65132a6e48fSopenharmony_ci    bool hold = arguments.ReadBool();
65232a6e48fSopenharmony_ci    GSError sRet = SetBufferHold(hold);
65332a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
65432a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
65532a6e48fSopenharmony_ci    }
65632a6e48fSopenharmony_ci    return ERR_NONE;
65732a6e48fSopenharmony_ci}
65832a6e48fSopenharmony_ci
65932a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetMetaDataRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
66032a6e48fSopenharmony_ci{
66132a6e48fSopenharmony_ci    uint32_t sequence = arguments.ReadUint32();
66232a6e48fSopenharmony_ci    std::vector<GraphicHDRMetaData> metaData;
66332a6e48fSopenharmony_ci    if (ReadHDRMetaData(arguments, metaData) != GSERROR_OK) {
66432a6e48fSopenharmony_ci        return GSERROR_BINDER;
66532a6e48fSopenharmony_ci    }
66632a6e48fSopenharmony_ci    GSError sRet = SetMetaData(sequence, metaData);
66732a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
66832a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
66932a6e48fSopenharmony_ci    }
67032a6e48fSopenharmony_ci    return ERR_NONE;
67132a6e48fSopenharmony_ci}
67232a6e48fSopenharmony_ci
67332a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetMetaDataSetRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
67432a6e48fSopenharmony_ci{
67532a6e48fSopenharmony_ci    uint32_t sequence = arguments.ReadUint32();
67632a6e48fSopenharmony_ci    GraphicHDRMetadataKey key = static_cast<GraphicHDRMetadataKey>(arguments.ReadUint32());
67732a6e48fSopenharmony_ci    std::vector<uint8_t> metaData;
67832a6e48fSopenharmony_ci    if (ReadHDRMetaDataSet(arguments, metaData) != GSERROR_OK) {
67932a6e48fSopenharmony_ci        return GSERROR_BINDER;
68032a6e48fSopenharmony_ci    }
68132a6e48fSopenharmony_ci    GSError sRet = SetMetaDataSet(sequence, key, metaData);
68232a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
68332a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
68432a6e48fSopenharmony_ci    }
68532a6e48fSopenharmony_ci    return ERR_NONE;
68632a6e48fSopenharmony_ci}
68732a6e48fSopenharmony_ci
68832a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetTunnelHandleRemote(MessageParcel &arguments, MessageParcel &reply,
68932a6e48fSopenharmony_ci                                                   MessageOption &option)
69032a6e48fSopenharmony_ci{
69132a6e48fSopenharmony_ci    sptr<SurfaceTunnelHandle> handle = nullptr;
69232a6e48fSopenharmony_ci    if (arguments.ReadBool()) {
69332a6e48fSopenharmony_ci        handle = new SurfaceTunnelHandle();
69432a6e48fSopenharmony_ci        if (ReadExtDataHandle(arguments, handle) != GSERROR_OK) {
69532a6e48fSopenharmony_ci            return GSERROR_BINDER;
69632a6e48fSopenharmony_ci        }
69732a6e48fSopenharmony_ci    }
69832a6e48fSopenharmony_ci    GSError sRet = SetTunnelHandle(handle);
69932a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
70032a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
70132a6e48fSopenharmony_ci    }
70232a6e48fSopenharmony_ci    return ERR_NONE;
70332a6e48fSopenharmony_ci}
70432a6e48fSopenharmony_ci
70532a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetPresentTimestampRemote(MessageParcel &arguments, MessageParcel &reply,
70632a6e48fSopenharmony_ci                                                       MessageOption &option)
70732a6e48fSopenharmony_ci{
70832a6e48fSopenharmony_ci    uint32_t sequence = arguments.ReadUint32();
70932a6e48fSopenharmony_ci    GraphicPresentTimestampType type = static_cast<GraphicPresentTimestampType>(arguments.ReadUint32());
71032a6e48fSopenharmony_ci    int64_t time = 0;
71132a6e48fSopenharmony_ci    GSError sRet = GetPresentTimestamp(sequence, type, time);
71232a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
71332a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
71432a6e48fSopenharmony_ci    }
71532a6e48fSopenharmony_ci    if (sRet == GSERROR_OK && !reply.WriteInt64(time)) {
71632a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
71732a6e48fSopenharmony_ci    }
71832a6e48fSopenharmony_ci    return ERR_NONE;
71932a6e48fSopenharmony_ci}
72032a6e48fSopenharmony_ci
72132a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetTransformRemote(
72232a6e48fSopenharmony_ci    MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
72332a6e48fSopenharmony_ci{
72432a6e48fSopenharmony_ci    GraphicTransformType transform = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
72532a6e48fSopenharmony_ci    auto ret = GetTransform(transform);
72632a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
72732a6e48fSopenharmony_ci        if (!reply.WriteInt32(static_cast<int32_t>(ret))) {
72832a6e48fSopenharmony_ci            return IPC_STUB_WRITE_PARCEL_ERR;
72932a6e48fSopenharmony_ci        }
73032a6e48fSopenharmony_ci        return ERR_INVALID_REPLY;
73132a6e48fSopenharmony_ci    }
73232a6e48fSopenharmony_ci
73332a6e48fSopenharmony_ci    if (!reply.WriteInt32(GSERROR_OK) || !reply.WriteUint32(static_cast<uint32_t>(transform))) {
73432a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
73532a6e48fSopenharmony_ci    }
73632a6e48fSopenharmony_ci
73732a6e48fSopenharmony_ci    return ERR_NONE;
73832a6e48fSopenharmony_ci}
73932a6e48fSopenharmony_ci
74032a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetTransformHintRemote(MessageParcel &arguments,
74132a6e48fSopenharmony_ci    MessageParcel &reply, MessageOption &option)
74232a6e48fSopenharmony_ci{
74332a6e48fSopenharmony_ci    GraphicTransformType transformHint = static_cast<GraphicTransformType>(arguments.ReadUint32());
74432a6e48fSopenharmony_ci    GSError sRet = SetTransformHint(transformHint);
74532a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
74632a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
74732a6e48fSopenharmony_ci    }
74832a6e48fSopenharmony_ci    return ERR_NONE;
74932a6e48fSopenharmony_ci}
75032a6e48fSopenharmony_ci
75132a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetTransformHintRemote(
75232a6e48fSopenharmony_ci    MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
75332a6e48fSopenharmony_ci{
75432a6e48fSopenharmony_ci    GraphicTransformType transformHint = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
75532a6e48fSopenharmony_ci    auto ret = GetTransformHint(transformHint);
75632a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
75732a6e48fSopenharmony_ci        if (!reply.WriteInt32(static_cast<int32_t>(ret))) {
75832a6e48fSopenharmony_ci            return IPC_STUB_WRITE_PARCEL_ERR;
75932a6e48fSopenharmony_ci        }
76032a6e48fSopenharmony_ci        return ERR_INVALID_REPLY;
76132a6e48fSopenharmony_ci    }
76232a6e48fSopenharmony_ci
76332a6e48fSopenharmony_ci    if (!reply.WriteInt32(GSERROR_OK) || !reply.WriteUint32(static_cast<uint32_t>(transformHint))) {
76432a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
76532a6e48fSopenharmony_ci    }
76632a6e48fSopenharmony_ci
76732a6e48fSopenharmony_ci    return ERR_NONE;
76832a6e48fSopenharmony_ci}
76932a6e48fSopenharmony_ci
77032a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetSurfaceSourceTypeRemote(MessageParcel &arguments,
77132a6e48fSopenharmony_ci    MessageParcel &reply, MessageOption &option)
77232a6e48fSopenharmony_ci{
77332a6e48fSopenharmony_ci    OHSurfaceSource sourceType = static_cast<OHSurfaceSource>(arguments.ReadUint32());
77432a6e48fSopenharmony_ci    GSError sRet = SetSurfaceSourceType(sourceType);
77532a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
77632a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
77732a6e48fSopenharmony_ci    }
77832a6e48fSopenharmony_ci    return ERR_NONE;
77932a6e48fSopenharmony_ci}
78032a6e48fSopenharmony_ci
78132a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetSurfaceSourceTypeRemote(
78232a6e48fSopenharmony_ci    MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
78332a6e48fSopenharmony_ci{
78432a6e48fSopenharmony_ci    OHSurfaceSource sourceType = OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
78532a6e48fSopenharmony_ci    auto ret = GetSurfaceSourceType(sourceType);
78632a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
78732a6e48fSopenharmony_ci        if (!reply.WriteInt32(static_cast<int32_t>(ret))) {
78832a6e48fSopenharmony_ci            return IPC_STUB_WRITE_PARCEL_ERR;
78932a6e48fSopenharmony_ci        }
79032a6e48fSopenharmony_ci        return ERR_INVALID_REPLY;
79132a6e48fSopenharmony_ci    }
79232a6e48fSopenharmony_ci
79332a6e48fSopenharmony_ci    if (!reply.WriteInt32(GSERROR_OK) || !reply.WriteUint32(static_cast<uint32_t>(sourceType))) {
79432a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
79532a6e48fSopenharmony_ci    }
79632a6e48fSopenharmony_ci
79732a6e48fSopenharmony_ci    return ERR_NONE;
79832a6e48fSopenharmony_ci}
79932a6e48fSopenharmony_ci
80032a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetSurfaceAppFrameworkTypeRemote(
80132a6e48fSopenharmony_ci    MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
80232a6e48fSopenharmony_ci{
80332a6e48fSopenharmony_ci    std::string appFrameworkType = arguments.ReadString();
80432a6e48fSopenharmony_ci    GSError sRet = SetSurfaceAppFrameworkType(appFrameworkType);
80532a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
80632a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
80732a6e48fSopenharmony_ci    }
80832a6e48fSopenharmony_ci    return ERR_NONE;
80932a6e48fSopenharmony_ci}
81032a6e48fSopenharmony_ci
81132a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetSurfaceAppFrameworkTypeRemote(
81232a6e48fSopenharmony_ci    MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
81332a6e48fSopenharmony_ci{
81432a6e48fSopenharmony_ci    std::string appFrameworkType = "";
81532a6e48fSopenharmony_ci    auto ret = GetSurfaceAppFrameworkType(appFrameworkType);
81632a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
81732a6e48fSopenharmony_ci        if (!reply.WriteInt32(static_cast<int32_t>(ret))) {
81832a6e48fSopenharmony_ci            return IPC_STUB_WRITE_PARCEL_ERR;
81932a6e48fSopenharmony_ci        }
82032a6e48fSopenharmony_ci        return ERR_INVALID_REPLY;
82132a6e48fSopenharmony_ci    }
82232a6e48fSopenharmony_ci
82332a6e48fSopenharmony_ci    if (!reply.WriteInt32(GSERROR_OK) || !reply.WriteString(appFrameworkType)) {
82432a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
82532a6e48fSopenharmony_ci    }
82632a6e48fSopenharmony_ci
82732a6e48fSopenharmony_ci    return ERR_NONE;
82832a6e48fSopenharmony_ci}
82932a6e48fSopenharmony_ci
83032a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetHdrWhitePointBrightnessRemote(
83132a6e48fSopenharmony_ci    MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
83232a6e48fSopenharmony_ci{
83332a6e48fSopenharmony_ci    float brightness = arguments.ReadFloat();
83432a6e48fSopenharmony_ci    GSError sRet = SetHdrWhitePointBrightness(brightness);
83532a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
83632a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
83732a6e48fSopenharmony_ci    }
83832a6e48fSopenharmony_ci    return ERR_NONE;
83932a6e48fSopenharmony_ci}
84032a6e48fSopenharmony_ci
84132a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetSdrWhitePointBrightnessRemote(
84232a6e48fSopenharmony_ci    MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
84332a6e48fSopenharmony_ci{
84432a6e48fSopenharmony_ci    float brightness = arguments.ReadFloat();
84532a6e48fSopenharmony_ci    GSError sRet = SetSdrWhitePointBrightness(brightness);
84632a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
84732a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
84832a6e48fSopenharmony_ci    }
84932a6e48fSopenharmony_ci    return ERR_NONE;
85032a6e48fSopenharmony_ci}
85132a6e48fSopenharmony_ci
85232a6e48fSopenharmony_ciint32_t BufferQueueProducer::AcquireLastFlushedBufferRemote(
85332a6e48fSopenharmony_ci    MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
85432a6e48fSopenharmony_ci{
85532a6e48fSopenharmony_ci    sptr<SurfaceBuffer> buffer;
85632a6e48fSopenharmony_ci    sptr<SyncFence> fence;
85732a6e48fSopenharmony_ci    float matrix[BUFFER_MATRIX_SIZE];
85832a6e48fSopenharmony_ci    bool isUseNewMatrix = arguments.ReadBool();
85932a6e48fSopenharmony_ci    GSError sRet = AcquireLastFlushedBuffer(buffer, fence, matrix, BUFFER_MATRIX_SIZE, isUseNewMatrix);
86032a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
86132a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
86232a6e48fSopenharmony_ci    }
86332a6e48fSopenharmony_ci    if (sRet == GSERROR_OK) {
86432a6e48fSopenharmony_ci        uint32_t sequence = buffer->GetSeqNum();
86532a6e48fSopenharmony_ci        if (WriteSurfaceBufferImpl(reply, sequence, buffer) != GSERROR_OK ||
86632a6e48fSopenharmony_ci            buffer->WriteBufferRequestConfig(reply) != GSERROR_OK) {
86732a6e48fSopenharmony_ci            return IPC_STUB_WRITE_PARCEL_ERR;
86832a6e48fSopenharmony_ci        }
86932a6e48fSopenharmony_ci        std::vector<float> writeMatrixVector(matrix, matrix + sizeof(matrix) / sizeof(float));
87032a6e48fSopenharmony_ci        if (!fence->WriteToMessageParcel(reply) || !reply.WriteFloatVector(writeMatrixVector)) {
87132a6e48fSopenharmony_ci            return IPC_STUB_WRITE_PARCEL_ERR;
87232a6e48fSopenharmony_ci        }
87332a6e48fSopenharmony_ci    }
87432a6e48fSopenharmony_ci    return ERR_NONE;
87532a6e48fSopenharmony_ci}
87632a6e48fSopenharmony_ci
87732a6e48fSopenharmony_ciint32_t BufferQueueProducer::ReleaseLastFlushedBufferRemote(
87832a6e48fSopenharmony_ci    MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
87932a6e48fSopenharmony_ci{
88032a6e48fSopenharmony_ci    uint32_t sequence = arguments.ReadUint32();
88132a6e48fSopenharmony_ci    GSError sRet = ReleaseLastFlushedBuffer(sequence);
88232a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
88332a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
88432a6e48fSopenharmony_ci    }
88532a6e48fSopenharmony_ci    return ERR_NONE;
88632a6e48fSopenharmony_ci}
88732a6e48fSopenharmony_ci
88832a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetGlobalAlphaRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
88932a6e48fSopenharmony_ci{
89032a6e48fSopenharmony_ci    int32_t alpha = arguments.ReadInt32();
89132a6e48fSopenharmony_ci    GSError sRet = SetGlobalAlpha(alpha);
89232a6e48fSopenharmony_ci    if (!reply.WriteInt32(sRet)) {
89332a6e48fSopenharmony_ci        return IPC_STUB_WRITE_PARCEL_ERR;
89432a6e48fSopenharmony_ci    }
89532a6e48fSopenharmony_ci    return ERR_NONE;
89632a6e48fSopenharmony_ci}
89732a6e48fSopenharmony_ci
89832a6e48fSopenharmony_ciGSError BufferQueueProducer::AcquireLastFlushedBuffer(sptr<SurfaceBuffer> &buffer,
89932a6e48fSopenharmony_ci    sptr<SyncFence> &fence, float matrix[16], uint32_t matrixSize, bool isUseNewMatrix)
90032a6e48fSopenharmony_ci{
90132a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
90232a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
90332a6e48fSopenharmony_ci    }
90432a6e48fSopenharmony_ci    return bufferQueue_->AcquireLastFlushedBuffer(buffer, fence, matrix, matrixSize, isUseNewMatrix);
90532a6e48fSopenharmony_ci}
90632a6e48fSopenharmony_ci
90732a6e48fSopenharmony_ciGSError BufferQueueProducer::ReleaseLastFlushedBuffer(uint32_t sequence)
90832a6e48fSopenharmony_ci{
90932a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
91032a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
91132a6e48fSopenharmony_ci    }
91232a6e48fSopenharmony_ci    return bufferQueue_->ReleaseLastFlushedBuffer(sequence);
91332a6e48fSopenharmony_ci}
91432a6e48fSopenharmony_ci
91532a6e48fSopenharmony_ciGSError BufferQueueProducer::RequestBuffer(const BufferRequestConfig &config, sptr<BufferExtraData> &bedata,
91632a6e48fSopenharmony_ci                                           RequestBufferReturnValue &retval)
91732a6e48fSopenharmony_ci{
91832a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
91932a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
92032a6e48fSopenharmony_ci    }
92132a6e48fSopenharmony_ci
92232a6e48fSopenharmony_ci    retval.isConnected = false;
92332a6e48fSopenharmony_ci    auto ret = Connect();
92432a6e48fSopenharmony_ci    if (ret != SURFACE_ERROR_OK) {
92532a6e48fSopenharmony_ci        return ret;
92632a6e48fSopenharmony_ci    }
92732a6e48fSopenharmony_ci    retval.isConnected = true;
92832a6e48fSopenharmony_ci    return bufferQueue_->RequestBuffer(config, bedata, retval);
92932a6e48fSopenharmony_ci}
93032a6e48fSopenharmony_ci
93132a6e48fSopenharmony_ciGSError BufferQueueProducer::RequestBuffers(const BufferRequestConfig &config,
93232a6e48fSopenharmony_ci    std::vector<sptr<BufferExtraData>> &bedata, std::vector<RequestBufferReturnValue> &retvalues)
93332a6e48fSopenharmony_ci{
93432a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
93532a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
93632a6e48fSopenharmony_ci    }
93732a6e48fSopenharmony_ci    retvalues[0].isConnected = false;
93832a6e48fSopenharmony_ci    auto ret = Connect();
93932a6e48fSopenharmony_ci    if (ret != SURFACE_ERROR_OK) {
94032a6e48fSopenharmony_ci        return ret;
94132a6e48fSopenharmony_ci    }
94232a6e48fSopenharmony_ci    bufferQueue_->SetBatchHandle(true);
94332a6e48fSopenharmony_ci    for (size_t i = 0; i < retvalues.size(); ++i) {
94432a6e48fSopenharmony_ci        ret = bufferQueue_->RequestBuffer(config, bedata[i], retvalues[i]);
94532a6e48fSopenharmony_ci        if (ret != GSERROR_OK) {
94632a6e48fSopenharmony_ci            retvalues.resize(i);
94732a6e48fSopenharmony_ci            break;
94832a6e48fSopenharmony_ci        }
94932a6e48fSopenharmony_ci    }
95032a6e48fSopenharmony_ci    bufferQueue_->SetBatchHandle(false);
95132a6e48fSopenharmony_ci    if (retvalues.size() == 0) {
95232a6e48fSopenharmony_ci        retvalues.resize(1);
95332a6e48fSopenharmony_ci        retvalues[0].isConnected = true;
95432a6e48fSopenharmony_ci        return ret;
95532a6e48fSopenharmony_ci    }
95632a6e48fSopenharmony_ci    return GSERROR_OK;
95732a6e48fSopenharmony_ci}
95832a6e48fSopenharmony_ci
95932a6e48fSopenharmony_ciGSError BufferQueueProducer::GetProducerInitInfo(ProducerInitInfo &info)
96032a6e48fSopenharmony_ci{
96132a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
96232a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
96332a6e48fSopenharmony_ci    }
96432a6e48fSopenharmony_ci    return bufferQueue_->GetProducerInitInfo(info);
96532a6e48fSopenharmony_ci}
96632a6e48fSopenharmony_ci
96732a6e48fSopenharmony_ciGSError BufferQueueProducer::CancelBuffer(uint32_t sequence, sptr<BufferExtraData> bedata)
96832a6e48fSopenharmony_ci{
96932a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
97032a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
97132a6e48fSopenharmony_ci    }
97232a6e48fSopenharmony_ci    return bufferQueue_->CancelBuffer(sequence, bedata);
97332a6e48fSopenharmony_ci}
97432a6e48fSopenharmony_ci
97532a6e48fSopenharmony_ciGSError BufferQueueProducer::FlushBuffer(uint32_t sequence, sptr<BufferExtraData> bedata,
97632a6e48fSopenharmony_ci                                         sptr<SyncFence> fence, BufferFlushConfigWithDamages &config)
97732a6e48fSopenharmony_ci{
97832a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
97932a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
98032a6e48fSopenharmony_ci    }
98132a6e48fSopenharmony_ci    return bufferQueue_->FlushBuffer(sequence, bedata, fence, config);
98232a6e48fSopenharmony_ci}
98332a6e48fSopenharmony_ci
98432a6e48fSopenharmony_ciGSError BufferQueueProducer::FlushBuffers(const std::vector<uint32_t> &sequences,
98532a6e48fSopenharmony_ci    const std::vector<sptr<BufferExtraData>> &bedata,
98632a6e48fSopenharmony_ci    const std::vector<sptr<SyncFence>> &fences,
98732a6e48fSopenharmony_ci    const std::vector<BufferFlushConfigWithDamages> &configs)
98832a6e48fSopenharmony_ci{
98932a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
99032a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
99132a6e48fSopenharmony_ci    }
99232a6e48fSopenharmony_ci    GSError ret;
99332a6e48fSopenharmony_ci    for (size_t i = 0; i < sequences.size(); ++i) {
99432a6e48fSopenharmony_ci        ret = bufferQueue_->FlushBuffer(sequences[i], bedata[i], fences[i], configs[i]);
99532a6e48fSopenharmony_ci        if (ret != GSERROR_OK) {
99632a6e48fSopenharmony_ci            BLOGE("FlushBuffer failed: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_);
99732a6e48fSopenharmony_ci            return ret;
99832a6e48fSopenharmony_ci        }
99932a6e48fSopenharmony_ci    }
100032a6e48fSopenharmony_ci    return ret;
100132a6e48fSopenharmony_ci}
100232a6e48fSopenharmony_ci
100332a6e48fSopenharmony_ciGSError BufferQueueProducer::GetLastFlushedBuffer(sptr<SurfaceBuffer>& buffer,
100432a6e48fSopenharmony_ci    sptr<SyncFence>& fence, float matrix[16], bool isUseNewMatrix)
100532a6e48fSopenharmony_ci{
100632a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
100732a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
100832a6e48fSopenharmony_ci    }
100932a6e48fSopenharmony_ci    return bufferQueue_->GetLastFlushedBuffer(buffer, fence, matrix, BUFFER_MATRIX_SIZE, isUseNewMatrix);
101032a6e48fSopenharmony_ci}
101132a6e48fSopenharmony_ci
101232a6e48fSopenharmony_ciGSError BufferQueueProducer::AttachBufferToQueue(sptr<SurfaceBuffer> buffer)
101332a6e48fSopenharmony_ci{
101432a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
101532a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
101632a6e48fSopenharmony_ci    }
101732a6e48fSopenharmony_ci    return bufferQueue_->AttachBufferToQueue(buffer, InvokerType::PRODUCER_INVOKER);
101832a6e48fSopenharmony_ci}
101932a6e48fSopenharmony_ci
102032a6e48fSopenharmony_ciGSError BufferQueueProducer::DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)
102132a6e48fSopenharmony_ci{
102232a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
102332a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
102432a6e48fSopenharmony_ci    }
102532a6e48fSopenharmony_ci    return bufferQueue_->DetachBufferFromQueue(buffer, InvokerType::PRODUCER_INVOKER);
102632a6e48fSopenharmony_ci}
102732a6e48fSopenharmony_ci
102832a6e48fSopenharmony_ciGSError BufferQueueProducer::AttachBuffer(sptr<SurfaceBuffer>& buffer)
102932a6e48fSopenharmony_ci{
103032a6e48fSopenharmony_ci    int32_t timeOut = 0;
103132a6e48fSopenharmony_ci    return AttachBuffer(buffer, timeOut);
103232a6e48fSopenharmony_ci}
103332a6e48fSopenharmony_ci
103432a6e48fSopenharmony_ciGSError BufferQueueProducer::AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut)
103532a6e48fSopenharmony_ci{
103632a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
103732a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
103832a6e48fSopenharmony_ci    }
103932a6e48fSopenharmony_ci    return bufferQueue_->AttachBuffer(buffer, timeOut);
104032a6e48fSopenharmony_ci}
104132a6e48fSopenharmony_ci
104232a6e48fSopenharmony_ciGSError BufferQueueProducer::DetachBuffer(sptr<SurfaceBuffer>& buffer)
104332a6e48fSopenharmony_ci{
104432a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
104532a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
104632a6e48fSopenharmony_ci    }
104732a6e48fSopenharmony_ci
104832a6e48fSopenharmony_ci    return bufferQueue_->DetachBuffer(buffer);
104932a6e48fSopenharmony_ci}
105032a6e48fSopenharmony_ci
105132a6e48fSopenharmony_ciuint32_t BufferQueueProducer::GetQueueSize()
105232a6e48fSopenharmony_ci{
105332a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
105432a6e48fSopenharmony_ci        return 0;
105532a6e48fSopenharmony_ci    }
105632a6e48fSopenharmony_ci    return bufferQueue_->GetQueueSize();
105732a6e48fSopenharmony_ci}
105832a6e48fSopenharmony_ci
105932a6e48fSopenharmony_ciGSError BufferQueueProducer::SetQueueSize(uint32_t queueSize)
106032a6e48fSopenharmony_ci{
106132a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
106232a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
106332a6e48fSopenharmony_ci    }
106432a6e48fSopenharmony_ci    return bufferQueue_->SetQueueSize(queueSize);
106532a6e48fSopenharmony_ci}
106632a6e48fSopenharmony_ci
106732a6e48fSopenharmony_ciGSError BufferQueueProducer::GetName(std::string &name)
106832a6e48fSopenharmony_ci{
106932a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
107032a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
107132a6e48fSopenharmony_ci    }
107232a6e48fSopenharmony_ci    return bufferQueue_->GetName(name);
107332a6e48fSopenharmony_ci}
107432a6e48fSopenharmony_ci
107532a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetDefaultWidth()
107632a6e48fSopenharmony_ci{
107732a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
107832a6e48fSopenharmony_ci        return 0;
107932a6e48fSopenharmony_ci    }
108032a6e48fSopenharmony_ci    return bufferQueue_->GetDefaultWidth();
108132a6e48fSopenharmony_ci}
108232a6e48fSopenharmony_ci
108332a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetDefaultHeight()
108432a6e48fSopenharmony_ci{
108532a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
108632a6e48fSopenharmony_ci        return 0;
108732a6e48fSopenharmony_ci    }
108832a6e48fSopenharmony_ci    return bufferQueue_->GetDefaultHeight();
108932a6e48fSopenharmony_ci}
109032a6e48fSopenharmony_ci
109132a6e48fSopenharmony_ciGSError BufferQueueProducer::SetDefaultUsage(uint64_t usage)
109232a6e48fSopenharmony_ci{
109332a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
109432a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
109532a6e48fSopenharmony_ci    }
109632a6e48fSopenharmony_ci    return bufferQueue_->SetDefaultUsage(usage);
109732a6e48fSopenharmony_ci}
109832a6e48fSopenharmony_ci
109932a6e48fSopenharmony_ciuint64_t BufferQueueProducer::GetDefaultUsage()
110032a6e48fSopenharmony_ci{
110132a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
110232a6e48fSopenharmony_ci        return 0;
110332a6e48fSopenharmony_ci    }
110432a6e48fSopenharmony_ci    return bufferQueue_->GetDefaultUsage();
110532a6e48fSopenharmony_ci}
110632a6e48fSopenharmony_ci
110732a6e48fSopenharmony_ciuint64_t BufferQueueProducer::GetUniqueId()
110832a6e48fSopenharmony_ci{
110932a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
111032a6e48fSopenharmony_ci        return 0;
111132a6e48fSopenharmony_ci    }
111232a6e48fSopenharmony_ci    return bufferQueue_->GetUniqueId();
111332a6e48fSopenharmony_ci}
111432a6e48fSopenharmony_ci
111532a6e48fSopenharmony_ciGSError BufferQueueProducer::CleanCache(bool cleanAll)
111632a6e48fSopenharmony_ci{
111732a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
111832a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
111932a6e48fSopenharmony_ci    }
112032a6e48fSopenharmony_ci
112132a6e48fSopenharmony_ci    {
112232a6e48fSopenharmony_ci        std::lock_guard<std::mutex> lock(mutex_);
112332a6e48fSopenharmony_ci        auto ret = CheckConnectLocked();
112432a6e48fSopenharmony_ci        if (ret != GSERROR_OK) {
112532a6e48fSopenharmony_ci            return ret;
112632a6e48fSopenharmony_ci        }
112732a6e48fSopenharmony_ci    }
112832a6e48fSopenharmony_ci
112932a6e48fSopenharmony_ci    return bufferQueue_->CleanCache(cleanAll);
113032a6e48fSopenharmony_ci}
113132a6e48fSopenharmony_ci
113232a6e48fSopenharmony_ciGSError BufferQueueProducer::GoBackground()
113332a6e48fSopenharmony_ci{
113432a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
113532a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
113632a6e48fSopenharmony_ci    }
113732a6e48fSopenharmony_ci
113832a6e48fSopenharmony_ci    {
113932a6e48fSopenharmony_ci        std::lock_guard<std::mutex> lock(mutex_);
114032a6e48fSopenharmony_ci        auto ret = CheckConnectLocked();
114132a6e48fSopenharmony_ci        if (ret != GSERROR_OK) {
114232a6e48fSopenharmony_ci            return ret;
114332a6e48fSopenharmony_ci        }
114432a6e48fSopenharmony_ci    }
114532a6e48fSopenharmony_ci    return bufferQueue_->SetProducerCacheCleanFlag(true);
114632a6e48fSopenharmony_ci}
114732a6e48fSopenharmony_ci
114832a6e48fSopenharmony_ciGSError BufferQueueProducer::RegisterReleaseListener(sptr<IProducerListener> listener)
114932a6e48fSopenharmony_ci{
115032a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
115132a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
115232a6e48fSopenharmony_ci    }
115332a6e48fSopenharmony_ci    return bufferQueue_->RegisterProducerReleaseListener(listener);
115432a6e48fSopenharmony_ci}
115532a6e48fSopenharmony_ci
115632a6e48fSopenharmony_ciGSError BufferQueueProducer::UnRegisterReleaseListener()
115732a6e48fSopenharmony_ci{
115832a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
115932a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
116032a6e48fSopenharmony_ci    }
116132a6e48fSopenharmony_ci    return bufferQueue_->UnRegisterProducerReleaseListener();
116232a6e48fSopenharmony_ci}
116332a6e48fSopenharmony_ci
116432a6e48fSopenharmony_cibool BufferQueueProducer::HandleDeathRecipient(sptr<IRemoteObject> token)
116532a6e48fSopenharmony_ci{
116632a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
116732a6e48fSopenharmony_ci    if (token_ != nullptr) {
116832a6e48fSopenharmony_ci        token_->RemoveDeathRecipient(producerSurfaceDeathRecipient_);
116932a6e48fSopenharmony_ci    }
117032a6e48fSopenharmony_ci    token_ = token;
117132a6e48fSopenharmony_ci    return token_->AddDeathRecipient(producerSurfaceDeathRecipient_);
117232a6e48fSopenharmony_ci}
117332a6e48fSopenharmony_ci
117432a6e48fSopenharmony_ciGSError BufferQueueProducer::SetTransform(GraphicTransformType transform)
117532a6e48fSopenharmony_ci{
117632a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
117732a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
117832a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
117932a6e48fSopenharmony_ci    }
118032a6e48fSopenharmony_ci    return bufferQueue_->SetTransform(transform);
118132a6e48fSopenharmony_ci}
118232a6e48fSopenharmony_ci
118332a6e48fSopenharmony_ciGSError BufferQueueProducer::GetTransform(GraphicTransformType &transform)
118432a6e48fSopenharmony_ci{
118532a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
118632a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
118732a6e48fSopenharmony_ci        transform = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
118832a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
118932a6e48fSopenharmony_ci    }
119032a6e48fSopenharmony_ci    transform = bufferQueue_->GetTransform();
119132a6e48fSopenharmony_ci    return GSERROR_OK;
119232a6e48fSopenharmony_ci}
119332a6e48fSopenharmony_ci
119432a6e48fSopenharmony_ciGSError BufferQueueProducer::SetTransformHint(GraphicTransformType transformHint)
119532a6e48fSopenharmony_ci{
119632a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
119732a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
119832a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
119932a6e48fSopenharmony_ci    }
120032a6e48fSopenharmony_ci    return bufferQueue_->SetTransformHint(transformHint);
120132a6e48fSopenharmony_ci}
120232a6e48fSopenharmony_ci
120332a6e48fSopenharmony_ciGSError BufferQueueProducer::GetTransformHint(GraphicTransformType &transformHint)
120432a6e48fSopenharmony_ci{
120532a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
120632a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
120732a6e48fSopenharmony_ci        transformHint = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
120832a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
120932a6e48fSopenharmony_ci    }
121032a6e48fSopenharmony_ci    transformHint = bufferQueue_->GetTransformHint();
121132a6e48fSopenharmony_ci    return GSERROR_OK;
121232a6e48fSopenharmony_ci}
121332a6e48fSopenharmony_ci
121432a6e48fSopenharmony_ciGSError BufferQueueProducer::SetSurfaceSourceType(OHSurfaceSource sourceType)
121532a6e48fSopenharmony_ci{
121632a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
121732a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
121832a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
121932a6e48fSopenharmony_ci    }
122032a6e48fSopenharmony_ci    return bufferQueue_->SetSurfaceSourceType(sourceType);
122132a6e48fSopenharmony_ci}
122232a6e48fSopenharmony_ci
122332a6e48fSopenharmony_ciGSError BufferQueueProducer::GetSurfaceSourceType(OHSurfaceSource &sourceType)
122432a6e48fSopenharmony_ci{
122532a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
122632a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
122732a6e48fSopenharmony_ci        sourceType = OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
122832a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
122932a6e48fSopenharmony_ci    }
123032a6e48fSopenharmony_ci    sourceType = bufferQueue_->GetSurfaceSourceType();
123132a6e48fSopenharmony_ci    return GSERROR_OK;
123232a6e48fSopenharmony_ci}
123332a6e48fSopenharmony_ci
123432a6e48fSopenharmony_ciGSError BufferQueueProducer::SetSurfaceAppFrameworkType(std::string appFrameworkType)
123532a6e48fSopenharmony_ci{
123632a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
123732a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
123832a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
123932a6e48fSopenharmony_ci    }
124032a6e48fSopenharmony_ci    return bufferQueue_->SetSurfaceAppFrameworkType(appFrameworkType);
124132a6e48fSopenharmony_ci}
124232a6e48fSopenharmony_ci
124332a6e48fSopenharmony_ciGSError BufferQueueProducer::GetSurfaceAppFrameworkType(std::string &appFrameworkType)
124432a6e48fSopenharmony_ci{
124532a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
124632a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
124732a6e48fSopenharmony_ci        appFrameworkType = "";
124832a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
124932a6e48fSopenharmony_ci    }
125032a6e48fSopenharmony_ci    appFrameworkType = bufferQueue_->GetSurfaceAppFrameworkType();
125132a6e48fSopenharmony_ci    return GSERROR_OK;
125232a6e48fSopenharmony_ci}
125332a6e48fSopenharmony_ci
125432a6e48fSopenharmony_ciGSError BufferQueueProducer::SetHdrWhitePointBrightness(float brightness)
125532a6e48fSopenharmony_ci{
125632a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
125732a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
125832a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
125932a6e48fSopenharmony_ci    }
126032a6e48fSopenharmony_ci    return bufferQueue_->SetHdrWhitePointBrightness(brightness);
126132a6e48fSopenharmony_ci}
126232a6e48fSopenharmony_ci
126332a6e48fSopenharmony_ciGSError BufferQueueProducer::SetSdrWhitePointBrightness(float brightness)
126432a6e48fSopenharmony_ci{
126532a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
126632a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
126732a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
126832a6e48fSopenharmony_ci    }
126932a6e48fSopenharmony_ci    return bufferQueue_->SetSdrWhitePointBrightness(brightness);
127032a6e48fSopenharmony_ci}
127132a6e48fSopenharmony_ci
127232a6e48fSopenharmony_ciGSError BufferQueueProducer::IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> &infos,
127332a6e48fSopenharmony_ci                                              std::vector<bool> &supporteds)
127432a6e48fSopenharmony_ci{
127532a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
127632a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
127732a6e48fSopenharmony_ci    }
127832a6e48fSopenharmony_ci
127932a6e48fSopenharmony_ci    return bufferQueue_->IsSupportedAlloc(infos, supporteds);
128032a6e48fSopenharmony_ci}
128132a6e48fSopenharmony_ci
128232a6e48fSopenharmony_ciGSError BufferQueueProducer::GetNameAndUniqueId(std::string& name, uint64_t& uniqueId)
128332a6e48fSopenharmony_ci{
128432a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
128532a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
128632a6e48fSopenharmony_ci    }
128732a6e48fSopenharmony_ci    uniqueId = GetUniqueId();
128832a6e48fSopenharmony_ci    return GetName(name);
128932a6e48fSopenharmony_ci}
129032a6e48fSopenharmony_ci
129132a6e48fSopenharmony_ciGSError BufferQueueProducer::Connect()
129232a6e48fSopenharmony_ci{
129332a6e48fSopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
129432a6e48fSopenharmony_ci    auto callingPid = GetCallingPid();
129532a6e48fSopenharmony_ci    if (connectedPid_ != 0 && connectedPid_ != callingPid) {
129632a6e48fSopenharmony_ci        BLOGW("connected by: %{public}d, request by: %{public}d , uniqueId: %{public}" PRIu64 ".",
129732a6e48fSopenharmony_ci            connectedPid_, callingPid, uniqueId_);
129832a6e48fSopenharmony_ci        return SURFACE_ERROR_CONSUMER_IS_CONNECTED;
129932a6e48fSopenharmony_ci    }
130032a6e48fSopenharmony_ci    connectedPid_ = callingPid;
130132a6e48fSopenharmony_ci    return SURFACE_ERROR_OK;
130232a6e48fSopenharmony_ci}
130332a6e48fSopenharmony_ci
130432a6e48fSopenharmony_ciGSError BufferQueueProducer::Disconnect()
130532a6e48fSopenharmony_ci{
130632a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
130732a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
130832a6e48fSopenharmony_ci    }
130932a6e48fSopenharmony_ci
131032a6e48fSopenharmony_ci    {
131132a6e48fSopenharmony_ci        std::lock_guard<std::mutex> lock(mutex_);
131232a6e48fSopenharmony_ci        auto ret = CheckConnectLocked();
131332a6e48fSopenharmony_ci        if (ret != GSERROR_OK) {
131432a6e48fSopenharmony_ci            return ret;
131532a6e48fSopenharmony_ci        }
131632a6e48fSopenharmony_ci        connectedPid_ = 0;
131732a6e48fSopenharmony_ci    }
131832a6e48fSopenharmony_ci    return bufferQueue_->CleanCache(false);
131932a6e48fSopenharmony_ci}
132032a6e48fSopenharmony_ci
132132a6e48fSopenharmony_ciGSError BufferQueueProducer::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
132232a6e48fSopenharmony_ci{
132332a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
132432a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
132532a6e48fSopenharmony_ci    }
132632a6e48fSopenharmony_ci    return bufferQueue_->SetScalingMode(sequence, scalingMode);
132732a6e48fSopenharmony_ci}
132832a6e48fSopenharmony_ci
132932a6e48fSopenharmony_ciGSError BufferQueueProducer::SetScalingMode(ScalingMode scalingMode)
133032a6e48fSopenharmony_ci{
133132a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
133232a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
133332a6e48fSopenharmony_ci    }
133432a6e48fSopenharmony_ci    return bufferQueue_->SetScalingMode(scalingMode);
133532a6e48fSopenharmony_ci}
133632a6e48fSopenharmony_ci
133732a6e48fSopenharmony_ciGSError BufferQueueProducer::SetBufferHold(bool hold)
133832a6e48fSopenharmony_ci{
133932a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
134032a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
134132a6e48fSopenharmony_ci    }
134232a6e48fSopenharmony_ci    return bufferQueue_->SetBufferHold(hold);
134332a6e48fSopenharmony_ci}
134432a6e48fSopenharmony_ci
134532a6e48fSopenharmony_ciGSError BufferQueueProducer::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData> &metaData)
134632a6e48fSopenharmony_ci{
134732a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
134832a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
134932a6e48fSopenharmony_ci    }
135032a6e48fSopenharmony_ci
135132a6e48fSopenharmony_ci    return bufferQueue_->SetMetaData(sequence, metaData);
135232a6e48fSopenharmony_ci}
135332a6e48fSopenharmony_ci
135432a6e48fSopenharmony_ciGSError BufferQueueProducer::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
135532a6e48fSopenharmony_ci                                            const std::vector<uint8_t> &metaData)
135632a6e48fSopenharmony_ci{
135732a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
135832a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
135932a6e48fSopenharmony_ci    }
136032a6e48fSopenharmony_ci
136132a6e48fSopenharmony_ci    return bufferQueue_->SetMetaDataSet(sequence, key, metaData);
136232a6e48fSopenharmony_ci}
136332a6e48fSopenharmony_ci
136432a6e48fSopenharmony_ciGSError BufferQueueProducer::SetTunnelHandle(const sptr<SurfaceTunnelHandle> &handle)
136532a6e48fSopenharmony_ci{
136632a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
136732a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
136832a6e48fSopenharmony_ci    }
136932a6e48fSopenharmony_ci    return bufferQueue_->SetTunnelHandle(handle);
137032a6e48fSopenharmony_ci}
137132a6e48fSopenharmony_ci
137232a6e48fSopenharmony_ciGSError BufferQueueProducer::SetTunnelHandle(const GraphicExtDataHandle *handle)
137332a6e48fSopenharmony_ci{
137432a6e48fSopenharmony_ci    sptr<SurfaceTunnelHandle> tunnelHandle = new SurfaceTunnelHandle();
137532a6e48fSopenharmony_ci    if (tunnelHandle->SetHandle(handle) != GSERROR_OK) {
137632a6e48fSopenharmony_ci        return GSERROR_INVALID_OPERATING;
137732a6e48fSopenharmony_ci    }
137832a6e48fSopenharmony_ci    return bufferQueue_->SetTunnelHandle(tunnelHandle);
137932a6e48fSopenharmony_ci}
138032a6e48fSopenharmony_ci
138132a6e48fSopenharmony_ciGSError BufferQueueProducer::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type, int64_t &time)
138232a6e48fSopenharmony_ci{
138332a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
138432a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
138532a6e48fSopenharmony_ci    }
138632a6e48fSopenharmony_ci    return bufferQueue_->GetPresentTimestamp(sequence, type, time);
138732a6e48fSopenharmony_ci}
138832a6e48fSopenharmony_ci
138932a6e48fSopenharmony_cibool BufferQueueProducer::GetStatus() const
139032a6e48fSopenharmony_ci{
139132a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
139232a6e48fSopenharmony_ci        return false;
139332a6e48fSopenharmony_ci    }
139432a6e48fSopenharmony_ci    return bufferQueue_->GetStatus();
139532a6e48fSopenharmony_ci}
139632a6e48fSopenharmony_ci
139732a6e48fSopenharmony_civoid BufferQueueProducer::SetStatus(bool status)
139832a6e48fSopenharmony_ci{
139932a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
140032a6e48fSopenharmony_ci        return;
140132a6e48fSopenharmony_ci    }
140232a6e48fSopenharmony_ci    bufferQueue_->SetStatus(status);
140332a6e48fSopenharmony_ci}
140432a6e48fSopenharmony_ci
140532a6e48fSopenharmony_ciGSError BufferQueueProducer::SetGlobalAlpha(int32_t alpha)
140632a6e48fSopenharmony_ci{
140732a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
140832a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
140932a6e48fSopenharmony_ci    }
141032a6e48fSopenharmony_ci    return bufferQueue_->SetGlobalAlpha(alpha);
141132a6e48fSopenharmony_ci}
141232a6e48fSopenharmony_ci
141332a6e48fSopenharmony_cisptr<NativeSurface> BufferQueueProducer::GetNativeSurface()
141432a6e48fSopenharmony_ci{
141532a6e48fSopenharmony_ci    return nullptr;
141632a6e48fSopenharmony_ci}
141732a6e48fSopenharmony_ci
141832a6e48fSopenharmony_civoid BufferQueueProducer::OnBufferProducerRemoteDied()
141932a6e48fSopenharmony_ci{
142032a6e48fSopenharmony_ci    if (bufferQueue_ == nullptr) {
142132a6e48fSopenharmony_ci        return;
142232a6e48fSopenharmony_ci    }
142332a6e48fSopenharmony_ci
142432a6e48fSopenharmony_ci    {
142532a6e48fSopenharmony_ci        std::lock_guard<std::mutex> lock(mutex_);
142632a6e48fSopenharmony_ci        if (connectedPid_ == 0) {
142732a6e48fSopenharmony_ci            BLOGD("no connections, uniqueId: %{public}" PRIu64 ".", uniqueId_);
142832a6e48fSopenharmony_ci            return;
142932a6e48fSopenharmony_ci        }
143032a6e48fSopenharmony_ci        connectedPid_ = 0;
143132a6e48fSopenharmony_ci    }
143232a6e48fSopenharmony_ci    bufferQueue_->CleanCache(false);
143332a6e48fSopenharmony_ci}
143432a6e48fSopenharmony_ci
143532a6e48fSopenharmony_ciBufferQueueProducer::ProducerSurfaceDeathRecipient::ProducerSurfaceDeathRecipient(
143632a6e48fSopenharmony_ci    wptr<BufferQueueProducer> producer) : producer_(producer)
143732a6e48fSopenharmony_ci{
143832a6e48fSopenharmony_ci}
143932a6e48fSopenharmony_ci
144032a6e48fSopenharmony_civoid BufferQueueProducer::ProducerSurfaceDeathRecipient::OnRemoteDied(const wptr<IRemoteObject>& remoteObject)
144132a6e48fSopenharmony_ci{
144232a6e48fSopenharmony_ci    auto remoteToken = remoteObject.promote();
144332a6e48fSopenharmony_ci    if (remoteToken == nullptr) {
144432a6e48fSopenharmony_ci        BLOGW("can't promote remote object.");
144532a6e48fSopenharmony_ci        return;
144632a6e48fSopenharmony_ci    }
144732a6e48fSopenharmony_ci
144832a6e48fSopenharmony_ci    auto producer = producer_.promote();
144932a6e48fSopenharmony_ci    if (producer == nullptr) {
145032a6e48fSopenharmony_ci        BLOGD("producer is nullptr");
145132a6e48fSopenharmony_ci        return;
145232a6e48fSopenharmony_ci    }
145332a6e48fSopenharmony_ci
145432a6e48fSopenharmony_ci    if (producer->token_ != remoteToken) {
145532a6e48fSopenharmony_ci        BLOGD("token doesn't match, ignore it, uniqueId: %{public}" PRIu64 ".", producer->GetUniqueId());
145632a6e48fSopenharmony_ci        return;
145732a6e48fSopenharmony_ci    }
145832a6e48fSopenharmony_ci    BLOGD("remote object died, uniqueId: %{public}" PRIu64 ".", producer->GetUniqueId());
145932a6e48fSopenharmony_ci    producer->OnBufferProducerRemoteDied();
146032a6e48fSopenharmony_ci}
146132a6e48fSopenharmony_ci}; // namespace OHOS
1462