diff options
author | Paul Wilkins <paulwilkins@google.com> | 2015-01-22 08:28:19 -0800 |
---|---|---|
committer | Gerrit Code Review <gerrit@gerrit.golo.chromium.org> | 2015-01-22 08:28:19 -0800 |
commit | cf3202132f74081292173e8cd6aff4bf9ca2c0af (patch) | |
tree | 0f05cd9866e249cc5993141a65ddfde4d676e297 | |
parent | cd0830f4526d4d12658c285ee49276fecba887cd (diff) | |
parent | 0bff1efc2b8f6ce0a30cfe0e56b9b15ba2c4418a (diff) | |
download | libvpx-cf3202132f74081292173e8cd6aff4bf9ca2c0af.tar libvpx-cf3202132f74081292173e8cd6aff4bf9ca2c0af.tar.gz libvpx-cf3202132f74081292173e8cd6aff4bf9ca2c0af.tar.bz2 libvpx-cf3202132f74081292173e8cd6aff4bf9ca2c0af.zip |
Merge "Bug when last group before forced key frame is short."
-rw-r--r-- | vp9/encoder/vp9_firstpass.c | 3 | ||||
-rw-r--r-- | vp9/encoder/vp9_ratectrl.c | 10 | ||||
-rw-r--r-- | vp9/encoder/vp9_ratectrl.h | 1 |
3 files changed, 12 insertions, 2 deletions
diff --git a/vp9/encoder/vp9_firstpass.c b/vp9/encoder/vp9_firstpass.c index 74f5efbec..3b0f2f012 100644 --- a/vp9/encoder/vp9_firstpass.c +++ b/vp9/encoder/vp9_firstpass.c @@ -1843,6 +1843,9 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { twopass->gf_zeromotion_pct = (int)(zero_motion_accumulator * 1000.0); + // Was the group length constrained by the requirement for a new KF? + rc->constrained_gf_group = (i >= rc->frames_to_key) ? 1 : 0; + // Set the interval until the next gf. if (cpi->common.frame_type == KEY_FRAME || rc->source_alt_ref_active) rc->baseline_gf_interval = i - 1; diff --git a/vp9/encoder/vp9_ratectrl.c b/vp9/encoder/vp9_ratectrl.c index 3cc9d9a7b..21f4cce03 100644 --- a/vp9/encoder/vp9_ratectrl.c +++ b/vp9/encoder/vp9_ratectrl.c @@ -1254,7 +1254,9 @@ void vp9_rc_postencode_update(VP9_COMP *cpi, uint64_t bytes_used) { // better than that already stored. // This is used to help set quality in forced key frames to reduce popping if ((qindex < rc->last_boosted_qindex) || - (((cm->frame_type == KEY_FRAME) || cpi->refresh_alt_ref_frame || + (cm->frame_type == KEY_FRAME) || + (!rc->constrained_gf_group && + (cpi->refresh_alt_ref_frame || (cpi->refresh_golden_frame && !rc->is_src_frame_alt_ref)))) { rc->last_boosted_qindex = qindex; } @@ -1358,8 +1360,12 @@ void vp9_rc_get_one_pass_vbr_params(VP9_COMP *cpi) { rc->baseline_gf_interval = DEFAULT_GF_INTERVAL; rc->frames_till_gf_update_due = rc->baseline_gf_interval; // NOTE: frames_till_gf_update_due must be <= frames_to_key. - if (rc->frames_till_gf_update_due > rc->frames_to_key) + if (rc->frames_till_gf_update_due > rc->frames_to_key) { rc->frames_till_gf_update_due = rc->frames_to_key; + rc->constrained_gf_group = 1; + } else { + rc->constrained_gf_group = 0; + } cpi->refresh_golden_frame = 1; rc->source_alt_ref_pending = USE_ALTREF_FOR_ONE_PASS; rc->gfu_boost = DEFAULT_GF_BOOST; diff --git a/vp9/encoder/vp9_ratectrl.h b/vp9/encoder/vp9_ratectrl.h index cf709274d..a53f4e0a2 100644 --- a/vp9/encoder/vp9_ratectrl.h +++ b/vp9/encoder/vp9_ratectrl.h @@ -55,6 +55,7 @@ typedef struct { int max_gf_interval; int static_scene_max_gf_interval; int baseline_gf_interval; + int constrained_gf_group; int frames_to_key; int frames_since_key; int this_key_frame_forced; |