[FFmpeg-cvslog] lavfi/avfilter: track whether a filter has been initialized

Anton Khirnov git at videolan.org
Sun Feb 12 11:49:02 EET 2023


ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Tue Jan 17 10:51:57 2023 +0100| [4310b66b985e5d8f4463639c007d876e4439e7a9] | committer: Anton Khirnov

lavfi/avfilter: track whether a filter has been initialized

Refuse to link uninitialized filters or initialize a filter twice.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=4310b66b985e5d8f4463639c007d876e4439e7a9
---

 libavfilter/avfilter.c | 12 ++++++++++++
 libavfilter/internal.h |  4 ++++
 2 files changed, 16 insertions(+)

diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c
index 2f9f962f29..ec83b691bf 100644
--- a/libavfilter/avfilter.c
+++ b/libavfilter/avfilter.c
@@ -158,6 +158,11 @@ int avfilter_link(AVFilterContext *src, unsigned srcpad,
         src->outputs[srcpad]      || dst->inputs[dstpad])
         return AVERROR(EINVAL);
 
+    if (!src->internal->initialized || !dst->internal->initialized) {
+        av_log(src, AV_LOG_ERROR, "Filters must be initialized before linking.\n");
+        return AVERROR(EINVAL);
+    }
+
     if (src->output_pads[srcpad].type != dst->input_pads[dstpad].type) {
         av_log(src, AV_LOG_ERROR,
                "Media type mismatch between the '%s' filter output pad %d (%s) and the '%s' filter input pad %d (%s)\n",
@@ -851,6 +856,11 @@ int avfilter_init_dict(AVFilterContext *ctx, AVDictionary **options)
 {
     int ret = 0;
 
+    if (ctx->internal->initialized) {
+        av_log(ctx, AV_LOG_ERROR, "Filter already initialized\n");
+        return AVERROR(EINVAL);
+    }
+
     ret = av_opt_set_dict2(ctx, options, AV_OPT_SEARCH_CHILDREN);
     if (ret < 0) {
         av_log(ctx, AV_LOG_ERROR, "Error applying generic filter options.\n");
@@ -877,6 +887,8 @@ int avfilter_init_dict(AVFilterContext *ctx, AVDictionary **options)
             return ret;
     }
 
+    ctx->internal->initialized = 1;
+
     return 0;
 }
 
diff --git a/libavfilter/internal.h b/libavfilter/internal.h
index 2ec41917f7..8b232a8d8f 100644
--- a/libavfilter/internal.h
+++ b/libavfilter/internal.h
@@ -137,6 +137,10 @@ struct AVFilterGraphInternal {
 
 struct AVFilterInternal {
     avfilter_execute_func *execute;
+
+    // 1 when avfilter_init_*() was successfully called on this filter
+    // 0 otherwise
+    int initialized;
 };
 
 static av_always_inline int ff_filter_execute(AVFilterContext *ctx, avfilter_action_func *func,



More information about the ffmpeg-cvslog mailing list