[PR] WIP: avfilter/vf_{vpp,sr,vqe}_amf: Enforce engine type (PR #24112)

DmitriiGershenkop via ffmpeg-devel <[email protected]>
Newsgroups gmane.comp.video.ffmpeg.devel
Message-ID <178654859489.59.8912832210905928140@29965ddac10e>
PR #24112 opened by DmitriiGershenkop
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/24112
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/24112.patch

NOTICE: to be merged after #24077

Some filters in some versions of AMF can pick unexpected engine and output memory format if it is not enforced, which might have a negative effect on interoperability with different APIs.



>From 7e2b88ccaf9383e3f6fcac55b8c7cdc21ad0e4a2 Mon Sep 17 00:00:00 2001
From: Dmitrii Gershenkop <[email protected]>
Date: Wed, 12 Aug 2026 16:49:40 +0200
Subject: [PATCH] avfilter/vf_{vpp,sr,vqe}_amf: Enforce memory type

---
 libavfilter/vf_sr_amf.c  | 5 +++++
 libavfilter/vf_vpp_amf.c | 7 ++++++-
 libavfilter/vf_vqe_amf.c | 6 +++++-
 3 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/libavfilter/vf_sr_amf.c b/libavfilter/vf_sr_amf.c
index 8f3ae7ed80..17bfdc2a03 100644
--- a/libavfilter/vf_sr_amf.c
+++ b/libavfilter/vf_sr_amf.c
@@ -89,6 +89,7 @@ static int amf_filter_config_output(AVFilterLink *outlink)
     int err;
     AMF_RESULT res;
     enum AVPixelFormat in_format;
+    enum AMF_MEMORY_TYPE mem_type = AMF_MEMORY_UNKNOWN;
 
     err = amf_init_filter_config(outlink, &in_format);
     if (err < 0)
@@ -103,6 +104,10 @@ static int amf_filter_config_output(AVFilterLink *outlink)
     res = ctx->amf_device_ctx->factory->pVtbl->CreateComponent(ctx->amf_device_ctx->factory, ctx->amf_device_ctx->context, AMFHQScaler, &ctx->component);
     AMF_RETURN_IF_FALSE(ctx, res == AMF_OK, AVERROR_FILTER_NOT_FOUND, "CreateComponent(%ls) failed with error %d\n", AMFHQScaler, res);
 
+    mem_type = av_amf_get_memory_type(ctx->amf_device_ctx);
+    if (mem_type != AMF_MEMORY_UNKNOWN)
+        AMF_ASSIGN_PROPERTY_INT64(res, ctx->component, AMF_HQ_SCALER_ENGINE_TYPE, mem_type);
+
     out_size.width = outlink->w;
     out_size.height = outlink->h;
     AMF_ASSIGN_PROPERTY_SIZE(res, ctx->component, AMF_HQ_SCALER_OUTPUT_SIZE, out_size);
diff --git a/libavfilter/vf_vpp_amf.c b/libavfilter/vf_vpp_amf.c
index e836cec68a..839a075ea7 100644
--- a/libavfilter/vf_vpp_amf.c
+++ b/libavfilter/vf_vpp_amf.c
@@ -90,6 +90,7 @@ static int amf_filter_config_output(AVFilterLink *outlink)
     const AVFrameSideData *sd;
     enum AMF_VIDEO_CONVERTER_COLOR_PROFILE_ENUM amf_color_profile;
     enum AVPixelFormat in_format;
+    enum AMF_MEMORY_TYPE mem_type = AMF_MEMORY_UNKNOWN;
 
     ret = amf_init_filter_config(outlink, &in_format);
     if (ret < 0)
@@ -98,7 +99,11 @@ static int amf_filter_config_output(AVFilterLink *outlink)
     hwframes_out = (AVHWFramesContext*)ctx->hwframes_out_ref->data;
     res = ctx->amf_device_ctx->factory->pVtbl->CreateComponent(ctx->amf_device_ctx->factory, ctx->amf_device_ctx->context, AMFVideoConverter, &ctx->component);
     AMF_RETURN_IF_FALSE(ctx, res == AMF_OK, AVERROR_FILTER_NOT_FOUND, "CreateComponent(%ls) failed with error %d\n", AMFVideoConverter, res);
-    // FIXME: add checks whether we have HW context
+
+    mem_type = av_amf_get_memory_type(ctx->amf_device_ctx);
+    if (mem_type != AMF_MEMORY_UNKNOWN)
+        AMF_ASSIGN_PROPERTY_INT64(res, ctx->component, AMF_VIDEO_CONVERTER_MEMORY_TYPE, mem_type);
+
     AMF_ASSIGN_PROPERTY_INT64(res, ctx->component, AMF_VIDEO_CONVERTER_OUTPUT_FORMAT, (amf_int32)av_av_to_amf_format(hwframes_out->sw_format));
     AMF_RETURN_IF_FALSE(avctx, res == AMF_OK, AVERROR_UNKNOWN, "AMFConverter-SetProperty() failed with error %d\n", res);
 
diff --git a/libavfilter/vf_vqe_amf.c b/libavfilter/vf_vqe_amf.c
index d7249d999b..74268283a2 100644
--- a/libavfilter/vf_vqe_amf.c
+++ b/libavfilter/vf_vqe_amf.c
@@ -94,6 +94,7 @@ static int amf_vqe_filter_config_output(AVFilterLink *outlink)
     AMFVQEFilterContext *vqe_ctx = avctx->priv;
     AMFFilterContext    *amf_ctx = &vqe_ctx->common;
     AVAMFDeviceContext  *device_ctx = NULL;
+    enum AMF_MEMORY_TYPE mem_type = AMF_MEMORY_UNKNOWN;
 
     int err;
     AMF_RESULT res;
@@ -110,8 +111,11 @@ static int amf_vqe_filter_config_output(AVFilterLink *outlink)
 
     amf_filter = amf_ctx->component;
 
-    if (vqe_ctx->engine_type != -1)
+    mem_type = av_amf_get_memory_type(device_ctx);
+    if (vqe_ctx->engine_type != -1) {
         AMF_ASSIGN_PROPERTY_INT64(res, amf_filter, AMF_VIDEO_ENHANCER_ENGINE_TYPE, vqe_ctx->engine_type);
+    } else if (mem_type != AMF_MEMORY_UNKNOWN)
+        AMF_ASSIGN_PROPERTY_INT64(res, amf_filter, AMF_VIDEO_ENHANCER_ENGINE_TYPE, mem_type);
 
     AMF_ASSIGN_PROPERTY_DOUBLE(res, amf_filter, AMF_VE_FCR_ATTENUATION, vqe_ctx->attenuation);
     AMF_RETURN_IF_FALSE(avctx, res == AMF_OK, AVERROR_UNKNOWN, "Failed to set VQ enhancer attenuation: %d\n", res);
-- 
2.52.0

_______________________________________________
ffmpeg-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.