diff --git a/doc/filters.texi b/doc/filters.texi index 2a089bef84..446e1243db 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -76,6 +76,12 @@ In a complete filterchain all the unlabelled filter input and output pads must be connected. A filtergraph is considered valid if all the filter input and output pads of all the filterchains are connected. +Libavfilter will automatically insert scale filters where format +conversion is required. It is possible to specify swscale flags +for those automatically inserted scalers by prepending +@code{sws_flags=@var{flags};} +to the filtergraph description. + Follows a BNF description for the filtergraph syntax: @example @var{NAME} ::= sequence of alphanumeric characters and '_' @@ -84,7 +90,7 @@ Follows a BNF description for the filtergraph syntax: @var{FILTER_ARGUMENTS} ::= sequence of chars (eventually quoted) @var{FILTER} ::= [@var{LINKNAMES}] @var{NAME} ["=" @var{ARGUMENTS}] [@var{LINKNAMES}] @var{FILTERCHAIN} ::= @var{FILTER} [,@var{FILTERCHAIN}] -@var{FILTERGRAPH} ::= @var{FILTERCHAIN} [;@var{FILTERGRAPH}] +@var{FILTERGRAPH} ::= [sws_flags=@var{flags};] @var{FILTERCHAIN} [;@var{FILTERGRAPH}] @end example @c man end FILTERGRAPH DESCRIPTION diff --git a/libavfilter/graphparser.c b/libavfilter/graphparser.c index ebd9cc929c..d2d31653a9 100644 --- a/libavfilter/graphparser.c +++ b/libavfilter/graphparser.c @@ -349,6 +349,30 @@ static int parse_outputs(const char **buf, AVFilterInOut **curr_inputs, #else #define log_ctx NULL #endif + +static int parse_sws_flags(const char **buf, AVFilterGraph *graph) +{ + char *p = strchr(*buf, ';'); + + if (strncmp(*buf, "sws_flags=", 10)) + return 0; + + if (!p) { + av_log(log_ctx, AV_LOG_ERROR, "sws_flags not terminated with ';'.\n"); + return AVERROR(EINVAL); + } + + *buf += 4; // keep the 'flags=' part + + av_freep(&graph->scale_sws_opts); + if (!(graph->scale_sws_opts = av_mallocz(p - *buf + 1))) + return AVERROR(ENOMEM); + av_strlcpy(graph->scale_sws_opts, *buf, p - *buf + 1); + + *buf = p + 1; + return 0; +} + int avfilter_graph_parse2(AVFilterGraph *graph, const char *filters, AVFilterInOut **inputs, AVFilterInOut **outputs) @@ -358,6 +382,11 @@ int avfilter_graph_parse2(AVFilterGraph *graph, const char *filters, AVFilterInOut *curr_inputs = NULL, *open_inputs = NULL, *open_outputs = NULL; + filters += strspn(filters, WHITESPACES); + + if ((ret = parse_sws_flags(&filters, graph)) < 0) + goto fail; + do { AVFilterContext *filter; filters += strspn(filters, WHITESPACES);