• 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 <iremote_stub.h>
19 #include "buffer_log.h"
20 #include "buffer_manager.h"
21 #include "buffer_utils.h"
22 #include "sync_fence.h"
23 #include "message_option.h"
24 #include "securec.h"
25 
26 #define DEFINE_MESSAGE_VARIABLES(arg, ret, opt, LOGE) \
27     MessageOption opt;                                \
28     MessageParcel arg;                                \
29     MessageParcel ret;                                \
30     if (!arg.WriteInterfaceToken(GetDescriptor())) {  \
31         LOGE("write interface token failed");         \
32     }
33 
34 #define SEND_REQUEST(COMMAND, arguments, reply, option)                         \
35     do {                                                                        \
36         int32_t ret = Remote()->SendRequest(COMMAND, arguments, reply, option); \
37         if (ret != ERR_NONE) {                                                  \
38             BLOGN_FAILURE("SendRequest return %{public}d", ret);                 \
39             return GSERROR_BINDER;                                  \
40         }                                                                       \
41     } while (0)
42 
43 #define SEND_REQUEST_WITH_SEQ(COMMAND, arguments, reply, option, sequence)      \
44     do {                                                                        \
45         int32_t ret = Remote()->SendRequest(COMMAND, arguments, reply, option); \
46         if (ret != ERR_NONE) {                                                  \
47             BLOGN_FAILURE_ID(sequence, "SendRequest return %{public}d", ret);    \
48             return GSERROR_BINDER;                                  \
49         }                                                                       \
50     } while (0)
51 
52 #define CHECK_RETVAL_WITH_SEQ(reply, sequence)                          \
53     do {                                                                \
54         int32_t ret = reply.ReadInt32();                                \
55         if (ret != GSERROR_OK) {                                  \
56             BLOGN_FAILURE_ID(sequence, "Remote return %{public}d", ret); \
57             return (GSError)ret;                                   \
58         }                                                               \
59     } while (0)
60 
61 namespace OHOS {
BufferClientProducer(const sptr<IRemoteObject> & impl)62 BufferClientProducer::BufferClientProducer(const sptr<IRemoteObject>& impl)
63     : IRemoteProxy<IBufferProducer>(impl)
64 {
65 }
66 
~BufferClientProducer()67 BufferClientProducer::~BufferClientProducer()
68 {
69 }
70 
RequestBuffer(const BufferRequestConfig & config,sptr<BufferExtraData> & bedata,RequestBufferReturnValue & retval)71 GSError BufferClientProducer::RequestBuffer(const BufferRequestConfig &config, sptr<BufferExtraData> &bedata,
72                                             RequestBufferReturnValue &retval)
73 {
74     DEFINE_MESSAGE_VARIABLES(arguments, reply, option, BLOGE);
75 
76     WriteRequestConfig(arguments, config);
77 
78     SEND_REQUEST(BUFFER_PRODUCER_REQUEST_BUFFER, arguments, reply, option);
79     int32_t retCode = reply.ReadInt32();
80     if (retCode != GSERROR_OK) {
81         BLOGND("Remote return %{public}d", retCode);
82         return (GSError)retCode;
83     }
84 
85     GSError ret = ReadSurfaceBufferImpl(reply, retval.sequence, retval.buffer);
86     if (ret != GSERROR_OK) {
87         BLOGN_FAILURE("Read surface buffer impl failed, return %{public}d", ret);
88         return ret;
89     }
90 
91     ret = bedata->ReadFromParcel(reply);
92     if (ret != GSERROR_OK) {
93         BLOGN_FAILURE("Read extra data from parcel failed, return %{public}d", ret);
94         return ret;
95     }
96     retval.fence = SyncFence::ReadFromMessageParcel(reply);
97     reply.ReadInt32Vector(&retval.deletingBuffers);
98 
99     return GSERROR_OK;
100 }
101 
GetLastFlushedBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16])102 GSError BufferClientProducer::GetLastFlushedBuffer(sptr<SurfaceBuffer>& buffer,
103     sptr<SyncFence>& fence, float matrix[16])
104 {
105     DEFINE_MESSAGE_VARIABLES(arguments, reply, option, BLOGE);
106 
107     SEND_REQUEST(BUFFER_PRODUCER_GET_LAST_FLUSHED_BUFFER, arguments, reply, option);
108     int32_t retCode = reply.ReadInt32();
109     if (retCode != GSERROR_OK) {
110         BLOGND("Remote return %{public}d", retCode);
111         return (GSError)retCode;
112     }
113     uint32_t sequence;
114     GSError ret = ReadSurfaceBufferImpl(reply, sequence, buffer);
115     if (ret != GSERROR_OK) {
116         BLOGN_FAILURE("Read surface buffer impl failed, return %{public}d", ret);
117         return ret;
118     }
119 
120     fence = SyncFence::ReadFromMessageParcel(reply);
121     std::vector<float> readMatrixVector;
122     reply.ReadFloatVector(&readMatrixVector);
123     if (memcpy_s(matrix, readMatrixVector.size() * sizeof(float),
124         &readMatrixVector, readMatrixVector.size() * sizeof(float)) != EOK) {
125         BLOGN_FAILURE("memcpy_s fail");
126         return GSERROR_API_FAILED;
127     }
128     return GSERROR_OK;
129 }
130 
CancelBuffer(uint32_t sequence,const sptr<BufferExtraData> & bedata)131 GSError BufferClientProducer::CancelBuffer(uint32_t sequence, const sptr<BufferExtraData> &bedata)
132 {
133     DEFINE_MESSAGE_VARIABLES(arguments, reply, option, BLOGE);
134 
135     arguments.WriteUint32(sequence);
136     bedata->WriteToParcel(arguments);
137 
138     SEND_REQUEST_WITH_SEQ(BUFFER_PRODUCER_CANCEL_BUFFER, arguments, reply, option, sequence);
139     CHECK_RETVAL_WITH_SEQ(reply, sequence);
140 
141     return GSERROR_OK;
142 }
143 
FlushBuffer(uint32_t sequence,const sptr<BufferExtraData> & bedata,const sptr<SyncFence> & fence,BufferFlushConfigWithDamages & config)144 GSError BufferClientProducer::FlushBuffer(uint32_t sequence, const sptr<BufferExtraData> &bedata,
145                                           const sptr<SyncFence>& fence, BufferFlushConfigWithDamages &config)
146 {
147     DEFINE_MESSAGE_VARIABLES(arguments, reply, option, BLOGE);
148 
149     arguments.WriteUint32(sequence);
150     bedata->WriteToParcel(arguments);
151     fence->WriteToMessageParcel(arguments);
152     WriteFlushConfig(arguments, config);
153 
154     SEND_REQUEST_WITH_SEQ(BUFFER_PRODUCER_FLUSH_BUFFER, arguments, reply, option, sequence);
155     CHECK_RETVAL_WITH_SEQ(reply, sequence);
156 
157     return GSERROR_OK;
158 }
159 
AttachBuffer(sptr<SurfaceBuffer> & buffer)160 GSError BufferClientProducer::AttachBuffer(sptr<SurfaceBuffer>& buffer)
161 {
162     return GSERROR_NOT_SUPPORT;
163 }
164 
DetachBuffer(sptr<SurfaceBuffer> & buffer)165 GSError BufferClientProducer::DetachBuffer(sptr<SurfaceBuffer>& buffer)
166 {
167     return GSERROR_NOT_SUPPORT;
168 }
169 
RegisterReleaseListener(sptr<IProducerListener> listener)170 GSError BufferClientProducer::RegisterReleaseListener(sptr<IProducerListener> listener)
171 {
172     DEFINE_MESSAGE_VARIABLES(arguments, reply, option, BLOGE);
173 
174     arguments.WriteRemoteObject(listener->AsObject());
175 
176     SEND_REQUEST(BUFFER_PRODUCER_REGISTER_RELEASE_LISTENER, arguments, reply, option);
177     int32_t ret = reply.ReadInt32();
178     if (ret != GSERROR_OK) {
179         BLOGN_FAILURE("Remote return %{public}d", ret);
180         return (GSError)ret;
181     }
182     return GSERROR_OK;
183 }
184 
UnRegisterReleaseListener()185 GSError BufferClientProducer::UnRegisterReleaseListener()
186 {
187     DEFINE_MESSAGE_VARIABLES(arguments, reply, option, BLOGE);
188     SEND_REQUEST(BUFFER_PRODUCER_UNREGISTER_RELEASE_LISTENER, arguments, reply, option);
189     int32_t ret = reply.ReadInt32();
190     if (ret != GSERROR_OK) {
191         BLOGN_FAILURE("Remote return %{public}d", ret);
192         return (GSError)ret;
193     }
194     return GSERROR_OK;
195 }
196 
GetQueueSize()197 uint32_t BufferClientProducer::GetQueueSize()
198 {
199     DEFINE_MESSAGE_VARIABLES(arguments, reply, option, BLOGE);
200 
201     SEND_REQUEST(BUFFER_PRODUCER_GET_QUEUE_SIZE, arguments, reply, option);
202 
203     return reply.ReadUint32();
204 }
205 
SetQueueSize(uint32_t queueSize)206 GSError BufferClientProducer::SetQueueSize(uint32_t queueSize)
207 {
208     DEFINE_MESSAGE_VARIABLES(arguments, reply, option, BLOGE);
209 
210     arguments.WriteInt32(queueSize);
211 
212     SEND_REQUEST(BUFFER_PRODUCER_SET_QUEUE_SIZE, arguments, reply, option);
213     int32_t ret = reply.ReadInt32();
214     if (ret != GSERROR_OK) {
215         BLOGN_FAILURE("Remote return %{public}d", ret);
216         return (GSError)ret;
217     }
218 
219     return GSERROR_OK;
220 }
221 
GetName(std::string & name)222 GSError BufferClientProducer::GetName(std::string &name)
223 {
224     {
225         std::lock_guard<std::mutex> lockGuard(mutex_);
226         if (name_ != "not init") {
227             name = name_;
228             return GSERROR_OK;
229         }
230     }
231     DEFINE_MESSAGE_VARIABLES(arguments, reply, option, BLOGE);
232 
233     SEND_REQUEST(BUFFER_PRODUCER_GET_NAME, arguments, reply, option);
234     int32_t ret = reply.ReadInt32();
235     if (ret != GSERROR_OK) {
236         BLOGN_FAILURE("Remote return %{public}d", ret);
237         return static_cast<GSError>(ret);
238     }
239     if (reply.ReadString(name) == false) {
240         BLOGN_FAILURE("reply.ReadString return false");
241         return GSERROR_BINDER;
242     }
243     {
244         std::lock_guard<std::mutex> lockGuard(mutex_);
245         name_ = name;
246     }
247     return static_cast<GSError>(ret);
248 }
249 
GetUniqueId()250 uint64_t BufferClientProducer::GetUniqueId()
251 {
252     {
253         std::lock_guard<std::mutex> lockGuard(mutex_);
254         if (uniqueId_ != 0) {
255             return uniqueId_;
256         }
257     }
258     DEFINE_MESSAGE_VARIABLES(arguments, reply, option, BLOGE);
259     SEND_REQUEST(BUFFER_PRODUCER_GET_UNIQUE_ID, arguments, reply, option);
260     {
261         std::lock_guard<std::mutex> lockGuard(mutex_);
262         uniqueId_ = reply.ReadUint64();
263     }
264     return uniqueId_;
265 }
266 
GetNameAndUniqueId(std::string & name,uint64_t & uniqueId)267 GSError BufferClientProducer::GetNameAndUniqueId(std::string& name, uint64_t& uniqueId)
268 {
269     {
270         std::lock_guard<std::mutex> lockGuard(mutex_);
271         if (uniqueId_ != 0 && name_ != "not init") {
272             uniqueId = uniqueId_;
273             name = name_;
274             return GSERROR_OK;
275         }
276     }
277     DEFINE_MESSAGE_VARIABLES(arguments, reply, option, BLOGE);
278 
279     SEND_REQUEST(BUFFER_PRODUCER_GET_NAMEANDUNIQUEDID, arguments, reply, option);
280     int32_t ret = reply.ReadInt32();
281     if (ret != GSERROR_OK) {
282         BLOGN_FAILURE("Remote return %{public}d", ret);
283         return static_cast<GSError>(ret);
284     }
285     if (reply.ReadString(name) == false) {
286         BLOGN_FAILURE("reply.ReadString return false");
287         return GSERROR_BINDER;
288     }
289 
290     uniqueId = reply.ReadUint64();
291     {
292         std::lock_guard<std::mutex> lockGuard(mutex_);
293         name_ = name;
294         uniqueId_ = uniqueId;
295     }
296     return static_cast<GSError>(ret);
297 }
298 
GetDefaultWidth()299 int32_t BufferClientProducer::GetDefaultWidth()
300 {
301     DEFINE_MESSAGE_VARIABLES(arguments, reply, option, BLOGE);
302 
303     SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_WIDTH, arguments, reply, option);
304 
305     return reply.ReadInt32();
306 }
307 
GetDefaultHeight()308 int32_t BufferClientProducer::GetDefaultHeight()
309 {
310     DEFINE_MESSAGE_VARIABLES(arguments, reply, option, BLOGE);
311 
312     SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_HEIGHT, arguments, reply, option);
313 
314     return reply.ReadInt32();
315 }
316 
GetDefaultUsage()317 uint32_t BufferClientProducer::GetDefaultUsage()
318 {
319     DEFINE_MESSAGE_VARIABLES(arguments, reply, option, BLOGE);
320 
321     SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_USAGE, arguments, reply, option);
322 
323     return reply.ReadUint32();
324 }
325 
CleanCache()326 GSError BufferClientProducer::CleanCache()
327 {
328     DEFINE_MESSAGE_VARIABLES(arguments, reply, option, BLOGE);
329 
330     SEND_REQUEST(BUFFER_PRODUCER_CLEAN_CACHE, arguments, reply, option);
331     int32_t ret = reply.ReadInt32();
332     if (ret != GSERROR_OK) {
333         BLOGN_FAILURE("Remote return %{public}d", ret);
334         return (GSError)ret;
335     }
336 
337     return GSERROR_OK;
338 }
339 
GoBackground()340 GSError BufferClientProducer::GoBackground()
341 {
342     DEFINE_MESSAGE_VARIABLES(arguments, reply, option, BLOGE);
343 
344     SEND_REQUEST(BUFFER_PRODUCER_GO_BACKGROUND, arguments, reply, option);
345     int32_t ret = reply.ReadInt32();
346     if (ret != GSERROR_OK) {
347         BLOGN_FAILURE("Remote return %{public}d", ret);
348         return (GSError)ret;
349     }
350 
351     return GSERROR_OK;
352 }
353 
SetTransform(GraphicTransformType transform)354 GSError BufferClientProducer::SetTransform(GraphicTransformType transform)
355 {
356     DEFINE_MESSAGE_VARIABLES(arguments, reply, option, BLOGE);
357 
358     arguments.WriteUint32(static_cast<uint32_t>(transform));
359 
360     SEND_REQUEST(BUFFER_PRODUCER_SET_TRANSFORM, arguments, reply, option);
361     int32_t ret = reply.ReadInt32();
362     if (ret != GSERROR_OK) {
363         BLOGN_FAILURE("Remote return %{public}d", ret);
364         return (GSError)ret;
365     }
366 
367     return GSERROR_OK;
368 }
369 
IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> & infos,std::vector<bool> & supporteds)370 GSError BufferClientProducer::IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> &infos,
371                                                std::vector<bool> &supporteds)
372 {
373     DEFINE_MESSAGE_VARIABLES(arguments, reply, option, BLOGE);
374 
375     WriteVerifyAllocInfo(arguments, infos);
376 
377     SEND_REQUEST(BUFFER_PRODUCER_IS_SUPPORTED_ALLOC, arguments, reply, option);
378     int32_t ret = reply.ReadInt32();
379     if (ret != GSERROR_OK) {
380         BLOGN_FAILURE("Remote return %{public}d", ret);
381         return static_cast<GSError>(ret);
382     }
383 
384     if (reply.ReadBoolVector(&supporteds) == false) {
385         BLOGN_FAILURE("reply.ReadBoolVector return false");
386         return GSERROR_BINDER;
387     }
388 
389     return static_cast<GSError>(ret);
390 }
391 
Disconnect()392 GSError BufferClientProducer::Disconnect()
393 {
394     DEFINE_MESSAGE_VARIABLES(arguments, reply, option, BLOGE);
395 
396     SEND_REQUEST(BUFFER_PRODUCER_DISCONNECT, arguments, reply, option);
397     int32_t ret = reply.ReadInt32();
398     if (ret != GSERROR_OK) {
399         BLOGN_FAILURE("Remote return %{public}d", ret);
400         return static_cast<GSError>(ret);
401     }
402     return GSERROR_OK;
403 }
404 
SetScalingMode(uint32_t sequence,ScalingMode scalingMode)405 GSError BufferClientProducer::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
406 {
407     DEFINE_MESSAGE_VARIABLES(arguments, reply, option, BLOGE);
408     arguments.WriteUint32(sequence);
409     arguments.WriteInt32(static_cast<int32_t>(scalingMode));
410     SEND_REQUEST(BUFFER_PRODUCER_SET_SCALING_MODE, arguments, reply, option);
411     int32_t ret = reply.ReadInt32();
412     if (ret != GSERROR_OK) {
413         BLOGN_FAILURE("Remote return %{public}d", ret);
414         return (GSError)ret;
415     }
416 
417     return GSERROR_OK;
418 }
419 
SetMetaData(uint32_t sequence,const std::vector<GraphicHDRMetaData> & metaData)420 GSError BufferClientProducer::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData> &metaData)
421 {
422     DEFINE_MESSAGE_VARIABLES(arguments, reply, option, BLOGE);
423     arguments.WriteUint32(sequence);
424     WriteHDRMetaData(arguments, metaData);
425     SEND_REQUEST(BUFFER_PRODUCER_SET_METADATA, arguments, reply, option);
426     int32_t ret = reply.ReadInt32();
427     if (ret != GSERROR_OK) {
428         BLOGN_FAILURE("Remote return %{public}d", ret);
429         return (GSError)ret;
430     }
431 
432     return GSERROR_OK;
433 }
434 
SetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)435 GSError BufferClientProducer::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
436                                              const std::vector<uint8_t> &metaData)
437 {
438     DEFINE_MESSAGE_VARIABLES(arguments, reply, option, BLOGE);
439     arguments.WriteUint32(sequence);
440     arguments.WriteUint32(static_cast<uint32_t>(key));
441     WriteHDRMetaDataSet(arguments, metaData);
442     SEND_REQUEST(BUFFER_PRODUCER_SET_METADATASET, arguments, reply, option);
443     int32_t ret = reply.ReadInt32();
444     if (ret != GSERROR_OK) {
445         BLOGN_FAILURE("Remote return %{public}d", ret);
446         return (GSError)ret;
447     }
448 
449     return GSERROR_OK;
450 }
451 
SetTunnelHandle(const GraphicExtDataHandle * handle)452 GSError BufferClientProducer::SetTunnelHandle(const GraphicExtDataHandle *handle)
453 {
454     DEFINE_MESSAGE_VARIABLES(arguments, reply, option, BLOGE);
455     if (handle == nullptr) {
456         arguments.WriteBool(false);
457     } else {
458         arguments.WriteBool(true);
459         WriteExtDataHandle(arguments, handle);
460     }
461     SEND_REQUEST(BUFFER_PRODUCER_SET_TUNNEL_HANDLE, arguments, reply, option);
462     int32_t ret = reply.ReadInt32();
463     if (ret != GSERROR_OK) {
464         BLOGN_FAILURE("Remote return %{public}d", ret);
465         return (GSError)ret;
466     }
467     return GSERROR_OK;
468 }
469 
GetPresentTimestamp(uint32_t sequence,GraphicPresentTimestampType type,int64_t & time)470 GSError BufferClientProducer::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type, int64_t &time)
471 {
472     DEFINE_MESSAGE_VARIABLES(arguments, reply, option, BLOGE);
473     arguments.WriteUint32(sequence);
474     arguments.WriteUint32(static_cast<uint32_t>(type));
475     SEND_REQUEST(BUFFER_PRODUCER_GET_PRESENT_TIMESTAMP, arguments, reply, option);
476     int32_t ret = reply.ReadInt32();
477     if (ret != GSERROR_OK) {
478         BLOGN_FAILURE("Remote return %{public}d", ret);
479         return static_cast<GSError>(ret);
480     }
481     time = reply.ReadInt64();
482     return static_cast<GSError>(ret);
483 }
484 
GetNativeSurface()485 sptr<NativeSurface> BufferClientProducer::GetNativeSurface()
486 {
487     BLOGND("BufferClientProducer::GetNativeSurface not support.");
488     return nullptr;
489 }
490 
SendDeathRecipientObject()491 GSError BufferClientProducer::SendDeathRecipientObject()
492 {
493     DEFINE_MESSAGE_VARIABLES(arguments, reply, option, BLOGE);
494     token_ = new IRemoteStub<IBufferProducerToken>();
495     arguments.WriteRemoteObject(token_->AsObject());
496     SEND_REQUEST(BUFFER_PRODUCER_REGISTER_DEATH_RECIPIENT, arguments, reply, option);
497 
498     int32_t ret = reply.ReadInt32();
499     if (ret != GSERROR_OK) {
500         BLOGN_FAILURE("Remote return %{public}d", ret);
501         return static_cast<GSError>(ret);
502     }
503     return GSERROR_OK;
504 }
505 }; // namespace OHOS
506