1 /* 2 * Copyright (c) 2025 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 #ifndef VIDEO_PROCESSING_ALGORITHM_BASE_H 17 #define VIDEO_PROCESSING_ALGORITHM_BASE_H 18 19 #include <atomic> 20 #include <functional> 21 #include <mutex> 22 #include <string> 23 24 #include "algorithm_errors.h" 25 #include "ivideo_processing_algorithm.h" 26 #include "vpe_log.h" 27 28 namespace OHOS { 29 namespace Media { 30 namespace VideoProcessingEngine { 31 class VideoProcessingAlgorithmBase : public IVideoProcessingAlgorithm { 32 public: 33 int Initialize() final; 34 int Deinitialize() final; 35 bool HasClient() const final; 36 int Add(const std::string& clientName, uint32_t& clientID) final; 37 int Del(uint32_t clientID) final; 38 int UpdateMetadata(uint32_t clientID, SurfaceBufferInfo& image) final; 39 int Process(uint32_t clientID, const SurfaceBufferInfo& input, SurfaceBufferInfo& output) final; 40 int ComposeImage(uint32_t clientID, const SurfaceBufferInfo& inputSdrImage, 41 const SurfaceBufferInfo& inputGainmap, SurfaceBufferInfo& outputHdrImage, bool legacy) final; 42 int DecomposeImage(uint32_t clientID, const SurfaceBufferInfo& inputImage, 43 SurfaceBufferInfo& outputSdrImage, SurfaceBufferInfo& outputGainmap) final; 44 45 protected: VideoProcessingAlgorithmBase(const std::string & feature,uint32_t id)46 VideoProcessingAlgorithmBase(const std::string& feature, uint32_t id) : feature_(feature), featureID_(id) {} 47 virtual ~VideoProcessingAlgorithmBase() = default; 48 VideoProcessingAlgorithmBase(const VideoProcessingAlgorithmBase&) = delete; 49 VideoProcessingAlgorithmBase& operator=(const VideoProcessingAlgorithmBase&) = delete; 50 VideoProcessingAlgorithmBase(VideoProcessingAlgorithmBase&&) = delete; 51 VideoProcessingAlgorithmBase& operator=(VideoProcessingAlgorithmBase&&) = delete; 52 53 // Note: called by algorithm derived classes IsValid(const SurfaceBufferInfo & info)54 virtual inline bool IsValid(const SurfaceBufferInfo& info) const // Derived classes can modify the checker if needed 55 { 56 return info.surfacebuffer != nullptr; 57 } 58 59 template <typename T> CallSetParameter(std::function<int (const T &)> && setter,const std::vector<uint8_t> & parameter,const LogInfo & logInfo)60 static inline int CallSetParameter(std::function<int(const T&)>&& setter, const std::vector<uint8_t>& parameter, 61 const LogInfo& logInfo) 62 { 63 if (parameter.size() != sizeof(T)) [[unlikely]] { 64 VPE_ORG_LOGE(logInfo, "Invalid input: size=%{public}zu(Expected:%{public}zu)!", 65 parameter.size(), sizeof(T)); 66 return VPE_ALGO_ERR_INVALID_VAL; 67 } 68 return setter(*reinterpret_cast<const T*>(parameter.data())); 69 } 70 71 template <typename T> CallGetParameter(std::function<int (T &)> && getter,std::vector<uint8_t> & parameter)72 static inline int CallGetParameter(std::function<int(T&)>&& getter, std::vector<uint8_t>& parameter) 73 { 74 parameter.resize(sizeof(T)); 75 return getter(*reinterpret_cast<T*>(parameter.data())); 76 } 77 78 // Note: implement by algorithm derived classes 79 virtual int OnInitializeLocked(); 80 virtual int OnDeinitializeLocked(); 81 82 virtual int AddClientIDLocked(const std::string& clientName, uint32_t& clientID); 83 virtual int DelClientIDLocked(uint32_t clientID, bool& isEmpty); 84 virtual size_t GetClientSizeLocked() const; 85 virtual void ClearClientsLocked(); 86 87 virtual int DoUpdateMetadata(uint32_t clientID, SurfaceBufferInfo& image); 88 virtual int DoProcess(uint32_t clientID, const SurfaceBufferInfo& input, SurfaceBufferInfo& output); 89 virtual int DoComposeImage(uint32_t clientID, const SurfaceBufferInfo& inputSdrImage, 90 const SurfaceBufferInfo& inputGainmap, SurfaceBufferInfo& outputHdrImage, bool legacy); 91 virtual int DoDecomposeImage(uint32_t clientID, const SurfaceBufferInfo& inputImage, 92 SurfaceBufferInfo& outputSdrImage, SurfaceBufferInfo& outputGainmap); 93 94 int ReturnNotSupport(const LogInfo& logInfo) const; 95 bool GenerateClientID(std::function<bool(uint32_t)>&& isDuplicate, uint32_t& clientID); 96 97 // Note: Data members to be accessed by algorithm derived classes 98 const std::string feature_{}; 99 uint32_t featureID_{}; 100 mutable std::mutex lock_{}; 101 // Guarded by lock_ begin 102 bool isInitialized_{}; 103 // Guarded by lock_ end 104 105 private: 106 uint32_t GenerateClientID(); 107 108 // Guarded by lock_ begin 109 std::atomic<bool> hasClient_{}; 110 uint32_t clientIdBase_{}; 111 // Guarded by lock_ end 112 }; 113 } // namespace VideoProcessingEngine 114 } // namespace Media 115 } // namespace OHOS 116 117 #endif // VIDEO_PROCESSING_ALGORITHM_BASE_H 118