// Frame is too large
if (rc->projected_frame_size > rc->this_frame_target) {
// Special case if the projected size is > the max allowed.
- if (rc->projected_frame_size >= rc->max_frame_bandwidth)
- q_high = rc->worst_quality;
+ if (rc->projected_frame_size >= rc->max_frame_bandwidth) {
+ double q_val_high;
+ q_val_high = vp9_convert_qindex_to_q(q_high, cm->bit_depth);
+ q_val_high = q_val_high * ((double)rc->projected_frame_size /
+ rc->max_frame_bandwidth);
+ q_high = vp9_convert_q_to_qindex(q_val_high, cm->bit_depth);
+ q_high = clamp(q_high, rc->best_quality, rc->worst_quality);
+ }
// Raise Qlow as to at least the current value
- q_low = q < q_high ? q + 1 : q_high;
+ qstep =
+ get_qstep_adj(rc->projected_frame_size, rc->this_frame_target);
+ q_low = VPXMIN(q + qstep, q_high);
+ // q_low = q < q_high ? q + 1 : q_high;
if (undershoot_seen || loop_at_this_size > 1) {
// Update rate_correction_factor unless
#endif
}
+ int vp9_convert_q_to_qindex(double q_val, vpx_bit_depth_t bit_depth) {
+ int i;
+
+ for (i = 0; i < QINDEX_RANGE; ++i)
+ if (vp9_convert_qindex_to_q(i, bit_depth) >= q_val)
+ break;
+
+ if (i == QINDEX_RANGE)
+ i--;
+
+ return i;
+ }
+
int vp9_rc_bits_per_mb(FRAME_TYPE frame_type, int qindex,
- double correction_factor,
- vpx_bit_depth_t bit_depth) {
+ double correction_factor, vpx_bit_depth_t bit_depth) {
const double q = vp9_convert_qindex_to_q(qindex, bit_depth);
int enumerator = frame_type == KEY_FRAME ? 2700000 : 1800000;