eval: implement not() expression

pull/2/head
Stefano Sabatini 14 years ago committed by Anton Khirnov
parent 9bc393908a
commit 8cee38a298
  1. 8
      doc/eval.texi
  2. 2
      libavutil/avutil.h
  3. 8
      libavutil/eval.c
  4. 9
      tests/ref/fate/eval

@ -76,6 +76,9 @@ integer. For example, "trunc(-1.5)" is "-1.0".
@item sqrt(expr) @item sqrt(expr)
Compute the square root of @var{expr}. This is equivalent to Compute the square root of @var{expr}. This is equivalent to
"(@var{expr})^.5". "(@var{expr})^.5".
@item not(expr)
Return 1.0 if @var{expr} is zero, 0.0 otherwise.
@end table @end table
Note that: Note that:
@ -93,11 +96,6 @@ is equivalent to
A*B + not(A)*C A*B + not(A)*C
@end example @end example
When A evaluates to either 1 or 0, that is the same as
@example
A*B + eq(A,0)*C
@end example
In your C code, you can extend the list of unary and binary functions, In your C code, you can extend the list of unary and binary functions,
and define recognized constants, so that they are available for your and define recognized constants, so that they are available for your
expressions. expressions.

@ -41,7 +41,7 @@
#define LIBAVUTIL_VERSION_MAJOR 51 #define LIBAVUTIL_VERSION_MAJOR 51
#define LIBAVUTIL_VERSION_MINOR 10 #define LIBAVUTIL_VERSION_MINOR 10
#define LIBAVUTIL_VERSION_MICRO 1 #define LIBAVUTIL_VERSION_MICRO 2
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
LIBAVUTIL_VERSION_MINOR, \ LIBAVUTIL_VERSION_MINOR, \

@ -123,7 +123,7 @@ struct AVExpr {
e_mod, e_max, e_min, e_eq, e_gt, e_gte, e_mod, e_max, e_min, e_eq, e_gt, e_gte,
e_pow, e_mul, e_div, e_add, e_pow, e_mul, e_div, e_add,
e_last, e_st, e_while, e_floor, e_ceil, e_trunc, e_last, e_st, e_while, e_floor, e_ceil, e_trunc,
e_sqrt, e_sqrt, e_not,
} type; } type;
double value; // is sign in other types double value; // is sign in other types
union { union {
@ -151,6 +151,7 @@ static double eval_expr(Parser *p, AVExpr *e)
case e_ceil : return e->value * ceil (eval_expr(p, e->param[0])); case e_ceil : return e->value * ceil (eval_expr(p, e->param[0]));
case e_trunc: return e->value * trunc(eval_expr(p, e->param[0])); case e_trunc: return e->value * trunc(eval_expr(p, e->param[0]));
case e_sqrt: return e->value * sqrt (eval_expr(p, e->param[0])); case e_sqrt: return e->value * sqrt (eval_expr(p, e->param[0]));
case e_not: return e->value * eval_expr(p, e->param[0]) == 0;
case e_while: { case e_while: {
double d = NAN; double d = NAN;
while (eval_expr(p, e->param[0])) while (eval_expr(p, e->param[0]))
@ -286,6 +287,7 @@ static int parse_primary(AVExpr **e, Parser *p)
else if (strmatch(next, "ceil" )) d->type = e_ceil; else if (strmatch(next, "ceil" )) d->type = e_ceil;
else if (strmatch(next, "trunc" )) d->type = e_trunc; else if (strmatch(next, "trunc" )) d->type = e_trunc;
else if (strmatch(next, "sqrt" )) d->type = e_sqrt; else if (strmatch(next, "sqrt" )) d->type = e_sqrt;
else if (strmatch(next, "not" )) d->type = e_not;
else { else {
for (i=0; p->func1_names && p->func1_names[i]; i++) { for (i=0; p->func1_names && p->func1_names[i]; i++) {
if (strmatch(next, p->func1_names[i])) { if (strmatch(next, p->func1_names[i])) {
@ -454,6 +456,7 @@ static int verify_expr(AVExpr *e)
case e_ceil: case e_ceil:
case e_trunc: case e_trunc:
case e_sqrt: case e_sqrt:
case e_not:
return verify_expr(e->param[0]); return verify_expr(e->param[0]);
default: return verify_expr(e->param[0]) && verify_expr(e->param[1]); default: return verify_expr(e->param[0]) && verify_expr(e->param[1]);
} }
@ -606,6 +609,9 @@ int main(int argc, char **argv)
"ceil(-123.123)", "ceil(-123.123)",
"sqrt(1764)", "sqrt(1764)",
"sqrt(-1)", "sqrt(-1)",
"not(1)",
"not(NAN)",
"not(0)",
NULL NULL
}; };

@ -139,5 +139,14 @@ Evaluating 'sqrt(1764)'
Evaluating 'sqrt(-1)' Evaluating 'sqrt(-1)'
'sqrt(-1)' -> -nan 'sqrt(-1)' -> -nan
Evaluating 'not(1)'
'not(1)' -> 0.000000
Evaluating 'not(NAN)'
'not(NAN)' -> 0.000000
Evaluating 'not(0)'
'not(0)' -> 1.000000
12.700000 == 12.7 12.700000 == 12.7
0.931323 == 0.931322575 0.931323 == 0.931322575

Loading…
Cancel
Save