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