aboutsummaryrefslogtreecommitdiffstats
path: root/libavutil/eval.c
diff options
context:
space:
mode:
authorGyan Doshi <ffmpeg@gyani.pro>2019-11-17 11:02:10 +0530
committerGyan Doshi <ffmpeg@gyani.pro>2019-11-17 11:07:05 +0530
commit1c23abc88fef0a0c8486bf0ec3594f8e2d26d83f (patch)
treedf57ffda1f5b410dc8bdac004d3340e2814858a8 /libavutil/eval.c
parent487e7e9670032465e1850d54fd58c5248aa50be9 (diff)
downloadffmpeg-1c23abc88fef0a0c8486bf0ec3594f8e2d26d83f.tar.gz
avutil/eval: add function to track variable use
1)Some filters allow cross-referenced expressions e.g. x=y+10. In such cases, filters evaluate expressions multiple times for successful evaluation of all expressions. If the expression for one or more variables contains a RNG, the result may vary across evaluation leading to inconsistent values across the cross-referenced expressions. 2)A related case is circular expressions e.g. x=y+10 and y=x+10 which cannot be succesfully resolved. 3)Certain filter variables may only be applicable in specific eval modes and lead to a failure of evaluation in other modes e.g. pts is only relevant for frame eval mode. At present, there is no reliable means to identify these occurrences and thus the error messages provided are broad or inaccurate. The helper function introduced - av_expr_count_vars - allows developers to identify the use and count of variables in expressions and thus tailor the error message, allow for a graceful fallback and/or decide evaluation order.
Diffstat (limited to 'libavutil/eval.c')
-rw-r--r--libavutil/eval.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/libavutil/eval.c b/libavutil/eval.c
index 48832979e2..62d2ae938b 100644
--- a/libavutil/eval.c
+++ b/libavutil/eval.c
@@ -735,6 +735,22 @@ end:
return ret;
}
+int av_expr_count_vars(AVExpr *e, unsigned *counter, int size)
+{
+ int i;
+
+ if (!e || !counter || !size)
+ return AVERROR(EINVAL);
+
+ for (i = 0; e->type != e_const && i < 3 && e->param[i]; i++)
+ av_expr_count_vars(e->param[i], counter, size);
+
+ if (e->type == e_const && e->a.const_index < size)
+ counter[e->a.const_index]++;
+
+ return 0;
+}
+
double av_expr_eval(AVExpr *e, const double *const_values, void *opaque)
{
Parser p = { 0 };