/* * Copyright (c) 2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FRAMEWORKS_SURFACE_INCLUDE_PRODUCER_SURFACE_H #define FRAMEWORKS_SURFACE_INCLUDE_PRODUCER_SURFACE_H #include #include #include #include #include #include #include "buffer_queue.h" #include "buffer_queue_consumer.h" #include "surface_buffer.h" #include "producer_surface_delegator.h" struct NativeWindow; namespace OHOS { class ProducerSurface : public Surface { public: ProducerSurface(sptr& producer); virtual ~ProducerSurface(); // thread unsafe GSError Init(); bool IsConsumer() const override; sptr GetProducer() const override; GSError RequestBuffer(sptr& buffer, int32_t &fence, BufferRequestConfig &config) override; GSError RequestBuffers(std::vector> &buffers, std::vector> &fences, BufferRequestConfig &config) override; GSError CancelBuffer(sptr& buffer) override; GSError FlushBuffer(sptr& buffer, int32_t fence, BufferFlushConfig &config) override; GSError FlushBuffers(const std::vector> &buffers, const std::vector> &fences, const std::vector &config) override; GSError AcquireBuffer(sptr& buffer, int32_t &fence, int64_t ×tamp, Rect &damage) override; GSError ReleaseBuffer(sptr& buffer, int32_t fence) override; GSError RequestBuffer(sptr& buffer, sptr& fence, BufferRequestConfig &config) override; GSError FlushBuffer(sptr& buffer, const sptr& fence, BufferFlushConfig &config) override; GSError GetLastFlushedBuffer(sptr& buffer, sptr& fence, float matrix[16], bool isUseNewMatrix = false) override; GSError FlushBuffer(sptr& buffer, const sptr& fence, BufferFlushConfigWithDamages &config) override; GSError AcquireBuffer(sptr& buffer, sptr& fence, int64_t ×tamp, Rect &damage) override; GSError ReleaseBuffer(sptr& buffer, const sptr& fence) override; GSError AttachBuffer(sptr& buffer) override; GSError AttachBuffer(sptr& buffer, int32_t timeOut) override; GSError DetachBuffer(sptr& buffer) override; bool QueryIfBufferAvailable() override; uint32_t GetQueueSize() override; GSError SetQueueSize(uint32_t queueSize) override; const std::string& GetName() override; uint64_t GetUniqueId() const override; GSError SetDefaultWidthAndHeight(int32_t width, int32_t height) override; int32_t GetDefaultWidth() override; int32_t GetDefaultHeight() override; GSError SetDefaultUsage(uint64_t usage) override; uint64_t GetDefaultUsage() override; void SetBufferHold(bool hold) override; GSError SetUserData(const std::string &key, const std::string &val) override; std::string GetUserData(const std::string &key) override; GSError RegisterConsumerListener(sptr& listener) override; GSError RegisterConsumerListener(IBufferConsumerListenerClazz *listener) override; GSError RegisterReleaseListener(OnReleaseFunc func) override; GSError RegisterReleaseListener(OnReleaseFuncWithFence func) override; GSError UnRegisterReleaseListener() override; GSError RegisterDeleteBufferListener(OnDeleteBufferFunc func, bool isForUniRedraw = false) override; GSError UnregisterConsumerListener() override; void Dump(std::string &result) const override {}; // Call carefully. This interface will empty all caches of the current process GSError CleanCache(bool cleanAll = false) override; GSError GoBackground() override; GSError SetTransform(GraphicTransformType transform) override; GraphicTransformType GetTransform() const override; GSError IsSupportedAlloc(const std::vector &infos, std::vector &supporteds) override; GSError Connect() override; GSError Disconnect() override; GSError SetScalingMode(uint32_t sequence, ScalingMode scalingMode) override; GSError GetScalingMode(uint32_t sequence, ScalingMode &scalingMode) override; GSError SetMetaData(uint32_t sequence, const std::vector &metaData) override; GSError SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key, const std::vector &metaData) override; GSError QueryMetaDataType(uint32_t sequence, HDRMetaDataType &type) const override; GSError GetMetaData(uint32_t sequence, std::vector &metaData) const override; GSError GetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey &key, std::vector &metaData) const override; GSError SetTunnelHandle(const GraphicExtDataHandle *handle) override; sptr GetTunnelHandle() const override; GSError SetPresentTimestamp(uint32_t sequence, const GraphicPresentTimestamp ×tamp) override; GSError GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type, int64_t &time) const override; int32_t GetDefaultFormat() override; GSError SetDefaultFormat(int32_t format) override; int32_t GetDefaultColorGamut() override; GSError SetDefaultColorGamut(int32_t colorGamut) override; sptr GetNativeSurface() override; GSError SetWptrNativeWindowToPSurface(void* nativeWindow) override; virtual GSError RegisterSurfaceDelegator(sptr client) override; GSError RegisterUserDataChangeListener(const std::string &funcName, OnUserDataChangeFunc func) override; GSError UnRegisterUserDataChangeListener(const std::string &funcName) override; GSError ClearUserDataChangeListener() override; GSError AttachBufferToQueue(sptr buffer) override; GSError DetachBufferFromQueue(sptr buffer) override; GraphicTransformType GetTransformHint() const override; GSError SetTransformHint(GraphicTransformType transformHint) override; GSError GetProducerInitInfo(ProducerInitInfo &info) override; void SetRequestWidthAndHeight(int32_t width, int32_t height) override; int32_t GetRequestWidth() override; int32_t GetRequestHeight() override; BufferRequestConfig* GetWindowConfig() override; GSError SetScalingMode(ScalingMode scalingMode) override; GSError SetSurfaceSourceType(OHSurfaceSource sourceType) override; OHSurfaceSource GetSurfaceSourceType() const override; GSError SetSurfaceAppFrameworkType(std::string appFrameworkType) override; std::string GetSurfaceAppFrameworkType() const override; GSError SetHdrWhitePointBrightness(float brightness) override; GSError SetSdrWhitePointBrightness(float brightness) override; GSError AcquireLastFlushedBuffer(sptr &buffer, sptr &fence, float matrix[16], uint32_t matrixSize, bool isUseNewMatrix) override; GSError ReleaseLastFlushedBuffer(sptr buffer) override; GSError RequestAndDetachBuffer(sptr& buffer, sptr& fence, BufferRequestConfig& config) override; GSError AttachAndFlushBuffer(sptr& buffer, const sptr& fence, BufferFlushConfig& config, bool needMap) override; private: bool IsRemote(); void CleanAllLocked(); GSError AddCacheLocked(sptr &bedataimpl, IBufferProducer::RequestBufferReturnValue &retval, BufferRequestConfig &config); GSError SetMetadataValue(sptr& buffer); GSError CleanCacheLocked(bool cleanAll); void SetBufferConfigLocked(sptr& bedataimpl, IBufferProducer::RequestBufferReturnValue& retval, BufferRequestConfig& config); void DeleteCacheBufferLocked(sptr& bedataimpl, IBufferProducer::RequestBufferReturnValue& retval, BufferRequestConfig& config); GSError UpdateCacheLocked(sptr& bedataimpl, IBufferProducer::RequestBufferReturnValue& retval, BufferRequestConfig& config); mutable std::mutex mutex_; std::atomic_bool inited_ = false; std::map> bufferProducerCache_; std::map userData_; sptr producer_ = nullptr; std::string name_ = "not init"; uint64_t queueId_ = 0; bool isDisconnected_ = true; sptr listener_; std::mutex listenerMutex_; wptr wpNativeWindow_ = nullptr; wptr wpPSurfaceDelegator_ = nullptr; std::mutex delegatorMutex_; std::map onUserDataChange_; std::mutex lockMutex_; int32_t requestWidth_ = 0; int32_t requestHeight_ = 0; GraphicTransformType lastSetTransformHint_ = GraphicTransformType::GRAPHIC_ROTATE_NONE; BufferRequestConfig windowConfig_ = {0}; ProducerInitInfo initInfo_ = {0}; }; } // namespace OHOS #endif // FRAMEWORKS_SURFACE_INCLUDE_PRODUCER_SURFACE_H