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