• 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 {
25 namespace {
26 constexpr int32_t CONSUMER_REF_COUNT_IN_CONSUMER_SURFACE = 1;
27 constexpr int32_t PRODUCER_REF_COUNT_IN_CONSUMER_SURFACE = 2;
28 }
29 
CreateSurfaceAsConsumer(std::string name,bool isShared)30 sptr<Surface> Surface::CreateSurfaceAsConsumer(std::string name, bool isShared)
31 {
32     sptr<ConsumerSurface> surf = new ConsumerSurface(name, isShared);
33     if (!surf || surf->Init() != GSERROR_OK) {
34         BLOGE("Failure, Reason: consumer surf init failed");
35         return nullptr;
36     }
37     return surf;
38 }
39 
Create(std::string name,bool isShared)40 sptr<IConsumerSurface> IConsumerSurface::Create(std::string name, bool isShared)
41 {
42     sptr<ConsumerSurface> surf = new ConsumerSurface(name, isShared);
43     if (!surf || surf->Init() != GSERROR_OK) {
44         BLOGE("Failure, Reason: consumer surf init failed");
45         return nullptr;
46     }
47     return surf;
48 }
49 
ConsumerSurface(const std::string & name,bool isShared)50 ConsumerSurface::ConsumerSurface(const std::string &name, bool isShared)
51     : name_(name), isShared_(isShared)
52 {
53     BLOGND("ctor");
54     consumer_ = nullptr;
55     producer_ = nullptr;
56 }
57 
~ConsumerSurface()58 ConsumerSurface::~ConsumerSurface()
59 {
60     BLOGND("dtor");
61     if (consumer_->GetSptrRefCount() > CONSUMER_REF_COUNT_IN_CONSUMER_SURFACE ||
62         producer_->GetSptrRefCount() > PRODUCER_REF_COUNT_IN_CONSUMER_SURFACE) {
63         BLOGNE("Wrong SptrRefCount! Queue Id:%{public}" PRIu64 " consumer_:%{public}d producer_:%{public}d",
64             producer_->GetUniqueId(), consumer_->GetSptrRefCount(), producer_->GetSptrRefCount());
65     }
66     consumer_->OnConsumerDied();
67     producer_->SetStatus(false);
68     consumer_ = nullptr;
69     producer_ = nullptr;
70 }
71 
Init()72 GSError ConsumerSurface::Init()
73 {
74     sptr<BufferQueue> queue_ = new BufferQueue(name_, isShared_);
75     GSError ret = queue_->Init();
76     if (ret != GSERROR_OK) {
77         BLOGN_FAILURE("queue init failed");
78         return ret;
79     }
80 
81     producer_ = new BufferQueueProducer(queue_);
82     consumer_ = new BufferQueueConsumer(queue_);
83     return GSERROR_OK;
84 }
85 
IsConsumer() const86 bool ConsumerSurface::IsConsumer() const
87 {
88     return true;
89 }
90 
GetProducer() const91 sptr<IBufferProducer> ConsumerSurface::GetProducer() const
92 {
93     return producer_;
94 }
95 
RequestBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,BufferRequestConfig & config)96 GSError ConsumerSurface::RequestBuffer(sptr<SurfaceBuffer>& buffer,
97                                        sptr<SyncFence>& fence, BufferRequestConfig &config)
98 {
99     return GSERROR_NOT_SUPPORT;
100 }
FlushBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence,BufferFlushConfig & config)101 GSError ConsumerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer,
102                                      const sptr<SyncFence>& fence, BufferFlushConfig &config)
103 {
104     return GSERROR_NOT_SUPPORT;
105 }
106 
FlushBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence,BufferFlushConfigWithDamages & config)107 GSError ConsumerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence,
108                                      BufferFlushConfigWithDamages &config)
109 {
110     return GSERROR_NOT_SUPPORT;
111 }
112 
GetLastFlushedBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16])113 GSError ConsumerSurface::GetLastFlushedBuffer(sptr<SurfaceBuffer>& buffer,
114     sptr<SyncFence>& fence, float matrix[16])
115 {
116     return GSERROR_NOT_SUPPORT;
117 }
118 
AcquireBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,int64_t & timestamp,Rect & damage)119 GSError ConsumerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
120                                        int64_t &timestamp, Rect &damage)
121 {
122     std::vector<Rect> damages;
123     GSError ret = AcquireBuffer(buffer, fence, timestamp, damages);
124     if (ret != GSERROR_OK) {
125         return ret;
126     }
127     if (damages.size() == 1) {
128         damage = damages[0];
129         return GSERROR_OK;
130     }
131     BLOGN_FAILURE("AcquireBuffer Success but the size of damages is %{public}zu is not 1, should Acquire damages.",
132         damages.size());
133     return GSERROR_INVALID_ARGUMENTS;
134 }
135 
AcquireBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,int64_t & timestamp,std::vector<Rect> & damages)136 GSError ConsumerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
137                                        int64_t &timestamp, std::vector<Rect> &damages)
138 {
139     return consumer_->AcquireBuffer(buffer, fence, timestamp, damages);
140 }
141 
ReleaseBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence)142 GSError ConsumerSurface::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence)
143 {
144     return consumer_->ReleaseBuffer(buffer, fence);
145 }
RequestBuffer(sptr<SurfaceBuffer> & buffer,int32_t & fence,BufferRequestConfig & config)146 GSError ConsumerSurface::RequestBuffer(sptr<SurfaceBuffer>& buffer,
147                                        int32_t &fence, BufferRequestConfig &config)
148 {
149     return GSERROR_NOT_SUPPORT;
150 }
151 
CancelBuffer(sptr<SurfaceBuffer> & buffer)152 GSError ConsumerSurface::CancelBuffer(sptr<SurfaceBuffer>& buffer)
153 {
154     return GSERROR_NOT_SUPPORT;
155 }
156 
FlushBuffer(sptr<SurfaceBuffer> & buffer,int32_t fence,BufferFlushConfig & config)157 GSError ConsumerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer,
158                                      int32_t fence, BufferFlushConfig &config)
159 {
160     return GSERROR_NOT_SUPPORT;
161 }
162 
AcquireBuffer(sptr<SurfaceBuffer> & buffer,int32_t & fence,int64_t & timestamp,Rect & damage)163 GSError ConsumerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, int32_t &fence,
164                                        int64_t &timestamp, Rect &damage)
165 {
166     sptr<SyncFence> syncFence = SyncFence::INVALID_FENCE;
167     auto ret = AcquireBuffer(buffer, syncFence, timestamp, damage);
168     if (ret != GSERROR_OK) {
169         fence = -1;
170         return ret;
171     }
172     fence = syncFence->Dup();
173     return GSERROR_OK;
174 }
175 
ReleaseBuffer(sptr<SurfaceBuffer> & buffer,int32_t fence)176 GSError ConsumerSurface::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, int32_t fence)
177 {
178     sptr<SyncFence> syncFence = new SyncFence(fence);
179     return ReleaseBuffer(buffer, syncFence);
180 }
181 
AttachBuffer(sptr<SurfaceBuffer> & buffer)182 GSError ConsumerSurface::AttachBuffer(sptr<SurfaceBuffer>& buffer)
183 {
184     if (consumer_ == nullptr) {
185         BLOGFE("AttachBuffer failed for nullptr consumer.");
186         return GSERROR_INVALID_ARGUMENTS;
187     }
188     return consumer_->AttachBuffer(buffer);
189 }
190 
AttachBuffer(sptr<SurfaceBuffer> & buffer,int32_t timeOut)191 GSError ConsumerSurface::AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut)
192 {
193     if (consumer_ == nullptr) {
194         BLOGFE("AttachBuffer failed for nullptr consumer.");
195         return GSERROR_INVALID_ARGUMENTS;
196     }
197     return consumer_->AttachBuffer(buffer, timeOut);
198 }
199 
DetachBuffer(sptr<SurfaceBuffer> & buffer)200 GSError ConsumerSurface::DetachBuffer(sptr<SurfaceBuffer>& buffer)
201 {
202     return consumer_->DetachBuffer(buffer);
203 }
204 
RegisterSurfaceDelegator(sptr<IRemoteObject> client)205 GSError ConsumerSurface::RegisterSurfaceDelegator(sptr<IRemoteObject> client)
206 {
207     if (consumer_ == nullptr) {
208         BLOGFE("RegisterSurfaceDelegator failed for nullptr consumer.");
209         return GSERROR_INVALID_ARGUMENTS;
210     }
211     return consumer_->RegisterSurfaceDelegator(client, this);
212 }
213 
QueryIfBufferAvailable()214 bool ConsumerSurface::QueryIfBufferAvailable()
215 {
216     return consumer_->QueryIfBufferAvailable();
217 }
218 
GetQueueSize()219 uint32_t ConsumerSurface::GetQueueSize()
220 {
221     return producer_->GetQueueSize();
222 }
223 
SetQueueSize(uint32_t queueSize)224 GSError ConsumerSurface::SetQueueSize(uint32_t queueSize)
225 {
226     return producer_->SetQueueSize(queueSize);
227 }
228 
GetName()229 const std::string& ConsumerSurface::GetName()
230 {
231     return name_;
232 }
233 
SetDefaultWidthAndHeight(int32_t width,int32_t height)234 GSError ConsumerSurface::SetDefaultWidthAndHeight(int32_t width, int32_t height)
235 {
236     return consumer_->SetDefaultWidthAndHeight(width, height);
237 }
238 
GetDefaultWidth()239 int32_t ConsumerSurface::GetDefaultWidth()
240 {
241     return producer_->GetDefaultWidth();
242 }
243 
GetDefaultHeight()244 int32_t ConsumerSurface::GetDefaultHeight()
245 {
246     return producer_->GetDefaultHeight();
247 }
248 
SetDefaultUsage(uint32_t usage)249 GSError ConsumerSurface::SetDefaultUsage(uint32_t usage)
250 {
251     return consumer_->SetDefaultUsage(usage);
252 }
253 
GetDefaultUsage()254 uint32_t ConsumerSurface::GetDefaultUsage()
255 {
256     return producer_->GetDefaultUsage();
257 }
258 
SetUserData(const std::string & key,const std::string & val)259 GSError ConsumerSurface::SetUserData(const std::string &key, const std::string &val)
260 {
261     if (userData_.size() >= SURFACE_MAX_USER_DATA_COUNT) {
262         return GSERROR_OUT_OF_RANGE;
263     }
264     userData_[key] = val;
265     return GSERROR_OK;
266 }
267 
GetUserData(const std::string & key)268 std::string ConsumerSurface::GetUserData(const std::string &key)
269 {
270     if (userData_.find(key) != userData_.end()) {
271         return userData_[key];
272     }
273 
274     return "";
275 }
276 
RegisterConsumerListener(sptr<IBufferConsumerListener> & listener)277 GSError ConsumerSurface::RegisterConsumerListener(sptr<IBufferConsumerListener>& listener)
278 {
279     return consumer_->RegisterConsumerListener(listener);
280 }
281 
RegisterConsumerListener(IBufferConsumerListenerClazz * listener)282 GSError ConsumerSurface::RegisterConsumerListener(IBufferConsumerListenerClazz *listener)
283 {
284     return consumer_->RegisterConsumerListener(listener);
285 }
286 
RegisterReleaseListener(OnReleaseFunc func)287 GSError ConsumerSurface::RegisterReleaseListener(OnReleaseFunc func)
288 {
289     return consumer_->RegisterReleaseListener(func);
290 }
291 
RegisterReleaseListener(OnReleaseFuncWithFence func)292 GSError ConsumerSurface::RegisterReleaseListener(OnReleaseFuncWithFence func)
293 {
294     return GSERROR_NOT_SUPPORT;
295 }
296 
UnRegisterReleaseListener()297 GSError ConsumerSurface::UnRegisterReleaseListener()
298 {
299     return GSERROR_OK;
300 }
301 
RegisterDeleteBufferListener(OnDeleteBufferFunc func,bool isForUniRedraw)302 GSError ConsumerSurface::RegisterDeleteBufferListener(OnDeleteBufferFunc func, bool isForUniRedraw)
303 {
304     return consumer_->RegisterDeleteBufferListener(func, isForUniRedraw);
305 }
306 
UnregisterConsumerListener()307 GSError ConsumerSurface::UnregisterConsumerListener()
308 {
309     return consumer_->UnregisterConsumerListener();
310 }
311 
CleanCache()312 GSError ConsumerSurface::CleanCache()
313 {
314     return GSERROR_NOT_SUPPORT;
315 }
316 
GoBackground()317 GSError ConsumerSurface::GoBackground()
318 {
319     BLOGND("Queue Id:%{public}" PRIu64 "", producer_->GetUniqueId());
320     return consumer_->GoBackground();
321 }
322 
GetUniqueId() const323 uint64_t ConsumerSurface::GetUniqueId() const
324 {
325     return producer_->GetUniqueId();
326 }
327 
Dump(std::string & result) const328 void ConsumerSurface::Dump(std::string &result) const
329 {
330     return consumer_->Dump(result);
331 }
332 
SetTransform(GraphicTransformType transform)333 GSError ConsumerSurface::SetTransform(GraphicTransformType transform)
334 {
335     return producer_->SetTransform(transform);
336 }
337 
GetTransform() const338 GraphicTransformType ConsumerSurface::GetTransform() const
339 {
340     return consumer_->GetTransform();
341 }
342 
IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> & infos,std::vector<bool> & supporteds)343 GSError ConsumerSurface::IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> &infos,
344                                           std::vector<bool> &supporteds)
345 {
346     return GSERROR_NOT_SUPPORT;
347 }
348 
Disconnect()349 GSError ConsumerSurface::Disconnect()
350 {
351     return GSERROR_NOT_SUPPORT;
352 }
353 
SetScalingMode(uint32_t sequence,ScalingMode scalingMode)354 GSError ConsumerSurface::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
355 {
356     if (scalingMode < ScalingMode::SCALING_MODE_FREEZE ||
357         scalingMode > ScalingMode::SCALING_MODE_NO_SCALE_CROP) {
358         return GSERROR_INVALID_ARGUMENTS;
359     }
360     return producer_->SetScalingMode(sequence, scalingMode);
361 }
362 
GetScalingMode(uint32_t sequence,ScalingMode & scalingMode)363 GSError ConsumerSurface::GetScalingMode(uint32_t sequence, ScalingMode &scalingMode)
364 {
365     return consumer_->GetScalingMode(sequence, scalingMode);
366 }
367 
SetMetaData(uint32_t sequence,const std::vector<GraphicHDRMetaData> & metaData)368 GSError ConsumerSurface::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData> &metaData)
369 {
370     if (metaData.size() == 0) {
371         return GSERROR_INVALID_ARGUMENTS;
372     }
373     return producer_->SetMetaData(sequence, metaData);
374 }
375 
SetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)376 GSError ConsumerSurface::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
377                                         const std::vector<uint8_t> &metaData)
378 {
379     if (key < GraphicHDRMetadataKey::GRAPHIC_MATAKEY_RED_PRIMARY_X ||
380         key > GraphicHDRMetadataKey::GRAPHIC_MATAKEY_HDR_VIVID || metaData.size() == 0) {
381         return GSERROR_INVALID_ARGUMENTS;
382     }
383     return producer_->SetMetaDataSet(sequence, key, metaData);
384 }
385 
QueryMetaDataType(uint32_t sequence,HDRMetaDataType & type) const386 GSError ConsumerSurface::QueryMetaDataType(uint32_t sequence, HDRMetaDataType &type) const
387 {
388     return consumer_->QueryMetaDataType(sequence, type);
389 }
390 
GetMetaData(uint32_t sequence,std::vector<GraphicHDRMetaData> & metaData) const391 GSError ConsumerSurface::GetMetaData(uint32_t sequence, std::vector<GraphicHDRMetaData> &metaData) const
392 {
393     return consumer_->GetMetaData(sequence, metaData);
394 }
395 
GetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey & key,std::vector<uint8_t> & metaData) const396 GSError ConsumerSurface::GetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey &key,
397                                         std::vector<uint8_t> &metaData) const
398 {
399     return consumer_->GetMetaDataSet(sequence, key, metaData);
400 }
401 
SetTunnelHandle(const GraphicExtDataHandle * handle)402 GSError ConsumerSurface::SetTunnelHandle(const GraphicExtDataHandle *handle)
403 {
404     if (handle == nullptr || handle->reserveInts == 0) {
405         return GSERROR_INVALID_ARGUMENTS;
406     }
407     return producer_->SetTunnelHandle(handle);
408 }
409 
GetTunnelHandle() const410 sptr<SurfaceTunnelHandle> ConsumerSurface::GetTunnelHandle() const
411 {
412     return consumer_->GetTunnelHandle();
413 }
414 
SetPresentTimestamp(uint32_t sequence,const GraphicPresentTimestamp & timestamp)415 GSError ConsumerSurface::SetPresentTimestamp(uint32_t sequence, const GraphicPresentTimestamp &timestamp)
416 {
417     if (timestamp.type == GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_UNSUPPORTED) {
418         return GSERROR_INVALID_ARGUMENTS;
419     }
420     return consumer_->SetPresentTimestamp(sequence, timestamp);
421 }
422 
GetPresentTimestamp(uint32_t sequence,GraphicPresentTimestampType type,int64_t & time) const423 GSError ConsumerSurface::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type,
424                                              int64_t &time) const
425 {
426     return GSERROR_NOT_SUPPORT;
427 }
428 
GetDefaultFormat()429 int32_t ConsumerSurface::GetDefaultFormat()
430 {
431     BLOGND("ConsumerSurface::GetDefaultFormat not support.");
432     return 0;
433 }
434 
SetDefaultFormat(int32_t format)435 GSError ConsumerSurface::SetDefaultFormat(int32_t format)
436 {
437     BLOGND("ConsumerSurface::SetDefaultFormat not support.");
438     return GSERROR_NOT_SUPPORT;
439 }
440 
GetDefaultColorGamut()441 int32_t ConsumerSurface::GetDefaultColorGamut()
442 {
443     BLOGND("ConsumerSurface::GetDefaultColorGamut not support.");
444     return 0;
445 }
446 
SetDefaultColorGamut(int32_t colorGamut)447 GSError ConsumerSurface::SetDefaultColorGamut(int32_t colorGamut)
448 {
449     BLOGND("ConsumerSurface::SetDefaultColorGamut not support.");
450     return GSERROR_NOT_SUPPORT;
451 }
452 
GetNativeSurface()453 sptr<NativeSurface> ConsumerSurface::GetNativeSurface()
454 {
455     BLOGND("ConsumerSurface::GetNativeSurface not support.");
456     return nullptr;
457 }
458 
SetWptrNativeWindowToPSurface(void * nativeWindow)459 GSError ConsumerSurface::SetWptrNativeWindowToPSurface(void* nativeWindow)
460 {
461     BLOGND("ConsumerSurface::SetWptrNativeWindowToPSurface not support.");
462     return GSERROR_NOT_SUPPORT;
463 }
464 } // namespace OHOS
465