• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "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)25 sptr<Surface> Surface::CreateSurfaceAsConsumer(std::string name)
26 {
27     sptr<ConsumerSurface> surf = new ConsumerSurface(name);
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)35 sptr<IConsumerSurface> IConsumerSurface::Create(std::string name)
36 {
37     sptr<ConsumerSurface> surf = new ConsumerSurface(name);
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)45 ConsumerSurface::ConsumerSurface(const std::string& name)
46     : name_(name)
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_);
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 
AcquireBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,int64_t & timestamp,Rect & damage)86 GSError ConsumerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
87                                        int64_t& timestamp, Rect& damage)
88 {
89     std::vector<Rect> damages;
90     GSError ret = AcquireBuffer(buffer, fence, timestamp, damages);
91     if (ret != GSERROR_OK) {
92         return ret;
93     }
94     if (damages.size() == 1) {
95         damage = damages[0];
96         return GSERROR_OK;
97     }
98     BLOGE("damages is %{public}zu, uniqueId: %{public}" PRIu64 ".", damages.size(), uniqueId_);
99     return GSERROR_INVALID_ARGUMENTS;
100 }
101 
AcquireBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,int64_t & timestamp,std::vector<Rect> & damages,bool isLppMode)102 GSError ConsumerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
103                                        int64_t& timestamp, std::vector<Rect>& damages, bool isLppMode)
104 {
105     if (consumer_ == nullptr) {
106         return GSERROR_INVALID_ARGUMENTS;
107     }
108     return consumer_->AcquireBuffer(buffer, fence, timestamp, damages, isLppMode);
109 }
110 
AcquireBuffer(AcquireBufferReturnValue & returnValue,int64_t expectPresentTimestamp,bool isUsingAutoTimestamp)111 GSError ConsumerSurface::AcquireBuffer(AcquireBufferReturnValue &returnValue, int64_t expectPresentTimestamp,
112                                        bool isUsingAutoTimestamp)
113 {
114     if (consumer_ == nullptr) {
115         return GSERROR_INVALID_ARGUMENTS;
116     }
117     return consumer_->AcquireBuffer(returnValue, expectPresentTimestamp, isUsingAutoTimestamp);
118 }
119 
AcquireBuffer(AcquireBufferReturnValue & returnValue)120 GSError ConsumerSurface::AcquireBuffer(AcquireBufferReturnValue &returnValue)
121 {
122     if (consumer_ == nullptr) {
123         return SURFACE_ERROR_UNKOWN;
124     }
125     return consumer_->AcquireBuffer(returnValue);
126 }
127 
ReleaseBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence)128 GSError ConsumerSurface::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence)
129 {
130     if (buffer == nullptr || consumer_ == nullptr) {
131         return GSERROR_INVALID_ARGUMENTS;
132     }
133     return consumer_->ReleaseBuffer(buffer, fence);
134 }
135 
ReleaseBuffer(uint32_t sequence,const sptr<SyncFence> & fence)136 GSError ConsumerSurface::ReleaseBuffer(uint32_t sequence, const sptr<SyncFence>& fence)
137 {
138     if (sequence == 0 || consumer_ == nullptr) {
139         return GSERROR_INVALID_ARGUMENTS;
140     }
141     return consumer_->ReleaseBuffer(sequence, fence);
142 }
143 
SetIsActiveGame(bool isTransactonActiveGame)144 GSError ConsumerSurface::SetIsActiveGame(bool isTransactonActiveGame)
145 {
146     if (consumer_ == nullptr) {
147         return SURFACE_ERROR_UNKOWN;
148     }
149     return consumer_->SetIsActiveGame(isTransactonActiveGame);
150 }
151 
AcquireBuffer(sptr<SurfaceBuffer> & buffer,int32_t & fence,int64_t & timestamp,Rect & damage)152 GSError ConsumerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, int32_t& fence,
153                                        int64_t& timestamp, Rect& damage)
154 {
155     sptr<SyncFence> syncFence = SyncFence::InvalidFence();
156     auto ret = AcquireBuffer(buffer, syncFence, timestamp, damage);
157     if (ret != GSERROR_OK) {
158         fence = -1;
159         return ret;
160     }
161     fence = syncFence->Dup();
162     return GSERROR_OK;
163 }
164 
ReleaseBuffer(sptr<SurfaceBuffer> & buffer,int32_t fence)165 GSError ConsumerSurface::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, int32_t fence)
166 {
167     sptr<SyncFence> syncFence = new SyncFence(fence);
168     return ReleaseBuffer(buffer, syncFence);
169 }
170 
AttachBufferToQueue(sptr<SurfaceBuffer> buffer)171 GSError ConsumerSurface::AttachBufferToQueue(sptr<SurfaceBuffer> buffer)
172 {
173     if (buffer == nullptr || consumer_ == nullptr) {
174         return GSERROR_INVALID_ARGUMENTS;
175     }
176     buffer->SetConsumerAttachBufferFlag(true);
177     return consumer_->AttachBufferToQueue(buffer);
178 }
179 
DetachBufferFromQueue(sptr<SurfaceBuffer> buffer,bool isReserveSlot)180 GSError ConsumerSurface::DetachBufferFromQueue(sptr<SurfaceBuffer> buffer, bool isReserveSlot)
181 {
182     if (buffer == nullptr || consumer_ == nullptr) {
183         return GSERROR_INVALID_ARGUMENTS;
184     }
185     buffer->SetConsumerAttachBufferFlag(false);
186     return consumer_->DetachBufferFromQueue(buffer, isReserveSlot);
187 }
188 
AttachBuffer(sptr<SurfaceBuffer> & buffer)189 GSError ConsumerSurface::AttachBuffer(sptr<SurfaceBuffer>& buffer)
190 {
191     if (buffer == nullptr || consumer_ == nullptr) {
192         return GSERROR_INVALID_ARGUMENTS;
193     }
194     return consumer_->AttachBuffer(buffer);
195 }
196 
AttachBuffer(sptr<SurfaceBuffer> & buffer,int32_t timeOut)197 GSError ConsumerSurface::AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut)
198 {
199     if (buffer == nullptr || consumer_ == nullptr) {
200         return GSERROR_INVALID_ARGUMENTS;
201     }
202     return consumer_->AttachBuffer(buffer, timeOut);
203 }
204 
DetachBuffer(sptr<SurfaceBuffer> & buffer)205 GSError ConsumerSurface::DetachBuffer(sptr<SurfaceBuffer>& buffer)
206 {
207     if (buffer == nullptr || consumer_ == nullptr) {
208         return GSERROR_INVALID_ARGUMENTS;
209     }
210     return consumer_->DetachBuffer(buffer);
211 }
212 
RegisterSurfaceDelegator(sptr<IRemoteObject> client)213 GSError ConsumerSurface::RegisterSurfaceDelegator(sptr<IRemoteObject> client)
214 {
215     if (client == nullptr || consumer_ == nullptr) {
216         return GSERROR_INVALID_ARGUMENTS;
217     }
218     return consumer_->RegisterSurfaceDelegator(client, this);
219 }
220 
QueryIfBufferAvailable()221 bool ConsumerSurface::QueryIfBufferAvailable()
222 {
223     if (consumer_ == nullptr) {
224         return false;
225     }
226     return consumer_->QueryIfBufferAvailable();
227 }
228 
GetQueueSize()229 uint32_t ConsumerSurface::GetQueueSize()
230 {
231     if (producer_ == nullptr) {
232         return 0;
233     }
234     return producer_->GetQueueSize();
235 }
236 
SetQueueSize(uint32_t queueSize)237 GSError ConsumerSurface::SetQueueSize(uint32_t queueSize)
238 {
239     if (producer_ == nullptr) {
240         return GSERROR_INVALID_ARGUMENTS;
241     }
242     return producer_->SetQueueSize(queueSize);
243 }
244 
GetName()245 const std::string& ConsumerSurface::GetName()
246 {
247     return name_;
248 }
249 
SetDefaultWidthAndHeight(int32_t width,int32_t height)250 GSError ConsumerSurface::SetDefaultWidthAndHeight(int32_t width, int32_t height)
251 {
252     if (consumer_ == nullptr) {
253         return GSERROR_INVALID_ARGUMENTS;
254     }
255     return consumer_->SetDefaultWidthAndHeight(width, height);
256 }
257 
GetDefaultWidth()258 int32_t ConsumerSurface::GetDefaultWidth()
259 {
260     if (producer_ == nullptr) {
261         return -1;
262     }
263     return producer_->GetDefaultWidth();
264 }
265 
GetDefaultHeight()266 int32_t ConsumerSurface::GetDefaultHeight()
267 {
268     if (producer_ == nullptr) {
269         return -1;
270     }
271     return producer_->GetDefaultHeight();
272 }
273 
SetDefaultUsage(uint64_t usage)274 GSError ConsumerSurface::SetDefaultUsage(uint64_t usage)
275 {
276     if (consumer_ == nullptr) {
277         return GSERROR_INVALID_ARGUMENTS;
278     }
279     return consumer_->SetDefaultUsage(usage);
280 }
281 
GetDefaultUsage()282 uint64_t ConsumerSurface::GetDefaultUsage()
283 {
284     if (producer_ == nullptr) {
285         return 0;
286     }
287     return producer_->GetDefaultUsage();
288 }
289 
SetUserData(const std::string & key,const std::string & val)290 GSError ConsumerSurface::SetUserData(const std::string& key, const std::string& val)
291 {
292     std::lock_guard<std::mutex> lockGuard(lockMutex_);
293     if (userData_.size() >= SURFACE_MAX_USER_DATA_COUNT) {
294         BLOGE("userData_ size(%{public}zu) out, uniqueId: %{public}" PRIu64 ".", userData_.size(), uniqueId_);
295         return GSERROR_OUT_OF_RANGE;
296     }
297 
298     auto iterUserData = userData_.find(key);
299     if (iterUserData != userData_.end() && iterUserData->second == val) {
300         BLOGE("not find key:%{public}s, val:%{public}s exist, uniqueId: %{public}" PRIu64 ".",
301             key.c_str(), val.c_str(), uniqueId_);
302         return GSERROR_API_FAILED;
303     }
304 
305     userData_[key] = val;
306     auto iter = onUserDataChange_.begin();
307     while (iter != onUserDataChange_.end()) {
308         if (iter->second != nullptr) {
309             iter->second(key, val);
310         }
311         iter++;
312     }
313 
314     return GSERROR_OK;
315 }
316 
GetUserData(const std::string & key)317 std::string ConsumerSurface::GetUserData(const std::string& key)
318 {
319     std::lock_guard<std::mutex> lockGuard(lockMutex_);
320     if (userData_.find(key) != userData_.end()) {
321         return userData_[key];
322     }
323 
324     return "";
325 }
326 
RegisterConsumerListener(sptr<IBufferConsumerListener> & listener)327 GSError ConsumerSurface::RegisterConsumerListener(sptr<IBufferConsumerListener>& listener)
328 {
329     if (listener == nullptr || consumer_ == nullptr) {
330         return GSERROR_INVALID_ARGUMENTS;
331     }
332     return consumer_->RegisterConsumerListener(listener);
333 }
334 
RegisterConsumerListener(IBufferConsumerListenerClazz * listener)335 GSError ConsumerSurface::RegisterConsumerListener(IBufferConsumerListenerClazz *listener)
336 {
337     if (listener == nullptr || consumer_ == nullptr) {
338         return GSERROR_INVALID_ARGUMENTS;
339     }
340     return consumer_->RegisterConsumerListener(listener);
341 }
342 
RegisterReleaseListener(OnReleaseFunc func)343 GSError ConsumerSurface::RegisterReleaseListener(OnReleaseFunc func)
344 {
345     if (func == nullptr || consumer_ == nullptr) {
346         return GSERROR_INVALID_ARGUMENTS;
347     }
348     return consumer_->RegisterReleaseListener(func);
349 }
350 
RegisterDeleteBufferListener(OnDeleteBufferFunc func,bool isForUniRedraw)351 GSError ConsumerSurface::RegisterDeleteBufferListener(OnDeleteBufferFunc func, bool isForUniRedraw)
352 {
353     if (func == nullptr || consumer_ == nullptr) {
354         return GSERROR_INVALID_ARGUMENTS;
355     }
356     if (isForUniRedraw) {
357         bool hasRegistercallBackForRedraw = false;
358         if (!hasRegistercallBackForRedraw_.compare_exchange_strong(hasRegistercallBackForRedraw, true)) {
359             return GSERROR_OK;
360         }
361     } else {
362         bool hasRegistercallBackForRT = false;
363         if (!hasRegistercallBackForRT_.compare_exchange_strong(hasRegistercallBackForRT, true)) {
364             return GSERROR_OK;
365         }
366     }
367     return consumer_->RegisterDeleteBufferListener(func, isForUniRedraw);
368 }
369 
UnregisterConsumerListener()370 GSError ConsumerSurface::UnregisterConsumerListener()
371 {
372     if (consumer_ == nullptr) {
373         return GSERROR_INVALID_ARGUMENTS;
374     }
375     return consumer_->UnregisterConsumerListener();
376 }
377 
RegisterUserDataChangeListener(const std::string & funcName,OnUserDataChangeFunc func)378 GSError ConsumerSurface::RegisterUserDataChangeListener(const std::string& funcName, OnUserDataChangeFunc func)
379 {
380     if (func == nullptr) {
381         return GSERROR_INVALID_ARGUMENTS;
382     }
383     std::lock_guard<std::mutex> lockGuard(lockMutex_);
384     if (onUserDataChange_.find(funcName) != onUserDataChange_.end()) {
385         BLOGD("already register func: %{public}s, uniqueId: %{public}" PRIu64 ".",
386             funcName.c_str(), uniqueId_);
387         return GSERROR_INVALID_ARGUMENTS;
388     }
389 
390     onUserDataChange_[funcName] = func;
391     return GSERROR_OK;
392 }
393 
UnRegisterUserDataChangeListener(const std::string & funcName)394 GSError ConsumerSurface::UnRegisterUserDataChangeListener(const std::string& funcName)
395 {
396     std::lock_guard<std::mutex> lockGuard(lockMutex_);
397     if (onUserDataChange_.erase(funcName) == 0) {
398         BLOGD("no register funcName: %{public}s, uniqueId: %{public}" PRIu64 ".",
399             funcName.c_str(), uniqueId_);
400         return GSERROR_INVALID_ARGUMENTS;
401     }
402 
403     return GSERROR_OK;
404 }
405 
ClearUserDataChangeListener()406 GSError ConsumerSurface::ClearUserDataChangeListener()
407 {
408     std::lock_guard<std::mutex> lockGuard(lockMutex_);
409     onUserDataChange_.clear();
410     return GSERROR_OK;
411 }
412 
GoBackground()413 GSError ConsumerSurface::GoBackground()
414 {
415     if (consumer_ == nullptr) {
416         return GSERROR_INVALID_ARGUMENTS;
417     }
418     if (producer_ != nullptr) {
419         BLOGD("GoBackground, uniqueId: %{public}" PRIu64 ".", uniqueId_);
420     }
421     return consumer_->GoBackground();
422 }
423 
GetUniqueId() const424 uint64_t ConsumerSurface::GetUniqueId() const
425 {
426     if (producer_ == nullptr) {
427         return 0;
428     }
429     return producer_->GetUniqueId();
430 }
431 
Dump(std::string & result) const432 void ConsumerSurface::Dump(std::string& result) const
433 {
434     if (consumer_ == nullptr) {
435         return;
436     }
437     return consumer_->Dump(result);
438 }
439 
DumpCurrentFrameLayer() const440 void ConsumerSurface::DumpCurrentFrameLayer() const
441 {
442     if (consumer_ == nullptr) {
443         return;
444     }
445     return consumer_->DumpCurrentFrameLayer();
446 }
447 
SetTransform(GraphicTransformType transform)448 GSError ConsumerSurface::SetTransform(GraphicTransformType transform)
449 {
450     if (producer_ == nullptr) {
451         return GSERROR_INVALID_ARGUMENTS;
452     }
453     return producer_->SetTransform(transform);
454 }
455 
GetTransform() const456 GraphicTransformType ConsumerSurface::GetTransform() const
457 {
458     if (consumer_ == nullptr) {
459         return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
460     }
461     return consumer_->GetTransform();
462 }
463 
SetScalingMode(uint32_t sequence,ScalingMode scalingMode)464 GSError ConsumerSurface::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
465 {
466     if (producer_ == nullptr || scalingMode < ScalingMode::SCALING_MODE_FREEZE ||
467         scalingMode > ScalingMode::SCALING_MODE_SCALE_FIT) {
468         return GSERROR_INVALID_ARGUMENTS;
469     }
470     return producer_->SetScalingMode(sequence, scalingMode);
471 }
472 
SetScalingMode(ScalingMode scalingMode)473 GSError ConsumerSurface::SetScalingMode(ScalingMode scalingMode)
474 {
475     if (producer_ == nullptr || scalingMode < ScalingMode::SCALING_MODE_FREEZE ||
476         scalingMode > ScalingMode::SCALING_MODE_SCALE_FIT) {
477         return GSERROR_INVALID_ARGUMENTS;
478     }
479     return producer_->SetScalingMode(scalingMode);
480 }
481 
GetScalingMode(uint32_t sequence,ScalingMode & scalingMode)482 GSError ConsumerSurface::GetScalingMode(uint32_t sequence, ScalingMode& scalingMode)
483 {
484     if (consumer_ == nullptr) {
485         return GSERROR_INVALID_ARGUMENTS;
486     }
487     return consumer_->GetScalingMode(sequence, scalingMode);
488 }
489 
SetMetaData(uint32_t sequence,const std::vector<GraphicHDRMetaData> & metaData)490 GSError ConsumerSurface::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData>& metaData)
491 {
492     if (producer_ == nullptr || metaData.size() == 0) {
493         return GSERROR_INVALID_ARGUMENTS;
494     }
495     return producer_->SetMetaData(sequence, metaData);
496 }
497 
SetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)498 GSError ConsumerSurface::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
499                                         const std::vector<uint8_t>& metaData)
500 {
501     if (producer_ == nullptr || key < GraphicHDRMetadataKey::GRAPHIC_MATAKEY_RED_PRIMARY_X ||
502         key > GraphicHDRMetadataKey::GRAPHIC_MATAKEY_HDR_VIVID || metaData.size() == 0) {
503         return GSERROR_INVALID_ARGUMENTS;
504     }
505     return producer_->SetMetaDataSet(sequence, key, metaData);
506 }
507 
QueryMetaDataType(uint32_t sequence,HDRMetaDataType & type) const508 GSError ConsumerSurface::QueryMetaDataType(uint32_t sequence, HDRMetaDataType& type) const
509 {
510     if (consumer_ == nullptr) {
511         return GSERROR_INVALID_ARGUMENTS;
512     }
513     return consumer_->QueryMetaDataType(sequence, type);
514 }
515 
GetMetaData(uint32_t sequence,std::vector<GraphicHDRMetaData> & metaData) const516 GSError ConsumerSurface::GetMetaData(uint32_t sequence, std::vector<GraphicHDRMetaData>& metaData) const
517 {
518     if (consumer_ == nullptr) {
519         return GSERROR_INVALID_ARGUMENTS;
520     }
521     return consumer_->GetMetaData(sequence, metaData);
522 }
523 
GetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey & key,std::vector<uint8_t> & metaData) const524 GSError ConsumerSurface::GetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey& key,
525                                         std::vector<uint8_t>& metaData) const
526 {
527     if (consumer_ == nullptr) {
528         return GSERROR_INVALID_ARGUMENTS;
529     }
530     return consumer_->GetMetaDataSet(sequence, key, metaData);
531 }
532 
SetTunnelHandle(const GraphicExtDataHandle * handle)533 GSError ConsumerSurface::SetTunnelHandle(const GraphicExtDataHandle *handle)
534 {
535     if (producer_ == nullptr || handle == nullptr || handle->reserveInts == 0) {
536         return GSERROR_INVALID_ARGUMENTS;
537     }
538     return producer_->SetTunnelHandle(handle);
539 }
540 
GetTunnelHandle() const541 sptr<SurfaceTunnelHandle> ConsumerSurface::GetTunnelHandle() const
542 {
543     if (consumer_ == nullptr) {
544         return nullptr;
545     }
546     return consumer_->GetTunnelHandle();
547 }
548 
SetBufferHold(bool hold)549 void ConsumerSurface::SetBufferHold(bool hold)
550 {
551     if (consumer_ == nullptr) {
552         return;
553     }
554     consumer_->SetBufferHold(hold);
555 }
556 
SetPresentTimestamp(uint32_t sequence,const GraphicPresentTimestamp & timestamp)557 GSError ConsumerSurface::SetPresentTimestamp(uint32_t sequence, const GraphicPresentTimestamp& timestamp)
558 {
559     if (consumer_ == nullptr || timestamp.type == GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_UNSUPPORTED) {
560         return GSERROR_INVALID_ARGUMENTS;
561     }
562     return consumer_->SetPresentTimestamp(sequence, timestamp);
563 }
564 
ConsumerRequestCpuAccess(bool on)565 void ConsumerSurface::ConsumerRequestCpuAccess(bool on)
566 {
567     if (consumer_ == nullptr) {
568         return;
569     }
570     consumer_->ConsumerRequestCpuAccess(on);
571 }
572 
GetTransformHint() const573 GraphicTransformType ConsumerSurface::GetTransformHint() const
574 {
575     if (producer_ == nullptr) {
576         return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
577     }
578     GraphicTransformType transformHint = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
579     if (producer_->GetTransformHint(transformHint) != GSERROR_OK) {
580         BLOGE("GetTransformHint failed, uniqueId: %{public}" PRIu64 ".", uniqueId_);
581         return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
582     }
583     return transformHint;
584 }
585 
SetTransformHint(GraphicTransformType transformHint)586 GSError ConsumerSurface::SetTransformHint(GraphicTransformType transformHint)
587 {
588     if (producer_ == nullptr) {
589         return GSERROR_INVALID_ARGUMENTS;
590     }
591     return producer_->SetTransformHint(transformHint, 0); // broadcast to all producerSurfaces
592 }
593 
SetSurfaceSourceType(OHSurfaceSource sourceType)594 GSError ConsumerSurface::SetSurfaceSourceType(OHSurfaceSource sourceType)
595 {
596     if (producer_ == nullptr) {
597         return GSERROR_INVALID_ARGUMENTS;
598     }
599     return producer_->SetSurfaceSourceType(sourceType);
600 }
601 
GetSurfaceSourceType() const602 OHSurfaceSource ConsumerSurface::GetSurfaceSourceType() const
603 {
604     if (producer_ == nullptr) {
605         return OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
606     }
607     OHSurfaceSource sourceType = OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
608     if (producer_->GetSurfaceSourceType(sourceType) != GSERROR_OK) {
609         BLOGE("GetSurfaceSourceType failed, uniqueId: %{public}" PRIu64 ".", uniqueId_);
610         return OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
611     }
612     return sourceType;
613 }
614 
SetSurfaceAppFrameworkType(std::string appFrameworkType)615 GSError ConsumerSurface::SetSurfaceAppFrameworkType(std::string appFrameworkType)
616 {
617     if (producer_ == nullptr) {
618         return GSERROR_INVALID_ARGUMENTS;
619     }
620     return producer_->SetSurfaceAppFrameworkType(appFrameworkType);
621 }
622 
GetSurfaceAppFrameworkType() const623 std::string ConsumerSurface::GetSurfaceAppFrameworkType() const
624 {
625     if (producer_ == nullptr) {
626         return "";
627     }
628     std::string appFrameworkType = "";
629     if (producer_->GetSurfaceAppFrameworkType(appFrameworkType) != GSERROR_OK) {
630         BLOGE("GetSurfaceAppFrameworkType failed, uniqueId: %{public}" PRIu64 ".", uniqueId_);
631         return "";
632     }
633     return appFrameworkType;
634 }
635 
GetHdrWhitePointBrightness() const636 float ConsumerSurface::GetHdrWhitePointBrightness() const
637 {
638     if (consumer_ == nullptr) {
639         return 0;
640     }
641     return consumer_->GetHdrWhitePointBrightness();
642 }
643 
GetSdrWhitePointBrightness() const644 float ConsumerSurface::GetSdrWhitePointBrightness() const
645 {
646     if (consumer_ == nullptr) {
647         return 0;
648     }
649     return consumer_->GetSdrWhitePointBrightness();
650 }
651 
GetSurfaceBufferTransformType(sptr<SurfaceBuffer> buffer,GraphicTransformType * transformType)652 GSError ConsumerSurface::GetSurfaceBufferTransformType(sptr<SurfaceBuffer> buffer,
653     GraphicTransformType *transformType)
654 {
655     if (buffer == nullptr || transformType == nullptr) {
656         return SURFACE_ERROR_INVALID_PARAM;
657     }
658     *transformType = buffer->GetSurfaceBufferTransform();
659     return GSERROR_OK;
660 }
661 
IsSurfaceBufferInCache(uint32_t seqNum,bool & isInCache)662 GSError ConsumerSurface::IsSurfaceBufferInCache(uint32_t seqNum, bool& isInCache)
663 {
664     if (consumer_ == nullptr) {
665         return SURFACE_ERROR_UNKOWN;
666     }
667     return consumer_->IsSurfaceBufferInCache(seqNum, isInCache);
668 }
669 
GetGlobalAlpha(int32_t & alpha)670 GSError ConsumerSurface::GetGlobalAlpha(int32_t &alpha)
671 {
672     if (consumer_ == nullptr) {
673         return SURFACE_ERROR_UNKOWN;
674     }
675     return consumer_->GetGlobalAlpha(alpha);
676 }
677 
GetAvailableBufferCount() const678 uint32_t ConsumerSurface::GetAvailableBufferCount() const
679 {
680     if (consumer_ == nullptr) {
681         return 0;
682     }
683     return consumer_->GetAvailableBufferCount();
684 }
685 
GetLastFlushedDesiredPresentTimeStamp(int64_t & lastFlushedDesiredPresentTimeStamp) const686 GSError ConsumerSurface::GetLastFlushedDesiredPresentTimeStamp(int64_t &lastFlushedDesiredPresentTimeStamp) const
687 {
688     if (consumer_ == nullptr) {
689         return SURFACE_ERROR_UNKOWN;
690     }
691     return consumer_->GetLastFlushedDesiredPresentTimeStamp(lastFlushedDesiredPresentTimeStamp);
692 }
693 
GetFrontDesiredPresentTimeStamp(int64_t & desiredPresentTimeStamp,bool & isAutoTimeStamp) const694 GSError ConsumerSurface::GetFrontDesiredPresentTimeStamp(int64_t &desiredPresentTimeStamp, bool &isAutoTimeStamp) const
695 {
696     if (consumer_ == nullptr) {
697         return SURFACE_ERROR_UNKOWN;
698     }
699     return consumer_->GetFrontDesiredPresentTimeStamp(desiredPresentTimeStamp, isAutoTimeStamp);
700 }
701 
GetBufferSupportFastCompose(bool & bufferSupportFastCompose)702 GSError ConsumerSurface::GetBufferSupportFastCompose(bool &bufferSupportFastCompose)
703 {
704     if (consumer_ == nullptr) {
705         return SURFACE_ERROR_UNKOWN;
706     }
707     if (isFirstBuffer_.load()) {
708         GSError ret = consumer_->GetBufferSupportFastCompose(bufferSupportFastCompose);
709         if (ret == GSERROR_OK) {
710             supportFastCompose_.store(bufferSupportFastCompose);
711             isFirstBuffer_.store(false);
712         }
713         return ret;
714     } else {
715         bufferSupportFastCompose = supportFastCompose_.load();
716         return GSERROR_OK;
717     }
718 }
719 
GetBufferCacheConfig(const sptr<SurfaceBuffer> & buffer,BufferRequestConfig & config)720 GSError ConsumerSurface::GetBufferCacheConfig(const sptr<SurfaceBuffer>& buffer, BufferRequestConfig& config)
721 {
722     if (buffer == nullptr) {
723         return GSERROR_INVALID_ARGUMENTS;
724     }
725     if (consumer_ == nullptr) {
726         return SURFACE_ERROR_UNKOWN;
727     }
728     return consumer_->GetBufferCacheConfig(buffer, config);
729 }
730 
GetCycleBuffersNumber(uint32_t & cycleBuffersNumber)731 GSError ConsumerSurface::GetCycleBuffersNumber(uint32_t& cycleBuffersNumber)
732 {
733     if (consumer_ == nullptr) {
734         return SURFACE_ERROR_UNKOWN;
735     }
736     return consumer_->GetCycleBuffersNumber(cycleBuffersNumber);
737 }
738 
GetFrameGravity(int32_t & frameGravity)739 GSError ConsumerSurface::GetFrameGravity(int32_t &frameGravity)
740 {
741     if (consumer_ == nullptr) {
742         return SURFACE_ERROR_UNKOWN;
743     }
744     return consumer_->GetFrameGravity(frameGravity);
745 }
746 
GetFixedRotation(int32_t & fixedRotation)747 GSError ConsumerSurface::GetFixedRotation(int32_t &fixedRotation)
748 {
749     if (consumer_ == nullptr) {
750         return SURFACE_ERROR_UNKOWN;
751     }
752     return consumer_->GetFixedRotation(fixedRotation);
753 }
754 
GetLastConsumeTime(int64_t & lastConsumeTime) const755 GSError ConsumerSurface::GetLastConsumeTime(int64_t &lastConsumeTime) const
756 {
757     if (consumer_ == nullptr) {
758         return SURFACE_ERROR_UNKOWN;
759     }
760     return consumer_->GetLastConsumeTime(lastConsumeTime);
761 }
762 
SetMaxQueueSize(uint32_t queueSize)763 GSError ConsumerSurface::SetMaxQueueSize(uint32_t queueSize)
764 {
765     if (consumer_ == nullptr) {
766         return SURFACE_ERROR_UNKOWN;
767     }
768     return consumer_->SetMaxQueueSize(queueSize);
769 }
GetMaxQueueSize(uint32_t & queueSize) const770 GSError ConsumerSurface::GetMaxQueueSize(uint32_t &queueSize) const
771 {
772     if (consumer_ == nullptr) {
773         return SURFACE_ERROR_UNKOWN;
774     }
775     return consumer_->GetMaxQueueSize(queueSize);
776 }
SetLppDrawSource(bool isShbSource,bool isRsSource)777 GSError ConsumerSurface::SetLppDrawSource(bool isShbSource, bool isRsSource)
778 {
779     if (consumer_ == nullptr) {
780         return SURFACE_ERROR_UNKOWN;
781     }
782     return consumer_->SetLppDrawSource(isShbSource, isRsSource);
783 }
784 
GetAlphaType(GraphicAlphaType & alphaType)785 GSError ConsumerSurface::GetAlphaType(GraphicAlphaType &alphaType)
786 {
787     if (consumer_ == nullptr) {
788         return SURFACE_ERROR_UNKOWN;
789     }
790     return consumer_->GetAlphaType(alphaType);
791 }
792 
SetIsPriorityAlloc(bool isPriorityAlloc)793 GSError ConsumerSurface::SetIsPriorityAlloc(bool isPriorityAlloc)
794 {
795     if (consumer_ == nullptr) {
796         return SURFACE_ERROR_UNKOWN;
797     }
798     return consumer_->SetIsPriorityAlloc(isPriorityAlloc);
799 }
800 } // namespace OHOS
801