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 ×tamp, 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 ×tamp, 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 ×tamp, 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 return consumer_->AttachBuffer(buffer);
185 }
186
DetachBuffer(sptr<SurfaceBuffer> & buffer)187 GSError ConsumerSurface::DetachBuffer(sptr<SurfaceBuffer>& buffer)
188 {
189 return consumer_->DetachBuffer(buffer);
190 }
191
QueryIfBufferAvailable()192 bool ConsumerSurface::QueryIfBufferAvailable()
193 {
194 return consumer_->QueryIfBufferAvailable();
195 }
196
GetQueueSize()197 uint32_t ConsumerSurface::GetQueueSize()
198 {
199 return producer_->GetQueueSize();
200 }
201
SetQueueSize(uint32_t queueSize)202 GSError ConsumerSurface::SetQueueSize(uint32_t queueSize)
203 {
204 return producer_->SetQueueSize(queueSize);
205 }
206
GetName()207 const std::string& ConsumerSurface::GetName()
208 {
209 return name_;
210 }
211
SetDefaultWidthAndHeight(int32_t width,int32_t height)212 GSError ConsumerSurface::SetDefaultWidthAndHeight(int32_t width, int32_t height)
213 {
214 return consumer_->SetDefaultWidthAndHeight(width, height);
215 }
216
GetDefaultWidth()217 int32_t ConsumerSurface::GetDefaultWidth()
218 {
219 return producer_->GetDefaultWidth();
220 }
221
GetDefaultHeight()222 int32_t ConsumerSurface::GetDefaultHeight()
223 {
224 return producer_->GetDefaultHeight();
225 }
226
SetDefaultUsage(uint32_t usage)227 GSError ConsumerSurface::SetDefaultUsage(uint32_t usage)
228 {
229 return consumer_->SetDefaultUsage(usage);
230 }
231
GetDefaultUsage()232 uint32_t ConsumerSurface::GetDefaultUsage()
233 {
234 return producer_->GetDefaultUsage();
235 }
236
SetUserData(const std::string & key,const std::string & val)237 GSError ConsumerSurface::SetUserData(const std::string &key, const std::string &val)
238 {
239 if (userData_.size() >= SURFACE_MAX_USER_DATA_COUNT) {
240 return GSERROR_OUT_OF_RANGE;
241 }
242 userData_[key] = val;
243 return GSERROR_OK;
244 }
245
GetUserData(const std::string & key)246 std::string ConsumerSurface::GetUserData(const std::string &key)
247 {
248 if (userData_.find(key) != userData_.end()) {
249 return userData_[key];
250 }
251
252 return "";
253 }
254
RegisterConsumerListener(sptr<IBufferConsumerListener> & listener)255 GSError ConsumerSurface::RegisterConsumerListener(sptr<IBufferConsumerListener>& listener)
256 {
257 return consumer_->RegisterConsumerListener(listener);
258 }
259
RegisterConsumerListener(IBufferConsumerListenerClazz * listener)260 GSError ConsumerSurface::RegisterConsumerListener(IBufferConsumerListenerClazz *listener)
261 {
262 return consumer_->RegisterConsumerListener(listener);
263 }
264
RegisterReleaseListener(OnReleaseFunc func)265 GSError ConsumerSurface::RegisterReleaseListener(OnReleaseFunc func)
266 {
267 return consumer_->RegisterReleaseListener(func);
268 }
269
UnRegisterReleaseListener()270 GSError ConsumerSurface::UnRegisterReleaseListener()
271 {
272 return GSERROR_OK;
273 }
274
RegisterDeleteBufferListener(OnDeleteBufferFunc func,bool isForUniRedraw)275 GSError ConsumerSurface::RegisterDeleteBufferListener(OnDeleteBufferFunc func, bool isForUniRedraw)
276 {
277 return consumer_->RegisterDeleteBufferListener(func, isForUniRedraw);
278 }
279
UnregisterConsumerListener()280 GSError ConsumerSurface::UnregisterConsumerListener()
281 {
282 return consumer_->UnregisterConsumerListener();
283 }
284
CleanCache()285 GSError ConsumerSurface::CleanCache()
286 {
287 return GSERROR_NOT_SUPPORT;
288 }
289
GoBackground()290 GSError ConsumerSurface::GoBackground()
291 {
292 BLOGND("Queue Id:%{public}" PRIu64 "", producer_->GetUniqueId());
293 return consumer_->GoBackground();
294 }
295
GetUniqueId() const296 uint64_t ConsumerSurface::GetUniqueId() const
297 {
298 return producer_->GetUniqueId();
299 }
300
Dump(std::string & result) const301 void ConsumerSurface::Dump(std::string &result) const
302 {
303 return consumer_->Dump(result);
304 }
305
SetTransform(GraphicTransformType transform)306 GSError ConsumerSurface::SetTransform(GraphicTransformType transform)
307 {
308 return producer_->SetTransform(transform);
309 }
310
GetTransform() const311 GraphicTransformType ConsumerSurface::GetTransform() const
312 {
313 return consumer_->GetTransform();
314 }
315
IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> & infos,std::vector<bool> & supporteds)316 GSError ConsumerSurface::IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> &infos,
317 std::vector<bool> &supporteds)
318 {
319 return GSERROR_NOT_SUPPORT;
320 }
321
Disconnect()322 GSError ConsumerSurface::Disconnect()
323 {
324 return GSERROR_NOT_SUPPORT;
325 }
326
SetScalingMode(uint32_t sequence,ScalingMode scalingMode)327 GSError ConsumerSurface::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
328 {
329 if (scalingMode < ScalingMode::SCALING_MODE_FREEZE ||
330 scalingMode > ScalingMode::SCALING_MODE_NO_SCALE_CROP) {
331 return GSERROR_INVALID_ARGUMENTS;
332 }
333 return producer_->SetScalingMode(sequence, scalingMode);
334 }
335
GetScalingMode(uint32_t sequence,ScalingMode & scalingMode)336 GSError ConsumerSurface::GetScalingMode(uint32_t sequence, ScalingMode &scalingMode)
337 {
338 return consumer_->GetScalingMode(sequence, scalingMode);
339 }
340
SetMetaData(uint32_t sequence,const std::vector<GraphicHDRMetaData> & metaData)341 GSError ConsumerSurface::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData> &metaData)
342 {
343 if (metaData.size() == 0) {
344 return GSERROR_INVALID_ARGUMENTS;
345 }
346 return producer_->SetMetaData(sequence, metaData);
347 }
348
SetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)349 GSError ConsumerSurface::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
350 const std::vector<uint8_t> &metaData)
351 {
352 if (key < GraphicHDRMetadataKey::GRAPHIC_MATAKEY_RED_PRIMARY_X ||
353 key > GraphicHDRMetadataKey::GRAPHIC_MATAKEY_HDR_VIVID || metaData.size() == 0) {
354 return GSERROR_INVALID_ARGUMENTS;
355 }
356 return producer_->SetMetaDataSet(sequence, key, metaData);
357 }
358
QueryMetaDataType(uint32_t sequence,HDRMetaDataType & type) const359 GSError ConsumerSurface::QueryMetaDataType(uint32_t sequence, HDRMetaDataType &type) const
360 {
361 return consumer_->QueryMetaDataType(sequence, type);
362 }
363
GetMetaData(uint32_t sequence,std::vector<GraphicHDRMetaData> & metaData) const364 GSError ConsumerSurface::GetMetaData(uint32_t sequence, std::vector<GraphicHDRMetaData> &metaData) const
365 {
366 return consumer_->GetMetaData(sequence, metaData);
367 }
368
GetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey & key,std::vector<uint8_t> & metaData) const369 GSError ConsumerSurface::GetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey &key,
370 std::vector<uint8_t> &metaData) const
371 {
372 return consumer_->GetMetaDataSet(sequence, key, metaData);
373 }
374
SetTunnelHandle(const GraphicExtDataHandle * handle)375 GSError ConsumerSurface::SetTunnelHandle(const GraphicExtDataHandle *handle)
376 {
377 if (handle == nullptr || handle->reserveInts == 0) {
378 return GSERROR_INVALID_ARGUMENTS;
379 }
380 return producer_->SetTunnelHandle(handle);
381 }
382
GetTunnelHandle() const383 sptr<SurfaceTunnelHandle> ConsumerSurface::GetTunnelHandle() const
384 {
385 return consumer_->GetTunnelHandle();
386 }
387
SetPresentTimestamp(uint32_t sequence,const GraphicPresentTimestamp & timestamp)388 GSError ConsumerSurface::SetPresentTimestamp(uint32_t sequence, const GraphicPresentTimestamp ×tamp)
389 {
390 if (timestamp.type == GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_UNSUPPORTED) {
391 return GSERROR_INVALID_ARGUMENTS;
392 }
393 return consumer_->SetPresentTimestamp(sequence, timestamp);
394 }
395
GetPresentTimestamp(uint32_t sequence,GraphicPresentTimestampType type,int64_t & time) const396 GSError ConsumerSurface::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type,
397 int64_t &time) const
398 {
399 return GSERROR_NOT_SUPPORT;
400 }
401
GetDefaultFormat()402 int32_t ConsumerSurface::GetDefaultFormat()
403 {
404 BLOGND("ConsumerSurface::GetDefaultFormat not support.");
405 return 0;
406 }
407
SetDefaultFormat(int32_t format)408 GSError ConsumerSurface::SetDefaultFormat(int32_t format)
409 {
410 BLOGND("ConsumerSurface::SetDefaultFormat not support.");
411 return GSERROR_NOT_SUPPORT;
412 }
413
GetDefaultColorGamut()414 int32_t ConsumerSurface::GetDefaultColorGamut()
415 {
416 BLOGND("ConsumerSurface::GetDefaultColorGamut not support.");
417 return 0;
418 }
419
SetDefaultColorGamut(int32_t colorGamut)420 GSError ConsumerSurface::SetDefaultColorGamut(int32_t colorGamut)
421 {
422 BLOGND("ConsumerSurface::SetDefaultColorGamut not support.");
423 return GSERROR_NOT_SUPPORT;
424 }
425
GetNativeSurface()426 sptr<NativeSurface> ConsumerSurface::GetNativeSurface()
427 {
428 BLOGND("ConsumerSurface::GetNativeSurface not support.");
429 return nullptr;
430 }
431
SetWptrNativeWindowToPSurface(void * nativeWindow)432 GSError ConsumerSurface::SetWptrNativeWindowToPSurface(void* nativeWindow)
433 {
434 BLOGND("ConsumerSurface::SetWptrNativeWindowToPSurface not support.");
435 return GSERROR_NOT_SUPPORT;
436 }
437 } // namespace OHOS
438