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