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