Skip to content

Commit

Permalink
Merge "Increase active best quality linearly"
Browse files Browse the repository at this point in the history
  • Loading branch information
jingninghan authored and Gerrit Code Review committed May 24, 2019
2 parents f95f687 + b0509e8 commit 1541211
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 0 deletions.
16 changes: 16 additions & 0 deletions vp9/encoder/vp9_firstpass.c
Original file line number Diff line number Diff line change
Expand Up @@ -2648,6 +2648,17 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
rc->source_alt_ref_pending = 0;
}

#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));
}

#ifdef AGGRESSIVE_VBR
// Limit maximum boost based on interval length.
rc->gfu_boost = VPXMIN((int)rc->gfu_boost, i * 140);
Expand Down Expand Up @@ -3195,6 +3206,11 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
// Default to normal-sized frame on keyframes.
cpi->rc.next_frame_size_selector = UNSCALED;
}
#define ARF_ACTIVE_BEST_QUALITY_ADJUSTMENT_WINDOW_SIZE 64
// TODO([email protected]): 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) {
Expand Down
11 changes: 11 additions & 0 deletions vp9/encoder/vp9_ratectrl.c
Original file line number Diff line number Diff line change
Expand Up @@ -435,6 +435,7 @@ void vp9_rc_init(const VP9EncoderConfig *oxcf, int pass, RATE_CONTROL *rc) {
rc->last_post_encode_dropped_scene_change = 0;
rc->use_post_encode_drop = 0;
rc->ext_use_post_encode_drop = 0;
rc->arf_active_best_quality_adjustment_factor = 1.0;
}

static int check_buffer_above_thresh(VP9_COMP *cpi, int drop_mark) {
Expand Down Expand Up @@ -1415,6 +1416,8 @@ static int rc_pick_q_and_bounds_two_pass(const VP9_COMP *cpi, int *bottom_index,
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;
const int boost_frame =
!rc->is_src_frame_alt_ref &&
(cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame);
Expand Down Expand Up @@ -1442,6 +1445,14 @@ static int rc_pick_q_and_bounds_two_pass(const VP9_COMP *cpi, int *bottom_index,
}
active_best_quality = get_gf_active_quality(cpi, q, cm->bit_depth);

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);

// Modify best quality for second level arfs. For mode VPX_Q this
// becomes the baseline frame q.
if (gf_group->rf_level[gf_group_index] == GF_ARF_LOW) {
Expand Down
2 changes: 2 additions & 0 deletions vp9/encoder/vp9_ratectrl.h
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,8 @@ typedef struct {
int ext_use_post_encode_drop;

int damped_adjustment[RATE_FACTOR_LEVELS];
double arf_active_best_quality_adjustment_factor;
int arf_active_best_quality_adjustment_window;
} RATE_CONTROL;

struct VP9_COMP;
Expand Down

0 comments on commit 1541211

Please sign in to comment.