• 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)102 GSError ConsumerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
103                                        int64_t& timestamp, std::vector<Rect>& damages)
104 {
105     if (consumer_ == nullptr) {
106         return GSERROR_INVALID_ARGUMENTS;
107     }
108     return consumer_->AcquireBuffer(buffer, fence, timestamp, damages);
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 
ReleaseBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence)120 GSError ConsumerSurface::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence)
121 {
122     if (buffer == nullptr || consumer_ == nullptr) {
123         return GSERROR_INVALID_ARGUMENTS;
124     }
125     return consumer_->ReleaseBuffer(buffer, fence);
126 }
127 
AcquireBuffer(sptr<SurfaceBuffer> & buffer,int32_t & fence,int64_t & timestamp,Rect & damage)128 GSError ConsumerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, int32_t& fence,
129                                        int64_t& timestamp, Rect& damage)
130 {
131     sptr<SyncFence> syncFence = SyncFence::InvalidFence();
132     auto ret = AcquireBuffer(buffer, syncFence, timestamp, damage);
133     if (ret != GSERROR_OK) {
134         fence = -1;
135         return ret;
136     }
137     fence = syncFence->Dup();
138     return GSERROR_OK;
139 }
140 
ReleaseBuffer(sptr<SurfaceBuffer> & buffer,int32_t fence)141 GSError ConsumerSurface::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, int32_t fence)
142 {
143     sptr<SyncFence> syncFence = new SyncFence(fence);
144     return ReleaseBuffer(buffer, syncFence);
145 }
146 
AttachBufferToQueue(sptr<SurfaceBuffer> buffer)147 GSError ConsumerSurface::AttachBufferToQueue(sptr<SurfaceBuffer> buffer)
148 {
149     if (buffer == nullptr || consumer_ == nullptr) {
150         return GSERROR_INVALID_ARGUMENTS;
151     }
152     buffer->SetConsumerAttachBufferFlag(true);
153     return consumer_->AttachBufferToQueue(buffer);
154 }
155 
DetachBufferFromQueue(sptr<SurfaceBuffer> buffer,bool isReserveSlot)156 GSError ConsumerSurface::DetachBufferFromQueue(sptr<SurfaceBuffer> buffer, bool isReserveSlot)
157 {
158     if (buffer == nullptr || consumer_ == nullptr) {
159         return GSERROR_INVALID_ARGUMENTS;
160     }
161     buffer->SetConsumerAttachBufferFlag(false);
162     return consumer_->DetachBufferFromQueue(buffer, isReserveSlot);
163 }
164 
AttachBuffer(sptr<SurfaceBuffer> & buffer)165 GSError ConsumerSurface::AttachBuffer(sptr<SurfaceBuffer>& buffer)
166 {
167     if (buffer == nullptr || consumer_ == nullptr) {
168         return GSERROR_INVALID_ARGUMENTS;
169     }
170     return consumer_->AttachBuffer(buffer);
171 }
172 
AttachBuffer(sptr<SurfaceBuffer> & buffer,int32_t timeOut)173 GSError ConsumerSurface::AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut)
174 {
175     if (buffer == nullptr || consumer_ == nullptr) {
176         return GSERROR_INVALID_ARGUMENTS;
177     }
178     return consumer_->AttachBuffer(buffer, timeOut);
179 }
180 
DetachBuffer(sptr<SurfaceBuffer> & buffer)181 GSError ConsumerSurface::DetachBuffer(sptr<SurfaceBuffer>& buffer)
182 {
183     if (buffer == nullptr || consumer_ == nullptr) {
184         return GSERROR_INVALID_ARGUMENTS;
185     }
186     return consumer_->DetachBuffer(buffer);
187 }
188 
RegisterSurfaceDelegator(sptr<IRemoteObject> client)189 GSError ConsumerSurface::RegisterSurfaceDelegator(sptr<IRemoteObject> client)
190 {
191     if (client == nullptr || consumer_ == nullptr) {
192         return GSERROR_INVALID_ARGUMENTS;
193     }
194     return consumer_->RegisterSurfaceDelegator(client, this);
195 }
196 
QueryIfBufferAvailable()197 bool ConsumerSurface::QueryIfBufferAvailable()
198 {
199     if (consumer_ == nullptr) {
200         return false;
201     }
202     return consumer_->QueryIfBufferAvailable();
203 }
204 
GetQueueSize()205 uint32_t ConsumerSurface::GetQueueSize()
206 {
207     if (producer_ == nullptr) {
208         return 0;
209     }
210     return producer_->GetQueueSize();
211 }
212 
SetQueueSize(uint32_t queueSize)213 GSError ConsumerSurface::SetQueueSize(uint32_t queueSize)
214 {
215     if (producer_ == nullptr) {
216         return GSERROR_INVALID_ARGUMENTS;
217     }
218     return producer_->SetQueueSize(queueSize);
219 }
220 
GetName()221 const std::string& ConsumerSurface::GetName()
222 {
223     return name_;
224 }
225 
SetDefaultWidthAndHeight(int32_t width,int32_t height)226 GSError ConsumerSurface::SetDefaultWidthAndHeight(int32_t width, int32_t height)
227 {
228     if (consumer_ == nullptr) {
229         return GSERROR_INVALID_ARGUMENTS;
230     }
231     return consumer_->SetDefaultWidthAndHeight(width, height);
232 }
233 
GetDefaultWidth()234 int32_t ConsumerSurface::GetDefaultWidth()
235 {
236     if (producer_ == nullptr) {
237         return -1;
238     }
239     return producer_->GetDefaultWidth();
240 }
241 
GetDefaultHeight()242 int32_t ConsumerSurface::GetDefaultHeight()
243 {
244     if (producer_ == nullptr) {
245         return -1;
246     }
247     return producer_->GetDefaultHeight();
248 }
249 
SetDefaultUsage(uint64_t usage)250 GSError ConsumerSurface::SetDefaultUsage(uint64_t usage)
251 {
252     if (consumer_ == nullptr) {
253         return GSERROR_INVALID_ARGUMENTS;
254     }
255     return consumer_->SetDefaultUsage(usage);
256 }
257 
GetDefaultUsage()258 uint64_t ConsumerSurface::GetDefaultUsage()
259 {
260     if (producer_ == nullptr) {
261         return 0;
262     }
263     return producer_->GetDefaultUsage();
264 }
265 
SetUserData(const std::string & key,const std::string & val)266 GSError ConsumerSurface::SetUserData(const std::string& key, const std::string& val)
267 {
268     std::lock_guard<std::mutex> lockGuard(lockMutex_);
269     if (userData_.size() >= SURFACE_MAX_USER_DATA_COUNT) {
270         BLOGE("userData_ size(%{public}zu) out, uniqueId: %{public}" PRIu64 ".", userData_.size(), uniqueId_);
271         return GSERROR_OUT_OF_RANGE;
272     }
273 
274     auto iterUserData = userData_.find(key);
275     if (iterUserData != userData_.end() && iterUserData->second == val) {
276         BLOGE("not find key:%{public}s, val:%{public}s exist, uniqueId: %{public}" PRIu64 ".",
277             key.c_str(), val.c_str(), uniqueId_);
278         return GSERROR_API_FAILED;
279     }
280 
281     userData_[key] = val;
282     auto iter = onUserDataChange_.begin();
283     while (iter != onUserDataChange_.end()) {
284         if (iter->second != nullptr) {
285             iter->second(key, val);
286         }
287         iter++;
288     }
289 
290     return GSERROR_OK;
291 }
292 
GetUserData(const std::string & key)293 std::string ConsumerSurface::GetUserData(const std::string& key)
294 {
295     std::lock_guard<std::mutex> lockGuard(lockMutex_);
296     if (userData_.find(key) != userData_.end()) {
297         return userData_[key];
298     }
299 
300     return "";
301 }
302 
RegisterConsumerListener(sptr<IBufferConsumerListener> & listener)303 GSError ConsumerSurface::RegisterConsumerListener(sptr<IBufferConsumerListener>& listener)
304 {
305     if (listener == nullptr || consumer_ == nullptr) {
306         return GSERROR_INVALID_ARGUMENTS;
307     }
308     return consumer_->RegisterConsumerListener(listener);
309 }
310 
RegisterConsumerListener(IBufferConsumerListenerClazz * listener)311 GSError ConsumerSurface::RegisterConsumerListener(IBufferConsumerListenerClazz *listener)
312 {
313     if (listener == nullptr || consumer_ == nullptr) {
314         return GSERROR_INVALID_ARGUMENTS;
315     }
316     return consumer_->RegisterConsumerListener(listener);
317 }
318 
RegisterReleaseListener(OnReleaseFunc func)319 GSError ConsumerSurface::RegisterReleaseListener(OnReleaseFunc func)
320 {
321     if (func == nullptr || consumer_ == nullptr) {
322         return GSERROR_INVALID_ARGUMENTS;
323     }
324     return consumer_->RegisterReleaseListener(func);
325 }
326 
RegisterDeleteBufferListener(OnDeleteBufferFunc func,bool isForUniRedraw)327 GSError ConsumerSurface::RegisterDeleteBufferListener(OnDeleteBufferFunc func, bool isForUniRedraw)
328 {
329     if (func == nullptr || consumer_ == nullptr) {
330         return GSERROR_INVALID_ARGUMENTS;
331     }
332     if (isForUniRedraw) {
333         bool hasRegistercallBackForRedraw = false;
334         if (!hasRegistercallBackForRedraw_.compare_exchange_strong(hasRegistercallBackForRedraw, true)) {
335             return GSERROR_OK;
336         }
337     } else {
338         bool hasRegistercallBackForRT = false;
339         if (!hasRegistercallBackForRT_.compare_exchange_strong(hasRegistercallBackForRT, true)) {
340             return GSERROR_OK;
341         }
342     }
343     return consumer_->RegisterDeleteBufferListener(func, isForUniRedraw);
344 }
345 
UnregisterConsumerListener()346 GSError ConsumerSurface::UnregisterConsumerListener()
347 {
348     if (consumer_ == nullptr) {
349         return GSERROR_INVALID_ARGUMENTS;
350     }
351     return consumer_->UnregisterConsumerListener();
352 }
353 
RegisterUserDataChangeListener(const std::string & funcName,OnUserDataChangeFunc func)354 GSError ConsumerSurface::RegisterUserDataChangeListener(const std::string& funcName, OnUserDataChangeFunc func)
355 {
356     if (func == nullptr) {
357         return GSERROR_INVALID_ARGUMENTS;
358     }
359     std::lock_guard<std::mutex> lockGuard(lockMutex_);
360     if (onUserDataChange_.find(funcName) != onUserDataChange_.end()) {
361         BLOGD("already register func: %{public}s, uniqueId: %{public}" PRIu64 ".",
362             funcName.c_str(), uniqueId_);
363         return GSERROR_INVALID_ARGUMENTS;
364     }
365 
366     onUserDataChange_[funcName] = func;
367     return GSERROR_OK;
368 }
369 
UnRegisterUserDataChangeListener(const std::string & funcName)370 GSError ConsumerSurface::UnRegisterUserDataChangeListener(const std::string& funcName)
371 {
372     std::lock_guard<std::mutex> lockGuard(lockMutex_);
373     if (onUserDataChange_.erase(funcName) == 0) {
374         BLOGD("no register funcName: %{public}s, uniqueId: %{public}" PRIu64 ".",
375             funcName.c_str(), uniqueId_);
376         return GSERROR_INVALID_ARGUMENTS;
377     }
378 
379     return GSERROR_OK;
380 }
381 
ClearUserDataChangeListener()382 GSError ConsumerSurface::ClearUserDataChangeListener()
383 {
384     std::lock_guard<std::mutex> lockGuard(lockMutex_);
385     onUserDataChange_.clear();
386     return GSERROR_OK;
387 }
388 
GoBackground()389 GSError ConsumerSurface::GoBackground()
390 {
391     if (consumer_ == nullptr) {
392         return GSERROR_INVALID_ARGUMENTS;
393     }
394     if (producer_ != nullptr) {
395         BLOGD("GoBackground, uniqueId: %{public}" PRIu64 ".", uniqueId_);
396     }
397     return consumer_->GoBackground();
398 }
399 
GetUniqueId() const400 uint64_t ConsumerSurface::GetUniqueId() const
401 {
402     if (producer_ == nullptr) {
403         return 0;
404     }
405     return producer_->GetUniqueId();
406 }
407 
Dump(std::string & result) const408 void ConsumerSurface::Dump(std::string& result) const
409 {
410     if (consumer_ == nullptr) {
411         return;
412     }
413     return consumer_->Dump(result);
414 }
415 
SetTransform(GraphicTransformType transform)416 GSError ConsumerSurface::SetTransform(GraphicTransformType transform)
417 {
418     if (producer_ == nullptr) {
419         return GSERROR_INVALID_ARGUMENTS;
420     }
421     return producer_->SetTransform(transform);
422 }
423 
GetTransform() const424 GraphicTransformType ConsumerSurface::GetTransform() const
425 {
426     if (consumer_ == nullptr) {
427         return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
428     }
429     return consumer_->GetTransform();
430 }
431 
SetScalingMode(uint32_t sequence,ScalingMode scalingMode)432 GSError ConsumerSurface::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
433 {
434     if (producer_ == nullptr || scalingMode < ScalingMode::SCALING_MODE_FREEZE ||
435         scalingMode > ScalingMode::SCALING_MODE_SCALE_FIT) {
436         return GSERROR_INVALID_ARGUMENTS;
437     }
438     return producer_->SetScalingMode(sequence, scalingMode);
439 }
440 
SetScalingMode(ScalingMode scalingMode)441 GSError ConsumerSurface::SetScalingMode(ScalingMode scalingMode)
442 {
443     if (producer_ == nullptr || scalingMode < ScalingMode::SCALING_MODE_FREEZE ||
444         scalingMode > ScalingMode::SCALING_MODE_SCALE_FIT) {
445         return GSERROR_INVALID_ARGUMENTS;
446     }
447     return producer_->SetScalingMode(scalingMode);
448 }
449 
GetScalingMode(uint32_t sequence,ScalingMode & scalingMode)450 GSError ConsumerSurface::GetScalingMode(uint32_t sequence, ScalingMode& scalingMode)
451 {
452     if (consumer_ == nullptr) {
453         return GSERROR_INVALID_ARGUMENTS;
454     }
455     return consumer_->GetScalingMode(sequence, scalingMode);
456 }
457 
SetMetaData(uint32_t sequence,const std::vector<GraphicHDRMetaData> & metaData)458 GSError ConsumerSurface::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData>& metaData)
459 {
460     if (producer_ == nullptr || metaData.size() == 0) {
461         return GSERROR_INVALID_ARGUMENTS;
462     }
463     return producer_->SetMetaData(sequence, metaData);
464 }
465 
SetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)466 GSError ConsumerSurface::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
467                                         const std::vector<uint8_t>& metaData)
468 {
469     if (producer_ == nullptr || key < GraphicHDRMetadataKey::GRAPHIC_MATAKEY_RED_PRIMARY_X ||
470         key > GraphicHDRMetadataKey::GRAPHIC_MATAKEY_HDR_VIVID || metaData.size() == 0) {
471         return GSERROR_INVALID_ARGUMENTS;
472     }
473     return producer_->SetMetaDataSet(sequence, key, metaData);
474 }
475 
QueryMetaDataType(uint32_t sequence,HDRMetaDataType & type) const476 GSError ConsumerSurface::QueryMetaDataType(uint32_t sequence, HDRMetaDataType& type) const
477 {
478     if (consumer_ == nullptr) {
479         return GSERROR_INVALID_ARGUMENTS;
480     }
481     return consumer_->QueryMetaDataType(sequence, type);
482 }
483 
GetMetaData(uint32_t sequence,std::vector<GraphicHDRMetaData> & metaData) const484 GSError ConsumerSurface::GetMetaData(uint32_t sequence, std::vector<GraphicHDRMetaData>& metaData) const
485 {
486     if (consumer_ == nullptr) {
487         return GSERROR_INVALID_ARGUMENTS;
488     }
489     return consumer_->GetMetaData(sequence, metaData);
490 }
491 
GetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey & key,std::vector<uint8_t> & metaData) const492 GSError ConsumerSurface::GetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey& key,
493                                         std::vector<uint8_t>& metaData) const
494 {
495     if (consumer_ == nullptr) {
496         return GSERROR_INVALID_ARGUMENTS;
497     }
498     return consumer_->GetMetaDataSet(sequence, key, metaData);
499 }
500 
SetTunnelHandle(const GraphicExtDataHandle * handle)501 GSError ConsumerSurface::SetTunnelHandle(const GraphicExtDataHandle *handle)
502 {
503     if (producer_ == nullptr || handle == nullptr || handle->reserveInts == 0) {
504         return GSERROR_INVALID_ARGUMENTS;
505     }
506     return producer_->SetTunnelHandle(handle);
507 }
508 
GetTunnelHandle() const509 sptr<SurfaceTunnelHandle> ConsumerSurface::GetTunnelHandle() const
510 {
511     if (consumer_ == nullptr) {
512         return nullptr;
513     }
514     return consumer_->GetTunnelHandle();
515 }
516 
SetBufferHold(bool hold)517 void ConsumerSurface::SetBufferHold(bool hold)
518 {
519     if (consumer_ == nullptr) {
520         return;
521     }
522     consumer_->SetBufferHold(hold);
523 }
524 
SetPresentTimestamp(uint32_t sequence,const GraphicPresentTimestamp & timestamp)525 GSError ConsumerSurface::SetPresentTimestamp(uint32_t sequence, const GraphicPresentTimestamp& timestamp)
526 {
527     if (consumer_ == nullptr || timestamp.type == GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_UNSUPPORTED) {
528         return GSERROR_INVALID_ARGUMENTS;
529     }
530     return consumer_->SetPresentTimestamp(sequence, timestamp);
531 }
532 
ConsumerRequestCpuAccess(bool on)533 void ConsumerSurface::ConsumerRequestCpuAccess(bool on)
534 {
535     if (consumer_ == nullptr) {
536         return;
537     }
538     consumer_->ConsumerRequestCpuAccess(on);
539 }
540 
GetTransformHint() const541 GraphicTransformType ConsumerSurface::GetTransformHint() const
542 {
543     if (producer_ == nullptr) {
544         return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
545     }
546     GraphicTransformType transformHint = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
547     if (producer_->GetTransformHint(transformHint) != GSERROR_OK) {
548         BLOGE("GetTransformHint failed, uniqueId: %{public}" PRIu64 ".", uniqueId_);
549         return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
550     }
551     return transformHint;
552 }
553 
SetTransformHint(GraphicTransformType transformHint)554 GSError ConsumerSurface::SetTransformHint(GraphicTransformType transformHint)
555 {
556     if (producer_ == nullptr) {
557         return GSERROR_INVALID_ARGUMENTS;
558     }
559     return producer_->SetTransformHint(transformHint, 0); // broadcast to all producerSurfaces
560 }
561 
SetSurfaceSourceType(OHSurfaceSource sourceType)562 GSError ConsumerSurface::SetSurfaceSourceType(OHSurfaceSource sourceType)
563 {
564     if (producer_ == nullptr) {
565         return GSERROR_INVALID_ARGUMENTS;
566     }
567     return producer_->SetSurfaceSourceType(sourceType);
568 }
569 
GetSurfaceSourceType() const570 OHSurfaceSource ConsumerSurface::GetSurfaceSourceType() const
571 {
572     if (producer_ == nullptr) {
573         return OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
574     }
575     OHSurfaceSource sourceType = OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
576     if (producer_->GetSurfaceSourceType(sourceType) != GSERROR_OK) {
577         BLOGE("GetSurfaceSourceType failed, uniqueId: %{public}" PRIu64 ".", uniqueId_);
578         return OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
579     }
580     return sourceType;
581 }
582 
SetSurfaceAppFrameworkType(std::string appFrameworkType)583 GSError ConsumerSurface::SetSurfaceAppFrameworkType(std::string appFrameworkType)
584 {
585     if (producer_ == nullptr) {
586         return GSERROR_INVALID_ARGUMENTS;
587     }
588     return producer_->SetSurfaceAppFrameworkType(appFrameworkType);
589 }
590 
GetSurfaceAppFrameworkType() const591 std::string ConsumerSurface::GetSurfaceAppFrameworkType() const
592 {
593     if (producer_ == nullptr) {
594         return "";
595     }
596     std::string appFrameworkType = "";
597     if (producer_->GetSurfaceAppFrameworkType(appFrameworkType) != GSERROR_OK) {
598         BLOGE("GetSurfaceAppFrameworkType failed, uniqueId: %{public}" PRIu64 ".", uniqueId_);
599         return "";
600     }
601     return appFrameworkType;
602 }
603 
GetHdrWhitePointBrightness() const604 float ConsumerSurface::GetHdrWhitePointBrightness() const
605 {
606     if (consumer_ == nullptr) {
607         return 0;
608     }
609     return consumer_->GetHdrWhitePointBrightness();
610 }
611 
GetSdrWhitePointBrightness() const612 float ConsumerSurface::GetSdrWhitePointBrightness() const
613 {
614     if (consumer_ == nullptr) {
615         return 0;
616     }
617     return consumer_->GetSdrWhitePointBrightness();
618 }
619 
GetSurfaceBufferTransformType(sptr<SurfaceBuffer> buffer,GraphicTransformType * transformType)620 GSError ConsumerSurface::GetSurfaceBufferTransformType(sptr<SurfaceBuffer> buffer,
621     GraphicTransformType *transformType)
622 {
623     if (buffer == nullptr || transformType == nullptr) {
624         return SURFACE_ERROR_INVALID_PARAM;
625     }
626     *transformType = buffer->GetSurfaceBufferTransform();
627     return GSERROR_OK;
628 }
629 
IsSurfaceBufferInCache(uint32_t seqNum,bool & isInCache)630 GSError ConsumerSurface::IsSurfaceBufferInCache(uint32_t seqNum, bool& isInCache)
631 {
632     if (consumer_ == nullptr) {
633         return SURFACE_ERROR_UNKOWN;
634     }
635     return consumer_->IsSurfaceBufferInCache(seqNum, isInCache);
636 }
637 
GetGlobalAlpha(int32_t & alpha)638 GSError ConsumerSurface::GetGlobalAlpha(int32_t &alpha)
639 {
640     if (consumer_ == nullptr) {
641         return SURFACE_ERROR_UNKOWN;
642     }
643     return consumer_->GetGlobalAlpha(alpha);
644 }
645 
GetAvailableBufferCount() const646 uint32_t ConsumerSurface::GetAvailableBufferCount() const
647 {
648     if (consumer_ == nullptr) {
649         return 0;
650     }
651     return consumer_->GetAvailableBufferCount();
652 }
653 
GetLastFlushedDesiredPresentTimeStamp(int64_t & lastFlushedDesiredPresentTimeStamp) const654 GSError ConsumerSurface::GetLastFlushedDesiredPresentTimeStamp(int64_t &lastFlushedDesiredPresentTimeStamp) const
655 {
656     if (consumer_ == nullptr) {
657         return SURFACE_ERROR_UNKOWN;
658     }
659     return consumer_->GetLastFlushedDesiredPresentTimeStamp(lastFlushedDesiredPresentTimeStamp);
660 }
661 
GetBufferSupportFastCompose(bool & bufferSupportFastCompose)662 GSError ConsumerSurface::GetBufferSupportFastCompose(bool &bufferSupportFastCompose)
663 {
664     if (consumer_ == nullptr) {
665         return SURFACE_ERROR_UNKOWN;
666     }
667     if (isFirstBuffer_.load()) {
668         GSError ret = consumer_->GetBufferSupportFastCompose(bufferSupportFastCompose);
669         if (ret == GSERROR_OK) {
670             supportFastCompose_.store(bufferSupportFastCompose);
671             isFirstBuffer_.store(false);
672         }
673         return ret;
674     } else {
675         bufferSupportFastCompose = supportFastCompose_.load();
676         return GSERROR_OK;
677     }
678 }
679 
GetBufferCacheConfig(const sptr<SurfaceBuffer> & buffer,BufferRequestConfig & config)680 GSError ConsumerSurface::GetBufferCacheConfig(const sptr<SurfaceBuffer>& buffer, BufferRequestConfig& config)
681 {
682     if (buffer == nullptr) {
683         return GSERROR_INVALID_ARGUMENTS;
684     }
685     if (consumer_ == nullptr) {
686         return SURFACE_ERROR_UNKOWN;
687     }
688     return consumer_->GetBufferCacheConfig(buffer, config);
689 }
690 
GetCycleBuffersNumber(uint32_t & cycleBuffersNumber)691 GSError ConsumerSurface::GetCycleBuffersNumber(uint32_t& cycleBuffersNumber)
692 {
693     if (consumer_ == nullptr) {
694         return SURFACE_ERROR_UNKOWN;
695     }
696     return consumer_->GetCycleBuffersNumber(cycleBuffersNumber);
697 }
698 
GetLastConsumeTime(int64_t & lastConsumeTime) const699 GSError ConsumerSurface::GetLastConsumeTime(int64_t &lastConsumeTime) const
700 {
701     if (consumer_ == nullptr) {
702         return SURFACE_ERROR_UNKOWN;
703     }
704     return consumer_->GetLastConsumeTime(lastConsumeTime);
705 }
706 } // namespace OHOS
707