ref: a00dad39bd8a64aec35b987c730a8f54112472ee
parent: 603075fa04d7a8c119304f52a559e51db5045bcf
author: Paul Wilkins <paulwilkins@google.com>
date: Fri Jan 3 09:14:04 EST 2014
No arf right before real scene cut. To reduce pulsing we now allow an arf just before forced key frames and at the end of a clip or section (which may be stitched to another clip or section). However, this does not make sense for key frames arising from real scene cuts. Change from original patch reflects other recent changes in regard to alignment of gf/arf and kf groups. Change-Id: I074a91d1207e9b3e28085af982f6718aa599775f
--- a/vp9/encoder/vp9_firstpass.c
+++ b/vp9/encoder/vp9_firstpass.c
@@ -1660,7 +1660,7 @@
// Don't allow a gf too near the next kf
if ((cpi->rc.frames_to_key - i) < MIN_GF_INTERVAL) {
- while (i < cpi->rc.frames_to_key) {
+ while (i < (cpi->rc.frames_to_key + !cpi->rc.next_key_frame_forced)) {
i++;
if (EOF == input_stats(&cpi->twopass, this_frame))
@@ -1695,6 +1695,9 @@
if (allow_alt_ref &&
(i < cpi->oxcf.lag_in_frames) &&
(i >= MIN_GF_INTERVAL) &&
+ // for real scene cuts (not forced kfs) dont allow arf very near kf.
+ (cpi->rc.next_key_frame_forced ||
+ (i <= (cpi->rc.frames_to_key - MIN_GF_INTERVAL))) &&
((next_frame.pcnt_inter > 0.75) ||
(next_frame.pcnt_second_ref > 0.5)) &&
((mv_in_out_accumulator / (double)i > -0.2) ||
@@ -2367,6 +2370,8 @@
// Load a the next frame's stats
input_stats(&cpi->twopass, &tmp_frame);
}
+ cpi->rc.next_key_frame_forced = 1;
+ } else if (cpi->twopass.stats_in == cpi->twopass.stats_in_end) {
cpi->rc.next_key_frame_forced = 1;
} else {
cpi->rc.next_key_frame_forced = 0;
--
⑨