已开启
【轻量级 PR】update: 更新文件 extension_manager.cpp #64
gcw_4z3jiPvB创建于 24 天前
【轻量级 PR】update: 更新文件 extension_manager.cpp #64
已开启
gcw_4z3jiPvB创建于 24 天前
N/A合入到master
1 个文件变更+67-0
@@ -111,6 +111,27 @@ std::shared_ptr<ColorSpaceConverterBase> ExtensionManager::CreateColorSpaceConve
111 return impl;111 return impl;
112}112}
113 113 
114+std::shared_ptr<DetailEnhancerBase> ExtensionManager::CreateAutoEffectAisr() const
115+{
116+ VPE_LOGI("ExtensionManager::CreateAutoEffectAisr start");
117+ CHECK_AND_RETURN_RET_LOG(initialized_ == true, nullptr, "CreateAutoEffectAisr: Not initialized");
118+ auto extension = FindAutoEffectAisrExtension();
119+ CHECK_AND_RETURN_RET_LOG(extension != nullptr, nullptr, "CreateAutoEffectAisr: get an empty extension");
120+ // Use dlsym to get creator from ext .so directly, avoiding CFI cross-DSO failure
121+ // caused by static_pointer_cast<AutoEffectAisrExtension> and subsequent indirect calls
122+ using AutoEffectAisrCreator = void*(*)();
123+ auto creator = reinterpret_cast<AutoEffectAisrCreator>(dlsym(g_algoHandle, "CreateAutoEffectAisrVideo"));
124+ CHECK_AND_RETURN_RET_LOG(creator != nullptr, nullptr,
125+ "CreateAutoEffectAisr: dlsym CreateAutoEffectAisrVideo failed: %{public}s", dlerror());
126+ void* rawImpl = creator();
127+ CHECK_AND_RETURN_RET_LOG(rawImpl != nullptr, nullptr,
128+ "CreateAutoEffectAisr: CreateAutoEffectAisrVideo returned null");
129+ VPE_LOGI("ExtensionManager::CreateAutoEffectAisr success");
130+ return std::shared_ptr<DetailEnhancerBase>(
131+ static_cast<DetailEnhancerBase*>(rawImpl),
132+ [](DetailEnhancerBase* p) { delete p; });
133+}
134+ 
114std::shared_ptr<VideoRefreshRatePredictionBase> ExtensionManager::CreateVideoRefreshRatePredictor() const135std::shared_ptr<VideoRefreshRatePredictionBase> ExtensionManager::CreateVideoRefreshRatePredictor() const
115{136{
116 std::shared_ptr<ExtensionBase> extension;137 std::shared_ptr<ExtensionBase> extension;
@@ -509,6 +530,12 @@ T ExtensionManager::BuildCaps(const ExtensionList& extensionList) const
509 CHECK_AND_LOG(err == VPE_ALGO_ERR_OK, "Build caps failed, extension: %{public}s",530 CHECK_AND_LOG(err == VPE_ALGO_ERR_OK, "Build caps failed, extension: %{public}s",
510 extension->info.name.c_str());531 extension->info.name.c_str());
511 }532 }
533+ } else if constexpr (std::is_same_v<T, AutoEffectAisrCapabilityMap>) {
534+ if (extension->info.type == ExtensionType::AUTO_EFFECT_AISR) {
535+ err = BuildAutoEffectAisrCaps(extension, idx, capMap);
536+ CHECK_AND_LOG(err == VPE_ALGO_ERR_OK, "Build caps failed, extension: %{public}s",
537+ extension->info.name.c_str());
538+ }
512 } else if constexpr (std::is_same_v<T, AihdrEnhancerCapabilityMap>) {539 } else if constexpr (std::is_same_v<T, AihdrEnhancerCapabilityMap>) {
513 if (extension->info.type == ExtensionType::AIHDR_ENHANCER) {540 if (extension->info.type == ExtensionType::AIHDR_ENHANCER) {
514 err = BuildAihdrEnhancerCaps(extension, idx, capMap);541 err = BuildAihdrEnhancerCaps(extension, idx, capMap);
@@ -523,6 +550,23 @@ T ExtensionManager::BuildCaps(const ExtensionList& extensionList) const
523 return capMap;550 return capMap;
524}551}
525 552 
553+std::shared_ptr<ExtensionBase> ExtensionManager::FindAutoEffectAisrExtension() const
554+{
555+ VPE_LOGI("FindAutoEffectAisrExtension start");
556+ auto extensionList = LoadExtensions();
557+ CHECK_AND_RETURN_RET_LOG(!extensionList.empty(), nullptr, "FindAutoEffectAisrExtension: No extension found");
558+ VPE_LOGI("FindAutoEffectAisrExtension: extensionList size=%{public}zu", extensionList.size());
559+ // Find AUTO_EFFECT_AISR extension by type without static_pointer_cast to avoid CFI cross-DSO failure
560+ for (auto& ext : extensionList) {
561+ if (ext != nullptr && ext->info.type == ExtensionType::AUTO_EFFECT_AISR) {
562+ VPE_LOGI("FindAutoEffectAisrExtension: found extension name: %{public}s", ext->info.name.c_str());
563+ return ext;
564+ }
565+ }
566+ VPE_LOGI("FindAutoEffectAisrExtension: AUTO_EFFECT_Aisr not found in extension list");
567+ return nullptr;
568+}
569+ 
526std::shared_ptr<ColorSpaceConverterExtension> ExtensionManager::FindColorSpaceConverterExtension(570std::shared_ptr<ColorSpaceConverterExtension> ExtensionManager::FindColorSpaceConverterExtension(
527 const FrameInfo &inputInfo, const FrameInfo &outputInfo) const571 const FrameInfo &inputInfo, const FrameInfo &outputInfo) const
528{572{
@@ -755,6 +799,29 @@ VPEAlgoErrCode ExtensionManager::BuildAihdrEnhancerCaps(const std::shared_ptr<Ex
755 }799 }
756 return err;800 return err;
757}801}
802+ 
803+VPEAlgoErrCode ExtensionManager::BuildAutoEffectAisrCaps(const std::shared_ptr<ExtensionBase>& ext, size_t idx,
804+ AutoEffectAisrCapabilityMap& autoEffectAisrCapabilityMap) const
805+{
806+ // Use dlsym to get BuildCapabilities from ext .so directly, avoiding CFI cross-DSO failure
807+ using AutoEffectAisrCapsBuilder = void(*)(AutoEffectAisrCapability*);
808+ auto capsBuilder = reinterpret_cast<AutoEffectAisrCapsBuilder>(dlsym(g_algoHandle,
809+ "BuildAutoEffectVideoCapabilities"));
810+ AutoEffectAisrCapability capabilities{};
811+ if (capsBuilder != nullptr) {
812+ capsBuilder(&capabilities);
813+ }
814+ auto itr = autoEffectAisrCapabilityMap.find(0);
815+ if (itr == autoEffectAisrCapabilityMap.end()) {
816+ autoEffectAisrCapabilityMap.emplace(0, idx);
817+ } else {
818+ if (capabilities.rank == Rank::RANK_HIGH) {
819+ itr->second = idx;
820+ }
821+ }
822+ return VPE_ALGO_ERR_OK;
823+}
824+ 
758VPEAlgoErrCode ExtensionManager::BuildContrastEnhancerCaps(const std::shared_ptr<ExtensionBase>& ext, size_t idx,825VPEAlgoErrCode ExtensionManager::BuildContrastEnhancerCaps(const std::shared_ptr<ExtensionBase>& ext, size_t idx,
759 ContrastEnhancerCapabilityMap& contrastEnhancerCapabilityMap) const826 ContrastEnhancerCapabilityMap& contrastEnhancerCapabilityMap) const
760{827{