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