mirror of
https://github.com/openharmony/multimedia_video_processing_engine.git
synced 2026-07-18 17:14:29 -04:00
@@ -49,6 +49,9 @@ ExtensionManager::ExtensionManager()
|
||||
{
|
||||
(void)Init();
|
||||
g_algoHandle = dlopen("libvideoprocessingengine_ext.z.so", RTLD_NOW);
|
||||
if (g_algoHandle == nullptr) {
|
||||
VPE_LOGE("dlopen libvideoprocessingengine_ext failed %{public}s", dlerror());
|
||||
}
|
||||
}
|
||||
|
||||
ExtensionManager::~ExtensionManager()
|
||||
@@ -213,6 +216,19 @@ std::shared_ptr<DetailEnhancerBase> ExtensionManager::CreateDetailEnhancer(uint3
|
||||
return impl;
|
||||
}
|
||||
|
||||
std::shared_ptr<ContrastEnhancerBase> ExtensionManager::CreateContrastEnhancer(ContrastEnhancerType type) const
|
||||
{
|
||||
CHECK_AND_RETURN_RET_LOG(initialized_ == true, nullptr, "Not initialized");
|
||||
auto extension = FindContrastEnhancerExtension(type);
|
||||
CHECK_AND_RETURN_RET_LOG(extension != nullptr, nullptr,
|
||||
"Create failed, get an empty extension. type: %{public}d", type);
|
||||
auto impl = extension->creator();
|
||||
CHECK_AND_RETURN_RET_LOG(impl != nullptr, nullptr,
|
||||
"Call extension creator failed, return a empty impl, extension: %{public}s, type: %{public}d",
|
||||
extension->info.name.c_str(), type);
|
||||
return impl;
|
||||
}
|
||||
|
||||
ExtensionList ExtensionManager::LoadExtensions() const
|
||||
{
|
||||
ExtensionList extensionList {};
|
||||
@@ -487,7 +503,13 @@ T ExtensionManager::BuildCaps(const ExtensionList& extensionList) const
|
||||
CHECK_AND_LOG(err == VPE_ALGO_ERR_OK, "Build caps failed, extension: %{public}s",
|
||||
extension->info.name.c_str());
|
||||
}
|
||||
} else if constexpr (std::is_same_v<T, AihdrEnhancerCapabilityMap>) {
|
||||
} else if constexpr (std::is_same_v<T, ContrastEnhancerCapabilityMap>) {
|
||||
if (extension->info.type == ExtensionType::CONTRAST_ENHANCER) {
|
||||
err = BuildContrastEnhancerCaps(extension, idx, capMap);
|
||||
CHECK_AND_LOG(err == VPE_ALGO_ERR_OK, "Build caps failed, extension: %{public}s",
|
||||
extension->info.name.c_str());
|
||||
}
|
||||
} else if constexpr (std::is_same_v<T, AihdrEnhancerCapabilityMap>) {
|
||||
if (extension->info.type == ExtensionType::AIHDR_ENHANCER) {
|
||||
err = BuildAihdrEnhancerCaps(extension, idx, capMap);
|
||||
CHECK_AND_LOG(err == VPE_ALGO_ERR_OK, "Build caps failed, extension: %{public}s",
|
||||
@@ -498,7 +520,6 @@ T ExtensionManager::BuildCaps(const ExtensionList& extensionList) const
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
return capMap;
|
||||
}
|
||||
|
||||
@@ -526,7 +547,7 @@ std::shared_ptr<ColorSpaceConverterExtension> ExtensionManager::FindColorSpaceCo
|
||||
(CSDesc).range, outputInfo.pixelFormat, outputInfo.colorSpace.metadataType);
|
||||
return nullptr;
|
||||
}
|
||||
size_t idx = std::get<2>(*(iter->second.cbegin())); // 2
|
||||
size_t idx = std::get<2>(*(iter->second.cbegin()));
|
||||
for (const auto &cap : iter->second) {
|
||||
if (std::get<0>(cap) == Rank::RANK_HIGH) {
|
||||
idx = std::get<2>(cap); // 2
|
||||
@@ -563,7 +584,7 @@ std::shared_ptr<MetadataGeneratorExtension> ExtensionManager::FindMetadataGenera
|
||||
const auto iter = metadataGeneratorCapabilityMap.find(key);
|
||||
CHECK_AND_RETURN_RET_LOG(iter != metadataGeneratorCapabilityMap.cend() && !iter->second.empty(), nullptr,
|
||||
"CSC metadata generator extension is not found");
|
||||
size_t idx = std::get<2>(*(iter->second.cbegin())); // 2
|
||||
size_t idx = std::get<2>(*(iter->second.cbegin()));
|
||||
for (const auto &cap : iter->second) {
|
||||
if (std::get<0>(cap) == Rank::RANK_HIGH) {
|
||||
idx = std::get<2>(cap); // 2
|
||||
@@ -608,7 +629,7 @@ std::shared_ptr<AihdrEnhancerExtension> ExtensionManager::FindAihdrEnhancerExten
|
||||
const auto iter = aihdrEnhancerCapabilityMap.find(key);
|
||||
CHECK_AND_RETURN_RET_LOG(iter != aihdrEnhancerCapabilityMap.cend() && !iter->second.empty(), nullptr,
|
||||
"Aihdr enhancer extension is not found");
|
||||
size_t idx = std::get<2>(*(iter->second.cbegin())); // 2
|
||||
size_t idx = std::get<2>(*(iter->second.cbegin()));
|
||||
for (const auto &cap : iter->second) {
|
||||
if (std::get<0>(cap) == Rank::RANK_HIGH) {
|
||||
idx = std::get<2>(cap); // 2
|
||||
@@ -618,6 +639,20 @@ std::shared_ptr<AihdrEnhancerExtension> ExtensionManager::FindAihdrEnhancerExten
|
||||
return std::static_pointer_cast<AihdrEnhancerExtension>(extensionList[idx]);
|
||||
}
|
||||
|
||||
std::shared_ptr<ContrastEnhancerExtension> ExtensionManager::FindContrastEnhancerExtension(
|
||||
ContrastEnhancerType type) const
|
||||
{
|
||||
auto extensionList = LoadExtensions();
|
||||
CHECK_AND_RETURN_RET_LOG(!extensionList.empty(), nullptr, "No extension found");
|
||||
auto contrastEnhancerCapabilityMap = BuildCaps<ContrastEnhancerCapabilityMap>(extensionList);
|
||||
CHECK_AND_RETURN_RET_LOG(!contrastEnhancerCapabilityMap.empty(), nullptr, "No extension available");
|
||||
const auto iter = contrastEnhancerCapabilityMap.find(type);
|
||||
CHECK_AND_RETURN_RET_LOG(iter != contrastEnhancerCapabilityMap.cend(), nullptr,
|
||||
"Contrast enhancer Extension is not found");
|
||||
size_t idx = iter->second;
|
||||
return std::static_pointer_cast<ContrastEnhancerExtension>(extensionList[idx]);
|
||||
}
|
||||
|
||||
VPEAlgoErrCode ExtensionManager::ExtractColorSpaceConverterCap(const ColorSpaceConverterCapability& cap, size_t idx,
|
||||
ColorSpaceConverterCapabilityMap& colorSpaceConverterCapabilityMap) const
|
||||
{
|
||||
@@ -720,6 +755,16 @@ VPEAlgoErrCode ExtensionManager::BuildAihdrEnhancerCaps(const std::shared_ptr<Ex
|
||||
}
|
||||
return err;
|
||||
}
|
||||
VPEAlgoErrCode ExtensionManager::BuildContrastEnhancerCaps(const std::shared_ptr<ExtensionBase>& ext, size_t idx,
|
||||
ContrastEnhancerCapabilityMap& contrastEnhancerCapabilityMap) const
|
||||
{
|
||||
auto realExtension = std::static_pointer_cast<ContrastEnhancerExtension>(ext);
|
||||
auto capabilities = realExtension->capabilitiesBuilder();
|
||||
for (const auto &level : capabilities.types) {
|
||||
contrastEnhancerCapabilityMap.emplace(level, idx);
|
||||
}
|
||||
return VPE_ALGO_ERR_OK;
|
||||
}
|
||||
} // namespace Extension
|
||||
} // namespace VideoProcessingEngine
|
||||
} // namespace Media
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright (c) 2024 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 FRAMEWORK_ALGORITHM_EXTENSION_MANAGER_CONTRAST_ENHANCER_EXTENSION_H
|
||||
#define FRAMEWORK_ALGORITHM_EXTENSION_MANAGER_CONTRAST_ENHANCER_EXTENSION_H
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "contrast_enhancer_base.h"
|
||||
#include "contrast_enhancer_capability.h"
|
||||
#include "extension_base.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace Media {
|
||||
namespace VideoProcessingEngine {
|
||||
namespace Extension {
|
||||
|
||||
struct ContrastEnhancerExtension : public ExtensionBase {
|
||||
ContrastEnhancerCreator creator;
|
||||
ContrastEnhancerCapabilitiesBuilder capabilitiesBuilder;
|
||||
};
|
||||
|
||||
} // namespace Extension
|
||||
} // namespace VideoProcessingEngine
|
||||
} // namespace Media
|
||||
} // namespace OHOS
|
||||
|
||||
#endif // FRAMEWORK_ALGORITHM_EXTENSION_MANAGER_CONTRAST_ENHANCER_EXTENSION_H
|
||||
@@ -28,7 +28,8 @@ enum class ExtensionType {
|
||||
METADATA_GENERATOR,
|
||||
DETAIL_ENHANCER,
|
||||
VIDEO_REFRESHRATE_PREDICTION,
|
||||
AIHDR_ENHANCER
|
||||
AIHDR_ENHANCER,
|
||||
CONTRAST_ENHANCER,
|
||||
};
|
||||
|
||||
enum class Rank : uint32_t {
|
||||
|
||||
@@ -43,6 +43,7 @@
|
||||
#include "colorspace_converter_display_extension.h"
|
||||
#include "metadata_generator_extension.h"
|
||||
#include "detail_enhancer_extension.h"
|
||||
#include "contrast_enhancer_extension.h"
|
||||
#include "video_refreshrate_prediction_extension.h"
|
||||
#include "utils.h"
|
||||
|
||||
@@ -82,6 +83,7 @@ using AihdrEnhancerCapabilityMap =
|
||||
std::map<
|
||||
std::tuple<ColorSpaceDescription, GraphicPixelFormat>,
|
||||
std::vector<std::tuple<Rank, int32_t, size_t>>>;
|
||||
using ContrastEnhancerCapabilityMap = std::map<ContrastEnhancerType, size_t>;
|
||||
|
||||
using ColorSpaceConverterDisplaySet = std::set<std::shared_ptr<ColorSpaceConverterDisplayBase>>;
|
||||
using ColorSpaceConverterDisplayExtensionSet = std::set<std::shared_ptr<ColorSpaceConverterDisplayExtension>>;
|
||||
@@ -101,6 +103,7 @@ public:
|
||||
Extension::ExtensionInfo &extensionInfo) const;
|
||||
std::shared_ptr<DetailEnhancerBase> CreateDetailEnhancer(uint32_t level) const;
|
||||
std::shared_ptr<VideoRefreshRatePredictionBase> CreateVideoRefreshRatePredictor() const;
|
||||
std::shared_ptr<ContrastEnhancerBase> CreateContrastEnhancer(ContrastEnhancerType type) const;
|
||||
|
||||
using InstanceVariableType = std::variant<std::shared_ptr<ColorSpaceConverter>,
|
||||
std::shared_ptr<MetadataGenerator>,
|
||||
@@ -129,6 +132,7 @@ private:
|
||||
MetadataGeneratorAlgoType algoType) const;
|
||||
std::shared_ptr<AihdrEnhancerExtension> FindAihdrEnhancerExtension(const FrameInfo &inputInfo) const;
|
||||
std::shared_ptr<DetailEnhancerExtension> FindDetailEnhancerExtension(uint32_t level) const;
|
||||
std::shared_ptr<ContrastEnhancerExtension> FindContrastEnhancerExtension(ContrastEnhancerType type) const;
|
||||
ExtensionList LoadExtensions() const;
|
||||
VPEAlgoErrCode LoadStaticExtensions(ExtensionList& extensionList) const;
|
||||
ExtensionList LoadStaticImageExtensions(
|
||||
@@ -148,6 +152,8 @@ private:
|
||||
AihdrEnhancerCapabilityMap& aihdrEnhancerCapabilityMap) const;
|
||||
VPEAlgoErrCode BuildDetailEnhancerCaps(const std::shared_ptr<ExtensionBase>& ext, size_t idx,
|
||||
DetailEnhancerCapabilityMap& detailEnhancerCapabilityMap) const;
|
||||
VPEAlgoErrCode BuildContrastEnhancerCaps(const std::shared_ptr<ExtensionBase>& ext, size_t idx,
|
||||
ContrastEnhancerCapabilityMap& contrastEnhancerCapabilityMap) const;
|
||||
VPEAlgoErrCode ExtractColorSpaceConverterCap(const ColorSpaceConverterCapability& cap, size_t idx,
|
||||
ColorSpaceConverterCapabilityMap& colorSpaceConverterCapabilityMap) const;
|
||||
VPEAlgoErrCode ExtractMetadataGeneratorCap(const MetadataGeneratorCapability &cap, size_t idx,
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
namespace OHOS::Media::VideoProcessingEngine::Extension {
|
||||
using RegisterExtensionFunc = void (*)(uintptr_t extensionListAddr);
|
||||
const std::unordered_map<std::string, RegisterExtensionFunc> staticExtensionsRegisterMap = {
|
||||
{ "Skia", RegisterSkiaExtensions },
|
||||
{"Skia", RegisterSkiaExtensions},
|
||||
};
|
||||
} // namespace OHOS::Media::VideoProcessingEngine::Extension
|
||||
|
||||
|
||||
Reference in New Issue
Block a user