]> granicus.if.org Git - libvpx/commitdiff
Fix overflow in calculating highbd SSIM
authorsdeng <sdeng@google.com>
Wed, 5 Dec 2018 00:35:34 +0000 (16:35 -0800)
committerSai Deng <sdeng@google.com>
Wed, 5 Dec 2018 00:55:41 +0000 (00:55 +0000)
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

tools/tiny_ssim.c
vpx_dsp/ssim.c

index 36961b3551a2b39ddd7be337c8547d5c3cec8c4e..1f73c73c1bdffcfed7e0ae9455d6b49317bbec72 100644 (file)
@@ -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) {
index ba73eb293a497897f952bc7c54da8eb5e5f8739d..7c3c31bad869b2f55c0612ba6f40d87b4d30c807 100644 (file)
@@ -73,7 +73,7 @@ static const int64_t cc2_12 = 61817334;  // (64^2*(.03*4095)^2
 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, c2;
   if (bd == 8) {
     // scale the constants by number of pixels
@@ -90,14 +90,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) {