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 "producer_surface.h"
17
18 #include <cinttypes>
19
20 #include "buffer_log.h"
21 #include "buffer_manager.h"
22 #include "buffer_extra_data_impl.h"
23 #include "buffer_producer_listener.h"
24 #include "sync_fence.h"
25
26 namespace OHOS {
27 namespace {
28 constexpr int32_t PRODUCER_REF_COUNT_IN_PRODUCER_SURFACE = 1;
29 }
30
CreateSurfaceAsProducer(sptr<IBufferProducer> & producer)31 sptr<Surface> Surface::CreateSurfaceAsProducer(sptr<IBufferProducer>& producer)
32 {
33 if (producer == nullptr) {
34 BLOGE("Failure, Reason: producer is nullptr");
35 return nullptr;
36 }
37
38 sptr<ProducerSurface> surf = new ProducerSurface(producer);
39 GSError ret = surf->Init();
40 if (ret != GSERROR_OK) {
41 BLOGE("Failure, Reason: producer surf init failed");
42 return nullptr;
43 }
44 return surf;
45 }
46
ProducerSurface(sptr<IBufferProducer> & producer)47 ProducerSurface::ProducerSurface(sptr<IBufferProducer>& producer)
48 {
49 producer_ = producer;
50 BLOGND("ctor");
51 }
52
~ProducerSurface()53 ProducerSurface::~ProducerSurface()
54 {
55 if (producer_->GetSptrRefCount() > PRODUCER_REF_COUNT_IN_PRODUCER_SURFACE) {
56 BLOGNE("Wrong SptrRefCount! producer_:%{public}d", producer_->GetSptrRefCount());
57 }
58 BLOGND("dtor, name:%{public}s, Queue Id:%{public}" PRIu64, name_.c_str(), queueId_);
59 auto ret = Disconnect();
60 if (ret != GSERROR_OK) {
61 BLOGNE("Disconnect failed, %{public}s", GSErrorStr(ret).c_str());
62 }
63 }
64
Init()65 GSError ProducerSurface::Init()
66 {
67 if (inited_.load()) {
68 return GSERROR_OK;
69 }
70 auto ret = producer_->GetNameAndUniqueId(name_, queueId_);
71 if (ret != GSERROR_OK) {
72 BLOGNE("GetNameAndUniqueId failed, %{public}s", GSErrorStr(ret).c_str());
73 }
74 inited_.store(true);
75 BLOGND("ctor, name:%{public}s, Queue Id:%{public}" PRIu64, name_.c_str(), queueId_);
76 return GSERROR_OK;
77 }
78
IsConsumer() const79 bool ProducerSurface::IsConsumer() const
80 {
81 return false;
82 }
83
GetProducer() const84 sptr<IBufferProducer> ProducerSurface::GetProducer() const
85 {
86 return producer_;
87 }
88
RequestBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,BufferRequestConfig & config)89 GSError ProducerSurface::RequestBuffer(sptr<SurfaceBuffer>& buffer,
90 sptr<SyncFence>& fence, BufferRequestConfig &config)
91 {
92 IBufferProducer::RequestBufferReturnValue retval;
93 sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
94 GSError ret = producer_->RequestBuffer(config, bedataimpl, retval);
95 if (ret != GSERROR_OK) {
96 if (ret == GSERROR_NO_CONSUMER) {
97 std::lock_guard<std::mutex> lockGuard(mutex_);
98 bufferProducerCache_.clear();
99 }
100 BLOGND("Producer report %{public}s", GSErrorStr(ret).c_str());
101 return ret;
102 }
103
104 std::lock_guard<std::mutex> lockGuard(mutex_);
105 if (isDisconnected) {
106 isDisconnected = false;
107 }
108 // add cache
109 if (retval.buffer != nullptr) {
110 bufferProducerCache_[retval.sequence] = retval.buffer;
111 } else if (bufferProducerCache_.find(retval.sequence) == bufferProducerCache_.end()) {
112 return GSERROR_API_FAILED;
113 } else {
114 retval.buffer = bufferProducerCache_[retval.sequence];
115 }
116 buffer = retval.buffer;
117 fence = retval.fence;
118
119 if (static_cast<uint64_t>(config.usage) & BUFFER_USAGE_CPU_WRITE) {
120 ret = buffer->InvalidateCache();
121 if (ret != GSERROR_OK) {
122 BLOGNW("Warning [%{public}d], InvalidateCache failed", retval.sequence);
123 }
124 }
125
126 if (buffer != nullptr) {
127 buffer->SetExtraData(bedataimpl);
128 }
129
130 for (auto it = retval.deletingBuffers.begin(); it != retval.deletingBuffers.end(); it++) {
131 bufferProducerCache_.erase(*it);
132 }
133 return GSERROR_OK;
134 }
FlushBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence,BufferFlushConfig & config)135 GSError ProducerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer,
136 const sptr<SyncFence>& fence, BufferFlushConfig &config)
137 {
138 BufferFlushConfigWithDamages configWithDamages;
139 configWithDamages.damages.push_back(config.damage);
140 configWithDamages.timestamp = config.timestamp;
141 return FlushBuffer(buffer, fence, configWithDamages);
142 }
143
FlushBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence,BufferFlushConfigWithDamages & config)144 GSError ProducerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence,
145 BufferFlushConfigWithDamages &config)
146 {
147 if (buffer == nullptr) {
148 return GSERROR_INVALID_ARGUMENTS;
149 }
150
151 const sptr<BufferExtraData>& bedata = buffer->GetExtraData();
152 return producer_->FlushBuffer(buffer->GetSeqNum(), bedata, fence, config);
153 }
154
AcquireBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,int64_t & timestamp,Rect & damage)155 GSError ProducerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
156 int64_t ×tamp, Rect &damage)
157 {
158 return GSERROR_NOT_SUPPORT;
159 }
ReleaseBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence)160 GSError ProducerSurface::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence)
161 {
162 return GSERROR_NOT_SUPPORT;
163 }
164
RequestBuffer(sptr<SurfaceBuffer> & buffer,int32_t & fence,BufferRequestConfig & config)165 GSError ProducerSurface::RequestBuffer(sptr<SurfaceBuffer>& buffer,
166 int32_t &fence, BufferRequestConfig &config)
167 {
168 sptr<SyncFence> syncFence = SyncFence::INVALID_FENCE;
169 auto ret = RequestBuffer(buffer, syncFence, config);
170 if (ret != GSERROR_OK) {
171 fence = -1;
172 return ret;
173 }
174 fence = syncFence->Dup();
175 return GSERROR_OK;
176 }
177
CancelBuffer(sptr<SurfaceBuffer> & buffer)178 GSError ProducerSurface::CancelBuffer(sptr<SurfaceBuffer>& buffer)
179 {
180 if (buffer == nullptr) {
181 return GSERROR_INVALID_ARGUMENTS;
182 }
183
184 const sptr<BufferExtraData>& bedata = buffer->GetExtraData();
185 return producer_->CancelBuffer(buffer->GetSeqNum(), bedata);
186 }
187
FlushBuffer(sptr<SurfaceBuffer> & buffer,int32_t fence,BufferFlushConfig & config)188 GSError ProducerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer,
189 int32_t fence, BufferFlushConfig &config)
190 {
191 // fence need close?
192 sptr<SyncFence> syncFence = new SyncFence(fence);
193 return FlushBuffer(buffer, syncFence, config);
194 }
195
AcquireBuffer(sptr<SurfaceBuffer> & buffer,int32_t & fence,int64_t & timestamp,Rect & damage)196 GSError ProducerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, int32_t &fence,
197 int64_t ×tamp, Rect &damage)
198 {
199 return GSERROR_NOT_SUPPORT;
200 }
201
ReleaseBuffer(sptr<SurfaceBuffer> & buffer,int32_t fence)202 GSError ProducerSurface::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, int32_t fence)
203 {
204 return GSERROR_NOT_SUPPORT;
205 }
206
AttachBuffer(sptr<SurfaceBuffer> & buffer)207 GSError ProducerSurface::AttachBuffer(sptr<SurfaceBuffer>& buffer)
208 {
209 if (buffer == nullptr) {
210 return GSERROR_INVALID_ARGUMENTS;
211 }
212
213 return producer_->AttachBuffer(buffer);
214 }
215
DetachBuffer(sptr<SurfaceBuffer> & buffer)216 GSError ProducerSurface::DetachBuffer(sptr<SurfaceBuffer>& buffer)
217 {
218 if (buffer == nullptr) {
219 return GSERROR_INVALID_ARGUMENTS;
220 }
221 return producer_->DetachBuffer(buffer);
222 }
223
QueryIfBufferAvailable()224 bool ProducerSurface::QueryIfBufferAvailable()
225 {
226 return false;
227 }
228
GetQueueSize()229 uint32_t ProducerSurface::GetQueueSize()
230 {
231 return producer_->GetQueueSize();
232 }
233
SetQueueSize(uint32_t queueSize)234 GSError ProducerSurface::SetQueueSize(uint32_t queueSize)
235 {
236 return producer_->SetQueueSize(queueSize);
237 }
238
GetName()239 const std::string& ProducerSurface::GetName()
240 {
241 if (!inited_.load()) {
242 BLOGNW("Warning ProducerSurface is not initialized, the name you get is uninitialized.");
243 }
244 return name_;
245 }
246
SetDefaultWidthAndHeight(int32_t width,int32_t height)247 GSError ProducerSurface::SetDefaultWidthAndHeight(int32_t width, int32_t height)
248 {
249 return GSERROR_NOT_SUPPORT;
250 }
251
GetDefaultWidth()252 int32_t ProducerSurface::GetDefaultWidth()
253 {
254 return producer_->GetDefaultWidth();
255 }
256
GetDefaultHeight()257 int32_t ProducerSurface::GetDefaultHeight()
258 {
259 return producer_->GetDefaultHeight();
260 }
261
SetDefaultUsage(uint32_t usage)262 GSError ProducerSurface::SetDefaultUsage(uint32_t usage)
263 {
264 return GSERROR_NOT_SUPPORT;
265 }
266
GetDefaultUsage()267 uint32_t ProducerSurface::GetDefaultUsage()
268 {
269 return producer_->GetDefaultUsage();
270 }
271
SetUserData(const std::string & key,const std::string & val)272 GSError ProducerSurface::SetUserData(const std::string &key, const std::string &val)
273 {
274 if (userData_.size() >= SURFACE_MAX_USER_DATA_COUNT) {
275 return GSERROR_OUT_OF_RANGE;
276 }
277 userData_[key] = val;
278 return GSERROR_OK;
279 }
280
GetUserData(const std::string & key)281 std::string ProducerSurface::GetUserData(const std::string &key)
282 {
283 if (userData_.find(key) != userData_.end()) {
284 return userData_[key];
285 }
286
287 return "";
288 }
289
RegisterConsumerListener(sptr<IBufferConsumerListener> & listener)290 GSError ProducerSurface::RegisterConsumerListener(sptr<IBufferConsumerListener>& listener)
291 {
292 return GSERROR_NOT_SUPPORT;
293 }
294
RegisterConsumerListener(IBufferConsumerListenerClazz * listener)295 GSError ProducerSurface::RegisterConsumerListener(IBufferConsumerListenerClazz *listener)
296 {
297 return GSERROR_NOT_SUPPORT;
298 }
299
UnregisterConsumerListener()300 GSError ProducerSurface::UnregisterConsumerListener()
301 {
302 return GSERROR_NOT_SUPPORT;
303 }
304
RegisterReleaseListener(OnReleaseFunc func)305 GSError ProducerSurface::RegisterReleaseListener(OnReleaseFunc func)
306 {
307 if (func == nullptr) {
308 BLOGNE("OnReleaseFunc is nullptr, RegisterReleaseListener failed.");
309 return GSERROR_INVALID_ARGUMENTS;
310 }
311 listener_ = new BufferReleaseProducerListener(func);
312 return producer_->RegisterReleaseListener(listener_);
313 }
314
RegisterDeleteBufferListener(OnDeleteBufferFunc func,bool isForUniRedraw)315 GSError ProducerSurface::RegisterDeleteBufferListener(OnDeleteBufferFunc func, bool isForUniRedraw)
316 {
317 return GSERROR_NOT_SUPPORT;
318 }
319
IsRemote()320 bool ProducerSurface::IsRemote()
321 {
322 return producer_->AsObject()->IsProxyObject();
323 }
324
CleanCache()325 GSError ProducerSurface::CleanCache()
326 {
327 BLOGND("Queue Id:%{public}" PRIu64, queueId_);
328 {
329 std::lock_guard<std::mutex> lockGuard(mutex_);
330 bufferProducerCache_.clear();
331 }
332 return producer_->CleanCache();
333 }
334
GoBackground()335 GSError ProducerSurface::GoBackground()
336 {
337 BLOGND("Queue Id:%{public}" PRIu64 "", queueId_);
338 {
339 std::lock_guard<std::mutex> lockGuard(mutex_);
340 bufferProducerCache_.clear();
341 }
342 return producer_->GoBackground();
343 }
344
GetUniqueId() const345 uint64_t ProducerSurface::GetUniqueId() const
346 {
347 if (!inited_.load()) {
348 BLOGNW("Warning ProducerSurface is not initialized, the uniquedId you get is uninitialized.");
349 }
350 return queueId_;
351 }
352
SetTransform(GraphicTransformType transform)353 GSError ProducerSurface::SetTransform(GraphicTransformType transform)
354 {
355 return producer_->SetTransform(transform);
356 }
357
GetTransform() const358 GraphicTransformType ProducerSurface::GetTransform() const
359 {
360 return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
361 }
362
IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> & infos,std::vector<bool> & supporteds)363 GSError ProducerSurface::IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> &infos,
364 std::vector<bool> &supporteds)
365 {
366 if (infos.size() == 0 || infos.size() != supporteds.size()) {
367 return GSERROR_INVALID_ARGUMENTS;
368 }
369 return producer_->IsSupportedAlloc(infos, supporteds);
370 }
371
Disconnect()372 GSError ProducerSurface::Disconnect()
373 {
374 {
375 std::lock_guard<std::mutex> lockGuard(mutex_);
376 if (isDisconnected) {
377 return GSERROR_INVALID_OPERATING;
378 }
379 }
380 BLOGND("Queue Id:%{public}" PRIu64 "", queueId_);
381 {
382 std::lock_guard<std::mutex> lockGuard(mutex_);
383 bufferProducerCache_.clear();
384 }
385 GSError ret = producer_->Disconnect();
386 {
387 std::lock_guard<std::mutex> lockGuard(mutex_);
388 if (ret == GSERROR_OK) {
389 isDisconnected = true;
390 }
391 }
392 return ret;
393 }
394
SetScalingMode(uint32_t sequence,ScalingMode scalingMode)395 GSError ProducerSurface::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
396 {
397 if (scalingMode < ScalingMode::SCALING_MODE_FREEZE ||
398 scalingMode > ScalingMode::SCALING_MODE_NO_SCALE_CROP) {
399 return GSERROR_INVALID_ARGUMENTS;
400 }
401 return producer_->SetScalingMode(sequence, scalingMode);
402 }
403
GetScalingMode(uint32_t sequence,ScalingMode & scalingMode)404 GSError ProducerSurface::GetScalingMode(uint32_t sequence, ScalingMode &scalingMode)
405 {
406 return GSERROR_NOT_SUPPORT;
407 }
408
SetMetaData(uint32_t sequence,const std::vector<GraphicHDRMetaData> & metaData)409 GSError ProducerSurface::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData> &metaData)
410 {
411 if (metaData.size() == 0) {
412 return GSERROR_INVALID_ARGUMENTS;
413 }
414 return producer_->SetMetaData(sequence, metaData);
415 }
416
SetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)417 GSError ProducerSurface::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
418 const std::vector<uint8_t> &metaData)
419 {
420 if (key < GraphicHDRMetadataKey::GRAPHIC_MATAKEY_RED_PRIMARY_X ||
421 key > GraphicHDRMetadataKey::GRAPHIC_MATAKEY_HDR_VIVID || metaData.size() == 0) {
422 return GSERROR_INVALID_ARGUMENTS;
423 }
424 return producer_->SetMetaDataSet(sequence, key, metaData);
425 }
426
QueryMetaDataType(uint32_t sequence,HDRMetaDataType & type) const427 GSError ProducerSurface::QueryMetaDataType(uint32_t sequence, HDRMetaDataType &type) const
428 {
429 return GSERROR_NOT_SUPPORT;
430 }
431
GetMetaData(uint32_t sequence,std::vector<GraphicHDRMetaData> & metaData) const432 GSError ProducerSurface::GetMetaData(uint32_t sequence, std::vector<GraphicHDRMetaData> &metaData) const
433 {
434 return GSERROR_NOT_SUPPORT;
435 }
436
GetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey & key,std::vector<uint8_t> & metaData) const437 GSError ProducerSurface::GetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey &key,
438 std::vector<uint8_t> &metaData) const
439 {
440 return GSERROR_NOT_SUPPORT;
441 }
442
SetTunnelHandle(const GraphicExtDataHandle * handle)443 GSError ProducerSurface::SetTunnelHandle(const GraphicExtDataHandle *handle)
444 {
445 return producer_->SetTunnelHandle(handle);
446 }
447
GetTunnelHandle() const448 sptr<SurfaceTunnelHandle> ProducerSurface::GetTunnelHandle() const
449 {
450 // not support
451 return nullptr;
452 }
453
SetPresentTimestamp(uint32_t sequence,const GraphicPresentTimestamp & timestamp)454 GSError ProducerSurface::SetPresentTimestamp(uint32_t sequence, const GraphicPresentTimestamp ×tamp)
455 {
456 return GSERROR_NOT_SUPPORT;
457 }
458
GetPresentTimestamp(uint32_t sequence,GraphicPresentTimestampType type,int64_t & time) const459 GSError ProducerSurface::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type,
460 int64_t &time) const
461 {
462 if (type <= GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_UNSUPPORTED ||
463 type > GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_TIMESTAMP) {
464 return GSERROR_INVALID_ARGUMENTS;
465 }
466 return producer_->GetPresentTimestamp(sequence, type, time);
467 }
468
GetDefaultFormat()469 int32_t ProducerSurface::GetDefaultFormat()
470 {
471 BLOGND("ProducerSurface::GetDefaultFormat not support.");
472 return 0;
473 }
474
SetDefaultFormat(int32_t format)475 GSError ProducerSurface::SetDefaultFormat(int32_t format)
476 {
477 BLOGND("ProducerSurface::SetDefaultFormat not support.");
478 return GSERROR_NOT_SUPPORT;
479 }
480
GetDefaultColorGamut()481 int32_t ProducerSurface::GetDefaultColorGamut()
482 {
483 BLOGND("ProducerSurface::GetDefaultColorGamut not support.");
484 return 0;
485 }
486
SetDefaultColorGamut(int32_t colorGamut)487 GSError ProducerSurface::SetDefaultColorGamut(int32_t colorGamut)
488 {
489 BLOGND("ProducerSurface::SetDefaultColorGamut not support.");
490 return GSERROR_NOT_SUPPORT;
491 }
492
GetNativeSurface()493 sptr<NativeSurface> ProducerSurface::GetNativeSurface()
494 {
495 BLOGND("ProducerSurface::GetNativeSurface not support.");
496 return nullptr;
497 }
498 } // namespace OHOS
499