On Sun, 29 Dec 2019, Michael Niedermayer wrote:

On Sat, Dec 28, 2019 at 03:46:24PM +0100, Marton Balint wrote:
Fixes ticket #7528.

Signed-off-by: Marton Balint <c...@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);

a filter which adds random noise would get its seed reset on each frame and
slice with this, unless iam missing something.

The random values produced by random should be uncorrelatec between frame n and 
m when n!=m

I guess I can make one AVExprState for each thread and keep them during the lifetime of the filter. That would resolve the frame correlation, but not the slice correlation.

I don't see too many simple ways to deal with this:

1) accept slice correlation and keep the AVExprStates across executions

2) document that the number of filter threads has to be 1 if uncorrelated random is required

3) initialize the state with the line number at the beginning of each line, which is kind of ugly but would make the filter invariant of the thread count used.

Do you have something else in mind? Do you prefer any of these?

Thanks,
Marton
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to