From: Yaowu Xu Date: Fri, 9 Nov 2018 20:46:07 +0000 (-0800) Subject: Optimize RDMULT values for key frames X-Git-Tag: v1.8.0~145^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b13f6154df9c0834d74f7e3d41e41c4208f56d18;p=libvpx Optimize RDMULT values for key frames 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 --- diff --git a/vp9/encoder/vp9_rd.c b/vp9/encoder/vp9_rd.c index dca12feba..be75c65ea 100644 --- a/vp9/encoder/vp9_rd.c +++ b/vp9/encoder/vp9_rd.c @@ -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;