]> granicus.if.org Git - libvpx/commitdiff
Optimize RDMULT values for key frames
authorYaowu Xu <yaowu@google.com>
Fri, 9 Nov 2018 20:46:07 +0000 (12:46 -0800)
committerYaowu Xu <yaowu@google.com>
Fri, 16 Nov 2018 17:55:51 +0000 (09:55 -0800)
Encoding of 5 frames of each sequence using key frames only, the new
values help the metrics by:

         PSNR     SSIM       PSNR-HVS
lowres:  -0.870%  -0.140%    -0.892%
midres:  -0.899%  -0.146%    -1.052%
hdres:   -0.944%  -0.115%    -1.028%

Tested q range:
2 6 10 14 18 22 26 30 34 38 42 46 50 54 58 62

Change-Id: I5b0dda366d589f52987c5bad11a1f95c4e6dc1a5

vp9/encoder/vp9_rd.c

index dca12febab2533839093b8011ddd2351a9e533e0..be75c65ea52ca0f5f2059e6d3825dceea642ef97 100644 (file)
@@ -174,10 +174,23 @@ static const int rd_frame_type_factor[FRAME_UPDATE_TYPES] = { 128, 144, 128,
                                                               128, 144, 144 };
 
 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
+  // largest dc_quant is 21387, therefore rdmult should always fit in uint32_t
+  // i.e. 21387 * 21387 * 8 = 3659230152 = 0xDA1B6BC8
   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) {
+    rdmult = rdmult * 3 + (rdmult * 2 / 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;