• 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 "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     SEND_REQUEST(BUFFER_PRODUCER_GET_INIT_INFO, arguments, reply, option);
251     if (!reply.ReadInt32(info.width) || !reply.ReadInt32(info.height) ||
252         !reply.ReadUint64(info.uniqueId)) {
253         return GSERROR_BINDER;
254     }
255     uniqueId_ = info.uniqueId;
256     if (!reply.ReadString(info.name) || !reply.ReadBool(info.isInHebcList) || !reply.ReadString(info.bufferName) ||
257         !reply.ReadUint64(info.producerId) || !reply.ReadInt32(info.transformHint)) {
258         return GSERROR_BINDER;
259     }
260     return CheckRetval(reply);
261 }
262 
CancelBuffer(uint32_t sequence,sptr<BufferExtraData> bedata)263 GSError BufferClientProducer::CancelBuffer(uint32_t sequence, sptr<BufferExtraData> bedata)
264 {
265     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
266 
267     if (!arguments.WriteUint32(sequence)) {
268         return GSERROR_BINDER;
269     }
270     GSError ret = bedata->WriteToParcel(arguments);
271     if (ret != GSERROR_OK) {
272         return GSERROR_BINDER;
273     }
274 
275     SEND_REQUEST(BUFFER_PRODUCER_CANCEL_BUFFER, arguments, reply, option);
276     return CheckRetval(reply);
277 }
278 
FlushBuffer(uint32_t sequence,sptr<BufferExtraData> bedata,sptr<SyncFence> fence,BufferFlushConfigWithDamages & config)279 GSError BufferClientProducer::FlushBuffer(uint32_t sequence, sptr<BufferExtraData> bedata,
280                                           sptr<SyncFence> fence, BufferFlushConfigWithDamages &config)
281 {
282     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
283 
284     if (!arguments.WriteUint32(sequence)) {
285         return GSERROR_BINDER;
286     }
287     GSError ret = bedata->WriteToParcel(arguments);
288     if (ret != GSERROR_OK) {
289         return ret;
290     }
291     if (!fence->WriteToMessageParcel(arguments)) {
292         return GSERROR_BINDER;
293     }
294     ret = WriteFlushConfig(arguments, config);
295     if (ret != GSERROR_OK) {
296         return ret;
297     }
298 
299     SEND_REQUEST(BUFFER_PRODUCER_FLUSH_BUFFER, arguments, reply, option);
300     ret = CheckRetval(reply);
301     if (ret != GSERROR_OK) {
302         return ret;
303     }
304 
305     if (OHOS::RsFrameReportExt::GetInstance().GetEnable()) {
306         OHOS::RsFrameReportExt::GetInstance().HandleSwapBuffer();
307     }
308     return GSERROR_OK;
309 }
310 
FlushBuffers(const std::vector<uint32_t> & sequences,const std::vector<sptr<BufferExtraData>> & bedata,const std::vector<sptr<SyncFence>> & fences,const std::vector<BufferFlushConfigWithDamages> & configs)311 GSError BufferClientProducer::FlushBuffers(const std::vector<uint32_t> &sequences,
312     const std::vector<sptr<BufferExtraData>> &bedata,
313     const std::vector<sptr<SyncFence>> &fences,
314     const std::vector<BufferFlushConfigWithDamages> &configs)
315 {
316     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
317 
318     if (sequences.empty() || sequences.size() > SURFACE_MAX_QUEUE_SIZE) {
319         return SURFACE_ERROR_UNKOWN;
320     }
321     if (!arguments.WriteUInt32Vector(sequences)) {
322         return GSERROR_BINDER;
323     }
324     GSError ret = GSERROR_OK;
325     for (uint32_t i = 0; i < sequences.size(); ++i) {
326         ret = bedata[i]->WriteToParcel(arguments);
327         if (ret != GSERROR_OK) {
328             return ret;
329         }
330         if (!fences[i]->WriteToMessageParcel(arguments)) {
331             return GSERROR_BINDER;
332         }
333         ret = WriteFlushConfig(arguments, configs[i]);
334         if (ret != GSERROR_OK) {
335             return ret;
336         }
337     }
338     SEND_REQUEST(BUFFER_PRODUCER_FLUSH_BUFFERS, arguments, reply, option);
339     return CheckRetval(reply);
340 }
341 
AttachBufferToQueue(sptr<SurfaceBuffer> buffer)342 GSError BufferClientProducer::AttachBufferToQueue(sptr<SurfaceBuffer> buffer)
343 {
344     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
345     uint32_t sequence = buffer->GetSeqNum();
346     GSError ret = WriteSurfaceBufferImpl(arguments, sequence, buffer);
347     if (ret != GSERROR_OK) {
348         return ret;
349     }
350     ret = buffer->WriteBufferRequestConfig(arguments);
351     if (ret != GSERROR_OK) {
352         BLOGE("WriteBufferRequestConfig ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_);
353         return ret;
354     }
355     SEND_REQUEST(BUFFER_PRODUCER_ATTACH_BUFFER_TO_QUEUE, arguments, reply, option);
356     return CheckRetval(reply);
357 }
358 
DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)359 GSError BufferClientProducer::DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)
360 {
361     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
362     uint32_t sequence = buffer->GetSeqNum();
363     GSError ret = WriteSurfaceBufferImpl(arguments, sequence, buffer);
364     if (ret != GSERROR_OK) {
365         return ret;
366     }
367     SEND_REQUEST(BUFFER_PRODUCER_DETACH_BUFFER_FROM_QUEUE, arguments, reply, option);
368     return CheckRetval(reply);
369 }
370 
AttachBuffer(sptr<SurfaceBuffer> & buffer)371 GSError BufferClientProducer::AttachBuffer(sptr<SurfaceBuffer>& buffer)
372 {
373     return GSERROR_NOT_SUPPORT;
374 }
375 
AttachBuffer(sptr<SurfaceBuffer> & buffer,int32_t timeOut)376 GSError BufferClientProducer::AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut)
377 {
378     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
379     uint32_t sequence = buffer->GetSeqNum();
380     GSError ret = WriteSurfaceBufferImpl(arguments, sequence, buffer);
381     if (ret != GSERROR_OK) {
382         return ret;
383     }
384     if (!arguments.WriteInt32(timeOut)) {
385         return GSERROR_BINDER;
386     }
387     SEND_REQUEST(BUFFER_PRODUCER_ATTACH_BUFFER, arguments, reply, option);
388     return CheckRetval(reply);
389 }
390 
DetachBuffer(sptr<SurfaceBuffer> & buffer)391 GSError BufferClientProducer::DetachBuffer(sptr<SurfaceBuffer>& buffer)
392 {
393     return GSERROR_NOT_SUPPORT;
394 }
395 
RegisterReleaseListener(sptr<IProducerListener> listener)396 GSError BufferClientProducer::RegisterReleaseListener(sptr<IProducerListener> listener)
397 {
398     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
399 
400     if (!arguments.WriteRemoteObject(listener->AsObject())) {
401         return GSERROR_BINDER;
402     }
403 
404     SEND_REQUEST(BUFFER_PRODUCER_REGISTER_RELEASE_LISTENER, arguments, reply, option);
405     return CheckRetval(reply);
406 }
407 
RegisterPropertyListener(sptr<IProducerListener> listener,uint64_t producerId)408 GSError BufferClientProducer::RegisterPropertyListener(sptr<IProducerListener> listener, uint64_t producerId)
409 {
410     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
411 
412     if (!arguments.WriteRemoteObject(listener->AsObject())) {
413         return GSERROR_BINDER;
414     }
415     if (!arguments.WriteUint64(producerId)) {
416         return GSERROR_BINDER;
417     }
418 
419     SEND_REQUEST(BUFFER_PRODUCER_REGISTER_PROPERTY_LISTENER, arguments, reply, option);
420     return CheckRetval(reply);
421 }
422 
UnRegisterPropertyListener(uint64_t producerId)423 GSError BufferClientProducer::UnRegisterPropertyListener(uint64_t producerId)
424 {
425     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
426 
427     if (!arguments.WriteUint64(producerId)) {
428         return GSERROR_BINDER;
429     }
430 
431     SEND_REQUEST(BUFFER_PRODUCER_UNREGISTER_PROPERTY_LISTENER, arguments, reply, option);
432     return CheckRetval(reply);
433 }
434 
RegisterReleaseListenerBackup(sptr<IProducerListener> listener)435 GSError BufferClientProducer::RegisterReleaseListenerBackup(sptr<IProducerListener> listener)
436 {
437     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
438 
439     if (listener == nullptr) {
440         return GSERROR_INVALID_ARGUMENTS;
441     }
442 
443     if (!arguments.WriteRemoteObject(listener->AsObject())) {
444         return GSERROR_BINDER;
445     }
446 
447     SEND_REQUEST(BUFFER_PRODUCER_REGISTER_RELEASE_LISTENER_BACKUP, arguments, reply, option);
448     return CheckRetval(reply);
449 }
450 
UnRegisterReleaseListener()451 GSError BufferClientProducer::UnRegisterReleaseListener()
452 {
453     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
454     SEND_REQUEST(BUFFER_PRODUCER_UNREGISTER_RELEASE_LISTENER, arguments, reply, option);
455     return CheckRetval(reply);
456 }
457 
UnRegisterReleaseListenerBackup()458 GSError BufferClientProducer::UnRegisterReleaseListenerBackup()
459 {
460     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
461     SEND_REQUEST(BUFFER_PRODUCER_UNREGISTER_RELEASE_LISTENER_BACKUP, arguments, reply, option);
462     return CheckRetval(reply);
463 }
464 
GetQueueSize()465 uint32_t BufferClientProducer::GetQueueSize()
466 {
467     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
468 
469     SEND_REQUEST(BUFFER_PRODUCER_GET_QUEUE_SIZE, arguments, reply, option);
470 
471     return reply.ReadUint32();
472 }
473 
SetQueueSize(uint32_t queueSize)474 GSError BufferClientProducer::SetQueueSize(uint32_t queueSize)
475 {
476     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
477 
478     if (!arguments.WriteUint32(queueSize)) {
479         return GSERROR_BINDER;
480     }
481 
482     SEND_REQUEST(BUFFER_PRODUCER_SET_QUEUE_SIZE, arguments, reply, option);
483     return CheckRetval(reply);
484 }
485 
GetName(std::string & name)486 GSError BufferClientProducer::GetName(std::string &name)
487 {
488     {
489         std::lock_guard<std::mutex> lockGuard(mutex_);
490         if (name_ != DEFAULT_NAME) {
491             name = name_;
492             return GSERROR_OK;
493         }
494     }
495     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
496 
497     SEND_REQUEST(BUFFER_PRODUCER_GET_NAME, arguments, reply, option);
498     GSError ret = CheckRetval(reply);
499     if (ret != GSERROR_OK) {
500         return ret;
501     }
502     if (!reply.ReadString(name)) {
503         BLOGE("reply.ReadString return false, uniqueId: %{public}" PRIu64 ".", uniqueId_);
504         return GSERROR_BINDER;
505     }
506     {
507         std::lock_guard<std::mutex> lockGuard(mutex_);
508         name_ = name;
509     }
510     return ret;
511 }
512 
GetUniqueId()513 uint64_t BufferClientProducer::GetUniqueId()
514 {
515     {
516         std::lock_guard<std::mutex> lockGuard(mutex_);
517         if (uniqueId_ != 0) {
518             return uniqueId_;
519         }
520     }
521     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
522     SEND_REQUEST(BUFFER_PRODUCER_GET_UNIQUE_ID, arguments, reply, option);
523     {
524         std::lock_guard<std::mutex> lockGuard(mutex_);
525         uniqueId_ = reply.ReadUint64();
526         return uniqueId_;
527     }
528 }
529 
GetNameAndUniqueId(std::string & name,uint64_t & uniqueId)530 GSError BufferClientProducer::GetNameAndUniqueId(std::string& name, uint64_t& uniqueId)
531 {
532     {
533         std::lock_guard<std::mutex> lockGuard(mutex_);
534         if (uniqueId_ != 0 && name_ != DEFAULT_NAME) {
535             uniqueId = uniqueId_;
536             name = name_;
537             return GSERROR_OK;
538         }
539     }
540     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
541 
542     SEND_REQUEST(BUFFER_PRODUCER_GET_NAMEANDUNIQUEDID, arguments, reply, option);
543     GSError ret = CheckRetval(reply);
544     if (ret != GSERROR_OK) {
545         return ret;
546     }
547     if (!reply.ReadString(name)) {
548         BLOGE("reply.ReadString return false, uniqueId: %{public}" PRIu64 ".", uniqueId_);
549         return GSERROR_BINDER;
550     }
551 
552     uniqueId = reply.ReadUint64();
553     {
554         std::lock_guard<std::mutex> lockGuard(mutex_);
555         name_ = name;
556         uniqueId_ = uniqueId;
557     }
558     return ret;
559 }
560 
GetDefaultWidth()561 int32_t BufferClientProducer::GetDefaultWidth()
562 {
563     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
564 
565     SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_WIDTH, arguments, reply, option);
566 
567     return reply.ReadInt32();
568 }
569 
GetDefaultHeight()570 int32_t BufferClientProducer::GetDefaultHeight()
571 {
572     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
573 
574     SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_HEIGHT, arguments, reply, option);
575 
576     return reply.ReadInt32();
577 }
578 
SetDefaultUsage(uint64_t usage)579 GSError BufferClientProducer::SetDefaultUsage(uint64_t usage)
580 {
581     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
582 
583     if (!arguments.WriteUint64(usage)) {
584         return GSERROR_BINDER;
585     }
586 
587     SEND_REQUEST(BUFFER_PRODUCER_SET_DEFAULT_USAGE, arguments, reply, option);
588 
589     return CheckRetval(reply);
590 }
591 
GetDefaultUsage()592 uint64_t BufferClientProducer::GetDefaultUsage()
593 {
594     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
595 
596     SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_USAGE, arguments, reply, option);
597 
598     return reply.ReadUint64();
599 }
600 
CleanCache(bool cleanAll,uint32_t * bufSeqNum)601 GSError BufferClientProducer::CleanCache(bool cleanAll, uint32_t *bufSeqNum)
602 {
603     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
604 
605     if (!arguments.WriteBool(cleanAll)) {
606         return GSERROR_BINDER;
607     }
608     SEND_REQUEST(BUFFER_PRODUCER_CLEAN_CACHE, arguments, reply, option);
609     GSError ret = CheckRetval(reply);
610     if (ret == GSERROR_OK && bufSeqNum != nullptr) {
611         *bufSeqNum = reply.ReadUint32();
612     }
613     return ret;
614 }
615 
GoBackground()616 GSError BufferClientProducer::GoBackground()
617 {
618     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
619 
620     SEND_REQUEST(BUFFER_PRODUCER_GO_BACKGROUND, arguments, reply, option);
621     return CheckRetval(reply);
622 }
623 
SetTransform(GraphicTransformType transform)624 GSError BufferClientProducer::SetTransform(GraphicTransformType transform)
625 {
626     {
627         std::lock_guard<std::mutex> lockGuard(mutex_);
628         if (lastSetTransformType_ == transform) {
629             return GSERROR_OK;
630         }
631         lastSetTransformType_ = transform;
632     }
633 
634     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
635 
636     if (!arguments.WriteUint32(static_cast<uint32_t>(transform))) {
637         return GSERROR_BINDER;
638     }
639 
640     SEND_REQUEST(BUFFER_PRODUCER_SET_TRANSFORM, arguments, reply, option);
641     GSError ret = CheckRetval(reply);
642     if (ret != GSERROR_OK) {
643         {
644             std::lock_guard<std::mutex> lockGuard(mutex_);
645             lastSetTransformType_ = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
646         }
647         return ret;
648     }
649 
650     return GSERROR_OK;
651 }
652 
Connect()653 GSError BufferClientProducer::Connect()
654 {
655     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
656 
657     SEND_REQUEST(BUFFER_PRODUCER_CONNECT, arguments, reply, option);
658     return CheckRetval(reply);
659 }
660 
Disconnect(uint32_t * bufSeqNum)661 GSError BufferClientProducer::Disconnect(uint32_t *bufSeqNum)
662 {
663     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
664 
665     SEND_REQUEST(BUFFER_PRODUCER_DISCONNECT, arguments, reply, option);
666     GSError ret = CheckRetval(reply);
667     if (ret == GSERROR_OK && bufSeqNum != nullptr) {
668         *bufSeqNum = reply.ReadUint32();
669     }
670     return ret;
671 }
672 
ConnectStrictly()673 GSError BufferClientProducer::ConnectStrictly()
674 {
675     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
676 
677     SEND_REQUEST(BUFFER_PRODUCER_CONNECT_STRICTLY, arguments, reply, option);
678     return CheckRetval(reply);
679 }
680 
DisconnectStrictly()681 GSError BufferClientProducer::DisconnectStrictly()
682 {
683     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
684 
685     SEND_REQUEST(BUFFER_PRODUCER_DISCONNECT_STRICTLY, arguments, reply, option);
686     return CheckRetval(reply);
687 }
688 
SetScalingMode(uint32_t sequence,ScalingMode scalingMode)689 GSError BufferClientProducer::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
690 {
691     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
692     if (!arguments.WriteUint32(sequence) || !arguments.WriteInt32(static_cast<int32_t>(scalingMode))) {
693         return GSERROR_BINDER;
694     }
695     SEND_REQUEST(BUFFER_PRODUCER_SET_SCALING_MODE, arguments, reply, option);
696     return CheckRetval(reply);
697 }
698 
SetScalingMode(ScalingMode scalingMode)699 GSError BufferClientProducer::SetScalingMode(ScalingMode scalingMode)
700 {
701     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
702     if (!arguments.WriteInt32(static_cast<int32_t>(scalingMode))) {
703         return GSERROR_BINDER;
704     }
705     SEND_REQUEST(BUFFER_PRODUCER_SET_SCALING_MODEV2, arguments, reply, option);
706     return CheckRetval(reply);
707 }
708 
SetBufferHold(bool hold)709 GSError BufferClientProducer::SetBufferHold(bool hold)
710 {
711     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
712     if (!arguments.WriteBool(hold)) {
713         return GSERROR_BINDER;
714     }
715     SEND_REQUEST(BUFFER_PRODUCER_SET_BUFFER_HOLD, arguments, reply, option);
716     return CheckRetval(reply);
717 }
718 
SetBufferName(const std::string & bufferName)719 GSError BufferClientProducer::SetBufferName(const std::string &bufferName)
720 {
721     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
722     if (!arguments.WriteString(bufferName)) {
723         return GSERROR_BINDER;
724     }
725     SEND_REQUEST(BUFFER_PRODUCER_SET_BUFFER_NAME, arguments, reply, option);
726     return CheckRetval(reply);
727 }
728 
SetMetaData(uint32_t sequence,const std::vector<GraphicHDRMetaData> & metaData)729 GSError BufferClientProducer::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData> &metaData)
730 {
731     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
732     if (!arguments.WriteUint32(sequence)) {
733         return GSERROR_BINDER;
734     }
735     GSError ret = WriteHDRMetaData(arguments, metaData);
736     if (ret != GSERROR_OK) {
737         return ret;
738     }
739     SEND_REQUEST(BUFFER_PRODUCER_SET_METADATA, arguments, reply, option);
740     return CheckRetval(reply);
741 }
742 
SetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)743 GSError BufferClientProducer::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
744                                              const std::vector<uint8_t> &metaData)
745 {
746     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
747     if (!arguments.WriteUint32(sequence) || !arguments.WriteUint32(static_cast<uint32_t>(key))) {
748         return GSERROR_BINDER;
749     }
750     GSError ret = WriteHDRMetaDataSet(arguments, metaData);
751     if (ret != GSERROR_OK) {
752         return ret;
753     }
754     SEND_REQUEST(BUFFER_PRODUCER_SET_METADATASET, arguments, reply, option);
755     return CheckRetval(reply);
756 }
757 
SetTunnelHandle(const GraphicExtDataHandle * handle)758 GSError BufferClientProducer::SetTunnelHandle(const GraphicExtDataHandle *handle)
759 {
760     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
761     if (handle == nullptr) {
762         if (!arguments.WriteBool(false)) {
763             return GSERROR_BINDER;
764         }
765     } else {
766         if (!arguments.WriteBool(true)) {
767             return GSERROR_BINDER;
768         }
769         GSError ret = WriteExtDataHandle(arguments, handle);
770         if (ret != GSERROR_OK) {
771             return ret;
772         }
773     }
774     SEND_REQUEST(BUFFER_PRODUCER_SET_TUNNEL_HANDLE, arguments, reply, option);
775     return CheckRetval(reply);
776 }
777 
GetPresentTimestamp(uint32_t sequence,GraphicPresentTimestampType type,int64_t & time)778 GSError BufferClientProducer::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type, int64_t &time)
779 {
780     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
781     if (!arguments.WriteUint32(sequence) || !arguments.WriteUint32(static_cast<uint32_t>(type))) {
782         return GSERROR_BINDER;
783     }
784     SEND_REQUEST(BUFFER_PRODUCER_GET_PRESENT_TIMESTAMP, arguments, reply, option);
785     GSError ret = CheckRetval(reply);
786     if (ret != GSERROR_OK) {
787         return ret;
788     }
789     time = reply.ReadInt64();
790     return static_cast<GSError>(ret);
791 }
792 
GetNativeSurface()793 sptr<NativeSurface> BufferClientProducer::GetNativeSurface()
794 {
795     return nullptr;
796 }
797 
GetTransform(GraphicTransformType & transform)798 GSError BufferClientProducer::GetTransform(GraphicTransformType &transform)
799 {
800     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
801     SEND_REQUEST(BUFFER_PRODUCER_GET_TRANSFORM, arguments, reply, option);
802 
803     GSError ret = CheckRetval(reply);
804     if (ret != GSERROR_OK) {
805         return ret;
806     }
807     transform = static_cast<GraphicTransformType>(reply.ReadUint32());
808     return GSERROR_OK;
809 }
810 
GetTransformHint(GraphicTransformType & transformHint)811 GSError BufferClientProducer::GetTransformHint(GraphicTransformType &transformHint)
812 {
813     return GSERROR_NOT_SUPPORT;
814 }
815 
SetTransformHint(GraphicTransformType transformHint,uint64_t fromId)816 GSError BufferClientProducer::SetTransformHint(GraphicTransformType transformHint, uint64_t fromId)
817 {
818     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
819 
820     if (!arguments.WriteUint32(static_cast<uint32_t>(transformHint))) {
821         return GSERROR_BINDER;
822     }
823 
824     if (!arguments.WriteUint64(fromId)) {
825         return GSERROR_BINDER;
826     }
827 
828     SEND_REQUEST(BUFFER_PRODUCER_SET_TRANSFORMHINT, arguments, reply, option);
829     return CheckRetval(reply);
830 }
831 
SetSurfaceSourceType(OHSurfaceSource sourceType)832 GSError BufferClientProducer::SetSurfaceSourceType(OHSurfaceSource sourceType)
833 {
834     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
835     if (!arguments.WriteUint32(static_cast<uint32_t>(sourceType))) {
836         return GSERROR_BINDER;
837     }
838     SEND_REQUEST(BUFFER_PRODUCER_SET_SOURCE_TYPE, arguments, reply, option);
839     return CheckRetval(reply);
840 }
841 
GetSurfaceSourceType(OHSurfaceSource & sourceType)842 GSError BufferClientProducer::GetSurfaceSourceType(OHSurfaceSource &sourceType)
843 {
844     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
845     SEND_REQUEST(BUFFER_PRODUCER_GET_SOURCE_TYPE, arguments, reply, option);
846     GSError ret = CheckRetval(reply);
847     if (ret != GSERROR_OK) {
848         return ret;
849     }
850     sourceType = static_cast<OHSurfaceSource>(reply.ReadUint32());
851     return GSERROR_OK;
852 }
853 
SetSurfaceAppFrameworkType(std::string appFrameworkType)854 GSError BufferClientProducer::SetSurfaceAppFrameworkType(std::string appFrameworkType)
855 {
856     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
857     if (!arguments.WriteString(appFrameworkType)) {
858         return GSERROR_BINDER;
859     }
860     SEND_REQUEST(BUFFER_PRODUCER_SET_APP_FRAMEWORK_TYPE, arguments, reply, option);
861     return CheckRetval(reply);
862 }
863 
GetSurfaceAppFrameworkType(std::string & appFrameworkType)864 GSError BufferClientProducer::GetSurfaceAppFrameworkType(std::string &appFrameworkType)
865 {
866     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
867     SEND_REQUEST(BUFFER_PRODUCER_GET_APP_FRAMEWORK_TYPE, arguments, reply, option);
868     GSError ret = CheckRetval(reply);
869     if (ret != GSERROR_OK) {
870         return ret;
871     }
872     appFrameworkType = static_cast<std::string>(reply.ReadString());
873     return GSERROR_OK;
874 }
875 
SetHdrWhitePointBrightness(float brightness)876 GSError BufferClientProducer::SetHdrWhitePointBrightness(float brightness)
877 {
878     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
879 
880     if (!arguments.WriteFloat(brightness)) {
881         return GSERROR_BINDER;
882     }
883 
884     SEND_REQUEST(BUFFER_PRODUCER_SET_HDRWHITEPOINTBRIGHTNESS, arguments, reply, option);
885     return CheckRetval(reply);
886 }
887 
SetSdrWhitePointBrightness(float brightness)888 GSError BufferClientProducer::SetSdrWhitePointBrightness(float brightness)
889 {
890     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
891 
892     if (!arguments.WriteFloat(brightness)) {
893         return GSERROR_BINDER;
894     }
895 
896     SEND_REQUEST(BUFFER_PRODUCER_SET_SDRWHITEPOINTBRIGHTNESS, arguments, reply, option);
897     return CheckRetval(reply);
898 }
899 
AcquireLastFlushedBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],uint32_t matrixSize,bool isUseNewMatrix)900 GSError BufferClientProducer::AcquireLastFlushedBuffer(sptr<SurfaceBuffer> &buffer, sptr<SyncFence> &fence,
901     float matrix[16], uint32_t matrixSize, bool isUseNewMatrix)
902 {
903     return GetLastFlushedBufferCommon(buffer, fence,
904         matrix, matrixSize, isUseNewMatrix, BUFFER_PRODUCER_ACQUIRE_LAST_FLUSHED_BUFFER);
905 }
906 
ReleaseLastFlushedBuffer(uint32_t sequence)907 GSError BufferClientProducer::ReleaseLastFlushedBuffer(uint32_t sequence)
908 {
909     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
910     if (!arguments.WriteUint32(sequence)) {
911         return GSERROR_BINDER;
912     }
913     SEND_REQUEST(BUFFER_PRODUCER_RELEASE_LAST_FLUSHED_BUFFER, arguments, reply, option);
914     return CheckRetval(reply);
915 }
916 
SetGlobalAlpha(int32_t alpha)917 GSError BufferClientProducer::SetGlobalAlpha(int32_t alpha)
918 {
919     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
920     if (!arguments.WriteInt32(alpha)) {
921         return GSERROR_BINDER;
922     }
923     SEND_REQUEST(BUFFER_PRODUCER_SET_GLOBALALPHA, arguments, reply, option);
924     return CheckRetval(reply);
925 }
926 
RequestAndDetachBuffer(const BufferRequestConfig & config,sptr<BufferExtraData> & bedata,RequestBufferReturnValue & retval)927 GSError BufferClientProducer::RequestAndDetachBuffer(const BufferRequestConfig& config,
928     sptr<BufferExtraData>& bedata, RequestBufferReturnValue& retval)
929 {
930     return RequestBufferCommon(config, bedata, retval, BUFFER_PRODUCER_REQUEST_AND_DETACH_BUFFER);
931 }
932 
AttachAndFlushBuffer(sptr<SurfaceBuffer> & buffer,sptr<BufferExtraData> & bedata,const sptr<SyncFence> & fence,BufferFlushConfigWithDamages & config,bool needMap)933 GSError BufferClientProducer::AttachAndFlushBuffer(sptr<SurfaceBuffer>& buffer, sptr<BufferExtraData>& bedata,
934     const sptr<SyncFence>& fence, BufferFlushConfigWithDamages& config, bool needMap)
935 {
936     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
937     GSError ret = WriteSurfaceBufferImpl(arguments, buffer->GetSeqNum(), buffer);
938     if (ret != GSERROR_OK) {
939         return ret;
940     }
941     ret = buffer->WriteBufferRequestConfig(arguments);
942     if (ret != GSERROR_OK) {
943         BLOGE("WriteBufferRequestConfig ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_);
944         return ret;
945     }
946 
947     ret = bedata->WriteToParcel(arguments);
948     if (ret != GSERROR_OK) {
949         return ret;
950     }
951     if (!fence->WriteToMessageParcel(arguments)) {
952         return GSERROR_BINDER;
953     }
954     ret = WriteFlushConfig(arguments, config);
955     if (ret != GSERROR_OK) {
956         return ret;
957     }
958     if (!arguments.WriteBool(needMap)) {
959         return GSERROR_BINDER;
960     }
961     SEND_REQUEST(BUFFER_PRODUCER_ATTACH_AND_FLUSH_BUFFER, arguments, reply, option);
962     return CheckRetval(reply);
963 }
964 
GetCycleBuffersNumber(uint32_t & cycleBuffersNumber)965 GSError BufferClientProducer::GetCycleBuffersNumber(uint32_t& cycleBuffersNumber)
966 {
967     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
968     SEND_REQUEST(BUFFER_PRODUCER_GET_ROTATING_BUFFERS_NUMBER, arguments, reply, option);
969     GSError ret = CheckRetval(reply);
970     if (ret != GSERROR_OK) {
971         return ret;
972     }
973     cycleBuffersNumber = reply.ReadUint32();
974     return GSERROR_OK;
975 }
976 
SetCycleBuffersNumber(uint32_t cycleBuffersNumber)977 GSError BufferClientProducer::SetCycleBuffersNumber(uint32_t cycleBuffersNumber)
978 {
979     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
980     if (!arguments.WriteUint32(cycleBuffersNumber)) {
981         return GSERROR_BINDER;
982     }
983     SEND_REQUEST(BUFFER_PRODUCER_SET_ROTATING_BUFFERS_NUMBER, arguments, reply, option);
984     return CheckRetval(reply);
985 }
986 }; // namespace OHOS
987