diff options
author | sdeng <sdeng@google.com> | 2018-12-04 16:35:34 -0800 |
---|---|---|
committer | Sai Deng <sdeng@google.com> | 2018-12-05 00:55:41 +0000 |
commit | 6dc612758cac7d4f07e58c020ee2a1422b49a26d (patch) | |
tree | 2c59e8454d142e6063bc8c655ea51bb5d7cc326f /tools | |
parent | 5fbc7a286b4d72883392fdbb10ec52bace662f66 (diff) | |
download | libvpx-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.c | 14 |
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) { |