ref: 19f3b9c2ca64eb69c828def40b017f3eac9606cd
parent: c68e75b940fcf96e892c60c17af0e1f24bb315e9
author: angiebird <angiebird@google.com>
date: Mon Oct 21 14:49:21 EDT 2019
Rename i by frames_to_key in find_next_key_frame Change-Id: I5c7fc771f0852d3b9e8b30be34097b13dfbc2513
--- a/vp9/encoder/vp9_firstpass.c
+++ b/vp9/encoder/vp9_firstpass.c
@@ -3098,51 +3098,56 @@
// Initialize the decay rates for the recent frames to check
for (j = 0; j < FRAMES_TO_CHECK_DECAY; ++j) recent_loop_decay[j] = 1.0;
- // Find the next keyframe.
- if (!oxcf->auto_key) {
- rc->frames_to_key = first_pass_info->num_frames - kf_show_idx;
- rc->frames_to_key = VPXMIN(oxcf->key_freq, rc->frames_to_key);
- } else {
- int i = 0;
- while (kf_show_idx + i + 1 < first_pass_info->num_frames &&
- rc->frames_to_key < cpi->oxcf.key_freq) {
- // Provided that we are not at the end of the file...
- if (kf_show_idx + i + 2 < first_pass_info->num_frames) {
- double loop_decay_rate;
- const FIRSTPASS_STATS *next_frame =
- fps_get_frame_stats(first_pass_info, kf_show_idx + i + 2);
+ {
+ int frames_to_key;
+ int max_frames_to_key = first_pass_info->num_frames - kf_show_idx;
+ max_frames_to_key = VPXMIN(max_frames_to_key, oxcf->key_freq);
+ // Find the next keyframe.
+ if (!oxcf->auto_key) {
+ frames_to_key = max_frames_to_key;
+ } else {
+ frames_to_key = 1;
+ while (frames_to_key < max_frames_to_key) {
+ // Provided that we are not at the end of the file...
+ if (kf_show_idx + frames_to_key + 1 < first_pass_info->num_frames) {
+ double loop_decay_rate;
+ const FIRSTPASS_STATS *next_frame = fps_get_frame_stats(
+ first_pass_info, kf_show_idx + frames_to_key + 1);
- // Check for a scene cut.
- if (test_candidate_kf(first_pass_info, kf_show_idx + i + 1)) break;
+ // Check for a scene cut.
+ if (test_candidate_kf(first_pass_info, kf_show_idx + frames_to_key))
+ break;
- // How fast is the prediction quality decaying?
- loop_decay_rate =
- get_prediction_decay_rate(&cpi->frame_info, next_frame);
+ // How fast is the prediction quality decaying?
+ loop_decay_rate =
+ get_prediction_decay_rate(&cpi->frame_info, next_frame);
- // We want to know something about the recent past... rather than
- // as used elsewhere where we are concerned with decay in prediction
- // quality since the last GF or KF.
- recent_loop_decay[i % FRAMES_TO_CHECK_DECAY] = loop_decay_rate;
- decay_accumulator = 1.0;
- for (j = 0; j < FRAMES_TO_CHECK_DECAY; ++j)
- decay_accumulator *= recent_loop_decay[j];
+ // We want to know something about the recent past... rather than
+ // as used elsewhere where we are concerned with decay in prediction
+ // quality since the last GF or KF.
+ recent_loop_decay[(frames_to_key - 1) % FRAMES_TO_CHECK_DECAY] =
+ loop_decay_rate;
+ decay_accumulator = 1.0;
+ for (j = 0; j < FRAMES_TO_CHECK_DECAY; ++j)
+ decay_accumulator *= recent_loop_decay[j];
- // Special check for transition or high motion followed by a
- // static scene.
- if (i > rc->min_gf_interval && loop_decay_rate >= 0.999 &&
- decay_accumulator < 0.9) {
- int still_interval = oxcf->key_freq - i;
- // TODO(angiebird): Figure out why we use "+1" here
- int show_idx = kf_show_idx + i + 1;
- if (check_transition_to_still(first_pass_info, show_idx,
- still_interval)) {
- break;
+ // Special check for transition or high motion followed by a
+ // static scene.
+ if ((frames_to_key - 1) > rc->min_gf_interval &&
+ loop_decay_rate >= 0.999 && decay_accumulator < 0.9) {
+ int still_interval = oxcf->key_freq - (frames_to_key - 1);
+ // TODO(angiebird): Figure out why we use "+1" here
+ int show_idx = kf_show_idx + frames_to_key;
+ if (check_transition_to_still(first_pass_info, show_idx,
+ still_interval)) {
+ break;
+ }
}
}
+ ++frames_to_key;
}
- ++rc->frames_to_key;
- ++i;
}
+ rc->frames_to_key = frames_to_key;
}
// If there is a max kf interval set by the user we must obey it.