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