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 "consumer_surface.h"
17
18 #include <cinttypes>
19
20 #include "buffer_log.h"
21 #include "buffer_queue_producer.h"
22 #include "sync_fence.h"
23
24 namespace OHOS {
25 namespace {
26 constexpr int32_t CONSUMER_REF_COUNT_IN_CONSUMER_SURFACE = 1;
27 constexpr int32_t PRODUCER_REF_COUNT_IN_CONSUMER_SURFACE = 2;
28 }
29
ConsumerSurface(const std::string & name,bool isShared)30 ConsumerSurface::ConsumerSurface(const std::string &name, bool isShared)
31 : name_(name), isShared_(isShared)
32 {
33 BLOGND("ctor");
34 consumer_ = nullptr;
35 producer_ = nullptr;
36 }
37
~ConsumerSurface()38 ConsumerSurface::~ConsumerSurface()
39 {
40 BLOGND("dtor");
41 if (consumer_->GetSptrRefCount() > CONSUMER_REF_COUNT_IN_CONSUMER_SURFACE ||
42 producer_->GetSptrRefCount() > PRODUCER_REF_COUNT_IN_CONSUMER_SURFACE) {
43 BLOGNE("Wrong SptrRefCount! Queue Id:%{public}" PRIu64 " consumer_:%{public}d producer_:%{public}d",
44 producer_->GetUniqueId(), consumer_->GetSptrRefCount(), producer_->GetSptrRefCount());
45 }
46 consumer_->OnConsumerDied();
47 producer_->SetStatus(false);
48 consumer_ = nullptr;
49 producer_ = nullptr;
50 }
51
Init()52 GSError ConsumerSurface::Init()
53 {
54 sptr<BufferQueue> queue_ = new BufferQueue(name_, isShared_);
55 GSError ret = queue_->Init();
56 if (ret != GSERROR_OK) {
57 BLOGN_FAILURE("queue init failed");
58 return ret;
59 }
60
61 producer_ = new BufferQueueProducer(queue_);
62 consumer_ = new BufferQueueConsumer(queue_);
63 return GSERROR_OK;
64 }
65
IsConsumer() const66 bool ConsumerSurface::IsConsumer() const
67 {
68 return true;
69 }
70
GetProducer() const71 sptr<IBufferProducer> ConsumerSurface::GetProducer() const
72 {
73 return producer_;
74 }
75
RequestBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,BufferRequestConfig & config)76 GSError ConsumerSurface::RequestBuffer(sptr<SurfaceBuffer>& buffer,
77 sptr<SyncFence>& fence, BufferRequestConfig &config)
78 {
79 return GSERROR_NOT_SUPPORT;
80 }
FlushBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence,BufferFlushConfig & config)81 GSError ConsumerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer,
82 const sptr<SyncFence>& fence, BufferFlushConfig &config)
83 {
84 return GSERROR_NOT_SUPPORT;
85 }
AcquireBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,int64_t & timestamp,Rect & damage)86 GSError ConsumerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
87 int64_t ×tamp, Rect &damage)
88 {
89 return consumer_->AcquireBuffer(buffer, fence, timestamp, damage);
90 }
ReleaseBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence)91 GSError ConsumerSurface::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence)
92 {
93 return consumer_->ReleaseBuffer(buffer, fence);
94 }
RequestBuffer(sptr<SurfaceBuffer> & buffer,int32_t & fence,BufferRequestConfig & config)95 GSError ConsumerSurface::RequestBuffer(sptr<SurfaceBuffer>& buffer,
96 int32_t &fence, BufferRequestConfig &config)
97 {
98 return GSERROR_NOT_SUPPORT;
99 }
100
CancelBuffer(sptr<SurfaceBuffer> & buffer)101 GSError ConsumerSurface::CancelBuffer(sptr<SurfaceBuffer>& buffer)
102 {
103 return GSERROR_NOT_SUPPORT;
104 }
105
FlushBuffer(sptr<SurfaceBuffer> & buffer,int32_t fence,BufferFlushConfig & config)106 GSError ConsumerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer,
107 int32_t fence, BufferFlushConfig &config)
108 {
109 return GSERROR_NOT_SUPPORT;
110 }
111
AcquireBuffer(sptr<SurfaceBuffer> & buffer,int32_t & fence,int64_t & timestamp,Rect & damage)112 GSError ConsumerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, int32_t &fence,
113 int64_t ×tamp, Rect &damage)
114 {
115 sptr<SyncFence> syncFence = SyncFence::INVALID_FENCE;
116 auto ret = AcquireBuffer(buffer, syncFence, timestamp, damage);
117 if (ret != GSERROR_OK) {
118 fence = -1;
119 return ret;
120 }
121 fence = syncFence->Dup();
122 return GSERROR_OK;
123 }
124
ReleaseBuffer(sptr<SurfaceBuffer> & buffer,int32_t fence)125 GSError ConsumerSurface::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, int32_t fence)
126 {
127 sptr<SyncFence> syncFence = new SyncFence(fence);
128 return ReleaseBuffer(buffer, syncFence);
129 }
130
AttachBuffer(sptr<SurfaceBuffer> & buffer)131 GSError ConsumerSurface::AttachBuffer(sptr<SurfaceBuffer>& buffer)
132 {
133 return consumer_->AttachBuffer(buffer);
134 }
135
DetachBuffer(sptr<SurfaceBuffer> & buffer)136 GSError ConsumerSurface::DetachBuffer(sptr<SurfaceBuffer>& buffer)
137 {
138 return consumer_->DetachBuffer(buffer);
139 }
140
GetQueueSize()141 uint32_t ConsumerSurface::GetQueueSize()
142 {
143 return producer_->GetQueueSize();
144 }
145
SetQueueSize(uint32_t queueSize)146 GSError ConsumerSurface::SetQueueSize(uint32_t queueSize)
147 {
148 return producer_->SetQueueSize(queueSize);
149 }
150
GetName()151 const std::string& ConsumerSurface::GetName()
152 {
153 return name_;
154 }
155
SetDefaultWidthAndHeight(int32_t width,int32_t height)156 GSError ConsumerSurface::SetDefaultWidthAndHeight(int32_t width, int32_t height)
157 {
158 return consumer_->SetDefaultWidthAndHeight(width, height);
159 }
160
GetDefaultWidth()161 int32_t ConsumerSurface::GetDefaultWidth()
162 {
163 return producer_->GetDefaultWidth();
164 }
165
GetDefaultHeight()166 int32_t ConsumerSurface::GetDefaultHeight()
167 {
168 return producer_->GetDefaultHeight();
169 }
170
SetDefaultUsage(uint32_t usage)171 GSError ConsumerSurface::SetDefaultUsage(uint32_t usage)
172 {
173 return consumer_->SetDefaultUsage(usage);
174 }
175
GetDefaultUsage()176 uint32_t ConsumerSurface::GetDefaultUsage()
177 {
178 return producer_->GetDefaultUsage();
179 }
180
SetUserData(const std::string & key,const std::string & val)181 GSError ConsumerSurface::SetUserData(const std::string &key, const std::string &val)
182 {
183 if (userData_.size() >= SURFACE_MAX_USER_DATA_COUNT) {
184 return GSERROR_OUT_OF_RANGE;
185 }
186 userData_[key] = val;
187 return GSERROR_OK;
188 }
189
GetUserData(const std::string & key)190 std::string ConsumerSurface::GetUserData(const std::string &key)
191 {
192 if (userData_.find(key) != userData_.end()) {
193 return userData_[key];
194 }
195
196 return "";
197 }
198
RegisterConsumerListener(sptr<IBufferConsumerListener> & listener)199 GSError ConsumerSurface::RegisterConsumerListener(sptr<IBufferConsumerListener>& listener)
200 {
201 return consumer_->RegisterConsumerListener(listener);
202 }
203
RegisterConsumerListener(IBufferConsumerListenerClazz * listener)204 GSError ConsumerSurface::RegisterConsumerListener(IBufferConsumerListenerClazz *listener)
205 {
206 return consumer_->RegisterConsumerListener(listener);
207 }
208
RegisterReleaseListener(OnReleaseFunc func)209 GSError ConsumerSurface::RegisterReleaseListener(OnReleaseFunc func)
210 {
211 return consumer_->RegisterReleaseListener(func);
212 }
213
RegisterDeleteBufferListener(OnDeleteBufferFunc func)214 GSError ConsumerSurface::RegisterDeleteBufferListener(OnDeleteBufferFunc func)
215 {
216 return consumer_->RegisterDeleteBufferListener(func);
217 }
218
UnregisterConsumerListener()219 GSError ConsumerSurface::UnregisterConsumerListener()
220 {
221 return consumer_->UnregisterConsumerListener();
222 }
223
CleanCache()224 GSError ConsumerSurface::CleanCache()
225 {
226 return GSERROR_NOT_SUPPORT;
227 }
228
GoBackground()229 GSError ConsumerSurface::GoBackground()
230 {
231 BLOGND("Queue Id:%{public}" PRIu64 "", producer_->GetUniqueId());
232 return consumer_->GoBackground();
233 }
234
GetUniqueId() const235 uint64_t ConsumerSurface::GetUniqueId() const
236 {
237 return producer_->GetUniqueId();
238 }
239
Dump(std::string & result) const240 void ConsumerSurface::Dump(std::string &result) const
241 {
242 return consumer_->Dump(result);
243 }
244
SetTransform(GraphicTransformType transform)245 GSError ConsumerSurface::SetTransform(GraphicTransformType transform)
246 {
247 return producer_->SetTransform(transform);
248 }
249
GetTransform() const250 GraphicTransformType ConsumerSurface::GetTransform() const
251 {
252 return consumer_->GetTransform();
253 }
254
IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> & infos,std::vector<bool> & supporteds)255 GSError ConsumerSurface::IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> &infos,
256 std::vector<bool> &supporteds)
257 {
258 return GSERROR_NOT_SUPPORT;
259 }
260
Disconnect()261 GSError ConsumerSurface::Disconnect()
262 {
263 return GSERROR_NOT_SUPPORT;
264 }
265
SetScalingMode(uint32_t sequence,ScalingMode scalingMode)266 GSError ConsumerSurface::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
267 {
268 if (scalingMode < ScalingMode::SCALING_MODE_FREEZE ||
269 scalingMode > ScalingMode::SCALING_MODE_NO_SCALE_CROP) {
270 return GSERROR_INVALID_ARGUMENTS;
271 }
272 return producer_->SetScalingMode(sequence, scalingMode);
273 }
274
GetScalingMode(uint32_t sequence,ScalingMode & scalingMode)275 GSError ConsumerSurface::GetScalingMode(uint32_t sequence, ScalingMode &scalingMode)
276 {
277 return consumer_->GetScalingMode(sequence, scalingMode);
278 }
279
SetMetaData(uint32_t sequence,const std::vector<GraphicHDRMetaData> & metaData)280 GSError ConsumerSurface::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData> &metaData)
281 {
282 if (metaData.size() == 0) {
283 return GSERROR_INVALID_ARGUMENTS;
284 }
285 return producer_->SetMetaData(sequence, metaData);
286 }
287
SetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)288 GSError ConsumerSurface::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
289 const std::vector<uint8_t> &metaData)
290 {
291 if (key < GraphicHDRMetadataKey::GRAPHIC_MATAKEY_RED_PRIMARY_X ||
292 key > GraphicHDRMetadataKey::GRAPHIC_MATAKEY_HDR_VIVID || metaData.size() == 0) {
293 return GSERROR_INVALID_ARGUMENTS;
294 }
295 return producer_->SetMetaDataSet(sequence, key, metaData);
296 }
297
QueryMetaDataType(uint32_t sequence,HDRMetaDataType & type) const298 GSError ConsumerSurface::QueryMetaDataType(uint32_t sequence, HDRMetaDataType &type) const
299 {
300 return consumer_->QueryMetaDataType(sequence, type);
301 }
302
GetMetaData(uint32_t sequence,std::vector<GraphicHDRMetaData> & metaData) const303 GSError ConsumerSurface::GetMetaData(uint32_t sequence, std::vector<GraphicHDRMetaData> &metaData) const
304 {
305 return consumer_->GetMetaData(sequence, metaData);
306 }
307
GetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey & key,std::vector<uint8_t> & metaData) const308 GSError ConsumerSurface::GetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey &key,
309 std::vector<uint8_t> &metaData) const
310 {
311 return consumer_->GetMetaDataSet(sequence, key, metaData);
312 }
313
SetTunnelHandle(const GraphicExtDataHandle * handle)314 GSError ConsumerSurface::SetTunnelHandle(const GraphicExtDataHandle *handle)
315 {
316 if (handle == nullptr || handle->reserveInts == 0) {
317 return GSERROR_INVALID_ARGUMENTS;
318 }
319 return producer_->SetTunnelHandle(handle);
320 }
321
GetTunnelHandle() const322 sptr<SurfaceTunnelHandle> ConsumerSurface::GetTunnelHandle() const
323 {
324 return consumer_->GetTunnelHandle();
325 }
326
SetPresentTimestamp(uint32_t sequence,const GraphicPresentTimestamp & timestamp)327 GSError ConsumerSurface::SetPresentTimestamp(uint32_t sequence, const GraphicPresentTimestamp ×tamp)
328 {
329 if (timestamp.type == GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_UNSUPPORTED) {
330 return GSERROR_INVALID_ARGUMENTS;
331 }
332 return consumer_->SetPresentTimestamp(sequence, timestamp);
333 }
334
GetPresentTimestamp(uint32_t sequence,GraphicPresentTimestampType type,int64_t & time) const335 GSError ConsumerSurface::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type,
336 int64_t &time) const
337 {
338 return GSERROR_NOT_SUPPORT;
339 }
340
GetDefaultFormat()341 int32_t ConsumerSurface::GetDefaultFormat()
342 {
343 BLOGND("ConsumerSurface::GetDefaultFormat not support.");
344 return 0;
345 }
346
SetDefaultFormat(int32_t format)347 GSError ConsumerSurface::SetDefaultFormat(int32_t format)
348 {
349 BLOGND("ConsumerSurface::SetDefaultFormat not support.");
350 return GSERROR_NOT_SUPPORT;
351 }
352
GetDefaultColorGamut()353 int32_t ConsumerSurface::GetDefaultColorGamut()
354 {
355 BLOGND("ConsumerSurface::GetDefaultColorGamut not support.");
356 return 0;
357 }
358
SetDefaultColorGamut(int32_t colorGamut)359 GSError ConsumerSurface::SetDefaultColorGamut(int32_t colorGamut)
360 {
361 BLOGND("ConsumerSurface::SetDefaultColorGamut not support.");
362 return GSERROR_NOT_SUPPORT;
363 }
364
GetNativeSurface()365 sptr<NativeSurface> ConsumerSurface::GetNativeSurface()
366 {
367 BLOGND("ConsumerSurface::GetNativeSurface not support.");
368 return nullptr;
369 }
370 } // namespace OHOS
371