• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2025 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "buffer_client_producer.h"
17 
18 #include <cinttypes>
19 
20 #include <iremote_stub.h>
21 #include "buffer_log.h"
22 #include "buffer_utils.h"
23 #include "hebc_white_list.h"
24 #include "sync_fence.h"
25 #include "message_option.h"
26 #include "securec.h"
27 #include "rs_frame_report_ext.h"
28 
29 #define DEFINE_MESSAGE_VARIABLES(arg, ret, opt)                            \
30     MessageOption opt;                                                     \
31     MessageParcel arg;                                                     \
32     MessageParcel ret;                                                     \
33     do {                                                                   \
34         GSError retCode = MessageVariables(arg);                           \
35         if (retCode != GSERROR_OK) {                                       \
36             return retCode;                                                \
37         }                                                                  \
38     } while (0)
39 
40 #define SEND_REQUEST(COMMAND, arguments, reply, option)                    \
41     do {                                                                   \
42         GSError ret = SendRequest(COMMAND, arguments, reply, option);      \
43         if (ret != GSERROR_OK) {                                           \
44             return ret;                                                    \
45         }                                                                  \
46     } while (0)
47 
48 namespace OHOS {
49 namespace {
50     constexpr size_t MATRIX4_SIZE = 16;
51 }
BufferClientProducer(const sptr<IRemoteObject> & impl)52 BufferClientProducer::BufferClientProducer(const sptr<IRemoteObject>& impl)
53     : IRemoteProxy<IBufferProducer>(impl)
54 {
55 }
56 
~BufferClientProducer()57 BufferClientProducer::~BufferClientProducer()
58 {
59 }
60 
MessageVariables(MessageParcel & arg)61 GSError BufferClientProducer::MessageVariables(MessageParcel &arg)
62 {
63     if (!(arg).WriteInterfaceToken(GetDescriptor())) {
64         BLOGE("WriteInterfaceToken failed, uniqueId: %{public}" PRIu64 ".", uniqueId_);
65         return GSERROR_BINDER;
66     }
67     return GSERROR_OK;
68 }
69 
SendRequest(uint32_t command,MessageParcel & arg,MessageParcel & reply,MessageOption & opt)70 GSError BufferClientProducer::SendRequest(uint32_t command, MessageParcel &arg,
71                                           MessageParcel &reply, MessageOption &opt)
72 {
73     sptr<IRemoteObject> remote = Remote();
74     if (remote == nullptr) {
75         BLOGE("Remote is nullptr, uniqueId: %{public}" PRIu64 ".", uniqueId_);
76         return GSERROR_SERVER_ERROR;
77     }
78     int32_t ret = remote->SendRequest(command, arg, reply, opt);
79     if (ret != ERR_NONE) {
80         BLOGE("SendRequest ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_);
81         return GSERROR_BINDER;
82     }
83     return GSERROR_OK;
84 }
85 
CheckRetval(MessageParcel & reply)86 GSError BufferClientProducer::CheckRetval(MessageParcel &reply)
87 {
88     int32_t ret = reply.ReadInt32();
89     if (ret != GSERROR_OK) {
90         BLOGE("Remote ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_);
91         return static_cast<GSError>(ret);
92     }
93     return GSERROR_OK;
94 }
95 
RequestBufferCommon(const BufferRequestConfig & config,sptr<BufferExtraData> & bedata,RequestBufferReturnValue & retval,uint32_t command)96 GSError BufferClientProducer::RequestBufferCommon(const BufferRequestConfig &config, sptr<BufferExtraData> &bedata,
97                                                   RequestBufferReturnValue &retval, uint32_t command)
98 {
99     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
100 
101     GSError ret = WriteRequestConfig(arguments, config);
102     if (ret != GSERROR_OK) {
103         return ret;
104     }
105 
106     retval.isConnected = false;
107     SEND_REQUEST(command, arguments, reply, option);
108     ret = CheckRetval(reply);
109     if (ret != GSERROR_OK) {
110         reply.ReadBool(retval.isConnected);
111         return ret;
112     }
113 
114     ret = ReadSurfaceBufferImpl(reply, retval.sequence, retval.buffer);
115     if (ret != GSERROR_OK) {
116         return SURFACE_ERROR_UNKOWN;
117     }
118     if (retval.buffer != nullptr) {
119         BufferRequestConfig updateConfig = config;
120         updateConfig.usage = reply.ReadUint64();  // consumer may change input usgae by defaultUsage
121         retval.buffer->SetBufferRequestConfig(updateConfig);
122     }
123 
124     ret = bedata->ReadFromParcel(reply);
125     if (ret != GSERROR_OK) {
126         return SURFACE_ERROR_UNKOWN;
127     }
128     retval.fence = SyncFence::ReadFromMessageParcel(reply);
129     if (!reply.ReadUInt32Vector(&retval.deletingBuffers)) {
130         return GSERROR_BINDER;
131     }
132 
133     return GSERROR_OK;
134 }
135 
RequestBuffer(const BufferRequestConfig & config,sptr<BufferExtraData> & bedata,RequestBufferReturnValue & retval)136 GSError BufferClientProducer::RequestBuffer(const BufferRequestConfig &config, sptr<BufferExtraData> &bedata,
137                                             RequestBufferReturnValue &retval)
138 {
139     return RequestBufferCommon(config, bedata, retval, BUFFER_PRODUCER_REQUEST_BUFFER);
140 }
141 
RequestBuffers(const BufferRequestConfig & config,std::vector<sptr<BufferExtraData>> & bedata,std::vector<RequestBufferReturnValue> & retvalues)142 GSError BufferClientProducer::RequestBuffers(const BufferRequestConfig &config,
143     std::vector<sptr<BufferExtraData>> &bedata, std::vector<RequestBufferReturnValue> &retvalues)
144 {
145     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
146 
147     uint32_t num = static_cast<uint32_t>(bedata.size());
148     if (!arguments.WriteUint32(num)) {
149         return GSERROR_BINDER;
150     }
151     GSError ret = WriteRequestConfig(arguments, config);
152     if (ret != GSERROR_OK) {
153         return ret;
154     }
155     retvalues[0].isConnected = false;
156     SEND_REQUEST(BUFFER_PRODUCER_REQUEST_BUFFERS, arguments, reply, option);
157     ret = CheckRetval(reply);
158     if (ret != GSERROR_OK && ret != GSERROR_NO_BUFFER) {
159         reply.ReadBool(retvalues[0].isConnected);
160         return ret;
161     }
162 
163     num = reply.ReadUint32();
164     if (num > SURFACE_MAX_QUEUE_SIZE || num == 0) {
165         BLOGE("num is invalid, %{public}u, uniqueId: %{public}" PRIu64 ".", num, uniqueId_);
166         return SURFACE_ERROR_UNKOWN;
167     }
168 
169     ret = GSERROR_OK;
170     retvalues.resize(num);
171     for (size_t i = 0; i < num; ++i) {
172         auto &retval = retvalues[i];
173         ret = ReadSurfaceBufferImpl(reply, retval.sequence, retval.buffer);
174         if (ret != GSERROR_OK) {
175             return SURFACE_ERROR_UNKOWN;
176         }
177         if (retval.buffer != nullptr) {
178             BufferRequestConfig updateConfig = config;
179             updateConfig.usage = reply.ReadUint64();  // consumer may change input usgae by defaultUsage
180             retval.buffer->SetBufferRequestConfig(updateConfig);
181         }
182         ret = bedata[i]->ReadFromParcel(reply);
183         if (ret != GSERROR_OK) {
184             return SURFACE_ERROR_UNKOWN;
185         }
186         retval.fence = SyncFence::ReadFromMessageParcel(reply);
187         if (!reply.ReadUInt32Vector(&retval.deletingBuffers)) {
188             return GSERROR_BINDER;
189         }
190     }
191     return ret;
192 }
193 
GetLastFlushedBufferCommon(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],uint32_t matrixSize,bool isUseNewMatrix,uint32_t command)194 GSError BufferClientProducer::GetLastFlushedBufferCommon(sptr<SurfaceBuffer>& buffer,
195     sptr<SyncFence>& fence, float matrix[16], uint32_t matrixSize, bool isUseNewMatrix, uint32_t command)
196 {
197     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
198     if (!arguments.WriteBool(isUseNewMatrix)) {
199         return GSERROR_BINDER;
200     }
201     SEND_REQUEST(command, arguments, reply, option);
202     GSError ret = CheckRetval(reply);
203     if (ret != GSERROR_OK) {
204         return ret;
205     }
206     uint32_t sequence;
207     ret = ReadSurfaceBufferImpl(reply, sequence, buffer);
208     if (ret != GSERROR_OK) {
209         return SURFACE_ERROR_UNKOWN;
210     }
211     if (buffer == nullptr) {
212         return SURFACE_ERROR_NULLPTR;
213     }
214     ret = buffer->ReadBufferRequestConfig(reply);
215     if (ret != GSERROR_OK) {
216         return SURFACE_ERROR_UNKOWN;
217     }
218 
219     fence = SyncFence::ReadFromMessageParcel(reply);
220     std::vector<float> readMatrixVector;
221     if (!reply.ReadFloatVector(&readMatrixVector)) {
222         return GSERROR_BINDER;
223     }
224     if (readMatrixVector.size() != MATRIX4_SIZE) {
225         return GSERROR_INVALID_ARGUMENTS;
226     }
227     if (memcpy_s(matrix, matrixSize * sizeof(float),
228         readMatrixVector.data(), readMatrixVector.size() * sizeof(float)) != EOK) {
229         BLOGE("memcpy_s fail, uniqueId: %{public}" PRIu64 ".", uniqueId_);
230         return SURFACE_ERROR_UNKOWN;
231     }
232     return GSERROR_OK;
233 }
234 
GetLastFlushedBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],bool isUseNewMatrix)235 GSError BufferClientProducer::GetLastFlushedBuffer(sptr<SurfaceBuffer>& buffer,
236     sptr<SyncFence>& fence, float matrix[16], bool isUseNewMatrix)
237 {
238     return GetLastFlushedBufferCommon(buffer, fence,
239         matrix, MATRIX4_SIZE, isUseNewMatrix, BUFFER_PRODUCER_GET_LAST_FLUSHED_BUFFER);
240 }
241 
GetProducerInitInfo(ProducerInitInfo & info)242 GSError BufferClientProducer::GetProducerInitInfo(ProducerInitInfo &info)
243 {
244     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
245     token_ = new IRemoteStub<IBufferProducerToken>();
246     HebcWhiteList::GetInstance().GetApplicationName(info.appName);
247     if (!arguments.WriteRemoteObject(token_->AsObject()) || !arguments.WriteString(info.appName)) {
248         return GSERROR_BINDER;
249     }
250     if (info.propertyListener && !arguments.WriteRemoteObject(info.propertyListener->AsObject())) {
251         return GSERROR_BINDER;
252     }
253     SEND_REQUEST(BUFFER_PRODUCER_GET_INIT_INFO, arguments, reply, option);
254     if (!reply.ReadInt32(info.width) || !reply.ReadInt32(info.height) ||
255         !reply.ReadUint64(info.uniqueId)) {
256         return GSERROR_BINDER;
257     }
258     uniqueId_ = info.uniqueId;
259     if (!reply.ReadString(info.name) || !reply.ReadBool(info.isInHebcList) || !reply.ReadString(info.bufferName) ||
260         !reply.ReadUint64(info.producerId) || !reply.ReadInt32(info.transformHint)) {
261         return GSERROR_BINDER;
262     }
263     return CheckRetval(reply);
264 }
265 
CancelBuffer(uint32_t sequence,sptr<BufferExtraData> bedata)266 GSError BufferClientProducer::CancelBuffer(uint32_t sequence, sptr<BufferExtraData> bedata)
267 {
268     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
269 
270     if (!arguments.WriteUint32(sequence)) {
271         return GSERROR_BINDER;
272     }
273     GSError ret = bedata->WriteToParcel(arguments);
274     if (ret != GSERROR_OK) {
275         return GSERROR_BINDER;
276     }
277 
278     SEND_REQUEST(BUFFER_PRODUCER_CANCEL_BUFFER, arguments, reply, option);
279     return CheckRetval(reply);
280 }
281 
FlushBuffer(uint32_t sequence,sptr<BufferExtraData> bedata,sptr<SyncFence> fence,BufferFlushConfigWithDamages & config)282 GSError BufferClientProducer::FlushBuffer(uint32_t sequence, sptr<BufferExtraData> bedata,
283                                           sptr<SyncFence> fence, BufferFlushConfigWithDamages &config)
284 {
285     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
286 
287     if (!arguments.WriteUint32(sequence)) {
288         return GSERROR_BINDER;
289     }
290     GSError ret = bedata->WriteToParcel(arguments);
291     if (ret != GSERROR_OK) {
292         return ret;
293     }
294     if (!fence->WriteToMessageParcel(arguments)) {
295         return GSERROR_BINDER;
296     }
297     ret = WriteFlushConfig(arguments, config);
298     if (ret != GSERROR_OK) {
299         return ret;
300     }
301 
302     SEND_REQUEST(BUFFER_PRODUCER_FLUSH_BUFFER, arguments, reply, option);
303     ret = CheckRetval(reply);
304     if (ret != GSERROR_OK) {
305         return ret;
306     }
307 
308     if (OHOS::RsFrameReportExt::GetInstance().GetEnable()) {
309         OHOS::RsFrameReportExt::GetInstance().HandleSwapBuffer();
310     }
311     return GSERROR_OK;
312 }
313 
FlushBuffers(const std::vector<uint32_t> & sequences,const std::vector<sptr<BufferExtraData>> & bedata,const std::vector<sptr<SyncFence>> & fences,const std::vector<BufferFlushConfigWithDamages> & configs)314 GSError BufferClientProducer::FlushBuffers(const std::vector<uint32_t> &sequences,
315     const std::vector<sptr<BufferExtraData>> &bedata,
316     const std::vector<sptr<SyncFence>> &fences,
317     const std::vector<BufferFlushConfigWithDamages> &configs)
318 {
319     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
320 
321     if (sequences.empty() || sequences.size() > SURFACE_MAX_QUEUE_SIZE) {
322         return SURFACE_ERROR_UNKOWN;
323     }
324     if (!arguments.WriteUInt32Vector(sequences)) {
325         return GSERROR_BINDER;
326     }
327     GSError ret = GSERROR_OK;
328     for (uint32_t i = 0; i < sequences.size(); ++i) {
329         ret = bedata[i]->WriteToParcel(arguments);
330         if (ret != GSERROR_OK) {
331             return ret;
332         }
333         if (!fences[i]->WriteToMessageParcel(arguments)) {
334             return GSERROR_BINDER;
335         }
336         ret = WriteFlushConfig(arguments, configs[i]);
337         if (ret != GSERROR_OK) {
338             return ret;
339         }
340     }
341     SEND_REQUEST(BUFFER_PRODUCER_FLUSH_BUFFERS, arguments, reply, option);
342     return CheckRetval(reply);
343 }
344 
AttachBufferToQueue(sptr<SurfaceBuffer> buffer)345 GSError BufferClientProducer::AttachBufferToQueue(sptr<SurfaceBuffer> buffer)
346 {
347     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
348     uint32_t sequence = buffer->GetSeqNum();
349     GSError ret = WriteSurfaceBufferImpl(arguments, sequence, buffer);
350     if (ret != GSERROR_OK) {
351         return ret;
352     }
353     ret = buffer->WriteBufferRequestConfig(arguments);
354     if (ret != GSERROR_OK) {
355         BLOGE("WriteBufferRequestConfig ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_);
356         return ret;
357     }
358     SEND_REQUEST(BUFFER_PRODUCER_ATTACH_BUFFER_TO_QUEUE, arguments, reply, option);
359     return CheckRetval(reply);
360 }
361 
DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)362 GSError BufferClientProducer::DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)
363 {
364     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
365     uint32_t sequence = buffer->GetSeqNum();
366     GSError ret = WriteSurfaceBufferImpl(arguments, sequence, buffer);
367     if (ret != GSERROR_OK) {
368         return ret;
369     }
370     SEND_REQUEST(BUFFER_PRODUCER_DETACH_BUFFER_FROM_QUEUE, arguments, reply, option);
371     return CheckRetval(reply);
372 }
373 
AttachBuffer(sptr<SurfaceBuffer> & buffer)374 GSError BufferClientProducer::AttachBuffer(sptr<SurfaceBuffer>& buffer)
375 {
376     return GSERROR_NOT_SUPPORT;
377 }
378 
AttachBuffer(sptr<SurfaceBuffer> & buffer,int32_t timeOut)379 GSError BufferClientProducer::AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut)
380 {
381     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
382     uint32_t sequence = buffer->GetSeqNum();
383     GSError ret = WriteSurfaceBufferImpl(arguments, sequence, buffer);
384     if (ret != GSERROR_OK) {
385         return ret;
386     }
387     if (!arguments.WriteInt32(timeOut)) {
388         return GSERROR_BINDER;
389     }
390     SEND_REQUEST(BUFFER_PRODUCER_ATTACH_BUFFER, arguments, reply, option);
391     return CheckRetval(reply);
392 }
393 
DetachBuffer(sptr<SurfaceBuffer> & buffer)394 GSError BufferClientProducer::DetachBuffer(sptr<SurfaceBuffer>& buffer)
395 {
396     return GSERROR_NOT_SUPPORT;
397 }
398 
RegisterReleaseListener(sptr<IProducerListener> listener)399 GSError BufferClientProducer::RegisterReleaseListener(sptr<IProducerListener> listener)
400 {
401     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
402 
403     if (!arguments.WriteRemoteObject(listener->AsObject())) {
404         return GSERROR_BINDER;
405     }
406 
407     SEND_REQUEST(BUFFER_PRODUCER_REGISTER_RELEASE_LISTENER, arguments, reply, option);
408     return CheckRetval(reply);
409 }
410 
RegisterPropertyListener(sptr<IProducerListener> listener,uint64_t producerId)411 GSError BufferClientProducer::RegisterPropertyListener(sptr<IProducerListener> listener, uint64_t producerId)
412 {
413     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
414 
415     if (!arguments.WriteRemoteObject(listener->AsObject())) {
416         return GSERROR_BINDER;
417     }
418     if (!arguments.WriteUint64(producerId)) {
419         return GSERROR_BINDER;
420     }
421 
422     SEND_REQUEST(BUFFER_PRODUCER_REGISTER_PROPERTY_LISTENER, arguments, reply, option);
423     return CheckRetval(reply);
424 }
425 
UnRegisterPropertyListener(uint64_t producerId)426 GSError BufferClientProducer::UnRegisterPropertyListener(uint64_t producerId)
427 {
428     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
429 
430     if (!arguments.WriteUint64(producerId)) {
431         return GSERROR_BINDER;
432     }
433 
434     SEND_REQUEST(BUFFER_PRODUCER_UNREGISTER_PROPERTY_LISTENER, arguments, reply, option);
435     return CheckRetval(reply);
436 }
437 
RegisterReleaseListenerBackup(sptr<IProducerListener> listener)438 GSError BufferClientProducer::RegisterReleaseListenerBackup(sptr<IProducerListener> listener)
439 {
440     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
441 
442     if (listener == nullptr) {
443         return GSERROR_INVALID_ARGUMENTS;
444     }
445 
446     if (!arguments.WriteRemoteObject(listener->AsObject())) {
447         return GSERROR_BINDER;
448     }
449 
450     SEND_REQUEST(BUFFER_PRODUCER_REGISTER_RELEASE_LISTENER_BACKUP, arguments, reply, option);
451     return CheckRetval(reply);
452 }
453 
UnRegisterReleaseListener()454 GSError BufferClientProducer::UnRegisterReleaseListener()
455 {
456     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
457     SEND_REQUEST(BUFFER_PRODUCER_UNREGISTER_RELEASE_LISTENER, arguments, reply, option);
458     return CheckRetval(reply);
459 }
460 
UnRegisterReleaseListenerBackup()461 GSError BufferClientProducer::UnRegisterReleaseListenerBackup()
462 {
463     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
464     SEND_REQUEST(BUFFER_PRODUCER_UNREGISTER_RELEASE_LISTENER_BACKUP, arguments, reply, option);
465     return CheckRetval(reply);
466 }
467 
GetQueueSize()468 uint32_t BufferClientProducer::GetQueueSize()
469 {
470     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
471 
472     SEND_REQUEST(BUFFER_PRODUCER_GET_QUEUE_SIZE, arguments, reply, option);
473 
474     return reply.ReadUint32();
475 }
476 
SetQueueSize(uint32_t queueSize)477 GSError BufferClientProducer::SetQueueSize(uint32_t queueSize)
478 {
479     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
480 
481     if (!arguments.WriteUint32(queueSize)) {
482         return GSERROR_BINDER;
483     }
484 
485     SEND_REQUEST(BUFFER_PRODUCER_SET_QUEUE_SIZE, arguments, reply, option);
486     return CheckRetval(reply);
487 }
488 
GetName(std::string & name)489 GSError BufferClientProducer::GetName(std::string &name)
490 {
491     {
492         std::lock_guard<std::mutex> lockGuard(mutex_);
493         if (name_ != DEFAULT_NAME) {
494             name = name_;
495             return GSERROR_OK;
496         }
497     }
498     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
499 
500     SEND_REQUEST(BUFFER_PRODUCER_GET_NAME, arguments, reply, option);
501     GSError ret = CheckRetval(reply);
502     if (ret != GSERROR_OK) {
503         return ret;
504     }
505     if (!reply.ReadString(name)) {
506         BLOGE("reply.ReadString return false, uniqueId: %{public}" PRIu64 ".", uniqueId_);
507         return GSERROR_BINDER;
508     }
509     {
510         std::lock_guard<std::mutex> lockGuard(mutex_);
511         name_ = name;
512     }
513     return ret;
514 }
515 
GetUniqueId()516 uint64_t BufferClientProducer::GetUniqueId()
517 {
518     {
519         std::lock_guard<std::mutex> lockGuard(mutex_);
520         if (uniqueId_ != 0) {
521             return uniqueId_;
522         }
523     }
524     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
525     SEND_REQUEST(BUFFER_PRODUCER_GET_UNIQUE_ID, arguments, reply, option);
526     {
527         std::lock_guard<std::mutex> lockGuard(mutex_);
528         uniqueId_ = reply.ReadUint64();
529         return uniqueId_;
530     }
531 }
532 
GetNameAndUniqueId(std::string & name,uint64_t & uniqueId)533 GSError BufferClientProducer::GetNameAndUniqueId(std::string& name, uint64_t& uniqueId)
534 {
535     {
536         std::lock_guard<std::mutex> lockGuard(mutex_);
537         if (uniqueId_ != 0 && name_ != DEFAULT_NAME) {
538             uniqueId = uniqueId_;
539             name = name_;
540             return GSERROR_OK;
541         }
542     }
543     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
544 
545     SEND_REQUEST(BUFFER_PRODUCER_GET_NAMEANDUNIQUEDID, arguments, reply, option);
546     GSError ret = CheckRetval(reply);
547     if (ret != GSERROR_OK) {
548         return ret;
549     }
550     if (!reply.ReadString(name)) {
551         BLOGE("reply.ReadString return false, uniqueId: %{public}" PRIu64 ".", uniqueId_);
552         return GSERROR_BINDER;
553     }
554 
555     uniqueId = reply.ReadUint64();
556     {
557         std::lock_guard<std::mutex> lockGuard(mutex_);
558         name_ = name;
559         uniqueId_ = uniqueId;
560     }
561     return ret;
562 }
563 
GetDefaultWidth()564 int32_t BufferClientProducer::GetDefaultWidth()
565 {
566     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
567 
568     SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_WIDTH, arguments, reply, option);
569 
570     return reply.ReadInt32();
571 }
572 
GetDefaultHeight()573 int32_t BufferClientProducer::GetDefaultHeight()
574 {
575     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
576 
577     SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_HEIGHT, arguments, reply, option);
578 
579     return reply.ReadInt32();
580 }
581 
SetDefaultUsage(uint64_t usage)582 GSError BufferClientProducer::SetDefaultUsage(uint64_t usage)
583 {
584     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
585 
586     if (!arguments.WriteUint64(usage)) {
587         return GSERROR_BINDER;
588     }
589 
590     SEND_REQUEST(BUFFER_PRODUCER_SET_DEFAULT_USAGE, arguments, reply, option);
591 
592     return CheckRetval(reply);
593 }
594 
GetDefaultUsage()595 uint64_t BufferClientProducer::GetDefaultUsage()
596 {
597     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
598 
599     SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_USAGE, arguments, reply, option);
600 
601     return reply.ReadUint64();
602 }
603 
CleanCache(bool cleanAll,uint32_t * bufSeqNum)604 GSError BufferClientProducer::CleanCache(bool cleanAll, uint32_t *bufSeqNum)
605 {
606     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
607 
608     if (!arguments.WriteBool(cleanAll)) {
609         return GSERROR_BINDER;
610     }
611     SEND_REQUEST(BUFFER_PRODUCER_CLEAN_CACHE, arguments, reply, option);
612     GSError ret = CheckRetval(reply);
613     if (ret == GSERROR_OK && bufSeqNum != nullptr) {
614         *bufSeqNum = reply.ReadUint32();
615     }
616     return ret;
617 }
618 
GoBackground()619 GSError BufferClientProducer::GoBackground()
620 {
621     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
622 
623     SEND_REQUEST(BUFFER_PRODUCER_GO_BACKGROUND, arguments, reply, option);
624     return CheckRetval(reply);
625 }
626 
SetTransform(GraphicTransformType transform)627 GSError BufferClientProducer::SetTransform(GraphicTransformType transform)
628 {
629     {
630         std::lock_guard<std::mutex> lockGuard(mutex_);
631         if (lastSetTransformType_ == transform) {
632             return GSERROR_OK;
633         }
634         lastSetTransformType_ = transform;
635     }
636 
637     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
638 
639     if (!arguments.WriteUint32(static_cast<uint32_t>(transform))) {
640         return GSERROR_BINDER;
641     }
642 
643     SEND_REQUEST(BUFFER_PRODUCER_SET_TRANSFORM, arguments, reply, option);
644     GSError ret = CheckRetval(reply);
645     if (ret != GSERROR_OK) {
646         {
647             std::lock_guard<std::mutex> lockGuard(mutex_);
648             lastSetTransformType_ = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
649         }
650         return ret;
651     }
652 
653     return GSERROR_OK;
654 }
655 
Connect()656 GSError BufferClientProducer::Connect()
657 {
658     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
659 
660     SEND_REQUEST(BUFFER_PRODUCER_CONNECT, arguments, reply, option);
661     return CheckRetval(reply);
662 }
663 
Disconnect(uint32_t * bufSeqNum)664 GSError BufferClientProducer::Disconnect(uint32_t *bufSeqNum)
665 {
666     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
667 
668     SEND_REQUEST(BUFFER_PRODUCER_DISCONNECT, arguments, reply, option);
669     GSError ret = CheckRetval(reply);
670     if (ret == GSERROR_OK && bufSeqNum != nullptr) {
671         *bufSeqNum = reply.ReadUint32();
672     }
673     return ret;
674 }
675 
ConnectStrictly()676 GSError BufferClientProducer::ConnectStrictly()
677 {
678     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
679 
680     SEND_REQUEST(BUFFER_PRODUCER_CONNECT_STRICTLY, arguments, reply, option);
681     return CheckRetval(reply);
682 }
683 
DisconnectStrictly()684 GSError BufferClientProducer::DisconnectStrictly()
685 {
686     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
687 
688     SEND_REQUEST(BUFFER_PRODUCER_DISCONNECT_STRICTLY, arguments, reply, option);
689     return CheckRetval(reply);
690 }
691 
SetScalingMode(uint32_t sequence,ScalingMode scalingMode)692 GSError BufferClientProducer::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
693 {
694     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
695     if (!arguments.WriteUint32(sequence) || !arguments.WriteInt32(static_cast<int32_t>(scalingMode))) {
696         return GSERROR_BINDER;
697     }
698     SEND_REQUEST(BUFFER_PRODUCER_SET_SCALING_MODE, arguments, reply, option);
699     return CheckRetval(reply);
700 }
701 
SetScalingMode(ScalingMode scalingMode)702 GSError BufferClientProducer::SetScalingMode(ScalingMode scalingMode)
703 {
704     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
705     if (!arguments.WriteInt32(static_cast<int32_t>(scalingMode))) {
706         return GSERROR_BINDER;
707     }
708     SEND_REQUEST(BUFFER_PRODUCER_SET_SCALING_MODEV2, arguments, reply, option);
709     return CheckRetval(reply);
710 }
711 
SetBufferHold(bool hold)712 GSError BufferClientProducer::SetBufferHold(bool hold)
713 {
714     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
715     if (!arguments.WriteBool(hold)) {
716         return GSERROR_BINDER;
717     }
718     SEND_REQUEST(BUFFER_PRODUCER_SET_BUFFER_HOLD, arguments, reply, option);
719     return CheckRetval(reply);
720 }
721 
SetBufferReallocFlag(bool flag)722 GSError BufferClientProducer::SetBufferReallocFlag(bool flag)
723 {
724     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
725     if (!arguments.WriteBool(flag)) {
726         return GSERROR_BINDER;
727     }
728     SEND_REQUEST(BUFFER_PRODUCER_BUFFER_REALLOC_FLAG, arguments, reply, option);
729     return CheckRetval(reply);
730 }
731 
SetBufferName(const std::string & bufferName)732 GSError BufferClientProducer::SetBufferName(const std::string &bufferName)
733 {
734     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
735     if (!arguments.WriteString(bufferName)) {
736         return GSERROR_BINDER;
737     }
738     SEND_REQUEST(BUFFER_PRODUCER_SET_BUFFER_NAME, arguments, reply, option);
739     return CheckRetval(reply);
740 }
741 
SetMetaData(uint32_t sequence,const std::vector<GraphicHDRMetaData> & metaData)742 GSError BufferClientProducer::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData> &metaData)
743 {
744     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
745     if (!arguments.WriteUint32(sequence)) {
746         return GSERROR_BINDER;
747     }
748     GSError ret = WriteHDRMetaData(arguments, metaData);
749     if (ret != GSERROR_OK) {
750         return ret;
751     }
752     SEND_REQUEST(BUFFER_PRODUCER_SET_METADATA, arguments, reply, option);
753     return CheckRetval(reply);
754 }
755 
SetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)756 GSError BufferClientProducer::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
757                                              const std::vector<uint8_t> &metaData)
758 {
759     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
760     if (!arguments.WriteUint32(sequence) || !arguments.WriteUint32(static_cast<uint32_t>(key))) {
761         return GSERROR_BINDER;
762     }
763     GSError ret = WriteHDRMetaDataSet(arguments, metaData);
764     if (ret != GSERROR_OK) {
765         return ret;
766     }
767     SEND_REQUEST(BUFFER_PRODUCER_SET_METADATASET, arguments, reply, option);
768     return CheckRetval(reply);
769 }
770 
SetTunnelHandle(const GraphicExtDataHandle * handle)771 GSError BufferClientProducer::SetTunnelHandle(const GraphicExtDataHandle *handle)
772 {
773     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
774     if (handle == nullptr) {
775         if (!arguments.WriteBool(false)) {
776             return GSERROR_BINDER;
777         }
778     } else {
779         if (!arguments.WriteBool(true)) {
780             return GSERROR_BINDER;
781         }
782         GSError ret = WriteExtDataHandle(arguments, handle);
783         if (ret != GSERROR_OK) {
784             return ret;
785         }
786     }
787     SEND_REQUEST(BUFFER_PRODUCER_SET_TUNNEL_HANDLE, arguments, reply, option);
788     return CheckRetval(reply);
789 }
790 
GetPresentTimestamp(uint32_t sequence,GraphicPresentTimestampType type,int64_t & time)791 GSError BufferClientProducer::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type, int64_t &time)
792 {
793     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
794     if (!arguments.WriteUint32(sequence) || !arguments.WriteUint32(static_cast<uint32_t>(type))) {
795         return GSERROR_BINDER;
796     }
797     SEND_REQUEST(BUFFER_PRODUCER_GET_PRESENT_TIMESTAMP, arguments, reply, option);
798     GSError ret = CheckRetval(reply);
799     if (ret != GSERROR_OK) {
800         return ret;
801     }
802     time = reply.ReadInt64();
803     return static_cast<GSError>(ret);
804 }
805 
GetNativeSurface()806 sptr<NativeSurface> BufferClientProducer::GetNativeSurface()
807 {
808     return nullptr;
809 }
810 
GetTransform(GraphicTransformType & transform)811 GSError BufferClientProducer::GetTransform(GraphicTransformType &transform)
812 {
813     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
814     SEND_REQUEST(BUFFER_PRODUCER_GET_TRANSFORM, arguments, reply, option);
815 
816     GSError ret = CheckRetval(reply);
817     if (ret != GSERROR_OK) {
818         return ret;
819     }
820     transform = static_cast<GraphicTransformType>(reply.ReadUint32());
821     return GSERROR_OK;
822 }
823 
GetTransformHint(GraphicTransformType & transformHint)824 GSError BufferClientProducer::GetTransformHint(GraphicTransformType &transformHint)
825 {
826     return GSERROR_NOT_SUPPORT;
827 }
828 
SetTransformHint(GraphicTransformType transformHint,uint64_t fromId)829 GSError BufferClientProducer::SetTransformHint(GraphicTransformType transformHint, uint64_t fromId)
830 {
831     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
832 
833     if (!arguments.WriteUint32(static_cast<uint32_t>(transformHint))) {
834         return GSERROR_BINDER;
835     }
836 
837     if (!arguments.WriteUint64(fromId)) {
838         return GSERROR_BINDER;
839     }
840 
841     SEND_REQUEST(BUFFER_PRODUCER_SET_TRANSFORMHINT, arguments, reply, option);
842     return CheckRetval(reply);
843 }
844 
SetSurfaceSourceType(OHSurfaceSource sourceType)845 GSError BufferClientProducer::SetSurfaceSourceType(OHSurfaceSource sourceType)
846 {
847     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
848     if (!arguments.WriteUint32(static_cast<uint32_t>(sourceType))) {
849         return GSERROR_BINDER;
850     }
851     SEND_REQUEST(BUFFER_PRODUCER_SET_SOURCE_TYPE, arguments, reply, option);
852     return CheckRetval(reply);
853 }
854 
GetSurfaceSourceType(OHSurfaceSource & sourceType)855 GSError BufferClientProducer::GetSurfaceSourceType(OHSurfaceSource &sourceType)
856 {
857     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
858     SEND_REQUEST(BUFFER_PRODUCER_GET_SOURCE_TYPE, arguments, reply, option);
859     GSError ret = CheckRetval(reply);
860     if (ret != GSERROR_OK) {
861         return ret;
862     }
863     sourceType = static_cast<OHSurfaceSource>(reply.ReadUint32());
864     return GSERROR_OK;
865 }
866 
SetSurfaceAppFrameworkType(std::string appFrameworkType)867 GSError BufferClientProducer::SetSurfaceAppFrameworkType(std::string appFrameworkType)
868 {
869     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
870     if (!arguments.WriteString(appFrameworkType)) {
871         return GSERROR_BINDER;
872     }
873     SEND_REQUEST(BUFFER_PRODUCER_SET_APP_FRAMEWORK_TYPE, arguments, reply, option);
874     return CheckRetval(reply);
875 }
876 
GetSurfaceAppFrameworkType(std::string & appFrameworkType)877 GSError BufferClientProducer::GetSurfaceAppFrameworkType(std::string &appFrameworkType)
878 {
879     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
880     SEND_REQUEST(BUFFER_PRODUCER_GET_APP_FRAMEWORK_TYPE, arguments, reply, option);
881     GSError ret = CheckRetval(reply);
882     if (ret != GSERROR_OK) {
883         return ret;
884     }
885     appFrameworkType = static_cast<std::string>(reply.ReadString());
886     return GSERROR_OK;
887 }
888 
SetHdrWhitePointBrightness(float brightness)889 GSError BufferClientProducer::SetHdrWhitePointBrightness(float brightness)
890 {
891     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
892 
893     if (!arguments.WriteFloat(brightness)) {
894         return GSERROR_BINDER;
895     }
896 
897     SEND_REQUEST(BUFFER_PRODUCER_SET_HDRWHITEPOINTBRIGHTNESS, arguments, reply, option);
898     return CheckRetval(reply);
899 }
900 
SetSdrWhitePointBrightness(float brightness)901 GSError BufferClientProducer::SetSdrWhitePointBrightness(float brightness)
902 {
903     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
904 
905     if (!arguments.WriteFloat(brightness)) {
906         return GSERROR_BINDER;
907     }
908 
909     SEND_REQUEST(BUFFER_PRODUCER_SET_SDRWHITEPOINTBRIGHTNESS, arguments, reply, option);
910     return CheckRetval(reply);
911 }
912 
AcquireLastFlushedBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],uint32_t matrixSize,bool isUseNewMatrix)913 GSError BufferClientProducer::AcquireLastFlushedBuffer(sptr<SurfaceBuffer> &buffer, sptr<SyncFence> &fence,
914     float matrix[16], uint32_t matrixSize, bool isUseNewMatrix)
915 {
916     return GetLastFlushedBufferCommon(buffer, fence,
917         matrix, matrixSize, isUseNewMatrix, BUFFER_PRODUCER_ACQUIRE_LAST_FLUSHED_BUFFER);
918 }
919 
ReleaseLastFlushedBuffer(uint32_t sequence)920 GSError BufferClientProducer::ReleaseLastFlushedBuffer(uint32_t sequence)
921 {
922     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
923     if (!arguments.WriteUint32(sequence)) {
924         return GSERROR_BINDER;
925     }
926     SEND_REQUEST(BUFFER_PRODUCER_RELEASE_LAST_FLUSHED_BUFFER, arguments, reply, option);
927     return CheckRetval(reply);
928 }
929 
SetGlobalAlpha(int32_t alpha)930 GSError BufferClientProducer::SetGlobalAlpha(int32_t alpha)
931 {
932     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
933     if (!arguments.WriteInt32(alpha)) {
934         return GSERROR_BINDER;
935     }
936     SEND_REQUEST(BUFFER_PRODUCER_SET_GLOBALALPHA, arguments, reply, option);
937     return CheckRetval(reply);
938 }
939 
SetRequestBufferNoblockMode(bool noblock)940 GSError BufferClientProducer::SetRequestBufferNoblockMode(bool noblock)
941 {
942     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
943     if (!arguments.WriteBool(noblock)) {
944         return GSERROR_BINDER;
945     }
946     SEND_REQUEST(BUFFER_PRODUCER_SET_REQUESTBUFFER_NOBLOCKMODE, arguments, reply, option);
947     return CheckRetval(reply);
948 }
949 
RequestAndDetachBuffer(const BufferRequestConfig & config,sptr<BufferExtraData> & bedata,RequestBufferReturnValue & retval)950 GSError BufferClientProducer::RequestAndDetachBuffer(const BufferRequestConfig& config,
951     sptr<BufferExtraData>& bedata, RequestBufferReturnValue& retval)
952 {
953     return RequestBufferCommon(config, bedata, retval, BUFFER_PRODUCER_REQUEST_AND_DETACH_BUFFER);
954 }
955 
AttachAndFlushBuffer(sptr<SurfaceBuffer> & buffer,sptr<BufferExtraData> & bedata,const sptr<SyncFence> & fence,BufferFlushConfigWithDamages & config,bool needMap)956 GSError BufferClientProducer::AttachAndFlushBuffer(sptr<SurfaceBuffer>& buffer, sptr<BufferExtraData>& bedata,
957     const sptr<SyncFence>& fence, BufferFlushConfigWithDamages& config, bool needMap)
958 {
959     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
960     GSError ret = WriteSurfaceBufferImpl(arguments, buffer->GetSeqNum(), buffer);
961     if (ret != GSERROR_OK) {
962         return ret;
963     }
964     ret = buffer->WriteBufferRequestConfig(arguments);
965     if (ret != GSERROR_OK) {
966         BLOGE("WriteBufferRequestConfig ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_);
967         return ret;
968     }
969 
970     ret = bedata->WriteToParcel(arguments);
971     if (ret != GSERROR_OK) {
972         return ret;
973     }
974     if (!fence->WriteToMessageParcel(arguments)) {
975         return GSERROR_BINDER;
976     }
977     ret = WriteFlushConfig(arguments, config);
978     if (ret != GSERROR_OK) {
979         return ret;
980     }
981     if (!arguments.WriteBool(needMap)) {
982         return GSERROR_BINDER;
983     }
984     SEND_REQUEST(BUFFER_PRODUCER_ATTACH_AND_FLUSH_BUFFER, arguments, reply, option);
985     return CheckRetval(reply);
986 }
987 
GetCycleBuffersNumber(uint32_t & cycleBuffersNumber)988 GSError BufferClientProducer::GetCycleBuffersNumber(uint32_t& cycleBuffersNumber)
989 {
990     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
991     SEND_REQUEST(BUFFER_PRODUCER_GET_ROTATING_BUFFERS_NUMBER, arguments, reply, option);
992     GSError ret = CheckRetval(reply);
993     if (ret != GSERROR_OK) {
994         return ret;
995     }
996     cycleBuffersNumber = reply.ReadUint32();
997     return GSERROR_OK;
998 }
999 
SetCycleBuffersNumber(uint32_t cycleBuffersNumber)1000 GSError BufferClientProducer::SetCycleBuffersNumber(uint32_t cycleBuffersNumber)
1001 {
1002     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
1003     if (!arguments.WriteUint32(cycleBuffersNumber)) {
1004         return GSERROR_BINDER;
1005     }
1006     SEND_REQUEST(BUFFER_PRODUCER_SET_ROTATING_BUFFERS_NUMBER, arguments, reply, option);
1007     return CheckRetval(reply);
1008 }
1009 
SetFrameGravity(int32_t frameGravity)1010 GSError BufferClientProducer::SetFrameGravity(int32_t frameGravity)
1011 {
1012     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
1013     if (!arguments.WriteInt32(frameGravity)) {
1014         return GSERROR_BINDER;
1015     }
1016     SEND_REQUEST(BUFFER_PRODUCER_SET_FRAME_GRAVITY, arguments, reply, option);
1017     return CheckRetval(reply);
1018 }
1019 
SetFixedRotation(int32_t fixedRotation)1020 GSError BufferClientProducer::SetFixedRotation(int32_t fixedRotation)
1021 {
1022     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
1023     if (!arguments.WriteInt32(fixedRotation)) {
1024         return GSERROR_BINDER;
1025     }
1026     SEND_REQUEST(BUFFER_PRODUCER_SET_FIXED_ROTATION, arguments, reply, option);
1027     return CheckRetval(reply);
1028 }
1029 
PreAllocBuffers(const BufferRequestConfig & config,uint32_t allocBufferCount)1030 GSError BufferClientProducer::PreAllocBuffers(const BufferRequestConfig &config, uint32_t allocBufferCount)
1031 {
1032     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
1033     GSError ret = WriteRequestConfig(arguments, config);
1034     if (ret != GSERROR_OK) {
1035         return ret;
1036     }
1037     if (!arguments.WriteUint32(allocBufferCount)) {
1038         return GSERROR_BINDER;
1039     }
1040     option.SetFlags(MessageOption::TF_ASYNC);
1041     SEND_REQUEST(BUFFER_PRODUCER_PRE_ALLOC_BUFFERS, arguments, reply, option);
1042     return GSERROR_OK;
1043 }
1044 
SetLppShareFd(int fd,bool state)1045 GSError BufferClientProducer::SetLppShareFd(int fd, bool state)
1046 {
1047     if (fd < 0) {
1048         return GSERROR_INVALID_ARGUMENTS;
1049     }
1050     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
1051     if (!arguments.WriteFileDescriptor(fd) || !arguments.WriteBool(state)) {
1052         return GSERROR_BINDER;
1053     }
1054     SEND_REQUEST(BUFFER_PRODUCER_SET_LPP_FD, arguments, reply, option);
1055     return CheckRetval(reply);
1056 }
1057 
SetAlphaType(GraphicAlphaType alphaType)1058 GSError BufferClientProducer::SetAlphaType(GraphicAlphaType alphaType)
1059 {
1060     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
1061     if (!arguments.WriteInt32(alphaType)) {
1062         return GSERROR_BINDER;
1063     }
1064     SEND_REQUEST(BUFFER_PRODUCER_SET_ALPHA_TYPE, arguments, reply, option);
1065     return CheckRetval(reply);
1066 }
1067 }; // namespace OHOS
1068