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