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 ×tamp, 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 ×tamp, 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 ×tamp)
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