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