]> granicus.if.org Git - libvpx/commitdiff
Adopt weighted averaging in MFQE.
authorJackyChen <jackychen@google.com>
Mon, 5 Jan 2015 18:41:12 +0000 (10:41 -0800)
committerJackyChen <jackychen@google.com>
Mon, 5 Jan 2015 19:38:42 +0000 (11:38 -0800)
By using weighted averaging in the calculation of the frames to be
displayed, we get an average gain of more than 1 db for key frames
whose base qp are 20 higher than non-key frames.

Change-Id: I7bcb2e7b9c6420ea3f73f33204d18b072dffd17c

vp9/common/vp9_mfqe.c

index 92650e95429a0cb09e59668cb5238a3f0e0af419..110404f5a30cfe0f7a4f9c75190b56d184f03103 100644 (file)
@@ -167,10 +167,10 @@ static void mfqe_block(BLOCK_SIZE bs, const uint8_t *y, const uint8_t *u,
   // it might be a lighting change in smooth area. When there is a
   // lighting change in smooth area, it is dangerous to do MFQE.
   if (sad > 1 && sad < sad_thr && vdiff > sad * 3 && vdiff < 150) {
-    // TODO(jackychen): Add weighted average in the calculation.
-    // Currently, the data is copied from last frame without averaging.
+    int weight = ((float)sad / (sad_thr - 1)) * ((float)vdiff / (150 - 1)) *
+                 (1 << MFQE_PRECISION);
     apply_ifactor(y, y_stride, yd, yd_stride, u, v, uv_stride,
-                  ud, vd, uvd_stride, bs, 0);
+                  ud, vd, uvd_stride, bs, weight);
   } else {
     // Copy the block from current frame (i.e., no mfqe is done).
     copy_block(y, u, v, y_stride, uv_stride, yd, ud, vd,