| 194 | } |
| 195 | |
| 196 | static double eval_expr(Parser *p, AVExpr *e) |
| 197 | { |
| 198 | switch (e->type) { |
| 199 | case e_value: return e->value; |
| 200 | case e_const: return e->value * p->const_values[e->const_index]; |
| 201 | case e_func0: return e->value * e->func0(eval_expr(p, e->param[0])); |
| 202 | case e_func1: return e->value * e->func1(p->opaque, eval_expr(p, e->param[0])); |
| 203 | case e_func2: return e->value * e->func2(p->opaque, eval_expr(p, e->param[0]), eval_expr(p, e->param[1])); |
| 204 | case e_squish: return e->value/(1+exp(4*eval_expr(p, e->param[0]))); |
| 205 | case e_gauss: { double d = eval_expr(p, e->param[0]); return e->value * exp(-d*d/2)/sqrt(2*M_PI); } |
| 206 | case e_ld: return e->value * p->var[av_clip(eval_expr(p, e->param[0]), 0, VARS-1)]; |
| 207 | case e_isnan: return e->value * !!isnan(eval_expr(p, e->param[0])); |
| 208 | case e_isinf: return e->value * !!isinf(eval_expr(p, e->param[0])); |
| 209 | case e_floor: return e->value * floor(eval_expr(p, e->param[0])); |
| 210 | case e_ceil : return e->value * ceil (eval_expr(p, e->param[0])); |
| 211 | case e_trunc: return e->value * trunc(eval_expr(p, e->param[0])); |
| 212 | case e_round: return e->value * round(eval_expr(p, e->param[0])); |
| 213 | case e_sgn: return e->value * FFDIFFSIGN(eval_expr(p, e->param[0]), 0); |
| 214 | case e_sqrt: return e->value * sqrt (eval_expr(p, e->param[0])); |
| 215 | case e_not: return e->value * (eval_expr(p, e->param[0]) == 0); |
| 216 | case e_if: return e->value * (eval_expr(p, e->param[0]) ? eval_expr(p, e->param[1]) : |
| 217 | e->param[2] ? eval_expr(p, e->param[2]) : 0); |
| 218 | case e_ifnot: return e->value * (!eval_expr(p, e->param[0]) ? eval_expr(p, e->param[1]) : |
| 219 | e->param[2] ? eval_expr(p, e->param[2]) : 0); |
| 220 | case e_clip: { |
| 221 | double x = eval_expr(p, e->param[0]); |
| 222 | double min = eval_expr(p, e->param[1]), max = eval_expr(p, e->param[2]); |
| 223 | if (isnan(min) || isnan(max) || isnan(x) || min > max) |
| 224 | return NAN; |
| 225 | return e->value * av_clipd(eval_expr(p, e->param[0]), min, max); |
| 226 | } |
| 227 | case e_between: { |
| 228 | double d = eval_expr(p, e->param[0]); |
| 229 | return e->value * (d >= eval_expr(p, e->param[1]) && |
| 230 | d <= eval_expr(p, e->param[2])); |
| 231 | } |
| 232 | case e_lerp: { |
| 233 | double v0 = eval_expr(p, e->param[0]); |
| 234 | double v1 = eval_expr(p, e->param[1]); |
| 235 | double f = eval_expr(p, e->param[2]); |
| 236 | return e->value * (v0 + (v1 - v0) * f); |
| 237 | } |
| 238 | case e_print: { |
| 239 | double x = eval_expr(p, e->param[0]); |
| 240 | int level = e->param[1] ? av_clip(eval_expr(p, e->param[1]), INT_MIN, INT_MAX) : AV_LOG_INFO; |
| 241 | av_log(p, level, "%f\n", x); |
| 242 | return e->value * x; |
| 243 | } |
| 244 | |
| 245 | #define COMPUTE_NEXT_RANDOM() \ |
| 246 | int idx = av_clip(eval_expr(p, e->param[0]), 0, VARS-1); \ |
| 247 | FFSFC64 *s = p->prng_state + idx; \ |
| 248 | uint64_t r; \ |
| 249 | \ |
| 250 | if (!s->counter) { \ |
| 251 | r = isnan(p->var[idx]) ? 0 : p->var[idx]; \ |
| 252 | ff_sfc64_init(s, r, r, r, 12); \ |
| 253 | } \ |