[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