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