| 837 | } |
| 838 | |
| 839 | int av_expr_parse_and_eval(double *d, const char *s, |
| 840 | const char * const *const_names, const double *const_values, |
| 841 | const char * const *func1_names, double (* const *funcs1)(void *, double), |
| 842 | const char * const *func2_names, double (* const *funcs2)(void *, double, double), |
| 843 | void *opaque, int log_offset, void *log_ctx) |
| 844 | { |
| 845 | AVExpr *e = NULL; |
| 846 | int ret = av_expr_parse(&e, s, const_names, func1_names, funcs1, func2_names, funcs2, log_offset, log_ctx); |
| 847 | |
| 848 | if (ret < 0) { |
| 849 | *d = NAN; |
| 850 | return ret; |
| 851 | } |
| 852 | *d = av_expr_eval(e, const_values, opaque); |
| 853 | av_expr_free(e); |
| 854 | return isnan(*d) ? AVERROR(EINVAL) : 0; |
| 855 | } |