Fix to avoid abrupt relaxation of max qindex in recode path

The fix relaxes the max qindex based on the data from previous loop of
coding if output frame size is greater than maximum frame size allowed

Change-Id: Iac1f63ec67559d68766e090a7cbb80b812b2560f
This commit is contained in:
Ranjit Kumar Tulabandu 2017-01-04 17:42:01 +05:30
parent 042572177b
commit 5f21aba4b0
3 changed files with 23 additions and 2 deletions

View File

@ -3792,8 +3792,14 @@ static void encode_with_recode_loop(VP9_COMP *cpi,
// 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;

View File

@ -174,6 +174,19 @@ double vp9_convert_qindex_to_q(int qindex, vpx_bit_depth_t bit_depth) {
#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) {

View File

@ -177,6 +177,8 @@ int vp9_estimate_bits_at_q(FRAME_TYPE frame_kind, int q, int mbs,
double vp9_convert_qindex_to_q(int qindex, vpx_bit_depth_t bit_depth);
int vp9_convert_q_to_qindex(double q_val, vpx_bit_depth_t bit_depth);
void vp9_rc_init_minq_luts(void);
int vp9_rc_get_default_min_gf_interval(int width, int height, double framerate);