[FFmpeg-cvslog] avfilter/vf_xpsnr: Avoid array only one of whose elements is used

Andreas Rheinhardt git at videolan.org
Sun Jan 12 17:00:18 EET 2025


ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinhardt at outlook.com> | Thu Jan  9 17:42:47 2025 +0100| [e540381f910898100223b6927a47c14ff63f7a1b] | committer: Andreas Rheinhardt

avfilter/vf_xpsnr: Avoid array only one of whose elements is used

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=e540381f910898100223b6927a47c14ff63f7a1b
---

 libavfilter/vf_xpsnr.c | 45 +++++++++++++++++----------------------------
 1 file changed, 17 insertions(+), 28 deletions(-)

diff --git a/libavfilter/vf_xpsnr.c b/libavfilter/vf_xpsnr.c
index 83f3343d12..1b2c2a7c2c 100644
--- a/libavfilter/vf_xpsnr.c
+++ b/libavfilter/vf_xpsnr.c
@@ -60,9 +60,9 @@ typedef struct XPSNRContext {
     /* XPSNR specific variables */
     double          *sse_luma;
     double          *weights;
+    int16_t         *buf_org_m1;
+    int16_t         *buf_org_m2;
     int16_t         *buf_org   [3];
-    int16_t         *buf_org_m1[3];
-    int16_t         *buf_org_m2[3];
     int16_t         *buf_rec   [3];
     uint64_t        max_error_64;
     double          sum_wdist [3];
@@ -266,8 +266,8 @@ static inline double get_avg_xpsnr (const double sqrt_wsse_val,  const double su
     return sum_xpsnr_val / (double) num_frames_64; /* older log-domain average */
 }
 
-static int get_wsse(AVFilterContext *ctx, int16_t **org, int16_t **org_m1, int16_t **org_m2, int16_t **rec,
-                    uint64_t *const wsse64)
+static int get_wsse(AVFilterContext *ctx, int16_t **org, int16_t *org_m1,
+                    int16_t *org_m2, int16_t **rec, uint64_t *const wsse64)
 {
     XPSNRContext *const  s = ctx->priv;
     const uint32_t       w = s->plane_width [0]; /* luma image width in pixels */
@@ -299,8 +299,6 @@ static int get_wsse(AVFilterContext *ctx, int16_t **org, int16_t **org_m1, int16
         const uint32_t s_org = stride_org[0] / s->bpp;
         const int16_t *p_rec = rec[0];
         const uint32_t s_rec = s->plane_width[0];
-        int16_t    *p_org_m1 = org_m1[0]; /* pixel  */
-        int16_t    *p_org_m2 = org_m2[0]; /* memory */
         double     wsse_luma = 0.0;
 
         for (y = 0; y < h; y += b) { /* calculate block SSE and perceptual weights */
@@ -311,7 +309,8 @@ static int get_wsse(AVFilterContext *ctx, int16_t **org, int16_t **org_m1, int16
                 double ms_act = 1.0, ms_act_prev = 0.0;
 
                 sse_luma[idx_blk] = calc_squared_error_and_weight(s, p_org, s_org,
-                                                                  p_org_m1, p_org_m2,
+                                                                  org_m1 /* pixel  */,
+                                                                  org_m2 /* memory */,
                                                                   p_rec, s_rec,
                                                                   x, y,
                                                                   block_width, block_height,
@@ -405,12 +404,10 @@ static int do_xpsnr(FFFrameSync *fs)
     const uint32_t  h_blk = (h + b - 1) / b; /* luma height in units of blocks */
     AVFrame *master, *ref = NULL;
     int16_t *porg   [3];
-    int16_t *porg_m1[3];
-    int16_t *porg_m2[3];
     int16_t *prec   [3];
     uint64_t wsse64 [3] = {0, 0, 0};
     double cur_xpsnr[3] = {INFINITY, INFINITY, INFINITY};
-    int c, ret_value;
+    int c, ret_value, stride_org_bpp;
     AVDictionary **metadata;
 
     if ((ret_value = ff_framesync_dualinput_get(fs, &master, &ref)) < 0)
@@ -425,21 +422,15 @@ static int do_xpsnr(FFFrameSync *fs)
     if (!s->weights)
         s->weights  = av_malloc_array(w_blk * h_blk, sizeof(double));
 
-    for (c = 0; c < s->num_comps; c++) {  /* create temporal org buffer memory */
+    for (c = 0; c < s->num_comps; c++)  /* create temporal org buffer memory */
         s->line_sizes[c] = master->linesize[c];
 
-        if (c == 0) { /* luma ch. */
-            const int stride_org_bpp = (s->bpp == 1 ? s->plane_width[c] : s->line_sizes[c] / s->bpp);
+    stride_org_bpp = (s->bpp == 1 ? s->plane_width[0] : s->line_sizes[0] / s->bpp);
 
-            if (!s->buf_org_m1[c])
-                s->buf_org_m1[c] = av_calloc(s->plane_height[c], stride_org_bpp * sizeof(int16_t));
-            if (!s->buf_org_m2[c])
-                s->buf_org_m2[c] = av_calloc(s->plane_height[c], stride_org_bpp * sizeof(int16_t));
-
-            porg_m1[c] = s->buf_org_m1[c];
-            porg_m2[c] = s->buf_org_m2[c];
-        }
-    }
+    if (!s->buf_org_m1)
+        s->buf_org_m1 = av_calloc(s->plane_height[0], stride_org_bpp * sizeof(int16_t));
+    if (!s->buf_org_m2)
+        s->buf_org_m2 = av_calloc(s->plane_height[0], stride_org_bpp * sizeof(int16_t));
 
     if (s->bpp == 1) { /* 8 bit */
         for (c = 0; c < s->num_comps; c++) { /* allocate org/rec buffer memory */
@@ -470,8 +461,7 @@ static int do_xpsnr(FFFrameSync *fs)
     }
 
     /* extended perceptually weighted peak signal-to-noise ratio (XPSNR) value */
-    ret_value = get_wsse(ctx, (int16_t **) &porg, (int16_t **) &porg_m1, (int16_t **) &porg_m2,
-                         (int16_t **) &prec, wsse64);
+    ret_value = get_wsse(ctx, porg, s->buf_org_m1, s->buf_org_m2, prec, wsse64);
     if ( ret_value < 0 )
         return ret_value; /* an error here means something went wrong earlier! */
 
@@ -530,8 +520,6 @@ static av_cold int init(AVFilterContext *ctx)
 
     for (c = 0; c < 3; c++) { /* initialize XPSNR data of each color component */
         s->buf_org   [c] = NULL;
-        s->buf_org_m1[c] = NULL;
-        s->buf_org_m2[c] = NULL;
         s->buf_rec   [c] = NULL;
         s->sum_wdist [c] = 0.0;
         s->sum_xpsnr [c] = 0.0;
@@ -692,9 +680,10 @@ static av_cold void uninit(AVFilterContext *ctx)
     av_freep(&s->sse_luma);
     av_freep(&s->weights );
 
+    av_freep(&s->buf_org_m1);
+    av_freep(&s->buf_org_m2);
+
     for (c = 0; c < s->num_comps; c++) {
-        av_freep(&s->buf_org_m1[c]);
-        av_freep(&s->buf_org_m2[c]);
         av_freep(&s->buf_org[c]);
         av_freep(&s->buf_rec[c]);
     }



More information about the ffmpeg-cvslog mailing list