• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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