]> git.sesse.net Git - ffmpeg/blobdiff - libavutil/eval.c
base64: more thorough decode tests.
[ffmpeg] / libavutil / eval.c
index 3a8b60d5052d4fe0926c7ffafe89de02670bb68d..2ee3965e7c11ecc74cd3cb2f3084b7128e3a06ee 100644 (file)
@@ -136,6 +136,7 @@ struct AVExpr {
         e_pow, e_mul, e_div, e_add,
         e_last, e_st, e_while, e_floor, e_ceil, e_trunc,
         e_sqrt, e_not, e_random, e_hypot, e_gcd,
+        e_if, e_ifnot,
     } type;
     double value; // is sign in other types
     union {
@@ -165,6 +166,8 @@ static double eval_expr(Parser *p, AVExpr *e)
         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_not:    return e->value * (eval_expr(p, e->param[0]) == 0);
+        case e_if:     return e->value * ( eval_expr(p, e->param[0]) ? eval_expr(p, e->param[1]) : 0);
+        case e_ifnot:  return e->value * (!eval_expr(p, e->param[0]) ? eval_expr(p, e->param[1]) : 0);
         case e_random:{
             int idx= av_clip(eval_expr(p, e->param[0]), 0, VARS-1);
             uint64_t r= isnan(p->var[idx]) ? 0 : p->var[idx];
@@ -324,6 +327,8 @@ static int parse_primary(AVExpr **e, Parser *p)
     else if (strmatch(next, "random")) d->type = e_random;
     else if (strmatch(next, "hypot" )) d->type = e_hypot;
     else if (strmatch(next, "gcd"   )) d->type = e_gcd;
+    else if (strmatch(next, "if"    )) d->type = e_if;
+    else if (strmatch(next, "ifnot" )) d->type = e_ifnot;
     else {
         for (i=0; p->func1_names && p->func1_names[i]; i++) {
             if (strmatch(next, p->func1_names[i])) {
@@ -579,6 +584,7 @@ int av_expr_parse_and_eval(double *d, const char *s,
 }
 
 #if FF_API_OLD_EVAL_NAMES
+// LCOV_EXCL_START
 int av_parse_expr(AVExpr **expr, const char *s,
                   const char * const *const_names,
                   const char * const *func1_names, double (* const *funcs1)(void *, double),
@@ -608,9 +614,11 @@ void av_free_expr(AVExpr *e)
 {
     av_expr_free(e);
 }
+// LCOV_EXCL_STOP
 #endif /* FF_API_OLD_EVAL_NAMES */
 
 #ifdef TEST
+// LCOV_EXCL_START
 #undef printf
 #include <string.h>
 
@@ -687,6 +695,9 @@ int main(int argc, char **argv)
         "pow(PI,1.23)",
         "PI^1.23",
         "pow(-1,1.23)",
+        "if(1, 2)",
+        "ifnot(0, 23)",
+        "ifnot(1, NaN) + if(0, 1)",
         NULL
     };
 
@@ -723,4 +734,5 @@ int main(int argc, char **argv)
 
     return 0;
 }
+// LCOV_EXCL_STOP
 #endif