ref: c852765d7d9378dbf95c1e170b8a24355baa5ec7
parent: ce4336c2ab60d185b431345987b2188511760e54
author: Yaowu Xu <yaowu@google.com>
date: Wed Feb 6 11:02:39 EST 2019
Use wide integer to avoid overflow BUG=webm:1270 Change-Id: I7d56667d946196bbbe355303de805422e40b0763
--- a/vpx_dsp/fastssim.c
+++ b/vpx_dsp/fastssim.c
@@ -128,10 +128,12 @@
int i1;
i0 = 2 * i;
i1 = FS_MINI(i0 + 1, w2);
- dst1[j * w + i] = src1[j0offs + i0] + src1[j0offs + i1] +
- src1[j1offs + i0] + src1[j1offs + i1];
- dst2[j * w + i] = src2[j0offs + i0] + src2[j0offs + i1] +
- src2[j1offs + i0] + src2[j1offs + i1];
+ dst1[j * w + i] =
+ (uint32_t)((int64_t)src1[j0offs + i0] + src1[j0offs + i1] +
+ src1[j1offs + i0] + src1[j1offs + i1]);
+ dst2[j * w + i] =
+ (uint32_t)((int64_t)src2[j0offs + i0] + src2[j0offs + i1] +
+ src2[j1offs + i0] + src2[j1offs + i1]);
}
}
}
@@ -220,12 +222,12 @@
ssim = _ctx->level[_l].ssim;
c1 = (double)(ssim_c1 * 4096 * (1 << 4 * _l));
for (j = 0; j < h; j++) {
- unsigned mux;
- unsigned muy;
+ int64_t mux;
+ int64_t muy;
int i0;
int i1;
- mux = 5 * col_sums_x[0];
- muy = 5 * col_sums_y[0];
+ mux = (int64_t)5 * col_sums_x[0];
+ muy = (int64_t)5 * col_sums_y[0];
for (i = 1; i < 4; i++) {
i1 = FS_MINI(i, w - 1);
mux += col_sums_x[i1];
@@ -237,8 +239,8 @@
if (i + 1 < w) {
i0 = FS_MAXI(0, i - 4);
i1 = FS_MINI(i + 4, w - 1);
- mux += col_sums_x[i1] - col_sums_x[i0];
- muy += col_sums_x[i1] - col_sums_x[i0];
+ mux += (int)col_sums_x[i1] - (int)col_sums_x[i0];
+ muy += (int)col_sums_x[i1] - (int)col_sums_x[i0];
}
}
if (j + 1 < h) {
@@ -246,8 +248,10 @@
for (i = 0; i < w; i++) col_sums_x[i] -= im1[j0offs + i];
for (i = 0; i < w; i++) col_sums_y[i] -= im2[j0offs + i];
j1offs = FS_MINI(j + 4, h - 1) * w;
- for (i = 0; i < w; i++) col_sums_x[i] += im1[j1offs + i];
- for (i = 0; i < w; i++) col_sums_y[i] += im2[j1offs + i];
+ for (i = 0; i < w; i++)
+ col_sums_x[i] = (uint32_t)((int64_t)col_sums_x[i] + im1[j1offs + i]);
+ for (i = 0; i < w; i++)
+ col_sums_y[i] = (uint32_t)((int64_t)col_sums_y[i] + im2[j1offs + i]);
}
}
}
@@ -343,18 +347,18 @@
for (j = 0; j < h + 4; j++) {
if (j < h - 1) {
for (i = 0; i < w - 1; i++) {
- unsigned g1;
- unsigned g2;
- unsigned gx;
- unsigned gy;
- g1 = abs((int)im1[(j + 1) * w + i + 1] - (int)im1[j * w + i]);
- g2 = abs((int)im1[(j + 1) * w + i] - (int)im1[j * w + i + 1]);
+ int64_t g1;
+ int64_t g2;
+ int64_t gx;
+ int64_t gy;
+ g1 = labs((int64_t)im1[(j + 1) * w + i + 1] - (int64_t)im1[j * w + i]);
+ g2 = labs((int64_t)im1[(j + 1) * w + i] - (int64_t)im1[j * w + i + 1]);
gx = 4 * FS_MAXI(g1, g2) + FS_MINI(g1, g2);
- g1 = abs((int)im2[(j + 1) * w + i + 1] - (int)im2[j * w + i]);
- g2 = abs((int)im2[(j + 1) * w + i] - (int)im2[j * w + i + 1]);
- gy = 4 * FS_MAXI(g1, g2) + FS_MINI(g1, g2);
- gx_buf[(j & 7) * stride + i + 4] = gx;
- gy_buf[(j & 7) * stride + i + 4] = gy;
+ g1 = labs((int64_t)im2[(j + 1) * w + i + 1] - (int64_t)im2[j * w + i]);
+ g2 = labs((int64_t)im2[(j + 1) * w + i] - (int64_t)im2[j * w + i + 1]);
+ gy = ((int64_t)4 * FS_MAXI(g1, g2) + FS_MINI(g1, g2));
+ gx_buf[(j & 7) * stride + i + 4] = (uint32_t)gx;
+ gy_buf[(j & 7) * stride + i + 4] = (uint32_t)gy;
}
} else {
memset(gx_buf + (j & 7) * stride, 0, stride * sizeof(*gx_buf));