]> granicus.if.org Git - libvpx/commitdiff
adjusting the calculation of errorperbit
authorYaowu Xu <yaowu@google.com>
Mon, 20 Jun 2011 23:30:26 +0000 (16:30 -0700)
committerYaowu Xu <yaowu@google.com>
Mon, 20 Jun 2011 23:32:30 +0000 (16:32 -0700)
RDMULT/RDDIV defines a bit worth of distortion in term of sum squared
difference. This has also been used as errorperbit in subpixel motion
search, where the distortions computed as variance of the difference.
The variance of differences is different from sum squared differences
by amount of DC squared. Typically, for inter predicted MBs, this
difference averages around 10% between the two distortion, so this patch
introduces a 110% constant in deriving errorperbit from RDMULT/RDDIV.

Test on CIF set shows small but positive gain on overall PSNR (.03%)
and SSIM (.07%), overall impact on average PSNR is 0.

Change-Id: I95425f922d037b4d96083064a10c7cdd4948ee62

vp8/encoder/encodeframe.c
vp8/encoder/rdopt.c

index 892284ed2cb5e5d20117b44c546e295cba32ad72..132e508580176e42ab47fc40eae6006472b18b6f 100644 (file)
@@ -335,7 +335,8 @@ void vp8_activity_masking(VP8_COMP *cpi, MACROBLOCK *x)
 {
 #if USE_ACT_INDEX
     x->rdmult += *(x->mb_activity_ptr) * (x->rdmult >> 2);
-    x->errorperbit = x->rdmult/x->rddiv;
+    x->errorperbit = x->rdmult * 100 /(110 * x->rddiv);
+    x->errorperbit += (x->errorperbit==0);
 #else
     INT64 a;
     INT64 b;
@@ -346,8 +347,8 @@ void vp8_activity_masking(VP8_COMP *cpi, MACROBLOCK *x)
     b = (2*act) + cpi->activity_avg;
 
     x->rdmult = (unsigned int)(((INT64)x->rdmult*b + (a>>1))/a);
-    x->errorperbit = x->rdmult/x->rddiv;
-
+    x->errorperbit = x->rdmult * 100 /(110 * x->rddiv);
+    x->errorperbit += (x->errorperbit==0);
 #endif
 
     // Activity based Zbin adjustment
index 5ce61a04e22f224ba66ff30998a2d5683277f656..e05ffdb1a757b046010506063d78f9300f9dc2ba 100644 (file)
@@ -238,7 +238,7 @@ void vp8_initialize_rd_consts(VP8_COMP *cpi, int Qvalue)
                 (cpi->RDMULT * rd_iifactor[cpi->twopass.next_iiratio]) >> 4;
     }
 
-    cpi->mb.errorperbit = (cpi->RDMULT / 100);
+    cpi->mb.errorperbit = (cpi->RDMULT / 110);
     cpi->mb.errorperbit += (cpi->mb.errorperbit==0);
 
     vp8_set_speed_features(cpi);