[FFmpeg-devel] [PATCH v4 03/11] avfilter/dnn: Don't show backends which are not supported by a filter
Zhao Zhili
quinkblack at foxmail.com
Tue May 7 19:08:10 EEST 2024
From: Zhao Zhili <zhilizhao at tencent.com>
---
libavfilter/dnn/dnn_interface.c | 11 ++++++++---
libavfilter/dnn_filter_common.h | 11 +++++++++--
libavfilter/dnn_interface.h | 8 ++++++--
libavfilter/vf_derain.c | 2 +-
libavfilter/vf_dnn_classify.c | 2 +-
libavfilter/vf_dnn_detect.c | 2 +-
libavfilter/vf_dnn_processing.c | 2 +-
libavfilter/vf_sr.c | 2 +-
8 files changed, 28 insertions(+), 12 deletions(-)
diff --git a/libavfilter/dnn/dnn_interface.c b/libavfilter/dnn/dnn_interface.c
index b56c22e4c7..dc1593821d 100644
--- a/libavfilter/dnn/dnn_interface.c
+++ b/libavfilter/dnn/dnn_interface.c
@@ -120,11 +120,16 @@ void *ff_dnn_child_next(DnnContext *obj, void *prev) {
return NULL;
}
-const AVClass *ff_dnn_child_class_iterate(void **iter)
+const AVClass *ff_dnn_child_class_iterate_with_mask(void **iter, uint32_t backend_mask)
{
- uintptr_t i = (uintptr_t) *iter;
+ for (uintptr_t i = (uintptr_t)*iter; i < FF_ARRAY_ELEMS(dnn_backend_info_list); i++) {
+ if (i > 0) {
+ const DNNModule *module = dnn_backend_info_list[i].module;
+
+ if (!(module->type & backend_mask))
+ continue;
+ }
- if (i < FF_ARRAY_ELEMS(dnn_backend_info_list)) {
*iter = (void *)(i + 1);
return dnn_backend_info_list[i].class;
}
diff --git a/libavfilter/dnn_filter_common.h b/libavfilter/dnn_filter_common.h
index b52b55a90d..42a4719997 100644
--- a/libavfilter/dnn_filter_common.h
+++ b/libavfilter/dnn_filter_common.h
@@ -26,6 +26,12 @@
#include "dnn_interface.h"
+#define DNN_FILTER_CHILD_CLASS_ITERATE(name, backend_mask) \
+ static const AVClass *name##_child_class_iterate(void **iter) \
+ { \
+ return ff_dnn_child_class_iterate_with_mask(iter, (backend_mask)); \
+ }
+
#define AVFILTER_DNN_DEFINE_CLASS_EXT(name, desc, options) \
static const AVClass name##_class = { \
.class_name = desc, \
@@ -34,10 +40,11 @@
.version = LIBAVUTIL_VERSION_INT, \
.category = AV_CLASS_CATEGORY_FILTER, \
.child_next = ff_dnn_filter_child_next, \
- .child_class_iterate = ff_dnn_child_class_iterate, \
+ .child_class_iterate = name##_child_class_iterate, \
}
-#define AVFILTER_DNN_DEFINE_CLASS(fname) \
+#define AVFILTER_DNN_DEFINE_CLASS(fname, backend_mask) \
+ DNN_FILTER_CHILD_CLASS_ITERATE(fname, backend_mask) \
AVFILTER_DNN_DEFINE_CLASS_EXT(fname, #fname, fname##_options)
void *ff_dnn_filter_child_next(void *obj, void *prev);
diff --git a/libavfilter/dnn_interface.h b/libavfilter/dnn_interface.h
index dd603534b2..697b9f3318 100644
--- a/libavfilter/dnn_interface.h
+++ b/libavfilter/dnn_interface.h
@@ -32,7 +32,11 @@
#define DNN_GENERIC_ERROR FFERRTAG('D','N','N','!')
-typedef enum {DNN_TF = 1, DNN_OV, DNN_TH} DNNBackendType;
+typedef enum {
+ DNN_TF = 1,
+ DNN_OV = 1 << 1,
+ DNN_TH = 1 << 2
+} DNNBackendType;
typedef enum {DNN_FLOAT = 1, DNN_UINT8 = 4} DNNDataType;
@@ -190,7 +194,7 @@ const DNNModule *ff_get_dnn_module(DNNBackendType backend_type, void *log_ctx);
void ff_dnn_init_child_class(DnnContext *ctx);
void *ff_dnn_child_next(DnnContext *obj, void *prev);
-const AVClass *ff_dnn_child_class_iterate(void **iter);
+const AVClass *ff_dnn_child_class_iterate_with_mask(void **iter, uint32_t backend_mask);
static inline int dnn_get_width_idx_by_layout(DNNLayout layout)
{
diff --git a/libavfilter/vf_derain.c b/libavfilter/vf_derain.c
index 7f665b73ab..5cefca6b55 100644
--- a/libavfilter/vf_derain.c
+++ b/libavfilter/vf_derain.c
@@ -49,7 +49,7 @@ static const AVOption derain_options[] = {
{ NULL }
};
-AVFILTER_DNN_DEFINE_CLASS(derain);
+AVFILTER_DNN_DEFINE_CLASS(derain, DNN_TF);
static int filter_frame(AVFilterLink *inlink, AVFrame *in)
{
diff --git a/libavfilter/vf_dnn_classify.c b/libavfilter/vf_dnn_classify.c
index 965779a8ab..f6d3678796 100644
--- a/libavfilter/vf_dnn_classify.c
+++ b/libavfilter/vf_dnn_classify.c
@@ -56,7 +56,7 @@ static const AVOption dnn_classify_options[] = {
{ NULL }
};
-AVFILTER_DNN_DEFINE_CLASS(dnn_classify);
+AVFILTER_DNN_DEFINE_CLASS(dnn_classify, DNN_OV);
static int dnn_classify_post_proc(AVFrame *frame, DNNData *output, uint32_t bbox_index, AVFilterContext *filter_ctx)
{
diff --git a/libavfilter/vf_dnn_detect.c b/libavfilter/vf_dnn_detect.c
index 926966368a..b4eee06fe7 100644
--- a/libavfilter/vf_dnn_detect.c
+++ b/libavfilter/vf_dnn_detect.c
@@ -84,7 +84,7 @@ static const AVOption dnn_detect_options[] = {
{ NULL }
};
-AVFILTER_DNN_DEFINE_CLASS(dnn_detect);
+AVFILTER_DNN_DEFINE_CLASS(dnn_detect, DNN_TF | DNN_OV);
static inline float sigmoid(float x) {
return 1.f / (1.f + exp(-x));
diff --git a/libavfilter/vf_dnn_processing.c b/libavfilter/vf_dnn_processing.c
index 9a1dd2a356..7c0f84ec80 100644
--- a/libavfilter/vf_dnn_processing.c
+++ b/libavfilter/vf_dnn_processing.c
@@ -57,7 +57,7 @@ static const AVOption dnn_processing_options[] = {
{ NULL }
};
-AVFILTER_DNN_DEFINE_CLASS(dnn_processing);
+AVFILTER_DNN_DEFINE_CLASS(dnn_processing, DNN_TF | DNN_OV | DNN_TH);
static av_cold int init(AVFilterContext *context)
{
diff --git a/libavfilter/vf_sr.c b/libavfilter/vf_sr.c
index f14c0c0cd3..3bfca7f042 100644
--- a/libavfilter/vf_sr.c
+++ b/libavfilter/vf_sr.c
@@ -53,7 +53,7 @@ static const AVOption sr_options[] = {
{ NULL }
};
-AVFILTER_DNN_DEFINE_CLASS(sr);
+AVFILTER_DNN_DEFINE_CLASS(sr, DNN_TF);
static av_cold int init(AVFilterContext *context)
{
--
2.34.1
More information about the ffmpeg-devel
mailing list