shithub: libvpx

Download patch

ref: 93488acda641c74bdc0f606cd4086b021e733f84
parent: 356174583506fb6654a3de7264348fbbfb7ca62c
author: Yaowu Xu <yaowu@google.com>
date: Thu Nov 29 04:44:16 EST 2018

Optimize RDMult

This commit introduces the optimized RDMult values for both key
and non-key frames. For key frames, the commit gets values back
from commit#b13f6154df9c0834d74f7e3d41e41c4208f56d18. For impact
on key frame only encodings, see commit message for that commit.

For inter frames, the values get optimzied by running encoding tests
in Q mode with the following range using 150 frames:
2 6 10 14 18 22 26 30 34 38 42 46 50 54 58 62

The impact of current set of RDMULT values:
           PSNR     SSIM     PSNR-HVS
lowres:  -0.325%   0.422%    -0.228%
midres:  -0.377%   0.158%    -0.376%
hdres:   -0.309%   0.522%    -0.322%

Test baseline is on commit#35617458

Overall, the values help PSNR based metrics, but hurt SSIM metric
slightly.

Change-Id: I7eba37a6524cb36b8498a1d104d2667781bc2089

--- a/vp9/encoder/vp9_rd.c
+++ b/vp9/encoder/vp9_rd.c
@@ -176,8 +176,27 @@
 int vp9_compute_rd_mult_based_on_qindex(const VP9_COMP *cpi, int qindex) {
   // largest dc_quant is 21387, therefore rdmult should always fit in int32_t
   const int q = vp9_dc_quant(qindex, 0, cpi->common.bit_depth);
-  int rdmult = q * q;
-  rdmult = rdmult * 3 + (rdmult * 2 / 3);
+  uint32_t rdmult = q * q;
+
+  if (cpi->common.frame_type != KEY_FRAME) {
+    if (qindex < 1)
+      rdmult = rdmult * 3 + (rdmult * 2 / 3);
+    else if (qindex < 128)
+      rdmult = rdmult * 4;
+    else if (qindex < 190)
+      rdmult = rdmult * 4 + rdmult / 2;
+    else
+      rdmult = rdmult * 3;
+  } else {
+    if (qindex < 64)
+      rdmult = rdmult * 4;
+    else if (qindex <= 128)
+      rdmult = rdmult * 3 + rdmult / 2;
+    else if (qindex < 190)
+      rdmult = rdmult * 4 + rdmult / 2;
+    else
+      rdmult = rdmult * 7 + rdmult / 2;
+  }
 #if CONFIG_VP9_HIGHBITDEPTH
   switch (cpi->common.bit_depth) {
     case VPX_BITS_10: rdmult = ROUND_POWER_OF_TWO(rdmult, 4); break;