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