132a6e48fSopenharmony_ci/* 232a6e48fSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 332a6e48fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 432a6e48fSopenharmony_ci * you may not use this file except in compliance with the License. 532a6e48fSopenharmony_ci * You may obtain a copy of the License at 632a6e48fSopenharmony_ci * 732a6e48fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 832a6e48fSopenharmony_ci * 932a6e48fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1032a6e48fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1132a6e48fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1232a6e48fSopenharmony_ci * See the License for the specific language governing permissions and 1332a6e48fSopenharmony_ci * limitations under the License. 1432a6e48fSopenharmony_ci */ 1532a6e48fSopenharmony_ci 1632a6e48fSopenharmony_ci#ifndef FRAMEWORKS_SURFACE_INCLUDE_BUFFER_QUEUE_H 1732a6e48fSopenharmony_ci#define FRAMEWORKS_SURFACE_INCLUDE_BUFFER_QUEUE_H 1832a6e48fSopenharmony_ci 1932a6e48fSopenharmony_ci#include <map> 2032a6e48fSopenharmony_ci#include <list> 2132a6e48fSopenharmony_ci#include <vector> 2232a6e48fSopenharmony_ci#include <mutex> 2332a6e48fSopenharmony_ci 2432a6e48fSopenharmony_ci#include <buffer_producer_listener.h> 2532a6e48fSopenharmony_ci#include <ibuffer_consumer_listener.h> 2632a6e48fSopenharmony_ci#include <ibuffer_producer.h> 2732a6e48fSopenharmony_ci#include "iconsumer_surface.h" 2832a6e48fSopenharmony_ci#include "surface_type.h" 2932a6e48fSopenharmony_ci#include <surface_tunnel_handle.h> 3032a6e48fSopenharmony_ci#include "surface_buffer.h" 3132a6e48fSopenharmony_ci#include "consumer_surface_delegator.h" 3232a6e48fSopenharmony_ci 3332a6e48fSopenharmony_cinamespace OHOS { 3432a6e48fSopenharmony_cienum BufferState { 3532a6e48fSopenharmony_ci BUFFER_STATE_RELEASED, 3632a6e48fSopenharmony_ci BUFFER_STATE_REQUESTED, 3732a6e48fSopenharmony_ci BUFFER_STATE_FLUSHED, 3832a6e48fSopenharmony_ci BUFFER_STATE_ACQUIRED, 3932a6e48fSopenharmony_ci BUFFER_STATE_ATTACHED, 4032a6e48fSopenharmony_ci}; 4132a6e48fSopenharmony_ci 4232a6e48fSopenharmony_cienum InvokerType { 4332a6e48fSopenharmony_ci PRODUCER_INVOKER, 4432a6e48fSopenharmony_ci CONSUMER_INVOKER, 4532a6e48fSopenharmony_ci}; 4632a6e48fSopenharmony_ci 4732a6e48fSopenharmony_ciusing BufferElement = struct BufferElement { 4832a6e48fSopenharmony_ci sptr<SurfaceBuffer> buffer; 4932a6e48fSopenharmony_ci BufferState state; 5032a6e48fSopenharmony_ci bool isDeleting; 5132a6e48fSopenharmony_ci 5232a6e48fSopenharmony_ci BufferRequestConfig config; 5332a6e48fSopenharmony_ci sptr<SyncFence> fence; 5432a6e48fSopenharmony_ci int64_t timestamp; 5532a6e48fSopenharmony_ci std::vector<Rect> damages; 5632a6e48fSopenharmony_ci ScalingMode scalingMode; 5732a6e48fSopenharmony_ci HDRMetaDataType hdrMetaDataType = HDRMetaDataType::HDR_NOT_USED; 5832a6e48fSopenharmony_ci std::vector<GraphicHDRMetaData> metaData; 5932a6e48fSopenharmony_ci GraphicHDRMetadataKey key; 6032a6e48fSopenharmony_ci std::vector<uint8_t> metaDataSet; 6132a6e48fSopenharmony_ci GraphicPresentTimestamp presentTimestamp = {GRAPHIC_DISPLAY_PTS_UNSUPPORTED, 0}; 6232a6e48fSopenharmony_ci /** 6332a6e48fSopenharmony_ci * The desired time to present the buffer in nanoseconds. 6432a6e48fSopenharmony_ci * The buffer should wait until desiredPresentTimestamp is reached before being consumed and displayed. 6532a6e48fSopenharmony_ci * If multiple buffers reach desiredPresentTimestamp, the earlier buffer should be dropped. 6632a6e48fSopenharmony_ci */ 6732a6e48fSopenharmony_ci int64_t desiredPresentTimestamp; 6832a6e48fSopenharmony_ci /** 6932a6e48fSopenharmony_ci * The desiredPresentTimestamp is automatically generated by the system, isAutoTimestamp is true. 7032a6e48fSopenharmony_ci * The desiredPresentTimestamp is manually set by the producer, isAutoTimestamp is false. 7132a6e48fSopenharmony_ci */ 7232a6e48fSopenharmony_ci bool isAutoTimestamp; 7332a6e48fSopenharmony_ci}; 7432a6e48fSopenharmony_ci 7532a6e48fSopenharmony_ciclass BufferQueue : public RefBase { 7632a6e48fSopenharmony_cipublic: 7732a6e48fSopenharmony_ci BufferQueue(const std::string &name, bool isShared = false); 7832a6e48fSopenharmony_ci virtual ~BufferQueue(); 7932a6e48fSopenharmony_ci 8032a6e48fSopenharmony_ci GSError GetProducerInitInfo(ProducerInitInfo &info); 8132a6e48fSopenharmony_ci 8232a6e48fSopenharmony_ci GSError RequestBuffer(const BufferRequestConfig &config, sptr<BufferExtraData> &bedata, 8332a6e48fSopenharmony_ci struct IBufferProducer::RequestBufferReturnValue &retval); 8432a6e48fSopenharmony_ci 8532a6e48fSopenharmony_ci GSError ReuseBuffer(const BufferRequestConfig &config, sptr<BufferExtraData> &bedata, 8632a6e48fSopenharmony_ci struct IBufferProducer::RequestBufferReturnValue &retval); 8732a6e48fSopenharmony_ci 8832a6e48fSopenharmony_ci GSError CancelBuffer(uint32_t sequence, sptr<BufferExtraData> bedata); 8932a6e48fSopenharmony_ci 9032a6e48fSopenharmony_ci GSError FlushBuffer(uint32_t sequence, sptr<BufferExtraData> bedata, 9132a6e48fSopenharmony_ci sptr<SyncFence> fence, const BufferFlushConfigWithDamages &config); 9232a6e48fSopenharmony_ci 9332a6e48fSopenharmony_ci GSError DoFlushBuffer(uint32_t sequence, sptr<BufferExtraData> bedata, 9432a6e48fSopenharmony_ci sptr<SyncFence> fence, const BufferFlushConfigWithDamages &config); 9532a6e48fSopenharmony_ci 9632a6e48fSopenharmony_ci GSError GetLastFlushedBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence, 9732a6e48fSopenharmony_ci float matrix[16], uint32_t matrixSize, bool isUseNewMatrix, bool needRecordSequence = false); 9832a6e48fSopenharmony_ci 9932a6e48fSopenharmony_ci GSError AcquireBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence, 10032a6e48fSopenharmony_ci int64_t ×tamp, std::vector<Rect> &damages); 10132a6e48fSopenharmony_ci GSError AcquireBuffer(IConsumerSurface::AcquireBufferReturnValue &returnValue, int64_t expectPresentTimestamp, 10232a6e48fSopenharmony_ci bool isUsingAutoTimestamp); 10332a6e48fSopenharmony_ci GSError ReleaseBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence); 10432a6e48fSopenharmony_ci 10532a6e48fSopenharmony_ci GSError AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut); 10632a6e48fSopenharmony_ci 10732a6e48fSopenharmony_ci GSError DetachBuffer(sptr<SurfaceBuffer>& buffer); 10832a6e48fSopenharmony_ci 10932a6e48fSopenharmony_ci GSError RegisterSurfaceDelegator(sptr<IRemoteObject> client, sptr<Surface> cSurface); 11032a6e48fSopenharmony_ci 11132a6e48fSopenharmony_ci bool QueryIfBufferAvailable(); 11232a6e48fSopenharmony_ci 11332a6e48fSopenharmony_ci uint32_t GetQueueSize(); 11432a6e48fSopenharmony_ci GSError SetQueueSize(uint32_t queueSize); 11532a6e48fSopenharmony_ci 11632a6e48fSopenharmony_ci GSError GetName(std::string &name); 11732a6e48fSopenharmony_ci 11832a6e48fSopenharmony_ci GSError RegisterConsumerListener(sptr<IBufferConsumerListener>& listener); 11932a6e48fSopenharmony_ci GSError RegisterConsumerListener(IBufferConsumerListenerClazz *listener); 12032a6e48fSopenharmony_ci GSError RegisterReleaseListener(OnReleaseFunc func); 12132a6e48fSopenharmony_ci GSError RegisterProducerReleaseListener(sptr<IProducerListener> listener); 12232a6e48fSopenharmony_ci GSError UnRegisterProducerReleaseListener(); 12332a6e48fSopenharmony_ci GSError RegisterDeleteBufferListener(OnDeleteBufferFunc func, bool isForUniRedraw = false); 12432a6e48fSopenharmony_ci GSError UnregisterConsumerListener(); 12532a6e48fSopenharmony_ci 12632a6e48fSopenharmony_ci GSError SetDefaultWidthAndHeight(int32_t width, int32_t height); 12732a6e48fSopenharmony_ci int32_t GetDefaultWidth(); 12832a6e48fSopenharmony_ci int32_t GetDefaultHeight(); 12932a6e48fSopenharmony_ci GSError SetDefaultUsage(uint64_t usage); 13032a6e48fSopenharmony_ci uint64_t GetDefaultUsage(); 13132a6e48fSopenharmony_ci 13232a6e48fSopenharmony_ci GSError CleanCache(bool cleanAll); 13332a6e48fSopenharmony_ci GSError GoBackground(); 13432a6e48fSopenharmony_ci GSError OnConsumerDied(); 13532a6e48fSopenharmony_ci 13632a6e48fSopenharmony_ci uint64_t GetUniqueId() const; 13732a6e48fSopenharmony_ci 13832a6e48fSopenharmony_ci void Dump(std::string &result); 13932a6e48fSopenharmony_ci 14032a6e48fSopenharmony_ci GSError SetTransform(GraphicTransformType transform); 14132a6e48fSopenharmony_ci GraphicTransformType GetTransform() const; 14232a6e48fSopenharmony_ci 14332a6e48fSopenharmony_ci GSError IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> &infos, 14432a6e48fSopenharmony_ci std::vector<bool> &supporteds) const; 14532a6e48fSopenharmony_ci 14632a6e48fSopenharmony_ci GSError SetBufferHold(bool hold); 14732a6e48fSopenharmony_ci inline bool IsBufferHold() 14832a6e48fSopenharmony_ci { 14932a6e48fSopenharmony_ci return isBufferHold_; 15032a6e48fSopenharmony_ci } 15132a6e48fSopenharmony_ci GSError SetScalingMode(uint32_t sequence, ScalingMode scalingMode); 15232a6e48fSopenharmony_ci GSError GetScalingMode(uint32_t sequence, ScalingMode &scalingMode); 15332a6e48fSopenharmony_ci GSError SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData> &metaData); 15432a6e48fSopenharmony_ci GSError SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key, 15532a6e48fSopenharmony_ci const std::vector<uint8_t> &metaData); 15632a6e48fSopenharmony_ci GSError QueryMetaDataType(uint32_t sequence, HDRMetaDataType &type); 15732a6e48fSopenharmony_ci GSError GetMetaData(uint32_t sequence, std::vector<GraphicHDRMetaData> &metaData); 15832a6e48fSopenharmony_ci GSError GetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey &key, 15932a6e48fSopenharmony_ci std::vector<uint8_t> &metaData); 16032a6e48fSopenharmony_ci GSError SetTunnelHandle(const sptr<SurfaceTunnelHandle> &handle); 16132a6e48fSopenharmony_ci sptr<SurfaceTunnelHandle> GetTunnelHandle(); 16232a6e48fSopenharmony_ci GSError SetPresentTimestamp(uint32_t sequence, const GraphicPresentTimestamp ×tamp); 16332a6e48fSopenharmony_ci GSError GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type, int64_t &time); 16432a6e48fSopenharmony_ci 16532a6e48fSopenharmony_ci bool GetStatus() const; 16632a6e48fSopenharmony_ci void SetStatus(bool status); 16732a6e48fSopenharmony_ci 16832a6e48fSopenharmony_ci void SetBatchHandle(bool batch); 16932a6e48fSopenharmony_ci 17032a6e48fSopenharmony_ci GSError SetProducerCacheCleanFlag(bool flag); 17132a6e48fSopenharmony_ci inline void ConsumerRequestCpuAccess(bool on) 17232a6e48fSopenharmony_ci { 17332a6e48fSopenharmony_ci isCpuAccessable_ = on; 17432a6e48fSopenharmony_ci } 17532a6e48fSopenharmony_ci 17632a6e48fSopenharmony_ci GSError AttachBufferToQueue(sptr<SurfaceBuffer> buffer, InvokerType invokerType); 17732a6e48fSopenharmony_ci GSError DetachBufferFromQueue(sptr<SurfaceBuffer> buffer, InvokerType invokerType); 17832a6e48fSopenharmony_ci 17932a6e48fSopenharmony_ci GSError SetTransformHint(GraphicTransformType transformHint); 18032a6e48fSopenharmony_ci GraphicTransformType GetTransformHint() const; 18132a6e48fSopenharmony_ci GSError SetScalingMode(ScalingMode scalingMode); 18232a6e48fSopenharmony_ci 18332a6e48fSopenharmony_ci GSError SetSurfaceSourceType(OHSurfaceSource sourceType); 18432a6e48fSopenharmony_ci OHSurfaceSource GetSurfaceSourceType() const; 18532a6e48fSopenharmony_ci 18632a6e48fSopenharmony_ci GSError SetSurfaceAppFrameworkType(std::string appFrameworkType); 18732a6e48fSopenharmony_ci std::string GetSurfaceAppFrameworkType() const; 18832a6e48fSopenharmony_ci 18932a6e48fSopenharmony_ci GSError SetHdrWhitePointBrightness(float brightness); 19032a6e48fSopenharmony_ci GSError SetSdrWhitePointBrightness(float brightness); 19132a6e48fSopenharmony_ci float GetHdrWhitePointBrightness() const; 19232a6e48fSopenharmony_ci float GetSdrWhitePointBrightness() const; 19332a6e48fSopenharmony_ci 19432a6e48fSopenharmony_ci GSError IsSurfaceBufferInCache(uint32_t seqNum, bool &isInCache); 19532a6e48fSopenharmony_ci 19632a6e48fSopenharmony_ci GSError AcquireLastFlushedBuffer(sptr<SurfaceBuffer> &buffer, sptr<SyncFence> &fence, 19732a6e48fSopenharmony_ci float matrix[16], uint32_t matrixSize, bool isUseNewMatrix); 19832a6e48fSopenharmony_ci GSError ReleaseLastFlushedBuffer(uint32_t sequence); 19932a6e48fSopenharmony_ci GSError SetGlobalAlpha(int32_t alpha); 20032a6e48fSopenharmony_ci GSError GetGlobalAlpha(int32_t &alpha); 20132a6e48fSopenharmony_ci uint32_t GetAvailableBufferCount(); 20232a6e48fSopenharmony_ci 20332a6e48fSopenharmony_ciprivate: 20432a6e48fSopenharmony_ci GSError AllocBuffer(sptr<SurfaceBuffer>& buffer, const BufferRequestConfig &config); 20532a6e48fSopenharmony_ci void DeleteBufferInCache(uint32_t sequence); 20632a6e48fSopenharmony_ci 20732a6e48fSopenharmony_ci uint32_t GetUsedSize(); 20832a6e48fSopenharmony_ci void DeleteBuffersLocked(int32_t count); 20932a6e48fSopenharmony_ci 21032a6e48fSopenharmony_ci GSError PopFromFreeListLocked(sptr<SurfaceBuffer>& buffer, const BufferRequestConfig &config); 21132a6e48fSopenharmony_ci GSError PopFromDirtyListLocked(sptr<SurfaceBuffer>& buffer); 21232a6e48fSopenharmony_ci 21332a6e48fSopenharmony_ci GSError CheckRequestConfig(const BufferRequestConfig &config); 21432a6e48fSopenharmony_ci GSError CheckFlushConfig(const BufferFlushConfigWithDamages &config); 21532a6e48fSopenharmony_ci void DumpCache(std::string &result); 21632a6e48fSopenharmony_ci void DumpMetadata(std::string &result, BufferElement element); 21732a6e48fSopenharmony_ci void ClearLocked(); 21832a6e48fSopenharmony_ci bool CheckProducerCacheListLocked(); 21932a6e48fSopenharmony_ci GSError SetProducerCacheCleanFlagLocked(bool flag); 22032a6e48fSopenharmony_ci GSError AttachBufferUpdateStatus(std::unique_lock<std::mutex> &lock, uint32_t sequence, int32_t timeOut); 22132a6e48fSopenharmony_ci void AttachBufferUpdateBufferInfo(sptr<SurfaceBuffer>& buffer); 22232a6e48fSopenharmony_ci void ListenerBufferReleasedCb(sptr<SurfaceBuffer> &buffer, const sptr<SyncFence> &fence); 22332a6e48fSopenharmony_ci void OnBufferDeleteCbForHardwareThreadLocked(const sptr<SurfaceBuffer> &buffer) const; 22432a6e48fSopenharmony_ci GSError CheckBufferQueueCache(uint32_t sequence); 22532a6e48fSopenharmony_ci GSError ReallocBufferLocked(const BufferRequestConfig &config, 22632a6e48fSopenharmony_ci struct IBufferProducer::RequestBufferReturnValue &retval); 22732a6e48fSopenharmony_ci void SetSurfaceBufferHebcMetaLocked(sptr<SurfaceBuffer> buffer); 22832a6e48fSopenharmony_ci GSError RequestBufferCheckStatus(); 22932a6e48fSopenharmony_ci GSError DelegatorQueueBuffer(uint32_t sequence, sptr<SyncFence> fence); 23032a6e48fSopenharmony_ci bool WaitForCondition(); 23132a6e48fSopenharmony_ci void RequestBufferDebugInfoLocked(); 23232a6e48fSopenharmony_ci bool GetStatusLocked() const; 23332a6e48fSopenharmony_ci void CallConsumerListener(); 23432a6e48fSopenharmony_ci void SetSurfaceBufferGlobalAlphaUnlocked(sptr<SurfaceBuffer> buffer); 23532a6e48fSopenharmony_ci bool IsPresentTimestampReady(int64_t desiredPresentTimestamp, int64_t expectPresentTimestamp); 23632a6e48fSopenharmony_ci void LogAndTraceAllBufferInBufferQueueCache(); 23732a6e48fSopenharmony_ci void SetDesiredPresentTimestampAndUiTimestamp(uint32_t sequence, int64_t desiredPresentTimestamp, 23832a6e48fSopenharmony_ci uint64_t uiTimestamp); 23932a6e48fSopenharmony_ci int32_t defaultWidth_ = 0; 24032a6e48fSopenharmony_ci int32_t defaultHeight_ = 0; 24132a6e48fSopenharmony_ci uint64_t defaultUsage_ = 0; 24232a6e48fSopenharmony_ci uint32_t bufferQueueSize_ = SURFACE_DEFAULT_QUEUE_SIZE; 24332a6e48fSopenharmony_ci ScalingMode scalingMode_ = ScalingMode::SCALING_MODE_SCALE_TO_WINDOW; 24432a6e48fSopenharmony_ci GraphicTransformType transform_ = GraphicTransformType::GRAPHIC_ROTATE_NONE; 24532a6e48fSopenharmony_ci GraphicTransformType lastFlushedTransform_ = GraphicTransformType::GRAPHIC_ROTATE_NONE; 24632a6e48fSopenharmony_ci std::string name_; 24732a6e48fSopenharmony_ci std::list<uint32_t> freeList_; 24832a6e48fSopenharmony_ci std::list<uint32_t> dirtyList_; 24932a6e48fSopenharmony_ci std::list<uint32_t> deletingList_; 25032a6e48fSopenharmony_ci std::list<uint32_t> producerCacheList_; 25132a6e48fSopenharmony_ci std::map<uint32_t, BufferElement> bufferQueueCache_; 25232a6e48fSopenharmony_ci sptr<IBufferConsumerListener> listener_ = nullptr; 25332a6e48fSopenharmony_ci IBufferConsumerListenerClazz *listenerClazz_ = nullptr; 25432a6e48fSopenharmony_ci mutable std::mutex mutex_; 25532a6e48fSopenharmony_ci std::mutex listenerMutex_; 25632a6e48fSopenharmony_ci std::mutex producerListenerMutex_; 25732a6e48fSopenharmony_ci const uint64_t uniqueId_; 25832a6e48fSopenharmony_ci OnReleaseFunc onBufferRelease_ = nullptr; 25932a6e48fSopenharmony_ci std::mutex onBufferReleaseMutex_; 26032a6e48fSopenharmony_ci sptr<IProducerListener> producerListener_ = nullptr; 26132a6e48fSopenharmony_ci OnDeleteBufferFunc onBufferDeleteForRSMainThread_; 26232a6e48fSopenharmony_ci OnDeleteBufferFunc onBufferDeleteForRSHardwareThread_; 26332a6e48fSopenharmony_ci bool isShared_ = false; 26432a6e48fSopenharmony_ci std::condition_variable waitReqCon_; 26532a6e48fSopenharmony_ci std::condition_variable waitAttachCon_; 26632a6e48fSopenharmony_ci sptr<SurfaceTunnelHandle> tunnelHandle_ = nullptr; 26732a6e48fSopenharmony_ci bool isValidStatus_ = true; 26832a6e48fSopenharmony_ci bool producerCacheClean_ = false; 26932a6e48fSopenharmony_ci const bool isLocalRender_; 27032a6e48fSopenharmony_ci uint32_t lastFlusedSequence_ = 0; 27132a6e48fSopenharmony_ci sptr<SyncFence> lastFlusedFence_; 27232a6e48fSopenharmony_ci wptr<ConsumerSurfaceDelegator> wpCSurfaceDelegator_; 27332a6e48fSopenharmony_ci bool isCpuAccessable_ = false; 27432a6e48fSopenharmony_ci GraphicTransformType transformHint_ = GraphicTransformType::GRAPHIC_ROTATE_NONE; 27532a6e48fSopenharmony_ci bool isBufferHold_ = false; 27632a6e48fSopenharmony_ci bool isBatch_ = false; 27732a6e48fSopenharmony_ci OHSurfaceSource sourceType_ = OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT; 27832a6e48fSopenharmony_ci std::string appFrameworkType_ = ""; 27932a6e48fSopenharmony_ci float hdrWhitePointBrightness_ = 0.0; 28032a6e48fSopenharmony_ci float sdrWhitePointBrightness_ = 0.0; 28132a6e48fSopenharmony_ci uint32_t acquireLastFlushedBufSequence_; 28232a6e48fSopenharmony_ci int32_t globalAlpha_ = -1; 28332a6e48fSopenharmony_ci std::mutex globalAlphaMutex_; 28432a6e48fSopenharmony_ci std::string requestBufferStateStr_; 28532a6e48fSopenharmony_ci std::string acquireBufferStateStr_; 28632a6e48fSopenharmony_ci}; 28732a6e48fSopenharmony_ci}; // namespace OHOS 28832a6e48fSopenharmony_ci 28932a6e48fSopenharmony_ci#endif // FRAMEWORKS_SURFACE_INCLUDE_BUFFER_QUEUE_H 290