ref: 02e5bde3f87a084eba9153590e84cb9914f598de
parent: 085f76e535a4376042d8eeadb1e4c5f246d74802
author: Paul Wilkins <paulwilkins@google.com>
date: Wed Apr 16 12:53:55 EDT 2014
Merge two new VBR adjustment schemes. To make direct side by side testing this patch combines two VBR corrections schemes to allow more direct side by side testing. (The other patch was by Debargha chg id I0cd1f7...) Change-Id: I271c45e5c4ccf8de8305589000218b80d9dc3a25
--- a/vp9/encoder/vp9_firstpass.c
+++ b/vp9/encoder/vp9_firstpass.c
@@ -2198,7 +2198,7 @@
// For VBR...adjustment to the frame target based on error from previous frames
void vbr_rate_correction(int * this_frame_target,
const int64_t vbr_bits_off_target) {
- int max_delta = *this_frame_target / 10;
+ int max_delta = (*this_frame_target * 15) / 100;
// vbr_bits_off_target > 0 means we have extra bits to spend
if (vbr_bits_off_target > 0) {
@@ -2370,10 +2370,17 @@
// kf_group_bits & gf_group_bits to reflect any deviation from the target
// rate in this frame. This alters the allocation of bits to the
// remaning frames in the group / clip.
+ //
// This method can give rise to unstable behaviour near the end of a clip
// or kf/gf group of frames where any accumulated error is corrected over an
- // ever decreasing number of frames.
- const int bits_used = rc->projected_frame_size;
+ // ever decreasing number of frames. Hence we change the balance of target
+ // vs. actual bitrate gradually as we progress towards the end of the
+ // sequence in order to mitigate this effect.
+ const double progress =
+ (double)(cpi->twopass.stats_in - cpi->twopass.stats_in_start) /
+ (cpi->twopass.stats_in_end - cpi->twopass.stats_in_start);
+ const int bits_used = progress * cpi->rc.this_frame_target +
+ (1.0 - progress) * cpi->rc.projected_frame_size;
#endif
cpi->twopass.bits_left -= bits_used;
--- a/vp9/encoder/vp9_ratectrl.c
+++ b/vp9/encoder/vp9_ratectrl.c
@@ -85,7 +85,7 @@
gf_high_motion_minq[i] = get_minq_index(maxq, 0.0000021, -0.00125, 0.50);
afq_low_motion_minq[i] = get_minq_index(maxq, 0.0000015, -0.0009, 0.33);
afq_high_motion_minq[i] = get_minq_index(maxq, 0.0000021, -0.00125, 0.55);
- inter_minq[i] = get_minq_index(maxq, 0.00000271, -0.00113, 0.55);
+ inter_minq[i] = get_minq_index(maxq, 0.00000271, -0.00113, 0.75);
}
}
--
⑨