summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Koleszar <jkoleszar@google.com>2010-11-23 00:05:05 -0500
committerJohn Koleszar <jkoleszar@google.com>2010-11-23 00:05:05 -0500
commit8416312095ef85d33148189a5f5d7bd1e4677f6c (patch)
tree8afa180bdaa76003544abc39584af6eb9270b176
parentb13d1c307e721e6475cfda83182b7e4aa5b49c3c (diff)
parentad6150f7697ce486630c75cb53fa607928ced4c7 (diff)
downloadlibvpx-8416312095ef85d33148189a5f5d7bd1e4677f6c.tar
libvpx-8416312095ef85d33148189a5f5d7bd1e4677f6c.tar.gz
libvpx-8416312095ef85d33148189a5f5d7bd1e4677f6c.tar.bz2
libvpx-8416312095ef85d33148189a5f5d7bd1e4677f6c.zip
Merge remote branch 'origin/master' into experimental
-rw-r--r--vp8/encoder/firstpass.c36
-rw-r--r--vp8/encoder/onyx_int.h8
-rw-r--r--vp8/encoder/ratectrl.c72
3 files changed, 73 insertions, 43 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;
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,
}
};