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

Git pushed a commit to branch release/8.1
in repository ffmpeg.

commit b6fcd2919d736ab45e0e499965288751621f571e
Author:     Michael Niedermayer <[email protected]>
AuthorDate: Sat Jun 6 21:02:34 2026 +0200
Commit:     Michael Niedermayer <[email protected]>
CommitDate: Mon Jun 15 23:57:24 2026 +0200

    avfilter/convolution: compute user matrix products in unsigned
    
    Fixes: integer overflow
    
    Found-by: Kery (Qi Kery <[email protected]>)
    Signed-off-by: Michael Niedermayer <[email protected]>
    (cherry picked from commit 44d082edc87381d978e8588b148116b99fefdb43)
    Signed-off-by: Michael Niedermayer <[email protected]>
---
 libavfilter/vf_convolution.c | 92 +++++++++++++++++++++-----------------------
 1 file changed, 44 insertions(+), 48 deletions(-)

diff --git a/libavfilter/vf_convolution.c b/libavfilter/vf_convolution.c
index 59dcc9340a..70cbe28475 100644
--- a/libavfilter/vf_convolution.c
+++ b/libavfilter/vf_convolution.c
@@ -322,17 +322,16 @@ static void filter16_3x3(uint8_t *dstp, int width,
     int x;
 
     for (x = 0; x < width; x++) {
-        int sum = AV_RN16A(&c[0][2 * x]) * matrix[0] +
-                  AV_RN16A(&c[1][2 * x]) * matrix[1] +
-                  AV_RN16A(&c[2][2 * x]) * matrix[2] +
-                  AV_RN16A(&c[3][2 * x]) * matrix[3] +
-                  AV_RN16A(&c[4][2 * x]) * matrix[4] +
-                  AV_RN16A(&c[5][2 * x]) * matrix[5] +
-                  AV_RN16A(&c[6][2 * x]) * matrix[6] +
-                  AV_RN16A(&c[7][2 * x]) * matrix[7] +
-                  AV_RN16A(&c[8][2 * x]) * matrix[8];
-        sum = (int)(sum * rdiv + bias + 0.5f);
-        dst[x] = av_clip(sum, 0, peak);
+        unsigned sum = (unsigned)AV_RN16A(&c[0][2 * x]) * matrix[0] +
+                  (unsigned)AV_RN16A(&c[1][2 * x]) * matrix[1] +
+                  (unsigned)AV_RN16A(&c[2][2 * x]) * matrix[2] +
+                  (unsigned)AV_RN16A(&c[3][2 * x]) * matrix[3] +
+                  (unsigned)AV_RN16A(&c[4][2 * x]) * matrix[4] +
+                  (unsigned)AV_RN16A(&c[5][2 * x]) * matrix[5] +
+                  (unsigned)AV_RN16A(&c[6][2 * x]) * matrix[6] +
+                  (unsigned)AV_RN16A(&c[7][2 * x]) * matrix[7] +
+                  (unsigned)AV_RN16A(&c[8][2 * x]) * matrix[8];
+        dst[x] = av_clip((int)sum * rdiv + bias + 0.5f, 0, peak);
     }
 }
 
@@ -345,13 +344,13 @@ static void filter16_5x5(uint8_t *dstp, int width,
     int x;
 
     for (x = 0; x < width; x++) {
-        int i, sum = 0;
+        int i;
+        unsigned sum = 0;
 
         for (i = 0; i < 25; i++)
-            sum += AV_RN16A(&c[i][2 * x]) * matrix[i];
+            sum += (unsigned)AV_RN16A(&c[i][2 * x]) * matrix[i];
 
-        sum = (int)(sum * rdiv + bias + 0.5f);
-        dst[x] = av_clip(sum, 0, peak);
+        dst[x] = av_clip((int)sum * rdiv + bias + 0.5f, 0, peak);
     }
 }
 
@@ -364,13 +363,13 @@ static void filter16_7x7(uint8_t *dstp, int width,
     int x;
 
     for (x = 0; x < width; x++) {
-        int i, sum = 0;
+        int i;
+        unsigned sum = 0;
 
         for (i = 0; i < 49; i++)
-            sum += AV_RN16A(&c[i][2 * x]) * matrix[i];
+            sum += (unsigned)AV_RN16A(&c[i][2 * x]) * matrix[i];
 
-        sum = (int)(sum * rdiv + bias + 0.5f);
-        dst[x] = av_clip(sum, 0, peak);
+        dst[x] = av_clip((int)sum * rdiv + bias + 0.5f, 0, peak);
     }
 }
 
@@ -383,13 +382,13 @@ static void filter16_row(uint8_t *dstp, int width,
     int x;
 
     for (x = 0; x < width; x++) {
-        int i, sum = 0;
+        int i;
+        unsigned sum = 0;
 
         for (i = 0; i < 2 * radius + 1; i++)
-            sum += AV_RN16A(&c[i][2 * x]) * matrix[i];
+            sum += (unsigned)AV_RN16A(&c[i][2 * x]) * matrix[i];
 
-        sum = (int)(sum * rdiv + bias + 0.5f);
-        dst[x] = av_clip(sum, 0, peak);
+        dst[x] = av_clip((int)sum * rdiv + bias + 0.5f, 0, peak);
     }
 }
 
