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     } else {
214         auto it = bufferProducerCache_.find(retval.sequence);
215         if (it == bufferProducerCache_.end()) {
216             DeleteCacheBufferLocked(bedataimpl, retval, config);
217             BLOGE("cache not find buffer(%{public}u), uniqueId: %{public}" PRIu64 ".", retval.sequence, queueId_);
218             return SURFACE_ERROR_UNKOWN;
219         } else {
220             retval.buffer = it->second;
221         }
222     }
223     SetBufferConfigLocked(bedataimpl, retval, config);
224     DeleteCacheBufferLocked(bedataimpl, retval, config);
225     return SURFACE_ERROR_OK;
226 }
227 
RequestBuffers(std::vector<sptr<SurfaceBuffer>> & buffers,std::vector<sptr<SyncFence>> & fences,BufferRequestConfig & config)228 GSError ProducerSurface::RequestBuffers(std::vector<sptr<SurfaceBuffer>>& buffers,
229     std::vector<sptr<SyncFence>>& fences, BufferRequestConfig& config)
230 {
231     if (producer_ == nullptr) {
232         return GSERROR_INVALID_ARGUMENTS;
233     }
234     std::vector<IBufferProducer::RequestBufferReturnValue> retvalues;
235     retvalues.resize(SURFACE_MAX_QUEUE_SIZE);
236     std::vector<sptr<BufferExtraData>> bedataimpls;
237     for (size_t i = 0; i < retvalues.size(); ++i) {
238         sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
239         bedataimpls.emplace_back(bedataimpl);
240     }
241     std::lock_guard<std::mutex> lockGuard(mutex_);
242     GSError ret = producer_->RequestBuffers(config, bedataimpls, retvalues);
243     if (ret != GSERROR_NO_BUFFER && ret != GSERROR_OK) {
244         /**
245          * if server is connected, but result is failed.
246          * client needs to synchronize status.
247          */
248         if (retvalues[0].isConnected) {
249             isDisconnected_ = false;
250         }
251         BLOGD("RequestBuffers ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
252         return ret;
253     }
254     isDisconnected_ = false;
255     for (size_t i = 0; i < retvalues.size(); ++i) {
256         AddCacheLocked(bedataimpls[i], retvalues[i], config);
257         buffers.emplace_back(retvalues[i].buffer);
258         fences.emplace_back(retvalues[i].fence);
259     }
260     return GSERROR_OK;
261 }
262 
FlushBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence,BufferFlushConfig & config)263 GSError ProducerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer,
264                                      const sptr<SyncFence>& fence, BufferFlushConfig& config)
265 {
266     BufferFlushConfigWithDamages configWithDamages;
267     configWithDamages.damages.push_back(config.damage);
268     configWithDamages.timestamp = config.timestamp;
269     configWithDamages.desiredPresentTimestamp = config.desiredPresentTimestamp;
270     return FlushBuffer(buffer, fence, configWithDamages);
271 }
272 
FlushBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence,BufferFlushConfigWithDamages & config)273 GSError ProducerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence,
274                                      BufferFlushConfigWithDamages& config)
275 {
276     if (buffer == nullptr || fence == nullptr || producer_ == nullptr) {
277         return GSERROR_INVALID_ARGUMENTS;
278     }
279 
280     sptr<BufferExtraData> bedata = buffer->GetExtraData();
281     if (bedata == nullptr) {
282         return GSERROR_INVALID_ARGUMENTS;
283     }
284     auto ret = producer_->FlushBuffer(buffer->GetSeqNum(), bedata, fence, config);
285     if (ret == GSERROR_NO_CONSUMER) {
286         CleanCache();
287         BLOGD("FlushBuffer ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
288     }
289     return ret;
290 }
291 
FlushBuffers(const std::vector<sptr<SurfaceBuffer>> & buffers,const std::vector<sptr<SyncFence>> & fences,const std::vector<BufferFlushConfigWithDamages> & configs)292 GSError ProducerSurface::FlushBuffers(const std::vector<sptr<SurfaceBuffer>>& buffers,
293     const std::vector<sptr<SyncFence>>& fences, const std::vector<BufferFlushConfigWithDamages>& configs)
294 {
295     if (buffers.size() == 0 || buffers.size() != fences.size() || producer_ == nullptr
296         || buffers.size() > SURFACE_MAX_QUEUE_SIZE) {
297         return GSERROR_INVALID_ARGUMENTS;
298     }
299     for (size_t i = 0; i < buffers.size(); ++i) {
300         if (buffers[i] == nullptr || fences[i] == nullptr) {
301             BLOGE("buffer or fence is nullptr, i: %{public}zu, uniqueId: %{public}" PRIu64 ".", i, queueId_);
302             return GSERROR_INVALID_ARGUMENTS;
303         }
304     }
305     std::vector<sptr<BufferExtraData>> bedata;
306     bedata.reserve(buffers.size());
307     std::vector<uint32_t> sequences;
308     sequences.reserve(buffers.size());
309     for (uint32_t i = 0; i < buffers.size(); ++i) {
310         bedata.emplace_back(buffers[i]->GetExtraData());
311         sequences.emplace_back(buffers[i]->GetSeqNum());
312     }
313     auto ret = producer_->FlushBuffers(sequences, bedata, fences, configs);
314     if (ret == GSERROR_NO_CONSUMER) {
315         CleanCache();
316         BLOGD("FlushBuffers ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
317     }
318     return ret;
319 }
320 
GetLastFlushedBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],bool isUseNewMatrix)321 GSError ProducerSurface::GetLastFlushedBuffer(sptr<SurfaceBuffer>& buffer,
322     sptr<SyncFence>& fence, float matrix[16], bool isUseNewMatrix)
323 {
324     if (producer_ == nullptr) {
325         return GSERROR_INVALID_ARGUMENTS;
326     }
327     return producer_->GetLastFlushedBuffer(buffer, fence, matrix, isUseNewMatrix);
328 }
329 
AcquireBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,int64_t & timestamp,Rect & damage)330 GSError ProducerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
331                                        int64_t &timestamp, Rect &damage)
332 {
333     return GSERROR_NOT_SUPPORT;
334 }
ReleaseBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence)335 GSError ProducerSurface::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence)
336 {
337     return GSERROR_NOT_SUPPORT;
338 }
339 
RequestBuffer(sptr<SurfaceBuffer> & buffer,int32_t & fence,BufferRequestConfig & config)340 GSError ProducerSurface::RequestBuffer(sptr<SurfaceBuffer>& buffer,
341     int32_t& fence, BufferRequestConfig& config)
342 {
343     sptr<SyncFence> syncFence = SyncFence::InvalidFence();
344     auto ret = RequestBuffer(buffer, syncFence, config);
345     if (ret != GSERROR_OK) {
346         fence = -1;
347         return ret;
348     }
349     fence = syncFence->Dup();
350     return GSERROR_OK;
351 }
352 
CancelBuffer(sptr<SurfaceBuffer> & buffer)353 GSError ProducerSurface::CancelBuffer(sptr<SurfaceBuffer>& buffer)
354 {
355     if (buffer == nullptr || producer_ == nullptr) {
356         return GSERROR_INVALID_ARGUMENTS;
357     }
358 
359     sptr<BufferExtraData> bedata = buffer->GetExtraData();
360     if (bedata == nullptr) {
361         return GSERROR_INVALID_ARGUMENTS;
362     }
363     return producer_->CancelBuffer(buffer->GetSeqNum(), bedata);
364 }
365 
FlushBuffer(sptr<SurfaceBuffer> & buffer,int32_t fence,BufferFlushConfig & config)366 GSError ProducerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer,
367     int32_t fence, BufferFlushConfig& config)
368 {
369     // fence need close?
370     sptr<SyncFence> syncFence = new SyncFence(fence);
371     return FlushBuffer(buffer, syncFence, config);
372 }
373 
AcquireBuffer(sptr<SurfaceBuffer> & buffer,int32_t & fence,int64_t & timestamp,Rect & damage)374 GSError ProducerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, int32_t &fence,
375     int64_t &timestamp, Rect &damage)
376 {
377     return GSERROR_NOT_SUPPORT;
378 }
379 
ReleaseBuffer(sptr<SurfaceBuffer> & buffer,int32_t fence)380 GSError ProducerSurface::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, int32_t fence)
381 {
382     return GSERROR_NOT_SUPPORT;
383 }
384 
AttachBufferToQueue(sptr<SurfaceBuffer> buffer)385 GSError ProducerSurface::AttachBufferToQueue(sptr<SurfaceBuffer> buffer)
386 {
387     if (buffer == nullptr || producer_ == nullptr) {
388         return SURFACE_ERROR_UNKOWN;
389     }
390     auto ret = producer_->AttachBufferToQueue(buffer);
391     if (ret == GSERROR_OK) {
392         std::lock_guard<std::mutex> lockGuard(mutex_);
393         if (bufferProducerCache_.find(buffer->GetSeqNum()) != bufferProducerCache_.end()) {
394             BLOGE("Attach buffer %{public}d, uniqueId: %{public}" PRIu64 ".", buffer->GetSeqNum(), queueId_);
395             return SURFACE_ERROR_BUFFER_IS_INCACHE;
396         }
397         bufferProducerCache_[buffer->GetSeqNum()] = buffer;
398     }
399     return ret;
400 }
401 
DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)402 GSError ProducerSurface::DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)
403 {
404     if (buffer == nullptr || producer_ == nullptr) {
405         return SURFACE_ERROR_UNKOWN;
406     }
407     auto ret = producer_->DetachBufferFromQueue(buffer);
408     if (ret == GSERROR_OK) {
409         std::lock_guard<std::mutex> lockGuard(mutex_);
410         if (bufferProducerCache_.find(buffer->GetSeqNum()) == bufferProducerCache_.end()) {
411             BLOGE("Detach buffer %{public}d, uniqueId: %{public}" PRIu64 ".", buffer->GetSeqNum(), queueId_);
412             return SURFACE_ERROR_BUFFER_NOT_INCACHE;
413         }
414         bufferProducerCache_.erase(buffer->GetSeqNum());
415     }
416     return ret;
417 }
418 
AttachBuffer(sptr<SurfaceBuffer> & buffer)419 GSError ProducerSurface::AttachBuffer(sptr<SurfaceBuffer>& buffer)
420 {
421     if (buffer == nullptr || producer_ == nullptr) {
422         return GSERROR_INVALID_ARGUMENTS;
423     }
424 
425     return producer_->AttachBuffer(buffer);
426 }
427 
AttachBuffer(sptr<SurfaceBuffer> & buffer,int32_t timeOut)428 GSError ProducerSurface::AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut)
429 {
430     if (buffer == nullptr || producer_ == nullptr) {
431         return GSERROR_INVALID_ARGUMENTS;
432     }
433 
434     return producer_->AttachBuffer(buffer, timeOut);
435 }
436 
DetachBuffer(sptr<SurfaceBuffer> & buffer)437 GSError ProducerSurface::DetachBuffer(sptr<SurfaceBuffer>& buffer)
438 {
439     if (buffer == nullptr || producer_ == nullptr) {
440         return GSERROR_INVALID_ARGUMENTS;
441     }
442     return producer_->DetachBuffer(buffer);
443 }
444 
RegisterSurfaceDelegator(sptr<IRemoteObject> client)445 GSError ProducerSurface::RegisterSurfaceDelegator(sptr<IRemoteObject> client)
446 {
447     if (client == nullptr) {
448         return GSERROR_INVALID_ARGUMENTS;
449     }
450     sptr<ProducerSurfaceDelegator> surfaceDelegator = ProducerSurfaceDelegator::Create();
451     if (surfaceDelegator == nullptr) {
452         BLOGE("surfaceDelegator is nullptr");
453         return GSERROR_INVALID_ARGUMENTS;
454     }
455     if (!surfaceDelegator->SetClient(client)) {
456         BLOGE("SetClient failed");
457         return GSERROR_INVALID_ARGUMENTS;
458     }
459 
460     surfaceDelegator->SetSurface(this);
461     {
462         std::lock_guard<std::mutex> lockGuard(delegatorMutex_);
463         wpPSurfaceDelegator_ = surfaceDelegator;
464     }
465 
466     auto releaseBufferCallBack = [weakThis = wptr(this)] (const sptr<SurfaceBuffer>& buffer,
467         const sptr<SyncFence>& fence) -> GSError {
468         auto pSurface = weakThis.promote();
469         if (pSurface == nullptr) {
470             BLOGE("pSurface is nullptr");
471             return GSERROR_INVALID_ARGUMENTS;
472         }
473         sptr<ProducerSurfaceDelegator> surfaceDelegator = nullptr;
474         {
475             std::lock_guard<std::mutex> lockGuard(pSurface->delegatorMutex_);
476             surfaceDelegator = pSurface->wpPSurfaceDelegator_.promote();
477         }
478         if (surfaceDelegator == nullptr) {
479             return GSERROR_INVALID_ARGUMENTS;
480         }
481         int error = surfaceDelegator->ReleaseBuffer(buffer, fence);
482         return static_cast<GSError>(error);
483     };
484     RegisterReleaseListener(releaseBufferCallBack);
485     return GSERROR_OK;
486 }
487 
QueryIfBufferAvailable()488 bool ProducerSurface::QueryIfBufferAvailable()
489 {
490     return false;
491 }
492 
GetQueueSize()493 uint32_t ProducerSurface::GetQueueSize()
494 {
495     if (producer_ == nullptr) {
496         return 0;
497     }
498     return producer_->GetQueueSize();
499 }
500 
SetQueueSize(uint32_t queueSize)501 GSError ProducerSurface::SetQueueSize(uint32_t queueSize)
502 {
503     if (producer_ == nullptr) {
504         return GSERROR_INVALID_ARGUMENTS;
505     }
506     return producer_->SetQueueSize(queueSize);
507 }
508 
GetName()509 const std::string& ProducerSurface::GetName()
510 {
511     if (!inited_.load()) {
512         BLOGW("ProducerSurface is not initialized.");
513     }
514     return name_;
515 }
516 
SetDefaultWidthAndHeight(int32_t width,int32_t height)517 GSError ProducerSurface::SetDefaultWidthAndHeight(int32_t width, int32_t height)
518 {
519     return GSERROR_NOT_SUPPORT;
520 }
521 
GetDefaultWidth()522 int32_t ProducerSurface::GetDefaultWidth()
523 {
524     if (producer_ == nullptr) {
525         return -1;
526     }
527     return producer_->GetDefaultWidth();
528 }
529 
GetDefaultHeight()530 int32_t ProducerSurface::GetDefaultHeight()
531 {
532     if (producer_ == nullptr) {
533         return -1;
534     }
535     return producer_->GetDefaultHeight();
536 }
537 
GetTransformHint() const538 GraphicTransformType ProducerSurface::GetTransformHint() const
539 {
540     std::lock_guard<std::mutex> lockGuard(mutex_);
541     return lastSetTransformHint_;
542 }
543 
SetTransformHint(GraphicTransformType transformHint)544 GSError ProducerSurface::SetTransformHint(GraphicTransformType transformHint)
545 {
546     if (producer_ == nullptr) {
547         return GSERROR_INVALID_ARGUMENTS;
548     }
549     GSError err = producer_->SetTransformHint(transformHint);
550     if (err == GSERROR_OK) {
551         std::lock_guard<std::mutex> lockGuard(mutex_);
552         lastSetTransformHint_ = transformHint;
553     }
554     return err;
555 }
556 
SetDefaultUsage(uint64_t usage)557 GSError ProducerSurface::SetDefaultUsage(uint64_t usage)
558 {
559     if (producer_ == nullptr) {
560         return GSERROR_INVALID_ARGUMENTS;
561     }
562     return producer_->SetDefaultUsage(usage);
563 }
564 
GetDefaultUsage()565 uint64_t ProducerSurface::GetDefaultUsage()
566 {
567     if (producer_ == nullptr) {
568         return 0;
569     }
570     return producer_->GetDefaultUsage();
571 }
572 
SetSurfaceSourceType(OHSurfaceSource sourceType)573 GSError ProducerSurface::SetSurfaceSourceType(OHSurfaceSource sourceType)
574 {
575     if (producer_ == nullptr) {
576         return GSERROR_INVALID_ARGUMENTS;
577     }
578     return producer_->SetSurfaceSourceType(sourceType);
579 }
580 
GetSurfaceSourceType() const581 OHSurfaceSource ProducerSurface::GetSurfaceSourceType() const
582 {
583     if (producer_ == nullptr) {
584         return OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
585     }
586     OHSurfaceSource sourceType = OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
587     if (producer_->GetSurfaceSourceType(sourceType) != GSERROR_OK) {
588         BLOGE("GetSurfaceSourceType failed, uniqueId: %{public}" PRIu64 ".", queueId_);
589         return OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
590     }
591     return sourceType;
592 }
593 
SetSurfaceAppFrameworkType(std::string appFrameworkType)594 GSError ProducerSurface::SetSurfaceAppFrameworkType(std::string appFrameworkType)
595 {
596     if (producer_ == nullptr) {
597         return GSERROR_INVALID_ARGUMENTS;
598     }
599     return producer_->SetSurfaceAppFrameworkType(appFrameworkType);
600 }
601 
GetSurfaceAppFrameworkType() const602 std::string ProducerSurface::GetSurfaceAppFrameworkType() const
603 {
604     if (producer_ == nullptr) {
605         return "";
606     }
607     std::string appFrameworkType = "";
608     if (producer_->GetSurfaceAppFrameworkType(appFrameworkType) != GSERROR_OK) {
609         BLOGE("GetSurfaceAppFrameworkType failed, uniqueId: %{public}" PRIu64 ".", queueId_);
610         return "";
611     }
612     return appFrameworkType;
613 }
614 
SetUserData(const std::string & key,const std::string & val)615 GSError ProducerSurface::SetUserData(const std::string& key, const std::string& val)
616 {
617     std::lock_guard<std::mutex> lockGuard(lockMutex_);
618     if (userData_.size() >= SURFACE_MAX_USER_DATA_COUNT) {
619         BLOGE("userData_ size out: %{public}zu, uniqueId: %{public}" PRIu64 ".", userData_.size(), queueId_);
620         return GSERROR_OUT_OF_RANGE;
621     }
622 
623     auto iterUserData = userData_.find(key);
624     if (iterUserData != userData_.end() && iterUserData->second == val) {
625         BLOGE("SetUserData failed: key:%{public}s, val:%{public}s exist, uniqueId: %{public}" PRIu64 ".",
626             key.c_str(), val.c_str(), queueId_);
627         return GSERROR_API_FAILED;
628     }
629 
630     userData_[key] = val;
631     auto iter = onUserDataChange_.begin();
632     while (iter != onUserDataChange_.end()) {
633         if (iter->second != nullptr) {
634             iter->second(key, val);
635         }
636         iter++;
637     }
638 
639     return GSERROR_OK;
640 }
641 
GetUserData(const std::string & key)642 std::string ProducerSurface::GetUserData(const std::string& key)
643 {
644     std::lock_guard<std::mutex> lockGuard(lockMutex_);
645     if (userData_.find(key) != userData_.end()) {
646         return userData_[key];
647     }
648 
649     return "";
650 }
651 
RegisterConsumerListener(sptr<IBufferConsumerListener> & listener)652 GSError ProducerSurface::RegisterConsumerListener(sptr<IBufferConsumerListener>& listener)
653 {
654     return GSERROR_NOT_SUPPORT;
655 }
656 
RegisterConsumerListener(IBufferConsumerListenerClazz * listener)657 GSError ProducerSurface::RegisterConsumerListener(IBufferConsumerListenerClazz *listener)
658 {
659     return GSERROR_NOT_SUPPORT;
660 }
661 
UnregisterConsumerListener()662 GSError ProducerSurface::UnregisterConsumerListener()
663 {
664     return GSERROR_NOT_SUPPORT;
665 }
666 
RegisterReleaseListener(OnReleaseFunc func)667 GSError ProducerSurface::RegisterReleaseListener(OnReleaseFunc func)
668 {
669     if (func == nullptr || producer_ == nullptr) {
670         return GSERROR_INVALID_ARGUMENTS;
671     }
672     sptr<IProducerListener> listener;
673     {
674         std::lock_guard<std::mutex> lockGuard(listenerMutex_);
675         listener_ = new BufferReleaseProducerListener(func);
676         listener = listener_;
677     }
678     return producer_->RegisterReleaseListener(listener);
679 }
680 
RegisterReleaseListener(OnReleaseFuncWithFence funcWithFence)681 GSError ProducerSurface::RegisterReleaseListener(OnReleaseFuncWithFence funcWithFence)
682 {
683     if (funcWithFence == nullptr || producer_ == nullptr) {
684         return GSERROR_INVALID_ARGUMENTS;
685     }
686     sptr<IProducerListener> listener;
687     {
688         std::lock_guard<std::mutex> lockGuard(listenerMutex_);
689         listener_ = new BufferReleaseProducerListener(nullptr, funcWithFence);
690         listener = listener_;
691     }
692     return producer_->RegisterReleaseListener(listener);
693 }
694 
UnRegisterReleaseListener()695 GSError ProducerSurface::UnRegisterReleaseListener()
696 {
697     if (producer_ == nullptr) {
698         return GSERROR_INVALID_ARGUMENTS;
699     }
700     {
701         std::lock_guard<std::mutex> lockGuard(delegatorMutex_);
702         wpPSurfaceDelegator_ = nullptr;
703     }
704     {
705         std::lock_guard<std::mutex> lockGuard(listenerMutex_);
706         if (listener_ != nullptr) {
707             listener_->ResetReleaseFunc();
708         }
709     }
710     return producer_->UnRegisterReleaseListener();
711 }
712 
RegisterDeleteBufferListener(OnDeleteBufferFunc func,bool isForUniRedraw)713 GSError ProducerSurface::RegisterDeleteBufferListener(OnDeleteBufferFunc func, bool isForUniRedraw)
714 {
715     return GSERROR_NOT_SUPPORT;
716 }
717 
RegisterUserDataChangeListener(const std::string & funcName,OnUserDataChangeFunc func)718 GSError ProducerSurface::RegisterUserDataChangeListener(const std::string& funcName, OnUserDataChangeFunc func)
719 {
720     if (func == nullptr) {
721         return GSERROR_INVALID_ARGUMENTS;
722     }
723     std::lock_guard<std::mutex> lockGuard(lockMutex_);
724     if (onUserDataChange_.find(funcName) != onUserDataChange_.end()) {
725         BLOGD("already register func: %{public}s, uniqueId: %{public}" PRIu64 ".",
726             funcName.c_str(), queueId_);
727         return GSERROR_INVALID_ARGUMENTS;
728     }
729 
730     onUserDataChange_[funcName] = func;
731     return GSERROR_OK;
732 }
733 
UnRegisterUserDataChangeListener(const std::string & funcName)734 GSError ProducerSurface::UnRegisterUserDataChangeListener(const std::string& funcName)
735 {
736     std::lock_guard<std::mutex> lockGuard(lockMutex_);
737     if (onUserDataChange_.erase(funcName) == 0) {
738         BLOGD("no register funcName: %{public}s, uniqueId: %{public}" PRIu64 ".", funcName.c_str(), queueId_);
739         return GSERROR_INVALID_ARGUMENTS;
740     }
741 
742     return GSERROR_OK;
743 }
744 
ClearUserDataChangeListener()745 GSError ProducerSurface::ClearUserDataChangeListener()
746 {
747     std::lock_guard<std::mutex> lockGuard(lockMutex_);
748     onUserDataChange_.clear();
749     return GSERROR_OK;
750 }
751 
IsRemote()752 bool ProducerSurface::IsRemote()
753 {
754     if (producer_ == nullptr || producer_->AsObject() == nullptr) {
755         return false;
756     }
757     return producer_->AsObject()->IsProxyObject();
758 }
759 
CleanAllLocked()760 void ProducerSurface::CleanAllLocked()
761 {
762     bufferProducerCache_.clear();
763     auto spNativeWindow = wpNativeWindow_.promote();
764     if (spNativeWindow != nullptr) {
765         auto& bufferCache = spNativeWindow->bufferCache_;
766         for (auto& [seqNum, buffer] : bufferCache) {
767             NativeObjectUnreference(buffer);
768         }
769         bufferCache.clear();
770     }
771 }
772 
CleanCacheLocked(bool cleanAll)773 GSError ProducerSurface::CleanCacheLocked(bool cleanAll)
774 {
775     BLOGD("CleanCacheLocked, uniqueId: %{public}" PRIu64 ".", queueId_);
776     CleanAllLocked();
777     return producer_->CleanCache(cleanAll);
778 }
779 
CleanCache(bool cleanAll)780 GSError ProducerSurface::CleanCache(bool cleanAll)
781 {
782     if (producer_ == nullptr) {
783         return GSERROR_INVALID_ARGUMENTS;
784     }
785     BLOGD("CleanCache, uniqueId: %{public}" PRIu64 ".", queueId_);
786     {
787         std::lock_guard<std::mutex> lockGuard(mutex_);
788         CleanAllLocked();
789     }
790     return producer_->CleanCache(cleanAll);
791 }
792 
GoBackground()793 GSError ProducerSurface::GoBackground()
794 {
795     if (producer_ == nullptr) {
796         return GSERROR_INVALID_ARGUMENTS;
797     }
798     BLOGD("GoBackground, uniqueId: %{public}" PRIu64 ".", queueId_);
799     {
800         std::lock_guard<std::mutex> lockGuard(mutex_);
801         CleanAllLocked();
802     }
803     return producer_->GoBackground();
804 }
805 
GetUniqueId() const806 uint64_t ProducerSurface::GetUniqueId() const
807 {
808     if (!inited_.load()) {
809         BLOGW("ProducerSurface is not initialized.");
810     }
811     return queueId_;
812 }
813 
SetTransform(GraphicTransformType transform)814 GSError ProducerSurface::SetTransform(GraphicTransformType transform)
815 {
816     if (producer_ == nullptr) {
817         return GSERROR_INVALID_ARGUMENTS;
818     }
819     return producer_->SetTransform(transform);
820 }
821 
GetTransform() const822 GraphicTransformType ProducerSurface::GetTransform() const
823 {
824     if (producer_ == nullptr) {
825         return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
826     }
827     GraphicTransformType transform = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
828     if (producer_->GetTransform(transform) != GSERROR_OK) {
829         BLOGE("GetTransform failed, uniqueId: %{public}" PRIu64 ".", queueId_);
830         return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
831     }
832     return transform;
833 }
834 
IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> & infos,std::vector<bool> & supporteds)835 GSError ProducerSurface::IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo>& infos,
836                                           std::vector<bool>& supporteds)
837 {
838     if (producer_ == nullptr || infos.size() == 0 || infos.size() != supporteds.size()) {
839         return GSERROR_INVALID_ARGUMENTS;
840     }
841     return producer_->IsSupportedAlloc(infos, supporteds);
842 }
843 
Connect()844 GSError ProducerSurface::Connect()
845 {
846     if (producer_ == nullptr) {
847         return GSERROR_INVALID_ARGUMENTS;
848     }
849     std::lock_guard<std::mutex> lockGuard(mutex_);
850     if (!isDisconnected_) {
851         BLOGE("Surface has been connect, uniqueId: %{public}" PRIu64 ".", queueId_);
852         return SURFACE_ERROR_CONSUMER_IS_CONNECTED;
853     }
854     BLOGD("Connect, uniqueId: %{public}" PRIu64 ".", queueId_);
855     GSError ret = producer_->Connect();
856     if (ret == GSERROR_OK) {
857         isDisconnected_ = false;
858     }
859     return ret;
860 }
861 
Disconnect()862 GSError ProducerSurface::Disconnect()
863 {
864     if (producer_ == nullptr) {
865         return GSERROR_INVALID_ARGUMENTS;
866     }
867     std::lock_guard<std::mutex> lockGuard(mutex_);
868     if (isDisconnected_) {
869         BLOGD("Surface is disconnect, uniqueId: %{public}" PRIu64 ".", queueId_);
870         return SURFACE_ERROR_CONSUMER_DISCONNECTED;
871     }
872     BLOGD("Disconnect, uniqueId: %{public}" PRIu64 ".", queueId_);
873     CleanAllLocked();
874     GSError ret = producer_->Disconnect();
875     if (ret == GSERROR_OK) {
876         isDisconnected_ = true;
877     }
878     return ret;
879 }
880 
SetScalingMode(uint32_t sequence,ScalingMode scalingMode)881 GSError ProducerSurface::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
882 {
883     if (producer_ == nullptr || scalingMode < ScalingMode::SCALING_MODE_FREEZE ||
884         scalingMode > ScalingMode::SCALING_MODE_SCALE_FIT) {
885         return GSERROR_INVALID_ARGUMENTS;
886     }
887     return producer_->SetScalingMode(sequence, scalingMode);
888 }
889 
SetScalingMode(ScalingMode scalingMode)890 GSError ProducerSurface::SetScalingMode(ScalingMode scalingMode)
891 {
892     if (producer_ == nullptr || scalingMode < ScalingMode::SCALING_MODE_FREEZE ||
893         scalingMode > ScalingMode::SCALING_MODE_SCALE_FIT) {
894         return GSERROR_INVALID_ARGUMENTS;
895     }
896     return producer_->SetScalingMode(scalingMode);
897 }
898 
SetBufferHold(bool hold)899 void ProducerSurface::SetBufferHold(bool hold)
900 {
901     if (producer_ == nullptr) {
902         return;
903     }
904     producer_->SetBufferHold(hold);
905 }
906 
GetScalingMode(uint32_t sequence,ScalingMode & scalingMode)907 GSError ProducerSurface::GetScalingMode(uint32_t sequence, ScalingMode& scalingMode)
908 {
909     return GSERROR_NOT_SUPPORT;
910 }
911 
SetMetaData(uint32_t sequence,const std::vector<GraphicHDRMetaData> & metaData)912 GSError ProducerSurface::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData>& metaData)
913 {
914     if (producer_ == nullptr || metaData.size() == 0) {
915         return GSERROR_INVALID_ARGUMENTS;
916     }
917     return producer_->SetMetaData(sequence, metaData);
918 }
919 
SetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)920 GSError ProducerSurface::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
921                                         const std::vector<uint8_t>& metaData)
922 {
923     if (producer_ == nullptr || key < GraphicHDRMetadataKey::GRAPHIC_MATAKEY_RED_PRIMARY_X ||
924         key > GraphicHDRMetadataKey::GRAPHIC_MATAKEY_HDR_VIVID || metaData.size() == 0) {
925         return GSERROR_INVALID_ARGUMENTS;
926     }
927     return producer_->SetMetaDataSet(sequence, key, metaData);
928 }
929 
QueryMetaDataType(uint32_t sequence,HDRMetaDataType & type) const930 GSError ProducerSurface::QueryMetaDataType(uint32_t sequence, HDRMetaDataType &type) const
931 {
932     return GSERROR_NOT_SUPPORT;
933 }
934 
GetMetaData(uint32_t sequence,std::vector<GraphicHDRMetaData> & metaData) const935 GSError ProducerSurface::GetMetaData(uint32_t sequence, std::vector<GraphicHDRMetaData> &metaData) const
936 {
937     return GSERROR_NOT_SUPPORT;
938 }
939 
GetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey & key,std::vector<uint8_t> & metaData) const940 GSError ProducerSurface::GetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey &key,
941                                         std::vector<uint8_t> &metaData) const
942 {
943     return GSERROR_NOT_SUPPORT;
944 }
945 
SetTunnelHandle(const GraphicExtDataHandle * handle)946 GSError ProducerSurface::SetTunnelHandle(const GraphicExtDataHandle *handle)
947 {
948     if (producer_ == nullptr) {
949         return GSERROR_INVALID_ARGUMENTS;
950     }
951     return producer_->SetTunnelHandle(handle);
952 }
953 
GetTunnelHandle() const954 sptr<SurfaceTunnelHandle> ProducerSurface::GetTunnelHandle() const
955 {
956     // not support
957     return nullptr;
958 }
959 
SetPresentTimestamp(uint32_t sequence,const GraphicPresentTimestamp & timestamp)960 GSError ProducerSurface::SetPresentTimestamp(uint32_t sequence, const GraphicPresentTimestamp &timestamp)
961 {
962     return GSERROR_NOT_SUPPORT;
963 }
964 
GetPresentTimestamp(uint32_t sequence,GraphicPresentTimestampType type,int64_t & time) const965 GSError ProducerSurface::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type,
966                                              int64_t& time) const
967 {
968     if (producer_ == nullptr || type <= GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_UNSUPPORTED ||
969         type > GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_TIMESTAMP) {
970         return GSERROR_INVALID_ARGUMENTS;
971     }
972     return producer_->GetPresentTimestamp(sequence, type, time);
973 }
974 
GetDefaultFormat()975 int32_t ProducerSurface::GetDefaultFormat()
976 {
977     return 0;
978 }
979 
SetDefaultFormat(int32_t format)980 GSError ProducerSurface::SetDefaultFormat(int32_t format)
981 {
982     return GSERROR_NOT_SUPPORT;
983 }
984 
GetDefaultColorGamut()985 int32_t ProducerSurface::GetDefaultColorGamut()
986 {
987     return 0;
988 }
989 
SetDefaultColorGamut(int32_t colorGamut)990 GSError ProducerSurface::SetDefaultColorGamut(int32_t colorGamut)
991 {
992     return GSERROR_NOT_SUPPORT;
993 }
994 
GetNativeSurface()995 sptr<NativeSurface> ProducerSurface::GetNativeSurface()
996 {
997     return nullptr;
998 }
999 
SetWptrNativeWindowToPSurface(void * nativeWindow)1000 GSError ProducerSurface::SetWptrNativeWindowToPSurface(void* nativeWindow)
1001 {
1002     NativeWindow *nw = reinterpret_cast<NativeWindow *>(nativeWindow);
1003     std::lock_guard<std::mutex> lockGuard(mutex_);
1004     wpNativeWindow_ = nw;
1005     return GSERROR_OK;
1006 }
1007 
SetRequestWidthAndHeight(int32_t width,int32_t height)1008 void ProducerSurface::SetRequestWidthAndHeight(int32_t width, int32_t height)
1009 {
1010     std::lock_guard<std::mutex> lockGuard(mutex_);
1011     requestWidth_ = width;
1012     requestHeight_ = height;
1013 }
1014 
GetRequestWidth()1015 int32_t ProducerSurface::GetRequestWidth()
1016 {
1017     std::lock_guard<std::mutex> lockGuard(mutex_);
1018     return requestWidth_;
1019 }
1020 
GetRequestHeight()1021 int32_t ProducerSurface::GetRequestHeight()
1022 {
1023     std::lock_guard<std::mutex> lockGuard(mutex_);
1024     return requestHeight_;
1025 }
1026 
GetWindowConfig()1027 BufferRequestConfig* ProducerSurface::GetWindowConfig()
1028 {
1029     return &windowConfig_;
1030 }
1031 
SetHdrWhitePointBrightness(float brightness)1032 GSError ProducerSurface::SetHdrWhitePointBrightness(float brightness)
1033 {
1034     if (producer_ == nullptr) {
1035         return GSERROR_INVALID_ARGUMENTS;
1036     }
1037     if (brightness < 0.0 || brightness > 1.0) {
1038         BLOGE("brightness:%{public}f, uniqueId: %{public}" PRIu64 ".", brightness, queueId_);
1039         return GSERROR_INVALID_ARGUMENTS;
1040     }
1041     return producer_->SetHdrWhitePointBrightness(brightness);
1042 }
1043 
SetSdrWhitePointBrightness(float brightness)1044 GSError ProducerSurface::SetSdrWhitePointBrightness(float brightness)
1045 {
1046     if (producer_ == nullptr) {
1047         return GSERROR_INVALID_ARGUMENTS;
1048     }
1049     if (brightness < 0.0 || brightness > 1.0) {
1050         BLOGE("brightness:%{public}f, uniqueId: %{public}" PRIu64 ".", brightness, queueId_);
1051         return GSERROR_INVALID_ARGUMENTS;
1052     }
1053     return producer_->SetSdrWhitePointBrightness(brightness);
1054 }
1055 
AcquireLastFlushedBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],uint32_t matrixSize,bool isUseNewMatrix)1056 GSError ProducerSurface::AcquireLastFlushedBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
1057     float matrix[16], uint32_t matrixSize, bool isUseNewMatrix)
1058 {
1059     if (producer_ == nullptr) {
1060         return GSERROR_INVALID_ARGUMENTS;
1061     }
1062     return producer_->AcquireLastFlushedBuffer(buffer, fence, matrix, matrixSize, isUseNewMatrix);
1063 }
1064 
ReleaseLastFlushedBuffer(sptr<SurfaceBuffer> buffer)1065 GSError ProducerSurface::ReleaseLastFlushedBuffer(sptr<SurfaceBuffer> buffer)
1066 {
1067     if (buffer == nullptr || producer_ == nullptr) {
1068         return GSERROR_INVALID_ARGUMENTS;
1069     }
1070     return producer_->ReleaseLastFlushedBuffer(buffer->GetSeqNum());
1071 }
1072 
UpdateCacheLocked(sptr<BufferExtraData> & bedataimpl,IBufferProducer::RequestBufferReturnValue & retval,BufferRequestConfig & config)1073 GSError ProducerSurface::UpdateCacheLocked(sptr<BufferExtraData>& bedataimpl,
1074     IBufferProducer::RequestBufferReturnValue& retval, BufferRequestConfig& config)
1075 {
1076     // add cache
1077     if (retval.buffer == nullptr) {
1078         auto it = bufferProducerCache_.find(retval.sequence);
1079         if (it == bufferProducerCache_.end()) {
1080             DeleteCacheBufferLocked(bedataimpl, retval, config);
1081             BLOGE("cache not find buffer(%{public}u), uniqueId: %{public}" PRIu64 ".", retval.sequence, queueId_);
1082             return SURFACE_ERROR_UNKOWN;
1083         } else {
1084             retval.buffer = it->second;
1085         }
1086     }
1087     bufferProducerCache_.erase(retval.sequence);
1088     SetBufferConfigLocked(bedataimpl, retval, config);
1089     DeleteCacheBufferLocked(bedataimpl, retval, config);
1090     return SURFACE_ERROR_OK;
1091 }
1092 
RequestAndDetachBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,BufferRequestConfig & config)1093 GSError ProducerSurface::RequestAndDetachBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
1094                                                 BufferRequestConfig& config)
1095 {
1096     if (producer_ == nullptr) {
1097         return GSERROR_INVALID_ARGUMENTS;
1098     }
1099     IBufferProducer::RequestBufferReturnValue retval;
1100     sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
1101 
1102     std::lock_guard<std::mutex> lockGuard(mutex_);
1103     GSError ret = producer_->RequestAndDetachBuffer(config, bedataimpl, retval);
1104     if (ret != GSERROR_OK) {
1105         if (ret == GSERROR_NO_CONSUMER) {
1106             CleanCacheLocked(false);
1107         }
1108         /**
1109          * if server is connected, but result is failed.
1110          * client needs to synchronize status.
1111          */
1112         if (retval.isConnected) {
1113             isDisconnected_ = false;
1114         }
1115         BLOGD("RequestAndDetachBuffer ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
1116         return ret;
1117     }
1118     isDisconnected_ = false;
1119     UpdateCacheLocked(bedataimpl, retval, config);
1120     buffer = retval.buffer;
1121     fence = retval.fence;
1122 
1123     if (SetMetadataValue(buffer) != GSERROR_OK) {
1124         BLOGD("SetMetadataValue fail, uniqueId: %{public}" PRIu64 ".", queueId_);
1125     }
1126     return ret;
1127 }
1128 
AttachAndFlushBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence,BufferFlushConfig & config,bool needMap)1129 GSError ProducerSurface::AttachAndFlushBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence,
1130                                               BufferFlushConfig& config, bool needMap)
1131 {
1132     if (buffer == nullptr || fence == nullptr || producer_ == nullptr) {
1133         return GSERROR_INVALID_ARGUMENTS;
1134     }
1135 
1136     sptr<BufferExtraData> bedata = buffer->GetExtraData();
1137     if (bedata == nullptr) {
1138         return GSERROR_INVALID_ARGUMENTS;
1139     }
1140 
1141     BufferFlushConfigWithDamages configWithDamages;
1142     configWithDamages.damages.push_back(config.damage);
1143     configWithDamages.timestamp = config.timestamp;
1144     configWithDamages.desiredPresentTimestamp = config.desiredPresentTimestamp;
1145 
1146     auto ret = producer_->AttachAndFlushBuffer(buffer, bedata, fence, configWithDamages, needMap);
1147     if (ret == GSERROR_OK) {
1148         std::lock_guard<std::mutex> lockGuard(mutex_);
1149         if (bufferProducerCache_.find(buffer->GetSeqNum()) != bufferProducerCache_.end()) {
1150             BLOGE("Attach buffer %{public}d, uniqueId: %{public}" PRIu64 ".", buffer->GetSeqNum(), queueId_);
1151             return SURFACE_ERROR_BUFFER_IS_INCACHE;
1152         }
1153         bufferProducerCache_[buffer->GetSeqNum()] = buffer;
1154     } else if (ret == GSERROR_NO_CONSUMER) {
1155         CleanCache();
1156         BLOGD("FlushBuffer ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
1157     }
1158     return ret;
1159 }
1160 } // namespace OHOS
1161