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