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