From 70b885a0e890bd8dbf9732bb4a1f791441c5a234 Mon Sep 17 00:00:00 2001 From: Paul Wilkins Date: Fri, 12 Nov 2010 11:35:30 +0000 Subject: Added extra two pass stats gathering. Added code to record spend so far against planed budget. Change-Id: I5a3335346fa1771b2b1219df9f6127f9993d2594 --- vp8/encoder/firstpass.c | 36 +++++++++++++++++++++++++++++------- vp8/encoder/onyx_int.h | 8 +++++++- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/vp8/encoder/firstpass.c b/vp8/encoder/firstpass.c index a7f5ce44c..a4e420667 100644 --- a/vp8/encoder/firstpass.c +++ b/vp8/encoder/firstpass.c @@ -1145,6 +1145,7 @@ void vp8_init_second_pass(VP8_COMP *cpi) cpi->output_frame_rate = cpi->oxcf.frame_rate; cpi->bits_left = (long long)(cpi->total_stats->duration * cpi->oxcf.target_bandwidth / 10000000.0) ; cpi->bits_left -= (long long)(cpi->total_stats->duration * two_pass_min_rate / 10000000.0); + cpi->clip_bits_total = cpi->bits_left; vp8_avg_stats(cpi->total_stats); @@ -1173,17 +1174,25 @@ void vp8_init_second_pass(VP8_COMP *cpi) { start_pos = cpi->stats_in; // Note starting "file" position - cpi->modified_total_error_left = 0.0; + cpi->modified_error_total = 0.0; + cpi->modified_error_used = 0.0; while (vp8_input_stats(cpi, &this_frame) != EOF) { - cpi->modified_total_error_left += calculate_modified_err(cpi, &this_frame); + cpi->modified_error_total += calculate_modified_err(cpi, &this_frame); } + cpi->modified_error_left = cpi->modified_error_total; reset_fpf_position(cpi, start_pos); // Reset file position } + // Calculate the clip target modified bits per error + // The observed bpe starts as the same number. + cpi->clip_bpe = cpi->bits_left / + DOUBLE_DIVIDE_CHECK(cpi->modified_error_total); + cpi->observed_bpe = cpi->clip_bpe; + cpi->fp_motion_map_stats = (unsigned char *)cpi->stats_in; } @@ -1585,6 +1594,9 @@ static void define_gf_group(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame) // Reset the file position reset_fpf_position(cpi, start_pos); + // Update the record of error used so far (only done once per gf group) + cpi->modified_error_used += gf_group_err; + // Assign bits to the arf or gf. { int Boost; @@ -1882,6 +1894,16 @@ void vp8_second_pass(VP8_COMP *cpi) // Is this a GF / ARF (Note that a KF is always also a GF) if (cpi->frames_till_gf_update_due == 0) { + // Update monitor of the bits per error observed so far. + // Done once per gf group based on what has gone before + // so do nothing if this is the first frame. + if (cpi->common.current_video_frame > 0) + { + cpi->observed_bpe = + (double)(cpi->clip_bits_total - cpi->bits_left) / + cpi->modified_error_used; + } + // Define next gf group and assign bits to it vpx_memcpy(&this_frame_copy, &this_frame, sizeof(this_frame)); define_gf_group(cpi, &this_frame_copy); @@ -2196,7 +2218,7 @@ void vp8_find_next_key_frame(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame) } // Calculate the number of bits that should be assigned to the kf group. - if ((cpi->bits_left > 0) && ((int)cpi->modified_total_error_left > 0)) + if ((cpi->bits_left > 0) && ((int)cpi->modified_error_left > 0)) { // Max for a single normal frame (not key frame) int max_bits = frame_max_bits(cpi); @@ -2208,7 +2230,7 @@ void vp8_find_next_key_frame(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame) // complexity of the section cpi->kf_group_bits = (long long)( cpi->bits_left * ( kf_group_err / - cpi->modified_total_error_left )); + cpi->modified_error_left )); // Clip based on maximum per frame rate defined by the user. max_grp_bits = (long long)max_bits * (long long)cpi->frames_to_key; @@ -2461,7 +2483,7 @@ void vp8_find_next_key_frame(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame) double alt_kf_grp_bits = ((double)cpi->bits_left * (kf_mod_err * (double)cpi->frames_to_key) / - DOUBLE_DIVIDE_CHECK(cpi->modified_total_error_left)); + DOUBLE_DIVIDE_CHECK(cpi->modified_error_left)); alt_kf_bits = (int)((double)kf_boost * (alt_kf_grp_bits / (double)allocation_chunks)); @@ -2479,7 +2501,7 @@ void vp8_find_next_key_frame(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame) alt_kf_bits = (int)((double)cpi->bits_left * (kf_mod_err / - DOUBLE_DIVIDE_CHECK(cpi->modified_total_error_left))); + DOUBLE_DIVIDE_CHECK(cpi->modified_error_left))); if (alt_kf_bits > cpi->kf_bits) { @@ -2499,7 +2521,7 @@ void vp8_find_next_key_frame(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame) // Adjust the count of total modified error left. // The count of bits left is adjusted elsewhere based on real coded frame sizes - cpi->modified_total_error_left -= kf_group_err; + cpi->modified_error_left -= kf_group_err; if (cpi->oxcf.allow_spatial_resampling) { diff --git a/vp8/encoder/onyx_int.h b/vp8/encoder/onyx_int.h index b3a09ec1b..0eaba0017 100644 --- a/vp8/encoder/onyx_int.h +++ b/vp8/encoder/onyx_int.h @@ -469,11 +469,17 @@ typedef struct double start_tot_err_left; double min_error; - double modified_total_error_left; + double modified_error_total; + double modified_error_used; + double modified_error_left; + double clip_bpe; + double observed_bpe; + double avg_iiratio; int target_bandwidth; long long bits_left; + long long clip_bits_total; FIRSTPASS_STATS *total_stats; FIRSTPASS_STATS *this_frame_stats; FIRSTPASS_STATS *stats_in, *stats_in_end; -- cgit v1.2.3 From ad6150f7697ce486630c75cb53fa607928ced4c7 Mon Sep 17 00:00:00 2001 From: Paul Wilkins Date: Mon, 22 Nov 2010 13:17:35 +0000 Subject: Recalibration of bits per MB tables The baseline bits per MB prediction tables have been re calibrated based on the assumption that bits per mb is inversely proportional to the quantizer level. Change-Id: Ibd355c7acac4b8053dda1baf1032fe35f11da7f7 --- vp8/encoder/ratectrl.c | 72 ++++++++++++++++++++++++++------------------------ 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/vp8/encoder/ratectrl.c b/vp8/encoder/ratectrl.c index dd324f435..c05e80e4b 100644 --- a/vp8/encoder/ratectrl.c +++ b/vp8/encoder/ratectrl.c @@ -45,46 +45,48 @@ extern int inter_b_modes[10]; // Bits Per MB at different Q (Multiplied by 512) #define BPER_MB_NORMBITS 9 +// Work in progress recalibration of baseline rate tables based on +// the assumption that bits per mb is inversely proportional to the +// quantizer value. const int vp8_bits_per_mb[2][QINDEX_RANGE] = { - // (Updated 19 March 08) Baseline estimate of INTRA-frame Bits Per MB at each Q: + // Intra case 450000/Qintra { - 674781, 606845, 553905, 524293, 500428, 452540, 435379, 414719, - 390970, 371082, 359416, 341807, 336957, 317263, 303724, 298402, - 285688, 275237, 268455, 262560, 256038, 248734, 241087, 237615, - 229247, 225211, 219112, 213920, 211559, 202714, 198482, 193401, - 187866, 183453, 179212, 175965, 171852, 167235, 163972, 160560, - 156032, 154349, 151390, 148725, 145708, 142311, 139981, 137700, - 134084, 131863, 129746, 128498, 126077, 123461, 121290, 117782, - 114883, 112332, 108410, 105685, 103434, 101192, 98587, 95959, - 94059, 92017, 89970, 87936, 86142, 84801, 82736, 81106, - 79668, 78135, 76641, 75103, 73943, 72693, 71401, 70098, - 69165, 67901, 67170, 65987, 64923, 63534, 62378, 61302, - 59921, 58941, 57844, 56782, 55960, 54973, 54257, 53454, - 52230, 50938, 49962, 49190, 48288, 47270, 46738, 46037, - 45020, 44027, 43216, 42287, 41594, 40702, 40081, 39414, - 38282, 37627, 36987, 36375, 35808, 35236, 34710, 34162, - 33659, 33327, 32751, 32384, 31936, 31461, 30982, 30582, + 1125000,900000, 750000, 642857, 562500, 500000, 450000, 450000, + 409090, 375000, 346153, 321428, 300000, 281250, 264705, 264705, + 250000, 236842, 225000, 225000, 214285, 214285, 204545, 204545, + 195652, 195652, 187500, 180000, 180000, 173076, 166666, 160714, + 155172, 150000, 145161, 140625, 136363, 132352, 128571, 125000, + 121621, 121621, 118421, 115384, 112500, 109756, 107142, 104651, + 102272, 100000, 97826, 97826, 95744, 93750, 91836, 90000, + 88235, 86538, 84905, 83333, 81818, 80357, 78947, 77586, + 76271, 75000, 73770, 72580, 71428, 70312, 69230, 68181, + 67164, 66176, 65217, 64285, 63380, 62500, 61643, 60810, + 60000, 59210, 59210, 58441, 57692, 56962, 56250, 55555, + 54878, 54216, 53571, 52941, 52325, 51724, 51136, 50561, + 49450, 48387, 47368, 46875, 45918, 45000, 44554, 44117, + 43269, 42452, 41666, 40909, 40178, 39473, 38793, 38135, + 36885, 36290, 35714, 35156, 34615, 34090, 33582, 33088, + 32608, 32142, 31468, 31034, 30405, 29801, 29220, 28662, }, - - // (Updated 19 March 08) Baseline estimate of INTER-frame Bits Per MB at each Q: + // Inter case 285000/Qinter { - 497401, 426316, 372064, 352732, 335763, 283921, 273848, 253321, - 233181, 217727, 210030, 196685, 194836, 178396, 167753, 164116, - 154119, 146929, 142254, 138488, 133591, 127741, 123166, 120226, - 114188, 111756, 107882, 104749, 102522, 96451, 94424, 90905, - 87286, 84931, 82111, 80534, 77610, 74700, 73037, 70715, - 68006, 67235, 65374, 64009, 62134, 60180, 59105, 57691, - 55509, 54512, 53318, 52693, 51194, 49840, 48944, 46980, - 45668, 44177, 42348, 40994, 39859, 38889, 37717, 36391, - 35482, 34622, 33795, 32756, 32002, 31492, 30573, 29737, - 29152, 28514, 27941, 27356, 26859, 26329, 25874, 25364, - 24957, 24510, 24290, 23689, 23380, 22845, 22481, 22066, - 21587, 21219, 20880, 20452, 20260, 19926, 19661, 19334, - 18915, 18391, 18046, 17833, 17441, 17105, 16888, 16729, - 16383, 16023, 15706, 15442, 15222, 14938, 14673, 14452, - 14005, 13807, 13611, 13447, 13223, 13102, 12963, 12801, - 12627, 12534, 12356, 12228, 12056, 11907, 11746, 11643, + 712500, 570000, 475000, 407142, 356250, 316666, 285000, 259090, + 237500, 219230, 203571, 190000, 178125, 167647, 158333, 150000, + 142500, 135714, 129545, 123913, 118750, 114000, 109615, 105555, + 101785, 98275, 95000, 91935, 89062, 86363, 83823, 81428, + 79166, 77027, 75000, 73076, 71250, 69512, 67857, 66279, + 64772, 63333, 61956, 60638, 59375, 58163, 57000, 55882, + 54807, 53773, 52777, 51818, 50892, 50000, 49137, 47500, + 45967, 44531, 43181, 41911, 40714, 39583, 38513, 37500, + 36538, 35625, 34756, 33928, 33139, 32386, 31666, 30978, + 30319, 29687, 29081, 28500, 27941, 27403, 26886, 26388, + 25909, 25446, 25000, 24568, 23949, 23360, 22800, 22265, + 21755, 21268, 20802, 20357, 19930, 19520, 19127, 18750, + 18387, 18037, 17701, 17378, 17065, 16764, 16473, 16101, + 15745, 15405, 15079, 14766, 14467, 14179, 13902, 13636, + 13380, 13133, 12895, 12666, 12445, 12179, 11924, 11632, + 11445, 11220, 11003, 10795, 10594, 10401, 10215, 10035, } }; -- cgit v1.2.3