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