• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "producer_surface.h"
17 
18 #include <cinttypes>
19 
20 #include "buffer_log.h"
21 #include "buffer_manager.h"
22 #include "buffer_extra_data_impl.h"
23 #include "buffer_producer_listener.h"
24 #include "sync_fence.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     BLOGND("ctor");
51 }
52 
~ProducerSurface()53 ProducerSurface::~ProducerSurface()
54 {
55     if (producer_->GetSptrRefCount() > PRODUCER_REF_COUNT_IN_PRODUCER_SURFACE) {
56         BLOGNE("Wrong SptrRefCount! producer_:%{public}d", producer_->GetSptrRefCount());
57     }
58     BLOGND("dtor, name:%{public}s, Queue Id:%{public}" PRIu64, name_.c_str(), queueId_);
59     auto ret = Disconnect();
60     if (ret != GSERROR_OK) {
61         BLOGNE("Disconnect failed, %{public}s", GSErrorStr(ret).c_str());
62     }
63 }
64 
Init()65 GSError ProducerSurface::Init()
66 {
67     if (inited_.load()) {
68         return GSERROR_OK;
69     }
70     auto ret = producer_->GetNameAndUniqueId(name_, queueId_);
71     if (ret != GSERROR_OK) {
72         BLOGNE("GetNameAndUniqueId failed, %{public}s", GSErrorStr(ret).c_str());
73     }
74     inited_.store(true);
75     BLOGND("ctor, name:%{public}s, Queue Id:%{public}" PRIu64, name_.c_str(), queueId_);
76     return GSERROR_OK;
77 }
78 
IsConsumer() const79 bool ProducerSurface::IsConsumer() const
80 {
81     return false;
82 }
83 
GetProducer() const84 sptr<IBufferProducer> ProducerSurface::GetProducer() const
85 {
86     return producer_;
87 }
88 
RequestBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,BufferRequestConfig & config)89 GSError ProducerSurface::RequestBuffer(sptr<SurfaceBuffer>& buffer,
90                                        sptr<SyncFence>& fence, BufferRequestConfig &config)
91 {
92     IBufferProducer::RequestBufferReturnValue retval;
93     sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
94     GSError ret = producer_->RequestBuffer(config, bedataimpl, retval);
95     if (ret != GSERROR_OK) {
96         if (ret == GSERROR_NO_CONSUMER) {
97             std::lock_guard<std::mutex> lockGuard(mutex_);
98             bufferProducerCache_.clear();
99         }
100         BLOGND("Producer report %{public}s", GSErrorStr(ret).c_str());
101         return ret;
102     }
103 
104     std::lock_guard<std::mutex> lockGuard(mutex_);
105     if (isDisconnected) {
106         isDisconnected = false;
107     }
108     // add cache
109     if (retval.buffer != nullptr) {
110         bufferProducerCache_[retval.sequence] = retval.buffer;
111     } else if (bufferProducerCache_.find(retval.sequence) == bufferProducerCache_.end()) {
112         return GSERROR_API_FAILED;
113     } else {
114         retval.buffer = bufferProducerCache_[retval.sequence];
115     }
116     buffer = retval.buffer;
117     fence = retval.fence;
118 
119     if (static_cast<uint64_t>(config.usage) & BUFFER_USAGE_CPU_WRITE) {
120         ret = buffer->InvalidateCache();
121         if (ret != GSERROR_OK) {
122             BLOGNW("Warning [%{public}d], InvalidateCache failed", retval.sequence);
123         }
124     }
125 
126     if (buffer != nullptr) {
127         buffer->SetExtraData(bedataimpl);
128     }
129 
130     for (auto it = retval.deletingBuffers.begin(); it != retval.deletingBuffers.end(); it++) {
131         bufferProducerCache_.erase(*it);
132     }
133     return GSERROR_OK;
134 }
FlushBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence,BufferFlushConfig & config)135 GSError ProducerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer,
136                                      const sptr<SyncFence>& fence, BufferFlushConfig &config)
137 {
138     BufferFlushConfigWithDamages configWithDamages;
139     configWithDamages.damages.push_back(config.damage);
140     configWithDamages.timestamp = config.timestamp;
141     return FlushBuffer(buffer, fence, configWithDamages);
142 }
143 
FlushBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence,BufferFlushConfigWithDamages & config)144 GSError ProducerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence,
145                                      BufferFlushConfigWithDamages &config)
146 {
147     if (buffer == nullptr) {
148         return GSERROR_INVALID_ARGUMENTS;
149     }
150 
151     const sptr<BufferExtraData>& bedata = buffer->GetExtraData();
152     return producer_->FlushBuffer(buffer->GetSeqNum(), bedata, fence, config);
153 }
154 
AcquireBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,int64_t & timestamp,Rect & damage)155 GSError ProducerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
156                                        int64_t &timestamp, Rect &damage)
157 {
158     return GSERROR_NOT_SUPPORT;
159 }
ReleaseBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence)160 GSError ProducerSurface::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence)
161 {
162     return GSERROR_NOT_SUPPORT;
163 }
164 
RequestBuffer(sptr<SurfaceBuffer> & buffer,int32_t & fence,BufferRequestConfig & config)165 GSError ProducerSurface::RequestBuffer(sptr<SurfaceBuffer>& buffer,
166     int32_t &fence, BufferRequestConfig &config)
167 {
168     sptr<SyncFence> syncFence = SyncFence::INVALID_FENCE;
169     auto ret = RequestBuffer(buffer, syncFence, config);
170     if (ret != GSERROR_OK) {
171         fence = -1;
172         return ret;
173     }
174     fence = syncFence->Dup();
175     return GSERROR_OK;
176 }
177 
CancelBuffer(sptr<SurfaceBuffer> & buffer)178 GSError ProducerSurface::CancelBuffer(sptr<SurfaceBuffer>& buffer)
179 {
180     if (buffer == nullptr) {
181         return GSERROR_INVALID_ARGUMENTS;
182     }
183 
184     const sptr<BufferExtraData>& bedata = buffer->GetExtraData();
185     return producer_->CancelBuffer(buffer->GetSeqNum(), bedata);
186 }
187 
FlushBuffer(sptr<SurfaceBuffer> & buffer,int32_t fence,BufferFlushConfig & config)188 GSError ProducerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer,
189     int32_t fence, BufferFlushConfig &config)
190 {
191     // fence need close?
192     sptr<SyncFence> syncFence = new SyncFence(fence);
193     return FlushBuffer(buffer, syncFence, config);
194 }
195 
AcquireBuffer(sptr<SurfaceBuffer> & buffer,int32_t & fence,int64_t & timestamp,Rect & damage)196 GSError ProducerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, int32_t &fence,
197     int64_t &timestamp, Rect &damage)
198 {
199     return GSERROR_NOT_SUPPORT;
200 }
201 
ReleaseBuffer(sptr<SurfaceBuffer> & buffer,int32_t fence)202 GSError ProducerSurface::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, int32_t fence)
203 {
204     return GSERROR_NOT_SUPPORT;
205 }
206 
AttachBuffer(sptr<SurfaceBuffer> & buffer)207 GSError ProducerSurface::AttachBuffer(sptr<SurfaceBuffer>& buffer)
208 {
209     if (buffer == nullptr) {
210         return GSERROR_INVALID_ARGUMENTS;
211     }
212 
213     return producer_->AttachBuffer(buffer);
214 }
215 
DetachBuffer(sptr<SurfaceBuffer> & buffer)216 GSError ProducerSurface::DetachBuffer(sptr<SurfaceBuffer>& buffer)
217 {
218     if (buffer == nullptr) {
219         return GSERROR_INVALID_ARGUMENTS;
220     }
221     return producer_->DetachBuffer(buffer);
222 }
223 
QueryIfBufferAvailable()224 bool ProducerSurface::QueryIfBufferAvailable()
225 {
226     return false;
227 }
228 
GetQueueSize()229 uint32_t ProducerSurface::GetQueueSize()
230 {
231     return producer_->GetQueueSize();
232 }
233 
SetQueueSize(uint32_t queueSize)234 GSError ProducerSurface::SetQueueSize(uint32_t queueSize)
235 {
236     return producer_->SetQueueSize(queueSize);
237 }
238 
GetName()239 const std::string& ProducerSurface::GetName()
240 {
241     if (!inited_.load()) {
242         BLOGNW("Warning ProducerSurface is not initialized, the name you get is uninitialized.");
243     }
244     return name_;
245 }
246 
SetDefaultWidthAndHeight(int32_t width,int32_t height)247 GSError ProducerSurface::SetDefaultWidthAndHeight(int32_t width, int32_t height)
248 {
249     return GSERROR_NOT_SUPPORT;
250 }
251 
GetDefaultWidth()252 int32_t ProducerSurface::GetDefaultWidth()
253 {
254     return producer_->GetDefaultWidth();
255 }
256 
GetDefaultHeight()257 int32_t ProducerSurface::GetDefaultHeight()
258 {
259     return producer_->GetDefaultHeight();
260 }
261 
SetDefaultUsage(uint32_t usage)262 GSError ProducerSurface::SetDefaultUsage(uint32_t usage)
263 {
264     return GSERROR_NOT_SUPPORT;
265 }
266 
GetDefaultUsage()267 uint32_t ProducerSurface::GetDefaultUsage()
268 {
269     return producer_->GetDefaultUsage();
270 }
271 
SetUserData(const std::string & key,const std::string & val)272 GSError ProducerSurface::SetUserData(const std::string &key, const std::string &val)
273 {
274     if (userData_.size() >= SURFACE_MAX_USER_DATA_COUNT) {
275         return GSERROR_OUT_OF_RANGE;
276     }
277     userData_[key] = val;
278     return GSERROR_OK;
279 }
280 
GetUserData(const std::string & key)281 std::string ProducerSurface::GetUserData(const std::string &key)
282 {
283     if (userData_.find(key) != userData_.end()) {
284         return userData_[key];
285     }
286 
287     return "";
288 }
289 
RegisterConsumerListener(sptr<IBufferConsumerListener> & listener)290 GSError ProducerSurface::RegisterConsumerListener(sptr<IBufferConsumerListener>& listener)
291 {
292     return GSERROR_NOT_SUPPORT;
293 }
294 
RegisterConsumerListener(IBufferConsumerListenerClazz * listener)295 GSError ProducerSurface::RegisterConsumerListener(IBufferConsumerListenerClazz *listener)
296 {
297     return GSERROR_NOT_SUPPORT;
298 }
299 
UnregisterConsumerListener()300 GSError ProducerSurface::UnregisterConsumerListener()
301 {
302     return GSERROR_NOT_SUPPORT;
303 }
304 
RegisterReleaseListener(OnReleaseFunc func)305 GSError ProducerSurface::RegisterReleaseListener(OnReleaseFunc func)
306 {
307     if (func == nullptr) {
308         BLOGNE("OnReleaseFunc is nullptr, RegisterReleaseListener failed.");
309         return GSERROR_INVALID_ARGUMENTS;
310     }
311     listener_ = new BufferReleaseProducerListener(func);
312     return producer_->RegisterReleaseListener(listener_);
313 }
314 
RegisterDeleteBufferListener(OnDeleteBufferFunc func,bool isForUniRedraw)315 GSError ProducerSurface::RegisterDeleteBufferListener(OnDeleteBufferFunc func, bool isForUniRedraw)
316 {
317     return GSERROR_NOT_SUPPORT;
318 }
319 
IsRemote()320 bool ProducerSurface::IsRemote()
321 {
322     return producer_->AsObject()->IsProxyObject();
323 }
324 
CleanCache()325 GSError ProducerSurface::CleanCache()
326 {
327     BLOGND("Queue Id:%{public}" PRIu64, queueId_);
328     {
329         std::lock_guard<std::mutex> lockGuard(mutex_);
330         bufferProducerCache_.clear();
331     }
332     return producer_->CleanCache();
333 }
334 
GoBackground()335 GSError ProducerSurface::GoBackground()
336 {
337     BLOGND("Queue Id:%{public}" PRIu64 "", queueId_);
338     {
339         std::lock_guard<std::mutex> lockGuard(mutex_);
340         bufferProducerCache_.clear();
341     }
342     return producer_->GoBackground();
343 }
344 
GetUniqueId() const345 uint64_t ProducerSurface::GetUniqueId() const
346 {
347     if (!inited_.load()) {
348         BLOGNW("Warning ProducerSurface is not initialized, the uniquedId you get is uninitialized.");
349     }
350     return queueId_;
351 }
352 
SetTransform(GraphicTransformType transform)353 GSError ProducerSurface::SetTransform(GraphicTransformType transform)
354 {
355     return producer_->SetTransform(transform);
356 }
357 
GetTransform() const358 GraphicTransformType ProducerSurface::GetTransform() const
359 {
360     return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
361 }
362 
IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> & infos,std::vector<bool> & supporteds)363 GSError ProducerSurface::IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> &infos,
364                                           std::vector<bool> &supporteds)
365 {
366     if (infos.size() == 0 || infos.size() != supporteds.size()) {
367         return GSERROR_INVALID_ARGUMENTS;
368     }
369     return producer_->IsSupportedAlloc(infos, supporteds);
370 }
371 
Disconnect()372 GSError ProducerSurface::Disconnect()
373 {
374     {
375         std::lock_guard<std::mutex> lockGuard(mutex_);
376         if (isDisconnected) {
377             return GSERROR_INVALID_OPERATING;
378         }
379     }
380     BLOGND("Queue Id:%{public}" PRIu64 "", queueId_);
381     {
382         std::lock_guard<std::mutex> lockGuard(mutex_);
383         bufferProducerCache_.clear();
384     }
385     GSError ret = producer_->Disconnect();
386     {
387         std::lock_guard<std::mutex> lockGuard(mutex_);
388         if (ret == GSERROR_OK) {
389             isDisconnected = true;
390         }
391     }
392     return ret;
393 }
394 
SetScalingMode(uint32_t sequence,ScalingMode scalingMode)395 GSError ProducerSurface::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
396 {
397     if (scalingMode < ScalingMode::SCALING_MODE_FREEZE ||
398         scalingMode > ScalingMode::SCALING_MODE_NO_SCALE_CROP) {
399         return GSERROR_INVALID_ARGUMENTS;
400     }
401     return producer_->SetScalingMode(sequence, scalingMode);
402 }
403 
GetScalingMode(uint32_t sequence,ScalingMode & scalingMode)404 GSError ProducerSurface::GetScalingMode(uint32_t sequence, ScalingMode &scalingMode)
405 {
406     return GSERROR_NOT_SUPPORT;
407 }
408 
SetMetaData(uint32_t sequence,const std::vector<GraphicHDRMetaData> & metaData)409 GSError ProducerSurface::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData> &metaData)
410 {
411     if (metaData.size() == 0) {
412         return GSERROR_INVALID_ARGUMENTS;
413     }
414     return producer_->SetMetaData(sequence, metaData);
415 }
416 
SetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)417 GSError ProducerSurface::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
418                                         const std::vector<uint8_t> &metaData)
419 {
420     if (key < GraphicHDRMetadataKey::GRAPHIC_MATAKEY_RED_PRIMARY_X ||
421         key > GraphicHDRMetadataKey::GRAPHIC_MATAKEY_HDR_VIVID || metaData.size() == 0) {
422         return GSERROR_INVALID_ARGUMENTS;
423     }
424     return producer_->SetMetaDataSet(sequence, key, metaData);
425 }
426 
QueryMetaDataType(uint32_t sequence,HDRMetaDataType & type) const427 GSError ProducerSurface::QueryMetaDataType(uint32_t sequence, HDRMetaDataType &type) const
428 {
429     return GSERROR_NOT_SUPPORT;
430 }
431 
GetMetaData(uint32_t sequence,std::vector<GraphicHDRMetaData> & metaData) const432 GSError ProducerSurface::GetMetaData(uint32_t sequence, std::vector<GraphicHDRMetaData> &metaData) const
433 {
434     return GSERROR_NOT_SUPPORT;
435 }
436 
GetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey & key,std::vector<uint8_t> & metaData) const437 GSError ProducerSurface::GetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey &key,
438                                         std::vector<uint8_t> &metaData) const
439 {
440     return GSERROR_NOT_SUPPORT;
441 }
442 
SetTunnelHandle(const GraphicExtDataHandle * handle)443 GSError ProducerSurface::SetTunnelHandle(const GraphicExtDataHandle *handle)
444 {
445     return producer_->SetTunnelHandle(handle);
446 }
447 
GetTunnelHandle() const448 sptr<SurfaceTunnelHandle> ProducerSurface::GetTunnelHandle() const
449 {
450     // not support
451     return nullptr;
452 }
453 
SetPresentTimestamp(uint32_t sequence,const GraphicPresentTimestamp & timestamp)454 GSError ProducerSurface::SetPresentTimestamp(uint32_t sequence, const GraphicPresentTimestamp &timestamp)
455 {
456     return GSERROR_NOT_SUPPORT;
457 }
458 
GetPresentTimestamp(uint32_t sequence,GraphicPresentTimestampType type,int64_t & time) const459 GSError ProducerSurface::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type,
460                                              int64_t &time) const
461 {
462     if (type <= GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_UNSUPPORTED ||
463         type > GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_TIMESTAMP) {
464         return GSERROR_INVALID_ARGUMENTS;
465     }
466     return producer_->GetPresentTimestamp(sequence, type, time);
467 }
468 
GetDefaultFormat()469 int32_t ProducerSurface::GetDefaultFormat()
470 {
471     BLOGND("ProducerSurface::GetDefaultFormat not support.");
472     return 0;
473 }
474 
SetDefaultFormat(int32_t format)475 GSError ProducerSurface::SetDefaultFormat(int32_t format)
476 {
477     BLOGND("ProducerSurface::SetDefaultFormat not support.");
478     return GSERROR_NOT_SUPPORT;
479 }
480 
GetDefaultColorGamut()481 int32_t ProducerSurface::GetDefaultColorGamut()
482 {
483     BLOGND("ProducerSurface::GetDefaultColorGamut not support.");
484     return 0;
485 }
486 
SetDefaultColorGamut(int32_t colorGamut)487 GSError ProducerSurface::SetDefaultColorGamut(int32_t colorGamut)
488 {
489     BLOGND("ProducerSurface::SetDefaultColorGamut not support.");
490     return GSERROR_NOT_SUPPORT;
491 }
492 
GetNativeSurface()493 sptr<NativeSurface> ProducerSurface::GetNativeSurface()
494 {
495     BLOGND("ProducerSurface::GetNativeSurface not support.");
496     return nullptr;
497 }
498 } // namespace OHOS
499