ref: 8697d14ec8ca4a0d6062ad8b11cf3f97fe62f6d4
parent: 66919e370bfa462adb776a8bc7ce5ca507623ee3
author: James Zern <jzern@google.com>
date: Tue Feb 28 11:17:49 EST 2017
Revert "Fix for max qindex calculation of a gf interval" This reverts commit d3db846cc50b1b0a9f6efcbe2b36c9c1943bc528. This change causes a large drop in psnr (4-5db) on low framerate difficult content (tested at 360/480p) BUG=b/35804225 Change-Id: I8e90012d3b9c8a0cddb062ba93b01b36c0e0c0a0
--- a/vp9/encoder/vp9_firstpass.c
+++ b/vp9/encoder/vp9_firstpass.c
@@ -1546,7 +1546,6 @@
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 =
@@ -1555,14 +1554,6 @@
noise_factor = fclamp(noise_factor, NOISE_FACTOR_MIN, NOISE_FACTOR_MAX);
inactive_zone = fclamp(inactive_zone, 0.0, 1.0);
- // 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));
-
if (target_rate <= 0) {
return rc->worst_quality; // Highest value allowed
} else {
@@ -1572,6 +1563,7 @@
const int active_mbs = VPXMAX(1, num_mbs - (int)(num_mbs * inactive_zone));
const double av_err_per_mb = section_err / active_mbs;
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;
@@ -1580,6 +1572,14 @@
if (is_two_pass_svc(cpi) && cpi->svc.spatial_layer_id > 0)
is_svc_upper_layer = 1;
+ // 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));
+
// Try and pick a max Q that will be high enough to encode the
// content at the given rate.
for (q = rc->best_quality; q < rc->worst_quality; ++q) {
@@ -2548,10 +2548,6 @@
group_av_noise, vbr_group_bits_per_frame);
twopass->active_worst_quality =
(tmp_q + (twopass->active_worst_quality * 3)) >> 2;
-
- // Reset rolling actual and target bits counters for ARF groups.
- twopass->rolling_arf_group_target_bits = 0;
- twopass->rolling_arf_group_actual_bits = 0;
}
// Context Adjustment of ARNR filter strength
@@ -2586,6 +2582,10 @@
// Default to starting GF groups at normal frame size.
cpi->rc.next_frame_size_selector = UNSCALED;
}
+
+ // Reset rolling actual and target bits counters for ARF groups.
+ twopass->rolling_arf_group_target_bits = 0;
+ twopass->rolling_arf_group_actual_bits = 0;
}
// Threshold for use of the lagging second reference frame. High second ref