| Index: source/libvpx/vp9/encoder/vp9_ratectrl.c
|
| ===================================================================
|
| --- source/libvpx/vp9/encoder/vp9_ratectrl.c (revision 292608)
|
| +++ source/libvpx/vp9/encoder/vp9_ratectrl.c (working copy)
|
| @@ -177,6 +177,9 @@
|
| const double q = vp9_convert_qindex_to_q(qindex, bit_depth);
|
| int enumerator = frame_type == KEY_FRAME ? 2700000 : 1800000;
|
|
|
| + assert(correction_factor <= MAX_BPB_FACTOR &&
|
| + correction_factor >= MIN_BPB_FACTOR);
|
| +
|
| // q based adjustment to baseline enumerator
|
| enumerator += (int)(enumerator * q) >> 12;
|
| return (int)(enumerator * correction_factor / q);
|
| @@ -187,7 +190,8 @@
|
| vpx_bit_depth_t bit_depth) {
|
| const int bpm = (int)(vp9_rc_bits_per_mb(frame_type, q, correction_factor,
|
| bit_depth));
|
| - return ((uint64_t)bpm * mbs) >> BPER_MB_NORMBITS;
|
| + return MAX(FRAME_OVERHEAD_BITS,
|
| + (int)((uint64_t)bpm * mbs) >> BPER_MB_NORMBITS);
|
| }
|
|
|
| int vp9_rc_clamp_pframe_target_size(const VP9_COMP *const cpi, int target) {
|
| @@ -276,7 +280,7 @@
|
| }
|
|
|
| rc->last_q[KEY_FRAME] = oxcf->best_allowed_q;
|
| - rc->last_q[INTER_FRAME] = oxcf->best_allowed_q;
|
| + rc->last_q[INTER_FRAME] = oxcf->worst_allowed_q;
|
|
|
| rc->buffer_level = rc->starting_buffer_level;
|
| rc->bits_off_target = rc->starting_buffer_level;
|
| @@ -298,7 +302,6 @@
|
| rc->source_alt_ref_active = 0;
|
|
|
| rc->frames_till_gf_update_due = 0;
|
| -
|
| rc->ni_av_qi = oxcf->worst_allowed_q;
|
| rc->ni_tot_qi = 0;
|
| rc->ni_frames = 0;
|
| @@ -410,7 +413,7 @@
|
| rate_correction_factor,
|
| cm->bit_depth);
|
| // Work out a size correction factor.
|
| - if (projected_size_based_on_q > 0)
|
| + if (projected_size_based_on_q > FRAME_OVERHEAD_BITS)
|
| correction_factor = (100 * cpi->rc.projected_frame_size) /
|
| projected_size_based_on_q;
|
|
|
| @@ -559,7 +562,7 @@
|
| int adjustment = 0;
|
| int active_worst_quality;
|
| if (cm->frame_type == KEY_FRAME)
|
| - return rc->worst_quality;
|
| + return rc->worst_quality * 4 / 5;
|
| if (cm->current_video_frame > 1)
|
| active_worst_quality = MIN(rc->worst_quality,
|
| rc->avg_frame_qindex[INTER_FRAME] * 5 / 4);
|
| @@ -988,6 +991,21 @@
|
| }
|
| }
|
|
|
| + // Extenstion to max or min Q if undershoot or overshoot is outside
|
| + // the permitted range.
|
| + if ((cpi->oxcf.rc_mode == VPX_VBR) &&
|
| + (cpi->twopass.gf_zeromotion_pct < VLOW_MOTION_THRESHOLD)) {
|
| + if (frame_is_intra_only(cm) ||
|
| + (!rc->is_src_frame_alt_ref &&
|
| + (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame))) {
|
| + active_best_quality -= cpi->twopass.extend_minq;
|
| + active_worst_quality += (cpi->twopass.extend_maxq / 2);
|
| + } else {
|
| + active_best_quality -= cpi->twopass.extend_minq / 2;
|
| + active_worst_quality += cpi->twopass.extend_maxq;
|
| + }
|
| + }
|
| +
|
| #if LIMIT_QRANGE_FOR_ALTREF_AND_KEY
|
| vp9_clear_system_state();
|
| // Static forced key frames Q restrictions dealt with elsewhere.
|
| @@ -1482,9 +1500,7 @@
|
| rc->max_gf_interval = 16;
|
|
|
| // 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;
|
| + rc->static_scene_max_gf_interval = MAX_LAG_BUFFERS * 2;
|
|
|
| if (is_altref_enabled(cpi)) {
|
| if (rc->static_scene_max_gf_interval > oxcf->lag_in_frames - 1)
|
|
|