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