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

Reply via email to