[FFmpeg-devel] [PATCH 2/3] avfilter/vf_geq: use per-thread state for expression evaluation

Marton Balint cus at passwd.hu
Sat Dec 28 16:46:24 EET 2019


Fixes ticket #7528.

Signed-off-by: Marton Balint <cus at passwd.hu>
---
 libavfilter/vf_geq.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/libavfilter/vf_geq.c b/libavfilter/vf_geq.c
index 2905efae24..417b92222d 100644
--- a/libavfilter/vf_geq.c
+++ b/libavfilter/vf_geq.c
@@ -377,6 +377,7 @@ static int slice_geq_filter(AVFilterContext *ctx, void *arg, int jobnr, int nb_j
     int x, y;
     uint8_t *ptr;
     uint16_t *ptr16;
+    AVExprState *state = av_expr_state_alloc();
 
     double values[VAR_VARS_NB];
     values[VAR_W] = geq->values[VAR_W];
@@ -386,6 +387,9 @@ static int slice_geq_filter(AVFilterContext *ctx, void *arg, int jobnr, int nb_j
     values[VAR_SH] = geq->values[VAR_SH];
     values[VAR_T] = geq->values[VAR_T];
 
+    if (!state)
+        return AVERROR(ENOMEM);
+
     if (geq->bps == 8) {
         for (y = slice_start; y < slice_end; y++) {
             ptr = geq->dst + linesize * y;
@@ -393,7 +397,7 @@ static int slice_geq_filter(AVFilterContext *ctx, void *arg, int jobnr, int nb_j
 
             for (x = 0; x < width; x++) {
                 values[VAR_X] = x;
-                ptr[x] = av_expr_eval(geq->e[plane], values, geq);
+                ptr[x] = av_expr_eval2(geq->e[plane], state, values, geq);
             }
             ptr += linesize;
         }
@@ -404,10 +408,11 @@ static int slice_geq_filter(AVFilterContext *ctx, void *arg, int jobnr, int nb_j
             values[VAR_Y] = y;
             for (x = 0; x < width; x++) {
                 values[VAR_X] = x;
-                ptr16[x] = av_expr_eval(geq->e[plane], values, geq);
+                ptr16[x] = av_expr_eval2(geq->e[plane], state, values, geq);
             }
         }
     }
+    av_expr_state_free(&state);
 
     return 0;
 }
-- 
2.16.4



More information about the ffmpeg-devel mailing list