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 "consumer_surface.h"
17
18 #include <cinttypes>
19
20 #include "buffer_log.h"
21 #include "buffer_queue_producer.h"
22 #include "sync_fence.h"
23
24 namespace OHOS {
CreateSurfaceAsConsumer(std::string name,bool isShared)25 sptr<Surface> Surface::CreateSurfaceAsConsumer(std::string name, bool isShared)
26 {
27 sptr<ConsumerSurface> surf = new ConsumerSurface(name, isShared);
28 if (surf->Init() != GSERROR_OK) {
29 BLOGE("consumer surf init failed");
30 return nullptr;
31 }
32 return surf;
33 }
34
Create(std::string name,bool isShared)35 sptr<IConsumerSurface> IConsumerSurface::Create(std::string name, bool isShared)
36 {
37 sptr<ConsumerSurface> surf = new ConsumerSurface(name, isShared);
38 if (surf->Init() != GSERROR_OK) {
39 BLOGE("consumer surf init failed");
40 return nullptr;
41 }
42 return surf;
43 }
44
ConsumerSurface(const std::string & name,bool isShared)45 ConsumerSurface::ConsumerSurface(const std::string& name, bool isShared)
46 : name_(name), isShared_(isShared)
47 {
48 consumer_ = nullptr;
49 producer_ = nullptr;
50 }
51
~ConsumerSurface()52 ConsumerSurface::~ConsumerSurface()
53 {
54 if (consumer_ != nullptr) {
55 consumer_->OnConsumerDied();
56 consumer_->SetStatus(false);
57 }
58 if (producer_ != nullptr) {
59 BLOGI("~ConsumerSurface, producer_ sptrCnt: %{public}d, uniqueId: %{public}" PRIu64 ".",
60 producer_->GetSptrRefCount(), uniqueId_);
61 }
62 consumer_ = nullptr;
63 producer_ = nullptr;
64 }
65
Init()66 GSError ConsumerSurface::Init()
67 {
68 sptr<BufferQueue> queue_ = new BufferQueue(name_, isShared_);
69 producer_ = new BufferQueueProducer(queue_);
70 consumer_ = new BufferQueueConsumer(queue_);
71 uniqueId_ = GetUniqueId();
72 BLOGD("ConsumerSurface Init, uniqueId: %{public}" PRIu64 ".", uniqueId_);
73 return GSERROR_OK;
74 }
75
IsConsumer() const76 bool ConsumerSurface::IsConsumer() const
77 {
78 return true;
79 }
80
GetProducer() const81 sptr<IBufferProducer> ConsumerSurface::GetProducer() const
82 {
83 return producer_;
84 }
85
GetProducerInitInfo(ProducerInitInfo & info)86 GSError ConsumerSurface::GetProducerInitInfo(ProducerInitInfo& info)
87 {
88 return GSERROR_NOT_SUPPORT;
89 }
90
RequestBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,BufferRequestConfig & config)91 GSError ConsumerSurface::RequestBuffer(sptr<SurfaceBuffer>& buffer,
92 sptr<SyncFence>& fence, BufferRequestConfig &config)
93 {
94 return GSERROR_NOT_SUPPORT;
95 }
96
RequestBuffers(std::vector<sptr<SurfaceBuffer>> & buffers,std::vector<sptr<SyncFence>> & fences,BufferRequestConfig & config)97 GSError ConsumerSurface::RequestBuffers(std::vector<sptr<SurfaceBuffer>> &buffers,
98 std::vector<sptr<SyncFence>> &fences, BufferRequestConfig &config)
99 {
100 return GSERROR_NOT_SUPPORT;
101 }
102
FlushBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence,BufferFlushConfig & config)103 GSError ConsumerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer,
104 const sptr<SyncFence>& fence, BufferFlushConfig &config)
105 {
106 return GSERROR_NOT_SUPPORT;
107 }
108
FlushBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence,BufferFlushConfigWithDamages & config)109 GSError ConsumerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence,
110 BufferFlushConfigWithDamages &config)
111 {
112 return GSERROR_NOT_SUPPORT;
113 }
114
FlushBuffers(const std::vector<sptr<SurfaceBuffer>> & buffers,const std::vector<sptr<SyncFence>> & fences,const std::vector<BufferFlushConfigWithDamages> & config)115 GSError ConsumerSurface::FlushBuffers(const std::vector<sptr<SurfaceBuffer>> &buffers,
116 const std::vector<sptr<SyncFence>> &fences, const std::vector<BufferFlushConfigWithDamages> &config)
117 {
118 return GSERROR_NOT_SUPPORT;
119 }
120
GetLastFlushedBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],bool isUseNewMatrix)121 GSError ConsumerSurface::GetLastFlushedBuffer(sptr<SurfaceBuffer>& buffer,
122 sptr<SyncFence>& fence, float matrix[16], bool isUseNewMatrix)
123 {
124 return GSERROR_NOT_SUPPORT;
125 }
126
AcquireBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,int64_t & timestamp,Rect & damage)127 GSError ConsumerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
128 int64_t& timestamp, Rect& damage)
129 {
130 std::vector<Rect> damages;
131 GSError ret = AcquireBuffer(buffer, fence, timestamp, damages);
132 if (ret != GSERROR_OK) {
133 return ret;
134 }
135 if (damages.size() == 1) {
136 damage = damages[0];
137 return GSERROR_OK;
138 }
139 BLOGE("damages is %{public}zu, uniqueId: %{public}" PRIu64 ".", damages.size(), uniqueId_);
140 return GSERROR_INVALID_ARGUMENTS;
141 }
142
AcquireBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,int64_t & timestamp,std::vector<Rect> & damages)143 GSError ConsumerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
144 int64_t& timestamp, std::vector<Rect>& damages)
145 {
146 if (consumer_ == nullptr) {
147 return GSERROR_INVALID_ARGUMENTS;
148 }
149 return consumer_->AcquireBuffer(buffer, fence, timestamp, damages);
150 }
151
AcquireBuffer(AcquireBufferReturnValue & returnValue,int64_t expectPresentTimestamp,bool isUsingAutoTimestamp)152 GSError ConsumerSurface::AcquireBuffer(AcquireBufferReturnValue &returnValue, int64_t expectPresentTimestamp,
153 bool isUsingAutoTimestamp)
154 {
155 if (consumer_ == nullptr) {
156 return GSERROR_INVALID_ARGUMENTS;
157 }
158 return consumer_->AcquireBuffer(returnValue, expectPresentTimestamp, isUsingAutoTimestamp);
159 }
160
ReleaseBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence)161 GSError ConsumerSurface::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence)
162 {
163 if (buffer == nullptr || consumer_ == nullptr) {
164 return GSERROR_INVALID_ARGUMENTS;
165 }
166 return consumer_->ReleaseBuffer(buffer, fence);
167 }
RequestBuffer(sptr<SurfaceBuffer> & buffer,int32_t & fence,BufferRequestConfig & config)168 GSError ConsumerSurface::RequestBuffer(sptr<SurfaceBuffer>& buffer,
169 int32_t &fence, BufferRequestConfig &config)
170 {
171 return GSERROR_NOT_SUPPORT;
172 }
173
CancelBuffer(sptr<SurfaceBuffer> & buffer)174 GSError ConsumerSurface::CancelBuffer(sptr<SurfaceBuffer>& buffer)
175 {
176 return GSERROR_NOT_SUPPORT;
177 }
178
FlushBuffer(sptr<SurfaceBuffer> & buffer,int32_t fence,BufferFlushConfig & config)179 GSError ConsumerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer,
180 int32_t fence, BufferFlushConfig &config)
181 {
182 return GSERROR_NOT_SUPPORT;
183 }
184
AcquireBuffer(sptr<SurfaceBuffer> & buffer,int32_t & fence,int64_t & timestamp,Rect & damage)185 GSError ConsumerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, int32_t& fence,
186 int64_t& timestamp, Rect& damage)
187 {
188 sptr<SyncFence> syncFence = SyncFence::InvalidFence();
189 auto ret = AcquireBuffer(buffer, syncFence, timestamp, damage);
190 if (ret != GSERROR_OK) {
191 fence = -1;
192 return ret;
193 }
194 fence = syncFence->Dup();
195 return GSERROR_OK;
196 }
197
ReleaseBuffer(sptr<SurfaceBuffer> & buffer,int32_t fence)198 GSError ConsumerSurface::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, int32_t fence)
199 {
200 sptr<SyncFence> syncFence = new SyncFence(fence);
201 return ReleaseBuffer(buffer, syncFence);
202 }
203
AttachBufferToQueue(sptr<SurfaceBuffer> buffer)204 GSError ConsumerSurface::AttachBufferToQueue(sptr<SurfaceBuffer> buffer)
205 {
206 if (buffer == nullptr || consumer_ == nullptr) {
207 return GSERROR_INVALID_ARGUMENTS;
208 }
209 buffer->SetConsumerAttachBufferFlag(true);
210 return consumer_->AttachBufferToQueue(buffer);
211 }
212
DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)213 GSError ConsumerSurface::DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)
214 {
215 if (buffer == nullptr || consumer_ == nullptr) {
216 return GSERROR_INVALID_ARGUMENTS;
217 }
218 buffer->SetConsumerAttachBufferFlag(false);
219 return consumer_->DetachBufferFromQueue(buffer);
220 }
221
AttachBuffer(sptr<SurfaceBuffer> & buffer)222 GSError ConsumerSurface::AttachBuffer(sptr<SurfaceBuffer>& buffer)
223 {
224 if (buffer == nullptr || consumer_ == nullptr) {
225 return GSERROR_INVALID_ARGUMENTS;
226 }
227 return consumer_->AttachBuffer(buffer);
228 }
229
AttachBuffer(sptr<SurfaceBuffer> & buffer,int32_t timeOut)230 GSError ConsumerSurface::AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut)
231 {
232 if (buffer == nullptr || consumer_ == nullptr) {
233 return GSERROR_INVALID_ARGUMENTS;
234 }
235 return consumer_->AttachBuffer(buffer, timeOut);
236 }
237
DetachBuffer(sptr<SurfaceBuffer> & buffer)238 GSError ConsumerSurface::DetachBuffer(sptr<SurfaceBuffer>& buffer)
239 {
240 if (buffer == nullptr || consumer_ == nullptr) {
241 return GSERROR_INVALID_ARGUMENTS;
242 }
243 return consumer_->DetachBuffer(buffer);
244 }
245
RegisterSurfaceDelegator(sptr<IRemoteObject> client)246 GSError ConsumerSurface::RegisterSurfaceDelegator(sptr<IRemoteObject> client)
247 {
248 if (client == nullptr || consumer_ == nullptr) {
249 return GSERROR_INVALID_ARGUMENTS;
250 }
251 return consumer_->RegisterSurfaceDelegator(client, this);
252 }
253
QueryIfBufferAvailable()254 bool ConsumerSurface::QueryIfBufferAvailable()
255 {
256 if (consumer_ == nullptr) {
257 return false;
258 }
259 return consumer_->QueryIfBufferAvailable();
260 }
261
GetQueueSize()262 uint32_t ConsumerSurface::GetQueueSize()
263 {
264 if (producer_ == nullptr) {
265 return 0;
266 }
267 return producer_->GetQueueSize();
268 }
269
SetQueueSize(uint32_t queueSize)270 GSError ConsumerSurface::SetQueueSize(uint32_t queueSize)
271 {
272 if (producer_ == nullptr) {
273 return GSERROR_INVALID_ARGUMENTS;
274 }
275 return producer_->SetQueueSize(queueSize);
276 }
277
GetName()278 const std::string& ConsumerSurface::GetName()
279 {
280 return name_;
281 }
282
SetDefaultWidthAndHeight(int32_t width,int32_t height)283 GSError ConsumerSurface::SetDefaultWidthAndHeight(int32_t width, int32_t height)
284 {
285 if (consumer_ == nullptr) {
286 return GSERROR_INVALID_ARGUMENTS;
287 }
288 return consumer_->SetDefaultWidthAndHeight(width, height);
289 }
290
GetDefaultWidth()291 int32_t ConsumerSurface::GetDefaultWidth()
292 {
293 if (producer_ == nullptr) {
294 return -1;
295 }
296 return producer_->GetDefaultWidth();
297 }
298
GetDefaultHeight()299 int32_t ConsumerSurface::GetDefaultHeight()
300 {
301 if (producer_ == nullptr) {
302 return -1;
303 }
304 return producer_->GetDefaultHeight();
305 }
306
SetDefaultUsage(uint64_t usage)307 GSError ConsumerSurface::SetDefaultUsage(uint64_t usage)
308 {
309 if (consumer_ == nullptr) {
310 return GSERROR_INVALID_ARGUMENTS;
311 }
312 return consumer_->SetDefaultUsage(usage);
313 }
314
GetDefaultUsage()315 uint64_t ConsumerSurface::GetDefaultUsage()
316 {
317 if (producer_ == nullptr) {
318 return 0;
319 }
320 return producer_->GetDefaultUsage();
321 }
322
SetUserData(const std::string & key,const std::string & val)323 GSError ConsumerSurface::SetUserData(const std::string& key, const std::string& val)
324 {
325 std::lock_guard<std::mutex> lockGuard(lockMutex_);
326 if (userData_.size() >= SURFACE_MAX_USER_DATA_COUNT) {
327 BLOGE("userData_ size(%{public}zu) out, uniqueId: %{public}" PRIu64 ".", userData_.size(), uniqueId_);
328 return GSERROR_OUT_OF_RANGE;
329 }
330
331 auto iterUserData = userData_.find(key);
332 if (iterUserData != userData_.end() && iterUserData->second == val) {
333 BLOGE("not find key:%{public}s, val:%{public}s exist, uniqueId: %{public}" PRIu64 ".",
334 key.c_str(), val.c_str(), uniqueId_);
335 return GSERROR_API_FAILED;
336 }
337
338 userData_[key] = val;
339 auto iter = onUserDataChange_.begin();
340 while (iter != onUserDataChange_.end()) {
341 if (iter->second != nullptr) {
342 iter->second(key, val);
343 }
344 iter++;
345 }
346
347 return GSERROR_OK;
348 }
349
GetUserData(const std::string & key)350 std::string ConsumerSurface::GetUserData(const std::string& key)
351 {
352 std::lock_guard<std::mutex> lockGuard(lockMutex_);
353 if (userData_.find(key) != userData_.end()) {
354 return userData_[key];
355 }
356
357 return "";
358 }
359
RegisterConsumerListener(sptr<IBufferConsumerListener> & listener)360 GSError ConsumerSurface::RegisterConsumerListener(sptr<IBufferConsumerListener>& listener)
361 {
362 if (listener == nullptr || consumer_ == nullptr) {
363 return GSERROR_INVALID_ARGUMENTS;
364 }
365 return consumer_->RegisterConsumerListener(listener);
366 }
367
RegisterConsumerListener(IBufferConsumerListenerClazz * listener)368 GSError ConsumerSurface::RegisterConsumerListener(IBufferConsumerListenerClazz *listener)
369 {
370 if (listener == nullptr || consumer_ == nullptr) {
371 return GSERROR_INVALID_ARGUMENTS;
372 }
373 return consumer_->RegisterConsumerListener(listener);
374 }
375
RegisterReleaseListener(OnReleaseFunc func)376 GSError ConsumerSurface::RegisterReleaseListener(OnReleaseFunc func)
377 {
378 if (func == nullptr || consumer_ == nullptr) {
379 return GSERROR_INVALID_ARGUMENTS;
380 }
381 return consumer_->RegisterReleaseListener(func);
382 }
383
RegisterReleaseListener(OnReleaseFuncWithFence func)384 GSError ConsumerSurface::RegisterReleaseListener(OnReleaseFuncWithFence func)
385 {
386 return GSERROR_NOT_SUPPORT;
387 }
388
UnRegisterReleaseListener()389 GSError ConsumerSurface::UnRegisterReleaseListener()
390 {
391 return GSERROR_OK;
392 }
393
RegisterDeleteBufferListener(OnDeleteBufferFunc func,bool isForUniRedraw)394 GSError ConsumerSurface::RegisterDeleteBufferListener(OnDeleteBufferFunc func, bool isForUniRedraw)
395 {
396 if (func == nullptr || consumer_ == nullptr) {
397 return GSERROR_INVALID_ARGUMENTS;
398 }
399 return consumer_->RegisterDeleteBufferListener(func, isForUniRedraw);
400 }
401
UnregisterConsumerListener()402 GSError ConsumerSurface::UnregisterConsumerListener()
403 {
404 if (consumer_ == nullptr) {
405 return GSERROR_INVALID_ARGUMENTS;
406 }
407 return consumer_->UnregisterConsumerListener();
408 }
409
RegisterUserDataChangeListener(const std::string & funcName,OnUserDataChangeFunc func)410 GSError ConsumerSurface::RegisterUserDataChangeListener(const std::string& funcName, OnUserDataChangeFunc func)
411 {
412 if (func == nullptr) {
413 return GSERROR_INVALID_ARGUMENTS;
414 }
415 std::lock_guard<std::mutex> lockGuard(lockMutex_);
416 if (onUserDataChange_.find(funcName) != onUserDataChange_.end()) {
417 BLOGD("already register func: %{public}s, uniqueId: %{public}" PRIu64 ".",
418 funcName.c_str(), uniqueId_);
419 return GSERROR_INVALID_ARGUMENTS;
420 }
421
422 onUserDataChange_[funcName] = func;
423 return GSERROR_OK;
424 }
425
UnRegisterUserDataChangeListener(const std::string & funcName)426 GSError ConsumerSurface::UnRegisterUserDataChangeListener(const std::string& funcName)
427 {
428 std::lock_guard<std::mutex> lockGuard(lockMutex_);
429 if (onUserDataChange_.erase(funcName) == 0) {
430 BLOGD("no register funcName: %{public}s, uniqueId: %{public}" PRIu64 ".",
431 funcName.c_str(), uniqueId_);
432 return GSERROR_INVALID_ARGUMENTS;
433 }
434
435 return GSERROR_OK;
436 }
437
ClearUserDataChangeListener()438 GSError ConsumerSurface::ClearUserDataChangeListener()
439 {
440 std::lock_guard<std::mutex> lockGuard(lockMutex_);
441 onUserDataChange_.clear();
442 return GSERROR_OK;
443 }
444
CleanCache(bool cleanAll)445 GSError ConsumerSurface::CleanCache(bool cleanAll)
446 {
447 (void)cleanAll;
448 return GSERROR_NOT_SUPPORT;
449 }
450
GoBackground()451 GSError ConsumerSurface::GoBackground()
452 {
453 if (consumer_ == nullptr) {
454 return GSERROR_INVALID_ARGUMENTS;
455 }
456 if (producer_ != nullptr) {
457 BLOGD("GoBackground, uniqueId: %{public}" PRIu64 ".", uniqueId_);
458 }
459 return consumer_->GoBackground();
460 }
461
GetUniqueId() const462 uint64_t ConsumerSurface::GetUniqueId() const
463 {
464 if (producer_ == nullptr) {
465 return 0;
466 }
467 return producer_->GetUniqueId();
468 }
469
Dump(std::string & result) const470 void ConsumerSurface::Dump(std::string& result) const
471 {
472 if (consumer_ == nullptr) {
473 return;
474 }
475 return consumer_->Dump(result);
476 }
477
SetTransform(GraphicTransformType transform)478 GSError ConsumerSurface::SetTransform(GraphicTransformType transform)
479 {
480 if (producer_ == nullptr) {
481 return GSERROR_INVALID_ARGUMENTS;
482 }
483 return producer_->SetTransform(transform);
484 }
485
GetTransform() const486 GraphicTransformType ConsumerSurface::GetTransform() const
487 {
488 if (consumer_ == nullptr) {
489 return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
490 }
491 return consumer_->GetTransform();
492 }
493
IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> & infos,std::vector<bool> & supporteds)494 GSError ConsumerSurface::IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> &infos,
495 std::vector<bool> &supporteds)
496 {
497 return GSERROR_NOT_SUPPORT;
498 }
499
Connect()500 GSError ConsumerSurface::Connect()
501 {
502 return GSERROR_NOT_SUPPORT;
503 }
504
Disconnect()505 GSError ConsumerSurface::Disconnect()
506 {
507 return GSERROR_NOT_SUPPORT;
508 }
509
SetScalingMode(uint32_t sequence,ScalingMode scalingMode)510 GSError ConsumerSurface::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
511 {
512 if (producer_ == nullptr || scalingMode < ScalingMode::SCALING_MODE_FREEZE ||
513 scalingMode > ScalingMode::SCALING_MODE_SCALE_FIT) {
514 return GSERROR_INVALID_ARGUMENTS;
515 }
516 return producer_->SetScalingMode(sequence, scalingMode);
517 }
518
SetScalingMode(ScalingMode scalingMode)519 GSError ConsumerSurface::SetScalingMode(ScalingMode scalingMode)
520 {
521 if (producer_ == nullptr || scalingMode < ScalingMode::SCALING_MODE_FREEZE ||
522 scalingMode > ScalingMode::SCALING_MODE_SCALE_FIT) {
523 return GSERROR_INVALID_ARGUMENTS;
524 }
525 return producer_->SetScalingMode(scalingMode);
526 }
527
GetScalingMode(uint32_t sequence,ScalingMode & scalingMode)528 GSError ConsumerSurface::GetScalingMode(uint32_t sequence, ScalingMode& scalingMode)
529 {
530 if (consumer_ == nullptr) {
531 return GSERROR_INVALID_ARGUMENTS;
532 }
533 return consumer_->GetScalingMode(sequence, scalingMode);
534 }
535
SetMetaData(uint32_t sequence,const std::vector<GraphicHDRMetaData> & metaData)536 GSError ConsumerSurface::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData>& metaData)
537 {
538 if (producer_ == nullptr || metaData.size() == 0) {
539 return GSERROR_INVALID_ARGUMENTS;
540 }
541 return producer_->SetMetaData(sequence, metaData);
542 }
543
SetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)544 GSError ConsumerSurface::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
545 const std::vector<uint8_t>& metaData)
546 {
547 if (producer_ == nullptr || key < GraphicHDRMetadataKey::GRAPHIC_MATAKEY_RED_PRIMARY_X ||
548 key > GraphicHDRMetadataKey::GRAPHIC_MATAKEY_HDR_VIVID || metaData.size() == 0) {
549 return GSERROR_INVALID_ARGUMENTS;
550 }
551 return producer_->SetMetaDataSet(sequence, key, metaData);
552 }
553
QueryMetaDataType(uint32_t sequence,HDRMetaDataType & type) const554 GSError ConsumerSurface::QueryMetaDataType(uint32_t sequence, HDRMetaDataType& type) const
555 {
556 if (consumer_ == nullptr) {
557 return GSERROR_INVALID_ARGUMENTS;
558 }
559 return consumer_->QueryMetaDataType(sequence, type);
560 }
561
GetMetaData(uint32_t sequence,std::vector<GraphicHDRMetaData> & metaData) const562 GSError ConsumerSurface::GetMetaData(uint32_t sequence, std::vector<GraphicHDRMetaData>& metaData) const
563 {
564 if (consumer_ == nullptr) {
565 return GSERROR_INVALID_ARGUMENTS;
566 }
567 return consumer_->GetMetaData(sequence, metaData);
568 }
569
GetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey & key,std::vector<uint8_t> & metaData) const570 GSError ConsumerSurface::GetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey& key,
571 std::vector<uint8_t>& metaData) const
572 {
573 if (consumer_ == nullptr) {
574 return GSERROR_INVALID_ARGUMENTS;
575 }
576 return consumer_->GetMetaDataSet(sequence, key, metaData);
577 }
578
SetTunnelHandle(const GraphicExtDataHandle * handle)579 GSError ConsumerSurface::SetTunnelHandle(const GraphicExtDataHandle *handle)
580 {
581 if (producer_ == nullptr || handle == nullptr || handle->reserveInts == 0) {
582 return GSERROR_INVALID_ARGUMENTS;
583 }
584 return producer_->SetTunnelHandle(handle);
585 }
586
GetTunnelHandle() const587 sptr<SurfaceTunnelHandle> ConsumerSurface::GetTunnelHandle() const
588 {
589 if (consumer_ == nullptr) {
590 return nullptr;
591 }
592 return consumer_->GetTunnelHandle();
593 }
594
SetBufferHold(bool hold)595 void ConsumerSurface::SetBufferHold(bool hold)
596 {
597 if (consumer_ == nullptr) {
598 return;
599 }
600 consumer_->SetBufferHold(hold);
601 }
602
SetPresentTimestamp(uint32_t sequence,const GraphicPresentTimestamp & timestamp)603 GSError ConsumerSurface::SetPresentTimestamp(uint32_t sequence, const GraphicPresentTimestamp& timestamp)
604 {
605 if (consumer_ == nullptr || timestamp.type == GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_UNSUPPORTED) {
606 return GSERROR_INVALID_ARGUMENTS;
607 }
608 return consumer_->SetPresentTimestamp(sequence, timestamp);
609 }
610
GetPresentTimestamp(uint32_t sequence,GraphicPresentTimestampType type,int64_t & time) const611 GSError ConsumerSurface::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type,
612 int64_t &time) const
613 {
614 return GSERROR_NOT_SUPPORT;
615 }
616
GetDefaultFormat()617 int32_t ConsumerSurface::GetDefaultFormat()
618 {
619 return 0;
620 }
621
SetDefaultFormat(int32_t format)622 GSError ConsumerSurface::SetDefaultFormat(int32_t format)
623 {
624 return GSERROR_NOT_SUPPORT;
625 }
626
GetDefaultColorGamut()627 int32_t ConsumerSurface::GetDefaultColorGamut()
628 {
629 return 0;
630 }
631
SetDefaultColorGamut(int32_t colorGamut)632 GSError ConsumerSurface::SetDefaultColorGamut(int32_t colorGamut)
633 {
634 return GSERROR_NOT_SUPPORT;
635 }
636
GetNativeSurface()637 sptr<NativeSurface> ConsumerSurface::GetNativeSurface()
638 {
639 return nullptr;
640 }
641
SetWptrNativeWindowToPSurface(void * nativeWindow)642 GSError ConsumerSurface::SetWptrNativeWindowToPSurface(void* nativeWindow)
643 {
644 return GSERROR_NOT_SUPPORT;
645 }
646
ConsumerRequestCpuAccess(bool on)647 void ConsumerSurface::ConsumerRequestCpuAccess(bool on)
648 {
649 if (consumer_ == nullptr) {
650 return;
651 }
652 consumer_->ConsumerRequestCpuAccess(on);
653 }
654
GetTransformHint() const655 GraphicTransformType ConsumerSurface::GetTransformHint() const
656 {
657 if (producer_ == nullptr) {
658 return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
659 }
660 GraphicTransformType transformHint = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
661 if (producer_->GetTransformHint(transformHint) != GSERROR_OK) {
662 BLOGE("GetTransformHint failed, uniqueId: %{public}" PRIu64 ".", uniqueId_);
663 return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
664 }
665 return transformHint;
666 }
667
SetTransformHint(GraphicTransformType transformHint)668 GSError ConsumerSurface::SetTransformHint(GraphicTransformType transformHint)
669 {
670 if (producer_ == nullptr) {
671 return GSERROR_INVALID_ARGUMENTS;
672 }
673 return producer_->SetTransformHint(transformHint);
674 }
675
SetSurfaceSourceType(OHSurfaceSource sourceType)676 GSError ConsumerSurface::SetSurfaceSourceType(OHSurfaceSource sourceType)
677 {
678 if (producer_ == nullptr) {
679 return GSERROR_INVALID_ARGUMENTS;
680 }
681 return producer_->SetSurfaceSourceType(sourceType);
682 }
683
GetSurfaceSourceType() const684 OHSurfaceSource ConsumerSurface::GetSurfaceSourceType() const
685 {
686 if (producer_ == nullptr) {
687 return OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
688 }
689 OHSurfaceSource sourceType = OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
690 if (producer_->GetSurfaceSourceType(sourceType) != GSERROR_OK) {
691 BLOGE("GetSurfaceSourceType failed, uniqueId: %{public}" PRIu64 ".", uniqueId_);
692 return OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
693 }
694 return sourceType;
695 }
696
SetSurfaceAppFrameworkType(std::string appFrameworkType)697 GSError ConsumerSurface::SetSurfaceAppFrameworkType(std::string appFrameworkType)
698 {
699 if (producer_ == nullptr) {
700 return GSERROR_INVALID_ARGUMENTS;
701 }
702 return producer_->SetSurfaceAppFrameworkType(appFrameworkType);
703 }
704
GetSurfaceAppFrameworkType() const705 std::string ConsumerSurface::GetSurfaceAppFrameworkType() const
706 {
707 if (producer_ == nullptr) {
708 return "";
709 }
710 std::string appFrameworkType = "";
711 if (producer_->GetSurfaceAppFrameworkType(appFrameworkType) != GSERROR_OK) {
712 BLOGE("GetSurfaceAppFrameworkType failed, uniqueId: %{public}" PRIu64 ".", uniqueId_);
713 return "";
714 }
715 return appFrameworkType;
716 }
717
SetRequestWidthAndHeight(int32_t width,int32_t height)718 void ConsumerSurface::SetRequestWidthAndHeight(int32_t width, int32_t height)
719 {
720 (void)width;
721 (void)height;
722 }
723
GetRequestWidth()724 int32_t ConsumerSurface::GetRequestWidth()
725 {
726 return 0;
727 }
728
GetRequestHeight()729 int32_t ConsumerSurface::GetRequestHeight()
730 {
731 return 0;
732 }
733
GetWindowConfig()734 BufferRequestConfig* ConsumerSurface::GetWindowConfig()
735 {
736 return nullptr;
737 }
738
SetHdrWhitePointBrightness(float brightness)739 GSError ConsumerSurface::SetHdrWhitePointBrightness(float brightness)
740 {
741 (void)brightness;
742 return GSERROR_OK;
743 }
744
SetSdrWhitePointBrightness(float brightness)745 GSError ConsumerSurface::SetSdrWhitePointBrightness(float brightness)
746 {
747 (void)brightness;
748 return GSERROR_OK;
749 }
750
GetHdrWhitePointBrightness() const751 float ConsumerSurface::GetHdrWhitePointBrightness() const
752 {
753 if (consumer_ == nullptr) {
754 return 0;
755 }
756 return consumer_->GetHdrWhitePointBrightness();
757 }
758
GetSdrWhitePointBrightness() const759 float ConsumerSurface::GetSdrWhitePointBrightness() const
760 {
761 if (consumer_ == nullptr) {
762 return 0;
763 }
764 return consumer_->GetSdrWhitePointBrightness();
765 }
766
GetSurfaceBufferTransformType(sptr<SurfaceBuffer> buffer,GraphicTransformType * transformType)767 GSError ConsumerSurface::GetSurfaceBufferTransformType(sptr<SurfaceBuffer> buffer,
768 GraphicTransformType *transformType)
769 {
770 if (buffer == nullptr || transformType == nullptr) {
771 return SURFACE_ERROR_INVALID_PARAM;
772 }
773 *transformType = buffer->GetSurfaceBufferTransform();
774 return GSERROR_OK;
775 }
776
IsSurfaceBufferInCache(uint32_t seqNum,bool & isInCache)777 GSError ConsumerSurface::IsSurfaceBufferInCache(uint32_t seqNum, bool& isInCache)
778 {
779 if (consumer_ == nullptr) {
780 return SURFACE_ERROR_UNKOWN;
781 }
782 return consumer_->IsSurfaceBufferInCache(seqNum, isInCache);
783 }
784
AcquireLastFlushedBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],uint32_t matrixSize,bool isUseNewMatrix)785 GSError ConsumerSurface::AcquireLastFlushedBuffer(sptr<SurfaceBuffer> &buffer, sptr<SyncFence> &fence,
786 float matrix[16], uint32_t matrixSize, bool isUseNewMatrix)
787 {
788 return GSERROR_NOT_SUPPORT;
789 }
790
ReleaseLastFlushedBuffer(sptr<SurfaceBuffer> buffer)791 GSError ConsumerSurface::ReleaseLastFlushedBuffer(sptr<SurfaceBuffer> buffer)
792 {
793 return GSERROR_NOT_SUPPORT;
794 }
795
GetAvailableBufferCount() const796 uint32_t ConsumerSurface::GetAvailableBufferCount() const
797 {
798 if (consumer_ == nullptr) {
799 return 0;
800 }
801 return consumer_->GetAvailableBufferCount();
802 }
803 } // namespace OHOS
804