1 /*
2  * Copyright (c) 2021 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 "sync_fence.h"
24 #include "message_option.h"
25 #include "securec.h"
26 #include "rs_frame_report_ext.h"
27 
28 #define DEFINE_MESSAGE_VARIABLES(arg, ret, opt)                            \
29     MessageOption opt;                                                     \
30     MessageParcel arg;                                                     \
31     MessageParcel ret;                                                     \
32     do {                                                                   \
33         GSError retCode = MessageVariables(arg);                           \
34         if (retCode != GSERROR_OK) {                                       \
35             return retCode;                                                \
36         }                                                                  \
37     } while (0)
38 
39 #define SEND_REQUEST(COMMAND, arguments, reply, option)                    \
40     do {                                                                   \
41         GSError ret = SendRequest(COMMAND, arguments, reply, option);      \
42         if (ret != GSERROR_OK) {                                           \
43             return ret;                                                    \
44         }                                                                  \
45     } while (0)
46 
47 namespace OHOS {
48 namespace {
49     constexpr size_t MATRIX4_SIZE = 16;
50 }
BufferClientProducer(const sptr<IRemoteObject> & impl)51 BufferClientProducer::BufferClientProducer(const sptr<IRemoteObject>& impl)
52     : IRemoteProxy<IBufferProducer>(impl)
53 {
54 }
55 
~BufferClientProducer()56 BufferClientProducer::~BufferClientProducer()
57 {
58 }
59 
MessageVariables(MessageParcel & arg)60 GSError BufferClientProducer::MessageVariables(MessageParcel &arg)
61 {
62     if (!(arg).WriteInterfaceToken(GetDescriptor())) {
63         BLOGE("WriteInterfaceToken failed, uniqueId: %{public}" PRIu64 ".", uniqueId_);
64         return GSERROR_BINDER;
65     }
66     return GSERROR_OK;
67 }
68 
SendRequest(uint32_t command,MessageParcel & arg,MessageParcel & reply,MessageOption & opt)69 GSError BufferClientProducer::SendRequest(uint32_t command, MessageParcel &arg,
70                                           MessageParcel &reply, MessageOption &opt)
71 {
72     sptr<IRemoteObject> remote = Remote();
73     if (remote == nullptr) {
74         BLOGE("Remote is nullptr!");
75         return GSERROR_SERVER_ERROR;
76     }
77     int32_t ret = remote->SendRequest(command, arg, reply, opt);
78     if (ret != ERR_NONE) {
79         BLOGE("SendRequest ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_);
80         return GSERROR_BINDER;
81     }
82     return GSERROR_OK;
83 }
84 
CheckRetval(MessageParcel & reply)85 GSError BufferClientProducer::CheckRetval(MessageParcel &reply)
86 {
87     int32_t ret = reply.ReadInt32();
88     if (ret != GSERROR_OK) {
89         BLOGE("Remote ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_);
90         return static_cast<GSError>(ret);
91     }
92     return GSERROR_OK;
93 }
94 
RequestBufferCommon(const BufferRequestConfig & config,sptr<BufferExtraData> & bedata,RequestBufferReturnValue & retval,uint32_t command)95 GSError BufferClientProducer::RequestBufferCommon(const BufferRequestConfig &config, sptr<BufferExtraData> &bedata,
96                                                   RequestBufferReturnValue &retval, uint32_t command)
97 {
98     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
99 
100     WriteRequestConfig(arguments, config);
101 
102     retval.isConnected = false;
103     SEND_REQUEST(command, arguments, reply, option);
104     GSError ret = CheckRetval(reply);
105     if (ret != GSERROR_OK) {
106         reply.ReadBool(retval.isConnected);
107         return ret;
108     }
109 
110     ret = ReadSurfaceBufferImpl(reply, retval.sequence, retval.buffer);
111     if (ret != GSERROR_OK) {
112         return SURFACE_ERROR_UNKOWN;
113     }
114     if (retval.buffer != nullptr) {
115         retval.buffer->SetBufferRequestConfig(config);
116     }
117 
118     ret = bedata->ReadFromParcel(reply);
119     if (ret != GSERROR_OK) {
120         return SURFACE_ERROR_UNKOWN;
121     }
122     retval.fence = SyncFence::ReadFromMessageParcel(reply);
123     reply.ReadUInt32Vector(&retval.deletingBuffers);
124 
125     return GSERROR_OK;
126 }
127 
RequestBuffer(const BufferRequestConfig & config,sptr<BufferExtraData> & bedata,RequestBufferReturnValue & retval)128 GSError BufferClientProducer::RequestBuffer(const BufferRequestConfig &config, sptr<BufferExtraData> &bedata,
129                                             RequestBufferReturnValue &retval)
130 {
131     return RequestBufferCommon(config, bedata, retval, BUFFER_PRODUCER_REQUEST_BUFFER);
132 }
133 
RequestBuffers(const BufferRequestConfig & config,std::vector<sptr<BufferExtraData>> & bedata,std::vector<RequestBufferReturnValue> & retvalues)134 GSError BufferClientProducer::RequestBuffers(const BufferRequestConfig &config,
135     std::vector<sptr<BufferExtraData>> &bedata, std::vector<RequestBufferReturnValue> &retvalues)
136 {
137     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
138 
139     uint32_t num = static_cast<uint32_t>(bedata.size());
140     arguments.WriteUint32(num);
141     WriteRequestConfig(arguments, config);
142     retvalues[0].isConnected = false;
143     SEND_REQUEST(BUFFER_PRODUCER_REQUEST_BUFFERS, arguments, reply, option);
144     GSError ret = CheckRetval(reply);
145     if (ret != GSERROR_OK && ret != GSERROR_NO_BUFFER) {
146         reply.ReadBool(retvalues[0].isConnected);
147         return ret;
148     }
149 
150     num = reply.ReadUint32();
151     if (num > SURFACE_MAX_QUEUE_SIZE || num == 0) {
152         BLOGE("num is invalid, %{public}u, uniqueId: %{public}" PRIu64 ".", num, uniqueId_);
153         return SURFACE_ERROR_UNKOWN;
154     }
155 
156     ret = GSERROR_OK;
157     retvalues.resize(num);
158     for (size_t i = 0; i < num; ++i) {
159         auto &retval = retvalues[i];
160         ret = ReadSurfaceBufferImpl(reply, retval.sequence, retval.buffer);
161         if (ret != GSERROR_OK) {
162             return SURFACE_ERROR_UNKOWN;
163         }
164         if (retval.buffer != nullptr) {
165             retval.buffer->SetBufferRequestConfig(config);
166         }
167         ret = bedata[i]->ReadFromParcel(reply);
168         if (ret != GSERROR_OK) {
169             return SURFACE_ERROR_UNKOWN;
170         }
171         retval.fence = SyncFence::ReadFromMessageParcel(reply);
172         reply.ReadUInt32Vector(&retval.deletingBuffers);
173     }
174     return ret;
175 }
176 
GetLastFlushedBufferCommon(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],uint32_t matrixSize,bool isUseNewMatrix,uint32_t command)177 GSError BufferClientProducer::GetLastFlushedBufferCommon(sptr<SurfaceBuffer>& buffer,
178     sptr<SyncFence>& fence, float matrix[16], uint32_t matrixSize, bool isUseNewMatrix, uint32_t command)
179 {
180     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
181     arguments.WriteBool(isUseNewMatrix);
182     SEND_REQUEST(command, arguments, reply, option);
183     GSError ret = CheckRetval(reply);
184     if (ret != GSERROR_OK) {
185         return ret;
186     }
187     uint32_t sequence;
188     ret = ReadSurfaceBufferImpl(reply, sequence, buffer);
189     if (ret != GSERROR_OK) {
190         return SURFACE_ERROR_UNKOWN;
191     }
192     ret = buffer->ReadBufferRequestConfig(reply);
193     if (ret != GSERROR_OK) {
194         return SURFACE_ERROR_UNKOWN;
195     }
196 
197     fence = SyncFence::ReadFromMessageParcel(reply);
198     std::vector<float> readMatrixVector;
199     reply.ReadFloatVector(&readMatrixVector);
200     if (memcpy_s(matrix, matrixSize * sizeof(float),
201         readMatrixVector.data(), readMatrixVector.size() * sizeof(float)) != EOK) {
202         BLOGE("memcpy_s fail, uniqueId: %{public}" PRIu64 ".", uniqueId_);
203         return SURFACE_ERROR_UNKOWN;
204     }
205     return GSERROR_OK;
206 }
207 
GetLastFlushedBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],bool isUseNewMatrix)208 GSError BufferClientProducer::GetLastFlushedBuffer(sptr<SurfaceBuffer>& buffer,
209     sptr<SyncFence>& fence, float matrix[16], bool isUseNewMatrix)
210 {
211     return GetLastFlushedBufferCommon(buffer, fence,
212         matrix, MATRIX4_SIZE, isUseNewMatrix, BUFFER_PRODUCER_GET_LAST_FLUSHED_BUFFER);
213 }
214 
GetProducerInitInfo(ProducerInitInfo & info)215 GSError BufferClientProducer::GetProducerInitInfo(ProducerInitInfo &info)
216 {
217     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
218     token_ = new IRemoteStub<IBufferProducerToken>();
219     arguments.WriteRemoteObject(token_->AsObject());
220     SEND_REQUEST(BUFFER_PRODUCER_GET_INIT_INFO, arguments, reply, option);
221     reply.ReadInt32(info.width);
222     reply.ReadInt32(info.height);
223     reply.ReadUint64(info.uniqueId);
224     uniqueId_ = info.uniqueId;
225     reply.ReadString(info.name);
226     return CheckRetval(reply);
227 }
228 
CancelBuffer(uint32_t sequence,sptr<BufferExtraData> bedata)229 GSError BufferClientProducer::CancelBuffer(uint32_t sequence, sptr<BufferExtraData> bedata)
230 {
231     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
232 
233     arguments.WriteUint32(sequence);
234     bedata->WriteToParcel(arguments);
235 
236     SEND_REQUEST(BUFFER_PRODUCER_CANCEL_BUFFER, arguments, reply, option);
237     return CheckRetval(reply);
238 }
239 
FlushBuffer(uint32_t sequence,sptr<BufferExtraData> bedata,sptr<SyncFence> fence,BufferFlushConfigWithDamages & config)240 GSError BufferClientProducer::FlushBuffer(uint32_t sequence, sptr<BufferExtraData> bedata,
241                                           sptr<SyncFence> fence, BufferFlushConfigWithDamages &config)
242 {
243     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
244 
245     arguments.WriteUint32(sequence);
246     bedata->WriteToParcel(arguments);
247     fence->WriteToMessageParcel(arguments);
248     WriteFlushConfig(arguments, config);
249 
250     SEND_REQUEST(BUFFER_PRODUCER_FLUSH_BUFFER, arguments, reply, option);
251     GSError ret = CheckRetval(reply);
252     if (ret != GSERROR_OK) {
253         return ret;
254     }
255 
256     if (OHOS::RsFrameReportExt::GetInstance().GetEnable()) {
257         OHOS::RsFrameReportExt::GetInstance().HandleSwapBuffer();
258     }
259     return GSERROR_OK;
260 }
261 
FlushBuffers(const std::vector<uint32_t> & sequences,const std::vector<sptr<BufferExtraData>> & bedata,const std::vector<sptr<SyncFence>> & fences,const std::vector<BufferFlushConfigWithDamages> & configs)262 GSError BufferClientProducer::FlushBuffers(const std::vector<uint32_t> &sequences,
263     const std::vector<sptr<BufferExtraData>> &bedata,
264     const std::vector<sptr<SyncFence>> &fences,
265     const std::vector<BufferFlushConfigWithDamages> &configs)
266 {
267     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
268 
269     if (sequences.size() <= 0 || sequences.size() > SURFACE_MAX_QUEUE_SIZE) {
270         return SURFACE_ERROR_UNKOWN;
271     }
272     arguments.WriteUInt32Vector(sequences);
273     for (uint32_t i = 0; i < sequences.size(); ++i) {
274         bedata[i]->WriteToParcel(arguments);
275         fences[i]->WriteToMessageParcel(arguments);
276         WriteFlushConfig(arguments, configs[i]);
277     }
278     SEND_REQUEST(BUFFER_PRODUCER_FLUSH_BUFFERS, arguments, reply, option);
279     return CheckRetval(reply);
280 }
281 
AttachBufferToQueue(sptr<SurfaceBuffer> buffer)282 GSError BufferClientProducer::AttachBufferToQueue(sptr<SurfaceBuffer> buffer)
283 {
284     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
285     uint32_t sequence = buffer->GetSeqNum();
286     WriteSurfaceBufferImpl(arguments, sequence, buffer);
287     GSError ret = buffer->WriteBufferRequestConfig(arguments);
288     if (ret != GSERROR_OK) {
289         BLOGE("WriteBufferRequestConfig ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_);
290         return ret;
291     }
292     SEND_REQUEST(BUFFER_PRODUCER_ATTACH_BUFFER_TO_QUEUE, arguments, reply, option);
293     return CheckRetval(reply);
294 }
295 
DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)296 GSError BufferClientProducer::DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)
297 {
298     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
299     uint32_t sequence = buffer->GetSeqNum();
300     WriteSurfaceBufferImpl(arguments, sequence, buffer);
301     SEND_REQUEST(BUFFER_PRODUCER_DETACH_BUFFER_FROM_QUEUE, arguments, reply, option);
302     return CheckRetval(reply);
303 }
304 
AttachBuffer(sptr<SurfaceBuffer> & buffer)305 GSError BufferClientProducer::AttachBuffer(sptr<SurfaceBuffer>& buffer)
306 {
307     return GSERROR_NOT_SUPPORT;
308 }
309 
AttachBuffer(sptr<SurfaceBuffer> & buffer,int32_t timeOut)310 GSError BufferClientProducer::AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut)
311 {
312     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
313     uint32_t sequence = buffer->GetSeqNum();
314     WriteSurfaceBufferImpl(arguments, sequence, buffer);
315     arguments.WriteInt32(timeOut);
316     SEND_REQUEST(BUFFER_PRODUCER_ATTACH_BUFFER, arguments, reply, option);
317     return CheckRetval(reply);
318 }
319 
DetachBuffer(sptr<SurfaceBuffer> & buffer)320 GSError BufferClientProducer::DetachBuffer(sptr<SurfaceBuffer>& buffer)
321 {
322     return GSERROR_NOT_SUPPORT;
323 }
324 
RegisterReleaseListener(sptr<IProducerListener> listener)325 GSError BufferClientProducer::RegisterReleaseListener(sptr<IProducerListener> listener)
326 {
327     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
328 
329     arguments.WriteRemoteObject(listener->AsObject());
330 
331     SEND_REQUEST(BUFFER_PRODUCER_REGISTER_RELEASE_LISTENER, arguments, reply, option);
332     return CheckRetval(reply);
333 }
334 
UnRegisterReleaseListener()335 GSError BufferClientProducer::UnRegisterReleaseListener()
336 {
337     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
338     SEND_REQUEST(BUFFER_PRODUCER_UNREGISTER_RELEASE_LISTENER, arguments, reply, option);
339     return CheckRetval(reply);
340 }
341 
GetQueueSize()342 uint32_t BufferClientProducer::GetQueueSize()
343 {
344     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
345 
346     SEND_REQUEST(BUFFER_PRODUCER_GET_QUEUE_SIZE, arguments, reply, option);
347 
348     return reply.ReadUint32();
349 }
350 
SetQueueSize(uint32_t queueSize)351 GSError BufferClientProducer::SetQueueSize(uint32_t queueSize)
352 {
353     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
354 
355     arguments.WriteUint32(queueSize);
356 
357     SEND_REQUEST(BUFFER_PRODUCER_SET_QUEUE_SIZE, arguments, reply, option);
358     return CheckRetval(reply);
359 }
360 
GetName(std::string & name)361 GSError BufferClientProducer::GetName(std::string &name)
362 {
363     {
364         std::lock_guard<std::mutex> lockGuard(mutex_);
365         if (name_ != "not init") {
366             name = name_;
367             return GSERROR_OK;
368         }
369     }
370     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
371 
372     SEND_REQUEST(BUFFER_PRODUCER_GET_NAME, arguments, reply, option);
373     GSError ret = CheckRetval(reply);
374     if (ret != GSERROR_OK) {
375         return ret;
376     }
377     if (reply.ReadString(name) == false) {
378         BLOGE("reply.ReadString return false, uniqueId: %{public}" PRIu64 ".", uniqueId_);
379         return GSERROR_BINDER;
380     }
381     {
382         std::lock_guard<std::mutex> lockGuard(mutex_);
383         name_ = name;
384     }
385     return ret;
386 }
387 
GetUniqueId()388 uint64_t BufferClientProducer::GetUniqueId()
389 {
390     {
391         std::lock_guard<std::mutex> lockGuard(mutex_);
392         if (uniqueId_ != 0) {
393             return uniqueId_;
394         }
395     }
396     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
397     SEND_REQUEST(BUFFER_PRODUCER_GET_UNIQUE_ID, arguments, reply, option);
398     {
399         std::lock_guard<std::mutex> lockGuard(mutex_);
400         uniqueId_ = reply.ReadUint64();
401         return uniqueId_;
402     }
403 }
404 
GetNameAndUniqueId(std::string & name,uint64_t & uniqueId)405 GSError BufferClientProducer::GetNameAndUniqueId(std::string& name, uint64_t& uniqueId)
406 {
407     {
408         std::lock_guard<std::mutex> lockGuard(mutex_);
409         if (uniqueId_ != 0 && name_ != "not init") {
410             uniqueId = uniqueId_;
411             name = name_;
412             return GSERROR_OK;
413         }
414     }
415     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
416 
417     SEND_REQUEST(BUFFER_PRODUCER_GET_NAMEANDUNIQUEDID, arguments, reply, option);
418     GSError ret = CheckRetval(reply);
419     if (ret != GSERROR_OK) {
420         return ret;
421     }
422     if (reply.ReadString(name) == false) {
423         BLOGE("reply.ReadString return false, uniqueId: %{public}" PRIu64 ".", uniqueId_);
424         return GSERROR_BINDER;
425     }
426 
427     uniqueId = reply.ReadUint64();
428     {
429         std::lock_guard<std::mutex> lockGuard(mutex_);
430         name_ = name;
431         uniqueId_ = uniqueId;
432     }
433     return ret;
434 }
435 
GetDefaultWidth()436 int32_t BufferClientProducer::GetDefaultWidth()
437 {
438     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
439 
440     SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_WIDTH, arguments, reply, option);
441 
442     return reply.ReadInt32();
443 }
444 
GetDefaultHeight()445 int32_t BufferClientProducer::GetDefaultHeight()
446 {
447     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
448 
449     SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_HEIGHT, arguments, reply, option);
450 
451     return reply.ReadInt32();
452 }
453 
SetDefaultUsage(uint64_t usage)454 GSError BufferClientProducer::SetDefaultUsage(uint64_t usage)
455 {
456     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
457 
458     arguments.WriteUint64(usage);
459 
460     SEND_REQUEST(BUFFER_PRODUCER_SET_DEFAULT_USAGE, arguments, reply, option);
461 
462     return CheckRetval(reply);
463 }
464 
GetDefaultUsage()465 uint64_t BufferClientProducer::GetDefaultUsage()
466 {
467     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
468 
469     SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_USAGE, arguments, reply, option);
470 
471     return reply.ReadUint64();
472 }
473 
CleanCache(bool cleanAll)474 GSError BufferClientProducer::CleanCache(bool cleanAll)
475 {
476     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
477 
478     arguments.WriteBool(cleanAll);
479     SEND_REQUEST(BUFFER_PRODUCER_CLEAN_CACHE, arguments, reply, option);
480     return CheckRetval(reply);
481 }
482 
GoBackground()483 GSError BufferClientProducer::GoBackground()
484 {
485     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
486 
487     SEND_REQUEST(BUFFER_PRODUCER_GO_BACKGROUND, arguments, reply, option);
488     return CheckRetval(reply);
489 }
490 
SetTransform(GraphicTransformType transform)491 GSError BufferClientProducer::SetTransform(GraphicTransformType transform)
492 {
493     {
494         std::lock_guard<std::mutex> lockGuard(mutex_);
495         if (lastSetTransformType_ == transform) {
496             return GSERROR_OK;
497         }
498         lastSetTransformType_ = transform;
499     }
500 
501     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
502 
503     arguments.WriteUint32(static_cast<uint32_t>(transform));
504 
505     SEND_REQUEST(BUFFER_PRODUCER_SET_TRANSFORM, arguments, reply, option);
506     GSError ret = CheckRetval(reply);
507     if (ret != GSERROR_OK) {
508         {
509             std::lock_guard<std::mutex> lockGuard(mutex_);
510             lastSetTransformType_ = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
511         }
512         return ret;
513     }
514 
515     return GSERROR_OK;
516 }
517 
IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> & infos,std::vector<bool> & supporteds)518 GSError BufferClientProducer::IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> &infos,
519                                                std::vector<bool> &supporteds)
520 {
521     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
522 
523     WriteVerifyAllocInfo(arguments, infos);
524 
525     SEND_REQUEST(BUFFER_PRODUCER_IS_SUPPORTED_ALLOC, arguments, reply, option);
526     GSError ret = CheckRetval(reply);
527     if (ret != GSERROR_OK) {
528         return ret;
529     }
530 
531     if (reply.ReadBoolVector(&supporteds) == false) {
532         BLOGE("reply.ReadBoolVector return false, uniqueId: %{public}" PRIu64 ".", uniqueId_);
533         return GSERROR_BINDER;
534     }
535 
536     return static_cast<GSError>(ret);
537 }
538 
Connect()539 GSError BufferClientProducer::Connect()
540 {
541     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
542 
543     SEND_REQUEST(BUFFER_PRODUCER_CONNECT, arguments, reply, option);
544     return CheckRetval(reply);
545 }
546 
Disconnect()547 GSError BufferClientProducer::Disconnect()
548 {
549     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
550 
551     SEND_REQUEST(BUFFER_PRODUCER_DISCONNECT, arguments, reply, option);
552     return CheckRetval(reply);
553 }
554 
SetScalingMode(uint32_t sequence,ScalingMode scalingMode)555 GSError BufferClientProducer::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
556 {
557     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
558     arguments.WriteUint32(sequence);
559     arguments.WriteInt32(static_cast<int32_t>(scalingMode));
560     SEND_REQUEST(BUFFER_PRODUCER_SET_SCALING_MODE, arguments, reply, option);
561     return CheckRetval(reply);
562 }
563 
SetScalingMode(ScalingMode scalingMode)564 GSError BufferClientProducer::SetScalingMode(ScalingMode scalingMode)
565 {
566     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
567     arguments.WriteInt32(static_cast<int32_t>(scalingMode));
568     SEND_REQUEST(BUFFER_PRODUCER_SET_SCALING_MODEV2, arguments, reply, option);
569     return CheckRetval(reply);
570 }
571 
SetBufferHold(bool hold)572 GSError BufferClientProducer::SetBufferHold(bool hold)
573 {
574     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
575     arguments.WriteBool(hold);
576     SEND_REQUEST(BUFFER_PRODUCER_SET_BUFFER_HOLD, arguments, reply, option);
577     return CheckRetval(reply);
578 }
579 
SetMetaData(uint32_t sequence,const std::vector<GraphicHDRMetaData> & metaData)580 GSError BufferClientProducer::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData> &metaData)
581 {
582     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
583     arguments.WriteUint32(sequence);
584     WriteHDRMetaData(arguments, metaData);
585     SEND_REQUEST(BUFFER_PRODUCER_SET_METADATA, arguments, reply, option);
586     return CheckRetval(reply);
587 }
588 
SetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)589 GSError BufferClientProducer::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
590                                              const std::vector<uint8_t> &metaData)
591 {
592     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
593     arguments.WriteUint32(sequence);
594     arguments.WriteUint32(static_cast<uint32_t>(key));
595     WriteHDRMetaDataSet(arguments, metaData);
596     SEND_REQUEST(BUFFER_PRODUCER_SET_METADATASET, arguments, reply, option);
597     return CheckRetval(reply);
598 }
599 
SetTunnelHandle(const GraphicExtDataHandle * handle)600 GSError BufferClientProducer::SetTunnelHandle(const GraphicExtDataHandle *handle)
601 {
602     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
603     if (handle == nullptr) {
604         arguments.WriteBool(false);
605     } else {
606         arguments.WriteBool(true);
607         WriteExtDataHandle(arguments, handle);
608     }
609     SEND_REQUEST(BUFFER_PRODUCER_SET_TUNNEL_HANDLE, arguments, reply, option);
610     return CheckRetval(reply);
611 }
612 
GetPresentTimestamp(uint32_t sequence,GraphicPresentTimestampType type,int64_t & time)613 GSError BufferClientProducer::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type, int64_t &time)
614 {
615     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
616     arguments.WriteUint32(sequence);
617     arguments.WriteUint32(static_cast<uint32_t>(type));
618     SEND_REQUEST(BUFFER_PRODUCER_GET_PRESENT_TIMESTAMP, arguments, reply, option);
619     GSError ret = CheckRetval(reply);
620     if (ret != GSERROR_OK) {
621         return ret;
622     }
623     time = reply.ReadInt64();
624     return static_cast<GSError>(ret);
625 }
626 
GetNativeSurface()627 sptr<NativeSurface> BufferClientProducer::GetNativeSurface()
628 {
629     return nullptr;
630 }
631 
GetTransform(GraphicTransformType & transform)632 GSError BufferClientProducer::GetTransform(GraphicTransformType &transform)
633 {
634     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
635     SEND_REQUEST(BUFFER_PRODUCER_GET_TRANSFORM, arguments, reply, option);
636 
637     GSError ret = CheckRetval(reply);
638     if (ret != GSERROR_OK) {
639         return ret;
640     }
641     transform = static_cast<GraphicTransformType>(reply.ReadUint32());
642     return GSERROR_OK;
643 }
644 
GetTransformHint(GraphicTransformType & transformHint)645 GSError BufferClientProducer::GetTransformHint(GraphicTransformType &transformHint)
646 {
647     return GSERROR_NOT_SUPPORT;
648 }
649 
SetTransformHint(GraphicTransformType transformHint)650 GSError BufferClientProducer::SetTransformHint(GraphicTransformType transformHint)
651 {
652     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
653 
654     arguments.WriteUint32(static_cast<uint32_t>(transformHint));
655 
656     SEND_REQUEST(BUFFER_PRODUCER_SET_TRANSFORMHINT, arguments, reply, option);
657     return CheckRetval(reply);
658 }
659 
SetSurfaceSourceType(OHSurfaceSource sourceType)660 GSError BufferClientProducer::SetSurfaceSourceType(OHSurfaceSource sourceType)
661 {
662     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
663     arguments.WriteUint32(static_cast<uint32_t>(sourceType));
664     SEND_REQUEST(BUFFER_PRODUCER_SET_SOURCE_TYPE, arguments, reply, option);
665     return CheckRetval(reply);
666 }
667 
GetSurfaceSourceType(OHSurfaceSource & sourceType)668 GSError BufferClientProducer::GetSurfaceSourceType(OHSurfaceSource &sourceType)
669 {
670     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
671     SEND_REQUEST(BUFFER_PRODUCER_GET_SOURCE_TYPE, arguments, reply, option);
672     GSError ret = CheckRetval(reply);
673     if (ret != GSERROR_OK) {
674         return ret;
675     }
676     sourceType = static_cast<OHSurfaceSource>(reply.ReadUint32());
677     return GSERROR_OK;
678 }
679 
SetSurfaceAppFrameworkType(std::string appFrameworkType)680 GSError BufferClientProducer::SetSurfaceAppFrameworkType(std::string appFrameworkType)
681 {
682     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
683     arguments.WriteString(appFrameworkType);
684     SEND_REQUEST(BUFFER_PRODUCER_SET_APP_FRAMEWORK_TYPE, arguments, reply, option);
685     return CheckRetval(reply);
686 }
687 
GetSurfaceAppFrameworkType(std::string & appFrameworkType)688 GSError BufferClientProducer::GetSurfaceAppFrameworkType(std::string &appFrameworkType)
689 {
690     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
691     SEND_REQUEST(BUFFER_PRODUCER_GET_APP_FRAMEWORK_TYPE, arguments, reply, option);
692     GSError ret = CheckRetval(reply);
693     if (ret != GSERROR_OK) {
694         return ret;
695     }
696     appFrameworkType = static_cast<std::string>(reply.ReadString());
697     return GSERROR_OK;
698 }
699 
SetHdrWhitePointBrightness(float brightness)700 GSError BufferClientProducer::SetHdrWhitePointBrightness(float brightness)
701 {
702     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
703 
704     arguments.WriteFloat(brightness);
705 
706     SEND_REQUEST(BUFFER_PRODUCER_SET_HDRWHITEPOINTBRIGHTNESS, arguments, reply, option);
707     return CheckRetval(reply);
708 }
709 
SetSdrWhitePointBrightness(float brightness)710 GSError BufferClientProducer::SetSdrWhitePointBrightness(float brightness)
711 {
712     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
713 
714     arguments.WriteFloat(brightness);
715 
716     SEND_REQUEST(BUFFER_PRODUCER_SET_SDRWHITEPOINTBRIGHTNESS, arguments, reply, option);
717     return CheckRetval(reply);
718 }
719 
AcquireLastFlushedBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],uint32_t matrixSize,bool isUseNewMatrix)720 GSError BufferClientProducer::AcquireLastFlushedBuffer(sptr<SurfaceBuffer> &buffer, sptr<SyncFence> &fence,
721     float matrix[16], uint32_t matrixSize, bool isUseNewMatrix)
722 {
723     return GetLastFlushedBufferCommon(buffer, fence,
724         matrix, matrixSize, isUseNewMatrix, BUFFER_PRODUCER_ACQUIRE_LAST_FLUSHED_BUFFER);
725 }
726 
ReleaseLastFlushedBuffer(uint32_t sequence)727 GSError BufferClientProducer::ReleaseLastFlushedBuffer(uint32_t sequence)
728 {
729     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
730     arguments.WriteUint32(sequence);
731     SEND_REQUEST(BUFFER_PRODUCER_RELEASE_LAST_FLUSHED_BUFFER, arguments, reply, option);
732     return CheckRetval(reply);
733 }
734 
RequestAndDetachBuffer(const BufferRequestConfig & config,sptr<BufferExtraData> & bedata,RequestBufferReturnValue & retval)735 GSError BufferClientProducer::RequestAndDetachBuffer(const BufferRequestConfig& config,
736     sptr<BufferExtraData>& bedata, RequestBufferReturnValue& retval)
737 {
738     return RequestBufferCommon(config, bedata, retval, BUFFER_PRODUCER_REQUEST_AND_DETACH_BUFFER);
739 }
740 
AttachAndFlushBuffer(sptr<SurfaceBuffer> & buffer,sptr<BufferExtraData> & bedata,const sptr<SyncFence> & fence,BufferFlushConfigWithDamages & config,bool needMap)741 GSError BufferClientProducer::AttachAndFlushBuffer(sptr<SurfaceBuffer>& buffer, sptr<BufferExtraData>& bedata,
742     const sptr<SyncFence>& fence, BufferFlushConfigWithDamages& config, bool needMap)
743 {
744     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
745     WriteSurfaceBufferImpl(arguments, buffer->GetSeqNum(), buffer);
746     auto ret = buffer->WriteBufferRequestConfig(arguments);
747     if (ret != GSERROR_OK) {
748         BLOGE("WriteBufferRequestConfig ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_);
749         return ret;
750     }
751 
752     bedata->WriteToParcel(arguments);
753     fence->WriteToMessageParcel(arguments);
754     WriteFlushConfig(arguments, config);
755     arguments.WriteBool(needMap);
756     SEND_REQUEST(BUFFER_PRODUCER_ATTACH_AND_FLUSH_BUFFER, arguments, reply, option);
757     return CheckRetval(reply);
758 }
759 }; // namespace OHOS
760