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_queue_producer.h"
17
18 #include <cinttypes>
19 #include <mutex>
20 #include <set>
21
22 #include "buffer_extra_data_impl.h"
23 #include "buffer_log.h"
24 #include "buffer_producer_listener.h"
25 #include "buffer_utils.h"
26 #include "frame_report.h"
27 #include "sync_fence.h"
28
29 #define BUFFER_PRODUCER_API_FUNC_PAIR(apiSequenceNum, func) \
30 {apiSequenceNum, [](BufferQueueProducer *that, MessageParcel &arguments, MessageParcel &reply, \
31 MessageOption &option){return that->func(arguments, reply, option);}} \
32
33 namespace OHOS {
34 namespace {
35 constexpr int32_t BUFFER_MATRIX_SIZE = 16;
36 } // namespace
37
BufferQueueProducer(sptr<BufferQueue> bufferQueue)38 BufferQueueProducer::BufferQueueProducer(sptr<BufferQueue> bufferQueue)
39 : producerSurfaceDeathRecipient_(new ProducerSurfaceDeathRecipient(this))
40 {
41 bufferQueue_ = std::move(bufferQueue);
42 if (bufferQueue_ != nullptr) {
43 bufferQueue_->GetName(name_);
44 uniqueId_ = bufferQueue_->GetUniqueId();
45 }
46 memberFuncMap_ = {
47 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_INIT_INFO, GetProducerInitInfoRemote),
48 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_REQUEST_BUFFER, RequestBufferRemote),
49 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_REQUEST_BUFFERS, RequestBuffersRemote),
50 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_CANCEL_BUFFER, CancelBufferRemote),
51 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_FLUSH_BUFFER, FlushBufferRemote),
52 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_FLUSH_BUFFERS, FlushBuffersRemote),
53 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_ATTACH_BUFFER, AttachBufferRemote),
54 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_DETACH_BUFFER, DetachBufferRemote),
55 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_QUEUE_SIZE, GetQueueSizeRemote),
56 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_QUEUE_SIZE, SetQueueSizeRemote),
57 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_NAME, GetNameRemote),
58 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_DEFAULT_WIDTH, GetDefaultWidthRemote),
59 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_DEFAULT_HEIGHT, GetDefaultHeightRemote),
60 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_DEFAULT_USAGE, GetDefaultUsageRemote),
61 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_UNIQUE_ID, GetUniqueIdRemote),
62 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_CLEAN_CACHE, CleanCacheRemote),
63 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_REGISTER_RELEASE_LISTENER, RegisterReleaseListenerRemote),
64 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_TRANSFORM, SetTransformRemote),
65 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_IS_SUPPORTED_ALLOC, IsSupportedAllocRemote),
66 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_NAMEANDUNIQUEDID, GetNameAndUniqueIdRemote),
67 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_DISCONNECT, DisconnectRemote),
68 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_CONNECT, ConnectRemote),
69 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_SCALING_MODE, SetScalingModeRemote),
70 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_METADATA, SetMetaDataRemote),
71 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_METADATASET, SetMetaDataSetRemote),
72 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_TUNNEL_HANDLE, SetTunnelHandleRemote),
73 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GO_BACKGROUND, GoBackgroundRemote),
74 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_PRESENT_TIMESTAMP, GetPresentTimestampRemote),
75 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_UNREGISTER_RELEASE_LISTENER, UnRegisterReleaseListenerRemote),
76 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_LAST_FLUSHED_BUFFER, GetLastFlushedBufferRemote),
77 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_TRANSFORM, GetTransformRemote),
78 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_ATTACH_BUFFER_TO_QUEUE, AttachBufferToQueueRemote),
79 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_DETACH_BUFFER_FROM_QUEUE, DetachBufferFromQueueRemote),
80 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_DEFAULT_USAGE, SetDefaultUsageRemote),
81 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_TRANSFORMHINT, GetTransformHintRemote),
82 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_TRANSFORMHINT, SetTransformHintRemote),
83 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_BUFFER_HOLD, SetBufferHoldRemote),
84 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_SCALING_MODEV2, SetScalingModeV2Remote),
85 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_SOURCE_TYPE, SetSurfaceSourceTypeRemote),
86 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_SOURCE_TYPE, GetSurfaceSourceTypeRemote),
87 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_APP_FRAMEWORK_TYPE, SetSurfaceAppFrameworkTypeRemote),
88 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_APP_FRAMEWORK_TYPE, GetSurfaceAppFrameworkTypeRemote),
89 BUFFER_PRODUCER_API_FUNC_PAIR(
90 BUFFER_PRODUCER_SET_HDRWHITEPOINTBRIGHTNESS, SetHdrWhitePointBrightnessRemote),
91 BUFFER_PRODUCER_API_FUNC_PAIR(
92 BUFFER_PRODUCER_SET_SDRWHITEPOINTBRIGHTNESS, SetSdrWhitePointBrightnessRemote),
93 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_ACQUIRE_LAST_FLUSHED_BUFFER, AcquireLastFlushedBufferRemote),
94 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_RELEASE_LAST_FLUSHED_BUFFER, ReleaseLastFlushedBufferRemote),
95 };
96 }
97
~BufferQueueProducer()98 BufferQueueProducer::~BufferQueueProducer()
99 {
100 if (token_ && producerSurfaceDeathRecipient_) {
101 token_->RemoveDeathRecipient(producerSurfaceDeathRecipient_);
102 token_ = nullptr;
103 }
104 }
105
CheckConnectLocked()106 GSError BufferQueueProducer::CheckConnectLocked()
107 {
108 if (connectedPid_ == 0) {
109 BLOGW("no connections, uniqueId: %{public}" PRIu64 ".", uniqueId_);
110 return SURFACE_ERROR_CONSUMER_DISCONNECTED;
111 }
112
113 if (connectedPid_ != GetCallingPid()) {
114 BLOGW("connected by: %{public}d, uniqueId: %{public}" PRIu64 ".", connectedPid_, uniqueId_);
115 return SURFACE_ERROR_CONSUMER_IS_CONNECTED;
116 }
117
118 return GSERROR_OK;
119 }
120
OnRemoteRequest(uint32_t code,MessageParcel & arguments,MessageParcel & reply,MessageOption & option)121 int32_t BufferQueueProducer::OnRemoteRequest(uint32_t code, MessageParcel &arguments,
122 MessageParcel &reply, MessageOption &option)
123 {
124 auto it = memberFuncMap_.find(code);
125 if (it == memberFuncMap_.end()) {
126 BLOGE("cannot process %{public}u", code);
127 return 0;
128 }
129
130 if (it->second == nullptr) {
131 BLOGE("memberFuncMap_[%{public}u] is nullptr", code);
132 return 0;
133 }
134
135 auto remoteDescriptor = arguments.ReadInterfaceToken();
136 if (GetDescriptor() != remoteDescriptor) {
137 return ERR_INVALID_STATE;
138 }
139
140 auto ret = it->second(this, arguments, reply, option);
141 return ret;
142 }
143
RequestBufferRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)144 int32_t BufferQueueProducer::RequestBufferRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
145 {
146 RequestBufferReturnValue retval;
147 sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
148 BufferRequestConfig config = {};
149 int64_t startTimeNs = 0;
150 int64_t endTimeNs = 0;
151 bool isActiveGame = Rosen::FrameReport::GetInstance().IsActiveGameWithPid(connectedPid_);
152 if (isActiveGame) {
153 startTimeNs = std::chrono::duration_cast<std::chrono::nanoseconds>(
154 std::chrono::steady_clock::now().time_since_epoch()).count();
155 }
156
157 ReadRequestConfig(arguments, config);
158
159 GSError sret = RequestBuffer(config, bedataimpl, retval);
160
161 reply.WriteInt32(sret);
162 if (sret == GSERROR_OK) {
163 WriteSurfaceBufferImpl(reply, retval.sequence, retval.buffer);
164 bedataimpl->WriteToParcel(reply);
165 retval.fence->WriteToMessageParcel(reply);
166 reply.WriteUInt32Vector(retval.deletingBuffers);
167 } else {
168 reply.WriteBool(retval.isConnected);
169 }
170
171 if (isActiveGame) {
172 endTimeNs = std::chrono::duration_cast<std::chrono::nanoseconds>(
173 std::chrono::steady_clock::now().time_since_epoch()).count();
174 Rosen::FrameReport::GetInstance().SetDequeueBufferTime(name_, (endTimeNs - startTimeNs));
175 }
176
177 return 0;
178 }
179
RequestBuffersRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)180 int32_t BufferQueueProducer::RequestBuffersRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
181 {
182 std::vector<RequestBufferReturnValue> retvalues;
183 std::vector<sptr<BufferExtraData>> bedataimpls;
184 BufferRequestConfig config = {};
185 uint32_t num = 0;
186
187 arguments.ReadUint32(num);
188 ReadRequestConfig(arguments, config);
189 if (num == 0 || num > SURFACE_MAX_QUEUE_SIZE) {
190 return 0;
191 }
192 retvalues.resize(num);
193 bedataimpls.reserve(num);
194
195 for (uint32_t i = 0; i < num; ++i) {
196 sptr<BufferExtraData> data = new BufferExtraDataImpl;
197 bedataimpls.emplace_back(data);
198 }
199 GSError sret = RequestBuffers(config, bedataimpls, retvalues);
200 reply.WriteInt32(sret);
201 if (sret == GSERROR_OK || sret == GSERROR_NO_BUFFER) {
202 num = static_cast<uint32_t>(retvalues.size());
203 reply.WriteUint32(num);
204 for (uint32_t i = 0; i < num; ++i) {
205 WriteSurfaceBufferImpl(reply, retvalues[i].sequence, retvalues[i].buffer);
206 bedataimpls[i]->WriteToParcel(reply);
207 retvalues[i].fence->WriteToMessageParcel(reply);
208 reply.WriteUInt32Vector(retvalues[i].deletingBuffers);
209 }
210 } else if (sret != GSERROR_OK) {
211 reply.WriteBool(retvalues[0].isConnected);
212 }
213 return 0;
214 }
215
GetProducerInitInfoRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)216 int32_t BufferQueueProducer::GetProducerInitInfoRemote(MessageParcel &arguments,
217 MessageParcel &reply, MessageOption &option)
218 {
219 ProducerInitInfo info;
220 (void)GetProducerInitInfo(info);
221 reply.WriteInt32(info.width);
222 reply.WriteInt32(info.height);
223 reply.WriteUint64(info.uniqueId);
224 reply.WriteString(info.name);
225 sptr<IRemoteObject> token = arguments.ReadRemoteObject();
226 if (token == nullptr) {
227 reply.WriteInt32(GSERROR_INVALID_ARGUMENTS);
228 return GSERROR_INVALID_ARGUMENTS;
229 }
230 bool result = HandleDeathRecipient(token);
231 reply.WriteInt32(result ? GSERROR_OK : SURFACE_ERROR_UNKOWN);
232 return 0;
233 }
234
CancelBufferRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)235 int32_t BufferQueueProducer::CancelBufferRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
236 {
237 uint32_t sequence;
238 sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
239
240 sequence = arguments.ReadUint32();
241 bedataimpl->ReadFromParcel(arguments);
242
243 GSError sret = CancelBuffer(sequence, bedataimpl);
244 reply.WriteInt32(sret);
245 return 0;
246 }
247
FlushBufferRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)248 int32_t BufferQueueProducer::FlushBufferRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
249 {
250 uint32_t sequence;
251 BufferFlushConfigWithDamages config;
252 sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
253 int64_t startTimeNs = 0;
254 int64_t endTimeNs = 0;
255 bool isActiveGame = Rosen::FrameReport::GetInstance().IsActiveGameWithPid(connectedPid_);
256 if (isActiveGame) {
257 startTimeNs = std::chrono::duration_cast<std::chrono::nanoseconds>(
258 std::chrono::steady_clock::now().time_since_epoch()).count();
259 }
260
261 sequence = arguments.ReadUint32();
262 bedataimpl->ReadFromParcel(arguments);
263
264 sptr<SyncFence> fence = SyncFence::ReadFromMessageParcel(arguments);
265 ReadFlushConfig(arguments, config);
266
267 GSError sret = FlushBuffer(sequence, bedataimpl, fence, config);
268
269 reply.WriteInt32(sret);
270
271 if (isActiveGame) {
272 uint64_t uniqueId = GetUniqueId();
273 endTimeNs = std::chrono::duration_cast<std::chrono::nanoseconds>(
274 std::chrono::steady_clock::now().time_since_epoch()).count();
275 Rosen::FrameReport::GetInstance().SetQueueBufferTime(uniqueId, name_, (endTimeNs - startTimeNs));
276 Rosen::FrameReport::GetInstance().Report(name_);
277 }
278
279 return 0;
280 }
281
FlushBuffersRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)282 int32_t BufferQueueProducer::FlushBuffersRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
283 {
284 std::vector<uint32_t> sequences;
285 std::vector<BufferFlushConfigWithDamages> configs;
286 std::vector<sptr<BufferExtraData>> bedataimpls;
287 std::vector<sptr<SyncFence>> fences;
288 arguments.ReadUInt32Vector(&sequences);
289 if (sequences.size() == 0 || sequences.size() > SURFACE_MAX_QUEUE_SIZE) {
290 return 0;
291 }
292 for (size_t i = 0; i < sequences.size(); ++i) {
293 sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
294 bedataimpl->ReadFromParcel(arguments);
295 bedataimpls.emplace_back(bedataimpl);
296 sptr<SyncFence> fence = SyncFence::ReadFromMessageParcel(arguments);
297 fences.emplace_back(fence);
298 BufferFlushConfigWithDamages config;
299 ReadFlushConfig(arguments, config);
300 configs.emplace_back(config);
301 }
302
303 GSError sret = FlushBuffers(sequences, bedataimpls, fences, configs);
304
305 reply.WriteInt32(sret);
306 return 0;
307 }
308
GetLastFlushedBufferRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)309 int32_t BufferQueueProducer::GetLastFlushedBufferRemote(MessageParcel &arguments,
310 MessageParcel &reply, MessageOption &option)
311 {
312 sptr<SurfaceBuffer> buffer;
313 sptr<SyncFence> fence;
314 float matrix[BUFFER_MATRIX_SIZE];
315 bool isUseNewMatrix = arguments.ReadBool();
316 GSError sret = GetLastFlushedBuffer(buffer, fence, matrix, isUseNewMatrix);
317 reply.WriteInt32(sret);
318 if (sret == GSERROR_OK) {
319 uint32_t sequence = buffer->GetSeqNum();
320 WriteSurfaceBufferImpl(reply, sequence, buffer);
321 buffer->WriteBufferRequestConfig(reply);
322 fence->WriteToMessageParcel(reply);
323 std::vector<float> writeMatrixVector(matrix, matrix + sizeof(matrix) / sizeof(float));
324 reply.WriteFloatVector(writeMatrixVector);
325 }
326 return 0;
327 }
328
AttachBufferToQueueRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)329 int32_t BufferQueueProducer::AttachBufferToQueueRemote(MessageParcel &arguments,
330 MessageParcel &reply, MessageOption &option)
331 {
332 sptr<SurfaceBuffer> buffer = nullptr;
333 uint32_t sequence;
334 GSError ret = ReadSurfaceBufferImpl(arguments, sequence, buffer);
335 if (ret != GSERROR_OK || buffer == nullptr) {
336 reply.WriteInt32(SURFACE_ERROR_UNKOWN);
337 return 0;
338 }
339 ret = buffer->ReadBufferRequestConfig(arguments);
340 if (ret != GSERROR_OK) {
341 reply.WriteInt32(SURFACE_ERROR_UNKOWN);
342 return 0;
343 }
344 ret = AttachBufferToQueue(buffer);
345 reply.WriteInt32(ret);
346 return 0;
347 }
348
DetachBufferFromQueueRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)349 int32_t BufferQueueProducer::DetachBufferFromQueueRemote(MessageParcel &arguments,
350 MessageParcel &reply, MessageOption &option)
351 {
352 sptr<SurfaceBuffer> buffer = nullptr;
353 uint32_t sequence;
354 GSError ret = ReadSurfaceBufferImpl(arguments, sequence, buffer);
355 if (ret != GSERROR_OK || buffer == nullptr) {
356 reply.WriteInt32(SURFACE_ERROR_UNKOWN);
357 return 0;
358 }
359 ret = DetachBufferFromQueue(buffer);
360 reply.WriteInt32(ret);
361 return 0;
362 }
363
AttachBufferRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)364 int32_t BufferQueueProducer::AttachBufferRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
365 {
366 sptr<SurfaceBuffer> buffer;
367 uint32_t sequence;
368 int32_t timeOut;
369 GSError ret = ReadSurfaceBufferImpl(arguments, sequence, buffer);
370 if (ret != GSERROR_OK || buffer == nullptr) {
371 reply.WriteInt32(ret);
372 return 0;
373 }
374 timeOut = arguments.ReadInt32();
375
376 ret = AttachBuffer(buffer, timeOut);
377 reply.WriteInt32(ret);
378 return 0;
379 }
380
DetachBufferRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)381 int32_t BufferQueueProducer::DetachBufferRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
382 {
383 return 0;
384 }
385
GetQueueSizeRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)386 int32_t BufferQueueProducer::GetQueueSizeRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
387 {
388 reply.WriteInt32(GetQueueSize());
389 return 0;
390 }
391
SetQueueSizeRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)392 int32_t BufferQueueProducer::SetQueueSizeRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
393 {
394 uint32_t queueSize = arguments.ReadUint32();
395 GSError sret = SetQueueSize(queueSize);
396 reply.WriteInt32(sret);
397 return 0;
398 }
399
GetNameRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)400 int32_t BufferQueueProducer::GetNameRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
401 {
402 std::string name;
403 auto sret = bufferQueue_->GetName(name);
404 reply.WriteInt32(sret);
405 if (sret == GSERROR_OK) {
406 reply.WriteString(name);
407 }
408 return 0;
409 }
410
GetNameAndUniqueIdRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)411 int32_t BufferQueueProducer::GetNameAndUniqueIdRemote(MessageParcel &arguments, MessageParcel &reply,
412 MessageOption &option)
413 {
414 std::string name = "not init";
415 uint64_t uniqueId = 0;
416 auto ret = GetNameAndUniqueId(name, uniqueId);
417 reply.WriteInt32(ret);
418 if (ret == GSERROR_OK) {
419 reply.WriteString(name);
420 reply.WriteUint64(uniqueId);
421 }
422 return 0;
423 }
424
GetDefaultWidthRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)425 int32_t BufferQueueProducer::GetDefaultWidthRemote(MessageParcel &arguments, MessageParcel &reply,
426 MessageOption &option)
427 {
428 reply.WriteInt32(GetDefaultWidth());
429 return 0;
430 }
431
GetDefaultHeightRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)432 int32_t BufferQueueProducer::GetDefaultHeightRemote(MessageParcel &arguments, MessageParcel &reply,
433 MessageOption &option)
434 {
435 reply.WriteInt32(GetDefaultHeight());
436 return 0;
437 }
438
SetDefaultUsageRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)439 int32_t BufferQueueProducer::SetDefaultUsageRemote(MessageParcel &arguments, MessageParcel &reply,
440 MessageOption &option)
441 {
442 uint64_t usage = arguments.ReadUint64();
443 GSError sret = SetDefaultUsage(usage);
444 reply.WriteInt32(sret);
445 return 0;
446 }
447
GetDefaultUsageRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)448 int32_t BufferQueueProducer::GetDefaultUsageRemote(MessageParcel &arguments, MessageParcel &reply,
449 MessageOption &option)
450 {
451 reply.WriteUint64(GetDefaultUsage());
452 return 0;
453 }
454
GetUniqueIdRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)455 int32_t BufferQueueProducer::GetUniqueIdRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
456 {
457 reply.WriteUint64(GetUniqueId());
458 return 0;
459 }
460
CleanCacheRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)461 int32_t BufferQueueProducer::CleanCacheRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
462 {
463 bool cleanAll = arguments.ReadBool();
464 reply.WriteInt32(CleanCache(cleanAll));
465 return 0;
466 }
467
GoBackgroundRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)468 int32_t BufferQueueProducer::GoBackgroundRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
469 {
470 reply.WriteInt32(GoBackground());
471 return 0;
472 }
473
RegisterReleaseListenerRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)474 int32_t BufferQueueProducer::RegisterReleaseListenerRemote(MessageParcel &arguments,
475 MessageParcel &reply, MessageOption &option)
476 {
477 sptr<IRemoteObject> listenerObject = arguments.ReadRemoteObject();
478 if (listenerObject == nullptr) {
479 reply.WriteInt32(GSERROR_INVALID_ARGUMENTS);
480 return GSERROR_INVALID_ARGUMENTS;
481 }
482 sptr<IProducerListener> listener = iface_cast<IProducerListener>(listenerObject);
483 GSError sret = RegisterReleaseListener(listener);
484 reply.WriteInt32(sret);
485 return 0;
486 }
487
UnRegisterReleaseListenerRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)488 int32_t BufferQueueProducer::UnRegisterReleaseListenerRemote(MessageParcel &arguments,
489 MessageParcel &reply, MessageOption &option)
490 {
491 GSError sret = UnRegisterReleaseListener();
492 reply.WriteInt32(sret);
493 return 0;
494 }
495
SetTransformRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)496 int32_t BufferQueueProducer::SetTransformRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
497 {
498 GraphicTransformType transform = static_cast<GraphicTransformType>(arguments.ReadUint32());
499 GSError sret = SetTransform(transform);
500 reply.WriteInt32(sret);
501 return 0;
502 }
503
IsSupportedAllocRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)504 int32_t BufferQueueProducer::IsSupportedAllocRemote(MessageParcel &arguments, MessageParcel &reply,
505 MessageOption &option)
506 {
507 std::vector<BufferVerifyAllocInfo> infos;
508 ReadVerifyAllocInfo(arguments, infos);
509
510 std::vector<bool> supporteds;
511 GSError sret = IsSupportedAlloc(infos, supporteds);
512 reply.WriteInt32(sret);
513 if (sret == GSERROR_OK) {
514 reply.WriteBoolVector(supporteds);
515 }
516
517 return 0;
518 }
519
ConnectRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)520 int32_t BufferQueueProducer::ConnectRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
521 {
522 GSError sret = Connect();
523 reply.WriteInt32(sret);
524 return 0;
525 }
526
DisconnectRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)527 int32_t BufferQueueProducer::DisconnectRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
528 {
529 GSError sret = Disconnect();
530 reply.WriteInt32(sret);
531 return 0;
532 }
533
SetScalingModeRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)534 int32_t BufferQueueProducer::SetScalingModeRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
535 {
536 uint32_t sequence = arguments.ReadUint32();
537 ScalingMode scalingMode = static_cast<ScalingMode>(arguments.ReadInt32());
538 GSError sret = SetScalingMode(sequence, scalingMode);
539 reply.WriteInt32(sret);
540 return 0;
541 }
542
SetScalingModeV2Remote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)543 int32_t BufferQueueProducer::SetScalingModeV2Remote(MessageParcel &arguments, MessageParcel &reply,
544 MessageOption &option)
545 {
546 ScalingMode scalingMode = static_cast<ScalingMode>(arguments.ReadInt32());
547 GSError sret = SetScalingMode(scalingMode);
548 reply.WriteInt32(sret);
549 return 0;
550 }
551
SetBufferHoldRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)552 int32_t BufferQueueProducer::SetBufferHoldRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
553 {
554 bool hold = arguments.ReadBool();
555 GSError sret = SetBufferHold(hold);
556 reply.WriteInt32(sret);
557 return 0;
558 }
559
SetMetaDataRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)560 int32_t BufferQueueProducer::SetMetaDataRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
561 {
562 uint32_t sequence = arguments.ReadUint32();
563 std::vector<GraphicHDRMetaData> metaData;
564 ReadHDRMetaData(arguments, metaData);
565 GSError sret = SetMetaData(sequence, metaData);
566 reply.WriteInt32(sret);
567 return 0;
568 }
569
SetMetaDataSetRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)570 int32_t BufferQueueProducer::SetMetaDataSetRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
571 {
572 uint32_t sequence = arguments.ReadUint32();
573 GraphicHDRMetadataKey key = static_cast<GraphicHDRMetadataKey>(arguments.ReadUint32());
574 std::vector<uint8_t> metaData;
575 ReadHDRMetaDataSet(arguments, metaData);
576 GSError sret = SetMetaDataSet(sequence, key, metaData);
577 reply.WriteInt32(sret);
578 return 0;
579 }
580
SetTunnelHandleRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)581 int32_t BufferQueueProducer::SetTunnelHandleRemote(MessageParcel &arguments, MessageParcel &reply,
582 MessageOption &option)
583 {
584 sptr<SurfaceTunnelHandle> handle = nullptr;
585 if (arguments.ReadBool()) {
586 handle = new SurfaceTunnelHandle();
587 ReadExtDataHandle(arguments, handle);
588 }
589 GSError sret = SetTunnelHandle(handle);
590 reply.WriteInt32(sret);
591 return 0;
592 }
593
GetPresentTimestampRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)594 int32_t BufferQueueProducer::GetPresentTimestampRemote(MessageParcel &arguments, MessageParcel &reply,
595 MessageOption &option)
596 {
597 uint32_t sequence = arguments.ReadUint32();
598 GraphicPresentTimestampType type = static_cast<GraphicPresentTimestampType>(arguments.ReadUint32());
599 int64_t time = 0;
600 GSError sret = GetPresentTimestamp(sequence, type, time);
601 reply.WriteInt32(sret);
602 if (sret == GSERROR_OK) {
603 reply.WriteInt64(time);
604 }
605 return 0;
606 }
607
GetTransformRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)608 int32_t BufferQueueProducer::GetTransformRemote(
609 MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
610 {
611 GraphicTransformType transform = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
612 auto ret = GetTransform(transform);
613 if (ret != GSERROR_OK) {
614 reply.WriteInt32(static_cast<int32_t>(ret));
615 return -1;
616 }
617
618 reply.WriteInt32(GSERROR_OK);
619 reply.WriteUint32(static_cast<uint32_t>(transform));
620
621 return 0;
622 }
623
SetTransformHintRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)624 int32_t BufferQueueProducer::SetTransformHintRemote(MessageParcel &arguments,
625 MessageParcel &reply, MessageOption &option)
626 {
627 GraphicTransformType transformHint = static_cast<GraphicTransformType>(arguments.ReadUint32());
628 GSError sret = SetTransformHint(transformHint);
629 reply.WriteInt32(sret);
630 return 0;
631 }
632
GetTransformHintRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)633 int32_t BufferQueueProducer::GetTransformHintRemote(
634 MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
635 {
636 GraphicTransformType transformHint = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
637 auto ret = GetTransformHint(transformHint);
638 if (ret != GSERROR_OK) {
639 reply.WriteInt32(static_cast<int32_t>(ret));
640 return -1;
641 }
642
643 reply.WriteInt32(GSERROR_OK);
644 reply.WriteUint32(static_cast<uint32_t>(transformHint));
645
646 return 0;
647 }
648
SetSurfaceSourceTypeRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)649 int32_t BufferQueueProducer::SetSurfaceSourceTypeRemote(MessageParcel &arguments,
650 MessageParcel &reply, MessageOption &option)
651 {
652 OHSurfaceSource sourceType = static_cast<OHSurfaceSource>(arguments.ReadUint32());
653 GSError sret = SetSurfaceSourceType(sourceType);
654 reply.WriteInt32(sret);
655 return 0;
656 }
657
GetSurfaceSourceTypeRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)658 int32_t BufferQueueProducer::GetSurfaceSourceTypeRemote(
659 MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
660 {
661 OHSurfaceSource sourceType = OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
662 auto ret = GetSurfaceSourceType(sourceType);
663 if (ret != GSERROR_OK) {
664 reply.WriteInt32(static_cast<int32_t>(ret));
665 return -1;
666 }
667
668 reply.WriteInt32(GSERROR_OK);
669 reply.WriteUint32(static_cast<uint32_t>(sourceType));
670
671 return 0;
672 }
673
SetSurfaceAppFrameworkTypeRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)674 int32_t BufferQueueProducer::SetSurfaceAppFrameworkTypeRemote(
675 MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
676 {
677 std::string appFrameworkType = arguments.ReadString();
678 GSError sret = SetSurfaceAppFrameworkType(appFrameworkType);
679 reply.WriteInt32(sret);
680 return 0;
681 }
682
GetSurfaceAppFrameworkTypeRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)683 int32_t BufferQueueProducer::GetSurfaceAppFrameworkTypeRemote(
684 MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
685 {
686 std::string appFrameworkType = "";
687 auto ret = GetSurfaceAppFrameworkType(appFrameworkType);
688 if (ret != GSERROR_OK) {
689 reply.WriteInt32(static_cast<int32_t>(ret));
690 return -1;
691 }
692
693 reply.WriteInt32(GSERROR_OK);
694 reply.WriteString(appFrameworkType);
695
696 return 0;
697 }
698
SetHdrWhitePointBrightnessRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)699 int32_t BufferQueueProducer::SetHdrWhitePointBrightnessRemote(
700 MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
701 {
702 float brightness = arguments.ReadFloat();
703 GSError sret = SetHdrWhitePointBrightness(brightness);
704 reply.WriteInt32(sret);
705 return 0;
706 }
707
SetSdrWhitePointBrightnessRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)708 int32_t BufferQueueProducer::SetSdrWhitePointBrightnessRemote(
709 MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
710 {
711 float brightness = arguments.ReadFloat();
712 GSError sret = SetSdrWhitePointBrightness(brightness);
713 reply.WriteInt32(sret);
714 return 0;
715 }
716
AcquireLastFlushedBufferRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)717 int32_t BufferQueueProducer::AcquireLastFlushedBufferRemote(
718 MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
719 {
720 sptr<SurfaceBuffer> buffer;
721 sptr<SyncFence> fence;
722 float matrix[BUFFER_MATRIX_SIZE];
723 bool isUseNewMatrix = arguments.ReadBool();
724 GSError sret = AcquireLastFlushedBuffer(buffer, fence, matrix, BUFFER_MATRIX_SIZE, isUseNewMatrix);
725 reply.WriteInt32(sret);
726 if (sret == GSERROR_OK) {
727 uint32_t sequence = buffer->GetSeqNum();
728 WriteSurfaceBufferImpl(reply, sequence, buffer);
729 buffer->WriteBufferRequestConfig(reply);
730 fence->WriteToMessageParcel(reply);
731 std::vector<float> writeMatrixVector(matrix, matrix + sizeof(matrix) / sizeof(float));
732 reply.WriteFloatVector(writeMatrixVector);
733 }
734 return 0;
735 }
736
ReleaseLastFlushedBufferRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)737 int32_t BufferQueueProducer::ReleaseLastFlushedBufferRemote(
738 MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
739 {
740 uint32_t sequence = arguments.ReadUint32();
741 GSError sret = ReleaseLastFlushedBuffer(sequence);
742 reply.WriteInt32(sret);
743 return 0;
744 }
745
AcquireLastFlushedBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],uint32_t matrixSize,bool isUseNewMatrix)746 GSError BufferQueueProducer::AcquireLastFlushedBuffer(sptr<SurfaceBuffer> &buffer,
747 sptr<SyncFence> &fence, float matrix[16], uint32_t matrixSize, bool isUseNewMatrix)
748 {
749 if (bufferQueue_ == nullptr) {
750 return SURFACE_ERROR_UNKOWN;
751 }
752 return bufferQueue_->AcquireLastFlushedBuffer(buffer, fence, matrix, matrixSize, isUseNewMatrix);
753 }
754
ReleaseLastFlushedBuffer(uint32_t sequence)755 GSError BufferQueueProducer::ReleaseLastFlushedBuffer(uint32_t sequence)
756 {
757 if (bufferQueue_ == nullptr) {
758 return SURFACE_ERROR_UNKOWN;
759 }
760 return bufferQueue_->ReleaseLastFlushedBuffer(sequence);
761 }
762
RequestBuffer(const BufferRequestConfig & config,sptr<BufferExtraData> & bedata,RequestBufferReturnValue & retval)763 GSError BufferQueueProducer::RequestBuffer(const BufferRequestConfig &config, sptr<BufferExtraData> &bedata,
764 RequestBufferReturnValue &retval)
765 {
766 if (bufferQueue_ == nullptr) {
767 return SURFACE_ERROR_UNKOWN;
768 }
769
770 retval.isConnected = false;
771 auto ret = Connect();
772 if (ret != SURFACE_ERROR_OK) {
773 return ret;
774 }
775 retval.isConnected = true;
776 return bufferQueue_->RequestBuffer(config, bedata, retval);
777 }
778
RequestBuffers(const BufferRequestConfig & config,std::vector<sptr<BufferExtraData>> & bedata,std::vector<RequestBufferReturnValue> & retvalues)779 GSError BufferQueueProducer::RequestBuffers(const BufferRequestConfig &config,
780 std::vector<sptr<BufferExtraData>> &bedata, std::vector<RequestBufferReturnValue> &retvalues)
781 {
782 if (bufferQueue_ == nullptr) {
783 return SURFACE_ERROR_UNKOWN;
784 }
785 retvalues[0].isConnected = false;
786 auto ret = Connect();
787 if (ret != SURFACE_ERROR_OK) {
788 return ret;
789 }
790 bufferQueue_->SetBatchHandle(true);
791 for (size_t i = 0; i < retvalues.size(); ++i) {
792 ret = bufferQueue_->RequestBuffer(config, bedata[i], retvalues[i]);
793 if (ret != GSERROR_OK) {
794 retvalues.resize(i);
795 break;
796 }
797 }
798 bufferQueue_->SetBatchHandle(false);
799 if (retvalues.size() == 0) {
800 retvalues.resize(1);
801 retvalues[0].isConnected = true;
802 return ret;
803 }
804 return GSERROR_OK;
805 }
806
GetProducerInitInfo(ProducerInitInfo & info)807 GSError BufferQueueProducer::GetProducerInitInfo(ProducerInitInfo &info)
808 {
809 if (bufferQueue_ == nullptr) {
810 return SURFACE_ERROR_UNKOWN;
811 }
812 return bufferQueue_->GetProducerInitInfo(info);
813 }
814
CancelBuffer(uint32_t sequence,sptr<BufferExtraData> bedata)815 GSError BufferQueueProducer::CancelBuffer(uint32_t sequence, sptr<BufferExtraData> bedata)
816 {
817 if (bufferQueue_ == nullptr) {
818 return SURFACE_ERROR_UNKOWN;
819 }
820 return bufferQueue_->CancelBuffer(sequence, bedata);
821 }
822
FlushBuffer(uint32_t sequence,sptr<BufferExtraData> bedata,sptr<SyncFence> fence,BufferFlushConfigWithDamages & config)823 GSError BufferQueueProducer::FlushBuffer(uint32_t sequence, sptr<BufferExtraData> bedata,
824 sptr<SyncFence> fence, BufferFlushConfigWithDamages &config)
825 {
826 if (bufferQueue_ == nullptr) {
827 return SURFACE_ERROR_UNKOWN;
828 }
829 return bufferQueue_->FlushBuffer(sequence, bedata, fence, config);
830 }
831
FlushBuffers(const std::vector<uint32_t> & sequences,const std::vector<sptr<BufferExtraData>> & bedata,const std::vector<sptr<SyncFence>> & fences,const std::vector<BufferFlushConfigWithDamages> & configs)832 GSError BufferQueueProducer::FlushBuffers(const std::vector<uint32_t> &sequences,
833 const std::vector<sptr<BufferExtraData>> &bedata,
834 const std::vector<sptr<SyncFence>> &fences,
835 const std::vector<BufferFlushConfigWithDamages> &configs)
836 {
837 if (bufferQueue_ == nullptr) {
838 return SURFACE_ERROR_UNKOWN;
839 }
840 GSError ret;
841 for (size_t i = 0; i < sequences.size(); ++i) {
842 ret = bufferQueue_->FlushBuffer(sequences[i], bedata[i], fences[i], configs[i]);
843 if (ret != GSERROR_OK) {
844 BLOGE("FlushBuffer failed: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_);
845 return ret;
846 }
847 }
848 return ret;
849 }
850
GetLastFlushedBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],bool isUseNewMatrix)851 GSError BufferQueueProducer::GetLastFlushedBuffer(sptr<SurfaceBuffer>& buffer,
852 sptr<SyncFence>& fence, float matrix[16], bool isUseNewMatrix)
853 {
854 if (bufferQueue_ == nullptr) {
855 return SURFACE_ERROR_UNKOWN;
856 }
857 return bufferQueue_->GetLastFlushedBuffer(buffer, fence, matrix, BUFFER_MATRIX_SIZE, isUseNewMatrix);
858 }
859
AttachBufferToQueue(sptr<SurfaceBuffer> buffer)860 GSError BufferQueueProducer::AttachBufferToQueue(sptr<SurfaceBuffer> buffer)
861 {
862 if (bufferQueue_ == nullptr) {
863 return SURFACE_ERROR_UNKOWN;
864 }
865 return bufferQueue_->AttachBufferToQueue(buffer, InvokerType::PRODUCER_INVOKER);
866 }
867
DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)868 GSError BufferQueueProducer::DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)
869 {
870 if (bufferQueue_ == nullptr) {
871 return SURFACE_ERROR_UNKOWN;
872 }
873 return bufferQueue_->DetachBufferFromQueue(buffer, InvokerType::PRODUCER_INVOKER);
874 }
875
AttachBuffer(sptr<SurfaceBuffer> & buffer)876 GSError BufferQueueProducer::AttachBuffer(sptr<SurfaceBuffer>& buffer)
877 {
878 int32_t timeOut = 0;
879 return AttachBuffer(buffer, timeOut);
880 }
881
AttachBuffer(sptr<SurfaceBuffer> & buffer,int32_t timeOut)882 GSError BufferQueueProducer::AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut)
883 {
884 if (bufferQueue_ == nullptr) {
885 return GSERROR_INVALID_ARGUMENTS;
886 }
887 return bufferQueue_->AttachBuffer(buffer, timeOut);
888 }
889
DetachBuffer(sptr<SurfaceBuffer> & buffer)890 GSError BufferQueueProducer::DetachBuffer(sptr<SurfaceBuffer>& buffer)
891 {
892 if (bufferQueue_ == nullptr) {
893 return GSERROR_INVALID_ARGUMENTS;
894 }
895
896 return bufferQueue_->DetachBuffer(buffer);
897 }
898
GetQueueSize()899 uint32_t BufferQueueProducer::GetQueueSize()
900 {
901 if (bufferQueue_ == nullptr) {
902 return 0;
903 }
904 return bufferQueue_->GetQueueSize();
905 }
906
SetQueueSize(uint32_t queueSize)907 GSError BufferQueueProducer::SetQueueSize(uint32_t queueSize)
908 {
909 if (bufferQueue_ == nullptr) {
910 return GSERROR_INVALID_ARGUMENTS;
911 }
912 return bufferQueue_->SetQueueSize(queueSize);
913 }
914
GetName(std::string & name)915 GSError BufferQueueProducer::GetName(std::string &name)
916 {
917 if (bufferQueue_ == nullptr) {
918 return GSERROR_INVALID_ARGUMENTS;
919 }
920 return bufferQueue_->GetName(name);
921 }
922
GetDefaultWidth()923 int32_t BufferQueueProducer::GetDefaultWidth()
924 {
925 if (bufferQueue_ == nullptr) {
926 return 0;
927 }
928 return bufferQueue_->GetDefaultWidth();
929 }
930
GetDefaultHeight()931 int32_t BufferQueueProducer::GetDefaultHeight()
932 {
933 if (bufferQueue_ == nullptr) {
934 return 0;
935 }
936 return bufferQueue_->GetDefaultHeight();
937 }
938
SetDefaultUsage(uint64_t usage)939 GSError BufferQueueProducer::SetDefaultUsage(uint64_t usage)
940 {
941 if (bufferQueue_ == nullptr) {
942 return GSERROR_INVALID_ARGUMENTS;
943 }
944 return bufferQueue_->SetDefaultUsage(usage);
945 }
946
GetDefaultUsage()947 uint64_t BufferQueueProducer::GetDefaultUsage()
948 {
949 if (bufferQueue_ == nullptr) {
950 return 0;
951 }
952 return bufferQueue_->GetDefaultUsage();
953 }
954
GetUniqueId()955 uint64_t BufferQueueProducer::GetUniqueId()
956 {
957 if (bufferQueue_ == nullptr) {
958 return 0;
959 }
960 return bufferQueue_->GetUniqueId();
961 }
962
CleanCache(bool cleanAll)963 GSError BufferQueueProducer::CleanCache(bool cleanAll)
964 {
965 if (bufferQueue_ == nullptr) {
966 return GSERROR_INVALID_ARGUMENTS;
967 }
968
969 {
970 std::lock_guard<std::mutex> lock(mutex_);
971 auto ret = CheckConnectLocked();
972 if (ret != GSERROR_OK) {
973 return ret;
974 }
975 }
976
977 return bufferQueue_->CleanCache(cleanAll);
978 }
979
GoBackground()980 GSError BufferQueueProducer::GoBackground()
981 {
982 if (bufferQueue_ == nullptr) {
983 return GSERROR_INVALID_ARGUMENTS;
984 }
985
986 {
987 std::lock_guard<std::mutex> lock(mutex_);
988 auto ret = CheckConnectLocked();
989 if (ret != GSERROR_OK) {
990 return ret;
991 }
992 }
993 return bufferQueue_->SetProducerCacheCleanFlag(true);
994 }
995
RegisterReleaseListener(sptr<IProducerListener> listener)996 GSError BufferQueueProducer::RegisterReleaseListener(sptr<IProducerListener> listener)
997 {
998 if (bufferQueue_ == nullptr) {
999 return GSERROR_INVALID_ARGUMENTS;
1000 }
1001 return bufferQueue_->RegisterProducerReleaseListener(listener);
1002 }
1003
UnRegisterReleaseListener()1004 GSError BufferQueueProducer::UnRegisterReleaseListener()
1005 {
1006 if (bufferQueue_ == nullptr) {
1007 return GSERROR_INVALID_ARGUMENTS;
1008 }
1009 return bufferQueue_->UnRegisterProducerReleaseListener();
1010 }
1011
HandleDeathRecipient(sptr<IRemoteObject> token)1012 bool BufferQueueProducer::HandleDeathRecipient(sptr<IRemoteObject> token)
1013 {
1014 std::lock_guard<std::mutex> lock(mutex_);
1015 if (token_ != nullptr) {
1016 token_->RemoveDeathRecipient(producerSurfaceDeathRecipient_);
1017 }
1018 token_ = token;
1019 return token_->AddDeathRecipient(producerSurfaceDeathRecipient_);
1020 }
1021
SetTransform(GraphicTransformType transform)1022 GSError BufferQueueProducer::SetTransform(GraphicTransformType transform)
1023 {
1024 std::lock_guard<std::mutex> lock(mutex_);
1025 if (bufferQueue_ == nullptr) {
1026 return GSERROR_INVALID_ARGUMENTS;
1027 }
1028 return bufferQueue_->SetTransform(transform);
1029 }
1030
GetTransform(GraphicTransformType & transform)1031 GSError BufferQueueProducer::GetTransform(GraphicTransformType &transform)
1032 {
1033 std::lock_guard<std::mutex> lock(mutex_);
1034 if (bufferQueue_ == nullptr) {
1035 transform = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
1036 return GSERROR_INVALID_ARGUMENTS;
1037 }
1038 transform = bufferQueue_->GetTransform();
1039 return GSERROR_OK;
1040 }
1041
SetTransformHint(GraphicTransformType transformHint)1042 GSError BufferQueueProducer::SetTransformHint(GraphicTransformType transformHint)
1043 {
1044 std::lock_guard<std::mutex> lock(mutex_);
1045 if (bufferQueue_ == nullptr) {
1046 return GSERROR_INVALID_ARGUMENTS;
1047 }
1048 return bufferQueue_->SetTransformHint(transformHint);
1049 }
1050
GetTransformHint(GraphicTransformType & transformHint)1051 GSError BufferQueueProducer::GetTransformHint(GraphicTransformType &transformHint)
1052 {
1053 std::lock_guard<std::mutex> lock(mutex_);
1054 if (bufferQueue_ == nullptr) {
1055 transformHint = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
1056 return GSERROR_INVALID_ARGUMENTS;
1057 }
1058 transformHint = bufferQueue_->GetTransformHint();
1059 return GSERROR_OK;
1060 }
1061
SetSurfaceSourceType(OHSurfaceSource sourceType)1062 GSError BufferQueueProducer::SetSurfaceSourceType(OHSurfaceSource sourceType)
1063 {
1064 std::lock_guard<std::mutex> lock(mutex_);
1065 if (bufferQueue_ == nullptr) {
1066 return GSERROR_INVALID_ARGUMENTS;
1067 }
1068 return bufferQueue_->SetSurfaceSourceType(sourceType);
1069 }
1070
GetSurfaceSourceType(OHSurfaceSource & sourceType)1071 GSError BufferQueueProducer::GetSurfaceSourceType(OHSurfaceSource &sourceType)
1072 {
1073 std::lock_guard<std::mutex> lock(mutex_);
1074 if (bufferQueue_ == nullptr) {
1075 sourceType = OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
1076 return GSERROR_INVALID_ARGUMENTS;
1077 }
1078 sourceType = bufferQueue_->GetSurfaceSourceType();
1079 return GSERROR_OK;
1080 }
1081
SetSurfaceAppFrameworkType(std::string appFrameworkType)1082 GSError BufferQueueProducer::SetSurfaceAppFrameworkType(std::string appFrameworkType)
1083 {
1084 std::lock_guard<std::mutex> lock(mutex_);
1085 if (bufferQueue_ == nullptr) {
1086 return GSERROR_INVALID_ARGUMENTS;
1087 }
1088 return bufferQueue_->SetSurfaceAppFrameworkType(appFrameworkType);
1089 }
1090
GetSurfaceAppFrameworkType(std::string & appFrameworkType)1091 GSError BufferQueueProducer::GetSurfaceAppFrameworkType(std::string &appFrameworkType)
1092 {
1093 std::lock_guard<std::mutex> lock(mutex_);
1094 if (bufferQueue_ == nullptr) {
1095 appFrameworkType = "";
1096 return GSERROR_INVALID_ARGUMENTS;
1097 }
1098 appFrameworkType = bufferQueue_->GetSurfaceAppFrameworkType();
1099 return GSERROR_OK;
1100 }
1101
SetHdrWhitePointBrightness(float brightness)1102 GSError BufferQueueProducer::SetHdrWhitePointBrightness(float brightness)
1103 {
1104 std::lock_guard<std::mutex> lock(mutex_);
1105 if (bufferQueue_ == nullptr) {
1106 return SURFACE_ERROR_UNKOWN;
1107 }
1108 return bufferQueue_->SetHdrWhitePointBrightness(brightness);
1109 }
1110
SetSdrWhitePointBrightness(float brightness)1111 GSError BufferQueueProducer::SetSdrWhitePointBrightness(float brightness)
1112 {
1113 std::lock_guard<std::mutex> lock(mutex_);
1114 if (bufferQueue_ == nullptr) {
1115 return SURFACE_ERROR_UNKOWN;
1116 }
1117 return bufferQueue_->SetSdrWhitePointBrightness(brightness);
1118 }
1119
IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> & infos,std::vector<bool> & supporteds)1120 GSError BufferQueueProducer::IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> &infos,
1121 std::vector<bool> &supporteds)
1122 {
1123 if (bufferQueue_ == nullptr) {
1124 return GSERROR_INVALID_ARGUMENTS;
1125 }
1126
1127 return bufferQueue_->IsSupportedAlloc(infos, supporteds);
1128 }
1129
GetNameAndUniqueId(std::string & name,uint64_t & uniqueId)1130 GSError BufferQueueProducer::GetNameAndUniqueId(std::string& name, uint64_t& uniqueId)
1131 {
1132 if (bufferQueue_ == nullptr) {
1133 return GSERROR_INVALID_ARGUMENTS;
1134 }
1135 uniqueId = GetUniqueId();
1136 return GetName(name);
1137 }
1138
Connect()1139 GSError BufferQueueProducer::Connect()
1140 {
1141 std::lock_guard<std::mutex> lock(mutex_);
1142 auto callingPid = GetCallingPid();
1143 if (connectedPid_ != 0 && connectedPid_ != callingPid) {
1144 BLOGW("connected by: %{public}d, request by: %{public}d , uniqueId: %{public}" PRIu64 ".",
1145 connectedPid_, callingPid, uniqueId_);
1146 return SURFACE_ERROR_CONSUMER_IS_CONNECTED;
1147 }
1148 connectedPid_ = callingPid;
1149 return SURFACE_ERROR_OK;
1150 }
1151
Disconnect()1152 GSError BufferQueueProducer::Disconnect()
1153 {
1154 if (bufferQueue_ == nullptr) {
1155 return SURFACE_ERROR_UNKOWN;
1156 }
1157
1158 {
1159 std::lock_guard<std::mutex> lock(mutex_);
1160 auto ret = CheckConnectLocked();
1161 if (ret != GSERROR_OK) {
1162 return ret;
1163 }
1164 connectedPid_ = 0;
1165 }
1166 return bufferQueue_->CleanCache(false);
1167 }
1168
SetScalingMode(uint32_t sequence,ScalingMode scalingMode)1169 GSError BufferQueueProducer::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
1170 {
1171 if (bufferQueue_ == nullptr) {
1172 return GSERROR_INVALID_ARGUMENTS;
1173 }
1174 return bufferQueue_->SetScalingMode(sequence, scalingMode);
1175 }
1176
SetScalingMode(ScalingMode scalingMode)1177 GSError BufferQueueProducer::SetScalingMode(ScalingMode scalingMode)
1178 {
1179 if (bufferQueue_ == nullptr) {
1180 return GSERROR_INVALID_ARGUMENTS;
1181 }
1182 return bufferQueue_->SetScalingMode(scalingMode);
1183 }
1184
SetBufferHold(bool hold)1185 GSError BufferQueueProducer::SetBufferHold(bool hold)
1186 {
1187 if (bufferQueue_ == nullptr) {
1188 return GSERROR_INVALID_ARGUMENTS;
1189 }
1190 return bufferQueue_->SetBufferHold(hold);
1191 }
1192
SetMetaData(uint32_t sequence,const std::vector<GraphicHDRMetaData> & metaData)1193 GSError BufferQueueProducer::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData> &metaData)
1194 {
1195 if (bufferQueue_ == nullptr) {
1196 return GSERROR_INVALID_ARGUMENTS;
1197 }
1198
1199 return bufferQueue_->SetMetaData(sequence, metaData);
1200 }
1201
SetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)1202 GSError BufferQueueProducer::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
1203 const std::vector<uint8_t> &metaData)
1204 {
1205 if (bufferQueue_ == nullptr) {
1206 return GSERROR_INVALID_ARGUMENTS;
1207 }
1208
1209 return bufferQueue_->SetMetaDataSet(sequence, key, metaData);
1210 }
1211
SetTunnelHandle(const sptr<SurfaceTunnelHandle> & handle)1212 GSError BufferQueueProducer::SetTunnelHandle(const sptr<SurfaceTunnelHandle> &handle)
1213 {
1214 if (bufferQueue_ == nullptr) {
1215 return GSERROR_INVALID_ARGUMENTS;
1216 }
1217 return bufferQueue_->SetTunnelHandle(handle);
1218 }
1219
SetTunnelHandle(const GraphicExtDataHandle * handle)1220 GSError BufferQueueProducer::SetTunnelHandle(const GraphicExtDataHandle *handle)
1221 {
1222 sptr<SurfaceTunnelHandle> tunnelHandle = new SurfaceTunnelHandle();
1223 if (tunnelHandle->SetHandle(handle) != GSERROR_OK) {
1224 return GSERROR_INVALID_OPERATING;
1225 }
1226 return bufferQueue_->SetTunnelHandle(tunnelHandle);
1227 }
1228
GetPresentTimestamp(uint32_t sequence,GraphicPresentTimestampType type,int64_t & time)1229 GSError BufferQueueProducer::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type, int64_t &time)
1230 {
1231 if (bufferQueue_ == nullptr) {
1232 return GSERROR_INVALID_ARGUMENTS;
1233 }
1234 return bufferQueue_->GetPresentTimestamp(sequence, type, time);
1235 }
1236
GetStatus() const1237 bool BufferQueueProducer::GetStatus() const
1238 {
1239 if (bufferQueue_ == nullptr) {
1240 return false;
1241 }
1242 return bufferQueue_->GetStatus();
1243 }
1244
SetStatus(bool status)1245 void BufferQueueProducer::SetStatus(bool status)
1246 {
1247 if (bufferQueue_ == nullptr) {
1248 return;
1249 }
1250 bufferQueue_->SetStatus(status);
1251 }
1252
GetNativeSurface()1253 sptr<NativeSurface> BufferQueueProducer::GetNativeSurface()
1254 {
1255 return nullptr;
1256 }
1257
OnBufferProducerRemoteDied()1258 void BufferQueueProducer::OnBufferProducerRemoteDied()
1259 {
1260 if (bufferQueue_ == nullptr) {
1261 return;
1262 }
1263
1264 {
1265 std::lock_guard<std::mutex> lock(mutex_);
1266 if (connectedPid_ == 0) {
1267 BLOGD("no connections, uniqueId: %{public}" PRIu64 ".", uniqueId_);
1268 return;
1269 }
1270 connectedPid_ = 0;
1271 }
1272 bufferQueue_->CleanCache(false);
1273 }
1274
ProducerSurfaceDeathRecipient(wptr<BufferQueueProducer> producer)1275 BufferQueueProducer::ProducerSurfaceDeathRecipient::ProducerSurfaceDeathRecipient(
1276 wptr<BufferQueueProducer> producer) : producer_(producer)
1277 {
1278 }
1279
OnRemoteDied(const wptr<IRemoteObject> & remoteObject)1280 void BufferQueueProducer::ProducerSurfaceDeathRecipient::OnRemoteDied(const wptr<IRemoteObject>& remoteObject)
1281 {
1282 auto remoteToken = remoteObject.promote();
1283 if (remoteToken == nullptr) {
1284 BLOGW("can't promote remote object.");
1285 return;
1286 }
1287
1288 auto producer = producer_.promote();
1289 if (producer == nullptr) {
1290 BLOGD("producer is nullptr");
1291 return;
1292 }
1293
1294 if (producer->token_ != remoteToken) {
1295 BLOGD("token doesn't match, ignore it, uniqueId: %{public}" PRIu64 ".", producer->GetUniqueId());
1296 return;
1297 }
1298 BLOGD("remote object died, uniqueId: %{public}" PRIu64 ".", producer->GetUniqueId());
1299 producer->OnBufferProducerRemoteDied();
1300 }
1301 }; // namespace OHOS
1302