summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorsdeng <sdeng@google.com>2018-12-04 16:35:34 -0800
committerSai Deng <sdeng@google.com>2018-12-05 00:55:41 +0000
commit6dc612758cac7d4f07e58c020ee2a1422b49a26d (patch)
tree2c59e8454d142e6063bc8c655ea51bb5d7cc326f /tools
parent5fbc7a286b4d72883392fdbb10ec52bace662f66 (diff)
downloadlibvpx-6dc612758cac7d4f07e58c020ee2a1422b49a26d.tar
libvpx-6dc612758cac7d4f07e58c020ee2a1422b49a26d.tar.gz
libvpx-6dc612758cac7d4f07e58c020ee2a1422b49a26d.tar.bz2
libvpx-6dc612758cac7d4f07e58c020ee2a1422b49a26d.zip
Fix overflow in calculating highbd SSIM
Example internal stats Before the fix: Bitrate AVGPsnr GLBPsnr AVPsnrP GLPsnrP VPXSSIM VPSSIMP FASTSIM PSNRHVS WstPsnr WstSsim WstFast WstHVS AVPsnrY APsnrCb APsnrCr Block WstBlck Consist WstCons Time RcErr AbsErr 153.39 37.131 36.420 37.151 36.437 716.077 817.445 10.422 34.347 32.980 0.916 9.281 30.208 36.024 41.830 40.581 0.000 0.000 100.000 100.000 55006 2.26 2.26 No mismatch detected in recon buffers After the fix: Bitrate AVGPsnr GLBPsnr AVPsnrP GLPsnrP VPXSSIM VPSSIMP FASTSIM PSNRHVS WstPsnr WstSsim WstFast WstHVS AVPsnrY APsnrCb APsnrCr Block WstBlck Consist WstCons Time RcErr AbsErr 153.39 37.131 36.420 37.151 36.437 69.808 70.023 10.422 34.347 32.980 0.910 9.281 30.208 36.024 41.830 40.581 0.000 0.000 100.000 100.000 55067 2.26 2.26 No mismatch detected in recon buffers Change-Id: I820abc498c1543548f193874046582b50afd0238
Diffstat (limited to 'tools')
-rw-r--r--tools/tiny_ssim.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/tools/tiny_ssim.c b/tools/tiny_ssim.c
index 36961b355..1f73c73c1 100644
--- a/tools/tiny_ssim.c
+++ b/tools/tiny_ssim.c
@@ -237,7 +237,7 @@ void highbd_ssim_parms_8x8(const uint16_t *s, int sp, const uint16_t *r, int rp,
static double similarity(uint32_t sum_s, uint32_t sum_r, uint32_t sum_sq_s,
uint32_t sum_sq_r, uint32_t sum_sxr, int count,
uint32_t bd) {
- int64_t ssim_n, ssim_d;
+ double ssim_n, ssim_d;
int64_t c1 = 0, c2 = 0;
if (bd == 8) {
// scale the constants by number of pixels
@@ -253,14 +253,14 @@ static double similarity(uint32_t sum_s, uint32_t sum_r, uint32_t sum_sq_s,
assert(0);
}
- ssim_n = (2 * sum_s * sum_r + c1) *
- ((int64_t)2 * count * sum_sxr - (int64_t)2 * sum_s * sum_r + c2);
+ ssim_n = (2.0 * sum_s * sum_r + c1) *
+ (2.0 * count * sum_sxr - 2.0 * sum_s * sum_r + c2);
- ssim_d = (sum_s * sum_s + sum_r * sum_r + c1) *
- ((int64_t)count * sum_sq_s - (int64_t)sum_s * sum_s +
- (int64_t)count * sum_sq_r - (int64_t)sum_r * sum_r + c2);
+ ssim_d = ((double)sum_s * sum_s + (double)sum_r * sum_r + c1) *
+ ((double)count * sum_sq_s - (double)sum_s * sum_s +
+ (double)count * sum_sq_r - (double)sum_r * sum_r + c2);
- return ssim_n * 1.0 / ssim_d;
+ return ssim_n / ssim_d;
}
static double ssim_8x8(const uint8_t *s, int sp, const uint8_t *r, int rp) {