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 if (isForUniRedraw) {
400 bool hasRegistercallBackForRedraw = false;
401 if (!hasRegistercallBackForRedraw_.compare_exchange_strong(hasRegistercallBackForRedraw, true)) {
402 return GSERROR_OK;
403 }
404 } else {
405 bool hasRegistercallBackForRT = false;
406 if (!hasRegistercallBackForRT_.compare_exchange_strong(hasRegistercallBackForRT, true)) {
407 return GSERROR_OK;
408 }
409 }
410 return consumer_->RegisterDeleteBufferListener(func, isForUniRedraw);
411 }
412
UnregisterConsumerListener()413 GSError ConsumerSurface::UnregisterConsumerListener()
414 {
415 if (consumer_ == nullptr) {
416 return GSERROR_INVALID_ARGUMENTS;
417 }
418 return consumer_->UnregisterConsumerListener();
419 }
420
RegisterUserDataChangeListener(const std::string & funcName,OnUserDataChangeFunc func)421 GSError ConsumerSurface::RegisterUserDataChangeListener(const std::string& funcName, OnUserDataChangeFunc func)
422 {
423 if (func == nullptr) {
424 return GSERROR_INVALID_ARGUMENTS;
425 }
426 std::lock_guard<std::mutex> lockGuard(lockMutex_);
427 if (onUserDataChange_.find(funcName) != onUserDataChange_.end()) {
428 BLOGD("already register func: %{public}s, uniqueId: %{public}" PRIu64 ".",
429 funcName.c_str(), uniqueId_);
430 return GSERROR_INVALID_ARGUMENTS;
431 }
432
433 onUserDataChange_[funcName] = func;
434 return GSERROR_OK;
435 }
436
UnRegisterUserDataChangeListener(const std::string & funcName)437 GSError ConsumerSurface::UnRegisterUserDataChangeListener(const std::string& funcName)
438 {
439 std::lock_guard<std::mutex> lockGuard(lockMutex_);
440 if (onUserDataChange_.erase(funcName) == 0) {
441 BLOGD("no register funcName: %{public}s, uniqueId: %{public}" PRIu64 ".",
442 funcName.c_str(), uniqueId_);
443 return GSERROR_INVALID_ARGUMENTS;
444 }
445
446 return GSERROR_OK;
447 }
448
ClearUserDataChangeListener()449 GSError ConsumerSurface::ClearUserDataChangeListener()
450 {
451 std::lock_guard<std::mutex> lockGuard(lockMutex_);
452 onUserDataChange_.clear();
453 return GSERROR_OK;
454 }
455
CleanCache(bool cleanAll)456 GSError ConsumerSurface::CleanCache(bool cleanAll)
457 {
458 (void)cleanAll;
459 return GSERROR_NOT_SUPPORT;
460 }
461
GoBackground()462 GSError ConsumerSurface::GoBackground()
463 {
464 if (consumer_ == nullptr) {
465 return GSERROR_INVALID_ARGUMENTS;
466 }
467 if (producer_ != nullptr) {
468 BLOGD("GoBackground, uniqueId: %{public}" PRIu64 ".", uniqueId_);
469 }
470 return consumer_->GoBackground();
471 }
472
GetUniqueId() const473 uint64_t ConsumerSurface::GetUniqueId() const
474 {
475 if (producer_ == nullptr) {
476 return 0;
477 }
478 return producer_->GetUniqueId();
479 }
480
Dump(std::string & result) const481 void ConsumerSurface::Dump(std::string& result) const
482 {
483 if (consumer_ == nullptr) {
484 return;
485 }
486 return consumer_->Dump(result);
487 }
488
SetTransform(GraphicTransformType transform)489 GSError ConsumerSurface::SetTransform(GraphicTransformType transform)
490 {
491 if (producer_ == nullptr) {
492 return GSERROR_INVALID_ARGUMENTS;
493 }
494 return producer_->SetTransform(transform);
495 }
496
GetTransform() const497 GraphicTransformType ConsumerSurface::GetTransform() const
498 {
499 if (consumer_ == nullptr) {
500 return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
501 }
502 return consumer_->GetTransform();
503 }
504
IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> & infos,std::vector<bool> & supporteds)505 GSError ConsumerSurface::IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> &infos,
506 std::vector<bool> &supporteds)
507 {
508 return GSERROR_NOT_SUPPORT;
509 }
510
Connect()511 GSError ConsumerSurface::Connect()
512 {
513 return GSERROR_NOT_SUPPORT;
514 }
515
Disconnect()516 GSError ConsumerSurface::Disconnect()
517 {
518 return GSERROR_NOT_SUPPORT;
519 }
520
SetScalingMode(uint32_t sequence,ScalingMode scalingMode)521 GSError ConsumerSurface::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
522 {
523 if (producer_ == nullptr || scalingMode < ScalingMode::SCALING_MODE_FREEZE ||
524 scalingMode > ScalingMode::SCALING_MODE_SCALE_FIT) {
525 return GSERROR_INVALID_ARGUMENTS;
526 }
527 return producer_->SetScalingMode(sequence, scalingMode);
528 }
529
SetScalingMode(ScalingMode scalingMode)530 GSError ConsumerSurface::SetScalingMode(ScalingMode scalingMode)
531 {
532 if (producer_ == nullptr || scalingMode < ScalingMode::SCALING_MODE_FREEZE ||
533 scalingMode > ScalingMode::SCALING_MODE_SCALE_FIT) {
534 return GSERROR_INVALID_ARGUMENTS;
535 }
536 return producer_->SetScalingMode(scalingMode);
537 }
538
GetScalingMode(uint32_t sequence,ScalingMode & scalingMode)539 GSError ConsumerSurface::GetScalingMode(uint32_t sequence, ScalingMode& scalingMode)
540 {
541 if (consumer_ == nullptr) {
542 return GSERROR_INVALID_ARGUMENTS;
543 }
544 return consumer_->GetScalingMode(sequence, scalingMode);
545 }
546
SetMetaData(uint32_t sequence,const std::vector<GraphicHDRMetaData> & metaData)547 GSError ConsumerSurface::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData>& metaData)
548 {
549 if (producer_ == nullptr || metaData.size() == 0) {
550 return GSERROR_INVALID_ARGUMENTS;
551 }
552 return producer_->SetMetaData(sequence, metaData);
553 }
554
SetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)555 GSError ConsumerSurface::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
556 const std::vector<uint8_t>& metaData)
557 {
558 if (producer_ == nullptr || key < GraphicHDRMetadataKey::GRAPHIC_MATAKEY_RED_PRIMARY_X ||
559 key > GraphicHDRMetadataKey::GRAPHIC_MATAKEY_HDR_VIVID || metaData.size() == 0) {
560 return GSERROR_INVALID_ARGUMENTS;
561 }
562 return producer_->SetMetaDataSet(sequence, key, metaData);
563 }
564
QueryMetaDataType(uint32_t sequence,HDRMetaDataType & type) const565 GSError ConsumerSurface::QueryMetaDataType(uint32_t sequence, HDRMetaDataType& type) const
566 {
567 if (consumer_ == nullptr) {
568 return GSERROR_INVALID_ARGUMENTS;
569 }
570 return consumer_->QueryMetaDataType(sequence, type);
571 }
572
GetMetaData(uint32_t sequence,std::vector<GraphicHDRMetaData> & metaData) const573 GSError ConsumerSurface::GetMetaData(uint32_t sequence, std::vector<GraphicHDRMetaData>& metaData) const
574 {
575 if (consumer_ == nullptr) {
576 return GSERROR_INVALID_ARGUMENTS;
577 }
578 return consumer_->GetMetaData(sequence, metaData);
579 }
580
GetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey & key,std::vector<uint8_t> & metaData) const581 GSError ConsumerSurface::GetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey& key,
582 std::vector<uint8_t>& metaData) const
583 {
584 if (consumer_ == nullptr) {
585 return GSERROR_INVALID_ARGUMENTS;
586 }
587 return consumer_->GetMetaDataSet(sequence, key, metaData);
588 }
589
SetTunnelHandle(const GraphicExtDataHandle * handle)590 GSError ConsumerSurface::SetTunnelHandle(const GraphicExtDataHandle *handle)
591 {
592 if (producer_ == nullptr || handle == nullptr || handle->reserveInts == 0) {
593 return GSERROR_INVALID_ARGUMENTS;
594 }
595 return producer_->SetTunnelHandle(handle);
596 }
597
GetTunnelHandle() const598 sptr<SurfaceTunnelHandle> ConsumerSurface::GetTunnelHandle() const
599 {
600 if (consumer_ == nullptr) {
601 return nullptr;
602 }
603 return consumer_->GetTunnelHandle();
604 }
605
SetBufferHold(bool hold)606 void ConsumerSurface::SetBufferHold(bool hold)
607 {
608 if (consumer_ == nullptr) {
609 return;
610 }
611 consumer_->SetBufferHold(hold);
612 }
613
SetPresentTimestamp(uint32_t sequence,const GraphicPresentTimestamp & timestamp)614 GSError ConsumerSurface::SetPresentTimestamp(uint32_t sequence, const GraphicPresentTimestamp& timestamp)
615 {
616 if (consumer_ == nullptr || timestamp.type == GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_UNSUPPORTED) {
617 return GSERROR_INVALID_ARGUMENTS;
618 }
619 return consumer_->SetPresentTimestamp(sequence, timestamp);
620 }
621
GetPresentTimestamp(uint32_t sequence,GraphicPresentTimestampType type,int64_t & time) const622 GSError ConsumerSurface::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type,
623 int64_t &time) const
624 {
625 return GSERROR_NOT_SUPPORT;
626 }
627
GetDefaultFormat()628 int32_t ConsumerSurface::GetDefaultFormat()
629 {
630 return 0;
631 }
632
SetDefaultFormat(int32_t format)633 GSError ConsumerSurface::SetDefaultFormat(int32_t format)
634 {
635 return GSERROR_NOT_SUPPORT;
636 }
637
GetDefaultColorGamut()638 int32_t ConsumerSurface::GetDefaultColorGamut()
639 {
640 return 0;
641 }
642
SetDefaultColorGamut(int32_t colorGamut)643 GSError ConsumerSurface::SetDefaultColorGamut(int32_t colorGamut)
644 {
645 return GSERROR_NOT_SUPPORT;
646 }
647
GetNativeSurface()648 sptr<NativeSurface> ConsumerSurface::GetNativeSurface()
649 {
650 return nullptr;
651 }
652
SetWptrNativeWindowToPSurface(void * nativeWindow)653 GSError ConsumerSurface::SetWptrNativeWindowToPSurface(void* nativeWindow)
654 {
655 return GSERROR_NOT_SUPPORT;
656 }
657
ConsumerRequestCpuAccess(bool on)658 void ConsumerSurface::ConsumerRequestCpuAccess(bool on)
659 {
660 if (consumer_ == nullptr) {
661 return;
662 }
663 consumer_->ConsumerRequestCpuAccess(on);
664 }
665
GetTransformHint() const666 GraphicTransformType ConsumerSurface::GetTransformHint() const
667 {
668 if (producer_ == nullptr) {
669 return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
670 }
671 GraphicTransformType transformHint = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
672 if (producer_->GetTransformHint(transformHint) != GSERROR_OK) {
673 BLOGE("GetTransformHint failed, uniqueId: %{public}" PRIu64 ".", uniqueId_);
674 return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
675 }
676 return transformHint;
677 }
678
SetTransformHint(GraphicTransformType transformHint)679 GSError ConsumerSurface::SetTransformHint(GraphicTransformType transformHint)
680 {
681 if (producer_ == nullptr) {
682 return GSERROR_INVALID_ARGUMENTS;
683 }
684 return producer_->SetTransformHint(transformHint);
685 }
686
SetSurfaceSourceType(OHSurfaceSource sourceType)687 GSError ConsumerSurface::SetSurfaceSourceType(OHSurfaceSource sourceType)
688 {
689 if (producer_ == nullptr) {
690 return GSERROR_INVALID_ARGUMENTS;
691 }
692 return producer_->SetSurfaceSourceType(sourceType);
693 }
694
GetSurfaceSourceType() const695 OHSurfaceSource ConsumerSurface::GetSurfaceSourceType() const
696 {
697 if (producer_ == nullptr) {
698 return OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
699 }
700 OHSurfaceSource sourceType = OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
701 if (producer_->GetSurfaceSourceType(sourceType) != GSERROR_OK) {
702 BLOGE("GetSurfaceSourceType failed, uniqueId: %{public}" PRIu64 ".", uniqueId_);
703 return OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
704 }
705 return sourceType;
706 }
707
SetSurfaceAppFrameworkType(std::string appFrameworkType)708 GSError ConsumerSurface::SetSurfaceAppFrameworkType(std::string appFrameworkType)
709 {
710 if (producer_ == nullptr) {
711 return GSERROR_INVALID_ARGUMENTS;
712 }
713 return producer_->SetSurfaceAppFrameworkType(appFrameworkType);
714 }
715
GetSurfaceAppFrameworkType() const716 std::string ConsumerSurface::GetSurfaceAppFrameworkType() const
717 {
718 if (producer_ == nullptr) {
719 return "";
720 }
721 std::string appFrameworkType = "";
722 if (producer_->GetSurfaceAppFrameworkType(appFrameworkType) != GSERROR_OK) {
723 BLOGE("GetSurfaceAppFrameworkType failed, uniqueId: %{public}" PRIu64 ".", uniqueId_);
724 return "";
725 }
726 return appFrameworkType;
727 }
728
SetRequestWidthAndHeight(int32_t width,int32_t height)729 void ConsumerSurface::SetRequestWidthAndHeight(int32_t width, int32_t height)
730 {
731 (void)width;
732 (void)height;
733 }
734
GetRequestWidth()735 int32_t ConsumerSurface::GetRequestWidth()
736 {
737 return 0;
738 }
739
GetRequestHeight()740 int32_t ConsumerSurface::GetRequestHeight()
741 {
742 return 0;
743 }
744
GetWindowConfig()745 BufferRequestConfig* ConsumerSurface::GetWindowConfig()
746 {
747 return nullptr;
748 }
749
SetHdrWhitePointBrightness(float brightness)750 GSError ConsumerSurface::SetHdrWhitePointBrightness(float brightness)
751 {
752 (void)brightness;
753 return GSERROR_OK;
754 }
755
SetSdrWhitePointBrightness(float brightness)756 GSError ConsumerSurface::SetSdrWhitePointBrightness(float brightness)
757 {
758 (void)brightness;
759 return GSERROR_OK;
760 }
761
GetHdrWhitePointBrightness() const762 float ConsumerSurface::GetHdrWhitePointBrightness() const
763 {
764 if (consumer_ == nullptr) {
765 return 0;
766 }
767 return consumer_->GetHdrWhitePointBrightness();
768 }
769
GetSdrWhitePointBrightness() const770 float ConsumerSurface::GetSdrWhitePointBrightness() const
771 {
772 if (consumer_ == nullptr) {
773 return 0;
774 }
775 return consumer_->GetSdrWhitePointBrightness();
776 }
777
GetSurfaceBufferTransformType(sptr<SurfaceBuffer> buffer,GraphicTransformType * transformType)778 GSError ConsumerSurface::GetSurfaceBufferTransformType(sptr<SurfaceBuffer> buffer,
779 GraphicTransformType *transformType)
780 {
781 if (buffer == nullptr || transformType == nullptr) {
782 return SURFACE_ERROR_INVALID_PARAM;
783 }
784 *transformType = buffer->GetSurfaceBufferTransform();
785 return GSERROR_OK;
786 }
787
IsSurfaceBufferInCache(uint32_t seqNum,bool & isInCache)788 GSError ConsumerSurface::IsSurfaceBufferInCache(uint32_t seqNum, bool& isInCache)
789 {
790 if (consumer_ == nullptr) {
791 return SURFACE_ERROR_UNKOWN;
792 }
793 return consumer_->IsSurfaceBufferInCache(seqNum, isInCache);
794 }
795
AcquireLastFlushedBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],uint32_t matrixSize,bool isUseNewMatrix)796 GSError ConsumerSurface::AcquireLastFlushedBuffer(sptr<SurfaceBuffer> &buffer, sptr<SyncFence> &fence,
797 float matrix[16], uint32_t matrixSize, bool isUseNewMatrix)
798 {
799 return GSERROR_NOT_SUPPORT;
800 }
801
ReleaseLastFlushedBuffer(sptr<SurfaceBuffer> buffer)802 GSError ConsumerSurface::ReleaseLastFlushedBuffer(sptr<SurfaceBuffer> buffer)
803 {
804 return GSERROR_NOT_SUPPORT;
805 }
806
GetAvailableBufferCount() const807 uint32_t ConsumerSurface::GetAvailableBufferCount() const
808 {
809 if (consumer_ == nullptr) {
810 return 0;
811 }
812 return consumer_->GetAvailableBufferCount();
813 }
814 } // namespace OHOS
815