• 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 "producer_surface.h"
17 
18 #include <cinttypes>
19 
20 #include "buffer_log.h"
21 #include "buffer_extra_data_impl.h"
22 #include "buffer_producer_listener.h"
23 #include "sync_fence.h"
24 #include "native_window.h"
25 #include "surface_utils.h"
26 #include "metadata_helper.h"
27 
28 using namespace OHOS::HDI::Display::Graphic::Common::V1_0;
29 namespace OHOS {
30 
CreateSurfaceAsProducer(sptr<IBufferProducer> & producer)31 sptr<Surface> Surface::CreateSurfaceAsProducer(sptr<IBufferProducer>& producer)
32 {
33     if (producer == nullptr) {
34         return nullptr;
35     }
36 
37     sptr<ProducerSurface> surf = new ProducerSurface(producer);
38     GSError ret = surf->Init();
39     if (ret != GSERROR_OK) {
40         BLOGE("producer surf init failed");
41         return nullptr;
42     }
43     auto utils = SurfaceUtils::GetInstance();
44     utils->Add(surf->GetUniqueId(), surf);
45     return surf;
46 }
47 
ProducerSurface(sptr<IBufferProducer> & producer)48 ProducerSurface::ProducerSurface(sptr<IBufferProducer>& producer)
49 {
50     producer_ = producer;
51     GetProducerInitInfo(initInfo_);
52     windowConfig_.width = initInfo_.width;
53     windowConfig_.height = initInfo_.height;
54     windowConfig_.usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_MEM_DMA;
55     windowConfig_.format = GRAPHIC_PIXEL_FMT_RGBA_8888;
56     windowConfig_.strideAlignment = 8;     // default stride is 8
57     windowConfig_.timeout = 3000;          // default timeout is 3000 ms
58     windowConfig_.colorGamut = GraphicColorGamut::GRAPHIC_COLOR_GAMUT_SRGB;
59     windowConfig_.transform = GraphicTransformType::GRAPHIC_ROTATE_NONE;
60     BLOGD("ProducerSurface ctor");
61 }
62 
~ProducerSurface()63 ProducerSurface::~ProducerSurface()
64 {
65     BLOGD("~ProducerSurface dtor, name: %{public}s, uniqueId: %{public}" PRIu64 ".", name_.c_str(), queueId_);
66     Disconnect();
67     auto utils = SurfaceUtils::GetInstance();
68     utils->Remove(GetUniqueId());
69 }
70 
GetProducerInitInfo(ProducerInitInfo & info)71 GSError ProducerSurface::GetProducerInitInfo(ProducerInitInfo& info)
72 {
73     if (producer_ == nullptr) {
74         return GSERROR_INVALID_ARGUMENTS;
75     }
76     return producer_->GetProducerInitInfo(info);
77 }
78 
Init()79 GSError ProducerSurface::Init()
80 {
81     if (inited_.load()) {
82         return GSERROR_OK;
83     }
84     name_ = initInfo_.name;
85     queueId_ = initInfo_.uniqueId;
86     inited_.store(true);
87     BLOGD("Init name: %{public}s, uniqueId: %{public}" PRIu64 ".", name_.c_str(), queueId_);
88     return GSERROR_OK;
89 }
90 
IsConsumer() const91 bool ProducerSurface::IsConsumer() const
92 {
93     return false;
94 }
95 
GetProducer() const96 sptr<IBufferProducer> ProducerSurface::GetProducer() const
97 {
98     return producer_;
99 }
100 
RequestBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,BufferRequestConfig & config)101 GSError ProducerSurface::RequestBuffer(sptr<SurfaceBuffer>& buffer,
102                                        sptr<SyncFence>& fence, BufferRequestConfig& config)
103 {
104     if (producer_ == nullptr) {
105         return GSERROR_INVALID_ARGUMENTS;
106     }
107     IBufferProducer::RequestBufferReturnValue retval;
108     sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
109     GSError ret;
110     {
111         std::lock_guard<std::mutex> lockGuard(mutex_);
112         ret = producer_->RequestBuffer(config, bedataimpl, retval);
113         if (ret != GSERROR_OK) {
114             if (ret == GSERROR_NO_CONSUMER) {
115                 CleanCacheLocked(false);
116             }
117             /**
118              * if server is connected, but result is failed.
119              * client needs to synchronize status.
120              */
121             if (retval.isConnected) {
122                 isDisconnected_ = false;
123             }
124             BLOGD("RequestBuffer ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
125             return ret;
126         }
127         isDisconnected_ = false;
128         AddCacheLocked(bedataimpl, retval, config);
129     }
130     buffer = retval.buffer;
131     fence = retval.fence;
132     if (SetMetadataValue(buffer) != GSERROR_OK) {
133         BLOGD("SetMetadataValue fail, uniqueId: %{public}" PRIu64 ".", queueId_);
134     }
135     return ret;
136 }
137 
SetMetadataValue(sptr<SurfaceBuffer> & buffer)138 GSError ProducerSurface::SetMetadataValue(sptr<SurfaceBuffer>& buffer)
139 {
140     GSError ret = GSERROR_OK;
141     std::vector<uint8_t> metaData;
142     std::string value = GetUserData("ATTRKEY_COLORSPACE_INFO");
143     if (!value.empty()) {
144         ret = MetadataHelper::SetColorSpaceType(buffer, static_cast<CM_ColorSpaceType>(atoi(value.c_str())));
145         if (ret != GSERROR_OK) {
146             BLOGD("SetColorSpaceType ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
147             return ret;
148         }
149     }
150     value = GetUserData("OH_HDR_DYNAMIC_METADATA");
151     if (!value.empty()) {
152         metaData.resize(value.size());
153         metaData.assign(value.begin(), value.end());
154         ret = MetadataHelper::SetHDRDynamicMetadata(buffer, metaData);
155         if (ret != GSERROR_OK) {
156             BLOGD("SetHDRDynamicMetadata ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
157             return ret;
158         }
159     }
160     value = GetUserData("OH_HDR_STATIC_METADATA");
161     if (!value.empty()) {
162         metaData.resize(value.size());
163         metaData.assign(value.begin(), value.end());
164         ret = MetadataHelper::SetHDRStaticMetadata(buffer, metaData);
165         if (ret != GSERROR_OK) {
166             BLOGD("SetHDRStaticMetadata ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
167             return ret;
168         }
169     }
170     value = GetUserData("OH_HDR_METADATA_TYPE");
171     if (!value.empty()) {
172         ret = MetadataHelper::SetHDRMetadataType(buffer, static_cast<CM_HDR_Metadata_Type>(atoi(value.c_str())));
173         if (ret != GSERROR_OK) {
174             BLOGD("SetHDRMetadataType ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
175         }
176     }
177     return ret;
178 }
179 
SetBufferConfigLocked(sptr<BufferExtraData> & bedataimpl,IBufferProducer::RequestBufferReturnValue & retval,BufferRequestConfig & config)180 void ProducerSurface::SetBufferConfigLocked(sptr<BufferExtraData>& bedataimpl,
181     IBufferProducer::RequestBufferReturnValue& retval, BufferRequestConfig& config)
182 {
183     if (retval.buffer != nullptr) {
184         retval.buffer->SetSurfaceBufferColorGamut(config.colorGamut);
185         retval.buffer->SetSurfaceBufferTransform(config.transform);
186         retval.buffer->SetExtraData(bedataimpl);
187     }
188 }
189 
DeleteCacheBufferLocked(sptr<BufferExtraData> & bedataimpl,IBufferProducer::RequestBufferReturnValue & retval,BufferRequestConfig & config)190 void ProducerSurface::DeleteCacheBufferLocked(sptr<BufferExtraData>& bedataimpl,
191     IBufferProducer::RequestBufferReturnValue& retval, BufferRequestConfig& config)
192 {
193     for (auto it = retval.deletingBuffers.begin(); it != retval.deletingBuffers.end(); it++) {
194         uint32_t seqNum = static_cast<uint32_t>(*it);
195         bufferProducerCache_.erase(seqNum);
196         auto spNativeWindow = wpNativeWindow_.promote();
197         if (spNativeWindow != nullptr) {
198             auto& bufferCache = spNativeWindow->bufferCache_;
199             if (bufferCache.find(seqNum) != bufferCache.end()) {
200                 NativeObjectUnreference(bufferCache[seqNum]);
201                 bufferCache.erase(seqNum);
202             }
203         }
204     }
205 }
206 
AddCacheLocked(sptr<BufferExtraData> & bedataimpl,IBufferProducer::RequestBufferReturnValue & retval,BufferRequestConfig & config)207 GSError ProducerSurface::AddCacheLocked(sptr<BufferExtraData>& bedataimpl,
208     IBufferProducer::RequestBufferReturnValue& retval, BufferRequestConfig& config)
209 {
210     // add cache
211     if (retval.buffer != nullptr) {
212         bufferProducerCache_[retval.sequence] = retval.buffer;
213         ReleasePreCacheBuffer(static_cast<int>(bufferProducerCache_.size()));
214     } else {
215         auto it = bufferProducerCache_.find(retval.sequence);
216         if (it == bufferProducerCache_.end()) {
217             DeleteCacheBufferLocked(bedataimpl, retval, config);
218             BLOGE("cache not find buffer(%{public}u), uniqueId: %{public}" PRIu64 ".", retval.sequence, queueId_);
219             return SURFACE_ERROR_UNKOWN;
220         } else {
221             retval.buffer = it->second;
222         }
223     }
224     SetBufferConfigLocked(bedataimpl, retval, config);
225     DeleteCacheBufferLocked(bedataimpl, retval, config);
226     return SURFACE_ERROR_OK;
227 }
228 
RequestBuffers(std::vector<sptr<SurfaceBuffer>> & buffers,std::vector<sptr<SyncFence>> & fences,BufferRequestConfig & config)229 GSError ProducerSurface::RequestBuffers(std::vector<sptr<SurfaceBuffer>>& buffers,
230     std::vector<sptr<SyncFence>>& fences, BufferRequestConfig& config)
231 {
232     if (producer_ == nullptr) {
233         return GSERROR_INVALID_ARGUMENTS;
234     }
235     std::vector<IBufferProducer::RequestBufferReturnValue> retvalues;
236     retvalues.resize(SURFACE_MAX_QUEUE_SIZE);
237     std::vector<sptr<BufferExtraData>> bedataimpls;
238     for (size_t i = 0; i < retvalues.size(); ++i) {
239         sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
240         bedataimpls.emplace_back(bedataimpl);
241     }
242     std::lock_guard<std::mutex> lockGuard(mutex_);
243     GSError ret = producer_->RequestBuffers(config, bedataimpls, retvalues);
244     if (ret != GSERROR_NO_BUFFER && ret != GSERROR_OK) {
245         /**
246          * if server is connected, but result is failed.
247          * client needs to synchronize status.
248          */
249         if (retvalues[0].isConnected) {
250             isDisconnected_ = false;
251         }
252         BLOGD("RequestBuffers ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
253         return ret;
254     }
255     isDisconnected_ = false;
256     for (size_t i = 0; i < retvalues.size(); ++i) {
257         AddCacheLocked(bedataimpls[i], retvalues[i], config);
258         buffers.emplace_back(retvalues[i].buffer);
259         fences.emplace_back(retvalues[i].fence);
260     }
261     return GSERROR_OK;
262 }
263 
FlushBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence,BufferFlushConfig & config)264 GSError ProducerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer,
265                                      const sptr<SyncFence>& fence, BufferFlushConfig& config)
266 {
267     BufferFlushConfigWithDamages configWithDamages;
268     configWithDamages.damages.push_back(config.damage);
269     configWithDamages.timestamp = config.timestamp;
270     configWithDamages.desiredPresentTimestamp = config.desiredPresentTimestamp;
271     return FlushBuffer(buffer, fence, configWithDamages);
272 }
273 
FlushBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence,BufferFlushConfigWithDamages & config)274 GSError ProducerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence,
275                                      BufferFlushConfigWithDamages& config)
276 {
277     if (buffer == nullptr || fence == nullptr || producer_ == nullptr) {
278         return GSERROR_INVALID_ARGUMENTS;
279     }
280 
281     sptr<BufferExtraData> bedata = buffer->GetExtraData();
282     if (bedata == nullptr) {
283         return GSERROR_INVALID_ARGUMENTS;
284     }
285     auto ret = producer_->FlushBuffer(buffer->GetSeqNum(), bedata, fence, config);
286     if (ret == GSERROR_NO_CONSUMER) {
287         CleanCache();
288         BLOGD("FlushBuffer ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
289     }
290     return ret;
291 }
292 
FlushBuffers(const std::vector<sptr<SurfaceBuffer>> & buffers,const std::vector<sptr<SyncFence>> & fences,const std::vector<BufferFlushConfigWithDamages> & configs)293 GSError ProducerSurface::FlushBuffers(const std::vector<sptr<SurfaceBuffer>>& buffers,
294     const std::vector<sptr<SyncFence>>& fences, const std::vector<BufferFlushConfigWithDamages>& configs)
295 {
296     if (buffers.size() == 0 || buffers.size() != fences.size() || producer_ == nullptr
297         || buffers.size() > SURFACE_MAX_QUEUE_SIZE) {
298         return GSERROR_INVALID_ARGUMENTS;
299     }
300     for (size_t i = 0; i < buffers.size(); ++i) {
301         if (buffers[i] == nullptr || fences[i] == nullptr) {
302             BLOGE("buffer or fence is nullptr, i: %{public}zu, uniqueId: %{public}" PRIu64 ".", i, queueId_);
303             return GSERROR_INVALID_ARGUMENTS;
304         }
305     }
306     std::vector<sptr<BufferExtraData>> bedata;
307     bedata.reserve(buffers.size());
308     std::vector<uint32_t> sequences;
309     sequences.reserve(buffers.size());
310     for (uint32_t i = 0; i < buffers.size(); ++i) {
311         bedata.emplace_back(buffers[i]->GetExtraData());
312         sequences.emplace_back(buffers[i]->GetSeqNum());
313     }
314     auto ret = producer_->FlushBuffers(sequences, bedata, fences, configs);
315     if (ret == GSERROR_NO_CONSUMER) {
316         CleanCache();
317         BLOGD("FlushBuffers ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
318     }
319     return ret;
320 }
321 
GetLastFlushedBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],bool isUseNewMatrix)322 GSError ProducerSurface::GetLastFlushedBuffer(sptr<SurfaceBuffer>& buffer,
323     sptr<SyncFence>& fence, float matrix[16], bool isUseNewMatrix)
324 {
325     if (producer_ == nullptr) {
326         return GSERROR_INVALID_ARGUMENTS;
327     }
328     return producer_->GetLastFlushedBuffer(buffer, fence, matrix, isUseNewMatrix);
329 }
330 
AcquireBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,int64_t & timestamp,Rect & damage)331 GSError ProducerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
332                                        int64_t &timestamp, Rect &damage)
333 {
334     return GSERROR_NOT_SUPPORT;
335 }
ReleaseBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence)336 GSError ProducerSurface::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence)
337 {
338     return GSERROR_NOT_SUPPORT;
339 }
340 
RequestBuffer(sptr<SurfaceBuffer> & buffer,int32_t & fence,BufferRequestConfig & config)341 GSError ProducerSurface::RequestBuffer(sptr<SurfaceBuffer>& buffer,
342     int32_t& fence, BufferRequestConfig& config)
343 {
344     sptr<SyncFence> syncFence = SyncFence::InvalidFence();
345     auto ret = RequestBuffer(buffer, syncFence, config);
346     if (ret != GSERROR_OK) {
347         fence = -1;
348         return ret;
349     }
350     fence = syncFence->Dup();
351     return GSERROR_OK;
352 }
353 
CancelBuffer(sptr<SurfaceBuffer> & buffer)354 GSError ProducerSurface::CancelBuffer(sptr<SurfaceBuffer>& buffer)
355 {
356     if (buffer == nullptr || producer_ == nullptr) {
357         return GSERROR_INVALID_ARGUMENTS;
358     }
359 
360     sptr<BufferExtraData> bedata = buffer->GetExtraData();
361     if (bedata == nullptr) {
362         return GSERROR_INVALID_ARGUMENTS;
363     }
364     return producer_->CancelBuffer(buffer->GetSeqNum(), bedata);
365 }
366 
FlushBuffer(sptr<SurfaceBuffer> & buffer,int32_t fence,BufferFlushConfig & config)367 GSError ProducerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer,
368     int32_t fence, BufferFlushConfig& config)
369 {
370     // fence need close?
371     sptr<SyncFence> syncFence = new SyncFence(fence);
372     return FlushBuffer(buffer, syncFence, config);
373 }
374 
AcquireBuffer(sptr<SurfaceBuffer> & buffer,int32_t & fence,int64_t & timestamp,Rect & damage)375 GSError ProducerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, int32_t &fence,
376     int64_t &timestamp, Rect &damage)
377 {
378     return GSERROR_NOT_SUPPORT;
379 }
380 
ReleaseBuffer(sptr<SurfaceBuffer> & buffer,int32_t fence)381 GSError ProducerSurface::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, int32_t fence)
382 {
383     return GSERROR_NOT_SUPPORT;
384 }
385 
AttachBufferToQueue(sptr<SurfaceBuffer> buffer)386 GSError ProducerSurface::AttachBufferToQueue(sptr<SurfaceBuffer> buffer)
387 {
388     if (buffer == nullptr || producer_ == nullptr) {
389         return SURFACE_ERROR_UNKOWN;
390     }
391     auto ret = producer_->AttachBufferToQueue(buffer);
392     if (ret == GSERROR_OK) {
393         std::lock_guard<std::mutex> lockGuard(mutex_);
394         if (bufferProducerCache_.find(buffer->GetSeqNum()) != bufferProducerCache_.end()) {
395             BLOGE("Attach buffer %{public}d, uniqueId: %{public}" PRIu64 ".", buffer->GetSeqNum(), queueId_);
396             return SURFACE_ERROR_BUFFER_IS_INCACHE;
397         }
398         bufferProducerCache_[buffer->GetSeqNum()] = buffer;
399         ReleasePreCacheBuffer(static_cast<int>(bufferProducerCache_.size()));
400     }
401     return ret;
402 }
403 
DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)404 GSError ProducerSurface::DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)
405 {
406     if (buffer == nullptr || producer_ == nullptr) {
407         return SURFACE_ERROR_UNKOWN;
408     }
409     auto ret = producer_->DetachBufferFromQueue(buffer);
410     if (ret == GSERROR_OK) {
411         std::lock_guard<std::mutex> lockGuard(mutex_);
412         if (bufferProducerCache_.find(buffer->GetSeqNum()) == bufferProducerCache_.end()) {
413             BLOGE("Detach buffer %{public}d, uniqueId: %{public}" PRIu64 ".", buffer->GetSeqNum(), queueId_);
414             return SURFACE_ERROR_BUFFER_NOT_INCACHE;
415         }
416         bufferProducerCache_.erase(buffer->GetSeqNum());
417     }
418     return ret;
419 }
420 
AttachBuffer(sptr<SurfaceBuffer> & buffer)421 GSError ProducerSurface::AttachBuffer(sptr<SurfaceBuffer>& buffer)
422 {
423     if (buffer == nullptr || producer_ == nullptr) {
424         return GSERROR_INVALID_ARGUMENTS;
425     }
426 
427     return producer_->AttachBuffer(buffer);
428 }
429 
AttachBuffer(sptr<SurfaceBuffer> & buffer,int32_t timeOut)430 GSError ProducerSurface::AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut)
431 {
432     if (buffer == nullptr || producer_ == nullptr) {
433         return GSERROR_INVALID_ARGUMENTS;
434     }
435 
436     return producer_->AttachBuffer(buffer, timeOut);
437 }
438 
DetachBuffer(sptr<SurfaceBuffer> & buffer)439 GSError ProducerSurface::DetachBuffer(sptr<SurfaceBuffer>& buffer)
440 {
441     if (buffer == nullptr || producer_ == nullptr) {
442         return GSERROR_INVALID_ARGUMENTS;
443     }
444     return producer_->DetachBuffer(buffer);
445 }
446 
RegisterSurfaceDelegator(sptr<IRemoteObject> client)447 GSError ProducerSurface::RegisterSurfaceDelegator(sptr<IRemoteObject> client)
448 {
449     if (client == nullptr) {
450         return GSERROR_INVALID_ARGUMENTS;
451     }
452     sptr<ProducerSurfaceDelegator> surfaceDelegator = ProducerSurfaceDelegator::Create();
453     if (surfaceDelegator == nullptr) {
454         BLOGE("surfaceDelegator is nullptr");
455         return GSERROR_INVALID_ARGUMENTS;
456     }
457     if (!surfaceDelegator->SetClient(client)) {
458         BLOGE("SetClient failed");
459         return GSERROR_INVALID_ARGUMENTS;
460     }
461 
462     surfaceDelegator->SetSurface(this);
463     {
464         std::lock_guard<std::mutex> lockGuard(delegatorMutex_);
465         wpPSurfaceDelegator_ = surfaceDelegator;
466     }
467 
468     auto releaseBufferCallBack = [weakThis = wptr(this)] (const sptr<SurfaceBuffer>& buffer,
469         const sptr<SyncFence>& fence) -> GSError {
470         auto pSurface = weakThis.promote();
471         if (pSurface == nullptr) {
472             BLOGE("pSurface is nullptr");
473             return GSERROR_INVALID_ARGUMENTS;
474         }
475         sptr<ProducerSurfaceDelegator> surfaceDelegator = nullptr;
476         {
477             std::lock_guard<std::mutex> lockGuard(pSurface->delegatorMutex_);
478             surfaceDelegator = pSurface->wpPSurfaceDelegator_.promote();
479         }
480         if (surfaceDelegator == nullptr) {
481             return GSERROR_INVALID_ARGUMENTS;
482         }
483         int error = surfaceDelegator->ReleaseBuffer(buffer, fence);
484         return static_cast<GSError>(error);
485     };
486     RegisterReleaseListener(releaseBufferCallBack);
487     return GSERROR_OK;
488 }
489 
QueryIfBufferAvailable()490 bool ProducerSurface::QueryIfBufferAvailable()
491 {
492     return false;
493 }
494 
GetQueueSize()495 uint32_t ProducerSurface::GetQueueSize()
496 {
497     if (producer_ == nullptr) {
498         return 0;
499     }
500     return producer_->GetQueueSize();
501 }
502 
SetQueueSize(uint32_t queueSize)503 GSError ProducerSurface::SetQueueSize(uint32_t queueSize)
504 {
505     if (producer_ == nullptr) {
506         return GSERROR_INVALID_ARGUMENTS;
507     }
508     return producer_->SetQueueSize(queueSize);
509 }
510 
GetName()511 const std::string& ProducerSurface::GetName()
512 {
513     if (!inited_.load()) {
514         BLOGW("ProducerSurface is not initialized.");
515     }
516     return name_;
517 }
518 
SetDefaultWidthAndHeight(int32_t width,int32_t height)519 GSError ProducerSurface::SetDefaultWidthAndHeight(int32_t width, int32_t height)
520 {
521     return GSERROR_NOT_SUPPORT;
522 }
523 
GetDefaultWidth()524 int32_t ProducerSurface::GetDefaultWidth()
525 {
526     if (producer_ == nullptr) {
527         return -1;
528     }
529     return producer_->GetDefaultWidth();
530 }
531 
GetDefaultHeight()532 int32_t ProducerSurface::GetDefaultHeight()
533 {
534     if (producer_ == nullptr) {
535         return -1;
536     }
537     return producer_->GetDefaultHeight();
538 }
539 
GetTransformHint() const540 GraphicTransformType ProducerSurface::GetTransformHint() const
541 {
542     std::lock_guard<std::mutex> lockGuard(mutex_);
543     return lastSetTransformHint_;
544 }
545 
SetTransformHint(GraphicTransformType transformHint)546 GSError ProducerSurface::SetTransformHint(GraphicTransformType transformHint)
547 {
548     if (producer_ == nullptr) {
549         return GSERROR_INVALID_ARGUMENTS;
550     }
551     GSError err = producer_->SetTransformHint(transformHint);
552     if (err == GSERROR_OK) {
553         std::lock_guard<std::mutex> lockGuard(mutex_);
554         lastSetTransformHint_ = transformHint;
555     }
556     return err;
557 }
558 
SetDefaultUsage(uint64_t usage)559 GSError ProducerSurface::SetDefaultUsage(uint64_t usage)
560 {
561     if (producer_ == nullptr) {
562         return GSERROR_INVALID_ARGUMENTS;
563     }
564     return producer_->SetDefaultUsage(usage);
565 }
566 
GetDefaultUsage()567 uint64_t ProducerSurface::GetDefaultUsage()
568 {
569     if (producer_ == nullptr) {
570         return 0;
571     }
572     return producer_->GetDefaultUsage();
573 }
574 
SetSurfaceSourceType(OHSurfaceSource sourceType)575 GSError ProducerSurface::SetSurfaceSourceType(OHSurfaceSource sourceType)
576 {
577     if (producer_ == nullptr) {
578         return GSERROR_INVALID_ARGUMENTS;
579     }
580     return producer_->SetSurfaceSourceType(sourceType);
581 }
582 
GetSurfaceSourceType() const583 OHSurfaceSource ProducerSurface::GetSurfaceSourceType() const
584 {
585     if (producer_ == nullptr) {
586         return OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
587     }
588     OHSurfaceSource sourceType = OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
589     if (producer_->GetSurfaceSourceType(sourceType) != GSERROR_OK) {
590         BLOGE("GetSurfaceSourceType failed, uniqueId: %{public}" PRIu64 ".", queueId_);
591         return OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
592     }
593     return sourceType;
594 }
595 
SetSurfaceAppFrameworkType(std::string appFrameworkType)596 GSError ProducerSurface::SetSurfaceAppFrameworkType(std::string appFrameworkType)
597 {
598     if (producer_ == nullptr) {
599         return GSERROR_INVALID_ARGUMENTS;
600     }
601     return producer_->SetSurfaceAppFrameworkType(appFrameworkType);
602 }
603 
GetSurfaceAppFrameworkType() const604 std::string ProducerSurface::GetSurfaceAppFrameworkType() const
605 {
606     if (producer_ == nullptr) {
607         return "";
608     }
609     std::string appFrameworkType = "";
610     if (producer_->GetSurfaceAppFrameworkType(appFrameworkType) != GSERROR_OK) {
611         BLOGE("GetSurfaceAppFrameworkType failed, uniqueId: %{public}" PRIu64 ".", queueId_);
612         return "";
613     }
614     return appFrameworkType;
615 }
616 
SetUserData(const std::string & key,const std::string & val)617 GSError ProducerSurface::SetUserData(const std::string& key, const std::string& val)
618 {
619     std::lock_guard<std::mutex> lockGuard(lockMutex_);
620     if (userData_.size() >= SURFACE_MAX_USER_DATA_COUNT) {
621         BLOGE("userData_ size out: %{public}zu, uniqueId: %{public}" PRIu64 ".", userData_.size(), queueId_);
622         return GSERROR_OUT_OF_RANGE;
623     }
624 
625     auto iterUserData = userData_.find(key);
626     if (iterUserData != userData_.end() && iterUserData->second == val) {
627         BLOGE("SetUserData failed: key:%{public}s, val:%{public}s exist, uniqueId: %{public}" PRIu64 ".",
628             key.c_str(), val.c_str(), queueId_);
629         return GSERROR_API_FAILED;
630     }
631 
632     userData_[key] = val;
633     auto iter = onUserDataChange_.begin();
634     while (iter != onUserDataChange_.end()) {
635         if (iter->second != nullptr) {
636             iter->second(key, val);
637         }
638         iter++;
639     }
640 
641     return GSERROR_OK;
642 }
643 
GetUserData(const std::string & key)644 std::string ProducerSurface::GetUserData(const std::string& key)
645 {
646     std::lock_guard<std::mutex> lockGuard(lockMutex_);
647     if (userData_.find(key) != userData_.end()) {
648         return userData_[key];
649     }
650 
651     return "";
652 }
653 
RegisterConsumerListener(sptr<IBufferConsumerListener> & listener)654 GSError ProducerSurface::RegisterConsumerListener(sptr<IBufferConsumerListener>& listener)
655 {
656     return GSERROR_NOT_SUPPORT;
657 }
658 
RegisterConsumerListener(IBufferConsumerListenerClazz * listener)659 GSError ProducerSurface::RegisterConsumerListener(IBufferConsumerListenerClazz *listener)
660 {
661     return GSERROR_NOT_SUPPORT;
662 }
663 
UnregisterConsumerListener()664 GSError ProducerSurface::UnregisterConsumerListener()
665 {
666     return GSERROR_NOT_SUPPORT;
667 }
668 
RegisterReleaseListener(OnReleaseFunc func)669 GSError ProducerSurface::RegisterReleaseListener(OnReleaseFunc func)
670 {
671     if (func == nullptr || producer_ == nullptr) {
672         return GSERROR_INVALID_ARGUMENTS;
673     }
674     sptr<IProducerListener> listener;
675     {
676         std::lock_guard<std::mutex> lockGuard(listenerMutex_);
677         listener_ = new BufferReleaseProducerListener(func);
678         listener = listener_;
679     }
680     return producer_->RegisterReleaseListener(listener);
681 }
682 
RegisterReleaseListener(OnReleaseFuncWithFence funcWithFence)683 GSError ProducerSurface::RegisterReleaseListener(OnReleaseFuncWithFence funcWithFence)
684 {
685     if (funcWithFence == nullptr || producer_ == nullptr) {
686         return GSERROR_INVALID_ARGUMENTS;
687     }
688     sptr<IProducerListener> listener;
689     {
690         std::lock_guard<std::mutex> lockGuard(listenerMutex_);
691         listener_ = new BufferReleaseProducerListener(nullptr, funcWithFence);
692         listener = listener_;
693     }
694     return producer_->RegisterReleaseListener(listener);
695 }
696 
UnRegisterReleaseListener()697 GSError ProducerSurface::UnRegisterReleaseListener()
698 {
699     if (producer_ == nullptr) {
700         return GSERROR_INVALID_ARGUMENTS;
701     }
702     {
703         std::lock_guard<std::mutex> lockGuard(delegatorMutex_);
704         wpPSurfaceDelegator_ = nullptr;
705     }
706     {
707         std::lock_guard<std::mutex> lockGuard(listenerMutex_);
708         if (listener_ != nullptr) {
709             listener_->ResetReleaseFunc();
710         }
711     }
712     return producer_->UnRegisterReleaseListener();
713 }
714 
RegisterDeleteBufferListener(OnDeleteBufferFunc func,bool isForUniRedraw)715 GSError ProducerSurface::RegisterDeleteBufferListener(OnDeleteBufferFunc func, bool isForUniRedraw)
716 {
717     return GSERROR_NOT_SUPPORT;
718 }
719 
RegisterUserDataChangeListener(const std::string & funcName,OnUserDataChangeFunc func)720 GSError ProducerSurface::RegisterUserDataChangeListener(const std::string& funcName, OnUserDataChangeFunc func)
721 {
722     if (func == nullptr) {
723         return GSERROR_INVALID_ARGUMENTS;
724     }
725     std::lock_guard<std::mutex> lockGuard(lockMutex_);
726     if (onUserDataChange_.find(funcName) != onUserDataChange_.end()) {
727         BLOGD("already register func: %{public}s, uniqueId: %{public}" PRIu64 ".",
728             funcName.c_str(), queueId_);
729         return GSERROR_INVALID_ARGUMENTS;
730     }
731 
732     onUserDataChange_[funcName] = func;
733     return GSERROR_OK;
734 }
735 
UnRegisterUserDataChangeListener(const std::string & funcName)736 GSError ProducerSurface::UnRegisterUserDataChangeListener(const std::string& funcName)
737 {
738     std::lock_guard<std::mutex> lockGuard(lockMutex_);
739     if (onUserDataChange_.erase(funcName) == 0) {
740         BLOGD("no register funcName: %{public}s, uniqueId: %{public}" PRIu64 ".", funcName.c_str(), queueId_);
741         return GSERROR_INVALID_ARGUMENTS;
742     }
743 
744     return GSERROR_OK;
745 }
746 
ClearUserDataChangeListener()747 GSError ProducerSurface::ClearUserDataChangeListener()
748 {
749     std::lock_guard<std::mutex> lockGuard(lockMutex_);
750     onUserDataChange_.clear();
751     return GSERROR_OK;
752 }
753 
IsRemote()754 bool ProducerSurface::IsRemote()
755 {
756     if (producer_ == nullptr || producer_->AsObject() == nullptr) {
757         return false;
758     }
759     return producer_->AsObject()->IsProxyObject();
760 }
761 
CleanAllLocked(uint32_t * bufSeqNum)762 void ProducerSurface::CleanAllLocked(uint32_t *bufSeqNum)
763 {
764     if (bufSeqNum && bufferProducerCache_.find(*bufSeqNum) != bufferProducerCache_.end()) {
765         preCacheBuffer_ = bufferProducerCache_[*bufSeqNum];
766     }
767     bufferProducerCache_.clear();
768     auto spNativeWindow = wpNativeWindow_.promote();
769     if (spNativeWindow != nullptr) {
770         auto& bufferCache = spNativeWindow->bufferCache_;
771         for (auto& [seqNum, buffer] : bufferCache) {
772             NativeObjectUnreference(buffer);
773         }
774         bufferCache.clear();
775     }
776 }
777 
CleanCacheLocked(bool cleanAll)778 GSError ProducerSurface::CleanCacheLocked(bool cleanAll)
779 {
780     BLOGD("CleanCacheLocked, uniqueId: %{public}" PRIu64 ".", queueId_);
781     if (producer_ == nullptr) {
782         return GSERROR_INVALID_ARGUMENTS;
783     }
784     uint32_t bufSeqNum = 0;
785     GSError ret = producer_->CleanCache(cleanAll, &bufSeqNum);
786     CleanAllLocked(&bufSeqNum);
787     if (cleanAll) {
788         preCacheBuffer_ = nullptr;
789     }
790     return ret;
791 }
792 
CleanCache(bool cleanAll)793 GSError ProducerSurface::CleanCache(bool cleanAll)
794 {
795     if (producer_ == nullptr) {
796         return GSERROR_INVALID_ARGUMENTS;
797     }
798     BLOGD("CleanCache, uniqueId: %{public}" PRIu64 ".", queueId_);
799     std::lock_guard<std::mutex> lockGuard(mutex_);
800     uint32_t bufSeqNum = 0;
801     GSError ret = producer_->CleanCache(cleanAll, &bufSeqNum);
802     CleanAllLocked(&bufSeqNum);
803     if (cleanAll) {
804         preCacheBuffer_ = nullptr;
805     }
806     return ret;
807 }
808 
GoBackground()809 GSError ProducerSurface::GoBackground()
810 {
811     if (producer_ == nullptr) {
812         return GSERROR_INVALID_ARGUMENTS;
813     }
814     BLOGD("GoBackground, uniqueId: %{public}" PRIu64 ".", queueId_);
815     {
816         std::lock_guard<std::mutex> lockGuard(mutex_);
817         CleanAllLocked(nullptr);
818     }
819     return producer_->GoBackground();
820 }
821 
GetUniqueId() const822 uint64_t ProducerSurface::GetUniqueId() const
823 {
824     if (!inited_.load()) {
825         BLOGW("ProducerSurface is not initialized.");
826     }
827     return queueId_;
828 }
829 
SetTransform(GraphicTransformType transform)830 GSError ProducerSurface::SetTransform(GraphicTransformType transform)
831 {
832     if (producer_ == nullptr) {
833         return GSERROR_INVALID_ARGUMENTS;
834     }
835     return producer_->SetTransform(transform);
836 }
837 
GetTransform() const838 GraphicTransformType ProducerSurface::GetTransform() const
839 {
840     if (producer_ == nullptr) {
841         return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
842     }
843     GraphicTransformType transform = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
844     if (producer_->GetTransform(transform) != GSERROR_OK) {
845         BLOGE("GetTransform failed, uniqueId: %{public}" PRIu64 ".", queueId_);
846         return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
847     }
848     return transform;
849 }
850 
IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> & infos,std::vector<bool> & supporteds)851 GSError ProducerSurface::IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo>& infos,
852                                           std::vector<bool>& supporteds)
853 {
854     if (producer_ == nullptr || infos.size() == 0 || infos.size() != supporteds.size()) {
855         return GSERROR_INVALID_ARGUMENTS;
856     }
857     return producer_->IsSupportedAlloc(infos, supporteds);
858 }
859 
Connect()860 GSError ProducerSurface::Connect()
861 {
862     if (producer_ == nullptr) {
863         return GSERROR_INVALID_ARGUMENTS;
864     }
865     std::lock_guard<std::mutex> lockGuard(mutex_);
866     if (!isDisconnected_) {
867         BLOGE("Surface has been connect, uniqueId: %{public}" PRIu64 ".", queueId_);
868         return SURFACE_ERROR_CONSUMER_IS_CONNECTED;
869     }
870     BLOGD("Connect, uniqueId: %{public}" PRIu64 ".", queueId_);
871     GSError ret = producer_->Connect();
872     if (ret == GSERROR_OK) {
873         isDisconnected_ = false;
874     }
875     return ret;
876 }
877 
Disconnect()878 GSError ProducerSurface::Disconnect()
879 {
880     if (producer_ == nullptr) {
881         return GSERROR_INVALID_ARGUMENTS;
882     }
883     std::lock_guard<std::mutex> lockGuard(mutex_);
884     if (isDisconnected_) {
885         BLOGD("Surface is disconnect, uniqueId: %{public}" PRIu64 ".", queueId_);
886         return SURFACE_ERROR_CONSUMER_DISCONNECTED;
887     }
888     BLOGD("Disconnect, uniqueId: %{public}" PRIu64 ".", queueId_);
889     uint32_t bufSeqNum = 0;
890     GSError ret = producer_->Disconnect(&bufSeqNum);
891     if (ret == GSERROR_OK) {
892         isDisconnected_ = true;
893     }
894     CleanAllLocked(&bufSeqNum);
895     return ret;
896 }
897 
SetScalingMode(uint32_t sequence,ScalingMode scalingMode)898 GSError ProducerSurface::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
899 {
900     if (producer_ == nullptr || scalingMode < ScalingMode::SCALING_MODE_FREEZE ||
901         scalingMode > ScalingMode::SCALING_MODE_SCALE_FIT) {
902         return GSERROR_INVALID_ARGUMENTS;
903     }
904     return producer_->SetScalingMode(sequence, scalingMode);
905 }
906 
SetScalingMode(ScalingMode scalingMode)907 GSError ProducerSurface::SetScalingMode(ScalingMode scalingMode)
908 {
909     if (producer_ == nullptr || scalingMode < ScalingMode::SCALING_MODE_FREEZE ||
910         scalingMode > ScalingMode::SCALING_MODE_SCALE_FIT) {
911         return GSERROR_INVALID_ARGUMENTS;
912     }
913     return producer_->SetScalingMode(scalingMode);
914 }
915 
SetBufferHold(bool hold)916 void ProducerSurface::SetBufferHold(bool hold)
917 {
918     if (producer_ == nullptr) {
919         return;
920     }
921     producer_->SetBufferHold(hold);
922 }
923 
GetScalingMode(uint32_t sequence,ScalingMode & scalingMode)924 GSError ProducerSurface::GetScalingMode(uint32_t sequence, ScalingMode& scalingMode)
925 {
926     return GSERROR_NOT_SUPPORT;
927 }
928 
SetMetaData(uint32_t sequence,const std::vector<GraphicHDRMetaData> & metaData)929 GSError ProducerSurface::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData>& metaData)
930 {
931     if (producer_ == nullptr || metaData.size() == 0) {
932         return GSERROR_INVALID_ARGUMENTS;
933     }
934     return producer_->SetMetaData(sequence, metaData);
935 }
936 
SetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)937 GSError ProducerSurface::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
938                                         const std::vector<uint8_t>& metaData)
939 {
940     if (producer_ == nullptr || key < GraphicHDRMetadataKey::GRAPHIC_MATAKEY_RED_PRIMARY_X ||
941         key > GraphicHDRMetadataKey::GRAPHIC_MATAKEY_HDR_VIVID || metaData.size() == 0) {
942         return GSERROR_INVALID_ARGUMENTS;
943     }
944     return producer_->SetMetaDataSet(sequence, key, metaData);
945 }
946 
QueryMetaDataType(uint32_t sequence,HDRMetaDataType & type) const947 GSError ProducerSurface::QueryMetaDataType(uint32_t sequence, HDRMetaDataType &type) const
948 {
949     return GSERROR_NOT_SUPPORT;
950 }
951 
GetMetaData(uint32_t sequence,std::vector<GraphicHDRMetaData> & metaData) const952 GSError ProducerSurface::GetMetaData(uint32_t sequence, std::vector<GraphicHDRMetaData> &metaData) const
953 {
954     return GSERROR_NOT_SUPPORT;
955 }
956 
GetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey & key,std::vector<uint8_t> & metaData) const957 GSError ProducerSurface::GetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey &key,
958                                         std::vector<uint8_t> &metaData) const
959 {
960     return GSERROR_NOT_SUPPORT;
961 }
962 
SetTunnelHandle(const GraphicExtDataHandle * handle)963 GSError ProducerSurface::SetTunnelHandle(const GraphicExtDataHandle *handle)
964 {
965     if (producer_ == nullptr) {
966         return GSERROR_INVALID_ARGUMENTS;
967     }
968     return producer_->SetTunnelHandle(handle);
969 }
970 
GetTunnelHandle() const971 sptr<SurfaceTunnelHandle> ProducerSurface::GetTunnelHandle() const
972 {
973     // not support
974     return nullptr;
975 }
976 
SetPresentTimestamp(uint32_t sequence,const GraphicPresentTimestamp & timestamp)977 GSError ProducerSurface::SetPresentTimestamp(uint32_t sequence, const GraphicPresentTimestamp &timestamp)
978 {
979     return GSERROR_NOT_SUPPORT;
980 }
981 
GetPresentTimestamp(uint32_t sequence,GraphicPresentTimestampType type,int64_t & time) const982 GSError ProducerSurface::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type,
983                                              int64_t& time) const
984 {
985     if (producer_ == nullptr || type <= GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_UNSUPPORTED ||
986         type > GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_TIMESTAMP) {
987         return GSERROR_INVALID_ARGUMENTS;
988     }
989     return producer_->GetPresentTimestamp(sequence, type, time);
990 }
991 
GetDefaultFormat()992 int32_t ProducerSurface::GetDefaultFormat()
993 {
994     return 0;
995 }
996 
SetDefaultFormat(int32_t format)997 GSError ProducerSurface::SetDefaultFormat(int32_t format)
998 {
999     return GSERROR_NOT_SUPPORT;
1000 }
1001 
GetDefaultColorGamut()1002 int32_t ProducerSurface::GetDefaultColorGamut()
1003 {
1004     return 0;
1005 }
1006 
SetDefaultColorGamut(int32_t colorGamut)1007 GSError ProducerSurface::SetDefaultColorGamut(int32_t colorGamut)
1008 {
1009     return GSERROR_NOT_SUPPORT;
1010 }
1011 
GetNativeSurface()1012 sptr<NativeSurface> ProducerSurface::GetNativeSurface()
1013 {
1014     return nullptr;
1015 }
1016 
SetWptrNativeWindowToPSurface(void * nativeWindow)1017 GSError ProducerSurface::SetWptrNativeWindowToPSurface(void* nativeWindow)
1018 {
1019     NativeWindow *nw = reinterpret_cast<NativeWindow *>(nativeWindow);
1020     std::lock_guard<std::mutex> lockGuard(mutex_);
1021     wpNativeWindow_ = nw;
1022     return GSERROR_OK;
1023 }
1024 
SetRequestWidthAndHeight(int32_t width,int32_t height)1025 void ProducerSurface::SetRequestWidthAndHeight(int32_t width, int32_t height)
1026 {
1027     std::lock_guard<std::mutex> lockGuard(mutex_);
1028     requestWidth_ = width;
1029     requestHeight_ = height;
1030 }
1031 
GetRequestWidth()1032 int32_t ProducerSurface::GetRequestWidth()
1033 {
1034     std::lock_guard<std::mutex> lockGuard(mutex_);
1035     return requestWidth_;
1036 }
1037 
GetRequestHeight()1038 int32_t ProducerSurface::GetRequestHeight()
1039 {
1040     std::lock_guard<std::mutex> lockGuard(mutex_);
1041     return requestHeight_;
1042 }
1043 
GetWindowConfig()1044 BufferRequestConfig* ProducerSurface::GetWindowConfig()
1045 {
1046     return &windowConfig_;
1047 }
1048 
SetHdrWhitePointBrightness(float brightness)1049 GSError ProducerSurface::SetHdrWhitePointBrightness(float brightness)
1050 {
1051     if (producer_ == nullptr) {
1052         return GSERROR_INVALID_ARGUMENTS;
1053     }
1054     if (brightness < 0.0 || brightness > 1.0) {
1055         BLOGE("brightness:%{public}f, uniqueId: %{public}" PRIu64 ".", brightness, queueId_);
1056         return GSERROR_INVALID_ARGUMENTS;
1057     }
1058     return producer_->SetHdrWhitePointBrightness(brightness);
1059 }
1060 
SetSdrWhitePointBrightness(float brightness)1061 GSError ProducerSurface::SetSdrWhitePointBrightness(float brightness)
1062 {
1063     if (producer_ == nullptr) {
1064         return GSERROR_INVALID_ARGUMENTS;
1065     }
1066     if (brightness < 0.0 || brightness > 1.0) {
1067         BLOGE("brightness:%{public}f, uniqueId: %{public}" PRIu64 ".", brightness, queueId_);
1068         return GSERROR_INVALID_ARGUMENTS;
1069     }
1070     return producer_->SetSdrWhitePointBrightness(brightness);
1071 }
1072 
AcquireLastFlushedBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],uint32_t matrixSize,bool isUseNewMatrix)1073 GSError ProducerSurface::AcquireLastFlushedBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
1074     float matrix[16], uint32_t matrixSize, bool isUseNewMatrix)
1075 {
1076     if (producer_ == nullptr) {
1077         return GSERROR_INVALID_ARGUMENTS;
1078     }
1079     return producer_->AcquireLastFlushedBuffer(buffer, fence, matrix, matrixSize, isUseNewMatrix);
1080 }
1081 
ReleaseLastFlushedBuffer(sptr<SurfaceBuffer> buffer)1082 GSError ProducerSurface::ReleaseLastFlushedBuffer(sptr<SurfaceBuffer> buffer)
1083 {
1084     if (buffer == nullptr || producer_ == nullptr) {
1085         return GSERROR_INVALID_ARGUMENTS;
1086     }
1087     return producer_->ReleaseLastFlushedBuffer(buffer->GetSeqNum());
1088 }
1089 
UpdateCacheLocked(sptr<BufferExtraData> & bedataimpl,IBufferProducer::RequestBufferReturnValue & retval,BufferRequestConfig & config)1090 GSError ProducerSurface::UpdateCacheLocked(sptr<BufferExtraData>& bedataimpl,
1091     IBufferProducer::RequestBufferReturnValue& retval, BufferRequestConfig& config)
1092 {
1093     // add cache
1094     if (retval.buffer == nullptr) {
1095         auto it = bufferProducerCache_.find(retval.sequence);
1096         if (it == bufferProducerCache_.end()) {
1097             DeleteCacheBufferLocked(bedataimpl, retval, config);
1098             BLOGE("cache not find buffer(%{public}u), uniqueId: %{public}" PRIu64 ".", retval.sequence, queueId_);
1099             return SURFACE_ERROR_UNKOWN;
1100         } else {
1101             retval.buffer = it->second;
1102         }
1103     }
1104     bufferProducerCache_.erase(retval.sequence);
1105     SetBufferConfigLocked(bedataimpl, retval, config);
1106     DeleteCacheBufferLocked(bedataimpl, retval, config);
1107     return SURFACE_ERROR_OK;
1108 }
1109 
RequestAndDetachBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,BufferRequestConfig & config)1110 GSError ProducerSurface::RequestAndDetachBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
1111                                                 BufferRequestConfig& config)
1112 {
1113     if (producer_ == nullptr) {
1114         return GSERROR_INVALID_ARGUMENTS;
1115     }
1116     IBufferProducer::RequestBufferReturnValue retval;
1117     sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
1118 
1119     std::lock_guard<std::mutex> lockGuard(mutex_);
1120     GSError ret = producer_->RequestAndDetachBuffer(config, bedataimpl, retval);
1121     if (ret != GSERROR_OK) {
1122         if (ret == GSERROR_NO_CONSUMER) {
1123             CleanCacheLocked(false);
1124         }
1125         /**
1126          * if server is connected, but result is failed.
1127          * client needs to synchronize status.
1128          */
1129         if (retval.isConnected) {
1130             isDisconnected_ = false;
1131         }
1132         BLOGD("RequestAndDetachBuffer ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
1133         return ret;
1134     }
1135     isDisconnected_ = false;
1136     UpdateCacheLocked(bedataimpl, retval, config);
1137     buffer = retval.buffer;
1138     fence = retval.fence;
1139 
1140     if (SetMetadataValue(buffer) != GSERROR_OK) {
1141         BLOGD("SetMetadataValue fail, uniqueId: %{public}" PRIu64 ".", queueId_);
1142     }
1143     return ret;
1144 }
1145 
AttachAndFlushBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence,BufferFlushConfig & config,bool needMap)1146 GSError ProducerSurface::AttachAndFlushBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence,
1147                                               BufferFlushConfig& config, bool needMap)
1148 {
1149     if (buffer == nullptr || fence == nullptr || producer_ == nullptr) {
1150         return GSERROR_INVALID_ARGUMENTS;
1151     }
1152 
1153     sptr<BufferExtraData> bedata = buffer->GetExtraData();
1154     if (bedata == nullptr) {
1155         return GSERROR_INVALID_ARGUMENTS;
1156     }
1157 
1158     BufferFlushConfigWithDamages configWithDamages;
1159     configWithDamages.damages.push_back(config.damage);
1160     configWithDamages.timestamp = config.timestamp;
1161     configWithDamages.desiredPresentTimestamp = config.desiredPresentTimestamp;
1162 
1163     auto ret = producer_->AttachAndFlushBuffer(buffer, bedata, fence, configWithDamages, needMap);
1164     if (ret == GSERROR_OK) {
1165         std::lock_guard<std::mutex> lockGuard(mutex_);
1166         if (bufferProducerCache_.find(buffer->GetSeqNum()) != bufferProducerCache_.end()) {
1167             BLOGE("Attach buffer %{public}d, uniqueId: %{public}" PRIu64 ".", buffer->GetSeqNum(), queueId_);
1168             return SURFACE_ERROR_BUFFER_IS_INCACHE;
1169         }
1170         bufferProducerCache_[buffer->GetSeqNum()] = buffer;
1171     } else if (ret == GSERROR_NO_CONSUMER) {
1172         CleanCache();
1173         BLOGD("FlushBuffer ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
1174     }
1175     return ret;
1176 }
1177 
ReleasePreCacheBuffer(int bufferCacheSize)1178 void ProducerSurface::ReleasePreCacheBuffer(int bufferCacheSize)
1179 {
1180     // client must have more than two buffer, otherwise RS can not delete the prebuffer.
1181     // Because RS has two buffer(pre and cur).
1182     const int deletePreCacheBufferThreshold = 2; // 2 is delete threshold.
1183     if (bufferCacheSize >= deletePreCacheBufferThreshold) {
1184         preCacheBuffer_ = nullptr;
1185     }
1186 }
1187 
GetCycleBuffersNumber(uint32_t & cycleBuffersNumber)1188 GSError ProducerSurface::GetCycleBuffersNumber(uint32_t& cycleBuffersNumber)
1189 {
1190     if (producer_ == nullptr) {
1191         return SURFACE_ERROR_UNKOWN;
1192     }
1193     return producer_->GetCycleBuffersNumber(cycleBuffersNumber);
1194 }
1195 
SetCycleBuffersNumber(uint32_t cycleBuffersNumber)1196 GSError ProducerSurface::SetCycleBuffersNumber(uint32_t cycleBuffersNumber)
1197 {
1198     if (producer_ == nullptr) {
1199         return SURFACE_ERROR_UNKOWN;
1200     }
1201     return producer_->SetCycleBuffersNumber(cycleBuffersNumber);
1202 }
1203 } // namespace OHOS
1204