Eliminate a sqrt in od_compute_dist_8x8().
authorTimothy B. Terriberry <tterribe@xiph.org>
Thu, 8 Dec 2016 19:13:39 +0000 (11:13 -0800)
committerTimothy B. Terriberry <tterribe@xiph.org>
Thu, 15 Dec 2016 01:43:02 +0000 (17:43 -0800)
No reason to use two when one will do.

master-2016-12-09-7098e5 -> derf-compute_dist-fewer_sqrts4

  PSNR | PSNR Cb | PSNR Cr | PSNR HVS |   SSIM | MS SSIM | CIEDE 2000
0.0000 |  0.0000 |  0.0000 |   0.0000 | 0.0000 |  0.0000 |     0.0000

src/encode.c

index 04fa590..42e5b7c 100644 (file)
@@ -1122,13 +1122,12 @@ static double od_compute_dist_8x8(daala_enc_ctx *enc, od_coeff *x, od_coeff *y,
     for (j = 0; j < 3; j++) {
       int varx;
       int vary;
-      double diff;
       varx = od_compute_var_4x4(x + 2*i*stride + 2*j, stride);
       vary = od_compute_var_4x4(y + 2*i*stride + 2*j, stride);
       min_var = OD_MINI(min_var, varx);
       mean_var += 1./(1 + varx);
-      diff = sqrt(varx) - sqrt(vary);
-      vardist += diff*diff;
+      /*The cast to (double) is to avoid an overflow before the sqrt.*/
+      vardist += varx - 2*sqrt(varx*(double)vary) + vary;
     }
   }
   /* We use a different variance statistic depending on whether activity