vpe ani code

Signed-off-by: pxh123456 <pengxiaohang@huawei.com>
This commit is contained in:
pxh123456
2026-01-23 17:58:42 +08:00
parent 5eead0ce60
commit b500b306c7
3 changed files with 42 additions and 27 deletions
@@ -29,39 +29,38 @@
namespace ANI::Vpe {
using namespace taihe;
using namespace OHOS;
using namespace OHOS::Media;
using namespace OHOS::Media::VideoProcessingEngine;
namespace taiheVpe = ::ohos::multimedia::videoProcessingEngine;
namespace taiheImage = ::ohos::multimedia::image::image;
class ImageProcessorImpl {
public:
ImageProcessorImpl() = default;
~PixelMapImpl() = default;
taiheImage::PixelMap EnhanceDetailWithRes(taiheImage::weak::PixelMap sourceImage, int width, int height,
optional_view<taiheVpe::QualityLevel> level);
taihe::optional_view<taiheVpe::QualityLevel> level);
taiheImage::PixelMap EnhanceDetailWithRatio(taiheImage::weak::PixelMap sourceImage, double scale,
optional_view<taiheVpe::QualityLevel> level);
taihe::optional_view<taiheVpe::QualityLevel> level);
taiheImage::PixelMap EnhanceDetailSyncWithRes(taiheImage::weak::PixelMap sourceImage, int width, int height,
optional_view<taiheVpe::QualityLevel> level);
taihe::optional_view<taiheVpe::QualityLevel> level);
taiheImage::PixelMap EnhanceDetailSyncWithRatio(taiheImage::weak::PixelMap sourceImage, double scale,
optional_view<taiheVpe::QualityLevel> level);
taihe::optional_view<taiheVpe::QualityLevel> level);
private:
struct DetailEnhanceContext {
double xArg{};
double yArg{};
int32_t qualityLevel{};
std::shared_ptr<PixelMap> inputPixelMap{};
std::shared_ptr<PixelMap> outputPixelMap{};
std::shared_ptr<OHOS::Media::PixelMap> inputPixelMap{};
std::shared_ptr<OHOS::Media::PixelMap> outputPixelMap{};
};
void ParseDetailEnhanceParameter(std::unique_ptr<DetailEnhanceContext>& detailContext,
taiheImage::weak::PixelMap sourceImage, int width, int height, optional_view<taiheVpe::QualityLevel> level);
taiheImage::weak::PixelMap sourceImage, int width, int height,
taihe::optional_view<taiheVpe::QualityLevel> level);
void ParseDetailEnhanceParameter(std::unique_ptr<DetailEnhanceContext>& detailContext,
taiheImage::weak::PixelMap sourceImage, double scale, optional_view<taiheVpe::QualityLevel> level);
std::shared_ptr<OHOS::Media::PixelMap> EnhanceDetailImpl(std::unique_ptr<DetailEnhanceContext>& detailContext);
std::shared_ptr<OHOS::Media::PixelMap> DetailEnhanceImpl(DetailEnhanceContext* context);
taiheImage::weak::PixelMap sourceImage, double scale, taihe::optional_view<taiheVpe::QualityLevel> level);
std::shared_ptr<OHOS::Media::PixelMap> EnhanceDetail(std::unique_ptr<DetailEnhanceContext>& detailContext);
std::shared_ptr<OHOS::Media::PixelMap> EnhanceDetailImpl(std::unique_ptr<DetailEnhanceContext>& context);
};
}
#endif
@@ -22,9 +22,9 @@
#error "ani.h not found. Please ensure the Ani SDK is correctly installed."
#endif
ANI_EXPORT ani_status ANI_Constructor(ani_vm *vm, uint32_t *result)
ANI_EXPORT ani_status ANI_Constructor(ani_vm* vm, uint32_t* result)
{
ani_env *env;
ani_env* env;
if (ANI_OK != vm->GetEnv(ANI_VERSION_1, &env)) {
return ANI_ERROR;
}
@@ -34,9 +34,10 @@
#include "vpe_utils.h"
namespace {
static std::mutex g_detailTaskLock{std::mutex()};
static std::mutex g_detailTaskLock{std::mutex()};
}
using namespace taihe;
using namespace OHOS::Media;
using namespace VideoProcessingEngine;
using namespace ANI;
@@ -85,19 +86,20 @@ void ImageProcessorImpl::ParseDetailEnhanceParameter(std::unique_ptr<DetailEnhan
detailContext->inputPixelMap = pixelMapImpl->GetNativePtr();
}
std::shared_ptr<OHOS::Media::PixelMap> ImageProcessorImpl::EnhanceDetailImpl(
std::shared_ptr<OHOS::Media::PixelMap> ImageProcessorImpl::EnhanceDetail(
std::unique_ptr<DetailEnhanceContext>& detailContext)
{
std::shared_ptr<OHOS::Media::PixelMap> outputPixelMap = DetailEnhanceImpl(detailContext.get());
detailContext->inputPixelMap = nullptr; // 解引用防止内存泄漏
std::shared_ptr<OHOS::Media::PixelMap> outputPixelMap = EnhanceDetailImpl(detailContext.get());
detailContext->inputPixelMap = nullptr; // Dereferencing prevents memory leaks
if (outputPixelMap == nullptr) {
VPE_LOGE("DetailEnhanceImpl processed failed");
VPE_LOGE("DetailEnhance processed failed");
return nullptr;
}
return outputPixelMap;
}
std::shared_ptr<OHOS::Media::PixelMap> ImageProcessorImpl::DetailEnhanceImpl(DetailEnhanceContext* context)
std::shared_ptr<OHOS::Media::PixelMap> ImageProcessorImpl::DEnhanceDetailImpl(
std::unique_ptr<DetailEnhanceContext>& detailContext)
{
return nullptr;
}
@@ -106,20 +108,26 @@ taiheImage::PixelMap ImageProcessorImpl::EnhanceDetailWithRes(taiheImage::weak::
int height, optional_view<taiheVpe::QualityLevel> level)
{
VPETrace vpeTrace("VpeAni::DeatailEnhanceProcessRes");
std::lock_guard<std::mutex> lock(g_detailTaskLock);
std::unique_ptr<DetailEnhanceContext> detailContext = std::make_unique<DetailEnhanceContext>();
if (detailContext == nullptr) {
VPE_LOGE("invalid context");
return make_holder<ANI::Image::PixelMapImpl, taiheImage::PixelMap>();
}
ParseDetailEnhanceParameter(detailContext, sourceImage, width, height, level);
return make_holder<ANI::Image::PixelMapImpl, taiheImage::PixelMap>(EnhanceDetailImpl(detailContext));
return make_holder<ANI::Image::PixelMapImpl, taiheImage::PixelMap>(EnhanceDetail(detailContext));
}
taiheImage::PixelMap ImageProcessorImpl::EnhanceDetailWithRatio(taiheImage::weak::PixelMap sourceImage, double scale,
optional_view<taiheVpe::QualityLevel> level)
{
VPETrace vpeTrace("VpeAni::DeatailEnhanceProcessRatio");
std::lock_guard<std::mutex> lock(g_detailTaskLock);
std::unique_ptr<DetailEnhanceContext> detailContext = std::make_unique<DetailEnhanceContext>();
if (detailContext == nullptr) {
VPE_LOGE("invalid context");
return make_holder<ANI::Image::PixelMapImpl, taiheImage::PixelMap>();
}
ParseDetailEnhanceParameter(detailContext, sourceImage, scale, level);
return make_holder<ANI::Image::PixelMapImpl, taiheImage::PixelMap>(EnhanceDetailImpl(detailContext));
return make_holder<ANI::Image::PixelMapImpl, taiheImage::PixelMap>(EnhanceDetail(detailContext));
}
taiheImage::PixelMap ImageProcessorImpl::EnhanceDetailSyncWithRes(taiheImage::weak::PixelMap sourceImage, int width,
@@ -128,8 +136,12 @@ taiheImage::PixelMap ImageProcessorImpl::EnhanceDetailSyncWithRes(taiheImage::we
VPETrace vpeTrace("VpeAni::DeatailEnhanceProcessSyncRes");
std::lock_guard<std::mutex> lock(g_detailTaskLock);
std::unique_ptr<DetailEnhanceContext> detailContext = std::make_unique<DetailEnhanceContext>();
if (detailContext == nullptr) {
VPE_LOGE("invalid context");
return make_holder<ANI::Image::PixelMapImpl, taiheImage::PixelMap>();
}
ParseDetailEnhanceParameter(detailContext, sourceImage, width, height, level);
return make_holder<ANI::Image::PixelMapImpl, taiheImage::PixelMap>(EnhanceDetailImpl(detailContext));
return make_holder<ANI::Image::PixelMapImpl, taiheImage::PixelMap>(EnhanceDetail(detailContext));
}
taiheImage::PixelMap ImageProcessorImpl::EnhanceDetailSyncWithRatio(taiheImage::weak::PixelMap sourceImage,
@@ -138,8 +150,12 @@ taiheImage::PixelMap ImageProcessorImpl::EnhanceDetailSyncWithRatio(taiheImage::
VPETrace vpeTrace("VpeAni::DeatailEnhanceProcessSyncRatio");
std::lock_guard<std::mutex> lock(g_detailTaskLock);
std::unique_ptr<DetailEnhanceContext> detailContext = std::make_unique<DetailEnhanceContext>();
if (detailContext == nullptr) {
VPE_LOGE("invalid context");
return make_holder<ANI::Image::PixelMapImpl, taiheImage::PixelMap>();
}
ParseDetailEnhanceParameter(detailContext, sourceImage, scale, level);
return make_holder<ANI::Image::PixelMapImpl, taiheImage::PixelMap>(EnhanceDetailImpl(detailContext));
return make_holder<ANI::Image::PixelMapImpl, taiheImage::PixelMap>(EnhanceDetail(detailContext));
}
// NOLINTBEGIN