MCPcopy Create free account
hub / github.com/FFmpeg/FFmpeg / eval_expr

Function eval_expr

libavutil/eval.c:196–364  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

194}
195
196static 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 } \

Callers 1

av_expr_evalFunction · 0.70

Calls 7

floorFunction · 0.85
ceilFunction · 0.85
roundFunction · 0.85
av_logFunction · 0.85
av_gcdFunction · 0.85
hypotFunction · 0.85
truncFunction · 0.70

Tested by

no test coverage detected