This avoids having to construct filter command lines by trial and error or specialized tools.
Signed-off-by: Michael Niedermayer <michae...@gmx.at> --- doc/filters.texi | 2 +- libavutil/avstring.c | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index bb486ea..d30e985 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -4196,7 +4196,7 @@ DS=1.0 # display start DE=10.0 # display end FID=1.5 # fade in duration FOD=5 # fade out duration -ffplay -f lavfi "color,drawtext=text=TEST:fontsize=50:fontfile=FreeSerif.ttf:fontcolor_expr=ff0000%@{eif\\\\: clip(255*(1*between(t\\, $DS + $FID\\, $DE - $FOD) + ((t - $DS)/$FID)*between(t\\, $DS\\, $DS + $FID) + (-(t - $DE)/$FOD)*between(t\\, $DE - $FOD\\, $DE) )\\, 0\\, 255) \\\\: x\\\\: 2 @}" +ffplay -f lavfi "color,drawtext=text=TEST:fontsize=50:fontfile=FreeSerif.ttf:fontcolor_expr=ff0000%@{eif: clip(255*(1*between(t, $DS + $FID, $DE - $FOD) + ((t - $DS)/$FID)*between(t, $DS, $DS + $FID) + (-(t - $DE)/$FOD)*between(t, $DE - $FOD, $DE) ), 0, 255) : x: 2 @}" @end example @end itemize diff --git a/libavutil/avstring.c b/libavutil/avstring.c index fd010e4..ff7a98e 100644 --- a/libavutil/avstring.c +++ b/libavutil/avstring.c @@ -151,11 +151,13 @@ char *av_get_token(const char **buf, const char *term) char *out = av_malloc(strlen(*buf) + 1); char *ret = out, *end = out; const char *p = *buf; + char stack[256]; + int stack_index = 0; if (!out) return NULL; p += strspn(p, WHITESPACES); - while (*p && !strspn(p, term)) { + while (*p && (stack_index || !strspn(p, term))) { char c = *p++; if (c == '\\' && *p) { *out++ = *p++; @@ -168,6 +170,20 @@ char *av_get_token(const char **buf, const char *term) end = out; } } else { + if (stack_index < FF_ARRAY_ELEMS(stack)) { + if (c == '(') { + stack[stack_index++] = ')'; + } else if (c == '{') { + stack[stack_index++] = '}'; + } else if (stack_index && stack[stack_index - 1] == c) { + stack_index--; + } else if (c == ')' || c == '}') { + av_log(NULL, AV_LOG_WARNING, "Mismatching brackets, expected %c but got %c in \'%s\'\n", + stack_index ? stack[stack_index - 1] : ' ', c, *buf); + } + } else + av_log(NULL, AV_LOG_WARNING, "Brackets nested too deeply in \'%s\'\n", + *buf); *out++ = c; } } -- 1.7.9.5 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel