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