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
26 namespace OHOS {
27 namespace {
28 constexpr int32_t PRODUCER_REF_COUNT_IN_PRODUCER_SURFACE = 1;
29 }
30
CreateSurfaceAsProducer(sptr<IBufferProducer> & producer)31 sptr<Surface> Surface::CreateSurfaceAsProducer(sptr<IBufferProducer>& producer)
32 {
33 if (producer == nullptr) {
34 BLOGE("Failure, Reason: producer is nullptr");
35 return nullptr;
36 }
37
38 sptr<ProducerSurface> surf = new ProducerSurface(producer);
39 GSError ret = surf->Init();
40 if (ret != GSERROR_OK) {
41 BLOGE("Failure, Reason: producer surf init failed");
42 return nullptr;
43 }
44 return surf;
45 }
46
ProducerSurface(sptr<IBufferProducer> & producer)47 ProducerSurface::ProducerSurface(sptr<IBufferProducer>& producer)
48 {
49 producer_ = producer;
50 if (producer_) {
51 producer_->SendDeathRecipientObject();
52 }
53 BLOGND("ctor");
54 }
55
~ProducerSurface()56 ProducerSurface::~ProducerSurface()
57 {
58 if (producer_->GetSptrRefCount() > PRODUCER_REF_COUNT_IN_PRODUCER_SURFACE) {
59 BLOGND("Warning SptrRefCount! producer_:%{public}d", producer_->GetSptrRefCount());
60 }
61 BLOGND("dtor, name:%{public}s, Queue Id:%{public}" PRIu64, name_.c_str(), queueId_);
62 auto ret = Disconnect();
63 if (ret != GSERROR_OK) {
64 BLOGND("Disconnect failed, %{public}s", GSErrorStr(ret).c_str());
65 }
66 }
67
Init()68 GSError ProducerSurface::Init()
69 {
70 if (inited_.load()) {
71 return GSERROR_OK;
72 }
73 auto ret = producer_->GetNameAndUniqueId(name_, queueId_);
74 if (ret != GSERROR_OK) {
75 BLOGNE("GetNameAndUniqueId failed, %{public}s", GSErrorStr(ret).c_str());
76 }
77 inited_.store(true);
78 BLOGND("ctor, name:%{public}s, Queue Id:%{public}" PRIu64, name_.c_str(), queueId_);
79 return GSERROR_OK;
80 }
81
IsConsumer() const82 bool ProducerSurface::IsConsumer() const
83 {
84 return false;
85 }
86
GetProducer() const87 sptr<IBufferProducer> ProducerSurface::GetProducer() const
88 {
89 return producer_;
90 }
91
RequestBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,BufferRequestConfig & config)92 GSError ProducerSurface::RequestBuffer(sptr<SurfaceBuffer>& buffer,
93 sptr<SyncFence>& fence, BufferRequestConfig &config)
94 {
95 IBufferProducer::RequestBufferReturnValue retval;
96 sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
97 GSError ret = producer_->RequestBuffer(config, bedataimpl, retval);
98 if (ret != GSERROR_OK) {
99 if (ret == GSERROR_NO_CONSUMER) {
100 CleanCache();
101 }
102 BLOGND("RequestBuffer Producer report %{public}s", GSErrorStr(ret).c_str());
103 return ret;
104 }
105
106 std::lock_guard<std::mutex> lockGuard(mutex_);
107 if (isDisconnected) {
108 isDisconnected = false;
109 }
110 // add cache
111 if (retval.buffer != nullptr) {
112 bufferProducerCache_[retval.sequence] = retval.buffer;
113 } else if (bufferProducerCache_.find(retval.sequence) == bufferProducerCache_.end()) {
114 return GSERROR_API_FAILED;
115 } else {
116 retval.buffer = bufferProducerCache_[retval.sequence];
117 }
118 buffer = retval.buffer;
119 fence = retval.fence;
120
121 if (static_cast<uint64_t>(config.usage) & BUFFER_USAGE_CPU_WRITE) {
122 ret = buffer->InvalidateCache();
123 if (ret != GSERROR_OK) {
124 BLOGNW("Warning [%{public}d], InvalidateCache failed", retval.sequence);
125 }
126 }
127
128 if (buffer != nullptr) {
129 buffer->SetExtraData(bedataimpl);
130 }
131
132 for (auto it = retval.deletingBuffers.begin(); it != retval.deletingBuffers.end(); it++) {
133 uint32_t seqNum = static_cast<uint32_t>(*it);
134 bufferProducerCache_.erase(seqNum);
135 auto spNativeWindow = wpNativeWindow_.promote();
136 if (spNativeWindow != nullptr) {
137 auto &bufferCache = spNativeWindow->bufferCache_;
138 if (bufferCache.find(seqNum) != bufferCache.end()) {
139 NativeObjectUnreference(bufferCache[seqNum]);
140 bufferCache.erase(seqNum);
141 }
142 }
143 }
144 return GSERROR_OK;
145 }
146
FlushBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence,BufferFlushConfig & config)147 GSError ProducerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer,
148 const sptr<SyncFence>& fence, BufferFlushConfig &config)
149 {
150 BufferFlushConfigWithDamages configWithDamages;
151 configWithDamages.damages.push_back(config.damage);
152 configWithDamages.timestamp = config.timestamp;
153 return FlushBuffer(buffer, fence, configWithDamages);
154 }
155
FlushBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence,BufferFlushConfigWithDamages & config)156 GSError ProducerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence,
157 BufferFlushConfigWithDamages &config)
158 {
159 if (buffer == nullptr) {
160 return GSERROR_INVALID_ARGUMENTS;
161 }
162
163 const sptr<BufferExtraData>& bedata = buffer->GetExtraData();
164 auto ret = producer_->FlushBuffer(buffer->GetSeqNum(), bedata, fence, config);
165 if (ret == GSERROR_NO_CONSUMER) {
166 CleanCache();
167 BLOGND("FlushBuffer Producer report %{public}s", GSErrorStr(ret).c_str());
168 }
169 return ret;
170 }
171
GetLastFlushedBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16])172 GSError ProducerSurface::GetLastFlushedBuffer(sptr<SurfaceBuffer>& buffer,
173 sptr<SyncFence>& fence, float matrix[16])
174 {
175 auto ret = producer_->GetLastFlushedBuffer(buffer, fence, matrix);
176 return ret;
177 }
178
AcquireBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,int64_t & timestamp,Rect & damage)179 GSError ProducerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
180 int64_t ×tamp, Rect &damage)
181 {
182 return GSERROR_NOT_SUPPORT;
183 }
ReleaseBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence)184 GSError ProducerSurface::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence)
185 {
186 return GSERROR_NOT_SUPPORT;
187 }
188
RequestBuffer(sptr<SurfaceBuffer> & buffer,int32_t & fence,BufferRequestConfig & config)189 GSError ProducerSurface::RequestBuffer(sptr<SurfaceBuffer>& buffer,
190 int32_t &fence, BufferRequestConfig &config)
191 {
192 sptr<SyncFence> syncFence = SyncFence::INVALID_FENCE;
193 auto ret = RequestBuffer(buffer, syncFence, config);
194 if (ret != GSERROR_OK) {
195 fence = -1;
196 return ret;
197 }
198 fence = syncFence->Dup();
199 return GSERROR_OK;
200 }
201
CancelBuffer(sptr<SurfaceBuffer> & buffer)202 GSError ProducerSurface::CancelBuffer(sptr<SurfaceBuffer>& buffer)
203 {
204 if (buffer == nullptr) {
205 return GSERROR_INVALID_ARGUMENTS;
206 }
207
208 const sptr<BufferExtraData>& bedata = buffer->GetExtraData();
209 return producer_->CancelBuffer(buffer->GetSeqNum(), bedata);
210 }
211
FlushBuffer(sptr<SurfaceBuffer> & buffer,int32_t fence,BufferFlushConfig & config)212 GSError ProducerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer,
213 int32_t fence, BufferFlushConfig &config)
214 {
215 // fence need close?
216 sptr<SyncFence> syncFence = new SyncFence(fence);
217 return FlushBuffer(buffer, syncFence, config);
218 }
219
AcquireBuffer(sptr<SurfaceBuffer> & buffer,int32_t & fence,int64_t & timestamp,Rect & damage)220 GSError ProducerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, int32_t &fence,
221 int64_t ×tamp, Rect &damage)
222 {
223 return GSERROR_NOT_SUPPORT;
224 }
225
ReleaseBuffer(sptr<SurfaceBuffer> & buffer,int32_t fence)226 GSError ProducerSurface::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, int32_t fence)
227 {
228 return GSERROR_NOT_SUPPORT;
229 }
230
AttachBuffer(sptr<SurfaceBuffer> & buffer)231 GSError ProducerSurface::AttachBuffer(sptr<SurfaceBuffer>& buffer)
232 {
233 if (buffer == nullptr) {
234 return GSERROR_INVALID_ARGUMENTS;
235 }
236
237 return producer_->AttachBuffer(buffer);
238 }
239
AttachBuffer(sptr<SurfaceBuffer> & buffer,int32_t timeOut)240 GSError ProducerSurface::AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut)
241 {
242 if (buffer == nullptr) {
243 return GSERROR_INVALID_ARGUMENTS;
244 }
245
246 return producer_->AttachBuffer(buffer, timeOut);
247 }
248
DetachBuffer(sptr<SurfaceBuffer> & buffer)249 GSError ProducerSurface::DetachBuffer(sptr<SurfaceBuffer>& buffer)
250 {
251 if (buffer == nullptr) {
252 return GSERROR_INVALID_ARGUMENTS;
253 }
254 return producer_->DetachBuffer(buffer);
255 }
256
RegisterSurfaceDelegator(sptr<IRemoteObject> client)257 GSError ProducerSurface::RegisterSurfaceDelegator(sptr<IRemoteObject> client)
258 {
259 if (client == nullptr) {
260 BLOGE("RegisterSurfaceDelegator failed for the delegator client is nullptr");
261 return GSERROR_INVALID_ARGUMENTS;
262 }
263 sptr<ProducerSurfaceDelegator> surfaceDelegator = ProducerSurfaceDelegator::Create();
264 if (surfaceDelegator == nullptr) {
265 BLOGE("RegisterSurfaceDelegator failed for the surface delegator is nullptr");
266 return GSERROR_INVALID_ARGUMENTS;
267 }
268 if (!surfaceDelegator->SetClient(client)) {
269 BLOGE("Set the surface delegator client failed");
270 return GSERROR_INVALID_ARGUMENTS;
271 }
272
273 surfaceDelegator->SetSurface(this);
274 wpPSurfaceDelegator_ = surfaceDelegator;
275
276 auto releaseBufferCallBack = [this] (const sptr<SurfaceBuffer> &buffer,
277 const sptr<SyncFence> &fence) -> GSError {
278 auto surfaceDelegator = this->wpPSurfaceDelegator_.promote();
279 if (surfaceDelegator == nullptr) {
280 return GSERROR_INVALID_ARGUMENTS;
281 }
282 int error = surfaceDelegator->ReleaseBuffer(buffer, fence);
283 return static_cast<GSError>(error);
284 };
285 RegisterReleaseListener(releaseBufferCallBack);
286 return GSERROR_OK;
287 }
288
QueryIfBufferAvailable()289 bool ProducerSurface::QueryIfBufferAvailable()
290 {
291 return false;
292 }
293
GetQueueSize()294 uint32_t ProducerSurface::GetQueueSize()
295 {
296 return producer_->GetQueueSize();
297 }
298
SetQueueSize(uint32_t queueSize)299 GSError ProducerSurface::SetQueueSize(uint32_t queueSize)
300 {
301 return producer_->SetQueueSize(queueSize);
302 }
303
GetName()304 const std::string& ProducerSurface::GetName()
305 {
306 if (!inited_.load()) {
307 BLOGNW("Warning ProducerSurface is not initialized, the name you get is uninitialized.");
308 }
309 return name_;
310 }
311
SetDefaultWidthAndHeight(int32_t width,int32_t height)312 GSError ProducerSurface::SetDefaultWidthAndHeight(int32_t width, int32_t height)
313 {
314 return GSERROR_NOT_SUPPORT;
315 }
316
GetDefaultWidth()317 int32_t ProducerSurface::GetDefaultWidth()
318 {
319 return producer_->GetDefaultWidth();
320 }
321
GetDefaultHeight()322 int32_t ProducerSurface::GetDefaultHeight()
323 {
324 return producer_->GetDefaultHeight();
325 }
326
SetDefaultUsage(uint32_t usage)327 GSError ProducerSurface::SetDefaultUsage(uint32_t usage)
328 {
329 return GSERROR_NOT_SUPPORT;
330 }
331
GetDefaultUsage()332 uint32_t ProducerSurface::GetDefaultUsage()
333 {
334 return producer_->GetDefaultUsage();
335 }
336
SetUserData(const std::string & key,const std::string & val)337 GSError ProducerSurface::SetUserData(const std::string &key, const std::string &val)
338 {
339 if (userData_.size() >= SURFACE_MAX_USER_DATA_COUNT) {
340 return GSERROR_OUT_OF_RANGE;
341 }
342 userData_[key] = val;
343 return GSERROR_OK;
344 }
345
GetUserData(const std::string & key)346 std::string ProducerSurface::GetUserData(const std::string &key)
347 {
348 if (userData_.find(key) != userData_.end()) {
349 return userData_[key];
350 }
351
352 return "";
353 }
354
RegisterConsumerListener(sptr<IBufferConsumerListener> & listener)355 GSError ProducerSurface::RegisterConsumerListener(sptr<IBufferConsumerListener>& listener)
356 {
357 return GSERROR_NOT_SUPPORT;
358 }
359
RegisterConsumerListener(IBufferConsumerListenerClazz * listener)360 GSError ProducerSurface::RegisterConsumerListener(IBufferConsumerListenerClazz *listener)
361 {
362 return GSERROR_NOT_SUPPORT;
363 }
364
UnregisterConsumerListener()365 GSError ProducerSurface::UnregisterConsumerListener()
366 {
367 return GSERROR_NOT_SUPPORT;
368 }
369
RegisterReleaseListener(OnReleaseFunc func)370 GSError ProducerSurface::RegisterReleaseListener(OnReleaseFunc func)
371 {
372 if (func == nullptr) {
373 BLOGNE("OnReleaseFunc is nullptr, RegisterReleaseListener failed.");
374 return GSERROR_INVALID_ARGUMENTS;
375 }
376 listener_ = new BufferReleaseProducerListener(func);
377 return producer_->RegisterReleaseListener(listener_);
378 }
379
RegisterReleaseListener(OnReleaseFuncWithFence funcWithFence)380 GSError ProducerSurface::RegisterReleaseListener(OnReleaseFuncWithFence funcWithFence)
381 {
382 if (funcWithFence == nullptr) {
383 BLOGNE("OnReleaseFuncWithFence is nullptr, RegisterReleaseListener failed.");
384 return GSERROR_INVALID_ARGUMENTS;
385 }
386 listener_ = new BufferReleaseProducerListener(nullptr, funcWithFence);
387 return producer_->RegisterReleaseListener(listener_);
388 }
389
UnRegisterReleaseListener()390 GSError ProducerSurface::UnRegisterReleaseListener()
391 {
392 if (producer_ == nullptr) {
393 BLOGE("The producer in ProducerSurface is nullptr, UnRegisterReleaseListener failed");
394 return GSERROR_INVALID_ARGUMENTS;
395 }
396 return producer_->UnRegisterReleaseListener();
397 }
398
RegisterDeleteBufferListener(OnDeleteBufferFunc func,bool isForUniRedraw)399 GSError ProducerSurface::RegisterDeleteBufferListener(OnDeleteBufferFunc func, bool isForUniRedraw)
400 {
401 return GSERROR_NOT_SUPPORT;
402 }
403
IsRemote()404 bool ProducerSurface::IsRemote()
405 {
406 return producer_->AsObject()->IsProxyObject();
407 }
408
CleanAllLocked()409 void ProducerSurface::CleanAllLocked()
410 {
411 bufferProducerCache_.clear();
412 auto spNativeWindow = wpNativeWindow_.promote();
413 if (spNativeWindow != nullptr) {
414 auto &bufferCache = spNativeWindow->bufferCache_;
415 for (auto &[seqNum, buffer] : bufferCache) {
416 NativeObjectUnreference(buffer);
417 }
418 bufferCache.clear();
419 }
420 }
421
CleanCache()422 GSError ProducerSurface::CleanCache()
423 {
424 BLOGND("Queue Id:%{public}" PRIu64, queueId_);
425 {
426 std::lock_guard<std::mutex> lockGuard(mutex_);
427 CleanAllLocked();
428 }
429 return producer_->CleanCache();
430 }
431
GoBackground()432 GSError ProducerSurface::GoBackground()
433 {
434 BLOGND("Queue Id:%{public}" PRIu64 "", queueId_);
435 {
436 std::lock_guard<std::mutex> lockGuard(mutex_);
437 CleanAllLocked();
438 }
439 return producer_->GoBackground();
440 }
441
GetUniqueId() const442 uint64_t ProducerSurface::GetUniqueId() const
443 {
444 if (!inited_.load()) {
445 BLOGNW("Warning ProducerSurface is not initialized, the uniquedId you get is uninitialized.");
446 }
447 return queueId_;
448 }
449
SetTransform(GraphicTransformType transform)450 GSError ProducerSurface::SetTransform(GraphicTransformType transform)
451 {
452 return producer_->SetTransform(transform);
453 }
454
GetTransform() const455 GraphicTransformType ProducerSurface::GetTransform() const
456 {
457 GraphicTransformType transform = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
458 if (producer_->GetTransform(transform) != GSERROR_OK) {
459 BLOGNE("Warning ProducerSurface GetTransform failed.");
460 return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
461 }
462 return transform;
463 }
464
IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> & infos,std::vector<bool> & supporteds)465 GSError ProducerSurface::IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> &infos,
466 std::vector<bool> &supporteds)
467 {
468 if (infos.size() == 0 || infos.size() != supporteds.size()) {
469 return GSERROR_INVALID_ARGUMENTS;
470 }
471 return producer_->IsSupportedAlloc(infos, supporteds);
472 }
473
Disconnect()474 GSError ProducerSurface::Disconnect()
475 {
476 {
477 std::lock_guard<std::mutex> lockGuard(mutex_);
478 if (isDisconnected) {
479 return GSERROR_INVALID_OPERATING;
480 }
481 }
482 BLOGND("Queue Id:%{public}" PRIu64 "", queueId_);
483 {
484 std::lock_guard<std::mutex> lockGuard(mutex_);
485 CleanAllLocked();
486 }
487 GSError ret = producer_->Disconnect();
488 {
489 std::lock_guard<std::mutex> lockGuard(mutex_);
490 if (ret == GSERROR_OK) {
491 isDisconnected = true;
492 }
493 }
494 return ret;
495 }
496
SetScalingMode(uint32_t sequence,ScalingMode scalingMode)497 GSError ProducerSurface::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
498 {
499 if (scalingMode < ScalingMode::SCALING_MODE_FREEZE ||
500 scalingMode > ScalingMode::SCALING_MODE_NO_SCALE_CROP) {
501 return GSERROR_INVALID_ARGUMENTS;
502 }
503 return producer_->SetScalingMode(sequence, scalingMode);
504 }
505
GetScalingMode(uint32_t sequence,ScalingMode & scalingMode)506 GSError ProducerSurface::GetScalingMode(uint32_t sequence, ScalingMode &scalingMode)
507 {
508 return GSERROR_NOT_SUPPORT;
509 }
510
SetMetaData(uint32_t sequence,const std::vector<GraphicHDRMetaData> & metaData)511 GSError ProducerSurface::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData> &metaData)
512 {
513 if (metaData.size() == 0) {
514 return GSERROR_INVALID_ARGUMENTS;
515 }
516 return producer_->SetMetaData(sequence, metaData);
517 }
518
SetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)519 GSError ProducerSurface::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
520 const std::vector<uint8_t> &metaData)
521 {
522 if (key < GraphicHDRMetadataKey::GRAPHIC_MATAKEY_RED_PRIMARY_X ||
523 key > GraphicHDRMetadataKey::GRAPHIC_MATAKEY_HDR_VIVID || metaData.size() == 0) {
524 return GSERROR_INVALID_ARGUMENTS;
525 }
526 return producer_->SetMetaDataSet(sequence, key, metaData);
527 }
528
QueryMetaDataType(uint32_t sequence,HDRMetaDataType & type) const529 GSError ProducerSurface::QueryMetaDataType(uint32_t sequence, HDRMetaDataType &type) const
530 {
531 return GSERROR_NOT_SUPPORT;
532 }
533
GetMetaData(uint32_t sequence,std::vector<GraphicHDRMetaData> & metaData) const534 GSError ProducerSurface::GetMetaData(uint32_t sequence, std::vector<GraphicHDRMetaData> &metaData) const
535 {
536 return GSERROR_NOT_SUPPORT;
537 }
538
GetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey & key,std::vector<uint8_t> & metaData) const539 GSError ProducerSurface::GetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey &key,
540 std::vector<uint8_t> &metaData) const
541 {
542 return GSERROR_NOT_SUPPORT;
543 }
544
SetTunnelHandle(const GraphicExtDataHandle * handle)545 GSError ProducerSurface::SetTunnelHandle(const GraphicExtDataHandle *handle)
546 {
547 return producer_->SetTunnelHandle(handle);
548 }
549
GetTunnelHandle() const550 sptr<SurfaceTunnelHandle> ProducerSurface::GetTunnelHandle() const
551 {
552 // not support
553 return nullptr;
554 }
555
SetPresentTimestamp(uint32_t sequence,const GraphicPresentTimestamp & timestamp)556 GSError ProducerSurface::SetPresentTimestamp(uint32_t sequence, const GraphicPresentTimestamp ×tamp)
557 {
558 return GSERROR_NOT_SUPPORT;
559 }
560
GetPresentTimestamp(uint32_t sequence,GraphicPresentTimestampType type,int64_t & time) const561 GSError ProducerSurface::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type,
562 int64_t &time) const
563 {
564 if (type <= GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_UNSUPPORTED ||
565 type > GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_TIMESTAMP) {
566 return GSERROR_INVALID_ARGUMENTS;
567 }
568 return producer_->GetPresentTimestamp(sequence, type, time);
569 }
570
GetDefaultFormat()571 int32_t ProducerSurface::GetDefaultFormat()
572 {
573 BLOGND("ProducerSurface::GetDefaultFormat not support.");
574 return 0;
575 }
576
SetDefaultFormat(int32_t format)577 GSError ProducerSurface::SetDefaultFormat(int32_t format)
578 {
579 BLOGND("ProducerSurface::SetDefaultFormat not support.");
580 return GSERROR_NOT_SUPPORT;
581 }
582
GetDefaultColorGamut()583 int32_t ProducerSurface::GetDefaultColorGamut()
584 {
585 BLOGND("ProducerSurface::GetDefaultColorGamut not support.");
586 return 0;
587 }
588
SetDefaultColorGamut(int32_t colorGamut)589 GSError ProducerSurface::SetDefaultColorGamut(int32_t colorGamut)
590 {
591 BLOGND("ProducerSurface::SetDefaultColorGamut not support.");
592 return GSERROR_NOT_SUPPORT;
593 }
594
GetNativeSurface()595 sptr<NativeSurface> ProducerSurface::GetNativeSurface()
596 {
597 BLOGND("ProducerSurface::GetNativeSurface not support.");
598 return nullptr;
599 }
600
SetWptrNativeWindowToPSurface(void * nativeWindow)601 GSError ProducerSurface::SetWptrNativeWindowToPSurface(void* nativeWindow)
602 {
603 NativeWindow *nw = reinterpret_cast<NativeWindow *>(nativeWindow);
604 wpNativeWindow_ = nw;
605 return GSERROR_OK;
606 }
607 } // namespace OHOS
608