Refactor: Split postprocess_q_and_bounds to two functions
Let processing of active_best_quality and active_worst_quality
be a stand-alone function. So they can be passed as constants
into getting q.
Change-Id: Id879796a75f4cc11338e6fa339fbdb38e0a36a7e
diff --git a/av1/encoder/ratectrl.c b/av1/encoder/ratectrl.c
index a82c2e2..6b93e10 100644
--- a/av1/encoder/ratectrl.c
+++ b/av1/encoder/ratectrl.c
@@ -1177,19 +1177,15 @@
*active_worst = active_worst_quality;
}
-// Does some final adjustments to the q value and bounds. This does not apply to
-// AOM_Q mode unless it is an INTRA_ONLY_FRAME.
-static void postprocess_q_and_bounds(const AV1_COMP *cpi, int width, int height,
- int *active_worst, int *active_best,
- int *q_out, int is_intrl_arf_boost) {
+static void adjust_active_best_and_worst_quality(const AV1_COMP *cpi,
+ const int is_intrl_arf_boost,
+ int *active_worst,
+ int *active_best) {
const AV1_COMMON *const cm = &cpi->common;
const RATE_CONTROL *const rc = &cpi->rc;
- const AV1EncoderConfig *oxcf = &cpi->oxcf;
const int bit_depth = cpi->common.seq_params.bit_depth;
int active_best_quality = *active_best;
int active_worst_quality = *active_worst;
- int q;
-
// Extension to max or min Q if undershoot or overshoot is outside
// the permitted range.
if (cpi->oxcf.rc_mode != AOM_Q) {
@@ -1229,7 +1225,18 @@
active_worst_quality =
clamp(active_worst_quality, active_best_quality, rc->worst_quality);
- if (oxcf->rc_mode == AOM_Q ||
+ *active_best = active_best_quality;
+ *active_worst = active_worst_quality;
+}
+
+static int get_q(const AV1_COMP *cpi, const int width, const int height,
+ const int active_worst_quality,
+ const int active_best_quality) {
+ const AV1_COMMON *const cm = &cpi->common;
+ const RATE_CONTROL *const rc = &cpi->rc;
+ int q;
+
+ if (cpi->oxcf.rc_mode == AOM_Q ||
(frame_is_intra_only(cm) && !rc->this_key_frame_forced &&
cpi->twopass.kf_zeromotion_pct >= STATIC_KF_GROUP_THRESH &&
rc->frames_to_key > 1)) {
@@ -1243,32 +1250,26 @@
q = AOMMIN(rc->last_boosted_qindex,
(active_best_quality + active_worst_quality) / 2);
}
+ q = clamp(q, active_best_quality, active_worst_quality);
} else {
q = av1_rc_regulate_q(cpi, rc->this_frame_target, active_best_quality,
active_worst_quality, width, height);
if (q > active_worst_quality) {
// Special case when we are targeting the max allowed rate.
- if (rc->this_frame_target >= rc->max_frame_bandwidth)
- active_worst_quality = q;
- else
+ if (rc->this_frame_target < rc->max_frame_bandwidth) {
q = active_worst_quality;
+ }
}
+ q = AOMMAX(q, active_best_quality);
}
- q = clamp(q, active_best_quality, active_worst_quality);
-
- *active_best = active_best_quality;
- *active_worst = active_worst_quality;
- *q_out = q;
+ return q;
}
// Returns |active_best_quality| for an inter frame.
// The |active_best_quality| depends on different rate control modes:
// VBR, Q, CQ, CBR.
// The returning active_best_quality could further be adjusted in
-// postprocess_q_and_bounds().
-// TODO(chengchen): consider consolidate the logic here, so that
-// |active_best_quality| and |active_worst_quality| are constant after this
-// function call.
+// adjust_active_best_and_worst_quality().
static int get_active_best_quality(const AV1_COMP *const cpi,
const int active_worst_quality,
const int cq_level, const int gf_index) {
@@ -1357,8 +1358,15 @@
get_active_best_quality(cpi, active_worst_quality, cq_level, gf_index);
}
- postprocess_q_and_bounds(cpi, width, height, &active_worst_quality,
- &active_best_quality, &q, is_intrl_arf_boost);
+ adjust_active_best_and_worst_quality(
+ cpi, is_intrl_arf_boost, &active_worst_quality, &active_best_quality);
+ q = get_q(cpi, width, height, active_worst_quality, active_best_quality);
+
+ // Special case when we are targeting the max allowed rate.
+ if (rc->this_frame_target >= rc->max_frame_bandwidth &&
+ q > active_worst_quality) {
+ active_worst_quality = q;
+ }
*top_index = active_worst_quality;
*bottom_index = active_best_quality;