已开启
【轻量级 PR】update: 更新文件 extension_manager.cpp #64
gcw_4z3jiPvB创建于 24 天前
【轻量级 PR】update: 更新文件 extension_manager.cpp #64
已开启
从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 | + | ||
| 114 | std::shared_ptr<VideoRefreshRatePredictionBase> ExtensionManager::CreateVideoRefreshRatePredictor() const | 135 | std::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 | + | ||
| 526 | std::shared_ptr<ColorSpaceConverterExtension> ExtensionManager::FindColorSpaceConverterExtension( | 570 | std::shared_ptr<ColorSpaceConverterExtension> ExtensionManager::FindColorSpaceConverterExtension( |
| 527 | const FrameInfo &inputInfo, const FrameInfo &outputInfo) const | 571 | 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 | + | ||
| 758 | VPEAlgoErrCode ExtensionManager::BuildContrastEnhancerCaps(const std::shared_ptr<ExtensionBase>& ext, size_t idx, | 825 | VPEAlgoErrCode ExtensionManager::BuildContrastEnhancerCaps(const std::shared_ptr<ExtensionBase>& ext, size_t idx, |
| 759 | ContrastEnhancerCapabilityMap& contrastEnhancerCapabilityMap) const | 826 | ContrastEnhancerCapabilityMap& contrastEnhancerCapabilityMap) const |
| 760 | { | 827 | { |