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