@@ -398,7 +397,7 @@ static void filter16_column(uint8_t *dstp, int height,
                             const uint8_t *c[], int peak, int radius,
                             int dstride, int stride, int size)
 {
-    DECLARE_ALIGNED(64, int, sum)[16];
+    DECLARE_ALIGNED(64, unsigned, sum)[16];
     uint16_t *dst = (uint16_t *)dstp;
     const int width = FFMIN(16, size);
 
@@ -407,12 +406,11 @@ static void filter16_column(uint8_t *dstp, int height,
         memset(sum, 0, sizeof(sum));
         for (int i = 0; i < 2 * radius + 1; i++) {
             for (int off16 = 0; off16 < width; off16++)
-                sum[off16] += AV_RN16A(&c[i][0 + y * stride + off16 * 2]) * 
matrix[i];
+                sum[off16] += (unsigned)AV_RN16A(&c[i][0 + y * stride + off16 
* 2]) * matrix[i];
         }
 
         for (int off16 = 0; off16 < width; off16++) {
-            sum[off16] = (int)(sum[off16] * rdiv + bias + 0.5f);
-            dst[off16] = av_clip(sum[off16], 0, peak);
+            dst[off16] = av_clip((int)sum[off16] * rdiv + bias + 0.5f, 0, 
peak);
         }
         dst += dstride / 2;
     }
@@ -426,13 +424,13 @@ static void filter_7x7(uint8_t *dst, int width,
     int x;
 
     for (x = 0; x < width; x++) {
-        int i, sum = 0;
+        int i;
+        unsigned sum = 0;
 
         for (i = 0; i < 49; i++)
-            sum += c[i][x] * matrix[i];
+            sum += (unsigned)c[i][x] * matrix[i];
 
-        sum = (int)(sum * rdiv + bias + 0.5f);
-        dst[x] = av_clip_uint8(sum);
+        dst[x] = av_clip_uint8((int)sum * rdiv + bias + 0.5f);
     }
 }
 
@@ -444,13 +442,13 @@ static void filter_5x5(uint8_t *dst, int width,
     int x;
 
     for (x = 0; x < width; x++) {
-        int i, sum = 0;
+        int i;
+        unsigned sum = 0;
 
         for (i = 0; i < 25; i++)
-            sum += c[i][x] * matrix[i];
+            sum += (unsigned)c[i][x] * matrix[i];
 
-        sum = (int)(sum * rdiv + bias + 0.5f);
-        dst[x] = av_clip_uint8(sum);
+        dst[x] = av_clip_uint8((int)sum * rdiv + bias + 0.5f);
     }
 }
 
@@ -465,11 +463,10 @@ static void filter_3x3(uint8_t *dst, int width,
     int x;
 
     for (x = 0; x < width; x++) {
-        int sum = c0[x] * matrix[0] + c1[x] * matrix[1] + c2[x] * matrix[2] +
-                  c3[x] * matrix[3] + c4[x] * matrix[4] + c5[x] * matrix[5] +
-                  c6[x] * matrix[6] + c7[x] * matrix[7] + c8[x] * matrix[8];
-        sum = (int)(sum * rdiv + bias + 0.5f);
-        dst[x] = av_clip_uint8(sum);
+        unsigned sum = (unsigned)c0[x] * matrix[0] + (unsigned)c1[x] * 
matrix[1] + (unsigned)c2[x] * matrix[2] +
+                       (unsigned)c3[x] * matrix[3] + (unsigned)c4[x] * 
matrix[4] + (unsigned)c5[x] * matrix[5] +
+                       (unsigned)c6[x] * matrix[6] + (unsigned)c7[x] * 
matrix[7] + (unsigned)c8[x] * matrix[8];
+        dst[x] = av_clip_uint8((int)sum * rdiv + bias + 0.5f);
     }
 }
 
@@ -481,13 +478,13 @@ static void filter_row(uint8_t *dst, int width,
     int x;
 
     for (x = 0; x < width; x++) {
-        int i, sum = 0;
+        int i;
+        unsigned sum = 0;
 
         for (i = 0; i < 2 * radius + 1; i++)
-            sum += c[i][x] * matrix[i];
+            sum += (unsigned)c[i][x] * matrix[i];
 
-        sum = (int)(sum * rdiv + bias + 0.5f);
-        dst[x] = av_clip_uint8(sum);
+        dst[x] = av_clip_uint8((int)sum * rdiv + bias + 0.5f);
     }
 }
 
@@ -496,19 +493,18 @@ static void filter_column(uint8_t *dst, int height,
                           const uint8_t *c[], int peak, int radius,
                           int dstride, int stride, int size)
 {
-    DECLARE_ALIGNED(64, int, sum)[16];
+    DECLARE_ALIGNED(64, unsigned, sum)[16];
 
     for (int y = 0; y < height; y++) {
         memset(sum, 0, sizeof(sum));
 
         for (int i = 0; i < 2 * radius + 1; i++) {
             for (int off16 = 0; off16 < 16; off16++)
-                sum[off16] += c[i][0 + y * stride + off16] * matrix[i];
+                sum[off16] += (unsigned)c[i][0 + y * stride + off16] * 
matrix[i];
         }
 
         for (int off16 = 0; off16 < 16; off16++) {
-            sum[off16] = (int)(sum[off16] * rdiv + bias + 0.5f);
-            dst[off16] = av_clip_uint8(sum[off16]);
+            dst[off16] = av_clip_uint8((int)sum[off16] * rdiv + bias + 0.5f);
         }
         dst += dstride;
     }

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

Reply via email to