diff options
author | Jingning Han <jingning@google.com> | 2019-05-24 16:35:27 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2019-05-24 16:35:27 +0000 |
commit | 1541211f7e63da60005dd56cba3bb3ea47277649 (patch) | |
tree | b7ed4f208bd518615ca92160447677957288a571 /vp9/encoder | |
parent | f95f687e22e711c5fb53cad3d4a86a1428b1dcc5 (diff) | |
parent | b0509e8868a2fb1d64ea015cd9bbf125fd3ddcaa (diff) | |
download | libvpx-1541211f7e63da60005dd56cba3bb3ea47277649.tar libvpx-1541211f7e63da60005dd56cba3bb3ea47277649.tar.gz libvpx-1541211f7e63da60005dd56cba3bb3ea47277649.tar.bz2 libvpx-1541211f7e63da60005dd56cba3bb3ea47277649.zip |
Merge "Increase active best quality linearly"
Diffstat (limited to 'vp9/encoder')
-rw-r--r-- | vp9/encoder/vp9_firstpass.c | 16 | ||||
-rw-r--r-- | vp9/encoder/vp9_ratectrl.c | 11 | ||||
-rw-r--r-- | vp9/encoder/vp9_ratectrl.h | 2 |
3 files changed, 29 insertions, 0 deletions
diff --git a/vp9/encoder/vp9_firstpass.c b/vp9/encoder/vp9_firstpass.c index 20ed6f5e0..5aa48dd0d 100644 --- a/vp9/encoder/vp9_firstpass.c +++ b/vp9/encoder/vp9_firstpass.c @@ -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); @@ -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(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) { diff --git a/vp9/encoder/vp9_ratectrl.c b/vp9/encoder/vp9_ratectrl.c index c16529b35..e45030ab8 100644 --- a/vp9/encoder/vp9_ratectrl.c +++ b/vp9/encoder/vp9_ratectrl.c @@ -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) { @@ -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); @@ -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) { diff --git a/vp9/encoder/vp9_ratectrl.h b/vp9/encoder/vp9_ratectrl.h index a5c1f4cf0..2c2048edc 100644 --- a/vp9/encoder/vp9_ratectrl.h +++ b/vp9/encoder/vp9_ratectrl.h @@ -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; |