diff options
author | Anton Khirnov <anton@khirnov.net> | 2023-01-17 10:51:57 +0100 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2023-02-12 10:17:26 +0100 |
commit | 4310b66b985e5d8f4463639c007d876e4439e7a9 (patch) | |
tree | 544c8bea4c7512fbcaf4e79cab41a9f64b9800f4 /libavfilter | |
parent | 80cf509e7315bd77aad4a0cce8dd15a85e6e6ed4 (diff) | |
download | ffmpeg-4310b66b985e5d8f4463639c007d876e4439e7a9.tar.gz |
lavfi/avfilter: track whether a filter has been initialized
Refuse to link uninitialized filters or initialize a filter twice.
Diffstat (limited to 'libavfilter')
-rw-r--r-- | libavfilter/avfilter.c | 12 | ||||
-rw-r--r-- | libavfilter/internal.h | 4 |
2 files changed, 16 insertions, 0 deletions
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, |