This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

commit 5554d9d555c4f92492d0b86827e0075a78eb0df3
Author:     Michael Niedermayer <[email protected]>
AuthorDate: Thu Feb 26 17:39:24 2026 +0100
Commit:     Michael Niedermayer <[email protected]>
CommitDate: Tue Mar 3 03:28:37 2026 +0100

    avutil/eval: Store *prng_state / var only in root AVExpr
    
    AFter this, depth and the root element flag is stored in space
    needed for alignment and thus does not increase the AVExpr size
    
    Signed-off-by: Michael Niedermayer <[email protected]>
---
 libavutil/eval.c | 59 +++++++++++++++++++++++++++++++++++++-------------------
 1 file changed, 39 insertions(+), 20 deletions(-)

diff --git a/libavutil/eval.c b/libavutil/eval.c
index d47040bbfd..56123a3831 100644
--- a/libavutil/eval.c
+++ b/libavutil/eval.c
@@ -28,6 +28,7 @@
 
 #include <float.h>
 #include "attributes.h"
+#include "avassert.h"
 #include "avutil.h"
 #include "common.h"
 #include "eval.h"
@@ -157,29 +158,35 @@ static int strmatch(const char *s, const char *prefix)
     return !IS_IDENTIFIER_CHAR(s[i]);
 }
 
+enum {
+    e_value, e_const, e_func0, e_func1, e_func2,
+    e_squish, e_gauss, e_ld, e_isnan, e_isinf,
+    e_mod, e_max, e_min, e_eq, e_gt, e_gte, e_lte, e_lt,
+    e_pow, e_mul, e_div, e_add,
+    e_last, e_st, e_while, e_taylor, e_root, e_floor, e_ceil, e_trunc, e_round,
+    e_sqrt, e_not, e_random, e_hypot, e_gcd,
+    e_if, e_ifnot, e_print, e_bitand, e_bitor, e_between, e_clip, e_atan2, 
e_lerp,
+    e_sgn, e_randomi
+};
 struct AVExpr {
-    enum {
-        e_value, e_const, e_func0, e_func1, e_func2,
-        e_squish, e_gauss, e_ld, e_isnan, e_isinf,
-        e_mod, e_max, e_min, e_eq, e_gt, e_gte, e_lte, e_lt,
-        e_pow, e_mul, e_div, e_add,
-        e_last, e_st, e_while, e_taylor, e_root, e_floor, e_ceil, e_trunc, 
e_round,
-        e_sqrt, e_not, e_random, e_hypot, e_gcd,
-        e_if, e_ifnot, e_print, e_bitand, e_bitor, e_between, e_clip, e_atan2, 
e_lerp,
-        e_sgn, e_randomi
-    } type;
-    double value; // is sign in other types
+    unsigned char type;
+    unsigned char root;
+    short depth;
     int const_index;
+    double value; // is sign in other types
     union {
         double (*func0)(double);
         double (*func1)(void *, double);
         double (*func2)(void *, double, double);
     } ;
     struct AVExpr *param[3];
+};
+
+typedef struct {
+    AVExpr avexpr;
     double *var;
     FFSFC64 *prng_state;
-    int depth;
-};
+} AVExprRoot;
 
 static double etime(double v)
 {
@@ -364,8 +371,11 @@ void av_expr_free(AVExpr *e)
     av_expr_free(e->param[0]);
     av_expr_free(e->param[1]);
     av_expr_free(e->param[2]);
-    av_freep(&e->var);
-    av_freep(&e->prng_state);
+    if (e->root) {
+        AVExprRoot *r = (AVExprRoot*)e;
+        av_freep(&r->var);
+        av_freep(&r->prng_state);
+    }
     av_freep(&e);
 }
 
@@ -764,9 +774,16 @@ int av_expr_parse(AVExpr **expr, const char *s,
         ret = AVERROR(EINVAL);
         goto end;
     }
-    e->var= av_mallocz(sizeof(double) *VARS);
-    e->prng_state = av_mallocz(sizeof(*e->prng_state) *VARS);
-    if (!e->var || !e->prng_state) {
+    AVExprRoot *r = av_realloc(e, sizeof(*r));
+    if (!r) {
+        ret = AVERROR(ENOMEM);
+        goto end;
+    }
+    e = (AVExpr*)r;
+    e->root = 1;
+    r->var= av_mallocz(sizeof(double) *VARS);
+    r->prng_state = av_mallocz(sizeof(*r->prng_state) *VARS);
+    if (!r->var || !r->prng_state) {
         ret = AVERROR(ENOMEM);
         goto end;
     }
@@ -806,12 +823,14 @@ int av_expr_count_func(AVExpr *e, unsigned *counter, int 
size, int arg)
 
 double av_expr_eval(AVExpr *e, const double *const_values, void *opaque)
 {
+    av_assert1(e->root);
+    AVExprRoot *r = (AVExprRoot *)e;
     Parser p = {
         .class        = &eval_class,
         .const_values = const_values,
         .opaque       = opaque,
-        .var          = e->var,
-        .prng_state   = e->prng_state,
+        .var          = r->var,
+        .prng_state   = r->prng_state,
     };
 
     return eval_expr(&p, e);

_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to