[FFmpeg-devel] [PATCH] avutil/avstring: support asymmetric escaping in av_get_token()

Michael Niedermayer michaelni at gmx.at
Thu Sep 11 00:15:08 CEST 2014


This avoids having to construct filter command lines by trial and error
or specialized tools.

Signed-off-by: Michael Niedermayer <michaelni at 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



More information about the ffmpeg-devel mailing list