aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2023-01-08 13:22:20 +0100
committerAnton Khirnov <anton@khirnov.net>2023-01-10 11:52:02 +0100
commitca67a783abc098653fb00a731f8cf5682aa614df (patch)
treeddbe0b74f63230e0e3a090dd2ba10b73fa8c37c2
parent1c18530e936e2cc20e932415ad9f290e952c9d25 (diff)
downloadffmpeg-ca67a783abc098653fb00a731f8cf5682aa614df.tar.gz
lavfi/graphparser: improve applying graph-level sws options
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.
-rw-r--r--libavfilter/graphparser.c18
1 files changed, 6 insertions, 12 deletions
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;
}