| Index: source/libvpx/vp9/encoder/vp9_ratectrl.c
|
| diff --git a/source/libvpx/vp9/encoder/vp9_ratectrl.c b/source/libvpx/vp9/encoder/vp9_ratectrl.c
|
| index 3cc9d9a7b90c1e353cb67db0fbc1809f3b50986c..11da367b986344fed5f1662761ae969dd6237287 100644
|
| --- a/source/libvpx/vp9/encoder/vp9_ratectrl.c
|
| +++ b/source/libvpx/vp9/encoder/vp9_ratectrl.c
|
| @@ -396,7 +396,7 @@ static void set_rate_correction_factor(VP9_COMP *cpi, double factor) {
|
| }
|
| }
|
|
|
| -void vp9_rc_update_rate_correction_factors(VP9_COMP *cpi, int damp_var) {
|
| +void vp9_rc_update_rate_correction_factors(VP9_COMP *cpi) {
|
| const VP9_COMMON *const cm = &cpi->common;
|
| int correction_factor = 100;
|
| double rate_correction_factor = get_rate_correction_factor(cpi);
|
| @@ -431,19 +431,8 @@ void vp9_rc_update_rate_correction_factors(VP9_COMP *cpi, int damp_var) {
|
|
|
| // More heavily damped adjustment used if we have been oscillating either side
|
| // of target.
|
| - switch (damp_var) {
|
| - case 0:
|
| - adjustment_limit = 0.75;
|
| - break;
|
| - case 1:
|
| - adjustment_limit = 0.25 +
|
| - 0.5 * MIN(1, fabs(log10(0.01 * correction_factor)));
|
| - break;
|
| - case 2:
|
| - default:
|
| - adjustment_limit = 0.25;
|
| - break;
|
| - }
|
| + adjustment_limit = 0.25 +
|
| + 0.5 * MIN(1, fabs(log10(0.01 * correction_factor)));
|
|
|
| cpi->rc.q_2_frame = cpi->rc.q_1_frame;
|
| cpi->rc.q_1_frame = cm->base_qindex;
|
| @@ -1222,9 +1211,7 @@ void vp9_rc_postencode_update(VP9_COMP *cpi, uint64_t bytes_used) {
|
| rc->projected_frame_size = (int)(bytes_used << 3);
|
|
|
| // Post encode loop adjustment of Q prediction.
|
| - vp9_rc_update_rate_correction_factors(
|
| - cpi, (cpi->sf.recode_loop >= ALLOW_RECODE_KFARFGF) ? 2 :
|
| - ((oxcf->rc_mode == VPX_CBR) ? 1 : 0));
|
| + vp9_rc_update_rate_correction_factors(cpi);
|
|
|
| // Keep a record of last Q and ambient average Q.
|
| if (cm->frame_type == KEY_FRAME) {
|
| @@ -1254,7 +1241,9 @@ void vp9_rc_postencode_update(VP9_COMP *cpi, uint64_t bytes_used) {
|
| // better than that already stored.
|
| // This is used to help set quality in forced key frames to reduce popping
|
| if ((qindex < rc->last_boosted_qindex) ||
|
| - (((cm->frame_type == KEY_FRAME) || cpi->refresh_alt_ref_frame ||
|
| + (cm->frame_type == KEY_FRAME) ||
|
| + (!rc->constrained_gf_group &&
|
| + (cpi->refresh_alt_ref_frame ||
|
| (cpi->refresh_golden_frame && !rc->is_src_frame_alt_ref)))) {
|
| rc->last_boosted_qindex = qindex;
|
| }
|
| @@ -1358,8 +1347,12 @@ void vp9_rc_get_one_pass_vbr_params(VP9_COMP *cpi) {
|
| rc->baseline_gf_interval = DEFAULT_GF_INTERVAL;
|
| rc->frames_till_gf_update_due = rc->baseline_gf_interval;
|
| // NOTE: frames_till_gf_update_due must be <= frames_to_key.
|
| - if (rc->frames_till_gf_update_due > rc->frames_to_key)
|
| + if (rc->frames_till_gf_update_due > rc->frames_to_key) {
|
| rc->frames_till_gf_update_due = rc->frames_to_key;
|
| + rc->constrained_gf_group = 1;
|
| + } else {
|
| + rc->constrained_gf_group = 0;
|
| + }
|
| cpi->refresh_golden_frame = 1;
|
| rc->source_alt_ref_pending = USE_ALTREF_FOR_ONE_PASS;
|
| rc->gfu_boost = DEFAULT_GF_BOOST;
|
|
|