diff mbox series

[FFmpeg-devel] lavfi/graphparser: be more verbose when filtergraph parsing fails

Message ID 20230603100002.28358-1-anton@khirnov.net
State Accepted
Commit 4abf42ab96a8176b08d03791e3b155c7612f8145
Headers show
Series [FFmpeg-devel] lavfi/graphparser: be more verbose when filtergraph parsing fails | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Anton Khirnov June 3, 2023, 10 a.m. UTC
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.
---
 libavfilter/graphparser.c | 36 +++++++++++++++++++++++++++++++++++-
 1 file changed, 35 insertions(+), 1 deletion(-)
diff mbox series

Patch

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);