diff options
-rwxr-xr-x | configure | 2 | ||||
-rw-r--r-- | vp9/encoder/vp9_firstpass.c | 27 |
2 files changed, 27 insertions, 2 deletions
@@ -319,6 +319,7 @@ CONFIG_LIST=" better_hw_compatibility experimental size_limit + always_adjust_bpm ${EXPERIMENT_LIST} " CMDLINE_SELECT=" @@ -378,6 +379,7 @@ CMDLINE_SELECT=" better_hw_compatibility vp9_highbitdepth experimental + always_adjust_bpm " process_cmdline() { diff --git a/vp9/encoder/vp9_firstpass.c b/vp9/encoder/vp9_firstpass.c index 5eeeef6a5..a970f6d97 100644 --- a/vp9/encoder/vp9_firstpass.c +++ b/vp9/encoder/vp9_firstpass.c @@ -1586,6 +1586,7 @@ 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 = @@ -1594,6 +1595,18 @@ 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); +// 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 @@ static int get_twopass_worst_quality(VP9_COMP *cpi, const double section_err, 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 @@ static int get_twopass_worst_quality(VP9_COMP *cpi, const double section_err, 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 @@ 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; + +#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 @@ 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; } - +#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 |