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