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_client_producer.h"
1732a6e48fSopenharmony_ci
1832a6e48fSopenharmony_ci#include <cinttypes>
1932a6e48fSopenharmony_ci
2032a6e48fSopenharmony_ci#include <iremote_stub.h>
2132a6e48fSopenharmony_ci#include "buffer_log.h"
2232a6e48fSopenharmony_ci#include "buffer_utils.h"
2332a6e48fSopenharmony_ci#include "hebc_white_list.h"
2432a6e48fSopenharmony_ci#include "sync_fence.h"
2532a6e48fSopenharmony_ci#include "message_option.h"
2632a6e48fSopenharmony_ci#include "securec.h"
2732a6e48fSopenharmony_ci#include "rs_frame_report_ext.h"
2832a6e48fSopenharmony_ci
2932a6e48fSopenharmony_ci#define DEFINE_MESSAGE_VARIABLES(arg, ret, opt)                            \
3032a6e48fSopenharmony_ci    MessageOption opt;                                                     \
3132a6e48fSopenharmony_ci    MessageParcel arg;                                                     \
3232a6e48fSopenharmony_ci    MessageParcel ret;                                                     \
3332a6e48fSopenharmony_ci    do {                                                                   \
3432a6e48fSopenharmony_ci        GSError retCode = MessageVariables(arg);                           \
3532a6e48fSopenharmony_ci        if (retCode != GSERROR_OK) {                                       \
3632a6e48fSopenharmony_ci            return retCode;                                                \
3732a6e48fSopenharmony_ci        }                                                                  \
3832a6e48fSopenharmony_ci    } while (0)
3932a6e48fSopenharmony_ci
4032a6e48fSopenharmony_ci#define SEND_REQUEST(COMMAND, arguments, reply, option)                    \
4132a6e48fSopenharmony_ci    do {                                                                   \
4232a6e48fSopenharmony_ci        GSError ret = SendRequest(COMMAND, arguments, reply, option);      \
4332a6e48fSopenharmony_ci        if (ret != GSERROR_OK) {                                           \
4432a6e48fSopenharmony_ci            return ret;                                                    \
4532a6e48fSopenharmony_ci        }                                                                  \
4632a6e48fSopenharmony_ci    } while (0)
4732a6e48fSopenharmony_ci
4832a6e48fSopenharmony_cinamespace OHOS {
4932a6e48fSopenharmony_cinamespace {
5032a6e48fSopenharmony_ci    constexpr size_t MATRIX4_SIZE = 16;
5132a6e48fSopenharmony_ci}
5232a6e48fSopenharmony_ciBufferClientProducer::BufferClientProducer(const sptr<IRemoteObject>& impl)
5332a6e48fSopenharmony_ci    : IRemoteProxy<IBufferProducer>(impl)
5432a6e48fSopenharmony_ci{
5532a6e48fSopenharmony_ci}
5632a6e48fSopenharmony_ci
5732a6e48fSopenharmony_ciBufferClientProducer::~BufferClientProducer()
5832a6e48fSopenharmony_ci{
5932a6e48fSopenharmony_ci}
6032a6e48fSopenharmony_ci
6132a6e48fSopenharmony_ciGSError BufferClientProducer::MessageVariables(MessageParcel &arg)
6232a6e48fSopenharmony_ci{
6332a6e48fSopenharmony_ci    if (!(arg).WriteInterfaceToken(GetDescriptor())) {
6432a6e48fSopenharmony_ci        BLOGE("WriteInterfaceToken failed, uniqueId: %{public}" PRIu64 ".", uniqueId_);
6532a6e48fSopenharmony_ci        return GSERROR_BINDER;
6632a6e48fSopenharmony_ci    }
6732a6e48fSopenharmony_ci    return GSERROR_OK;
6832a6e48fSopenharmony_ci}
6932a6e48fSopenharmony_ci
7032a6e48fSopenharmony_ciGSError BufferClientProducer::SendRequest(uint32_t command, MessageParcel &arg,
7132a6e48fSopenharmony_ci                                          MessageParcel &reply, MessageOption &opt)
7232a6e48fSopenharmony_ci{
7332a6e48fSopenharmony_ci    sptr<IRemoteObject> remote = Remote();
7432a6e48fSopenharmony_ci    if (remote == nullptr) {
7532a6e48fSopenharmony_ci        BLOGE("Remote is nullptr, uniqueId: %{public}" PRIu64 ".", uniqueId_);
7632a6e48fSopenharmony_ci        return GSERROR_SERVER_ERROR;
7732a6e48fSopenharmony_ci    }
7832a6e48fSopenharmony_ci    int32_t ret = remote->SendRequest(command, arg, reply, opt);
7932a6e48fSopenharmony_ci    if (ret != ERR_NONE) {
8032a6e48fSopenharmony_ci        BLOGE("SendRequest ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_);
8132a6e48fSopenharmony_ci        return GSERROR_BINDER;
8232a6e48fSopenharmony_ci    }
8332a6e48fSopenharmony_ci    return GSERROR_OK;
8432a6e48fSopenharmony_ci}
8532a6e48fSopenharmony_ci
8632a6e48fSopenharmony_ciGSError BufferClientProducer::CheckRetval(MessageParcel &reply)
8732a6e48fSopenharmony_ci{
8832a6e48fSopenharmony_ci    int32_t ret = reply.ReadInt32();
8932a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
9032a6e48fSopenharmony_ci        BLOGE("Remote ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_);
9132a6e48fSopenharmony_ci        return static_cast<GSError>(ret);
9232a6e48fSopenharmony_ci    }
9332a6e48fSopenharmony_ci    return GSERROR_OK;
9432a6e48fSopenharmony_ci}
9532a6e48fSopenharmony_ci
9632a6e48fSopenharmony_ciGSError BufferClientProducer::RequestBuffer(const BufferRequestConfig &config, sptr<BufferExtraData> &bedata,
9732a6e48fSopenharmony_ci                                            RequestBufferReturnValue &retval)
9832a6e48fSopenharmony_ci{
9932a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
10032a6e48fSopenharmony_ci
10132a6e48fSopenharmony_ci    GSError ret = WriteRequestConfig(arguments, config);
10232a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
10332a6e48fSopenharmony_ci        return ret;
10432a6e48fSopenharmony_ci    }
10532a6e48fSopenharmony_ci
10632a6e48fSopenharmony_ci    retval.isConnected = false;
10732a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_REQUEST_BUFFER, arguments, reply, option);
10832a6e48fSopenharmony_ci    ret = CheckRetval(reply);
10932a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
11032a6e48fSopenharmony_ci        reply.ReadBool(retval.isConnected);
11132a6e48fSopenharmony_ci        return ret;
11232a6e48fSopenharmony_ci    }
11332a6e48fSopenharmony_ci
11432a6e48fSopenharmony_ci    ret = ReadSurfaceBufferImpl(reply, retval.sequence, retval.buffer);
11532a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
11632a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
11732a6e48fSopenharmony_ci    }
11832a6e48fSopenharmony_ci    if (retval.buffer != nullptr) {
11932a6e48fSopenharmony_ci        retval.buffer->SetBufferRequestConfig(config);
12032a6e48fSopenharmony_ci    }
12132a6e48fSopenharmony_ci
12232a6e48fSopenharmony_ci    ret = bedata->ReadFromParcel(reply);
12332a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
12432a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
12532a6e48fSopenharmony_ci    }
12632a6e48fSopenharmony_ci    retval.fence = SyncFence::ReadFromMessageParcel(reply);
12732a6e48fSopenharmony_ci    if (!reply.ReadUInt32Vector(&retval.deletingBuffers)) {
12832a6e48fSopenharmony_ci        return GSERROR_BINDER;
12932a6e48fSopenharmony_ci    }
13032a6e48fSopenharmony_ci
13132a6e48fSopenharmony_ci    return GSERROR_OK;
13232a6e48fSopenharmony_ci}
13332a6e48fSopenharmony_ci
13432a6e48fSopenharmony_ciGSError BufferClientProducer::RequestBuffers(const BufferRequestConfig &config,
13532a6e48fSopenharmony_ci    std::vector<sptr<BufferExtraData>> &bedata, std::vector<RequestBufferReturnValue> &retvalues)
13632a6e48fSopenharmony_ci{
13732a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
13832a6e48fSopenharmony_ci
13932a6e48fSopenharmony_ci    uint32_t num = static_cast<uint32_t>(bedata.size());
14032a6e48fSopenharmony_ci    if (!arguments.WriteUint32(num)) {
14132a6e48fSopenharmony_ci        return GSERROR_BINDER;
14232a6e48fSopenharmony_ci    }
14332a6e48fSopenharmony_ci    GSError ret = WriteRequestConfig(arguments, config);
14432a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
14532a6e48fSopenharmony_ci        return ret;
14632a6e48fSopenharmony_ci    }
14732a6e48fSopenharmony_ci    retvalues[0].isConnected = false;
14832a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_REQUEST_BUFFERS, arguments, reply, option);
14932a6e48fSopenharmony_ci    ret = CheckRetval(reply);
15032a6e48fSopenharmony_ci    if (ret != GSERROR_OK && ret != GSERROR_NO_BUFFER) {
15132a6e48fSopenharmony_ci        reply.ReadBool(retvalues[0].isConnected);
15232a6e48fSopenharmony_ci        return ret;
15332a6e48fSopenharmony_ci    }
15432a6e48fSopenharmony_ci
15532a6e48fSopenharmony_ci    num = reply.ReadUint32();
15632a6e48fSopenharmony_ci    if (num > SURFACE_MAX_QUEUE_SIZE || num == 0) {
15732a6e48fSopenharmony_ci        BLOGE("num is invalid, %{public}u, uniqueId: %{public}" PRIu64 ".", num, uniqueId_);
15832a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
15932a6e48fSopenharmony_ci    }
16032a6e48fSopenharmony_ci
16132a6e48fSopenharmony_ci    ret = GSERROR_OK;
16232a6e48fSopenharmony_ci    retvalues.resize(num);
16332a6e48fSopenharmony_ci    for (size_t i = 0; i < num; ++i) {
16432a6e48fSopenharmony_ci        auto &retval = retvalues[i];
16532a6e48fSopenharmony_ci        ret = ReadSurfaceBufferImpl(reply, retval.sequence, retval.buffer);
16632a6e48fSopenharmony_ci        if (ret != GSERROR_OK) {
16732a6e48fSopenharmony_ci            return SURFACE_ERROR_UNKOWN;
16832a6e48fSopenharmony_ci        }
16932a6e48fSopenharmony_ci        if (retval.buffer != nullptr) {
17032a6e48fSopenharmony_ci            retval.buffer->SetBufferRequestConfig(config);
17132a6e48fSopenharmony_ci        }
17232a6e48fSopenharmony_ci        ret = bedata[i]->ReadFromParcel(reply);
17332a6e48fSopenharmony_ci        if (ret != GSERROR_OK) {
17432a6e48fSopenharmony_ci            return SURFACE_ERROR_UNKOWN;
17532a6e48fSopenharmony_ci        }
17632a6e48fSopenharmony_ci        retval.fence = SyncFence::ReadFromMessageParcel(reply);
17732a6e48fSopenharmony_ci        if (!reply.ReadUInt32Vector(&retval.deletingBuffers)) {
17832a6e48fSopenharmony_ci            return GSERROR_BINDER;
17932a6e48fSopenharmony_ci        }
18032a6e48fSopenharmony_ci    }
18132a6e48fSopenharmony_ci    return ret;
18232a6e48fSopenharmony_ci}
18332a6e48fSopenharmony_ci
18432a6e48fSopenharmony_ciGSError BufferClientProducer::GetLastFlushedBufferCommon(sptr<SurfaceBuffer>& buffer,
18532a6e48fSopenharmony_ci    sptr<SyncFence>& fence, float matrix[16], uint32_t matrixSize, bool isUseNewMatrix, uint32_t command)
18632a6e48fSopenharmony_ci{
18732a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
18832a6e48fSopenharmony_ci    if (!arguments.WriteBool(isUseNewMatrix)) {
18932a6e48fSopenharmony_ci        return GSERROR_BINDER;
19032a6e48fSopenharmony_ci    }
19132a6e48fSopenharmony_ci    SEND_REQUEST(command, arguments, reply, option);
19232a6e48fSopenharmony_ci    GSError ret = CheckRetval(reply);
19332a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
19432a6e48fSopenharmony_ci        return ret;
19532a6e48fSopenharmony_ci    }
19632a6e48fSopenharmony_ci    uint32_t sequence;
19732a6e48fSopenharmony_ci    ret = ReadSurfaceBufferImpl(reply, sequence, buffer);
19832a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
19932a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
20032a6e48fSopenharmony_ci    }
20132a6e48fSopenharmony_ci    if (buffer == nullptr) {
20232a6e48fSopenharmony_ci        return SURFACE_ERROR_NULLPTR;
20332a6e48fSopenharmony_ci    }
20432a6e48fSopenharmony_ci    ret = buffer->ReadBufferRequestConfig(reply);
20532a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
20632a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
20732a6e48fSopenharmony_ci    }
20832a6e48fSopenharmony_ci
20932a6e48fSopenharmony_ci    fence = SyncFence::ReadFromMessageParcel(reply);
21032a6e48fSopenharmony_ci    std::vector<float> readMatrixVector;
21132a6e48fSopenharmony_ci    if (!reply.ReadFloatVector(&readMatrixVector)) {
21232a6e48fSopenharmony_ci        return GSERROR_BINDER;
21332a6e48fSopenharmony_ci    }
21432a6e48fSopenharmony_ci    if (readMatrixVector.size() != MATRIX4_SIZE) {
21532a6e48fSopenharmony_ci        return GSERROR_INVALID_ARGUMENTS;
21632a6e48fSopenharmony_ci    }
21732a6e48fSopenharmony_ci    if (memcpy_s(matrix, matrixSize * sizeof(float),
21832a6e48fSopenharmony_ci        readMatrixVector.data(), readMatrixVector.size() * sizeof(float)) != EOK) {
21932a6e48fSopenharmony_ci        BLOGE("memcpy_s fail, uniqueId: %{public}" PRIu64 ".", uniqueId_);
22032a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
22132a6e48fSopenharmony_ci    }
22232a6e48fSopenharmony_ci    return GSERROR_OK;
22332a6e48fSopenharmony_ci}
22432a6e48fSopenharmony_ci
22532a6e48fSopenharmony_ciGSError BufferClientProducer::GetLastFlushedBuffer(sptr<SurfaceBuffer>& buffer,
22632a6e48fSopenharmony_ci    sptr<SyncFence>& fence, float matrix[16], bool isUseNewMatrix)
22732a6e48fSopenharmony_ci{
22832a6e48fSopenharmony_ci    return GetLastFlushedBufferCommon(buffer, fence,
22932a6e48fSopenharmony_ci        matrix, MATRIX4_SIZE, isUseNewMatrix, BUFFER_PRODUCER_GET_LAST_FLUSHED_BUFFER);
23032a6e48fSopenharmony_ci}
23132a6e48fSopenharmony_ci
23232a6e48fSopenharmony_ciGSError BufferClientProducer::GetProducerInitInfo(ProducerInitInfo &info)
23332a6e48fSopenharmony_ci{
23432a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
23532a6e48fSopenharmony_ci    token_ = new IRemoteStub<IBufferProducerToken>();
23632a6e48fSopenharmony_ci    HebcWhiteList::GetInstance().GetApplicationName(info.appName);
23732a6e48fSopenharmony_ci    if (!arguments.WriteRemoteObject(token_->AsObject()) || !arguments.WriteString(info.appName)) {
23832a6e48fSopenharmony_ci        return GSERROR_BINDER;
23932a6e48fSopenharmony_ci    }
24032a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_GET_INIT_INFO, arguments, reply, option);
24132a6e48fSopenharmony_ci    if (!reply.ReadInt32(info.width) || !reply.ReadInt32(info.height) ||
24232a6e48fSopenharmony_ci        !reply.ReadUint64(info.uniqueId)) {
24332a6e48fSopenharmony_ci        return GSERROR_BINDER;
24432a6e48fSopenharmony_ci    }
24532a6e48fSopenharmony_ci    uniqueId_ = info.uniqueId;
24632a6e48fSopenharmony_ci    if (!reply.ReadString(info.name) || !reply.ReadBool(info.isInHebcList)) {
24732a6e48fSopenharmony_ci        return GSERROR_BINDER;
24832a6e48fSopenharmony_ci    }
24932a6e48fSopenharmony_ci    return CheckRetval(reply);
25032a6e48fSopenharmony_ci}
25132a6e48fSopenharmony_ci
25232a6e48fSopenharmony_ciGSError BufferClientProducer::CancelBuffer(uint32_t sequence, sptr<BufferExtraData> bedata)
25332a6e48fSopenharmony_ci{
25432a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
25532a6e48fSopenharmony_ci
25632a6e48fSopenharmony_ci    if (!arguments.WriteUint32(sequence)) {
25732a6e48fSopenharmony_ci        return GSERROR_BINDER;
25832a6e48fSopenharmony_ci    }
25932a6e48fSopenharmony_ci    GSError ret = bedata->WriteToParcel(arguments);
26032a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
26132a6e48fSopenharmony_ci        return GSERROR_BINDER;
26232a6e48fSopenharmony_ci    }
26332a6e48fSopenharmony_ci
26432a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_CANCEL_BUFFER, arguments, reply, option);
26532a6e48fSopenharmony_ci    return CheckRetval(reply);
26632a6e48fSopenharmony_ci}
26732a6e48fSopenharmony_ci
26832a6e48fSopenharmony_ciGSError BufferClientProducer::FlushBuffer(uint32_t sequence, sptr<BufferExtraData> bedata,
26932a6e48fSopenharmony_ci                                          sptr<SyncFence> fence, BufferFlushConfigWithDamages &config)
27032a6e48fSopenharmony_ci{
27132a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
27232a6e48fSopenharmony_ci
27332a6e48fSopenharmony_ci    if (!arguments.WriteUint32(sequence)) {
27432a6e48fSopenharmony_ci        return GSERROR_BINDER;
27532a6e48fSopenharmony_ci    }
27632a6e48fSopenharmony_ci    GSError ret = bedata->WriteToParcel(arguments);
27732a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
27832a6e48fSopenharmony_ci        return ret;
27932a6e48fSopenharmony_ci    }
28032a6e48fSopenharmony_ci    if (!fence->WriteToMessageParcel(arguments)) {
28132a6e48fSopenharmony_ci        return GSERROR_BINDER;
28232a6e48fSopenharmony_ci    }
28332a6e48fSopenharmony_ci    ret = WriteFlushConfig(arguments, config);
28432a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
28532a6e48fSopenharmony_ci        return ret;
28632a6e48fSopenharmony_ci    }
28732a6e48fSopenharmony_ci
28832a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_FLUSH_BUFFER, arguments, reply, option);
28932a6e48fSopenharmony_ci    ret = CheckRetval(reply);
29032a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
29132a6e48fSopenharmony_ci        return ret;
29232a6e48fSopenharmony_ci    }
29332a6e48fSopenharmony_ci
29432a6e48fSopenharmony_ci    if (OHOS::RsFrameReportExt::GetInstance().GetEnable()) {
29532a6e48fSopenharmony_ci        OHOS::RsFrameReportExt::GetInstance().HandleSwapBuffer();
29632a6e48fSopenharmony_ci    }
29732a6e48fSopenharmony_ci    return GSERROR_OK;
29832a6e48fSopenharmony_ci}
29932a6e48fSopenharmony_ci
30032a6e48fSopenharmony_ciGSError BufferClientProducer::FlushBuffers(const std::vector<uint32_t> &sequences,
30132a6e48fSopenharmony_ci    const std::vector<sptr<BufferExtraData>> &bedata,
30232a6e48fSopenharmony_ci    const std::vector<sptr<SyncFence>> &fences,
30332a6e48fSopenharmony_ci    const std::vector<BufferFlushConfigWithDamages> &configs)
30432a6e48fSopenharmony_ci{
30532a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
30632a6e48fSopenharmony_ci
30732a6e48fSopenharmony_ci    if (sequences.empty() || sequences.size() > SURFACE_MAX_QUEUE_SIZE) {
30832a6e48fSopenharmony_ci        return SURFACE_ERROR_UNKOWN;
30932a6e48fSopenharmony_ci    }
31032a6e48fSopenharmony_ci    if (!arguments.WriteUInt32Vector(sequences)) {
31132a6e48fSopenharmony_ci        return GSERROR_BINDER;
31232a6e48fSopenharmony_ci    }
31332a6e48fSopenharmony_ci    GSError ret = GSERROR_OK;
31432a6e48fSopenharmony_ci    for (uint32_t i = 0; i < sequences.size(); ++i) {
31532a6e48fSopenharmony_ci        ret = bedata[i]->WriteToParcel(arguments);
31632a6e48fSopenharmony_ci        if (ret != GSERROR_OK) {
31732a6e48fSopenharmony_ci            return ret;
31832a6e48fSopenharmony_ci        }
31932a6e48fSopenharmony_ci        if (!fences[i]->WriteToMessageParcel(arguments)) {
32032a6e48fSopenharmony_ci            return GSERROR_BINDER;
32132a6e48fSopenharmony_ci        }
32232a6e48fSopenharmony_ci        ret = WriteFlushConfig(arguments, configs[i]);
32332a6e48fSopenharmony_ci        if (ret != GSERROR_OK) {
32432a6e48fSopenharmony_ci            return ret;
32532a6e48fSopenharmony_ci        }
32632a6e48fSopenharmony_ci    }
32732a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_FLUSH_BUFFERS, arguments, reply, option);
32832a6e48fSopenharmony_ci    return CheckRetval(reply);
32932a6e48fSopenharmony_ci}
33032a6e48fSopenharmony_ci
33132a6e48fSopenharmony_ciGSError BufferClientProducer::AttachBufferToQueue(sptr<SurfaceBuffer> buffer)
33232a6e48fSopenharmony_ci{
33332a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
33432a6e48fSopenharmony_ci    uint32_t sequence = buffer->GetSeqNum();
33532a6e48fSopenharmony_ci    GSError ret = WriteSurfaceBufferImpl(arguments, sequence, buffer);
33632a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
33732a6e48fSopenharmony_ci        return ret;
33832a6e48fSopenharmony_ci    }
33932a6e48fSopenharmony_ci    ret = buffer->WriteBufferRequestConfig(arguments);
34032a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
34132a6e48fSopenharmony_ci        BLOGE("WriteBufferRequestConfig ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_);
34232a6e48fSopenharmony_ci        return ret;
34332a6e48fSopenharmony_ci    }
34432a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_ATTACH_BUFFER_TO_QUEUE, arguments, reply, option);
34532a6e48fSopenharmony_ci    return CheckRetval(reply);
34632a6e48fSopenharmony_ci}
34732a6e48fSopenharmony_ci
34832a6e48fSopenharmony_ciGSError BufferClientProducer::DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)
34932a6e48fSopenharmony_ci{
35032a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
35132a6e48fSopenharmony_ci    uint32_t sequence = buffer->GetSeqNum();
35232a6e48fSopenharmony_ci    GSError ret = WriteSurfaceBufferImpl(arguments, sequence, buffer);
35332a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
35432a6e48fSopenharmony_ci        return ret;
35532a6e48fSopenharmony_ci    }
35632a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_DETACH_BUFFER_FROM_QUEUE, arguments, reply, option);
35732a6e48fSopenharmony_ci    return CheckRetval(reply);
35832a6e48fSopenharmony_ci}
35932a6e48fSopenharmony_ci
36032a6e48fSopenharmony_ciGSError BufferClientProducer::AttachBuffer(sptr<SurfaceBuffer>& buffer)
36132a6e48fSopenharmony_ci{
36232a6e48fSopenharmony_ci    return GSERROR_NOT_SUPPORT;
36332a6e48fSopenharmony_ci}
36432a6e48fSopenharmony_ci
36532a6e48fSopenharmony_ciGSError BufferClientProducer::AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut)
36632a6e48fSopenharmony_ci{
36732a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
36832a6e48fSopenharmony_ci    uint32_t sequence = buffer->GetSeqNum();
36932a6e48fSopenharmony_ci    GSError ret = WriteSurfaceBufferImpl(arguments, sequence, buffer);
37032a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
37132a6e48fSopenharmony_ci        return ret;
37232a6e48fSopenharmony_ci    }
37332a6e48fSopenharmony_ci    if (!arguments.WriteInt32(timeOut)) {
37432a6e48fSopenharmony_ci        return GSERROR_BINDER;
37532a6e48fSopenharmony_ci    }
37632a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_ATTACH_BUFFER, arguments, reply, option);
37732a6e48fSopenharmony_ci    return CheckRetval(reply);
37832a6e48fSopenharmony_ci}
37932a6e48fSopenharmony_ci
38032a6e48fSopenharmony_ciGSError BufferClientProducer::DetachBuffer(sptr<SurfaceBuffer>& buffer)
38132a6e48fSopenharmony_ci{
38232a6e48fSopenharmony_ci    return GSERROR_NOT_SUPPORT;
38332a6e48fSopenharmony_ci}
38432a6e48fSopenharmony_ci
38532a6e48fSopenharmony_ciGSError BufferClientProducer::RegisterReleaseListener(sptr<IProducerListener> listener)
38632a6e48fSopenharmony_ci{
38732a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
38832a6e48fSopenharmony_ci
38932a6e48fSopenharmony_ci    if (!arguments.WriteRemoteObject(listener->AsObject())) {
39032a6e48fSopenharmony_ci        return GSERROR_BINDER;
39132a6e48fSopenharmony_ci    }
39232a6e48fSopenharmony_ci
39332a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_REGISTER_RELEASE_LISTENER, arguments, reply, option);
39432a6e48fSopenharmony_ci    return CheckRetval(reply);
39532a6e48fSopenharmony_ci}
39632a6e48fSopenharmony_ci
39732a6e48fSopenharmony_ciGSError BufferClientProducer::UnRegisterReleaseListener()
39832a6e48fSopenharmony_ci{
39932a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
40032a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_UNREGISTER_RELEASE_LISTENER, arguments, reply, option);
40132a6e48fSopenharmony_ci    return CheckRetval(reply);
40232a6e48fSopenharmony_ci}
40332a6e48fSopenharmony_ci
40432a6e48fSopenharmony_ciuint32_t BufferClientProducer::GetQueueSize()
40532a6e48fSopenharmony_ci{
40632a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
40732a6e48fSopenharmony_ci
40832a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_GET_QUEUE_SIZE, arguments, reply, option);
40932a6e48fSopenharmony_ci
41032a6e48fSopenharmony_ci    return reply.ReadUint32();
41132a6e48fSopenharmony_ci}
41232a6e48fSopenharmony_ci
41332a6e48fSopenharmony_ciGSError BufferClientProducer::SetQueueSize(uint32_t queueSize)
41432a6e48fSopenharmony_ci{
41532a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
41632a6e48fSopenharmony_ci
41732a6e48fSopenharmony_ci    if (!arguments.WriteUint32(queueSize)) {
41832a6e48fSopenharmony_ci        return GSERROR_BINDER;
41932a6e48fSopenharmony_ci    }
42032a6e48fSopenharmony_ci
42132a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_SET_QUEUE_SIZE, arguments, reply, option);
42232a6e48fSopenharmony_ci    return CheckRetval(reply);
42332a6e48fSopenharmony_ci}
42432a6e48fSopenharmony_ci
42532a6e48fSopenharmony_ciGSError BufferClientProducer::GetName(std::string &name)
42632a6e48fSopenharmony_ci{
42732a6e48fSopenharmony_ci    {
42832a6e48fSopenharmony_ci        std::lock_guard<std::mutex> lockGuard(mutex_);
42932a6e48fSopenharmony_ci        if (name_ != DEFAULT_NAME) {
43032a6e48fSopenharmony_ci            name = name_;
43132a6e48fSopenharmony_ci            return GSERROR_OK;
43232a6e48fSopenharmony_ci        }
43332a6e48fSopenharmony_ci    }
43432a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
43532a6e48fSopenharmony_ci
43632a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_GET_NAME, arguments, reply, option);
43732a6e48fSopenharmony_ci    GSError ret = CheckRetval(reply);
43832a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
43932a6e48fSopenharmony_ci        return ret;
44032a6e48fSopenharmony_ci    }
44132a6e48fSopenharmony_ci    if (!reply.ReadString(name)) {
44232a6e48fSopenharmony_ci        BLOGE("reply.ReadString return false, uniqueId: %{public}" PRIu64 ".", uniqueId_);
44332a6e48fSopenharmony_ci        return GSERROR_BINDER;
44432a6e48fSopenharmony_ci    }
44532a6e48fSopenharmony_ci    {
44632a6e48fSopenharmony_ci        std::lock_guard<std::mutex> lockGuard(mutex_);
44732a6e48fSopenharmony_ci        name_ = name;
44832a6e48fSopenharmony_ci    }
44932a6e48fSopenharmony_ci    return ret;
45032a6e48fSopenharmony_ci}
45132a6e48fSopenharmony_ci
45232a6e48fSopenharmony_ciuint64_t BufferClientProducer::GetUniqueId()
45332a6e48fSopenharmony_ci{
45432a6e48fSopenharmony_ci    {
45532a6e48fSopenharmony_ci        std::lock_guard<std::mutex> lockGuard(mutex_);
45632a6e48fSopenharmony_ci        if (uniqueId_ != 0) {
45732a6e48fSopenharmony_ci            return uniqueId_;
45832a6e48fSopenharmony_ci        }
45932a6e48fSopenharmony_ci    }
46032a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
46132a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_GET_UNIQUE_ID, arguments, reply, option);
46232a6e48fSopenharmony_ci    {
46332a6e48fSopenharmony_ci        std::lock_guard<std::mutex> lockGuard(mutex_);
46432a6e48fSopenharmony_ci        uniqueId_ = reply.ReadUint64();
46532a6e48fSopenharmony_ci        return uniqueId_;
46632a6e48fSopenharmony_ci    }
46732a6e48fSopenharmony_ci}
46832a6e48fSopenharmony_ci
46932a6e48fSopenharmony_ciGSError BufferClientProducer::GetNameAndUniqueId(std::string& name, uint64_t& uniqueId)
47032a6e48fSopenharmony_ci{
47132a6e48fSopenharmony_ci    {
47232a6e48fSopenharmony_ci        std::lock_guard<std::mutex> lockGuard(mutex_);
47332a6e48fSopenharmony_ci        if (uniqueId_ != 0 && name_ != DEFAULT_NAME) {
47432a6e48fSopenharmony_ci            uniqueId = uniqueId_;
47532a6e48fSopenharmony_ci            name = name_;
47632a6e48fSopenharmony_ci            return GSERROR_OK;
47732a6e48fSopenharmony_ci        }
47832a6e48fSopenharmony_ci    }
47932a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
48032a6e48fSopenharmony_ci
48132a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_GET_NAMEANDUNIQUEDID, arguments, reply, option);
48232a6e48fSopenharmony_ci    GSError ret = CheckRetval(reply);
48332a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
48432a6e48fSopenharmony_ci        return ret;
48532a6e48fSopenharmony_ci    }
48632a6e48fSopenharmony_ci    if (!reply.ReadString(name)) {
48732a6e48fSopenharmony_ci        BLOGE("reply.ReadString return false, uniqueId: %{public}" PRIu64 ".", uniqueId_);
48832a6e48fSopenharmony_ci        return GSERROR_BINDER;
48932a6e48fSopenharmony_ci    }
49032a6e48fSopenharmony_ci
49132a6e48fSopenharmony_ci    uniqueId = reply.ReadUint64();
49232a6e48fSopenharmony_ci    {
49332a6e48fSopenharmony_ci        std::lock_guard<std::mutex> lockGuard(mutex_);
49432a6e48fSopenharmony_ci        name_ = name;
49532a6e48fSopenharmony_ci        uniqueId_ = uniqueId;
49632a6e48fSopenharmony_ci    }
49732a6e48fSopenharmony_ci    return ret;
49832a6e48fSopenharmony_ci}
49932a6e48fSopenharmony_ci
50032a6e48fSopenharmony_ciint32_t BufferClientProducer::GetDefaultWidth()
50132a6e48fSopenharmony_ci{
50232a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
50332a6e48fSopenharmony_ci
50432a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_WIDTH, arguments, reply, option);
50532a6e48fSopenharmony_ci
50632a6e48fSopenharmony_ci    return reply.ReadInt32();
50732a6e48fSopenharmony_ci}
50832a6e48fSopenharmony_ci
50932a6e48fSopenharmony_ciint32_t BufferClientProducer::GetDefaultHeight()
51032a6e48fSopenharmony_ci{
51132a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
51232a6e48fSopenharmony_ci
51332a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_HEIGHT, arguments, reply, option);
51432a6e48fSopenharmony_ci
51532a6e48fSopenharmony_ci    return reply.ReadInt32();
51632a6e48fSopenharmony_ci}
51732a6e48fSopenharmony_ci
51832a6e48fSopenharmony_ciGSError BufferClientProducer::SetDefaultUsage(uint64_t usage)
51932a6e48fSopenharmony_ci{
52032a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
52132a6e48fSopenharmony_ci
52232a6e48fSopenharmony_ci    if (!arguments.WriteUint64(usage)) {
52332a6e48fSopenharmony_ci        return GSERROR_BINDER;
52432a6e48fSopenharmony_ci    }
52532a6e48fSopenharmony_ci
52632a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_SET_DEFAULT_USAGE, arguments, reply, option);
52732a6e48fSopenharmony_ci
52832a6e48fSopenharmony_ci    return CheckRetval(reply);
52932a6e48fSopenharmony_ci}
53032a6e48fSopenharmony_ci
53132a6e48fSopenharmony_ciuint64_t BufferClientProducer::GetDefaultUsage()
53232a6e48fSopenharmony_ci{
53332a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
53432a6e48fSopenharmony_ci
53532a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_USAGE, arguments, reply, option);
53632a6e48fSopenharmony_ci
53732a6e48fSopenharmony_ci    return reply.ReadUint64();
53832a6e48fSopenharmony_ci}
53932a6e48fSopenharmony_ci
54032a6e48fSopenharmony_ciGSError BufferClientProducer::CleanCache(bool cleanAll)
54132a6e48fSopenharmony_ci{
54232a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
54332a6e48fSopenharmony_ci
54432a6e48fSopenharmony_ci    if (!arguments.WriteBool(cleanAll)) {
54532a6e48fSopenharmony_ci        return GSERROR_BINDER;
54632a6e48fSopenharmony_ci    }
54732a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_CLEAN_CACHE, arguments, reply, option);
54832a6e48fSopenharmony_ci    return CheckRetval(reply);
54932a6e48fSopenharmony_ci}
55032a6e48fSopenharmony_ci
55132a6e48fSopenharmony_ciGSError BufferClientProducer::GoBackground()
55232a6e48fSopenharmony_ci{
55332a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
55432a6e48fSopenharmony_ci
55532a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_GO_BACKGROUND, arguments, reply, option);
55632a6e48fSopenharmony_ci    return CheckRetval(reply);
55732a6e48fSopenharmony_ci}
55832a6e48fSopenharmony_ci
55932a6e48fSopenharmony_ciGSError BufferClientProducer::SetTransform(GraphicTransformType transform)
56032a6e48fSopenharmony_ci{
56132a6e48fSopenharmony_ci    {
56232a6e48fSopenharmony_ci        std::lock_guard<std::mutex> lockGuard(mutex_);
56332a6e48fSopenharmony_ci        if (lastSetTransformType_ == transform) {
56432a6e48fSopenharmony_ci            return GSERROR_OK;
56532a6e48fSopenharmony_ci        }
56632a6e48fSopenharmony_ci        lastSetTransformType_ = transform;
56732a6e48fSopenharmony_ci    }
56832a6e48fSopenharmony_ci
56932a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
57032a6e48fSopenharmony_ci
57132a6e48fSopenharmony_ci    if (!arguments.WriteUint32(static_cast<uint32_t>(transform))) {
57232a6e48fSopenharmony_ci        return GSERROR_BINDER;
57332a6e48fSopenharmony_ci    }
57432a6e48fSopenharmony_ci
57532a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_SET_TRANSFORM, arguments, reply, option);
57632a6e48fSopenharmony_ci    GSError ret = CheckRetval(reply);
57732a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
57832a6e48fSopenharmony_ci        {
57932a6e48fSopenharmony_ci            std::lock_guard<std::mutex> lockGuard(mutex_);
58032a6e48fSopenharmony_ci            lastSetTransformType_ = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
58132a6e48fSopenharmony_ci        }
58232a6e48fSopenharmony_ci        return ret;
58332a6e48fSopenharmony_ci    }
58432a6e48fSopenharmony_ci
58532a6e48fSopenharmony_ci    return GSERROR_OK;
58632a6e48fSopenharmony_ci}
58732a6e48fSopenharmony_ci
58832a6e48fSopenharmony_ciGSError BufferClientProducer::IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> &infos,
58932a6e48fSopenharmony_ci                                               std::vector<bool> &supporteds)
59032a6e48fSopenharmony_ci{
59132a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
59232a6e48fSopenharmony_ci
59332a6e48fSopenharmony_ci    GSError ret = WriteVerifyAllocInfo(arguments, infos);
59432a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
59532a6e48fSopenharmony_ci        return ret;
59632a6e48fSopenharmony_ci    }
59732a6e48fSopenharmony_ci
59832a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_IS_SUPPORTED_ALLOC, arguments, reply, option);
59932a6e48fSopenharmony_ci    ret = CheckRetval(reply);
60032a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
60132a6e48fSopenharmony_ci        return ret;
60232a6e48fSopenharmony_ci    }
60332a6e48fSopenharmony_ci
60432a6e48fSopenharmony_ci    if (!reply.ReadBoolVector(&supporteds)) {
60532a6e48fSopenharmony_ci        BLOGE("reply.ReadBoolVector return false, uniqueId: %{public}" PRIu64 ".", uniqueId_);
60632a6e48fSopenharmony_ci        return GSERROR_BINDER;
60732a6e48fSopenharmony_ci    }
60832a6e48fSopenharmony_ci
60932a6e48fSopenharmony_ci    return static_cast<GSError>(ret);
61032a6e48fSopenharmony_ci}
61132a6e48fSopenharmony_ci
61232a6e48fSopenharmony_ciGSError BufferClientProducer::Connect()
61332a6e48fSopenharmony_ci{
61432a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
61532a6e48fSopenharmony_ci
61632a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_CONNECT, arguments, reply, option);
61732a6e48fSopenharmony_ci    return CheckRetval(reply);
61832a6e48fSopenharmony_ci}
61932a6e48fSopenharmony_ci
62032a6e48fSopenharmony_ciGSError BufferClientProducer::Disconnect()
62132a6e48fSopenharmony_ci{
62232a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
62332a6e48fSopenharmony_ci
62432a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_DISCONNECT, arguments, reply, option);
62532a6e48fSopenharmony_ci    return CheckRetval(reply);
62632a6e48fSopenharmony_ci}
62732a6e48fSopenharmony_ci
62832a6e48fSopenharmony_ciGSError BufferClientProducer::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
62932a6e48fSopenharmony_ci{
63032a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
63132a6e48fSopenharmony_ci    if (!arguments.WriteUint32(sequence) || !arguments.WriteInt32(static_cast<int32_t>(scalingMode))) {
63232a6e48fSopenharmony_ci        return GSERROR_BINDER;
63332a6e48fSopenharmony_ci    }
63432a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_SET_SCALING_MODE, arguments, reply, option);
63532a6e48fSopenharmony_ci    return CheckRetval(reply);
63632a6e48fSopenharmony_ci}
63732a6e48fSopenharmony_ci
63832a6e48fSopenharmony_ciGSError BufferClientProducer::SetScalingMode(ScalingMode scalingMode)
63932a6e48fSopenharmony_ci{
64032a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
64132a6e48fSopenharmony_ci    if (!arguments.WriteInt32(static_cast<int32_t>(scalingMode))) {
64232a6e48fSopenharmony_ci        return GSERROR_BINDER;
64332a6e48fSopenharmony_ci    }
64432a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_SET_SCALING_MODEV2, arguments, reply, option);
64532a6e48fSopenharmony_ci    return CheckRetval(reply);
64632a6e48fSopenharmony_ci}
64732a6e48fSopenharmony_ci
64832a6e48fSopenharmony_ciGSError BufferClientProducer::SetBufferHold(bool hold)
64932a6e48fSopenharmony_ci{
65032a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
65132a6e48fSopenharmony_ci    if (!arguments.WriteBool(hold)) {
65232a6e48fSopenharmony_ci        return GSERROR_BINDER;
65332a6e48fSopenharmony_ci    }
65432a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_SET_BUFFER_HOLD, arguments, reply, option);
65532a6e48fSopenharmony_ci    return CheckRetval(reply);
65632a6e48fSopenharmony_ci}
65732a6e48fSopenharmony_ci
65832a6e48fSopenharmony_ciGSError BufferClientProducer::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData> &metaData)
65932a6e48fSopenharmony_ci{
66032a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
66132a6e48fSopenharmony_ci    if (!arguments.WriteUint32(sequence)) {
66232a6e48fSopenharmony_ci        return GSERROR_BINDER;
66332a6e48fSopenharmony_ci    }
66432a6e48fSopenharmony_ci    GSError ret = WriteHDRMetaData(arguments, metaData);
66532a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
66632a6e48fSopenharmony_ci        return ret;
66732a6e48fSopenharmony_ci    }
66832a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_SET_METADATA, arguments, reply, option);
66932a6e48fSopenharmony_ci    return CheckRetval(reply);
67032a6e48fSopenharmony_ci}
67132a6e48fSopenharmony_ci
67232a6e48fSopenharmony_ciGSError BufferClientProducer::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
67332a6e48fSopenharmony_ci                                             const std::vector<uint8_t> &metaData)
67432a6e48fSopenharmony_ci{
67532a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
67632a6e48fSopenharmony_ci    if (!arguments.WriteUint32(sequence) || !arguments.WriteUint32(static_cast<uint32_t>(key))) {
67732a6e48fSopenharmony_ci        return GSERROR_BINDER;
67832a6e48fSopenharmony_ci    }
67932a6e48fSopenharmony_ci    GSError ret = WriteHDRMetaDataSet(arguments, metaData);
68032a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
68132a6e48fSopenharmony_ci        return ret;
68232a6e48fSopenharmony_ci    }
68332a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_SET_METADATASET, arguments, reply, option);
68432a6e48fSopenharmony_ci    return CheckRetval(reply);
68532a6e48fSopenharmony_ci}
68632a6e48fSopenharmony_ci
68732a6e48fSopenharmony_ciGSError BufferClientProducer::SetTunnelHandle(const GraphicExtDataHandle *handle)
68832a6e48fSopenharmony_ci{
68932a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
69032a6e48fSopenharmony_ci    if (handle == nullptr) {
69132a6e48fSopenharmony_ci        if (!arguments.WriteBool(false)) {
69232a6e48fSopenharmony_ci            return GSERROR_BINDER;
69332a6e48fSopenharmony_ci        }
69432a6e48fSopenharmony_ci    } else {
69532a6e48fSopenharmony_ci        if (!arguments.WriteBool(true)) {
69632a6e48fSopenharmony_ci            return GSERROR_BINDER;
69732a6e48fSopenharmony_ci        }
69832a6e48fSopenharmony_ci        GSError ret = WriteExtDataHandle(arguments, handle);
69932a6e48fSopenharmony_ci        if (ret != GSERROR_OK) {
70032a6e48fSopenharmony_ci            return ret;
70132a6e48fSopenharmony_ci        }
70232a6e48fSopenharmony_ci    }
70332a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_SET_TUNNEL_HANDLE, arguments, reply, option);
70432a6e48fSopenharmony_ci    return CheckRetval(reply);
70532a6e48fSopenharmony_ci}
70632a6e48fSopenharmony_ci
70732a6e48fSopenharmony_ciGSError BufferClientProducer::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type, int64_t &time)
70832a6e48fSopenharmony_ci{
70932a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
71032a6e48fSopenharmony_ci    if (!arguments.WriteUint32(sequence) || !arguments.WriteUint32(static_cast<uint32_t>(type))) {
71132a6e48fSopenharmony_ci        return GSERROR_BINDER;
71232a6e48fSopenharmony_ci    }
71332a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_GET_PRESENT_TIMESTAMP, arguments, reply, option);
71432a6e48fSopenharmony_ci    GSError ret = CheckRetval(reply);
71532a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
71632a6e48fSopenharmony_ci        return ret;
71732a6e48fSopenharmony_ci    }
71832a6e48fSopenharmony_ci    time = reply.ReadInt64();
71932a6e48fSopenharmony_ci    return static_cast<GSError>(ret);
72032a6e48fSopenharmony_ci}
72132a6e48fSopenharmony_ci
72232a6e48fSopenharmony_cisptr<NativeSurface> BufferClientProducer::GetNativeSurface()
72332a6e48fSopenharmony_ci{
72432a6e48fSopenharmony_ci    return nullptr;
72532a6e48fSopenharmony_ci}
72632a6e48fSopenharmony_ci
72732a6e48fSopenharmony_ciGSError BufferClientProducer::GetTransform(GraphicTransformType &transform)
72832a6e48fSopenharmony_ci{
72932a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
73032a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_GET_TRANSFORM, arguments, reply, option);
73132a6e48fSopenharmony_ci
73232a6e48fSopenharmony_ci    GSError ret = CheckRetval(reply);
73332a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
73432a6e48fSopenharmony_ci        return ret;
73532a6e48fSopenharmony_ci    }
73632a6e48fSopenharmony_ci    transform = static_cast<GraphicTransformType>(reply.ReadUint32());
73732a6e48fSopenharmony_ci    return GSERROR_OK;
73832a6e48fSopenharmony_ci}
73932a6e48fSopenharmony_ci
74032a6e48fSopenharmony_ciGSError BufferClientProducer::GetTransformHint(GraphicTransformType &transformHint)
74132a6e48fSopenharmony_ci{
74232a6e48fSopenharmony_ci    return GSERROR_NOT_SUPPORT;
74332a6e48fSopenharmony_ci}
74432a6e48fSopenharmony_ci
74532a6e48fSopenharmony_ciGSError BufferClientProducer::SetTransformHint(GraphicTransformType transformHint)
74632a6e48fSopenharmony_ci{
74732a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
74832a6e48fSopenharmony_ci
74932a6e48fSopenharmony_ci    if (!arguments.WriteUint32(static_cast<uint32_t>(transformHint))) {
75032a6e48fSopenharmony_ci        return GSERROR_BINDER;
75132a6e48fSopenharmony_ci    }
75232a6e48fSopenharmony_ci
75332a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_SET_TRANSFORMHINT, arguments, reply, option);
75432a6e48fSopenharmony_ci    return CheckRetval(reply);
75532a6e48fSopenharmony_ci}
75632a6e48fSopenharmony_ci
75732a6e48fSopenharmony_ciGSError BufferClientProducer::SetSurfaceSourceType(OHSurfaceSource sourceType)
75832a6e48fSopenharmony_ci{
75932a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
76032a6e48fSopenharmony_ci    if (!arguments.WriteUint32(static_cast<uint32_t>(sourceType))) {
76132a6e48fSopenharmony_ci        return GSERROR_BINDER;
76232a6e48fSopenharmony_ci    }
76332a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_SET_SOURCE_TYPE, arguments, reply, option);
76432a6e48fSopenharmony_ci    return CheckRetval(reply);
76532a6e48fSopenharmony_ci}
76632a6e48fSopenharmony_ci
76732a6e48fSopenharmony_ciGSError BufferClientProducer::GetSurfaceSourceType(OHSurfaceSource &sourceType)
76832a6e48fSopenharmony_ci{
76932a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
77032a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_GET_SOURCE_TYPE, arguments, reply, option);
77132a6e48fSopenharmony_ci    GSError ret = CheckRetval(reply);
77232a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
77332a6e48fSopenharmony_ci        return ret;
77432a6e48fSopenharmony_ci    }
77532a6e48fSopenharmony_ci    sourceType = static_cast<OHSurfaceSource>(reply.ReadUint32());
77632a6e48fSopenharmony_ci    return GSERROR_OK;
77732a6e48fSopenharmony_ci}
77832a6e48fSopenharmony_ci
77932a6e48fSopenharmony_ciGSError BufferClientProducer::SetSurfaceAppFrameworkType(std::string appFrameworkType)
78032a6e48fSopenharmony_ci{
78132a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
78232a6e48fSopenharmony_ci    if (!arguments.WriteString(appFrameworkType)) {
78332a6e48fSopenharmony_ci        return GSERROR_BINDER;
78432a6e48fSopenharmony_ci    }
78532a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_SET_APP_FRAMEWORK_TYPE, arguments, reply, option);
78632a6e48fSopenharmony_ci    return CheckRetval(reply);
78732a6e48fSopenharmony_ci}
78832a6e48fSopenharmony_ci
78932a6e48fSopenharmony_ciGSError BufferClientProducer::GetSurfaceAppFrameworkType(std::string &appFrameworkType)
79032a6e48fSopenharmony_ci{
79132a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
79232a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_GET_APP_FRAMEWORK_TYPE, arguments, reply, option);
79332a6e48fSopenharmony_ci    GSError ret = CheckRetval(reply);
79432a6e48fSopenharmony_ci    if (ret != GSERROR_OK) {
79532a6e48fSopenharmony_ci        return ret;
79632a6e48fSopenharmony_ci    }
79732a6e48fSopenharmony_ci    appFrameworkType = static_cast<std::string>(reply.ReadString());
79832a6e48fSopenharmony_ci    return GSERROR_OK;
79932a6e48fSopenharmony_ci}
80032a6e48fSopenharmony_ci
80132a6e48fSopenharmony_ciGSError BufferClientProducer::SetHdrWhitePointBrightness(float brightness)
80232a6e48fSopenharmony_ci{
80332a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
80432a6e48fSopenharmony_ci
80532a6e48fSopenharmony_ci    if (!arguments.WriteFloat(brightness)) {
80632a6e48fSopenharmony_ci        return GSERROR_BINDER;
80732a6e48fSopenharmony_ci    }
80832a6e48fSopenharmony_ci
80932a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_SET_HDRWHITEPOINTBRIGHTNESS, arguments, reply, option);
81032a6e48fSopenharmony_ci    return CheckRetval(reply);
81132a6e48fSopenharmony_ci}
81232a6e48fSopenharmony_ci
81332a6e48fSopenharmony_ciGSError BufferClientProducer::SetSdrWhitePointBrightness(float brightness)
81432a6e48fSopenharmony_ci{
81532a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
81632a6e48fSopenharmony_ci
81732a6e48fSopenharmony_ci    if (!arguments.WriteFloat(brightness)) {
81832a6e48fSopenharmony_ci        return GSERROR_BINDER;
81932a6e48fSopenharmony_ci    }
82032a6e48fSopenharmony_ci
82132a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_SET_SDRWHITEPOINTBRIGHTNESS, arguments, reply, option);
82232a6e48fSopenharmony_ci    return CheckRetval(reply);
82332a6e48fSopenharmony_ci}
82432a6e48fSopenharmony_ci
82532a6e48fSopenharmony_ciGSError BufferClientProducer::AcquireLastFlushedBuffer(sptr<SurfaceBuffer> &buffer, sptr<SyncFence> &fence,
82632a6e48fSopenharmony_ci    float matrix[16], uint32_t matrixSize, bool isUseNewMatrix)
82732a6e48fSopenharmony_ci{
82832a6e48fSopenharmony_ci    return GetLastFlushedBufferCommon(buffer, fence,
82932a6e48fSopenharmony_ci        matrix, matrixSize, isUseNewMatrix, BUFFER_PRODUCER_ACQUIRE_LAST_FLUSHED_BUFFER);
83032a6e48fSopenharmony_ci}
83132a6e48fSopenharmony_ci
83232a6e48fSopenharmony_ciGSError BufferClientProducer::ReleaseLastFlushedBuffer(uint32_t sequence)
83332a6e48fSopenharmony_ci{
83432a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
83532a6e48fSopenharmony_ci    if (!arguments.WriteUint32(sequence)) {
83632a6e48fSopenharmony_ci        return GSERROR_BINDER;
83732a6e48fSopenharmony_ci    }
83832a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_RELEASE_LAST_FLUSHED_BUFFER, arguments, reply, option);
83932a6e48fSopenharmony_ci    return CheckRetval(reply);
84032a6e48fSopenharmony_ci}
84132a6e48fSopenharmony_ci
84232a6e48fSopenharmony_ciGSError BufferClientProducer::SetGlobalAlpha(int32_t alpha)
84332a6e48fSopenharmony_ci{
84432a6e48fSopenharmony_ci    DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
84532a6e48fSopenharmony_ci    if (!arguments.WriteInt32(alpha)) {
84632a6e48fSopenharmony_ci        return GSERROR_BINDER;
84732a6e48fSopenharmony_ci    }
84832a6e48fSopenharmony_ci    SEND_REQUEST(BUFFER_PRODUCER_SET_GLOBALALPHA, arguments, reply, option);
84932a6e48fSopenharmony_ci    return CheckRetval(reply);
85032a6e48fSopenharmony_ci}
85132a6e48fSopenharmony_ci}; // namespace OHOS
852