diff --git a/doc/filters.texi b/doc/filters.texi index 2a089bef847e2d20e995dbc0a82907e1962a1c89..446e1243dbcf2ca068716e3d3774558d2e2370e7 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 ebd9cc929c45ccb6eaab6d69ef8dccb155663c47..d2d31653a99427ec57e016c10dd7db261f8e29c5 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);