From 5f21aba4b011602f87a5a10b619ec52fb8303075 Mon Sep 17 00:00:00 2001 From: Ranjit Kumar Tulabandu Date: Wed, 4 Jan 2017 17:42:01 +0530 Subject: [PATCH] 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 --- vp9/encoder/vp9_encoder.c | 10 ++++++++-- vp9/encoder/vp9_ratectrl.c | 13 +++++++++++++ vp9/encoder/vp9_ratectrl.h | 2 ++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c index 147f97004..1e283aac0 100644 --- a/vp9/encoder/vp9_encoder.c +++ b/vp9/encoder/vp9_encoder.c @@ -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; diff --git a/vp9/encoder/vp9_ratectrl.c b/vp9/encoder/vp9_ratectrl.c index b45f8d0d9..bb95f7c31 100644 --- a/vp9/encoder/vp9_ratectrl.c +++ b/vp9/encoder/vp9_ratectrl.c @@ -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) { diff --git a/vp9/encoder/vp9_ratectrl.h b/vp9/encoder/vp9_ratectrl.h index 7024bcfa9..a35675bbd 100644 --- a/vp9/encoder/vp9_ratectrl.h +++ b/vp9/encoder/vp9_ratectrl.h @@ -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); -- 2.40.0