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