ref: 689ad89e8625e7e5c2b981efd4c39e87e37b89b1
parent: 66a96fd3de6426f8a7ec5293a858d97009ae00c4
author: Jim Bankoski <[email protected]>
date: Tue Jul 11 02:48:13 EDT 2017
Reintroduce fix for max qindex calculation of a gf interval This reintroduces the fix: https://chromium-review.googlesource.com/c/422807/ and later reverted here: https://chromium-review.googlesource.com/c/447843/ BUG=webm:1355 This time behind a compile time flag : configure --disable-always_adjust_bpm configure --enable-always_adjust_bpm This should make side by side testing easier and let users of the lib pick which way they want to go. Change-Id: I7d7b37b83015dc001810af84c132cbc1e71ba8d6
--- a/configure
+++ b/configure
@@ -319,6 +319,7 @@
better_hw_compatibility
experimental
size_limit
+ always_adjust_bpm
${EXPERIMENT_LIST}
"
CMDLINE_SELECT="
@@ -378,6 +379,7 @@
better_hw_compatibility
vp9_highbitdepth
experimental
+ always_adjust_bpm
"
process_cmdline() {
--- a/vp9/encoder/vp9_firstpass.c
+++ b/vp9/encoder/vp9_firstpass.c
@@ -1586,6 +1586,7 @@
const RATE_CONTROL *const rc = &cpi->rc;
const VP9EncoderConfig *const oxcf = &cpi->oxcf;
TWO_PASS *const twopass = &cpi->twopass;
+ double last_group_rate_err;
// Clamp the target rate to VBR min / max limts.
const int target_rate =
@@ -1594,6 +1595,18 @@
noise_factor = fclamp(noise_factor, NOISE_FACTOR_MIN, NOISE_FACTOR_MAX);
inactive_zone = fclamp(inactive_zone, 0.0, 1.0);
+// TODO(jimbankoski): remove #if here or below when this has been
+// well tested.
+#if CONFIG_ALWAYS_ADJUST_BPM
+ // based on recent history adjust expectations of bits per macroblock.
+ last_group_rate_err =
+ (double)twopass->rolling_arf_group_actual_bits /
+ DOUBLE_DIVIDE_CHECK((double)twopass->rolling_arf_group_target_bits);
+ last_group_rate_err = VPXMAX(0.25, VPXMIN(4.0, last_group_rate_err));
+ twopass->bpm_factor *= (3.0 + last_group_rate_err) / 4.0;
+ twopass->bpm_factor = VPXMAX(0.25, VPXMIN(4.0, twopass->bpm_factor));
+#endif
+
if (target_rate <= 0) {
return rc->worst_quality; // Highest value allowed
} else {
@@ -1604,11 +1617,13 @@
const int active_mbs = (int)VPXMAX(1, (double)num_mbs * active_pct);
const double av_err_per_mb = section_err / active_pct;
const double speed_term = 1.0 + 0.04 * oxcf->speed;
- double last_group_rate_err;
const int target_norm_bits_per_mb =
(int)(((uint64_t)target_rate << BPER_MB_NORMBITS) / active_mbs);
int q;
+// TODO(jimbankoski): remove #if here or above when this has been
+// well tested.
+#if !CONFIG_ALWAYS_ADJUST_BPM
// based on recent history adjust expectations of bits per macroblock.
last_group_rate_err =
(double)twopass->rolling_arf_group_actual_bits /
@@ -1616,6 +1631,7 @@
last_group_rate_err = VPXMAX(0.25, VPXMIN(4.0, last_group_rate_err));
twopass->bpm_factor *= (3.0 + last_group_rate_err) / 4.0;
twopass->bpm_factor = VPXMAX(0.25, VPXMIN(4.0, twopass->bpm_factor));
+#endif
// Try and pick a max Q that will be high enough to encode the
// content at the given rate.
@@ -2595,6 +2611,12 @@
group_av_noise, vbr_group_bits_per_frame);
twopass->active_worst_quality =
(tmp_q + (twopass->active_worst_quality * 3)) >> 2;
+
+#if CONFIG_ALWAYS_ADJUST_BPM
+ // Reset rolling actual and target bits counters for ARF groups.
+ twopass->rolling_arf_group_target_bits = 0;
+ twopass->rolling_arf_group_actual_bits = 0;
+#endif
}
// Context Adjustment of ARNR filter strength
@@ -2629,10 +2651,11 @@
// Default to starting GF groups at normal frame size.
cpi->rc.next_frame_size_selector = UNSCALED;
}
-
+#if !CONFIG_ALWAYS_ADJUST_BPM
// Reset rolling actual and target bits counters for ARF groups.
twopass->rolling_arf_group_target_bits = 0;
twopass->rolling_arf_group_actual_bits = 0;
+#endif
}
// Threshold for use of the lagging second reference frame. High second ref