ref: 468e77b9ea78a5a7d60fb86d016b833982860d9c
parent: 5372f1e41e8f32b34e34bf2ef012a1d37542abad
parent: 16de4d7366f1f084eb969385016e1e950df9180f
author: Yunqing Wang <yunqingwang@google.com>
date: Thu Jul 11 11:07:55 EDT 2019
Merge "Adjust the quality of boosted frames"
--- a/vp9/encoder/vp9_firstpass.c
+++ b/vp9/encoder/vp9_firstpass.c
@@ -2060,8 +2060,19 @@
// Calculate the bits to be allocated to the group as a whole.
if ((twopass->kf_group_bits > 0) && (twopass->kf_group_error_left > 0.0)) {
+ int key_frame_interval = rc->frames_since_key + rc->frames_to_key;
+ int distance_from_next_key_frame =
+ rc->frames_to_key -
+ (rc->baseline_gf_interval + rc->source_alt_ref_pending);
+ int max_gf_bits_bias = rc->avg_frame_bandwidth;
+ double gf_interval_bias_bits_normalize_factor =
+ (double)rc->baseline_gf_interval / 16;
total_group_bits = (int64_t)(twopass->kf_group_bits *
(gf_group_err / twopass->kf_group_error_left));
+ // TODO(ravi): Experiment with different values of max_gf_bits_bias
+ total_group_bits +=
+ (int64_t)((double)distance_from_next_key_frame / key_frame_interval *
+ max_gf_bits_bias * gf_interval_bias_bits_normalize_factor);
} else {
total_group_bits = 0;
}
@@ -2651,13 +2662,27 @@
#define LAST_ALR_ACTIVE_BEST_QUALITY_ADJUSTMENT_FACTOR 0.2
rc->arf_active_best_quality_adjustment_factor = 1.0;
- if (rc->source_alt_ref_pending && !is_lossless_requested(&cpi->oxcf) &&
- rc->frames_to_key <= rc->arf_active_best_quality_adjustment_window) {
- rc->arf_active_best_quality_adjustment_factor =
- LAST_ALR_ACTIVE_BEST_QUALITY_ADJUSTMENT_FACTOR +
- (1.0 - LAST_ALR_ACTIVE_BEST_QUALITY_ADJUSTMENT_FACTOR) *
- (rc->frames_to_key - i) /
- VPXMAX(1, (rc->arf_active_best_quality_adjustment_window - i));
+ rc->arf_increase_active_best_quality = 0;
+
+ if (!is_lossless_requested(&cpi->oxcf)) {
+ if (rc->frames_since_key >= rc->frames_to_key) {
+ // Increase the active best quality in the second half of key frame
+ // interval.
+ rc->arf_active_best_quality_adjustment_factor =
+ LAST_ALR_ACTIVE_BEST_QUALITY_ADJUSTMENT_FACTOR +
+ (1.0 - LAST_ALR_ACTIVE_BEST_QUALITY_ADJUSTMENT_FACTOR) *
+ (rc->frames_to_key - i) /
+ (VPXMAX(1, ((rc->frames_to_key + rc->frames_since_key) / 2 - i)));
+ rc->arf_increase_active_best_quality = 1;
+ } else if ((rc->frames_to_key - i) > 0) {
+ // Reduce the active best quality in the first half of key frame interval.
+ rc->arf_active_best_quality_adjustment_factor =
+ LAST_ALR_ACTIVE_BEST_QUALITY_ADJUSTMENT_FACTOR +
+ (1.0 - LAST_ALR_ACTIVE_BEST_QUALITY_ADJUSTMENT_FACTOR) *
+ (rc->frames_since_key + i) /
+ (VPXMAX(1, (rc->frames_to_key + rc->frames_since_key) / 2 + i));
+ rc->arf_increase_active_best_quality = -1;
+ }
}
#ifdef AGGRESSIVE_VBR
@@ -3227,11 +3252,6 @@
// Default to normal-sized frame on keyframes.
cpi->rc.next_frame_size_selector = UNSCALED;
}
-#define ARF_ACTIVE_BEST_QUALITY_ADJUSTMENT_WINDOW_SIZE 64
- // TODO(ravi.chaudhary@ittiam.com): Experiment without the below min
- // condition. This might be helpful for small key frame intervals.
- rc->arf_active_best_quality_adjustment_window =
- VPXMIN(ARF_ACTIVE_BEST_QUALITY_ADJUSTMENT_WINDOW_SIZE, rc->frames_to_key);
}
static int is_skippable_frame(const VP9_COMP *cpi) {
--- a/vp9/encoder/vp9_ratectrl.c
+++ b/vp9/encoder/vp9_ratectrl.c
@@ -436,7 +436,7 @@
rc->use_post_encode_drop = 0;
rc->ext_use_post_encode_drop = 0;
rc->arf_active_best_quality_adjustment_factor = 1.0;
-
+ rc->arf_increase_active_best_quality = 0;
rc->preserve_arf_as_gld = 0;
rc->preserve_next_arf_as_gld = 0;
rc->show_arf_as_gld = 0;
@@ -1420,8 +1420,8 @@
int active_worst_quality = cpi->twopass.active_worst_quality;
int q;
int *inter_minq;
- int arf_active_best_quality_adjustment, arf_active_best_quality_max;
- int *arfgf_high_motion_minq;
+ int arf_active_best_quality_hl;
+ int *arfgf_high_motion_minq, *arfgf_low_motion_minq;
const int boost_frame =
!rc->is_src_frame_alt_ref &&
(cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame);
@@ -1448,14 +1448,20 @@
if (q < cq_level) q = cq_level;
}
active_best_quality = get_gf_active_quality(cpi, q, cm->bit_depth);
+ arf_active_best_quality_hl = active_best_quality;
- ASSIGN_MINQ_TABLE(cm->bit_depth, arfgf_high_motion_minq);
- arf_active_best_quality_max = arfgf_high_motion_minq[q];
- arf_active_best_quality_adjustment =
- arf_active_best_quality_max - active_best_quality;
- active_best_quality = arf_active_best_quality_max -
- (int)(arf_active_best_quality_adjustment *
- rc->arf_active_best_quality_adjustment_factor);
+ if (rc->arf_increase_active_best_quality == 1) {
+ ASSIGN_MINQ_TABLE(cm->bit_depth, arfgf_high_motion_minq);
+ arf_active_best_quality_hl = arfgf_high_motion_minq[q];
+ } else if (rc->arf_increase_active_best_quality == -1) {
+ ASSIGN_MINQ_TABLE(cm->bit_depth, arfgf_low_motion_minq);
+ arf_active_best_quality_hl = arfgf_low_motion_minq[q];
+ }
+ active_best_quality =
+ (int)((double)active_best_quality *
+ rc->arf_active_best_quality_adjustment_factor +
+ (double)arf_active_best_quality_hl *
+ (1.0 - rc->arf_active_best_quality_adjustment_factor));
// Modify best quality for second level arfs. For mode VPX_Q this
// becomes the baseline frame q.
--- a/vp9/encoder/vp9_ratectrl.h
+++ b/vp9/encoder/vp9_ratectrl.h
@@ -198,7 +198,7 @@
int damped_adjustment[RATE_FACTOR_LEVELS];
double arf_active_best_quality_adjustment_factor;
- int arf_active_best_quality_adjustment_window;
+ int arf_increase_active_best_quality;
int preserve_arf_as_gld;
int preserve_next_arf_as_gld;