diff --git a/vp8/encoder/firstpass.c b/vp8/encoder/firstpass.c index 9c20f09db55a30c79c80382976e12a53f017e53d..35adb9d108af26494769bfe033c764cf350d2c45 100644 --- a/vp8/encoder/firstpass.c +++ b/vp8/encoder/firstpass.c @@ -63,7 +63,7 @@ extern void vp8_alloc_compressor_data(VP8_COMP *cpi); static int vscale_lookup[7] = {0, 1, 1, 2, 2, 3, 3}; static int hscale_lookup[7] = {0, 0, 1, 1, 2, 2, 3}; - +// TODO #if CONFIG_EXTEND_QRANGE static const int cq_level[QINDEX_RANGE] = { 0,0,1,1,2,3,3,4,4,5,6,6,7,8,8,9, diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c index 884b260bf08c4cf9ab64ddfc0db7051d439e0772..ec5ff64ef2eeb7c5f01c197c620b6ca58d84ac9a 100644 --- a/vp8/encoder/onyx_if.c +++ b/vp8/encoder/onyx_if.c @@ -161,144 +161,84 @@ extern const int qrounding_factors[129]; extern const int qzbin_factors[129]; extern void vp8cx_init_quantizer(VP8_COMP *cpi); extern const int vp8cx_base_skip_false_prob[128]; -#if !CONFIG_EXTEND_QRANGE + // Tables relating active max Q to active min Q -static const int kf_low_motion_minq[QINDEX_RANGE] = -{ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2, - 3,3,3,3,3,3,4,4,4,5,5,5,5,5,6,6, - 6,6,7,7,8,8,8,8,9,9,10,10,10,10,11,11, - 11,11,12,12,13,13,13,13,14,14,15,15,15,15,16,16, - 16,16,17,17,18,18,18,18,19,20,20,21,21,22,23,23 -}; -static const int kf_high_motion_minq[QINDEX_RANGE] = -{ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3, - 3,3,3,3,4,4,4,4,5,5,5,5,5,5,6,6, - 6,6,7,7,8,8,8,8,9,9,10,10,10,10,11,11, - 11,11,12,12,13,13,13,13,14,14,15,15,15,15,16,16, - 16,16,17,17,18,18,18,18,19,19,20,20,20,20,21,21, - 21,21,22,22,23,23,24,25,25,26,26,27,28,28,29,30 -}; -static const int gf_low_motion_minq[QINDEX_RANGE] = -{ - 0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2, - 3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6, - 7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10, - 11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18, - 19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26, - 27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34, - 35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42, - 43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58 -}; -static const int gf_mid_motion_minq[QINDEX_RANGE] = -{ - 0,0,0,0,1,1,1,1,1,1,2,2,3,3,3,4, - 4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9, - 9,10,10,10,10,11,11,11,12,12,12,12,13,13,13,14, - 14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21, - 22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29, - 30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37, - 38,39,39,40,40,41,41,42,42,43,43,44,45,46,47,48, - 49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64 -}; -static const int gf_high_motion_minq[QINDEX_RANGE] = +static int kf_low_motion_minq[QINDEX_RANGE]; +static int kf_high_motion_minq[QINDEX_RANGE]; +static int gf_low_motion_minq[QINDEX_RANGE]; +static int gf_mid_motion_minq[QINDEX_RANGE]; +static int gf_high_motion_minq[QINDEX_RANGE]; +static int inter_minq[QINDEX_RANGE]; + +// Functions to compute the active minq lookup table entries based on a +// formulaic approach to facilitate easier adjustment of the Q tables. +// The formulae were derived from computing a 3rd order polynomial best +// fit to the original data (after plotting real maxq vs minq (not q index)) +int calculate_minq_index( double maxq, + double x3, double x2, double x, double c ) { - 0,0,0,0,1,1,1,1,1,2,2,2,3,3,3,4, - 4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9, - 9,10,10,10,11,11,12,12,13,13,14,14,15,15,16,16, - 17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24, - 25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32, - 33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40, - 41,41,42,42,43,44,45,46,47,48,49,50,51,52,53,54, - 55,56,57,58,59,60,62,64,66,68,70,72,74,76,78,80 -}; -static const int inter_minq[QINDEX_RANGE] = -{ - 0,0,1,1,2,3,3,4,4,5,6,6,7,8,8,9, - 9,10,11,11,12,13,13,14,15,15,16,17,17,18,19,20, - 20,21,22,22,23,24,24,25,26,27,27,28,29,30,30,31, - 32,33,33,34,35,36,36,37,38,39,39,40,41,42,42,43, - 44,45,46,46,47,48,49,50,50,51,52,53,54,55,55,56, - 57,58,59,60,60,61,62,63,64,65,66,67,67,68,69,70, - 71,72,73,74,75,75,76,77,78,79,80,81,82,83,84,85, - 86,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100 -}; -#else -static const int kf_low_motion_minq[QINDEX_RANGE] = -{ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, - 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, - 9, 9, 9, 10,10,11,11,12,12,13,13,14,14,15,15,16, - 16,17,17,18,18,19,19,20,20,21,21,22,23,23,24,24, - 25,25,26,27,28,29,30,30,31,32,33,34,35,35,36,36, - 38,38,39,40,40,41,42,42,43,44,44,45,46,46,47,48, - 49,49,50,50,51,52,52,53,54,55,56,57,58,59,60,61, -}; -static const int kf_high_motion_minq[QINDEX_RANGE] = -{ - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, - 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, - 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9,10,10, - 11,11,12,13,14,15,16,17,18,19,20,21,22,23,24,24, - 25,26,27,28,28,29,29,30,30,31,31,32,33,33,34,34, - 35,36,37,38,39,39,40,41,41,42,43,44,45,45,46,46, - 47,47,48,48,49,49,50,50,51,51,52,52,53,53,54,54, - 55,55,56,56,57,58,59,60,61,62,63,64,65,67,69,70, -}; + int i; + double minqtarget; + double thisq; -static const int gf_low_motion_minq[QINDEX_RANGE] = -{ - 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, - 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, - 10,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17, - 17,18,18,19,19,20,21,22,23,24,25,26,27,29,29,30, - 31,32,33,34,35,36,37,38,39,40,41,41,42,42,43,43, - 44,44,45,45,46,46,47,47,48,48,49,49,50,50,51,51, - 52,52,53,53,54,54,55,55,56,56,57,57,58,59,60,61, - 62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77, -}; -static const int gf_mid_motion_minq[QINDEX_RANGE] = -{ - 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, - 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9,10, - 10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18, - 18,19,19,20,20,21,22,23,24,25,26,27,28,29,30,31, - 32,33,34,35,35,36,36,37,37,38,38,39,39,40,40,41, - 41,42,42,43,43,44,44,45,45,46,46,47,48,49,50,51, - 52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67, - 68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83, -}; -static const int gf_high_motion_minq[QINDEX_RANGE] = -{ - 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, - 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9, 9,10,10, - 11,11,12,12,13,14,15,16,17,18,18,19,19,20,20,21, - 22,23,24,25,26,26,27,28,29,30,31,32,33,34,35,36, - 37,38,39,39,40,40,40,41,41,41,42,42,43,43,44,44, - 44,45,45,45,46,46,47,47,47,48,48,48,49,49,49,50, - 50,50,51,51,52,53,54,54,55,56,57,57,58,59,60,61, - 62,63,64,66,68,69,72,74,77,80,82,85,87,89,91,93, -}; + minqtarget = ( (x3 * maxq * maxq * maxq) + + (x2 * maxq * maxq) + + (x * maxq) + + c ); + + if ( minqtarget > maxq ) + maxq = maxq; -static const int inter_minq[QINDEX_RANGE] = + for ( i = 0; i < QINDEX_RANGE; i++ ) + { + thisq = vp8_convert_qindex_to_q(i); + if ( minqtarget <= vp8_convert_qindex_to_q(i) ) + return i; + } +} +void init_minq_luts() { - 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, - 8, 9,10,11,12,13,14,15,16,17,18,18,19,19,20,21, - 21,22,23,23,24,25,26,26,27,28,29,30,31,32,32,33, - 34,35,36,36,37,38,39,40,40,41,41,42,43,44,44,45, - 46,46,47,47,48,49,49,50,50,51,52,52,53,54,54,55, - 55,56,57,57,58,59,60,60,61,62,63,63,64,65,66,67, - 68,68,69,70,71,72,72,73,74,75,76,77,78,79,80,81, - 81,82,83,84,85,86,87,88,89,90,90,91,92,93,94,95, -}; -#endif + int i; + double maxq; + + for ( i = 0; i < QINDEX_RANGE; i++ ) + { + maxq = vp8_convert_qindex_to_q(i); + + kf_low_motion_minq[i] = calculate_minq_index( maxq, + 0.00000006, + -0.0000276, + 0.098, + 0.0 ); + kf_high_motion_minq[i] = calculate_minq_index( maxq, + 0.00000024, + -0.000201, + 0.154, + 0.0 ); + gf_low_motion_minq[i] = calculate_minq_index( maxq, + 0.00000179, + -0.000975, + 0.355, + 0.0 ); + gf_mid_motion_minq[i] = calculate_minq_index( maxq, + 0.00000409, + -0.00176, + 0.443, + 0.0 ); + gf_high_motion_minq[i] = calculate_minq_index( maxq, + 0.00000819, + -0.00286, + 0.532, + 0.0 ); + inter_minq[i] = calculate_minq_index( maxq, + 0.00000271, + -0.00113, + 0.697, + 0.0 ); + + } +} + void vp8_initialize() { static int init_done = 0; @@ -310,6 +250,7 @@ void vp8_initialize() //vp8_dmachine_specific_config(); vp8_tokenize_initialize(); vp8_init_me_luts(); + init_minq_luts(); init_done = 1; } diff --git a/vp8/encoder/rdopt.c b/vp8/encoder/rdopt.c index 652c6ec8c03652da6cc7d6bee322aae6a105af76..d4458b9bf7154a2cc07ea8b8f3ea5f441264aa23 100644 --- a/vp8/encoder/rdopt.c +++ b/vp8/encoder/rdopt.c @@ -160,47 +160,8 @@ static int rd_iifactor [ 32 ] = { 4, 4, 3, 2, 1, 0, 0, 0, }; // 3* dc_qlookup[Q]*dc_qlookup[Q]; -#if !CONFIG_EXTEND_QRANGE -static int rdmult_lut[QINDEX_RANGE]= -{ - 48,75,108,147,192,243,300,300, - 363,432,507,588,675,768,867,867, - 972,1083,1200,1200,1323,1323,1452,1452, - 1587,1587,1728,1875,1875,2028,2187,2352, - 2523,2700,2883,3072,3267,3468,3675,3888, - 4107,4107,4332,4563,4800,5043,5292,5547, - 5808,6075,6348,6348,6627,6912,7203,7500, - 7803,8112,8427,8748,9075,9408,9747,10092, - 10443,10800,11163,11532,11907,12288,12675,13068, - 13467,13872,14283,14700,15123,15552,15987,16428, - 16875,17328,17328,17787,18252,18723,19200,19683, - 20172,20667,21168,21675,22188,22707,23232,23763, - 24843,25947,27075,27648,28812,30000,30603,31212, - 32448,33708,34992,36300,37632,38988,40368,41772, - 44652,46128,47628,49152,50700,52272,53868,55488, - 57132,58800,61347,63075,65712,68403,71148,73947, -}; -#else -static int rdmult_lut[QINDEX_RANGE]= -{ - 3,5,7,9,12,15,19,23, - 27,32,37,42,48,54,61,68, - 75,83,91,99,108,117,127,137, - 147,169,192,217,243,271,300,331, - 363,397,450,507,567,631,698,768, - 842,919,999,1083,1170,1261,1355,1452, - 1587,1728,1875,2028,2187,2352,2523,2700, - 2883,3072,3267,3468,3675,3888,4107,4332, - 4563,4800,5043,5292,5547,5808,6075,6348, - 6627,6912,7203,7500,7880,8269,8667,9075, - 9492,9919,10355,10800,11255,11719,12192,12675, - 13167,13669,14180,14700,15230,15769,16317,16875, - 18019,19200,20419,21675,22969,24300,25669,27075, - 28519,30000,31519,33075,34669,36300,37969,39675, - 41772,43923,46128,48387,50700,53067,55488,57963, - 61347,64827,69312,73947,78732,83667,89787,97200, -}; -#endif +static int rdmult_lut[QINDEX_RANGE]; + /* values are now correlated to quantizer */ static int sad_per_bit16lut[QINDEX_RANGE]; static int sad_per_bit4lut[QINDEX_RANGE]; @@ -220,6 +181,19 @@ void vp8_init_me_luts() } } +int compute_rd_mult( int qindex ) +{ + int q; + + q = vp8_dc_quant(qindex,0); +#if CONFIG_EXTEND_QRANGE + return (3 * q * q) >> 4; +#else + return (3 * q * q); +#endif + +} + void vp8cx_initialize_me_consts(VP8_COMP *cpi, int QIndex) { cpi->mb.sadperbit16 = sad_per_bit16lut[QIndex]; @@ -239,7 +213,8 @@ void vp8_initialize_rd_consts(VP8_COMP *cpi, int QIndex) // if (cpi->common.refresh_golden_frame || // cpi->common.refresh_alt_ref_frame) QIndex=(QIndex<0)? 0 : ((QIndex>127)?127 : QIndex); - cpi->RDMULT = rdmult_lut[QIndex]; + + cpi->RDMULT = compute_rd_mult(QIndex); // Extend rate multiplier along side quantizer zbin increases if (cpi->zbin_over_quant > 0)