From: James Zern Date: Wed, 1 Mar 2017 00:17:49 +0000 (-0800) Subject: Revert "Fix for max qindex calculation of a gf interval" X-Git-Tag: v1.7.0~663 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8697d14ec8ca4a0d6062ad8b11cf3f97fe62f6d4;p=libvpx 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 --- diff --git a/vp9/encoder/vp9_firstpass.c b/vp9/encoder/vp9_firstpass.c index 3234b1abf..b51cedd89 100644 --- a/vp9/encoder/vp9_firstpass.c +++ b/vp9/encoder/vp9_firstpass.c @@ -1546,7 +1546,6 @@ static int get_twopass_worst_quality(VP9_COMP *cpi, const double section_err, 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 @@ static int get_twopass_worst_quality(VP9_COMP *cpi, const double section_err, 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 @@ static int get_twopass_worst_quality(VP9_COMP *cpi, const double section_err, 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 @@ static int get_twopass_worst_quality(VP9_COMP *cpi, const double section_err, 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 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { 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 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { // 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