ref: 3ab1a4aadb7ca04a1a3df65d45d921c122a2c75f
parent: d749bc7b33230f128baec7ecfa19c0d3e1607956
parent: a612e4b49385aa3d3d94fd259fcb77294659b0b5
author: Paul Wilkins <paulwilkins@google.com>
date: Tue Jul 16 11:06:05 EDT 2019
Merge "Limit active best quality of layered ARF frames"
--- a/vp9/encoder/vp9_firstpass.c
+++ b/vp9/encoder/vp9_firstpass.c
@@ -3239,6 +3239,7 @@
gf_group->bit_allocation[0] = kf_bits;
gf_group->update_type[0] = KF_UPDATE;
gf_group->rf_level[0] = KF_STD;
+ gf_group->layer_depth[0] = 0;
// Note the total error score of the kf group minus the key frame itself.
twopass->kf_group_error_left = (kf_group_err - kf_mod_err);
--- a/vp9/encoder/vp9_firstpass.h
+++ b/vp9/encoder/vp9_firstpass.h
@@ -192,6 +192,7 @@
int extend_maxq;
int extend_minq_fast;
int arnr_strength_adjustment;
+ int last_qindex_of_arf_layer[MAX_ARF_LAYERS];
GF_GROUP gf_group;
} TWO_PASS;
--- a/vp9/encoder/vp9_ratectrl.c
+++ b/vp9/encoder/vp9_ratectrl.c
@@ -1486,10 +1486,21 @@
// Extension to max or min Q if undershoot or overshoot is outside
// the permitted range.
if (frame_is_intra_only(cm) || boost_frame) {
+ const int layer_depth = gf_group->layer_depth[gf_group_index];
active_best_quality -=
(cpi->twopass.extend_minq + cpi->twopass.extend_minq_fast);
active_worst_quality += (cpi->twopass.extend_maxq / 2);
+
+ if (gf_group->rf_level[gf_group_index] == GF_ARF_LOW) {
+ assert(layer_depth > 1);
+ active_best_quality =
+ VPXMAX(active_best_quality,
+ cpi->twopass.last_qindex_of_arf_layer[layer_depth - 1]);
+ }
} else {
+ const int max_layer_depth = gf_group->max_layer_depth;
+ assert(max_layer_depth > 0);
+
active_best_quality -=
(cpi->twopass.extend_minq + cpi->twopass.extend_minq_fast) / 2;
active_worst_quality += cpi->twopass.extend_maxq;
@@ -1496,7 +1507,9 @@
// For normal frames do not allow an active minq lower than the q used for
// the last boosted frame.
- active_best_quality = VPXMAX(active_best_quality, rc->last_boosted_qindex);
+ active_best_quality =
+ VPXMAX(active_best_quality,
+ cpi->twopass.last_qindex_of_arf_layer[max_layer_depth - 1]);
}
#if LIMIT_QRANGE_FOR_ALTREF_AND_KEY
@@ -1795,6 +1808,9 @@
RATE_CONTROL *const rc = &cpi->rc;
SVC *const svc = &cpi->svc;
const int qindex = cm->base_qindex;
+ const GF_GROUP *gf_group = &cpi->twopass.gf_group;
+ const int gf_group_index = cpi->twopass.gf_group.index;
+ const int layer_depth = gf_group->layer_depth[gf_group_index];
// Update rate control heuristics
rc->projected_frame_size = (int)(bytes_used << 3);
@@ -1849,6 +1865,15 @@
(cpi->refresh_golden_frame && !rc->is_src_frame_alt_ref)))) {
rc->last_boosted_qindex = qindex;
}
+
+ if ((qindex < cpi->twopass.last_qindex_of_arf_layer[layer_depth]) ||
+ (cm->frame_type == KEY_FRAME) ||
+ (!rc->constrained_gf_group &&
+ (cpi->refresh_alt_ref_frame ||
+ (cpi->refresh_golden_frame && !rc->is_src_frame_alt_ref)))) {
+ cpi->twopass.last_qindex_of_arf_layer[layer_depth] = qindex;
+ }
+
if (frame_is_intra_only(cm)) rc->last_kf_qindex = qindex;
update_buffer_level_postencode(cpi, rc->projected_frame_size);