Commit 587f0cd3 authored by Yaowu Xu's avatar Yaowu Xu Committed by Gerrit Code Review
Browse files

Merge "Prevent severe rate control errors in CBR mode"

parents 3c715863 ffa06b37
...@@ -430,7 +430,8 @@ void vp9_rc_update_rate_correction_factors(VP9_COMP *cpi, int damp_var) { ...@@ -430,7 +430,8 @@ void vp9_rc_update_rate_correction_factors(VP9_COMP *cpi, int damp_var) {
adjustment_limit = 0.75; adjustment_limit = 0.75;
break; break;
case 1: case 1:
adjustment_limit = 0.125 + 0.5 * MIN(1, fabs(log10(0.01 * correction_factor))); adjustment_limit = 0.25 +
0.5 * MIN(1, fabs(log10(0.01 * correction_factor)));
break; break;
case 2: case 2:
default: default:
...@@ -438,12 +439,21 @@ void vp9_rc_update_rate_correction_factors(VP9_COMP *cpi, int damp_var) { ...@@ -438,12 +439,21 @@ void vp9_rc_update_rate_correction_factors(VP9_COMP *cpi, int damp_var) {
break; break;
} }
cpi->rc.q_2_frame = cpi->rc.q_1_frame;
cpi->rc.q_1_frame = cm->base_qindex;
cpi->rc.rc_2_frame = cpi->rc.rc_1_frame;
if (correction_factor > 110)
cpi->rc.rc_1_frame = -1;
else if (correction_factor < 90)
cpi->rc.rc_1_frame = 1;
else
cpi->rc.rc_1_frame = 0;
if (correction_factor > 102) { if (correction_factor > 102) {
// We are not already at the worst allowable quality // We are not already at the worst allowable quality
correction_factor = (int)(100 + ((correction_factor - 100) * correction_factor = (int)(100 + ((correction_factor - 100) *
adjustment_limit)); adjustment_limit));
rate_correction_factor = (rate_correction_factor * correction_factor) / 100; rate_correction_factor = (rate_correction_factor * correction_factor) / 100;
// Keep rate_correction_factor within limits // Keep rate_correction_factor within limits
if (rate_correction_factor > MAX_BPB_FACTOR) if (rate_correction_factor > MAX_BPB_FACTOR)
rate_correction_factor = MAX_BPB_FACTOR; rate_correction_factor = MAX_BPB_FACTOR;
...@@ -494,6 +504,14 @@ int vp9_rc_regulate_q(const VP9_COMP *cpi, int target_bits_per_frame, ...@@ -494,6 +504,14 @@ int vp9_rc_regulate_q(const VP9_COMP *cpi, int target_bits_per_frame,
} }
} while (++i <= active_worst_quality); } while (++i <= active_worst_quality);
// In CBR mode, this makes sure q is between oscillating Qs to prevent
// resonance.
if (cpi->oxcf.rc_mode == VPX_CBR &&
(cpi->rc.rc_1_frame * cpi->rc.rc_2_frame == -1) &&
cpi->rc.q_1_frame != cpi->rc.q_2_frame) {
q = clamp(q, MIN(cpi->rc.q_1_frame, cpi->rc.q_2_frame),
MAX(cpi->rc.q_1_frame, cpi->rc.q_2_frame));
}
return q; return q;
} }
......
...@@ -99,7 +99,14 @@ typedef struct { ...@@ -99,7 +99,14 @@ typedef struct {
int64_t starting_buffer_level; int64_t starting_buffer_level;
int64_t optimal_buffer_level; int64_t optimal_buffer_level;
int64_t maximum_buffer_size; int64_t maximum_buffer_size;
// int active_best_quality; // rate control history for last frame(1) and the frame before(2).
// -1: undershot
// 1: overshoot
// 0: not initialized.
int rc_1_frame;
int rc_2_frame;
int q_1_frame;
int q_2_frame;
} RATE_CONTROL; } RATE_CONTROL;
struct VP9_COMP; struct VP9_COMP;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment