[FFmpeg-devel] [PATCH 1/5] avfilter/avfilter: Add avfilter_alloc() and avfilter_query_formats() for initializing filters without a graph

Soft Works softworkz at hotmail.com
Wed Oct 13 07:49:55 EEST 2021


The purpose of these additions is for being able to programatically retrieve
the supported formats of a filter for each input and output without adding
the filter to a graph and creating connections.

Signed-off-by: softworkz <softworkz at hotmail.com>
---
 doc/APIchanges              |  3 +++
 libavfilter/avfilter.c      |  4 ++--
 libavfilter/avfilter.h      | 22 ++++++++++++++++++++++
 libavfilter/avfiltergraph.c | 18 ++++++++++++++----
 libavfilter/version.h       |  2 +-
 5 files changed, 42 insertions(+), 7 deletions(-)

diff --git a/doc/APIchanges b/doc/APIchanges
index 7b267a79ac..903de43365 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -14,6 +14,9 @@ libavutil:     2021-04-27
 
 API changes, most recent first:
 
+2021-10-12 - xxxxxxxxxx - lavf 8.13.100 - avfilter.h
+  Add avfilter_alloc() and avfilter_query_formats().
+
 2021-09-21 - xxxxxxxxxx - lavu 57.7.100 - pixfmt.h
   Add AV_PIX_FMT_X2BGR10.
 
diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c
index 7362bcdab5..645af2cb11 100644
--- a/libavfilter/avfilter.c
+++ b/libavfilter/avfilter.c
@@ -769,12 +769,12 @@ void avfilter_free(AVFilterContext *filter)
 
     for (i = 0; i < filter->nb_inputs; i++) {
         free_link(filter->inputs[i]);
-        if (filter->input_pads[i].flags  & AVFILTERPAD_FLAG_FREE_NAME)
+        if (filter->input_pads && filter->input_pads[i].flags  & AVFILTERPAD_FLAG_FREE_NAME)
             av_freep(&filter->input_pads[i].name);
     }
     for (i = 0; i < filter->nb_outputs; i++) {
         free_link(filter->outputs[i]);
-        if (filter->output_pads[i].flags & AVFILTERPAD_FLAG_FREE_NAME)
+        if (filter->output_pads && filter->output_pads[i].flags & AVFILTERPAD_FLAG_FREE_NAME)
             av_freep(&filter->output_pads[i].name);
     }
 
diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h
index f7208754a7..24119993d6 100644
--- a/libavfilter/avfilter.h
+++ b/libavfilter/avfilter.h
@@ -911,6 +911,28 @@ typedef struct AVFilterGraph {
     unsigned disable_auto_convert;
 } AVFilterGraph;
 
+/**
+ * Allocate a new filter context and return it.
+ *
+ * @param filter what filter to create an instance of
+ * @param inst_name name to give to the new filter context
+ *
+ * @return newly created filter context or NULL on failure
+ *
+ * @note for adding a filter to a filtergraph, use
+ *       avfilter_graph_alloc_filter() instead.
+ */
+AVFilterContext *avfilter_alloc(const AVFilter *filter, const char *inst_name);
+
+/**
+ * Query the formats of a filter.
+ *
+ * @param filter the filter context
+ *
+ * @return 0 on success
+ */
+int avfilter_query_formats(AVFilterContext *filter);
+
 /**
  * Allocate a filter graph.
  *
diff --git a/libavfilter/avfiltergraph.c b/libavfilter/avfiltergraph.c
index b8b432e98b..64379782fc 100644
--- a/libavfilter/avfiltergraph.c
+++ b/libavfilter/avfiltergraph.c
@@ -81,6 +81,11 @@ int ff_graph_thread_init(AVFilterGraph *graph)
 }
 #endif
 
+AVFilterContext *avfilter_alloc(const AVFilter *filter, const char *inst_name)
+{
+    return ff_filter_alloc(filter, inst_name);
+}
+
 AVFilterGraph *avfilter_graph_alloc(void)
 {
     AVFilterGraph *ret = av_mallocz(sizeof(*ret));
@@ -395,6 +400,14 @@ static int formats_declared(AVFilterContext *f)
     return 1;
 }
 
+int avfilter_query_formats(AVFilterContext *filter)
+{
+    if (filter->filter->formats_state == FF_FILTER_FORMATS_QUERY_FUNC)
+        return filter_query_formats(filter);
+
+    return ff_default_query_formats(filter);
+}
+
 /**
  * Perform one round of query_formats() and merging formats lists on the
  * filter graph.
@@ -418,10 +431,7 @@ static int query_formats(AVFilterGraph *graph, void *log_ctx)
         AVFilterContext *f = graph->filters[i];
         if (formats_declared(f))
             continue;
-        if (f->filter->formats_state == FF_FILTER_FORMATS_QUERY_FUNC)
-            ret = filter_query_formats(f);
-        else
-            ret = ff_default_query_formats(f);
+        ret = avfilter_query_formats(f);
         if (ret < 0 && ret != AVERROR(EAGAIN))
             return ret;
         /* note: EAGAIN could indicate a partial success, not counted yet */
diff --git a/libavfilter/version.h b/libavfilter/version.h
index e4c25b9225..dca5aacb45 100644
--- a/libavfilter/version.h
+++ b/libavfilter/version.h
@@ -30,7 +30,7 @@
 #include "libavutil/version.h"
 
 #define LIBAVFILTER_VERSION_MAJOR   8
-#define LIBAVFILTER_VERSION_MINOR  12
+#define LIBAVFILTER_VERSION_MINOR  13
 #define LIBAVFILTER_VERSION_MICRO 100
 
 
-- 
2.30.2.windows.1



More information about the ffmpeg-devel mailing list