• 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 <mutex>
19 #include <set>
20 
21 #include "buffer_extra_data_impl.h"
22 #include "buffer_log.h"
23 #include "buffer_manager.h"
24 #include "buffer_producer_listener.h"
25 #include "buffer_utils.h"
26 #include "sync_fence.h"
27 
28 namespace OHOS {
BufferQueueProducer(sptr<BufferQueue> & bufferQueue)29 BufferQueueProducer::BufferQueueProducer(sptr<BufferQueue>& bufferQueue)
30 {
31     bufferQueue_ = bufferQueue;
32     if (bufferQueue_ != nullptr) {
33         bufferQueue_->GetName(name_);
34     }
35 
36     memberFuncMap_[BUFFER_PRODUCER_REQUEST_BUFFER] = &BufferQueueProducer::RequestBufferRemote;
37     memberFuncMap_[BUFFER_PRODUCER_CANCEL_BUFFER] = &BufferQueueProducer::CancelBufferRemote;
38     memberFuncMap_[BUFFER_PRODUCER_FLUSH_BUFFER] = &BufferQueueProducer::FlushBufferRemote;
39     memberFuncMap_[BUFFER_PRODUCER_ATTACH_BUFFER] = &BufferQueueProducer::AttachBufferRemote;
40     memberFuncMap_[BUFFER_PRODUCER_DETACH_BUFFER] = &BufferQueueProducer::DetachBufferRemote;
41     memberFuncMap_[BUFFER_PRODUCER_GET_QUEUE_SIZE] = &BufferQueueProducer::GetQueueSizeRemote;
42     memberFuncMap_[BUFFER_PRODUCER_SET_QUEUE_SIZE] = &BufferQueueProducer::SetQueueSizeRemote;
43     memberFuncMap_[BUFFER_PRODUCER_GET_NAME] = &BufferQueueProducer::GetNameRemote;
44     memberFuncMap_[BUFFER_PRODUCER_GET_DEFAULT_WIDTH] = &BufferQueueProducer::GetDefaultWidthRemote;
45     memberFuncMap_[BUFFER_PRODUCER_GET_DEFAULT_HEIGHT] = &BufferQueueProducer::GetDefaultHeightRemote;
46     memberFuncMap_[BUFFER_PRODUCER_GET_DEFAULT_USAGE] = &BufferQueueProducer::GetDefaultUsageRemote;
47     memberFuncMap_[BUFFER_PRODUCER_GET_UNIQUE_ID] = &BufferQueueProducer::GetUniqueIdRemote;
48     memberFuncMap_[BUFFER_PRODUCER_CLEAN_CACHE] = &BufferQueueProducer::CleanCacheRemote;
49     memberFuncMap_[BUFFER_PRODUCER_REGISTER_RELEASE_LISTENER] = &BufferQueueProducer::RegisterReleaseListenerRemote;
50     memberFuncMap_[BUFFER_PRODUCER_SET_TRANSFORM] = &BufferQueueProducer::SetTransformRemote;
51     memberFuncMap_[BUFFER_PRODUCER_IS_SUPPORTED_ALLOC] = &BufferQueueProducer::IsSupportedAllocRemote;
52     memberFuncMap_[BUFFER_PRODUCER_GET_NAMEANDUNIQUEDID] = &BufferQueueProducer::GetNameAndUniqueIdRemote;
53     memberFuncMap_[BUFFER_PRODUCER_DISCONNECT] = &BufferQueueProducer::DisconnectRemote;
54     memberFuncMap_[BUFFER_PRODUCER_SET_SCALING_MODE] = &BufferQueueProducer::SetScalingModeRemote;
55     memberFuncMap_[BUFFER_PRODUCER_SET_METADATA] = &BufferQueueProducer::SetMetaDataRemote;
56     memberFuncMap_[BUFFER_PRODUCER_SET_METADATASET] = &BufferQueueProducer::SetMetaDataSetRemote;
57     memberFuncMap_[BUFFER_PRODUCER_SET_TUNNEL_HANDLE] = &BufferQueueProducer::SetTunnelHandleRemote;
58     memberFuncMap_[BUFFER_PRODUCER_GO_BACKGROUND] = &BufferQueueProducer::GoBackgroundRemote;
59     memberFuncMap_[BUFFER_PRODUCER_GET_PRESENT_TIMESTAMP] = &BufferQueueProducer::GetPresentTimestampRemote;
60 }
61 
~BufferQueueProducer()62 BufferQueueProducer::~BufferQueueProducer()
63 {
64 }
65 
CheckConnectLocked()66 GSError BufferQueueProducer::CheckConnectLocked()
67 {
68     if (connectedPid_ == 0) {
69         BLOGNI("this BufferQueue has no connections");
70         return GSERROR_INVALID_OPERATING;
71     }
72 
73     if (connectedPid_ != GetCallingPid()) {
74         BLOGNW("this BufferQueue has been connected by :%{public}d, you can not disconnect", connectedPid_);
75         return GSERROR_INVALID_OPERATING;
76     }
77 
78     return GSERROR_OK;
79 }
80 
OnRemoteRequest(uint32_t code,MessageParcel & arguments,MessageParcel & reply,MessageOption & option)81 int32_t BufferQueueProducer::OnRemoteRequest(uint32_t code, MessageParcel &arguments,
82                                              MessageParcel &reply, MessageOption &option)
83 {
84     auto it = memberFuncMap_.find(code);
85     if (it == memberFuncMap_.end()) {
86         BLOGN_FAILURE("cannot process %{public}u", code);
87         return 0;
88     }
89 
90     if (it->second == nullptr) {
91         BLOGN_FAILURE("memberFuncMap_[%{public}u] is nullptr", code);
92         return 0;
93     }
94 
95     auto remoteDescriptor = arguments.ReadInterfaceToken();
96     if (GetDescriptor() != remoteDescriptor) {
97         return ERR_INVALID_STATE;
98     }
99 
100     auto ret = (this->*(it->second))(arguments, reply, option);
101     return ret;
102 }
103 
RequestBufferRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)104 int32_t BufferQueueProducer::RequestBufferRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
105 {
106     RequestBufferReturnValue retval;
107     sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
108     BufferRequestConfig config = {};
109 
110     ReadRequestConfig(arguments, config);
111 
112     GSError sret = RequestBuffer(config, bedataimpl, retval);
113 
114     reply.WriteInt32(sret);
115     if (sret == GSERROR_OK) {
116         WriteSurfaceBufferImpl(reply, retval.sequence, retval.buffer);
117         bedataimpl->WriteToParcel(reply);
118         retval.fence->WriteToMessageParcel(reply);
119         reply.WriteInt32Vector(retval.deletingBuffers);
120     }
121     return 0;
122 }
123 
CancelBufferRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)124 int32_t BufferQueueProducer::CancelBufferRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
125 {
126     uint32_t sequence;
127     sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
128 
129     sequence = arguments.ReadUint32();
130     bedataimpl->ReadFromParcel(arguments);
131 
132     GSError sret = CancelBuffer(sequence, bedataimpl);
133     reply.WriteInt32(sret);
134     return 0;
135 }
136 
FlushBufferRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)137 int32_t BufferQueueProducer::FlushBufferRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
138 {
139     uint32_t sequence;
140     BufferFlushConfigWithDamages config;
141     sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
142 
143     sequence = arguments.ReadUint32();
144     bedataimpl->ReadFromParcel(arguments);
145 
146     sptr<SyncFence> fence = SyncFence::ReadFromMessageParcel(arguments);
147     ReadFlushConfig(arguments, config);
148 
149     GSError sret = FlushBuffer(sequence, bedataimpl, fence, config);
150 
151     reply.WriteInt32(sret);
152     return 0;
153 }
154 
AttachBufferRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)155 int32_t BufferQueueProducer::AttachBufferRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
156 {
157     BLOGNE("BufferQueueProducer::AttachBufferRemote not support remote");
158     return 0;
159 }
160 
DetachBufferRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)161 int32_t BufferQueueProducer::DetachBufferRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
162 {
163     BLOGNE("BufferQueueProducer::DetachBufferRemote not support remote");
164     return 0;
165 }
166 
GetQueueSizeRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)167 int32_t BufferQueueProducer::GetQueueSizeRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
168 {
169     reply.WriteInt32(GetQueueSize());
170     return 0;
171 }
172 
SetQueueSizeRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)173 int32_t BufferQueueProducer::SetQueueSizeRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
174 {
175     int32_t queueSize = arguments.ReadInt32();
176     GSError sret = SetQueueSize(queueSize);
177     reply.WriteInt32(sret);
178     return 0;
179 }
180 
GetNameRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)181 int32_t BufferQueueProducer::GetNameRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
182 {
183     std::string name;
184     auto sret = bufferQueue_->GetName(name);
185     reply.WriteInt32(sret);
186     if (sret == GSERROR_OK) {
187         reply.WriteString(name);
188     }
189     return 0;
190 }
191 
GetNameAndUniqueIdRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)192 int32_t BufferQueueProducer::GetNameAndUniqueIdRemote(MessageParcel &arguments, MessageParcel &reply,
193                                                       MessageOption &option)
194 {
195     std::string name = "not init";
196     uint64_t uniqueId = 0;
197     auto ret = GetNameAndUniqueId(name, uniqueId);
198     reply.WriteInt32(ret);
199     if (ret == GSERROR_OK) {
200         reply.WriteString(name);
201         reply.WriteUint64(uniqueId);
202     }
203     return 0;
204 }
205 
GetDefaultWidthRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)206 int32_t BufferQueueProducer::GetDefaultWidthRemote(MessageParcel &arguments, MessageParcel &reply,
207                                                    MessageOption &option)
208 {
209     reply.WriteInt32(GetDefaultWidth());
210     return 0;
211 }
212 
GetDefaultHeightRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)213 int32_t BufferQueueProducer::GetDefaultHeightRemote(MessageParcel &arguments, MessageParcel &reply,
214                                                     MessageOption &option)
215 {
216     reply.WriteInt32(GetDefaultHeight());
217     return 0;
218 }
219 
GetDefaultUsageRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)220 int32_t BufferQueueProducer::GetDefaultUsageRemote(MessageParcel &arguments, MessageParcel &reply,
221                                                    MessageOption &option)
222 {
223     reply.WriteUint32(GetDefaultUsage());
224     return 0;
225 }
226 
GetUniqueIdRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)227 int32_t BufferQueueProducer::GetUniqueIdRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
228 {
229     reply.WriteUint64(GetUniqueId());
230     return 0;
231 }
232 
CleanCacheRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)233 int32_t BufferQueueProducer::CleanCacheRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
234 {
235     reply.WriteInt32(CleanCache());
236     return 0;
237 }
238 
GoBackgroundRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)239 int32_t BufferQueueProducer::GoBackgroundRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
240 {
241     reply.WriteInt32(GoBackground());
242     return 0;
243 }
244 
RegisterReleaseListenerRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)245 int32_t BufferQueueProducer::RegisterReleaseListenerRemote(MessageParcel &arguments,
246     MessageParcel &reply, MessageOption &option)
247 {
248     sptr<IRemoteObject> listenerObject = arguments.ReadRemoteObject();
249     sptr<IProducerListener> listener = iface_cast<IProducerListener>(listenerObject);
250     GSError sret = RegisterReleaseListener(listener);
251     reply.WriteInt32(sret);
252     return 0;
253 }
254 
SetTransformRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)255 int32_t BufferQueueProducer::SetTransformRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
256 {
257     GraphicTransformType transform = static_cast<GraphicTransformType>(arguments.ReadUint32());
258     GSError sret = SetTransform(transform);
259     reply.WriteInt32(sret);
260     return 0;
261 }
262 
IsSupportedAllocRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)263 int32_t BufferQueueProducer::IsSupportedAllocRemote(MessageParcel &arguments, MessageParcel &reply,
264                                                     MessageOption &option)
265 {
266     std::vector<BufferVerifyAllocInfo> infos;
267     ReadVerifyAllocInfo(arguments, infos);
268 
269     std::vector<bool> supporteds;
270     GSError sret = IsSupportedAlloc(infos, supporteds);
271     reply.WriteInt32(sret);
272     if (sret == GSERROR_OK) {
273         reply.WriteBoolVector(supporteds);
274     }
275 
276     return 0;
277 }
278 
DisconnectRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)279 int32_t BufferQueueProducer::DisconnectRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
280 {
281     GSError sret = Disconnect();
282     reply.WriteInt32(sret);
283     return 0;
284 }
285 
SetScalingModeRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)286 int32_t BufferQueueProducer::SetScalingModeRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
287 {
288     uint32_t sequence = arguments.ReadUint32();
289     ScalingMode scalingMode = static_cast<ScalingMode>(arguments.ReadInt32());
290     GSError sret = SetScalingMode(sequence, scalingMode);
291     reply.WriteInt32(sret);
292     return 0;
293 }
294 
SetMetaDataRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)295 int32_t BufferQueueProducer::SetMetaDataRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
296 {
297     uint32_t sequence = arguments.ReadUint32();
298     std::vector<GraphicHDRMetaData> metaData;
299     ReadHDRMetaData(arguments, metaData);
300     GSError sret = SetMetaData(sequence, metaData);
301     reply.WriteInt32(sret);
302     return 0;
303 }
304 
SetMetaDataSetRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)305 int32_t BufferQueueProducer::SetMetaDataSetRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option)
306 {
307     uint32_t sequence = arguments.ReadUint32();
308     GraphicHDRMetadataKey key = static_cast<GraphicHDRMetadataKey>(arguments.ReadUint32());
309     std::vector<uint8_t> metaData;
310     ReadHDRMetaDataSet(arguments, metaData);
311     GSError sret = SetMetaDataSet(sequence, key, metaData);
312     reply.WriteInt32(sret);
313     return 0;
314 }
315 
SetTunnelHandleRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)316 int32_t BufferQueueProducer::SetTunnelHandleRemote(MessageParcel &arguments, MessageParcel &reply,
317                                                    MessageOption &option)
318 {
319     sptr<SurfaceTunnelHandle> handle = nullptr;
320     if (arguments.ReadBool()) {
321         handle = new SurfaceTunnelHandle();
322         ReadExtDataHandle(arguments, handle);
323     }
324     GSError sret = SetTunnelHandle(handle);
325     reply.WriteInt32(sret);
326     return 0;
327 }
328 
GetPresentTimestampRemote(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)329 int32_t BufferQueueProducer::GetPresentTimestampRemote(MessageParcel &arguments, MessageParcel &reply,
330                                                        MessageOption &option)
331 {
332     uint32_t sequence = arguments.ReadUint32();
333     GraphicPresentTimestampType type = static_cast<GraphicPresentTimestampType>(arguments.ReadUint32());
334     int64_t time = 0;
335     GSError sret = GetPresentTimestamp(sequence, type, time);
336     reply.WriteInt32(sret);
337     if (sret == GSERROR_OK) {
338         reply.WriteInt64(time);
339     }
340     return 0;
341 }
342 
RequestBuffer(const BufferRequestConfig & config,sptr<BufferExtraData> & bedata,RequestBufferReturnValue & retval)343 GSError BufferQueueProducer::RequestBuffer(const BufferRequestConfig &config, sptr<BufferExtraData> &bedata,
344                                            RequestBufferReturnValue &retval)
345 {
346     if (bufferQueue_ == nullptr) {
347         return GSERROR_INVALID_ARGUMENTS;
348     }
349 
350     {
351         std::lock_guard<std::mutex> lock(mutex_);
352         auto callingPid = GetCallingPid();
353         if (connectedPid_ != 0 && connectedPid_ != callingPid) {
354             BLOGNW("this BufferQueue has been connected by :%{public}d", connectedPid_);
355             return GSERROR_INVALID_OPERATING;
356         }
357         connectedPid_ = callingPid;
358     }
359 
360     return bufferQueue_->RequestBuffer(config, bedata, retval);
361 }
362 
CancelBuffer(uint32_t sequence,const sptr<BufferExtraData> & bedata)363 GSError BufferQueueProducer::CancelBuffer(uint32_t sequence, const sptr<BufferExtraData> &bedata)
364 {
365     if (bufferQueue_ == nullptr) {
366         return GSERROR_INVALID_ARGUMENTS;
367     }
368     return bufferQueue_->CancelBuffer(sequence, bedata);
369 }
370 
FlushBuffer(uint32_t sequence,const sptr<BufferExtraData> & bedata,const sptr<SyncFence> & fence,BufferFlushConfigWithDamages & config)371 GSError BufferQueueProducer::FlushBuffer(uint32_t sequence, const sptr<BufferExtraData> &bedata,
372                                          const sptr<SyncFence>& fence, BufferFlushConfigWithDamages &config)
373 {
374     if (bufferQueue_ == nullptr) {
375         return GSERROR_INVALID_ARGUMENTS;
376     }
377     return bufferQueue_->FlushBuffer(sequence, bedata, fence, config);
378 }
379 
AttachBuffer(sptr<SurfaceBuffer> & buffer)380 GSError BufferQueueProducer::AttachBuffer(sptr<SurfaceBuffer>& buffer)
381 {
382     if (bufferQueue_ == nullptr) {
383         return GSERROR_INVALID_ARGUMENTS;
384     }
385     return bufferQueue_->AttachBuffer(buffer);
386 }
387 
DetachBuffer(sptr<SurfaceBuffer> & buffer)388 GSError BufferQueueProducer::DetachBuffer(sptr<SurfaceBuffer>& buffer)
389 {
390     if (bufferQueue_ == nullptr) {
391         return GSERROR_INVALID_ARGUMENTS;
392     }
393     return bufferQueue_->DetachBuffer(buffer);
394 }
395 
GetQueueSize()396 uint32_t BufferQueueProducer::GetQueueSize()
397 {
398     if (bufferQueue_ == nullptr) {
399         return 0;
400     }
401     return bufferQueue_->GetQueueSize();
402 }
403 
SetQueueSize(uint32_t queueSize)404 GSError BufferQueueProducer::SetQueueSize(uint32_t queueSize)
405 {
406     if (bufferQueue_ == nullptr) {
407         return GSERROR_INVALID_ARGUMENTS;
408     }
409     return bufferQueue_->SetQueueSize(queueSize);
410 }
411 
GetName(std::string & name)412 GSError BufferQueueProducer::GetName(std::string &name)
413 {
414     if (bufferQueue_ == nullptr) {
415         return GSERROR_INVALID_ARGUMENTS;
416     }
417     return bufferQueue_->GetName(name);
418 }
419 
GetDefaultWidth()420 int32_t BufferQueueProducer::GetDefaultWidth()
421 {
422     if (bufferQueue_ == nullptr) {
423         return 0;
424     }
425     return bufferQueue_->GetDefaultWidth();
426 }
427 
GetDefaultHeight()428 int32_t BufferQueueProducer::GetDefaultHeight()
429 {
430     if (bufferQueue_ == nullptr) {
431         return 0;
432     }
433     return bufferQueue_->GetDefaultHeight();
434 }
435 
GetDefaultUsage()436 uint32_t BufferQueueProducer::GetDefaultUsage()
437 {
438     if (bufferQueue_ == nullptr) {
439         return 0;
440     }
441     return bufferQueue_->GetDefaultUsage();
442 }
443 
GetUniqueId()444 uint64_t BufferQueueProducer::GetUniqueId()
445 {
446     if (bufferQueue_ == nullptr) {
447         return 0;
448     }
449     return bufferQueue_->GetUniqueId();
450 }
451 
CleanCache()452 GSError BufferQueueProducer::CleanCache()
453 {
454     if (bufferQueue_ == nullptr) {
455         return GSERROR_INVALID_ARGUMENTS;
456     }
457 
458     {
459         std::lock_guard<std::mutex> lock(mutex_);
460         auto ret = CheckConnectLocked();
461         if (ret != GSERROR_OK) {
462             return ret;
463         }
464     }
465 
466     return bufferQueue_->CleanCache();
467 }
468 
GoBackground()469 GSError BufferQueueProducer::GoBackground()
470 {
471     if (bufferQueue_ == nullptr) {
472         return GSERROR_INVALID_ARGUMENTS;
473     }
474 
475     {
476         std::lock_guard<std::mutex> lock(mutex_);
477         auto ret = CheckConnectLocked();
478         if (ret != GSERROR_OK) {
479             return ret;
480         }
481     }
482     return bufferQueue_->SetProducerCacheCleanFlag(true);
483 }
484 
RegisterReleaseListener(sptr<IProducerListener> listener)485 GSError BufferQueueProducer::RegisterReleaseListener(sptr<IProducerListener> listener)
486 {
487     if (bufferQueue_ == nullptr) {
488         return GSERROR_INVALID_ARGUMENTS;
489     }
490     return bufferQueue_->RegisterProducerReleaseListener(listener);
491 }
492 
SetTransform(GraphicTransformType transform)493 GSError BufferQueueProducer::SetTransform(GraphicTransformType transform)
494 {
495     if (bufferQueue_ == nullptr) {
496         return GSERROR_INVALID_ARGUMENTS;
497     }
498     return bufferQueue_->SetTransform(transform);
499 }
500 
IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> & infos,std::vector<bool> & supporteds)501 GSError BufferQueueProducer::IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> &infos,
502                                               std::vector<bool> &supporteds)
503 {
504     if (bufferQueue_ == nullptr) {
505         return GSERROR_INVALID_ARGUMENTS;
506     }
507 
508     return bufferQueue_->IsSupportedAlloc(infos, supporteds);
509 }
510 
GetNameAndUniqueId(std::string & name,uint64_t & uniqueId)511 GSError BufferQueueProducer::GetNameAndUniqueId(std::string& name, uint64_t& uniqueId)
512 {
513     if (bufferQueue_ == nullptr) {
514         return GSERROR_INVALID_ARGUMENTS;
515     }
516     uniqueId = GetUniqueId();
517     return GetName(name);
518 }
519 
Disconnect()520 GSError BufferQueueProducer::Disconnect()
521 {
522     if (bufferQueue_ == nullptr) {
523         return GSERROR_INVALID_ARGUMENTS;
524     }
525 
526     {
527         std::lock_guard<std::mutex> lock(mutex_);
528         auto ret = CheckConnectLocked();
529         if (ret != GSERROR_OK) {
530             return ret;
531         }
532         connectedPid_ = 0;
533     }
534     return bufferQueue_->GoBackground();
535 }
536 
SetScalingMode(uint32_t sequence,ScalingMode scalingMode)537 GSError BufferQueueProducer::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
538 {
539     if (bufferQueue_ == nullptr) {
540         return GSERROR_INVALID_ARGUMENTS;
541     }
542     return bufferQueue_->SetScalingMode(sequence, scalingMode);
543 }
544 
SetMetaData(uint32_t sequence,const std::vector<GraphicHDRMetaData> & metaData)545 GSError BufferQueueProducer::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData> &metaData)
546 {
547     if (bufferQueue_ == nullptr) {
548         return GSERROR_INVALID_ARGUMENTS;
549     }
550 
551     return bufferQueue_->SetMetaData(sequence, metaData);
552 }
553 
SetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)554 GSError BufferQueueProducer::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
555                                             const std::vector<uint8_t> &metaData)
556 {
557     if (bufferQueue_ == nullptr) {
558         return GSERROR_INVALID_ARGUMENTS;
559     }
560 
561     return bufferQueue_->SetMetaDataSet(sequence, key, metaData);
562 }
563 
SetTunnelHandle(const sptr<SurfaceTunnelHandle> & handle)564 GSError BufferQueueProducer::SetTunnelHandle(const sptr<SurfaceTunnelHandle> &handle)
565 {
566     if (bufferQueue_ == nullptr) {
567         return GSERROR_INVALID_ARGUMENTS;
568     }
569     return bufferQueue_->SetTunnelHandle(handle);
570 }
571 
SetTunnelHandle(const GraphicExtDataHandle * handle)572 GSError BufferQueueProducer::SetTunnelHandle(const GraphicExtDataHandle *handle)
573 {
574     sptr<SurfaceTunnelHandle> tunnelHandle = new SurfaceTunnelHandle();
575     if (tunnelHandle->SetHandle(handle) != GSERROR_OK) {
576         return GSERROR_INVALID_OPERATING;
577     }
578     return bufferQueue_->SetTunnelHandle(tunnelHandle);
579 }
580 
GetPresentTimestamp(uint32_t sequence,GraphicPresentTimestampType type,int64_t & time)581 GSError BufferQueueProducer::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type, int64_t &time)
582 {
583     if (bufferQueue_ == nullptr) {
584         return GSERROR_INVALID_ARGUMENTS;
585     }
586     return bufferQueue_->GetPresentTimestamp(sequence, type, time);
587 }
588 
GetStatus() const589 bool BufferQueueProducer::GetStatus() const
590 {
591     return bufferQueue_->GetStatus();
592 }
593 
SetStatus(bool status)594 void BufferQueueProducer::SetStatus(bool status)
595 {
596     bufferQueue_->SetStatus(status);
597 }
598 
GetNativeSurface()599 sptr<NativeSurface> BufferQueueProducer::GetNativeSurface()
600 {
601     BLOGND("BufferQueueProducer::GetNativeSurface not support.");
602     return nullptr;
603 }
604 }; // namespace OHOS
605