ref: 53f1452f5d104155b32ccac0af80ef8a85fe70c5
parent: 033fde8d224bdda97f8753584b99ca77e0d3338c
author: Deb Mukherjee <[email protected]>
date: Thu May 22 04:11:37 EDT 2014
Adjust cq_level in constrained quality mode If we are already saving a lot in bits from the target (maximum) bitrate in the constrained quality mode, allow the quantizer to go lower than the cq level. This hopefully will solve issues with getting too low a bitrate and consequently poor quality for certain videos in cq mode. Change-Id: I1c4e8b0171fcf58f95198b3add85eea5f3c8f19f
--- a/vp9/encoder/vp9_ratectrl.c
+++ b/vp9/encoder/vp9_ratectrl.c
@@ -607,6 +607,19 @@
return q;
}
+static int get_active_cq_level(const RATE_CONTROL *rc,
+ const VP9EncoderConfig *const oxcf) {
+ static const double cq_adjust_threshold = 0.5;
+ int active_cq_level = oxcf->cq_level;
+ if (oxcf->rc_mode == RC_MODE_CONSTRAINED_QUALITY) {
+ const double x = rc->total_actual_bits / rc->total_target_bits;
+ if (x < cq_adjust_threshold) {
+ active_cq_level = active_cq_level * x / cq_adjust_threshold;
+ }
+ }
+ return active_cq_level;
+}
+
static int rc_pick_q_and_bounds_one_pass_vbr(const VP9_COMP *cpi,
int *bottom_index,
int *top_index) {
@@ -613,7 +626,7 @@
const VP9_COMMON *const cm = &cpi->common;
const RATE_CONTROL *const rc = &cpi->rc;
const VP9EncoderConfig *const oxcf = &cpi->oxcf;
- const int cq_level = oxcf->cq_level;
+ const int cq_level = get_active_cq_level(rc, oxcf);
int active_best_quality;
int active_worst_quality = calc_active_worst_quality_one_pass_vbr(cpi);
int q;
@@ -791,7 +804,7 @@
const VP9_COMMON *const cm = &cpi->common;
const RATE_CONTROL *const rc = &cpi->rc;
const VP9EncoderConfig *const oxcf = &cpi->oxcf;
- const int cq_level = oxcf->cq_level;
+ const int cq_level = get_active_cq_level(rc, oxcf);
int active_best_quality;
int active_worst_quality = cpi->twopass.active_worst_quality;
int q;