• 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 "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 &timestamp, 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 &timestamp, 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 &timestamp)
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