ref: ce7b38459aee4442c66a32647b650de79e35d437
parent: 85f3a82355a16ded505c8c50d85bfca0f55782c7
author: paulwilkins <paulwilkins@google.com>
date: Thu Jan 5 07:35:53 EST 2017
Aggressive VBR method. VBR method that allows a wider Q range for the first normal frame in each ARF group and then centers the min - max range for the rest of the arf group on the chosen Q value for that first frame. This allows for quite rapid adjustment of the active Q range even if the initial estimate is poor. In some cases where the ARF frames themselves are tending to undershoot but the normal frames are overshooting this can still give net undershoot. This can be corrected by allowing a larger Q delta for arf frames but is usually is a sign that the allocation to the arfs was to high. Change-Id: Icec87758925d8f7aeb2dca29aac0ff9496237469
--- a/vp9/encoder/vp9_encoder.c
+++ b/vp9/encoder/vp9_encoder.c
@@ -3317,6 +3317,9 @@
int frame_under_shoot_limit;
int q = 0, q_low = 0, q_high = 0;
int enable_acl;
+#ifdef AGRESSIVE_VBR
+ int qrange_adj = 1;
+#endif
set_size_independent_vars(cpi);
@@ -3332,6 +3335,17 @@
if (loop_count == 0 || cpi->resize_pending != 0) {
set_size_dependent_vars(cpi, &q, &bottom_index, &top_index);
+#ifdef AGRESSIVE_VBR
+ if (two_pass_first_group_inter(cpi)) {
+ // Adjustment limits for min and max q
+ qrange_adj = VPXMAX(1, (top_index - bottom_index) / 2);
+
+ bottom_index = VPXMAX(bottom_index - qrange_adj / 2,
+ cpi->oxcf.best_allowed_q);
+ top_index = VPXMIN(cpi->oxcf.worst_allowed_q,
+ top_index + qrange_adj / 2);
+ }
+#endif
// TODO(agrange) Scale cpi->max_mv_magnitude if frame-size has changed.
set_mv_search_params(cpi);
@@ -3591,6 +3605,13 @@
if (cpi->sf.recode_loop >= ALLOW_RECODE_KFARFGF)
if (loop || !enable_acl) restore_coding_context(cpi);
} while (loop);
+
+#ifdef AGRESSIVE_VBR
+ if (two_pass_first_group_inter(cpi)) {
+ cpi->twopass.active_worst_quality =
+ VPXMIN(q + qrange_adj, cpi->oxcf.worst_allowed_q);
+ }
+#endif
if (enable_acl) {
vp9_encode_frame(cpi);
--- a/vp9/encoder/vp9_firstpass.c
+++ b/vp9/encoder/vp9_firstpass.c
@@ -2463,7 +2463,11 @@
}
// Limit maximum boost based on interval length.
+#ifdef AGRESSIVE_VBR
+ rc->gfu_boost = VPXMIN((int)rc->gfu_boost, i * 140);
+#else
rc->gfu_boost = VPXMIN((int)rc->gfu_boost, i * 200);
+#endif
// Set the interval until the next gf.
rc->baseline_gf_interval = i - (is_key_frame || rc->source_alt_ref_pending);
@@ -2666,10 +2670,16 @@
}
#define FRAMES_TO_CHECK_DECAY 8
-#define KF_MAX_FRAME_BOOST 96.0
#define MIN_KF_TOT_BOOST 300
-#define MAX_KF_TOT_BOOST 5400
#define KF_BOOST_SCAN_MAX_FRAMES 32
+
+#ifdef AGRESSIVE_VBR
+#define KF_MAX_FRAME_BOOST 80.0
+#define MAX_KF_TOT_BOOST 4800
+#else
+#define KF_MAX_FRAME_BOOST 96.0
+#define MAX_KF_TOT_BOOST 5400
+#endif
static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
int i, j;
--- a/vp9/encoder/vp9_ratectrl.c
+++ b/vp9/encoder/vp9_ratectrl.c
@@ -93,10 +93,17 @@
static int rtc_minq_12[QINDEX_RANGE];
#endif
+#ifdef AGRESSIVE_VBR
+static int gf_high = 2400;
+static int gf_low = 400;
+static int kf_high = 4000;
+static int kf_low = 400;
+#else
static int gf_high = 2000;
static int gf_low = 400;
static int kf_high = 5000;
static int kf_low = 400;
+#endif
// Functions to compute the active minq lookup table entries based on a
// formulaic approach to facilitate easier adjustment of the Q tables.
@@ -126,9 +133,14 @@
const double maxq = vp9_convert_qindex_to_q(i, bit_depth);
kf_low_m[i] = get_minq_index(maxq, 0.000001, -0.0004, 0.150, bit_depth);
kf_high_m[i] = get_minq_index(maxq, 0.0000021, -0.00125, 0.55, bit_depth);
+#ifdef AGRESSIVE_VBR
+ arfgf_low[i] = get_minq_index(maxq, 0.0000015, -0.0009, 0.275, bit_depth);
+ inter[i] = get_minq_index(maxq, 0.00000271, -0.00113, 0.80, bit_depth);
+#else
arfgf_low[i] = get_minq_index(maxq, 0.0000015, -0.0009, 0.30, bit_depth);
- arfgf_high[i] = get_minq_index(maxq, 0.0000021, -0.00125, 0.55, bit_depth);
inter[i] = get_minq_index(maxq, 0.00000271, -0.00113, 0.70, bit_depth);
+#endif
+ arfgf_high[i] = get_minq_index(maxq, 0.0000021, -0.00125, 0.55, bit_depth);
rtc[i] = get_minq_index(maxq, 0.00000271, -0.00113, 0.70, bit_depth);
}
}
--- a/vp9/encoder/vp9_ratectrl.h
+++ b/vp9/encoder/vp9_ratectrl.h
@@ -21,6 +21,9 @@
extern "C" {
#endif
+// Used to control agressive VBR mode.
+// #define AGRESSIVE_VBR 1
+
// Bits Per MB at different Q (Multiplied by 512)
#define BPER_MB_NORMBITS 9