ref: e946eaf3af769f3a4e602255263e33699de3dec5
parent: 3a56c238ee82604b2d420d858f4edfa28af4e6eb
parent: b13f6154df9c0834d74f7e3d41e41c4208f56d18
author: Yaowu Xu <yaowu@google.com>
date: Mon Nov 19 13:47:21 EST 2018
Merge "Optimize RDMULT values for key frames"
--- a/vp9/encoder/vp9_rd.c
+++ b/vp9/encoder/vp9_rd.c
@@ -174,10 +174,23 @@
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;