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