diff mbox series

[FFmpeg-devel,7/8] lavfi/graphparser: improve applying graph-level sws options

Message ID 20230108125811.17967-7-anton@khirnov.net
State Accepted
Commit ca67a783abc098653fb00a731f8cf5682aa614df
Headers show
Series [FFmpeg-devel,1/8] lavfi/vf_scale: allow passing options to swscale directly | 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 Jan. 8, 2023, 12:58 p.m. UTC
The current code will apply them if the options string does not contain
a 'flags' substring, and will do so by appending the graph-level option
string to the filter option string (with the standard ':' separator).
This is flawed in at least the following ways:
- naive substring matching without actually parsing the options string
  may lead to false positives (e.g. flags are specified by shorthand)
  and false negatives (e.g. the 'flags' substring is not actually the
  option name)
- graph-level sws options are not limited to flags, but may set
  arbitrary sws options

This commit simply applies the graph-level options with
av_set_options_string() and lets them be overridden as desired by the
user-specified filter options (if any). This is also shorter and avoids
extra string handling.
---
 libavfilter/graphparser.c | 18 ++++++------------
 1 file changed, 6 insertions(+), 12 deletions(-)
diff mbox series

Patch

diff --git a/libavfilter/graphparser.c b/libavfilter/graphparser.c
index 1385c3ae71..c8b0af5aba 100644
--- a/libavfilter/graphparser.c
+++ b/libavfilter/graphparser.c
@@ -25,6 +25,8 @@ 
 
 #include "libavutil/avstring.h"
 #include "libavutil/mem.h"
+#include "libavutil/opt.h"
+
 #include "avfilter.h"
 
 #define WHITESPACES " \n\t\r"
@@ -101,7 +103,6 @@  static int create_filter(AVFilterContext **filt_ctx, AVFilterGraph *ctx, int ind
     const AVFilter *filt;
     char name2[30];
     const char *inst_name = NULL, *filt_name = NULL;
-    char *tmp_args = NULL;
     int ret, k;
 
     av_strlcpy(name2, name, sizeof(name2));
@@ -136,16 +137,10 @@  static int create_filter(AVFilterContext **filt_ctx, AVFilterGraph *ctx, int ind
         return AVERROR(ENOMEM);
     }
 
-    if (!strcmp(filt_name, "scale") && (!args || !strstr(args, "flags")) &&
-        ctx->scale_sws_opts) {
-        if (args) {
-            tmp_args = av_asprintf("%s:%s",
-                    args, ctx->scale_sws_opts);
-            if (!tmp_args)
-                return AVERROR(ENOMEM);
-            args = tmp_args;
-        } else
-            args = ctx->scale_sws_opts;
+    if (!strcmp(filt_name, "scale") && ctx->scale_sws_opts) {
+        ret = av_set_options_string(*filt_ctx, ctx->scale_sws_opts, "=", ":");
+        if (ret < 0)
+            return ret;
     }
 
     ret = avfilter_init_str(*filt_ctx, args);
@@ -159,7 +154,6 @@  static int create_filter(AVFilterContext **filt_ctx, AVFilterGraph *ctx, int ind
         *filt_ctx = NULL;
     }
 
-    av_free(tmp_args);
     return ret;
 }