• 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 "sync_fence.h"
24 
25 namespace OHOS {
26 namespace {
27 constexpr int32_t PRODUCER_REF_COUNT_IN_PRODUCER_SURFACE = 1;
28 }
29 
ProducerSurface(sptr<IBufferProducer> & producer)30 ProducerSurface::ProducerSurface(sptr<IBufferProducer>& producer)
31 {
32     producer_ = producer;
33     BLOGND("ctor");
34 }
35 
~ProducerSurface()36 ProducerSurface::~ProducerSurface()
37 {
38     if (producer_->GetSptrRefCount() > PRODUCER_REF_COUNT_IN_PRODUCER_SURFACE) {
39         BLOGNE("Wrong SptrRefCount! producer_:%{public}d", producer_->GetSptrRefCount());
40     }
41     BLOGND("dtor, name:%{public}s, Queue Id:%{public}" PRIu64, name_.c_str(), queueId_);
42     auto ret = Disconnect();
43     if (ret != GSERROR_OK) {
44         BLOGNE("Disconnect failed, %{public}s", GSErrorStr(ret).c_str());
45     }
46 }
47 
Init()48 GSError ProducerSurface::Init()
49 {
50     if (inited_.load()) {
51         return GSERROR_OK;
52     }
53     auto ret = producer_->GetNameAndUniqueId(name_, queueId_);
54     if (ret != GSERROR_OK) {
55         BLOGNE("GetNameAndUniqueId failed, %{public}s", GSErrorStr(ret).c_str());
56     }
57     inited_.store(true);
58     BLOGND("ctor, name:%{public}s, Queue Id:%{public}" PRIu64, name_.c_str(), queueId_);
59     return GSERROR_OK;
60 }
61 
IsConsumer() const62 bool ProducerSurface::IsConsumer() const
63 {
64     return false;
65 }
66 
GetProducer() const67 sptr<IBufferProducer> ProducerSurface::GetProducer() const
68 {
69     return producer_;
70 }
71 
RequestBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,BufferRequestConfig & config)72 GSError ProducerSurface::RequestBuffer(sptr<SurfaceBuffer>& buffer,
73                                        sptr<SyncFence>& fence, BufferRequestConfig &config)
74 {
75     IBufferProducer::RequestBufferReturnValue retval;
76     sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
77     GSError ret = producer_->RequestBuffer(config, bedataimpl, retval);
78     if (ret != GSERROR_OK) {
79         if (ret == GSERROR_NO_CONSUMER) {
80             std::lock_guard<std::mutex> lockGuard(mutex_);
81             bufferProducerCache_.clear();
82         }
83         BLOGND("Producer report %{public}s", GSErrorStr(ret).c_str());
84         return ret;
85     }
86 
87     std::lock_guard<std::mutex> lockGuard(mutex_);
88     if (isDisconnected) {
89         isDisconnected = false;
90     }
91     // add cache
92     if (retval.buffer != nullptr) {
93         bufferProducerCache_[retval.sequence] = retval.buffer;
94     } else if (bufferProducerCache_.find(retval.sequence) == bufferProducerCache_.end()) {
95         return GSERROR_API_FAILED;
96     } else {
97         retval.buffer = bufferProducerCache_[retval.sequence];
98     }
99     buffer = retval.buffer;
100     fence = retval.fence;
101 
102     if (static_cast<uint64_t>(config.usage) & BUFFER_USAGE_CPU_WRITE) {
103         ret = buffer->InvalidateCache();
104         if (ret != GSERROR_OK) {
105             BLOGNW("Warning [%{public}d], InvalidateCache failed", retval.sequence);
106         }
107     }
108 
109     if (buffer != nullptr) {
110         buffer->SetExtraData(bedataimpl);
111     }
112 
113     for (auto it = retval.deletingBuffers.begin(); it != retval.deletingBuffers.end(); it++) {
114         bufferProducerCache_.erase(*it);
115     }
116     return GSERROR_OK;
117 }
FlushBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence,BufferFlushConfig & config)118 GSError ProducerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer,
119                                      const sptr<SyncFence>& fence, BufferFlushConfig &config)
120 {
121     if (buffer == nullptr) {
122         return GSERROR_INVALID_ARGUMENTS;
123     }
124 
125     const sptr<BufferExtraData>& bedata = buffer->GetExtraData();
126     return producer_->FlushBuffer(buffer->GetSeqNum(), bedata, fence, config);
127 }
AcquireBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,int64_t & timestamp,Rect & damage)128 GSError ProducerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
129                                        int64_t &timestamp, Rect &damage)
130 {
131     return GSERROR_NOT_SUPPORT;
132 }
ReleaseBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence)133 GSError ProducerSurface::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence)
134 {
135     return GSERROR_NOT_SUPPORT;
136 }
137 
RequestBuffer(sptr<SurfaceBuffer> & buffer,int32_t & fence,BufferRequestConfig & config)138 GSError ProducerSurface::RequestBuffer(sptr<SurfaceBuffer>& buffer,
139     int32_t &fence, BufferRequestConfig &config)
140 {
141     sptr<SyncFence> syncFence = SyncFence::INVALID_FENCE;
142     auto ret = RequestBuffer(buffer, syncFence, config);
143     if (ret != GSERROR_OK) {
144         fence = -1;
145         return ret;
146     }
147     fence = syncFence->Dup();
148     return GSERROR_OK;
149 }
150 
CancelBuffer(sptr<SurfaceBuffer> & buffer)151 GSError ProducerSurface::CancelBuffer(sptr<SurfaceBuffer>& buffer)
152 {
153     if (buffer == nullptr) {
154         return GSERROR_INVALID_ARGUMENTS;
155     }
156 
157     const sptr<BufferExtraData>& bedata = buffer->GetExtraData();
158     return producer_->CancelBuffer(buffer->GetSeqNum(), bedata);
159 }
160 
FlushBuffer(sptr<SurfaceBuffer> & buffer,int32_t fence,BufferFlushConfig & config)161 GSError ProducerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer,
162     int32_t fence, BufferFlushConfig &config)
163 {
164     // fence need close?
165     sptr<SyncFence> syncFence = new SyncFence(fence);
166     return FlushBuffer(buffer, syncFence, config);
167 }
168 
AcquireBuffer(sptr<SurfaceBuffer> & buffer,int32_t & fence,int64_t & timestamp,Rect & damage)169 GSError ProducerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, int32_t &fence,
170     int64_t &timestamp, Rect &damage)
171 {
172     return GSERROR_NOT_SUPPORT;
173 }
174 
ReleaseBuffer(sptr<SurfaceBuffer> & buffer,int32_t fence)175 GSError ProducerSurface::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, int32_t fence)
176 {
177     return GSERROR_NOT_SUPPORT;
178 }
179 
AttachBuffer(sptr<SurfaceBuffer> & buffer)180 GSError ProducerSurface::AttachBuffer(sptr<SurfaceBuffer>& buffer)
181 {
182     if (buffer == nullptr) {
183         return GSERROR_INVALID_ARGUMENTS;
184     }
185 
186     BLOGND("the addr : %{public}p", buffer.GetRefPtr());
187     return producer_->AttachBuffer(buffer);
188 }
189 
DetachBuffer(sptr<SurfaceBuffer> & buffer)190 GSError ProducerSurface::DetachBuffer(sptr<SurfaceBuffer>& buffer)
191 {
192     if (buffer == nullptr) {
193         return GSERROR_INVALID_ARGUMENTS;
194     }
195     return producer_->DetachBuffer(buffer);
196 }
197 
GetQueueSize()198 uint32_t ProducerSurface::GetQueueSize()
199 {
200     return producer_->GetQueueSize();
201 }
202 
SetQueueSize(uint32_t queueSize)203 GSError ProducerSurface::SetQueueSize(uint32_t queueSize)
204 {
205     return producer_->SetQueueSize(queueSize);
206 }
207 
GetName()208 const std::string& ProducerSurface::GetName()
209 {
210     if (!inited_.load()) {
211         BLOGNW("Warning ProducerSurface is not initialized, the name you get is uninitialized.");
212     }
213     return name_;
214 }
215 
SetDefaultWidthAndHeight(int32_t width,int32_t height)216 GSError ProducerSurface::SetDefaultWidthAndHeight(int32_t width, int32_t height)
217 {
218     return GSERROR_NOT_SUPPORT;
219 }
220 
GetDefaultWidth()221 int32_t ProducerSurface::GetDefaultWidth()
222 {
223     return producer_->GetDefaultWidth();
224 }
225 
GetDefaultHeight()226 int32_t ProducerSurface::GetDefaultHeight()
227 {
228     return producer_->GetDefaultHeight();
229 }
230 
SetDefaultUsage(uint32_t usage)231 GSError ProducerSurface::SetDefaultUsage(uint32_t usage)
232 {
233     return GSERROR_NOT_SUPPORT;
234 }
235 
GetDefaultUsage()236 uint32_t ProducerSurface::GetDefaultUsage()
237 {
238     return producer_->GetDefaultUsage();
239 }
240 
SetUserData(const std::string & key,const std::string & val)241 GSError ProducerSurface::SetUserData(const std::string &key, const std::string &val)
242 {
243     if (userData_.size() >= SURFACE_MAX_USER_DATA_COUNT) {
244         return GSERROR_OUT_OF_RANGE;
245     }
246     userData_[key] = val;
247     return GSERROR_OK;
248 }
249 
GetUserData(const std::string & key)250 std::string ProducerSurface::GetUserData(const std::string &key)
251 {
252     if (userData_.find(key) != userData_.end()) {
253         return userData_[key];
254     }
255 
256     return "";
257 }
258 
RegisterConsumerListener(sptr<IBufferConsumerListener> & listener)259 GSError ProducerSurface::RegisterConsumerListener(sptr<IBufferConsumerListener>& listener)
260 {
261     return GSERROR_NOT_SUPPORT;
262 }
263 
RegisterConsumerListener(IBufferConsumerListenerClazz * listener)264 GSError ProducerSurface::RegisterConsumerListener(IBufferConsumerListenerClazz *listener)
265 {
266     return GSERROR_NOT_SUPPORT;
267 }
268 
UnregisterConsumerListener()269 GSError ProducerSurface::UnregisterConsumerListener()
270 {
271     return GSERROR_NOT_SUPPORT;
272 }
273 
RegisterReleaseListener(OnReleaseFunc func)274 GSError ProducerSurface::RegisterReleaseListener(OnReleaseFunc func)
275 {
276     return producer_->RegisterReleaseListener(func);
277 }
278 
RegisterDeleteBufferListener(OnDeleteBufferFunc func)279 GSError ProducerSurface::RegisterDeleteBufferListener(OnDeleteBufferFunc func)
280 {
281     return GSERROR_NOT_SUPPORT;
282 }
283 
IsRemote()284 bool ProducerSurface::IsRemote()
285 {
286     return producer_->AsObject()->IsProxyObject();
287 }
288 
CleanCache()289 GSError ProducerSurface::CleanCache()
290 {
291     BLOGND("Queue Id:%{public}" PRIu64, queueId_);
292     {
293         std::lock_guard<std::mutex> lockGuard(mutex_);
294         bufferProducerCache_.clear();
295     }
296     return producer_->CleanCache();
297 }
298 
GoBackground()299 GSError ProducerSurface::GoBackground()
300 {
301     BLOGND("Queue Id:%{public}" PRIu64 "", queueId_);
302     {
303         std::lock_guard<std::mutex> lockGuard(mutex_);
304         bufferProducerCache_.clear();
305     }
306     return producer_->GoBackground();
307 }
308 
GetUniqueId() const309 uint64_t ProducerSurface::GetUniqueId() const
310 {
311     if (!inited_.load()) {
312         BLOGNW("Warning ProducerSurface is not initialized, the uniquedId you get is uninitialized.");
313     }
314     return queueId_;
315 }
316 
SetTransform(GraphicTransformType transform)317 GSError ProducerSurface::SetTransform(GraphicTransformType transform)
318 {
319     return producer_->SetTransform(transform);
320 }
321 
GetTransform() const322 GraphicTransformType ProducerSurface::GetTransform() const
323 {
324     return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
325 }
326 
IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> & infos,std::vector<bool> & supporteds)327 GSError ProducerSurface::IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> &infos,
328                                           std::vector<bool> &supporteds)
329 {
330     if (infos.size() == 0 || infos.size() != supporteds.size()) {
331         return GSERROR_INVALID_ARGUMENTS;
332     }
333     return producer_->IsSupportedAlloc(infos, supporteds);
334 }
335 
Disconnect()336 GSError ProducerSurface::Disconnect()
337 {
338     {
339         std::lock_guard<std::mutex> lockGuard(mutex_);
340         if (isDisconnected) {
341             return GSERROR_INVALID_OPERATING;
342         }
343     }
344     BLOGND("Queue Id:%{public}" PRIu64 "", queueId_);
345     {
346         std::lock_guard<std::mutex> lockGuard(mutex_);
347         bufferProducerCache_.clear();
348     }
349     GSError ret = producer_->Disconnect();
350     {
351         std::lock_guard<std::mutex> lockGuard(mutex_);
352         if (ret == GSERROR_OK) {
353             isDisconnected = true;
354         }
355     }
356     return ret;
357 }
358 
SetScalingMode(uint32_t sequence,ScalingMode scalingMode)359 GSError ProducerSurface::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
360 {
361     if (scalingMode < ScalingMode::SCALING_MODE_FREEZE ||
362         scalingMode > ScalingMode::SCALING_MODE_NO_SCALE_CROP) {
363         return GSERROR_INVALID_ARGUMENTS;
364     }
365     return producer_->SetScalingMode(sequence, scalingMode);
366 }
367 
GetScalingMode(uint32_t sequence,ScalingMode & scalingMode)368 GSError ProducerSurface::GetScalingMode(uint32_t sequence, ScalingMode &scalingMode)
369 {
370     return GSERROR_NOT_SUPPORT;
371 }
372 
SetMetaData(uint32_t sequence,const std::vector<GraphicHDRMetaData> & metaData)373 GSError ProducerSurface::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData> &metaData)
374 {
375     if (metaData.size() == 0) {
376         return GSERROR_INVALID_ARGUMENTS;
377     }
378     return producer_->SetMetaData(sequence, metaData);
379 }
380 
SetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)381 GSError ProducerSurface::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
382                                         const std::vector<uint8_t> &metaData)
383 {
384     if (key < GraphicHDRMetadataKey::GRAPHIC_MATAKEY_RED_PRIMARY_X ||
385         key > GraphicHDRMetadataKey::GRAPHIC_MATAKEY_HDR_VIVID || metaData.size() == 0) {
386         return GSERROR_INVALID_ARGUMENTS;
387     }
388     return producer_->SetMetaDataSet(sequence, key, metaData);
389 }
390 
QueryMetaDataType(uint32_t sequence,HDRMetaDataType & type) const391 GSError ProducerSurface::QueryMetaDataType(uint32_t sequence, HDRMetaDataType &type) const
392 {
393     return GSERROR_NOT_SUPPORT;
394 }
395 
GetMetaData(uint32_t sequence,std::vector<GraphicHDRMetaData> & metaData) const396 GSError ProducerSurface::GetMetaData(uint32_t sequence, std::vector<GraphicHDRMetaData> &metaData) const
397 {
398     return GSERROR_NOT_SUPPORT;
399 }
400 
GetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey & key,std::vector<uint8_t> & metaData) const401 GSError ProducerSurface::GetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey &key,
402                                         std::vector<uint8_t> &metaData) const
403 {
404     return GSERROR_NOT_SUPPORT;
405 }
406 
SetTunnelHandle(const GraphicExtDataHandle * handle)407 GSError ProducerSurface::SetTunnelHandle(const GraphicExtDataHandle *handle)
408 {
409     return producer_->SetTunnelHandle(handle);
410 }
411 
GetTunnelHandle() const412 sptr<SurfaceTunnelHandle> ProducerSurface::GetTunnelHandle() const
413 {
414     // not support
415     return nullptr;
416 }
417 
SetPresentTimestamp(uint32_t sequence,const GraphicPresentTimestamp & timestamp)418 GSError ProducerSurface::SetPresentTimestamp(uint32_t sequence, const GraphicPresentTimestamp &timestamp)
419 {
420     return GSERROR_NOT_SUPPORT;
421 }
422 
GetPresentTimestamp(uint32_t sequence,GraphicPresentTimestampType type,int64_t & time) const423 GSError ProducerSurface::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type,
424                                              int64_t &time) const
425 {
426     if (type <= GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_UNSUPPORTED ||
427         type > GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_TIMESTAMP) {
428         return GSERROR_INVALID_ARGUMENTS;
429     }
430     return producer_->GetPresentTimestamp(sequence, type, time);
431 }
432 
GetDefaultFormat()433 int32_t ProducerSurface::GetDefaultFormat()
434 {
435     BLOGND("ProducerSurface::GetDefaultFormat not support.");
436     return 0;
437 }
438 
SetDefaultFormat(int32_t format)439 GSError ProducerSurface::SetDefaultFormat(int32_t format)
440 {
441     BLOGND("ProducerSurface::SetDefaultFormat not support.");
442     return GSERROR_NOT_SUPPORT;
443 }
444 
GetDefaultColorGamut()445 int32_t ProducerSurface::GetDefaultColorGamut()
446 {
447     BLOGND("ProducerSurface::GetDefaultColorGamut not support.");
448     return 0;
449 }
450 
SetDefaultColorGamut(int32_t colorGamut)451 GSError ProducerSurface::SetDefaultColorGamut(int32_t colorGamut)
452 {
453     BLOGND("ProducerSurface::SetDefaultColorGamut not support.");
454     return GSERROR_NOT_SUPPORT;
455 }
456 
GetNativeSurface()457 sptr<NativeSurface> ProducerSurface::GetNativeSurface()
458 {
459     BLOGND("ProducerSurface::GetNativeSurface not support.");
460     return nullptr;
461 }
462 } // namespace OHOS
463