• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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