diff options
author | Anton Khirnov <anton@khirnov.net> | 2023-06-03 11:55:06 +0200 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2023-06-16 08:07:02 +0200 |
commit | 4abf42ab96a8176b08d03791e3b155c7612f8145 (patch) | |
tree | 7526f0fabb6b6228cde01fd87cadc3095825ca10 | |
parent | ca818ab51c437063b2559038aa5ab73dcffb4ff5 (diff) | |
download | ffmpeg-4abf42ab96a8176b08d03791e3b155c7612f8145.tar.gz |
lavfi/graphparser: be more verbose when filtergraph parsing fails
When an option could not be found, print its name and value. Note that
this is not done while applying the options in
avfilter_graph_segment_apply_opts() to give the caller the option of
handling the missing options in some other way.
-rw-r--r-- | libavfilter/graphparser.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/libavfilter/graphparser.c b/libavfilter/graphparser.c index 9f8acea2ac..96ef6b15bf 100644 --- a/libavfilter/graphparser.c +++ b/libavfilter/graphparser.c @@ -851,6 +851,32 @@ fail: return ret; } +// print an error message if some options were not found +static void log_unknown_opt(const AVFilterGraphSegment *seg) +{ + for (size_t i = 0; i < seg->nb_chains; i++) { + const AVFilterChain *ch = seg->chains[i]; + + for (size_t j = 0; j < ch->nb_filters; j++) { + const AVFilterParams *p = ch->filters[j]; + const AVDictionaryEntry *e; + + if (!p->filter) + continue; + + e = av_dict_iterate(p->opts, NULL); + + if (e) { + av_log(p->filter, AV_LOG_ERROR, + "Could not set non-existent option '%s' to value '%s'\n", + e->key, e->value); + return; + } + } + } + +} + int avfilter_graph_segment_apply(AVFilterGraphSegment *seg, int flags, AVFilterInOut **inputs, AVFilterInOut **outputs) @@ -868,6 +894,8 @@ int avfilter_graph_segment_apply(AVFilterGraphSegment *seg, int flags, ret = avfilter_graph_segment_apply_opts(seg, 0); if (ret < 0) { + if (ret == AVERROR_OPTION_NOT_FOUND) + log_unknown_opt(seg); av_log(seg->graph, AV_LOG_ERROR, "Error applying filter options\n"); return ret; } @@ -909,8 +937,11 @@ int avfilter_graph_parse_ptr(AVFilterGraph *graph, const char *filters, goto end; ret = avfilter_graph_segment_apply_opts(seg, 0); - if (ret < 0) + if (ret < 0) { + if (ret == AVERROR_OPTION_NOT_FOUND) + log_unknown_opt(seg); goto end; + } ret = avfilter_graph_segment_init(seg, 0); if (ret < 0) @@ -988,6 +1019,9 @@ end: avfilter_graph_segment_free(&seg); if (ret < 0) { + av_log(graph, AV_LOG_ERROR, "Error processing filtergraph: %s\n", + av_err2str(ret)); + while (graph->nb_filters) avfilter_free(graph->filters[0]); av_freep(&graph->filters); |