1 /*
2 * Copyright (c) 2021-2025 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 #include <csignal>
22
23 #include "buffer_extra_data_impl.h"
24 #include "buffer_log.h"
25 #include "buffer_producer_listener.h"
26 #include "buffer_utils.h"
27 #include "frame_report.h"
28 #include <parameter.h>
29 #include <parameters.h>
30 #include "sync_fence.h"
31
32 #define BUFFER_PRODUCER_API_FUNC_PAIR(apiSequenceNum, func) \
33 {apiSequenceNum, [](BufferQueueProducer *that, MessageParcel &arguments, MessageParcel &reply, \
34 MessageOption &option){return that->func(arguments, reply, option);}} \
35
36 namespace OHOS {
37 namespace {
38 constexpr int32_t BUFFER_MATRIX_SIZE = 16;
39 } // namespace
40
41 const std::map<uint32_t, std::function<int32_t(BufferQueueProducer *that, MessageParcel &arguments,
42 MessageParcel &reply, MessageOption &option)>> BufferQueueProducer::memberFuncMap_ = {
43 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_INIT_INFO, GetProducerInitInfoRemote),
44 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_REQUEST_BUFFER, RequestBufferRemote),
45 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_REQUEST_BUFFERS, RequestBuffersRemote),
46 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_CANCEL_BUFFER, CancelBufferRemote),
47 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_FLUSH_BUFFER, FlushBufferRemote),
48 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_FLUSH_BUFFERS, FlushBuffersRemote),
49 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_ATTACH_BUFFER, AttachBufferRemote),
50 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_DETACH_BUFFER, DetachBufferRemote),
51 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_QUEUE_SIZE, GetQueueSizeRemote),
52 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_QUEUE_SIZE, SetQueueSizeRemote),
53 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_NAME, GetNameRemote),
54 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_DEFAULT_WIDTH, GetDefaultWidthRemote),
55 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_DEFAULT_HEIGHT, GetDefaultHeightRemote),
56 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_DEFAULT_USAGE, GetDefaultUsageRemote),
57 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_UNIQUE_ID, GetUniqueIdRemote),
58 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_CLEAN_CACHE, CleanCacheRemote),
59 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_REGISTER_RELEASE_LISTENER, RegisterReleaseListenerRemote),
60 BUFFER_PRODUCER_API_FUNC_PAIR(
61 BUFFER_PRODUCER_REGISTER_RELEASE_LISTENER_BACKUP, RegisterReleaseListenerBackupRemote),
62 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_TRANSFORM, SetTransformRemote),
63 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_NAMEANDUNIQUEDID, GetNameAndUniqueIdRemote),
64 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_DISCONNECT, DisconnectRemote),
65 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_CONNECT, ConnectRemote),
66 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_SCALING_MODE, SetScalingModeRemote),
67 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_METADATA, SetMetaDataRemote),
68 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_METADATASET, SetMetaDataSetRemote),
69 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_TUNNEL_HANDLE, SetTunnelHandleRemote),
70 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GO_BACKGROUND, GoBackgroundRemote),
71 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_PRESENT_TIMESTAMP, GetPresentTimestampRemote),
72 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_UNREGISTER_RELEASE_LISTENER, UnRegisterReleaseListenerRemote),
73 BUFFER_PRODUCER_API_FUNC_PAIR(
74 BUFFER_PRODUCER_UNREGISTER_RELEASE_LISTENER_BACKUP, UnRegisterReleaseListenerBackupRemote),
75 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_LAST_FLUSHED_BUFFER, GetLastFlushedBufferRemote),
76 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_TRANSFORM, GetTransformRemote),
77 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_ATTACH_BUFFER_TO_QUEUE, AttachBufferToQueueRemote),
78 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_DETACH_BUFFER_FROM_QUEUE, DetachBufferFromQueueRemote),
79 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_DEFAULT_USAGE, SetDefaultUsageRemote),
80 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_TRANSFORMHINT, GetTransformHintRemote),
81 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_TRANSFORMHINT, SetTransformHintRemote),
82 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_BUFFER_HOLD, SetBufferHoldRemote),
83 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_BUFFER_NAME, SetBufferNameRemote),
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 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_REQUESTBUFFER_NOBLOCKMODE, SetRequestBufferNoblockModeRemote),
97 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_REQUEST_AND_DETACH_BUFFER, RequestAndDetachBufferRemote),
98 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_ATTACH_AND_FLUSH_BUFFER, AttachAndFlushBufferRemote),
99 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_ROTATING_BUFFERS_NUMBER, GetRotatingBuffersNumberRemote),
100 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_ROTATING_BUFFERS_NUMBER, SetRotatingBuffersNumberRemote),
101 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_FRAME_GRAVITY, SetFrameGravityRemote),
102 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_FIXED_ROTATION, SetFixedRotationRemote),
103 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_DISCONNECT_STRICTLY, DisconnectStrictlyRemote),
104 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_CONNECT_STRICTLY, ConnectStrictlyRemote),
105 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_REGISTER_PROPERTY_LISTENER, RegisterPropertyListenerRemote),
106 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_UNREGISTER_PROPERTY_LISTENER, UnRegisterPropertyListenerRemote),
107 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_PRE_ALLOC_BUFFERS, PreAllocBuffersRemote),
108 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_LPP_FD, SetLppShareFdRemote),
109 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_BUFFER_REALLOC_FLAG, SetBufferReallocFlagRemote),
110 BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_ALPHA_TYPE, SetAlphaTypeRemote),
111 };
112
BufferQueueProducer(sptr<BufferQueue> bufferQueue)113 BufferQueueProducer::BufferQueueProducer(sptr<BufferQueue> bufferQueue)
114 : producerSurfaceDeathRecipient_(new ProducerSurfaceDeathRecipient(this))
115 {
116 bufferQueue_ = std::move(bufferQueue);
117 if (bufferQueue_ != nullptr) {
118 bufferQueue_->GetName(name_);
119 uniqueId_ = bufferQueue_->GetUniqueId();
120 }
121 }
122
~BufferQueueProducer()123 BufferQueueProducer::~BufferQueueProducer()
124 {
125 (void)CheckIsAlive();
126 magicNum_ = 0;
127 if (token_ && producerSurfaceDeathRecipient_) {
128 token_->RemoveDeathRecipient(producerSurfaceDeathRecipient_);
129 token_ = nullptr;
130 }
131 }
132
CheckConnectLocked()133 GSError BufferQueueProducer::CheckConnectLocked()
134 {
135 if (connectedPid_ == 0) {
136 BLOGW("no connections, uniqueId: %{public}" PRIu64 ".", uniqueId_);
137 return SURFACE_ERROR_CONSUMER_DISCONNECTED;
138 }
139
140 if (connectedPid_ != GetCallingPid()) {
141 BLOGW("connected by: %{public}d, uniqueId: %{public}" PRIu64 ".", connectedPid_, uniqueId_);
142 return SURFACE_ERROR_CONSUMER_IS_CONNECTED;
143 }
144
145 return GSERROR_OK;
146 }
147
OnRemoteRequest(uint32_t code,MessageParcel & arguments,MessageParcel & reply,MessageOption & option)148 int32_t BufferQueueProducer::OnRemoteRequest(uint32_t code, MessageParcel &arguments,
149 MessageParcel &reply, MessageOption &option)
150 {
151 if (!CheckIsAlive()) {
152 return ERR_NULL_OBJECT;
153 }
154 auto it = memberFuncMap_.find(code);
155 if (it == memberFuncMap_.end()) {
156 BLOGE("cannot process %{public}u", code);
157 return IPCObjectStub::OnRemoteRequest(code, arguments, reply, option);
158 }
159
160 if (it->second == nullptr) {
161 BLOGE("memberFuncMap_[%{public}u] is nullptr", code);
162 return ERR_NONE;
163 }
164
165 auto remoteDescriptor = arguments.ReadInterfaceToken();
166 if (GetDescriptor() != remoteDescriptor) {
167 return ERR_INVALID_STATE;
168 }
169
170 auto ret = it->second(this, arguments, reply, option);
171 return ret;
172 }
173
RequestBufferRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)174 int32_t BufferQueueProducer::RequestBufferRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
175 {
176 RequestBufferReturnValue retval;
177 sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
178 BufferRequestConfig config = {};
179 int64_t startTimeNs = 0;
180 int64_t endTimeNs = 0;
181 bool isActiveGame = false;
182 int32_t connectedPid = 0;
183 {
184 std::lock_guard<std::mutex> lock(mutex_);
185 connectedPid = connectedPid_;
186 }
187 isActiveGame = Rosen::FrameReport::GetInstance().IsActiveGameWithPid(connectedPid);
188 if (isActiveGame) {
189 startTimeNs = std::chrono::duration_cast<std::chrono::nanoseconds>(
190 std::chrono::steady_clock::now().time_since_epoch()).count();
191 }
192
193 ReadRequestConfig(arguments, config);
194
195 GSError sRet = RequestBuffer(config, bedataimpl, retval);
196 if (!reply.WriteInt32(sRet)) {
197 return IPC_STUB_WRITE_PARCEL_ERR;
198 }
199 if (sRet == GSERROR_OK &&
200 (WriteSurfaceBufferImpl(reply, retval.sequence, retval.buffer) != GSERROR_OK ||
201 (retval.buffer != nullptr && !reply.WriteUint64(retval.buffer->GetBufferRequestConfig().usage)) ||
202 bedataimpl->WriteToParcel(reply) != GSERROR_OK || !retval.fence->WriteToMessageParcel(reply) ||
203 !reply.WriteUInt32Vector(retval.deletingBuffers))) {
204 return IPC_STUB_WRITE_PARCEL_ERR;
205 } else if (sRet != GSERROR_OK && !reply.WriteBool(retval.isConnected)) {
206 return IPC_STUB_WRITE_PARCEL_ERR;
207 }
208
209 if (isActiveGame) {
210 endTimeNs = std::chrono::duration_cast<std::chrono::nanoseconds>(
211 std::chrono::steady_clock::now().time_since_epoch()).count();
212 Rosen::FrameReport::GetInstance().SetDequeueBufferTime(name_, (endTimeNs - startTimeNs));
213 }
214
215 return ERR_NONE;
216 }
217
RequestBuffersRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)218 int32_t BufferQueueProducer::RequestBuffersRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
219 {
220 std::vector<RequestBufferReturnValue> retvalues;
221 std::vector<sptr<BufferExtraData>> bedataimpls;
222 BufferRequestConfig config = {};
223 uint32_t num = 0;
224
225 arguments.ReadUint32(num);
226 ReadRequestConfig(arguments, config);
227 if (num == 0 || num > SURFACE_MAX_QUEUE_SIZE) {
228 return ERR_NONE;
229 }
230 retvalues.resize(num);
231 bedataimpls.reserve(num);
232
233 for (uint32_t i = 0; i < num; ++i) {
234 sptr<BufferExtraData> data = new BufferExtraDataImpl;
235 bedataimpls.emplace_back(data);
236 }
237 GSError sRet = RequestBuffers(config, bedataimpls, retvalues);
238 if (!reply.WriteInt32(sRet)) {
239 return IPC_STUB_WRITE_PARCEL_ERR;
240 }
241 if (sRet == GSERROR_OK || sRet == GSERROR_NO_BUFFER) {
242 num = static_cast<uint32_t>(retvalues.size());
243 if (!reply.WriteUint32(num)) {
244 return IPC_STUB_WRITE_PARCEL_ERR;
245 }
246 for (uint32_t i = 0; i < num; ++i) {
247 if (WriteSurfaceBufferImpl(reply, retvalues[i].sequence, retvalues[i].buffer) != GSERROR_OK ||
248 (retvalues[i].buffer != nullptr &&
249 !reply.WriteUint64(retvalues[i].buffer->GetBufferRequestConfig().usage)) ||
250 bedataimpls[i]->WriteToParcel(reply) != GSERROR_OK ||
251 !retvalues[i].fence->WriteToMessageParcel(reply) ||
252 !reply.WriteUInt32Vector(retvalues[i].deletingBuffers)) {
253 return IPC_STUB_WRITE_PARCEL_ERR;
254 }
255 }
256 } else if (sRet != GSERROR_OK && !reply.WriteBool(retvalues[0].isConnected)) {
257 return IPC_STUB_WRITE_PARCEL_ERR;
258 }
259 return ERR_NONE;
260 }
261
GetProducerInitInfoRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)262 int32_t BufferQueueProducer::GetProducerInitInfoRemote(MessageParcel &arguments,
263 MessageParcel &reply, MessageOption &option)
264 {
265 ProducerInitInfo info;
266 sptr<IRemoteObject> token = arguments.ReadRemoteObject();
267 if (token == nullptr || !arguments.ReadString(info.appName)) {
268 return ERR_INVALID_DATA;
269 }
270 sptr<IRemoteObject> listenerObject = arguments.ReadRemoteObject();
271 if (listenerObject == nullptr) {
272 return ERR_INVALID_DATA;
273 }
274 (void)GetProducerInitInfo(info);
275 if (!reply.WriteInt32(info.width) || !reply.WriteInt32(info.height) || !reply.WriteUint64(info.uniqueId) ||
276 !reply.WriteString(info.name) || !reply.WriteBool(info.isInHebcList) || !reply.WriteString(info.bufferName) ||
277 !reply.WriteUint64(info.producerId) || !reply.WriteInt32(info.transformHint)) {
278 return IPC_STUB_WRITE_PARCEL_ERR;
279 }
280
281 sptr<IProducerListener> listener = iface_cast<IProducerListener>(listenerObject);
282 GSError sRet = RegisterPropertyListener(listener, info.producerId);
283 bool result = HandleDeathRecipient(token);
284 if (!reply.WriteInt32((result && sRet == GSERROR_OK) ? GSERROR_OK : SURFACE_ERROR_UNKOWN)) {
285 return IPC_STUB_WRITE_PARCEL_ERR;
286 }
287 return ERR_NONE;
288 }
289
CancelBufferRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)290 int32_t BufferQueueProducer::CancelBufferRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
291 {
292 uint32_t sequence;
293 sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
294
295 sequence = arguments.ReadUint32();
296 if (bedataimpl->ReadFromParcel(arguments) != GSERROR_OK) {
297 return ERR_INVALID_REPLY;
298 }
299
300 GSError sRet = CancelBuffer(sequence, bedataimpl);
301 if (!reply.WriteInt32(sRet)) {
302 return IPC_STUB_WRITE_PARCEL_ERR;
303 }
304 return ERR_NONE;
305 }
306
FlushBufferRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)307 int32_t BufferQueueProducer::FlushBufferRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
308 {
309 uint32_t sequence;
310 BufferFlushConfigWithDamages config;
311 sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
312 int64_t startTimeNs = 0;
313 int64_t endTimeNs = 0;
314 bool isActiveGame = false;
315 int32_t connectedPid = 0;
316 {
317 std::lock_guard<std::mutex> lock(mutex_);
318 connectedPid = connectedPid_;
319 }
320 isActiveGame = Rosen::FrameReport::GetInstance().IsActiveGameWithPid(connectedPid);
321 if (isActiveGame) {
322 startTimeNs = std::chrono::duration_cast<std::chrono::nanoseconds>(
323 std::chrono::steady_clock::now().time_since_epoch()).count();
324 }
325
326 sequence = arguments.ReadUint32();
327 if (bedataimpl->ReadFromParcel(arguments) != GSERROR_OK) {
328 return ERR_INVALID_REPLY;
329 }
330
331 sptr<SyncFence> fence = SyncFence::ReadFromMessageParcel(arguments);
332 if (ReadFlushConfig(arguments, config) != GSERROR_OK) {
333 return ERR_INVALID_REPLY;
334 }
335
336 GSError sRet = FlushBuffer(sequence, bedataimpl, fence, config);
337 if (!reply.WriteInt32(sRet)) {
338 return IPC_STUB_WRITE_PARCEL_ERR;
339 }
340
341 if (isActiveGame) {
342 uint64_t uniqueId = GetUniqueId();
343 endTimeNs = std::chrono::duration_cast<std::chrono::nanoseconds>(
344 std::chrono::steady_clock::now().time_since_epoch()).count();
345 Rosen::FrameReport::GetInstance().SetQueueBufferTime(uniqueId, name_, (endTimeNs - startTimeNs));
346 Rosen::FrameReport::GetInstance().Report(name_);
347 }
348
349 return ERR_NONE;
350 }
351
FlushBuffersRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)352 int32_t BufferQueueProducer::FlushBuffersRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
353 {
354 std::vector<uint32_t> sequences;
355 std::vector<BufferFlushConfigWithDamages> configs;
356 std::vector<sptr<BufferExtraData>> bedataimpls;
357 std::vector<sptr<SyncFence>> fences;
358 arguments.ReadUInt32Vector(&sequences);
359 if (sequences.size() == 0 || sequences.size() > SURFACE_MAX_QUEUE_SIZE) {
360 return ERR_NONE;
361 }
362 for (size_t i = 0; i < sequences.size(); ++i) {
363 sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
364 if (bedataimpl->ReadFromParcel(arguments) != GSERROR_OK) {
365 return ERR_INVALID_REPLY;
366 }
367 bedataimpls.emplace_back(bedataimpl);
368 sptr<SyncFence> fence = SyncFence::ReadFromMessageParcel(arguments);
369 fences.emplace_back(fence);
370 BufferFlushConfigWithDamages config;
371 if (ReadFlushConfig(arguments, config) != GSERROR_OK) {
372 return ERR_INVALID_REPLY;
373 }
374 configs.emplace_back(config);
375 }
376
377 GSError sRet = FlushBuffers(sequences, bedataimpls, fences, configs);
378 if (!reply.WriteInt32(sRet)) {
379 return IPC_STUB_WRITE_PARCEL_ERR;
380 }
381 return ERR_NONE;
382 }
383
GetLastFlushedBufferRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)384 int32_t BufferQueueProducer::GetLastFlushedBufferRemote(MessageParcel &arguments,
385 MessageParcel &reply, MessageOption &option)
386 {
387 sptr<SurfaceBuffer> buffer;
388 sptr<SyncFence> fence;
389 float matrix[BUFFER_MATRIX_SIZE];
390 bool isUseNewMatrix = arguments.ReadBool();
391 GSError sRet = GetLastFlushedBuffer(buffer, fence, matrix, isUseNewMatrix);
392 if (!reply.WriteInt32(sRet)) {
393 return IPC_STUB_WRITE_PARCEL_ERR;
394 }
395 if (sRet == GSERROR_OK) {
396 uint32_t sequence = buffer->GetSeqNum();
397 if (WriteSurfaceBufferImpl(reply, sequence, buffer) != GSERROR_OK ||
398 buffer->WriteBufferRequestConfig(reply) != GSERROR_OK) {
399 return IPC_STUB_WRITE_PARCEL_ERR;
400 }
401 std::vector<float> writeMatrixVector(matrix, matrix + sizeof(matrix) / sizeof(float));
402 if (!fence->WriteToMessageParcel(reply) || !reply.WriteFloatVector(writeMatrixVector)) {
403 return IPC_STUB_WRITE_PARCEL_ERR;
404 }
405 }
406 return ERR_NONE;
407 }
408
AttachBufferToQueueReadBuffer(MessageParcel & arguments,MessageParcel & reply,MessageOption & option,sptr<SurfaceBuffer> & buffer)409 int32_t BufferQueueProducer::AttachBufferToQueueReadBuffer(MessageParcel &arguments,
410 MessageParcel &reply, MessageOption &option, sptr<SurfaceBuffer> &buffer)
411 {
412 uint32_t sequence;
413 GSError sRet = ReadSurfaceBufferImpl(arguments, sequence, buffer);
414 if (sRet != GSERROR_OK || buffer == nullptr) {
415 if (!reply.WriteInt32(SURFACE_ERROR_UNKOWN)) {
416 return IPC_STUB_WRITE_PARCEL_ERR;
417 }
418 return ERR_INVALID_DATA;
419 }
420 sRet = buffer->ReadBufferRequestConfig(arguments);
421 if (sRet != GSERROR_OK) {
422 if (!reply.WriteInt32(SURFACE_ERROR_UNKOWN)) {
423 return IPC_STUB_WRITE_PARCEL_ERR;
424 }
425 return ERR_INVALID_DATA;
426 }
427 return ERR_NONE;
428 }
429
AttachBufferToQueueRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)430 int32_t BufferQueueProducer::AttachBufferToQueueRemote(MessageParcel &arguments,
431 MessageParcel &reply, MessageOption &option)
432 {
433 sptr<SurfaceBuffer> buffer = nullptr;
434 auto ret = AttachBufferToQueueReadBuffer(arguments, reply, option, buffer);
435 if (ret != ERR_NONE) {
436 return ret;
437 }
438 GSError sRet = AttachBufferToQueue(buffer);
439 if (!reply.WriteInt32(sRet)) {
440 return IPC_STUB_WRITE_PARCEL_ERR;
441 }
442 return ERR_NONE;
443 }
444
DetachBufferFromQueueRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)445 int32_t BufferQueueProducer::DetachBufferFromQueueRemote(MessageParcel &arguments,
446 MessageParcel &reply, MessageOption &option)
447 {
448 sptr<SurfaceBuffer> buffer = nullptr;
449 uint32_t sequence;
450 GSError ret = ReadSurfaceBufferImpl(arguments, sequence, buffer);
451 if (ret != GSERROR_OK || buffer == nullptr) {
452 if (!reply.WriteInt32(SURFACE_ERROR_UNKOWN)) {
453 return IPC_STUB_WRITE_PARCEL_ERR;
454 }
455 return ERR_INVALID_DATA;
456 }
457 ret = DetachBufferFromQueue(buffer);
458 if (!reply.WriteInt32(ret)) {
459 return IPC_STUB_WRITE_PARCEL_ERR;
460 }
461 return ERR_NONE;
462 }
463
AttachBufferRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)464 int32_t BufferQueueProducer::AttachBufferRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
465 {
466 sptr<SurfaceBuffer> buffer;
467 uint32_t sequence;
468 int32_t timeOut;
469 GSError ret = ReadSurfaceBufferImpl(arguments, sequence, buffer);
470 if (ret != GSERROR_OK || buffer == nullptr) {
471 if (!reply.WriteInt32(ret)) {
472 return IPC_STUB_WRITE_PARCEL_ERR;
473 }
474 return ERR_INVALID_DATA;
475 }
476 timeOut = arguments.ReadInt32();
477
478 ret = AttachBuffer(buffer, timeOut);
479 if (!reply.WriteInt32(ret)) {
480 return IPC_STUB_WRITE_PARCEL_ERR;
481 }
482 return ERR_NONE;
483 }
484
DetachBufferRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)485 int32_t BufferQueueProducer::DetachBufferRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
486 {
487 return ERR_NONE;
488 }
489
GetQueueSizeRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)490 int32_t BufferQueueProducer::GetQueueSizeRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
491 {
492 if (!reply.WriteInt32(GetQueueSize())) {
493 return IPC_STUB_WRITE_PARCEL_ERR;
494 }
495 return ERR_NONE;
496 }
497
SetQueueSizeRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)498 int32_t BufferQueueProducer::SetQueueSizeRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
499 {
500 uint32_t queueSize = arguments.ReadUint32();
501 GSError sRet = SetQueueSize(queueSize);
502 if (!reply.WriteInt32(sRet)) {
503 return IPC_STUB_WRITE_PARCEL_ERR;
504 }
505 return ERR_NONE;
506 }
507
GetNameRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)508 int32_t BufferQueueProducer::GetNameRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
509 {
510 std::string name;
511 auto sRet = bufferQueue_->GetName(name);
512 if (!reply.WriteInt32(sRet)) {
513 return IPC_STUB_WRITE_PARCEL_ERR;
514 }
515 if (sRet == GSERROR_OK && !reply.WriteString(name)) {
516 return IPC_STUB_WRITE_PARCEL_ERR;
517 }
518 return ERR_NONE;
519 }
520
GetNameAndUniqueIdRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)521 int32_t BufferQueueProducer::GetNameAndUniqueIdRemote(MessageParcel &arguments, MessageParcel &reply,
522 MessageOption &option)
523 {
524 std::string name = "not init";
525 uint64_t uniqueId = 0;
526 auto ret = GetNameAndUniqueId(name, uniqueId);
527 if (!reply.WriteInt32(ret)) {
528 return IPC_STUB_WRITE_PARCEL_ERR;
529 }
530 if (ret == GSERROR_OK && (!reply.WriteString(name) || !reply.WriteUint64(uniqueId))) {
531 return IPC_STUB_WRITE_PARCEL_ERR;
532 }
533 return ERR_NONE;
534 }
535
GetDefaultWidthRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)536 int32_t BufferQueueProducer::GetDefaultWidthRemote(MessageParcel &arguments, MessageParcel &reply,
537 MessageOption &option)
538 {
539 if (!reply.WriteInt32(GetDefaultWidth())) {
540 return IPC_STUB_WRITE_PARCEL_ERR;
541 }
542 return ERR_NONE;
543 }
544
GetDefaultHeightRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)545 int32_t BufferQueueProducer::GetDefaultHeightRemote(MessageParcel &arguments, MessageParcel &reply,
546 MessageOption &option)
547 {
548 if (!reply.WriteInt32(GetDefaultHeight())) {
549 return IPC_STUB_WRITE_PARCEL_ERR;
550 }
551 return ERR_NONE;
552 }
553
SetDefaultUsageRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)554 int32_t BufferQueueProducer::SetDefaultUsageRemote(MessageParcel &arguments, MessageParcel &reply,
555 MessageOption &option)
556 {
557 uint64_t usage = arguments.ReadUint64();
558 GSError sRet = SetDefaultUsage(usage);
559 if (!reply.WriteInt32(sRet)) {
560 return IPC_STUB_WRITE_PARCEL_ERR;
561 }
562 return ERR_NONE;
563 }
564
GetDefaultUsageRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)565 int32_t BufferQueueProducer::GetDefaultUsageRemote(MessageParcel &arguments, MessageParcel &reply,
566 MessageOption &option)
567 {
568 if (!reply.WriteUint64(GetDefaultUsage())) {
569 return IPC_STUB_WRITE_PARCEL_ERR;
570 }
571 return ERR_NONE;
572 }
573
GetUniqueIdRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)574 int32_t BufferQueueProducer::GetUniqueIdRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
575 {
576 if (!reply.WriteUint64(GetUniqueId())) {
577 return IPC_STUB_WRITE_PARCEL_ERR;
578 }
579 return ERR_NONE;
580 }
581
CleanCacheRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)582 int32_t BufferQueueProducer::CleanCacheRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
583 {
584 bool cleanAll = arguments.ReadBool();
585 uint32_t bufSeqNum = 0;
586 GSError result = CleanCache(cleanAll, &bufSeqNum);
587 if (!reply.WriteInt32(result)) {
588 return IPC_STUB_WRITE_PARCEL_ERR;
589 }
590 if (result == GSERROR_OK && !reply.WriteUint32(bufSeqNum)) {
591 return IPC_STUB_WRITE_PARCEL_ERR;
592 }
593 return ERR_NONE;
594 }
595
GoBackgroundRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)596 int32_t BufferQueueProducer::GoBackgroundRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
597 {
598 if (!reply.WriteInt32(GoBackground())) {
599 return IPC_STUB_WRITE_PARCEL_ERR;
600 }
601 return ERR_NONE;
602 }
603
RegisterReleaseListenerRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)604 int32_t BufferQueueProducer::RegisterReleaseListenerRemote(MessageParcel &arguments,
605 MessageParcel &reply, MessageOption &option)
606 {
607 sptr<IRemoteObject> listenerObject = arguments.ReadRemoteObject();
608 if (listenerObject == nullptr) {
609 if (!reply.WriteInt32(GSERROR_INVALID_ARGUMENTS)) {
610 return IPC_STUB_WRITE_PARCEL_ERR;
611 }
612 return ERR_INVALID_REPLY;
613 }
614 sptr<IProducerListener> listener = iface_cast<IProducerListener>(listenerObject);
615 GSError sRet = RegisterReleaseListener(listener);
616 if (!reply.WriteInt32(sRet)) {
617 return IPC_STUB_WRITE_PARCEL_ERR;
618 }
619 return ERR_NONE;
620 }
621
RegisterPropertyListenerRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)622 int32_t BufferQueueProducer::RegisterPropertyListenerRemote(MessageParcel &arguments,
623 MessageParcel &reply, MessageOption &option)
624 {
625 sptr<IRemoteObject> listenerObject = arguments.ReadRemoteObject();
626 if (listenerObject == nullptr) {
627 if (!reply.WriteInt32(GSERROR_INVALID_ARGUMENTS)) {
628 return IPC_STUB_WRITE_PARCEL_ERR;
629 }
630 return ERR_INVALID_REPLY;
631 }
632 sptr<IProducerListener> listener = iface_cast<IProducerListener>(listenerObject);
633 int64_t id = -1;
634 if (!arguments.ReadInt64(id)) {
635 return ERR_INVALID_REPLY;
636 }
637 auto pid = static_cast<pid_t>(id);
638 GSError sRet = RegisterPropertyListener(listener, pid);
639 if (!reply.WriteInt32(sRet)) {
640 return IPC_STUB_WRITE_PARCEL_ERR;
641 }
642 return ERR_NONE;
643 }
644
UnRegisterPropertyListenerRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)645 int32_t BufferQueueProducer::UnRegisterPropertyListenerRemote(MessageParcel &arguments,
646 MessageParcel &reply, MessageOption &option)
647 {
648 int64_t pid = -1;
649 if (!arguments.ReadInt64(pid)) {
650 return ERR_INVALID_REPLY;
651 }
652 auto id = static_cast<pid_t>(pid);
653 GSError sRet = UnRegisterPropertyListener(id);
654 if (!reply.WriteInt32(sRet)) {
655 return IPC_STUB_WRITE_PARCEL_ERR;
656 }
657 return ERR_NONE;
658 }
659
SetLppShareFdRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)660 int32_t BufferQueueProducer::SetLppShareFdRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
661 {
662 int32_t fd = arguments.ReadFileDescriptor();
663 if (fd < 0) {
664 reply.WriteInt32(GSERROR_INVALID_ARGUMENTS);
665 return ERR_INVALID_VALUE;
666 }
667 bool state = arguments.ReadBool();
668 GSError sRet = SetLppShareFd(fd, state);
669 if (!reply.WriteInt32(sRet)) {
670 close(fd);
671 return IPC_STUB_WRITE_PARCEL_ERR;
672 }
673 close(fd);
674 return ERR_NONE;
675 }
676
RegisterReleaseListenerBackupRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)677 int32_t BufferQueueProducer::RegisterReleaseListenerBackupRemote(MessageParcel &arguments,
678 MessageParcel &reply, MessageOption &option)
679 {
680 sptr<IRemoteObject> listenerObject = arguments.ReadRemoteObject();
681 if (listenerObject == nullptr) {
682 if (!reply.WriteInt32(GSERROR_INVALID_ARGUMENTS)) {
683 return IPC_STUB_WRITE_PARCEL_ERR;
684 }
685 return ERR_INVALID_REPLY;
686 }
687 sptr<IProducerListener> listener = iface_cast<IProducerListener>(listenerObject);
688 GSError sRet = RegisterReleaseListenerBackup(listener);
689 if (!reply.WriteInt32(sRet)) {
690 return IPC_STUB_WRITE_PARCEL_ERR;
691 }
692 return ERR_NONE;
693 }
694
UnRegisterReleaseListenerRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)695 int32_t BufferQueueProducer::UnRegisterReleaseListenerRemote(MessageParcel &arguments,
696 MessageParcel &reply, MessageOption &option)
697 {
698 GSError sRet = UnRegisterReleaseListener();
699 if (!reply.WriteInt32(sRet)) {
700 return IPC_STUB_WRITE_PARCEL_ERR;
701 }
702 return ERR_NONE;
703 }
704
UnRegisterReleaseListenerBackupRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)705 int32_t BufferQueueProducer::UnRegisterReleaseListenerBackupRemote(MessageParcel &arguments,
706 MessageParcel &reply, MessageOption &option)
707 {
708 GSError sRet = UnRegisterReleaseListenerBackup();
709 if (!reply.WriteInt32(sRet)) {
710 return IPC_STUB_WRITE_PARCEL_ERR;
711 }
712 return ERR_NONE;
713 }
714
SetTransformRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)715 int32_t BufferQueueProducer::SetTransformRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
716 {
717 GraphicTransformType transform = static_cast<GraphicTransformType>(arguments.ReadUint32());
718 GSError sRet = SetTransform(transform);
719 if (!reply.WriteInt32(sRet)) {
720 return IPC_STUB_WRITE_PARCEL_ERR;
721 }
722 return ERR_NONE;
723 }
724
ConnectRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)725 int32_t BufferQueueProducer::ConnectRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
726 {
727 GSError sRet = Connect();
728 if (!reply.WriteInt32(sRet)) {
729 return IPC_STUB_WRITE_PARCEL_ERR;
730 }
731 return ERR_NONE;
732 }
733
DisconnectRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)734 int32_t BufferQueueProducer::DisconnectRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
735 {
736 uint32_t bufSeqNum = 0;
737 GSError sRet = Disconnect(&bufSeqNum);
738 if (!reply.WriteInt32(sRet)) {
739 return IPC_STUB_WRITE_PARCEL_ERR;
740 }
741
742 if (sRet == GSERROR_OK && !reply.WriteUint32(bufSeqNum)) {
743 return IPC_STUB_WRITE_PARCEL_ERR;
744 }
745 return ERR_NONE;
746 }
747
ConnectStrictlyRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)748 int32_t BufferQueueProducer::ConnectStrictlyRemote(MessageParcel &arguments, MessageParcel &reply,
749 MessageOption &option)
750 {
751 GSError sRet = ConnectStrictly();
752 if (!reply.WriteInt32(sRet)) {
753 return IPC_STUB_WRITE_PARCEL_ERR;
754 }
755 return ERR_NONE;
756 }
757
DisconnectStrictlyRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)758 int32_t BufferQueueProducer::DisconnectStrictlyRemote(MessageParcel &arguments, MessageParcel &reply,
759 MessageOption &option)
760 {
761 GSError sRet = DisconnectStrictly();
762 if (!reply.WriteInt32(sRet)) {
763 return IPC_STUB_WRITE_PARCEL_ERR;
764 }
765 return ERR_NONE;
766 }
767
SetScalingModeRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)768 int32_t BufferQueueProducer::SetScalingModeRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
769 {
770 uint32_t sequence = arguments.ReadUint32();
771 ScalingMode scalingMode = static_cast<ScalingMode>(arguments.ReadInt32());
772 GSError sRet = SetScalingMode(sequence, scalingMode);
773 if (!reply.WriteInt32(sRet)) {
774 return IPC_STUB_WRITE_PARCEL_ERR;
775 }
776 return ERR_NONE;
777 }
778
SetScalingModeV2Remote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)779 int32_t BufferQueueProducer::SetScalingModeV2Remote(MessageParcel &arguments, MessageParcel &reply,
780 MessageOption &option)
781 {
782 ScalingMode scalingMode = static_cast<ScalingMode>(arguments.ReadInt32());
783 GSError sRet = SetScalingMode(scalingMode);
784 if (!reply.WriteInt32(sRet)) {
785 return IPC_STUB_WRITE_PARCEL_ERR;
786 }
787 return ERR_NONE;
788 }
789
SetBufferHoldRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)790 int32_t BufferQueueProducer::SetBufferHoldRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
791 {
792 bool hold = arguments.ReadBool();
793 GSError sRet = SetBufferHold(hold);
794 if (!reply.WriteInt32(sRet)) {
795 return IPC_STUB_WRITE_PARCEL_ERR;
796 }
797 return ERR_NONE;
798 }
799
SetBufferReallocFlagRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)800 int32_t BufferQueueProducer::SetBufferReallocFlagRemote(MessageParcel &arguments, MessageParcel &reply,
801 MessageOption &option)
802 {
803 bool flag = arguments.ReadBool();
804 GSError sRet = SetBufferReallocFlag(flag);
805 if (!reply.WriteInt32(sRet)) {
806 return IPC_STUB_WRITE_PARCEL_ERR;
807 }
808 return ERR_NONE;
809 }
810
SetBufferNameRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)811 int32_t BufferQueueProducer::SetBufferNameRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
812 {
813 std::string bufferName = arguments.ReadString();
814 GSError sRet = SetBufferName(bufferName);
815 if (!reply.WriteInt32(sRet)) {
816 return IPC_STUB_WRITE_PARCEL_ERR;
817 }
818 return ERR_NONE;
819 }
820
SetMetaDataRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)821 int32_t BufferQueueProducer::SetMetaDataRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
822 {
823 uint32_t sequence = arguments.ReadUint32();
824 std::vector<GraphicHDRMetaData> metaData;
825 if (ReadHDRMetaData(arguments, metaData) != GSERROR_OK) {
826 return GSERROR_BINDER;
827 }
828 GSError sRet = SetMetaData(sequence, metaData);
829 if (!reply.WriteInt32(sRet)) {
830 return IPC_STUB_WRITE_PARCEL_ERR;
831 }
832 return ERR_NONE;
833 }
834
SetMetaDataSetRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)835 int32_t BufferQueueProducer::SetMetaDataSetRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
836 {
837 uint32_t sequence = arguments.ReadUint32();
838 GraphicHDRMetadataKey key = static_cast<GraphicHDRMetadataKey>(arguments.ReadUint32());
839 std::vector<uint8_t> metaData;
840 if (ReadHDRMetaDataSet(arguments, metaData) != GSERROR_OK) {
841 return GSERROR_BINDER;
842 }
843 GSError sRet = SetMetaDataSet(sequence, key, metaData);
844 if (!reply.WriteInt32(sRet)) {
845 return IPC_STUB_WRITE_PARCEL_ERR;
846 }
847 return ERR_NONE;
848 }
849
SetTunnelHandleRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)850 int32_t BufferQueueProducer::SetTunnelHandleRemote(MessageParcel &arguments, MessageParcel &reply,
851 MessageOption &option)
852 {
853 sptr<SurfaceTunnelHandle> handle = nullptr;
854 if (arguments.ReadBool()) {
855 handle = new SurfaceTunnelHandle();
856 if (ReadExtDataHandle(arguments, handle) != GSERROR_OK) {
857 return GSERROR_BINDER;
858 }
859 }
860 GSError sRet = SetTunnelHandle(handle);
861 if (!reply.WriteInt32(sRet)) {
862 return IPC_STUB_WRITE_PARCEL_ERR;
863 }
864 return ERR_NONE;
865 }
866
GetPresentTimestampRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)867 int32_t BufferQueueProducer::GetPresentTimestampRemote(MessageParcel &arguments, MessageParcel &reply,
868 MessageOption &option)
869 {
870 uint32_t sequence = arguments.ReadUint32();
871 GraphicPresentTimestampType type = static_cast<GraphicPresentTimestampType>(arguments.ReadUint32());
872 int64_t time = 0;
873 GSError sRet = GetPresentTimestamp(sequence, type, time);
874 if (!reply.WriteInt32(sRet)) {
875 return IPC_STUB_WRITE_PARCEL_ERR;
876 }
877 if (sRet == GSERROR_OK && !reply.WriteInt64(time)) {
878 return IPC_STUB_WRITE_PARCEL_ERR;
879 }
880 return ERR_NONE;
881 }
882
GetTransformRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)883 int32_t BufferQueueProducer::GetTransformRemote(
884 MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
885 {
886 GraphicTransformType transform = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
887 auto ret = GetTransform(transform);
888 if (ret != GSERROR_OK) {
889 if (!reply.WriteInt32(static_cast<int32_t>(ret))) {
890 return IPC_STUB_WRITE_PARCEL_ERR;
891 }
892 return ERR_INVALID_REPLY;
893 }
894
895 if (!reply.WriteInt32(GSERROR_OK) || !reply.WriteUint32(static_cast<uint32_t>(transform))) {
896 return IPC_STUB_WRITE_PARCEL_ERR;
897 }
898
899 return ERR_NONE;
900 }
901
SetTransformHintRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)902 int32_t BufferQueueProducer::SetTransformHintRemote(MessageParcel &arguments,
903 MessageParcel &reply, MessageOption &option)
904 {
905 uint32_t transformId = -1;
906 if (!arguments.ReadUint32(transformId)) {
907 return ERR_INVALID_REPLY;
908 }
909 GraphicTransformType transformHint = static_cast<GraphicTransformType>(transformId);
910 uint64_t id = -1;
911 if (!arguments.ReadUint64(id)) {
912 return ERR_INVALID_REPLY;
913 }
914 GSError sRet = SetTransformHint(transformHint, id);
915 if (!reply.WriteInt32(sRet)) {
916 return IPC_STUB_WRITE_PARCEL_ERR;
917 }
918 return ERR_NONE;
919 }
920
GetTransformHintRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)921 int32_t BufferQueueProducer::GetTransformHintRemote(
922 MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
923 {
924 GraphicTransformType transformHint = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
925 auto ret = GetTransformHint(transformHint);
926 if (ret != GSERROR_OK) {
927 if (!reply.WriteInt32(static_cast<int32_t>(ret))) {
928 return IPC_STUB_WRITE_PARCEL_ERR;
929 }
930 return ERR_INVALID_REPLY;
931 }
932
933 if (!reply.WriteInt32(GSERROR_OK) || !reply.WriteUint32(static_cast<uint32_t>(transformHint))) {
934 return IPC_STUB_WRITE_PARCEL_ERR;
935 }
936
937 return ERR_NONE;
938 }
939
SetSurfaceSourceTypeRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)940 int32_t BufferQueueProducer::SetSurfaceSourceTypeRemote(MessageParcel &arguments,
941 MessageParcel &reply, MessageOption &option)
942 {
943 OHSurfaceSource sourceType = static_cast<OHSurfaceSource>(arguments.ReadUint32());
944 GSError sRet = SetSurfaceSourceType(sourceType);
945 if (!reply.WriteInt32(sRet)) {
946 return IPC_STUB_WRITE_PARCEL_ERR;
947 }
948 return ERR_NONE;
949 }
950
GetSurfaceSourceTypeRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)951 int32_t BufferQueueProducer::GetSurfaceSourceTypeRemote(
952 MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
953 {
954 OHSurfaceSource sourceType = OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
955 auto ret = GetSurfaceSourceType(sourceType);
956 if (ret != GSERROR_OK) {
957 if (!reply.WriteInt32(static_cast<int32_t>(ret))) {
958 return IPC_STUB_WRITE_PARCEL_ERR;
959 }
960 return ERR_INVALID_REPLY;
961 }
962
963 if (!reply.WriteInt32(GSERROR_OK) || !reply.WriteUint32(static_cast<uint32_t>(sourceType))) {
964 return IPC_STUB_WRITE_PARCEL_ERR;
965 }
966
967 return ERR_NONE;
968 }
969
SetSurfaceAppFrameworkTypeRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)970 int32_t BufferQueueProducer::SetSurfaceAppFrameworkTypeRemote(
971 MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
972 {
973 std::string appFrameworkType = arguments.ReadString();
974 GSError sRet = SetSurfaceAppFrameworkType(appFrameworkType);
975 if (!reply.WriteInt32(sRet)) {
976 return IPC_STUB_WRITE_PARCEL_ERR;
977 }
978 return ERR_NONE;
979 }
980
GetSurfaceAppFrameworkTypeRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)981 int32_t BufferQueueProducer::GetSurfaceAppFrameworkTypeRemote(
982 MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
983 {
984 std::string appFrameworkType = "";
985 auto ret = GetSurfaceAppFrameworkType(appFrameworkType);
986 if (ret != GSERROR_OK) {
987 if (!reply.WriteInt32(static_cast<int32_t>(ret))) {
988 return IPC_STUB_WRITE_PARCEL_ERR;
989 }
990 return ERR_INVALID_REPLY;
991 }
992
993 if (!reply.WriteInt32(GSERROR_OK) || !reply.WriteString(appFrameworkType)) {
994 return IPC_STUB_WRITE_PARCEL_ERR;
995 }
996
997 return ERR_NONE;
998 }
999
SetHdrWhitePointBrightnessRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)1000 int32_t BufferQueueProducer::SetHdrWhitePointBrightnessRemote(
1001 MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
1002 {
1003 float brightness = arguments.ReadFloat();
1004 GSError sRet = SetHdrWhitePointBrightness(brightness);
1005 if (!reply.WriteInt32(sRet)) {
1006 return IPC_STUB_WRITE_PARCEL_ERR;
1007 }
1008 return ERR_NONE;
1009 }
1010
SetSdrWhitePointBrightnessRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)1011 int32_t BufferQueueProducer::SetSdrWhitePointBrightnessRemote(
1012 MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
1013 {
1014 float brightness = arguments.ReadFloat();
1015 GSError sRet = SetSdrWhitePointBrightness(brightness);
1016 if (!reply.WriteInt32(sRet)) {
1017 return IPC_STUB_WRITE_PARCEL_ERR;
1018 }
1019 return ERR_NONE;
1020 }
1021
AcquireLastFlushedBufferRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)1022 int32_t BufferQueueProducer::AcquireLastFlushedBufferRemote(
1023 MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
1024 {
1025 sptr<SurfaceBuffer> buffer;
1026 sptr<SyncFence> fence;
1027 float matrix[BUFFER_MATRIX_SIZE];
1028 bool isUseNewMatrix = arguments.ReadBool();
1029 GSError sRet = AcquireLastFlushedBuffer(buffer, fence, matrix, BUFFER_MATRIX_SIZE, isUseNewMatrix);
1030 if (!reply.WriteInt32(sRet)) {
1031 return IPC_STUB_WRITE_PARCEL_ERR;
1032 }
1033 if (sRet == GSERROR_OK) {
1034 uint32_t sequence = buffer->GetSeqNum();
1035 if (WriteSurfaceBufferImpl(reply, sequence, buffer) != GSERROR_OK ||
1036 buffer->WriteBufferRequestConfig(reply) != GSERROR_OK) {
1037 return IPC_STUB_WRITE_PARCEL_ERR;
1038 }
1039 std::vector<float> writeMatrixVector(matrix, matrix + sizeof(matrix) / sizeof(float));
1040 if (!fence->WriteToMessageParcel(reply) || !reply.WriteFloatVector(writeMatrixVector)) {
1041 return IPC_STUB_WRITE_PARCEL_ERR;
1042 }
1043 }
1044 return ERR_NONE;
1045 }
1046
ReleaseLastFlushedBufferRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)1047 int32_t BufferQueueProducer::ReleaseLastFlushedBufferRemote(
1048 MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
1049 {
1050 uint32_t sequence = arguments.ReadUint32();
1051 GSError sRet = ReleaseLastFlushedBuffer(sequence);
1052 if (!reply.WriteInt32(sRet)) {
1053 return IPC_STUB_WRITE_PARCEL_ERR;
1054 }
1055 return ERR_NONE;
1056 }
1057
SetGlobalAlphaRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)1058 int32_t BufferQueueProducer::SetGlobalAlphaRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
1059 {
1060 int32_t alpha = arguments.ReadInt32();
1061 GSError sRet = SetGlobalAlpha(alpha);
1062 if (!reply.WriteInt32(sRet)) {
1063 return IPC_STUB_WRITE_PARCEL_ERR;
1064 }
1065 return ERR_NONE;
1066 }
1067
SetRequestBufferNoblockModeRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)1068 int32_t BufferQueueProducer::SetRequestBufferNoblockModeRemote(MessageParcel &arguments,
1069 MessageParcel &reply, MessageOption &option)
1070 {
1071 bool noblock = arguments.ReadBool();
1072 GSError sRet = SetRequestBufferNoblockMode(noblock);
1073 if (!reply.WriteInt32(sRet)) {
1074 return IPC_STUB_WRITE_PARCEL_ERR;
1075 }
1076 return ERR_NONE;
1077 }
1078
RequestAndDetachBufferRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)1079 int32_t BufferQueueProducer::RequestAndDetachBufferRemote(MessageParcel &arguments,
1080 MessageParcel &reply, MessageOption &option)
1081 {
1082 RequestBufferReturnValue retval;
1083 sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
1084 BufferRequestConfig config = {};
1085 ReadRequestConfig(arguments, config);
1086
1087 GSError sRet = RequestAndDetachBuffer(config, bedataimpl, retval);
1088 if (!reply.WriteInt32(sRet)) {
1089 return IPC_STUB_WRITE_PARCEL_ERR;
1090 }
1091 if (sRet == GSERROR_OK &&
1092 (WriteSurfaceBufferImpl(reply, retval.sequence, retval.buffer) != GSERROR_OK ||
1093 (retval.buffer != nullptr && !reply.WriteUint64(retval.buffer->GetBufferRequestConfig().usage)) ||
1094 bedataimpl->WriteToParcel(reply) != GSERROR_OK || !retval.fence->WriteToMessageParcel(reply) ||
1095 !reply.WriteUInt32Vector(retval.deletingBuffers))) {
1096 return IPC_STUB_WRITE_PARCEL_ERR;
1097 } else if (sRet != GSERROR_OK && !reply.WriteBool(retval.isConnected)) {
1098 return IPC_STUB_WRITE_PARCEL_ERR;
1099 }
1100 return ERR_NONE;
1101 }
1102
AttachAndFlushBufferRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)1103 int32_t BufferQueueProducer::AttachAndFlushBufferRemote(MessageParcel &arguments,
1104 MessageParcel &reply, MessageOption &option)
1105 {
1106 sptr<SurfaceBuffer> buffer = nullptr;
1107 auto ret = AttachBufferToQueueReadBuffer(arguments, reply, option, buffer);
1108 if (ret != ERR_NONE) {
1109 return ret;
1110 }
1111 BufferFlushConfigWithDamages config;
1112 sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
1113 if (bedataimpl->ReadFromParcel(arguments) != GSERROR_OK) {
1114 return ERR_INVALID_REPLY;
1115 }
1116
1117 sptr<SyncFence> fence = SyncFence::ReadFromMessageParcel(arguments);
1118 if (ReadFlushConfig(arguments, config) != GSERROR_OK) {
1119 return ERR_INVALID_REPLY;
1120 }
1121 bool needMap = arguments.ReadBool();
1122 GSError sRet = AttachAndFlushBuffer(buffer, bedataimpl, fence, config, needMap);
1123 if (!reply.WriteInt32(sRet)) {
1124 return IPC_STUB_WRITE_PARCEL_ERR;
1125 }
1126 return ERR_NONE;
1127 }
1128
GetRotatingBuffersNumberRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)1129 int32_t BufferQueueProducer::GetRotatingBuffersNumberRemote(MessageParcel &arguments,
1130 MessageParcel &reply, MessageOption &option)
1131 {
1132 uint32_t cycleBuffersNumber = 0;
1133 auto ret = GetCycleBuffersNumber(cycleBuffersNumber);
1134 if (ret != GSERROR_OK) {
1135 if (!reply.WriteInt32(static_cast<int32_t>(ret))) {
1136 return IPC_STUB_WRITE_PARCEL_ERR;
1137 }
1138 return ERR_INVALID_REPLY;
1139 }
1140
1141 if (!reply.WriteInt32(GSERROR_OK) || !reply.WriteUint32(cycleBuffersNumber)) {
1142 return IPC_STUB_WRITE_PARCEL_ERR;
1143 }
1144
1145 return ERR_NONE;
1146 }
1147
SetRotatingBuffersNumberRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)1148 int32_t BufferQueueProducer::SetRotatingBuffersNumberRemote(MessageParcel &arguments,
1149 MessageParcel &reply, MessageOption &option)
1150 {
1151 uint32_t cycleBuffersNumber = arguments.ReadUint32();
1152 auto ret = SetCycleBuffersNumber(cycleBuffersNumber);
1153 if (!reply.WriteInt32(static_cast<int32_t>(ret))) {
1154 return IPC_STUB_WRITE_PARCEL_ERR;
1155 }
1156
1157 return ERR_NONE;
1158 }
1159
SetFrameGravityRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)1160 int32_t BufferQueueProducer::SetFrameGravityRemote(MessageParcel &arguments,
1161 MessageParcel &reply, MessageOption &option)
1162 {
1163 int32_t frameGravity = arguments.ReadInt32();
1164 auto ret = SetFrameGravity(frameGravity);
1165 if (!reply.WriteInt32(static_cast<int32_t>(ret))) {
1166 return IPC_STUB_WRITE_PARCEL_ERR;
1167 }
1168
1169 return ERR_NONE;
1170 }
1171
SetFixedRotationRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)1172 int32_t BufferQueueProducer::SetFixedRotationRemote(MessageParcel &arguments,
1173 MessageParcel &reply, MessageOption &option)
1174 {
1175 int32_t fixedRotation = arguments.ReadInt32();
1176 auto ret = SetFixedRotation(fixedRotation);
1177 if (!reply.WriteInt32(static_cast<int32_t>(ret))) {
1178 return IPC_STUB_WRITE_PARCEL_ERR;
1179 }
1180
1181 return ERR_NONE;
1182 }
1183
SetAlphaTypeRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)1184 int32_t BufferQueueProducer::SetAlphaTypeRemote(MessageParcel &arguments,
1185 MessageParcel &reply, MessageOption &option)
1186 {
1187 GraphicAlphaType alphaType = static_cast<GraphicAlphaType>(arguments.ReadInt32());
1188 auto ret = SetAlphaType(alphaType);
1189 if (!reply.WriteInt32(static_cast<int32_t>(ret))) {
1190 return IPC_STUB_WRITE_PARCEL_ERR;
1191 }
1192
1193 return ERR_NONE;
1194 }
1195
RequestAndDetachBuffer(const BufferRequestConfig & config,sptr<BufferExtraData> & bedata,RequestBufferReturnValue & retval)1196 GSError BufferQueueProducer::RequestAndDetachBuffer(const BufferRequestConfig& config, sptr<BufferExtraData>& bedata,
1197 RequestBufferReturnValue& retval)
1198 {
1199 if (bufferQueue_ == nullptr) {
1200 return SURFACE_ERROR_UNKOWN;
1201 }
1202
1203 retval.isConnected = false;
1204 auto ret = Connect();
1205 if (ret != SURFACE_ERROR_OK) {
1206 return ret;
1207 }
1208 retval.isConnected = true;
1209 return bufferQueue_->RequestAndDetachBuffer(config, bedata, retval);
1210 }
1211
AttachAndFlushBuffer(sptr<SurfaceBuffer> & buffer,sptr<BufferExtraData> & bedata,const sptr<SyncFence> & fence,BufferFlushConfigWithDamages & config,bool needMap)1212 GSError BufferQueueProducer::AttachAndFlushBuffer(sptr<SurfaceBuffer>& buffer, sptr<BufferExtraData>& bedata,
1213 const sptr<SyncFence>& fence, BufferFlushConfigWithDamages& config, bool needMap)
1214 {
1215 if (bufferQueue_ == nullptr) {
1216 return SURFACE_ERROR_UNKOWN;
1217 }
1218 if (isDisconnectStrictly_) {
1219 BLOGW("connected failed because buffer queue is disconnect strictly, uniqueId: %{public}" PRIu64 ".",
1220 uniqueId_);
1221 return GSERROR_CONSUMER_DISCONNECTED;
1222 }
1223 return bufferQueue_->AttachAndFlushBuffer(buffer, bedata, fence, config, needMap);
1224 }
1225
PreAllocBuffersRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)1226 int32_t BufferQueueProducer::PreAllocBuffersRemote(MessageParcel &arguments,
1227 MessageParcel &reply, MessageOption &option)
1228 {
1229 BufferRequestConfig config = {};
1230 ReadRequestConfig(arguments, config);
1231 uint32_t allocBufferCount = arguments.ReadUint32();
1232 GSError sRet = PreAllocBuffers(config, allocBufferCount);
1233 if (sRet != GSERROR_OK) {
1234 BLOGE("PreAllocBuffers failed, width: %{public}d, height: %{public}d, format: %{public}d, usage: \
1235 %{public}" PRIu64 ", allocBufferCount: %{public}u, sRet: %{public}d, uniqueId: %{public}" PRIu64 " ",
1236 config.width, config.height, config.format, config.usage, allocBufferCount, sRet, uniqueId_);
1237 return sRet;
1238 }
1239 return ERR_NONE;
1240 }
1241
AcquireLastFlushedBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],uint32_t matrixSize,bool isUseNewMatrix)1242 GSError BufferQueueProducer::AcquireLastFlushedBuffer(sptr<SurfaceBuffer> &buffer,
1243 sptr<SyncFence> &fence, float matrix[16], uint32_t matrixSize, bool isUseNewMatrix)
1244 {
1245 if (bufferQueue_ == nullptr) {
1246 return SURFACE_ERROR_UNKOWN;
1247 }
1248 return bufferQueue_->AcquireLastFlushedBuffer(buffer, fence, matrix, matrixSize, isUseNewMatrix);
1249 }
1250
ReleaseLastFlushedBuffer(uint32_t sequence)1251 GSError BufferQueueProducer::ReleaseLastFlushedBuffer(uint32_t sequence)
1252 {
1253 if (bufferQueue_ == nullptr) {
1254 return SURFACE_ERROR_UNKOWN;
1255 }
1256 return bufferQueue_->ReleaseLastFlushedBuffer(sequence);
1257 }
1258
RequestBuffer(const BufferRequestConfig & config,sptr<BufferExtraData> & bedata,RequestBufferReturnValue & retval)1259 GSError BufferQueueProducer::RequestBuffer(const BufferRequestConfig &config, sptr<BufferExtraData> &bedata,
1260 RequestBufferReturnValue &retval)
1261 {
1262 if (bufferQueue_ == nullptr) {
1263 return SURFACE_ERROR_UNKOWN;
1264 }
1265
1266 retval.isConnected = false;
1267 auto ret = Connect();
1268 if (ret != SURFACE_ERROR_OK) {
1269 return ret;
1270 }
1271 retval.isConnected = true;
1272 return bufferQueue_->RequestBuffer(config, bedata, retval);
1273 }
1274
RequestBuffers(const BufferRequestConfig & config,std::vector<sptr<BufferExtraData>> & bedata,std::vector<RequestBufferReturnValue> & retvalues)1275 GSError BufferQueueProducer::RequestBuffers(const BufferRequestConfig &config,
1276 std::vector<sptr<BufferExtraData>> &bedata, std::vector<RequestBufferReturnValue> &retvalues)
1277 {
1278 if (bufferQueue_ == nullptr) {
1279 return SURFACE_ERROR_UNKOWN;
1280 }
1281 retvalues[0].isConnected = false;
1282 auto ret = Connect();
1283 if (ret != SURFACE_ERROR_OK) {
1284 return ret;
1285 }
1286 bufferQueue_->SetBatchHandle(true);
1287 for (size_t i = 0; i < retvalues.size(); ++i) {
1288 ret = bufferQueue_->RequestBuffer(config, bedata[i], retvalues[i]);
1289 if (ret != GSERROR_OK) {
1290 retvalues.resize(i);
1291 break;
1292 }
1293 }
1294 bufferQueue_->SetBatchHandle(false);
1295 if (retvalues.size() == 0) {
1296 retvalues.resize(1);
1297 retvalues[0].isConnected = true;
1298 return ret;
1299 }
1300 return GSERROR_OK;
1301 }
1302
GetProducerInitInfo(ProducerInitInfo & info)1303 GSError BufferQueueProducer::GetProducerInitInfo(ProducerInitInfo &info)
1304 {
1305 if (bufferQueue_ == nullptr) {
1306 return SURFACE_ERROR_UNKOWN;
1307 }
1308 return bufferQueue_->GetProducerInitInfo(info);
1309 }
1310
CancelBuffer(uint32_t sequence,sptr<BufferExtraData> bedata)1311 GSError BufferQueueProducer::CancelBuffer(uint32_t sequence, sptr<BufferExtraData> bedata)
1312 {
1313 if (bufferQueue_ == nullptr) {
1314 return SURFACE_ERROR_UNKOWN;
1315 }
1316 return bufferQueue_->CancelBuffer(sequence, bedata);
1317 }
1318
FlushBuffer(uint32_t sequence,sptr<BufferExtraData> bedata,sptr<SyncFence> fence,BufferFlushConfigWithDamages & config)1319 GSError BufferQueueProducer::FlushBuffer(uint32_t sequence, sptr<BufferExtraData> bedata,
1320 sptr<SyncFence> fence, BufferFlushConfigWithDamages &config)
1321 {
1322 if (bufferQueue_ == nullptr) {
1323 return SURFACE_ERROR_UNKOWN;
1324 }
1325 if (isDisconnectStrictly_) {
1326 BLOGW("connected failed because buffer queue is disconnect strictly, uniqueId: %{public}" PRIu64 ".",
1327 uniqueId_);
1328 return GSERROR_CONSUMER_DISCONNECTED;
1329 }
1330 return bufferQueue_->FlushBuffer(sequence, bedata, fence, config);
1331 }
1332
FlushBuffers(const std::vector<uint32_t> & sequences,const std::vector<sptr<BufferExtraData>> & bedata,const std::vector<sptr<SyncFence>> & fences,const std::vector<BufferFlushConfigWithDamages> & configs)1333 GSError BufferQueueProducer::FlushBuffers(const std::vector<uint32_t> &sequences,
1334 const std::vector<sptr<BufferExtraData>> &bedata,
1335 const std::vector<sptr<SyncFence>> &fences,
1336 const std::vector<BufferFlushConfigWithDamages> &configs)
1337 {
1338 if (bufferQueue_ == nullptr) {
1339 return SURFACE_ERROR_UNKOWN;
1340 }
1341 if (isDisconnectStrictly_) {
1342 BLOGW("connected failed because buffer queue is disconnect strictly, uniqueId: %{public}" PRIu64 ".",
1343 uniqueId_);
1344 return GSERROR_CONSUMER_DISCONNECTED;
1345 }
1346 GSError ret;
1347 for (size_t i = 0; i < sequences.size(); ++i) {
1348 ret = bufferQueue_->FlushBuffer(sequences[i], bedata[i], fences[i], configs[i]);
1349 if (ret != GSERROR_OK) {
1350 BLOGE("FlushBuffer failed: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_);
1351 return ret;
1352 }
1353 }
1354 return ret;
1355 }
1356
GetLastFlushedBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],bool isUseNewMatrix)1357 GSError BufferQueueProducer::GetLastFlushedBuffer(sptr<SurfaceBuffer>& buffer,
1358 sptr<SyncFence>& fence, float matrix[16], bool isUseNewMatrix)
1359 {
1360 if (bufferQueue_ == nullptr) {
1361 return SURFACE_ERROR_UNKOWN;
1362 }
1363 return bufferQueue_->GetLastFlushedBuffer(buffer, fence, matrix, BUFFER_MATRIX_SIZE, isUseNewMatrix);
1364 }
1365
AttachBufferToQueue(sptr<SurfaceBuffer> buffer)1366 GSError BufferQueueProducer::AttachBufferToQueue(sptr<SurfaceBuffer> buffer)
1367 {
1368 if (bufferQueue_ == nullptr) {
1369 return SURFACE_ERROR_UNKOWN;
1370 }
1371 return bufferQueue_->AttachBufferToQueue(buffer, InvokerType::PRODUCER_INVOKER);
1372 }
1373
DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)1374 GSError BufferQueueProducer::DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)
1375 {
1376 if (bufferQueue_ == nullptr) {
1377 return SURFACE_ERROR_UNKOWN;
1378 }
1379 return bufferQueue_->DetachBufferFromQueue(buffer, InvokerType::PRODUCER_INVOKER, false);
1380 }
1381
AttachBuffer(sptr<SurfaceBuffer> & buffer)1382 GSError BufferQueueProducer::AttachBuffer(sptr<SurfaceBuffer>& buffer)
1383 {
1384 int32_t timeOut = 0;
1385 return AttachBuffer(buffer, timeOut);
1386 }
1387
AttachBuffer(sptr<SurfaceBuffer> & buffer,int32_t timeOut)1388 GSError BufferQueueProducer::AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut)
1389 {
1390 if (bufferQueue_ == nullptr) {
1391 return GSERROR_INVALID_ARGUMENTS;
1392 }
1393 return bufferQueue_->AttachBuffer(buffer, timeOut);
1394 }
1395
DetachBuffer(sptr<SurfaceBuffer> & buffer)1396 GSError BufferQueueProducer::DetachBuffer(sptr<SurfaceBuffer>& buffer)
1397 {
1398 if (bufferQueue_ == nullptr) {
1399 return GSERROR_INVALID_ARGUMENTS;
1400 }
1401
1402 return bufferQueue_->DetachBuffer(buffer);
1403 }
1404
GetQueueSize()1405 uint32_t BufferQueueProducer::GetQueueSize()
1406 {
1407 if (bufferQueue_ == nullptr) {
1408 return 0;
1409 }
1410 return bufferQueue_->GetQueueSize();
1411 }
1412
SetQueueSize(uint32_t queueSize)1413 GSError BufferQueueProducer::SetQueueSize(uint32_t queueSize)
1414 {
1415 if (bufferQueue_ == nullptr) {
1416 return GSERROR_INVALID_ARGUMENTS;
1417 }
1418 return bufferQueue_->SetQueueSize(queueSize);
1419 }
1420
GetName(std::string & name)1421 GSError BufferQueueProducer::GetName(std::string &name)
1422 {
1423 if (bufferQueue_ == nullptr) {
1424 return GSERROR_INVALID_ARGUMENTS;
1425 }
1426 return bufferQueue_->GetName(name);
1427 }
1428
GetDefaultWidth()1429 int32_t BufferQueueProducer::GetDefaultWidth()
1430 {
1431 if (bufferQueue_ == nullptr) {
1432 return 0;
1433 }
1434 return bufferQueue_->GetDefaultWidth();
1435 }
1436
GetDefaultHeight()1437 int32_t BufferQueueProducer::GetDefaultHeight()
1438 {
1439 if (bufferQueue_ == nullptr) {
1440 return 0;
1441 }
1442 return bufferQueue_->GetDefaultHeight();
1443 }
1444
SetDefaultUsage(uint64_t usage)1445 GSError BufferQueueProducer::SetDefaultUsage(uint64_t usage)
1446 {
1447 if (bufferQueue_ == nullptr) {
1448 return GSERROR_INVALID_ARGUMENTS;
1449 }
1450 return bufferQueue_->SetDefaultUsage(usage);
1451 }
1452
GetDefaultUsage()1453 uint64_t BufferQueueProducer::GetDefaultUsage()
1454 {
1455 if (bufferQueue_ == nullptr) {
1456 return 0;
1457 }
1458 return bufferQueue_->GetDefaultUsage();
1459 }
1460
GetUniqueId()1461 uint64_t BufferQueueProducer::GetUniqueId()
1462 {
1463 if (bufferQueue_ == nullptr) {
1464 return 0;
1465 }
1466 return bufferQueue_->GetUniqueId();
1467 }
1468
CleanCache(bool cleanAll,uint32_t * bufSeqNum)1469 GSError BufferQueueProducer::CleanCache(bool cleanAll, uint32_t* bufSeqNum)
1470 {
1471 if (bufferQueue_ == nullptr) {
1472 return GSERROR_INVALID_ARGUMENTS;
1473 }
1474
1475 {
1476 std::lock_guard<std::mutex> lock(mutex_);
1477 auto ret = CheckConnectLocked();
1478 if (ret != GSERROR_OK) {
1479 return ret;
1480 }
1481 }
1482
1483 return bufferQueue_->CleanCache(cleanAll, bufSeqNum);
1484 }
1485
GoBackground()1486 GSError BufferQueueProducer::GoBackground()
1487 {
1488 if (bufferQueue_ == nullptr) {
1489 return GSERROR_INVALID_ARGUMENTS;
1490 }
1491
1492 {
1493 std::lock_guard<std::mutex> lock(mutex_);
1494 auto ret = CheckConnectLocked();
1495 if (ret != GSERROR_OK) {
1496 return ret;
1497 }
1498 }
1499 return bufferQueue_->SetProducerCacheCleanFlag(true);
1500 }
1501
RegisterPropertyListener(sptr<IProducerListener> listener,uint64_t producerId)1502 GSError BufferQueueProducer::RegisterPropertyListener(sptr<IProducerListener> listener, uint64_t producerId)
1503 {
1504 if (bufferQueue_ == nullptr) {
1505 return GSERROR_INVALID_ARGUMENTS;
1506 }
1507 return bufferQueue_->RegisterProducerPropertyListener(listener, producerId);
1508 }
1509
UnRegisterPropertyListener(uint64_t producerId)1510 GSError BufferQueueProducer::UnRegisterPropertyListener(uint64_t producerId)
1511 {
1512 if (bufferQueue_ == nullptr) {
1513 return GSERROR_INVALID_ARGUMENTS;
1514 }
1515 return bufferQueue_->UnRegisterProducerPropertyListener(producerId);
1516 }
1517
RegisterReleaseListener(sptr<IProducerListener> listener)1518 GSError BufferQueueProducer::RegisterReleaseListener(sptr<IProducerListener> listener)
1519 {
1520 if (bufferQueue_ == nullptr) {
1521 return GSERROR_INVALID_ARGUMENTS;
1522 }
1523 return bufferQueue_->RegisterProducerReleaseListener(listener);
1524 }
1525
RegisterReleaseListenerBackup(sptr<IProducerListener> listener)1526 GSError BufferQueueProducer::RegisterReleaseListenerBackup(sptr<IProducerListener> listener)
1527 {
1528 if (bufferQueue_ == nullptr) {
1529 return GSERROR_INVALID_ARGUMENTS;
1530 }
1531 return bufferQueue_->RegisterProducerReleaseListenerBackup(listener);
1532 }
1533
UnRegisterReleaseListener()1534 GSError BufferQueueProducer::UnRegisterReleaseListener()
1535 {
1536 if (bufferQueue_ == nullptr) {
1537 return GSERROR_INVALID_ARGUMENTS;
1538 }
1539 return bufferQueue_->UnRegisterProducerReleaseListener();
1540 }
1541
UnRegisterReleaseListenerBackup()1542 GSError BufferQueueProducer::UnRegisterReleaseListenerBackup()
1543 {
1544 if (bufferQueue_ == nullptr) {
1545 return GSERROR_INVALID_ARGUMENTS;
1546 }
1547 return bufferQueue_->UnRegisterProducerReleaseListenerBackup();
1548 }
1549
HandleDeathRecipient(sptr<IRemoteObject> token)1550 bool BufferQueueProducer::HandleDeathRecipient(sptr<IRemoteObject> token)
1551 {
1552 std::lock_guard<std::mutex> lock(mutex_);
1553 if (token_ != nullptr) {
1554 token_->RemoveDeathRecipient(producerSurfaceDeathRecipient_);
1555 }
1556 token_ = token;
1557 return token_->AddDeathRecipient(producerSurfaceDeathRecipient_);
1558 }
1559
SetTransform(GraphicTransformType transform)1560 GSError BufferQueueProducer::SetTransform(GraphicTransformType transform)
1561 {
1562 std::lock_guard<std::mutex> lock(mutex_);
1563 if (bufferQueue_ == nullptr) {
1564 return GSERROR_INVALID_ARGUMENTS;
1565 }
1566 return bufferQueue_->SetTransform(transform);
1567 }
1568
GetTransform(GraphicTransformType & transform)1569 GSError BufferQueueProducer::GetTransform(GraphicTransformType &transform)
1570 {
1571 std::lock_guard<std::mutex> lock(mutex_);
1572 if (bufferQueue_ == nullptr) {
1573 transform = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
1574 return GSERROR_INVALID_ARGUMENTS;
1575 }
1576 transform = bufferQueue_->GetTransform();
1577 return GSERROR_OK;
1578 }
1579
SetTransformHint(GraphicTransformType transformHint,uint64_t fromId)1580 GSError BufferQueueProducer::SetTransformHint(GraphicTransformType transformHint, uint64_t fromId)
1581 {
1582 std::lock_guard<std::mutex> lock(mutex_);
1583 if (bufferQueue_ == nullptr) {
1584 return GSERROR_INVALID_ARGUMENTS;
1585 }
1586 return bufferQueue_->SetTransformHint(transformHint, fromId);
1587 }
1588
GetTransformHint(GraphicTransformType & transformHint)1589 GSError BufferQueueProducer::GetTransformHint(GraphicTransformType &transformHint)
1590 {
1591 std::lock_guard<std::mutex> lock(mutex_);
1592 if (bufferQueue_ == nullptr) {
1593 transformHint = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
1594 return GSERROR_INVALID_ARGUMENTS;
1595 }
1596 transformHint = bufferQueue_->GetTransformHint();
1597 return GSERROR_OK;
1598 }
1599
SetSurfaceSourceType(OHSurfaceSource sourceType)1600 GSError BufferQueueProducer::SetSurfaceSourceType(OHSurfaceSource sourceType)
1601 {
1602 std::lock_guard<std::mutex> lock(mutex_);
1603 if (bufferQueue_ == nullptr) {
1604 return GSERROR_INVALID_ARGUMENTS;
1605 }
1606 return bufferQueue_->SetSurfaceSourceType(sourceType);
1607 }
1608
GetSurfaceSourceType(OHSurfaceSource & sourceType)1609 GSError BufferQueueProducer::GetSurfaceSourceType(OHSurfaceSource &sourceType)
1610 {
1611 std::lock_guard<std::mutex> lock(mutex_);
1612 if (bufferQueue_ == nullptr) {
1613 sourceType = OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
1614 return GSERROR_INVALID_ARGUMENTS;
1615 }
1616 sourceType = bufferQueue_->GetSurfaceSourceType();
1617 return GSERROR_OK;
1618 }
1619
SetSurfaceAppFrameworkType(std::string appFrameworkType)1620 GSError BufferQueueProducer::SetSurfaceAppFrameworkType(std::string appFrameworkType)
1621 {
1622 std::lock_guard<std::mutex> lock(mutex_);
1623 if (bufferQueue_ == nullptr) {
1624 return GSERROR_INVALID_ARGUMENTS;
1625 }
1626 return bufferQueue_->SetSurfaceAppFrameworkType(appFrameworkType);
1627 }
1628
GetSurfaceAppFrameworkType(std::string & appFrameworkType)1629 GSError BufferQueueProducer::GetSurfaceAppFrameworkType(std::string &appFrameworkType)
1630 {
1631 std::lock_guard<std::mutex> lock(mutex_);
1632 if (bufferQueue_ == nullptr) {
1633 appFrameworkType = "";
1634 return GSERROR_INVALID_ARGUMENTS;
1635 }
1636 appFrameworkType = bufferQueue_->GetSurfaceAppFrameworkType();
1637 return GSERROR_OK;
1638 }
1639
SetHdrWhitePointBrightness(float brightness)1640 GSError BufferQueueProducer::SetHdrWhitePointBrightness(float brightness)
1641 {
1642 std::lock_guard<std::mutex> lock(mutex_);
1643 if (bufferQueue_ == nullptr) {
1644 return SURFACE_ERROR_UNKOWN;
1645 }
1646 return bufferQueue_->SetHdrWhitePointBrightness(brightness);
1647 }
1648
SetSdrWhitePointBrightness(float brightness)1649 GSError BufferQueueProducer::SetSdrWhitePointBrightness(float brightness)
1650 {
1651 std::lock_guard<std::mutex> lock(mutex_);
1652 if (bufferQueue_ == nullptr) {
1653 return SURFACE_ERROR_UNKOWN;
1654 }
1655 return bufferQueue_->SetSdrWhitePointBrightness(brightness);
1656 }
1657
GetNameAndUniqueId(std::string & name,uint64_t & uniqueId)1658 GSError BufferQueueProducer::GetNameAndUniqueId(std::string& name, uint64_t& uniqueId)
1659 {
1660 if (bufferQueue_ == nullptr) {
1661 return GSERROR_INVALID_ARGUMENTS;
1662 }
1663 uniqueId = GetUniqueId();
1664 return GetName(name);
1665 }
1666
Connect()1667 GSError BufferQueueProducer::Connect()
1668 {
1669 std::lock_guard<std::mutex> lock(mutex_);
1670 auto callingPid = GetCallingPid();
1671 if (connectedPid_ != 0 && connectedPid_ != callingPid) {
1672 BLOGW("connected by: %{public}d, request by: %{public}d , uniqueId: %{public}" PRIu64 ".",
1673 connectedPid_, callingPid, uniqueId_);
1674 return SURFACE_ERROR_CONSUMER_IS_CONNECTED;
1675 }
1676 if (isDisconnectStrictly_) {
1677 BLOGW("connected failed because buffer queue is disconnect strictly, uniqueId: %{public}" PRIu64 ".",
1678 uniqueId_);
1679 return GSERROR_CONSUMER_DISCONNECTED;
1680 }
1681 SetConnectedPidLocked(callingPid);
1682 return SURFACE_ERROR_OK;
1683 }
1684
Disconnect(uint32_t * bufSeqNum)1685 GSError BufferQueueProducer::Disconnect(uint32_t* bufSeqNum)
1686 {
1687 if (bufferQueue_ == nullptr) {
1688 return SURFACE_ERROR_UNKOWN;
1689 }
1690
1691 {
1692 std::lock_guard<std::mutex> lock(mutex_);
1693 auto ret = CheckConnectLocked();
1694 if (ret != GSERROR_OK) {
1695 return ret;
1696 }
1697 SetConnectedPidLocked(0);
1698 }
1699 return bufferQueue_->CleanCache(false, bufSeqNum);
1700 }
1701
ConnectStrictly()1702 GSError BufferQueueProducer::ConnectStrictly()
1703 {
1704 std::lock_guard<std::mutex> lock(mutex_);
1705 isDisconnectStrictly_ = false;
1706 return SURFACE_ERROR_OK;
1707 }
1708
DisconnectStrictly()1709 GSError BufferQueueProducer::DisconnectStrictly()
1710 {
1711 std::lock_guard<std::mutex> lock(mutex_);
1712 isDisconnectStrictly_ = true;
1713 return SURFACE_ERROR_OK;
1714 }
1715
SetScalingMode(uint32_t sequence,ScalingMode scalingMode)1716 GSError BufferQueueProducer::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
1717 {
1718 if (bufferQueue_ == nullptr) {
1719 return GSERROR_INVALID_ARGUMENTS;
1720 }
1721 return bufferQueue_->SetScalingMode(sequence, scalingMode);
1722 }
1723
SetScalingMode(ScalingMode scalingMode)1724 GSError BufferQueueProducer::SetScalingMode(ScalingMode scalingMode)
1725 {
1726 if (bufferQueue_ == nullptr) {
1727 return GSERROR_INVALID_ARGUMENTS;
1728 }
1729 return bufferQueue_->SetScalingMode(scalingMode);
1730 }
1731
SetBufferHold(bool hold)1732 GSError BufferQueueProducer::SetBufferHold(bool hold)
1733 {
1734 if (bufferQueue_ == nullptr) {
1735 return GSERROR_INVALID_ARGUMENTS;
1736 }
1737 return bufferQueue_->SetBufferHold(hold);
1738 }
1739
SetBufferReallocFlag(bool flag)1740 GSError BufferQueueProducer::SetBufferReallocFlag(bool flag)
1741 {
1742 if (bufferQueue_ == nullptr) {
1743 return GSERROR_INVALID_ARGUMENTS;
1744 }
1745 return bufferQueue_->SetBufferReallocFlag(flag);
1746 }
1747
SetBufferName(const std::string & bufferName)1748 GSError BufferQueueProducer::SetBufferName(const std::string &bufferName)
1749 {
1750 if (bufferQueue_ == nullptr) {
1751 return GSERROR_INVALID_ARGUMENTS;
1752 }
1753 return bufferQueue_->SetBufferName(bufferName);
1754 }
1755
SetMetaData(uint32_t sequence,const std::vector<GraphicHDRMetaData> & metaData)1756 GSError BufferQueueProducer::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData> &metaData)
1757 {
1758 if (bufferQueue_ == nullptr) {
1759 return GSERROR_INVALID_ARGUMENTS;
1760 }
1761
1762 return bufferQueue_->SetMetaData(sequence, metaData);
1763 }
1764
SetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)1765 GSError BufferQueueProducer::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
1766 const std::vector<uint8_t> &metaData)
1767 {
1768 if (bufferQueue_ == nullptr) {
1769 return GSERROR_INVALID_ARGUMENTS;
1770 }
1771
1772 return bufferQueue_->SetMetaDataSet(sequence, key, metaData);
1773 }
1774
SetTunnelHandle(const sptr<SurfaceTunnelHandle> & handle)1775 GSError BufferQueueProducer::SetTunnelHandle(const sptr<SurfaceTunnelHandle> &handle)
1776 {
1777 if (bufferQueue_ == nullptr) {
1778 return GSERROR_INVALID_ARGUMENTS;
1779 }
1780 return bufferQueue_->SetTunnelHandle(handle);
1781 }
1782
SetTunnelHandle(const GraphicExtDataHandle * handle)1783 GSError BufferQueueProducer::SetTunnelHandle(const GraphicExtDataHandle *handle)
1784 {
1785 sptr<SurfaceTunnelHandle> tunnelHandle = new SurfaceTunnelHandle();
1786 if (tunnelHandle->SetHandle(handle) != GSERROR_OK) {
1787 return GSERROR_INVALID_OPERATING;
1788 }
1789 return bufferQueue_->SetTunnelHandle(tunnelHandle);
1790 }
1791
GetPresentTimestamp(uint32_t sequence,GraphicPresentTimestampType type,int64_t & time)1792 GSError BufferQueueProducer::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type, int64_t &time)
1793 {
1794 if (bufferQueue_ == nullptr) {
1795 return GSERROR_INVALID_ARGUMENTS;
1796 }
1797 return bufferQueue_->GetPresentTimestamp(sequence, type, time);
1798 }
1799
GetStatus() const1800 bool BufferQueueProducer::GetStatus() const
1801 {
1802 if (bufferQueue_ == nullptr) {
1803 return false;
1804 }
1805 return bufferQueue_->GetStatus();
1806 }
1807
SetStatus(bool status)1808 void BufferQueueProducer::SetStatus(bool status)
1809 {
1810 if (bufferQueue_ == nullptr) {
1811 return;
1812 }
1813 bufferQueue_->SetStatus(status);
1814 }
1815
SetGlobalAlpha(int32_t alpha)1816 GSError BufferQueueProducer::SetGlobalAlpha(int32_t alpha)
1817 {
1818 if (bufferQueue_ == nullptr) {
1819 return SURFACE_ERROR_UNKOWN;
1820 }
1821 return bufferQueue_->SetGlobalAlpha(alpha);
1822 }
1823
SetRequestBufferNoblockMode(bool noblock)1824 GSError BufferQueueProducer::SetRequestBufferNoblockMode(bool noblock)
1825 {
1826 if (bufferQueue_ == nullptr) {
1827 return SURFACE_ERROR_UNKOWN;
1828 }
1829 return bufferQueue_->SetRequestBufferNoblockMode(noblock);
1830 }
1831
PreAllocBuffers(const BufferRequestConfig & config,uint32_t allocBufferCount)1832 GSError BufferQueueProducer::PreAllocBuffers(const BufferRequestConfig &config, uint32_t allocBufferCount)
1833 {
1834 if (bufferQueue_ == nullptr) {
1835 return SURFACE_ERROR_UNKOWN;
1836 }
1837 return bufferQueue_->PreAllocBuffers(config, allocBufferCount);
1838 }
1839
GetNativeSurface()1840 sptr<NativeSurface> BufferQueueProducer::GetNativeSurface()
1841 {
1842 return nullptr;
1843 }
1844
OnBufferProducerRemoteDied()1845 void BufferQueueProducer::OnBufferProducerRemoteDied()
1846 {
1847 if (bufferQueue_ == nullptr) {
1848 return;
1849 }
1850
1851 {
1852 std::lock_guard<std::mutex> lock(mutex_);
1853 if (connectedPid_ == 0) {
1854 BLOGD("no connections, uniqueId: %{public}" PRIu64 ".", uniqueId_);
1855 return;
1856 }
1857 SetConnectedPidLocked(0);
1858 }
1859 bufferQueue_->CleanCache(false, nullptr);
1860 }
1861
ProducerSurfaceDeathRecipient(wptr<BufferQueueProducer> producer)1862 BufferQueueProducer::ProducerSurfaceDeathRecipient::ProducerSurfaceDeathRecipient(
1863 wptr<BufferQueueProducer> producer) : producer_(producer)
1864 {
1865 }
1866
OnRemoteDied(const wptr<IRemoteObject> & remoteObject)1867 void BufferQueueProducer::ProducerSurfaceDeathRecipient::OnRemoteDied(const wptr<IRemoteObject>& remoteObject)
1868 {
1869 auto remoteToken = remoteObject.promote();
1870 if (remoteToken == nullptr) {
1871 BLOGW("can't promote remote object.");
1872 return;
1873 }
1874
1875 auto producer = producer_.promote();
1876 if (producer == nullptr) {
1877 BLOGW("producer is nullptr");
1878 return;
1879 }
1880
1881 if (producer->token_ != remoteToken) {
1882 BLOGW("token doesn't match, ignore it, uniqueId: %{public}" PRIu64 ".", producer->GetUniqueId());
1883 return;
1884 }
1885 BLOGD("remote object died, uniqueId: %{public}" PRIu64 ".", producer->GetUniqueId());
1886 producer->OnBufferProducerRemoteDied();
1887 }
1888
SetConnectedPidLocked(int32_t connectedPid)1889 void BufferQueueProducer::SetConnectedPidLocked(int32_t connectedPid)
1890 {
1891 connectedPid_ = connectedPid;
1892 if (bufferQueue_) {
1893 bufferQueue_->SetConnectedPidLocked(connectedPid_);
1894 }
1895 }
1896
CheckIsAlive()1897 bool BufferQueueProducer::CheckIsAlive()
1898 {
1899 static const bool isBeta = system::GetParameter("const.logsystem.versiontype", "") == "beta";
1900 if (magicNum_ != MAGIC_INIT) {
1901 BLOGE("report to HiViewOcean magicNum %{public}d", magicNum_);
1902 if (isBeta) {
1903 raise(42); // 42 : report to HiViewOcean
1904 }
1905 return false;
1906 }
1907 return true;
1908 }
1909
GetCycleBuffersNumber(uint32_t & cycleBuffersNumber)1910 GSError BufferQueueProducer::GetCycleBuffersNumber(uint32_t& cycleBuffersNumber)
1911 {
1912 if (bufferQueue_ == nullptr) {
1913 return SURFACE_ERROR_UNKOWN;
1914 }
1915 return bufferQueue_->GetCycleBuffersNumber(cycleBuffersNumber);
1916 }
1917
SetCycleBuffersNumber(uint32_t cycleBuffersNumber)1918 GSError BufferQueueProducer::SetCycleBuffersNumber(uint32_t cycleBuffersNumber)
1919 {
1920 if (bufferQueue_ == nullptr) {
1921 return SURFACE_ERROR_UNKOWN;
1922 }
1923 return bufferQueue_->SetCycleBuffersNumber(cycleBuffersNumber);
1924 }
1925
SetFrameGravity(int32_t frameGravity)1926 GSError BufferQueueProducer::SetFrameGravity(int32_t frameGravity)
1927 {
1928 if (bufferQueue_ == nullptr) {
1929 return SURFACE_ERROR_UNKOWN;
1930 }
1931 return bufferQueue_->SetFrameGravity(frameGravity);
1932 }
1933
SetFixedRotation(int32_t fixedRotation)1934 GSError BufferQueueProducer::SetFixedRotation(int32_t fixedRotation)
1935 {
1936 if (bufferQueue_ == nullptr) {
1937 return SURFACE_ERROR_UNKOWN;
1938 }
1939 return bufferQueue_->SetFixedRotation(fixedRotation);
1940 }
1941
SetLppShareFd(int fd,bool state)1942 GSError BufferQueueProducer::SetLppShareFd(int fd, bool state)
1943 {
1944 if (bufferQueue_ == nullptr) {
1945 return SURFACE_ERROR_UNKOWN;
1946 }
1947 return bufferQueue_->SetLppShareFd(fd, state);
1948 }
1949
SetAlphaType(GraphicAlphaType alphaType)1950 GSError BufferQueueProducer::SetAlphaType(GraphicAlphaType alphaType)
1951 {
1952 if (bufferQueue_ == nullptr) {
1953 return SURFACE_ERROR_UNKOWN;
1954 }
1955 return bufferQueue_->SetAlphaType(alphaType);
1956 }
1957 }; // namespace OHOS
1958