1 /* 2 * Copyright (c) 2023 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 FRAMEWORK_ALGORITHM_EXTENSION_MANAGER_EXTENSION_MANAGER_H 17 #define FRAMEWORK_ALGORITHM_EXTENSION_MANAGER_EXTENSION_MANAGER_H 18 19 #include <atomic> 20 #include <map> 21 #include <memory> 22 #include <mutex> 23 #include <optional> 24 #include <set> 25 #include <tuple> 26 #include <unordered_set> 27 #include <variant> 28 #include <vector> 29 30 #include "aihdr_enhancer.h" 31 #include "aihdr_enhancer_extension.h" 32 #include "static_extension_list.h" 33 #include "extension_base.h" 34 #include "frame_info.h" 35 #include "colorspace_converter.h" 36 #include "metadata_generator.h" 37 #include "detail_enhancer_image.h" 38 #include "video_refreshrate_prediction.h" 39 #include "colorspace_converter_capability.h" 40 #include "colorspace_converter_display_capability.h" 41 #include "metadata_generator_capability.h" 42 #include "colorspace_converter_extension.h" 43 #include "colorspace_converter_display_extension.h" 44 #include "metadata_generator_extension.h" 45 #include "detail_enhancer_extension.h" 46 #include "contrast_enhancer_extension.h" 47 #include "video_refreshrate_prediction_extension.h" 48 #include "utils.h" 49 50 namespace OHOS { 51 namespace Media { 52 namespace VideoProcessingEngine { 53 namespace Extension { 54 namespace { 55 /* 56 { 57 (inputColorSpaceDesc, inputPixelFormat, outputColorSpaceDesc, outputPixelFormat): [ 58 (rank, version, extensionListIndex), 59 (rank, version, extensionListIndex), 60 ...... 61 ] 62 }*/ 63 using ColorSpaceConverterCapabilityMap = 64 std::map< 65 std::tuple<ColorSpaceDescription, GraphicPixelFormat, ColorSpaceDescription, GraphicPixelFormat>, 66 std::vector<std::tuple<Rank, int32_t, size_t>>>; 67 using ColorSpaceConverterDisplayCapabilityMap = ColorSpaceConverterCapabilityMap; 68 /* 69 { 70 (colorSpaceDesc, pixelFormat, metadataGeneratorAlgoType): [ 71 (rank, version, extensionListIndex), 72 (rank, version, extensionListIndex), 73 ...... 74 ] 75 } 76 */ 77 using MetadataGeneratorCapabilityMap = 78 std::map< 79 std::tuple<ColorSpaceDescription, GraphicPixelFormat, MetadataGeneratorAlgoType>, 80 std::vector<std::tuple<Rank, int32_t, size_t>>>; 81 using DetailEnhancerCapabilityMap = std::map<uint32_t, size_t>; 82 using AihdrEnhancerCapabilityMap = 83 std::map< 84 std::tuple<ColorSpaceDescription, GraphicPixelFormat>, 85 std::vector<std::tuple<Rank, int32_t, size_t>>>; 86 using ContrastEnhancerCapabilityMap = std::map<ContrastEnhancerType, size_t>; 87 88 using ColorSpaceConverterDisplaySet = std::set<std::shared_ptr<ColorSpaceConverterDisplayBase>>; 89 using ColorSpaceConverterDisplayExtensionSet = std::set<std::shared_ptr<ColorSpaceConverterDisplayExtension>>; 90 } 91 92 class ExtensionManager { 93 public: 94 static ExtensionManager& GetInstance(); 95 96 bool IsColorSpaceConversionSupported(const FrameInfo &inputInfo, const FrameInfo &outputInfo) const; 97 std::shared_ptr<ColorSpaceConverterBase> CreateColorSpaceConverter(const FrameInfo &inputInfo, 98 const FrameInfo &outputInfo, Extension::ExtensionInfo &extensionInfo) const; 99 ColorSpaceConverterDisplaySet CreateColorSpaceConverterDisplay() const; 100 std::shared_ptr<MetadataGeneratorBase> CreateMetadataGenerator(const FrameInfo &inputInfo, 101 Extension::ExtensionInfo &extensionInfo, MetadataGeneratorAlgoType algoType) const; 102 std::shared_ptr<AihdrEnhancerBase> CreateAihdrEnhancer(const FrameInfo &inputInfo, 103 Extension::ExtensionInfo &extensionInfo) const; 104 std::shared_ptr<DetailEnhancerBase> CreateDetailEnhancer(uint32_t level) const; 105 std::shared_ptr<VideoRefreshRatePredictionBase> CreateVideoRefreshRatePredictor() const; 106 std::shared_ptr<ContrastEnhancerBase> CreateContrastEnhancer(ContrastEnhancerType type) const; 107 108 using InstanceVariableType = std::variant<std::shared_ptr<ColorSpaceConverter>, 109 std::shared_ptr<MetadataGenerator>, 110 std::shared_ptr<DetailEnhancerImage>, 111 std::shared_ptr<AihdrEnhancer>>; 112 void IncreaseInstance(); 113 void DecreaseInstance(); 114 int32_t NewInstanceId(const InstanceVariableType& instance); 115 int32_t RemoveInstanceReference(int32_t& id); 116 std::optional<InstanceVariableType> GetInstance(int32_t id); 117 bool FindImageConverterExtension(const FrameInfo &inputInfo, const FrameInfo &outputInfo) const; 118 bool FindImageComposeExtension(const FrameInfo &inputInfo, const FrameInfo &outputInfo) const; 119 bool FindImageDecomposeExtension(const FrameInfo &inputInfo, const FrameInfo &outputInfo) const; 120 bool FindImageMetadataGenExtension(const FrameInfo &inputInfo) const; 121 private: 122 VPEAlgoErrCode Init(); 123 ExtensionManager(); 124 ~ExtensionManager(); 125 ExtensionManager(const ExtensionManager&) = delete; 126 ExtensionManager& operator=(const ExtensionManager&) = delete; 127 128 std::shared_ptr<ColorSpaceConverterExtension> FindColorSpaceConverterExtension(const FrameInfo &inputInfo, 129 const FrameInfo &outputInfo) const; 130 ColorSpaceConverterDisplayExtensionSet FindColorSpaceConverterDisplayExtension() const; 131 std::shared_ptr<MetadataGeneratorExtension> FindMetadataGeneratorExtension(const FrameInfo &inputInfo, 132 MetadataGeneratorAlgoType algoType) const; 133 std::shared_ptr<AihdrEnhancerExtension> FindAihdrEnhancerExtension(const FrameInfo &inputInfo) const; 134 std::shared_ptr<DetailEnhancerExtension> FindDetailEnhancerExtension(uint32_t level) const; 135 std::shared_ptr<ContrastEnhancerExtension> FindContrastEnhancerExtension(ContrastEnhancerType type) const; 136 ExtensionList LoadExtensions() const; 137 VPEAlgoErrCode LoadStaticExtensions(ExtensionList& extensionList) const; 138 ExtensionList LoadStaticImageExtensions( 139 const std::unordered_map<std::string, RegisterExtensionFunc> staticListRegisterMap) const; 140 ExtensionList LoadDynamicMetadataGenExtensions() const; 141 ExtensionList LoadDynamicComposeExtensions() const; 142 ExtensionList LoadDynamicDecomposeExtensions() const; 143 void LoadDynamicExtensions(ExtensionList& extensionList) const; 144 template<typename T> T BuildCaps(const ExtensionList& extensionList) const; 145 VPEAlgoErrCode BuildColorSpaceConverterCaps(const std::shared_ptr<ExtensionBase>& ext, size_t idx, 146 ColorSpaceConverterCapabilityMap& colorSpaceConverterCapabilityMap) const; 147 VPEAlgoErrCode BuildColorSpaceConverterDisplayCaps(const std::shared_ptr<ExtensionBase>& ext, size_t idx, 148 ColorSpaceConverterDisplayCapabilityMap& colorSpaceConverterDisplayCapabilityMap) const; 149 VPEAlgoErrCode BuildMetadataGeneratorCaps(const std::shared_ptr<ExtensionBase>& ext, size_t idx, 150 MetadataGeneratorCapabilityMap& metadataGeneratorCapabilityMap) const; 151 VPEAlgoErrCode BuildAihdrEnhancerCaps(const std::shared_ptr<ExtensionBase>& ext, size_t idx, 152 AihdrEnhancerCapabilityMap& aihdrEnhancerCapabilityMap) const; 153 VPEAlgoErrCode BuildDetailEnhancerCaps(const std::shared_ptr<ExtensionBase>& ext, size_t idx, 154 DetailEnhancerCapabilityMap& detailEnhancerCapabilityMap) const; 155 VPEAlgoErrCode BuildContrastEnhancerCaps(const std::shared_ptr<ExtensionBase>& ext, size_t idx, 156 ContrastEnhancerCapabilityMap& contrastEnhancerCapabilityMap) const; 157 VPEAlgoErrCode ExtractColorSpaceConverterCap(const ColorSpaceConverterCapability& cap, size_t idx, 158 ColorSpaceConverterCapabilityMap& colorSpaceConverterCapabilityMap) const; 159 VPEAlgoErrCode ExtractMetadataGeneratorCap(const MetadataGeneratorCapability &cap, size_t idx, 160 MetadataGeneratorAlgoType algoType, MetadataGeneratorCapabilityMap& metadataGeneratorCapabilityMap) const; 161 VPEAlgoErrCode ExtractAihdrEnhancerCap(const AihdrEnhancerCapability &cap, size_t idx, 162 AihdrEnhancerCapabilityMap& aihdrEnhancerCapabilityMap) const; 163 164 std::atomic<bool> initialized_ {false}; 165 166 static constexpr int32_t MAX_INSTANCE_NUM { 1024 }; 167 std::mutex instanceManagementMtx_; 168 std::mutex instanceCountMtx_; 169 int32_t currentId_ { 0 }; 170 int32_t usedInstance_ { 0 }; 171 std::array<std::optional<InstanceVariableType>, MAX_INSTANCE_NUM> instanceList_ { std::nullopt }; 172 }; 173 extern "C" bool ImageProcessing_IsColorSpaceConversionSupported(const ColorSpaceInfo inputInfo, 174 const ColorSpaceInfo outputInfo); 175 extern "C" bool ImageProcessing_IsCompositionSupported(const ColorSpaceInfo inputInfo, 176 const ColorSpaceInfo outputInfo); 177 extern "C" bool ImageProcessing_IsDecompositionSupported(const ColorSpaceInfo inputInfo, 178 const ColorSpaceInfo outputInfo); 179 extern "C" bool ImageProcessing_IsMetadataGenerationSupported(const ColorSpaceInfo inputInfo); 180 } // namespace Extension 181 } // namespace VideoProcessingEngine 182 } // namespace Media 183 } // namespace OHOS 184 185 #endif // FRAMEWORK_ALGORITHM_EXTENSION_MANAGER_EXTENSION_MANAGER_H 186