| Index: source/libvpx/vp9/encoder/vp9_ratectrl.c
|
| ===================================================================
|
| --- source/libvpx/vp9/encoder/vp9_ratectrl.c (revision 281795)
|
| +++ source/libvpx/vp9/encoder/vp9_ratectrl.c (working copy)
|
| @@ -186,6 +186,8 @@
|
| }
|
|
|
| void vp9_rc_init(const VP9EncoderConfig *oxcf, int pass, RATE_CONTROL *rc) {
|
| + int i;
|
| +
|
| if (pass == 0 && oxcf->rc_mode == VPX_CBR) {
|
| rc->avg_frame_qindex[KEY_FRAME] = oxcf->worst_allowed_q;
|
| rc->avg_frame_qindex[INTER_FRAME] = oxcf->worst_allowed_q;
|
| @@ -227,9 +229,9 @@
|
| rc->tot_q = 0.0;
|
| rc->avg_q = vp9_convert_qindex_to_q(oxcf->worst_allowed_q);
|
|
|
| - rc->rate_correction_factor = 1.0;
|
| - rc->key_frame_rate_correction_factor = 1.0;
|
| - rc->gf_rate_correction_factor = 1.0;
|
| + for (i = 0; i < RATE_FACTOR_LEVELS; ++i) {
|
| + rc->rate_correction_factors[i] = 1.0;
|
| + }
|
| }
|
|
|
| int vp9_rc_drop_frame(VP9_COMP *cpi) {
|
| @@ -271,28 +273,40 @@
|
| }
|
|
|
| static double get_rate_correction_factor(const VP9_COMP *cpi) {
|
| + const RATE_CONTROL *const rc = &cpi->rc;
|
| +
|
| if (cpi->common.frame_type == KEY_FRAME) {
|
| - return cpi->rc.key_frame_rate_correction_factor;
|
| + return rc->rate_correction_factors[KF_STD];
|
| + } else if (cpi->pass == 2) {
|
| + RATE_FACTOR_LEVEL rf_lvl =
|
| + cpi->twopass.gf_group.rf_level[cpi->twopass.gf_group.index];
|
| + return rc->rate_correction_factors[rf_lvl];
|
| } else {
|
| if ((cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) &&
|
| - !cpi->rc.is_src_frame_alt_ref &&
|
| + !rc->is_src_frame_alt_ref &&
|
| !(cpi->use_svc && cpi->oxcf.rc_mode == VPX_CBR))
|
| - return cpi->rc.gf_rate_correction_factor;
|
| + return rc->rate_correction_factors[GF_ARF_STD];
|
| else
|
| - return cpi->rc.rate_correction_factor;
|
| + return rc->rate_correction_factors[INTER_NORMAL];
|
| }
|
| }
|
|
|
| static void set_rate_correction_factor(VP9_COMP *cpi, double factor) {
|
| + RATE_CONTROL *const rc = &cpi->rc;
|
| +
|
| if (cpi->common.frame_type == KEY_FRAME) {
|
| - cpi->rc.key_frame_rate_correction_factor = factor;
|
| + rc->rate_correction_factors[KF_STD] = factor;
|
| + } else if (cpi->pass == 2) {
|
| + RATE_FACTOR_LEVEL rf_lvl =
|
| + cpi->twopass.gf_group.rf_level[cpi->twopass.gf_group.index];
|
| + rc->rate_correction_factors[rf_lvl] = factor;
|
| } else {
|
| if ((cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) &&
|
| - !cpi->rc.is_src_frame_alt_ref &&
|
| + !rc->is_src_frame_alt_ref &&
|
| !(cpi->use_svc && cpi->oxcf.rc_mode == VPX_CBR))
|
| - cpi->rc.gf_rate_correction_factor = factor;
|
| + rc->rate_correction_factors[GF_ARF_STD] = factor;
|
| else
|
| - cpi->rc.rate_correction_factor = factor;
|
| + rc->rate_correction_factors[INTER_NORMAL] = factor;
|
| }
|
| }
|
|
|
| @@ -628,8 +642,8 @@
|
|
|
| if (frame_is_intra_only(cm)) {
|
| active_best_quality = rc->best_quality;
|
| -#if !CONFIG_MULTIPLE_ARF
|
| - // Handle the special case for key frames forced when we have75 reached
|
| +
|
| + // Handle the special case for key frames forced when we have reached
|
| // the maximum key frame interval. Here force the Q to a range
|
| // based on the ambient Q to reduce the risk of popping.
|
| if (rc->this_key_frame_forced) {
|
| @@ -660,13 +674,6 @@
|
| active_best_quality += vp9_compute_qdelta(rc, q_val,
|
| q_val * q_adj_factor);
|
| }
|
| -#else
|
| - double current_q;
|
| - // Force the KF quantizer to be 30% of the active_worst_quality.
|
| - current_q = vp9_convert_qindex_to_q(active_worst_quality);
|
| - active_best_quality = active_worst_quality
|
| - + vp9_compute_qdelta(rc, current_q, current_q * 0.3);
|
| -#endif
|
| } else if (!rc->is_src_frame_alt_ref &&
|
| (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
|
| // Use the lower of active_worst_quality and recent
|
| @@ -768,23 +775,7 @@
|
| q = *top_index;
|
| }
|
| }
|
| -#if CONFIG_MULTIPLE_ARF
|
| - // Force the quantizer determined by the coding order pattern.
|
| - if (cpi->multi_arf_enabled && (cm->frame_type != KEY_FRAME) &&
|
| - cpi->oxcf.rc_mode != VPX_Q) {
|
| - double new_q;
|
| - double current_q = vp9_convert_qindex_to_q(active_worst_quality);
|
| - int level = cpi->this_frame_weight;
|
| - assert(level >= 0);
|
| - new_q = current_q * (1.0 - (0.2 * (cpi->max_arf_level - level)));
|
| - q = active_worst_quality +
|
| - vp9_compute_qdelta(rc, current_q, new_q);
|
|
|
| - *bottom_index = q;
|
| - *top_index = q;
|
| - printf("frame:%d q:%d\n", cm->current_video_frame, q);
|
| - }
|
| -#endif
|
| assert(*top_index <= rc->worst_quality &&
|
| *top_index >= rc->best_quality);
|
| assert(*bottom_index <= rc->worst_quality &&
|
| @@ -805,7 +796,6 @@
|
| int q;
|
|
|
| if (frame_is_intra_only(cm) || vp9_is_upper_layer_key_frame(cpi)) {
|
| -#if !CONFIG_MULTIPLE_ARF
|
| // Handle the special case for key frames forced when we have75 reached
|
| // the maximum key frame interval. Here force the Q to a range
|
| // based on the ambient Q to reduce the risk of popping.
|
| @@ -840,13 +830,6 @@
|
| active_best_quality += vp9_compute_qdelta(rc, q_val,
|
| q_val * q_adj_factor);
|
| }
|
| -#else
|
| - double current_q;
|
| - // Force the KF quantizer to be 30% of the active_worst_quality.
|
| - current_q = vp9_convert_qindex_to_q(active_worst_quality);
|
| - active_best_quality = active_worst_quality
|
| - + vp9_compute_qdelta(rc, current_q, current_q * 0.3);
|
| -#endif
|
| } else if (!rc->is_src_frame_alt_ref &&
|
| (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
|
| // Use the lower of active_worst_quality and recent
|
| @@ -909,21 +892,20 @@
|
| *bottom_index = active_best_quality;
|
|
|
| #if LIMIT_QRANGE_FOR_ALTREF_AND_KEY
|
| + vp9_clear_system_state();
|
| {
|
| - int qdelta = 0;
|
| - vp9_clear_system_state();
|
| -
|
| - // Limit Q range for the adaptive loop.
|
| - if ((cm->frame_type == KEY_FRAME || vp9_is_upper_layer_key_frame(cpi)) &&
|
| - !rc->this_key_frame_forced) {
|
| - qdelta = vp9_compute_qdelta_by_rate(&cpi->rc, cm->frame_type,
|
| - active_worst_quality, 2.0);
|
| - } else if (!rc->is_src_frame_alt_ref &&
|
| - (oxcf->rc_mode != VPX_CBR) &&
|
| - (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
|
| - qdelta = vp9_compute_qdelta_by_rate(&cpi->rc, cm->frame_type,
|
| - active_worst_quality, 1.75);
|
| - }
|
| + const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
|
| + const double rate_factor_deltas[RATE_FACTOR_LEVELS] = {
|
| + 1.00, // INTER_NORMAL
|
| + 1.00, // INTER_HIGH
|
| + 1.50, // GF_ARF_LOW
|
| + 1.75, // GF_ARF_STD
|
| + 2.00, // KF_STD
|
| + };
|
| + const double rate_factor =
|
| + rate_factor_deltas[gf_group->rf_level[gf_group->index]];
|
| + int qdelta = vp9_compute_qdelta_by_rate(&cpi->rc, cm->frame_type,
|
| + active_worst_quality, rate_factor);
|
| *top_index = active_worst_quality + qdelta;
|
| *top_index = (*top_index > *bottom_index) ? *top_index : *bottom_index;
|
| }
|
| @@ -945,23 +927,7 @@
|
| q = *top_index;
|
| }
|
| }
|
| -#if CONFIG_MULTIPLE_ARF
|
| - // Force the quantizer determined by the coding order pattern.
|
| - if (cpi->multi_arf_enabled && (cm->frame_type != KEY_FRAME) &&
|
| - cpi->oxcf.rc_mode != VPX_Q) {
|
| - double new_q;
|
| - double current_q = vp9_convert_qindex_to_q(active_worst_quality);
|
| - int level = cpi->this_frame_weight;
|
| - assert(level >= 0);
|
| - new_q = current_q * (1.0 - (0.2 * (cpi->max_arf_level - level)));
|
| - q = active_worst_quality +
|
| - vp9_compute_qdelta(rc, current_q, new_q);
|
|
|
| - *bottom_index = q;
|
| - *top_index = q;
|
| - printf("frame:%d q:%d\n", cm->current_video_frame, q);
|
| - }
|
| -#endif
|
| assert(*top_index <= rc->worst_quality &&
|
| *top_index >= rc->best_quality);
|
| assert(*bottom_index <= rc->worst_quality &&
|
| @@ -1026,11 +992,8 @@
|
| RATE_CONTROL *const rc = &cpi->rc;
|
| rc->frames_since_golden = 0;
|
|
|
| -#if CONFIG_MULTIPLE_ARF
|
| - if (!cpi->multi_arf_enabled)
|
| -#endif
|
| - // Clear the alternate reference update pending flag.
|
| - rc->source_alt_ref_pending = 0;
|
| + // Mark the alt ref as done (setting to 0 means no further alt refs pending).
|
| + rc->source_alt_ref_pending = 0;
|
|
|
| // Set the alternate reference frame active flag
|
| rc->source_alt_ref_active = 1;
|
| @@ -1044,8 +1007,13 @@
|
| // this frame refreshes means next frames don't unless specified by user
|
| rc->frames_since_golden = 0;
|
|
|
| - if (!rc->source_alt_ref_pending)
|
| + if (cpi->pass == 2) {
|
| + if (!rc->source_alt_ref_pending &&
|
| + cpi->twopass.gf_group.rf_level[0] == GF_ARF_STD)
|
| rc->source_alt_ref_active = 0;
|
| + } else if (!rc->source_alt_ref_pending) {
|
| + rc->source_alt_ref_active = 0;
|
| + }
|
|
|
| // Decrement count down till next gf
|
| if (rc->frames_till_gf_update_due > 0)
|
| @@ -1388,6 +1356,8 @@
|
|
|
| // Extended interval for genuinely static scenes
|
| rc->static_scene_max_gf_interval = oxcf->key_freq >> 1;
|
| + if (rc->static_scene_max_gf_interval > (MAX_LAG_BUFFERS * 2))
|
| + rc->static_scene_max_gf_interval = MAX_LAG_BUFFERS * 2;
|
|
|
| if (is_altref_enabled(oxcf)) {
|
| if (rc->static_scene_max_gf_interval > oxcf->lag_in_frames - 1)
|
|
|