Merge "Cleaning up vp9_firstpass.c."

This commit is contained in:
Dmitry Kovalev 2014-03-12 00:21:06 -07:00 committed by Gerrit Code Review
commit 4435c1e240

View File

@ -199,7 +199,8 @@ static void zero_stats(FIRSTPASS_STATS *section) {
section->duration = 1.0; section->duration = 1.0;
} }
static void accumulate_stats(FIRSTPASS_STATS *section, FIRSTPASS_STATS *frame) { static void accumulate_stats(FIRSTPASS_STATS *section,
const FIRSTPASS_STATS *frame) {
section->frame += frame->frame; section->frame += frame->frame;
section->intra_error += frame->intra_error; section->intra_error += frame->intra_error;
section->coded_error += frame->coded_error; section->coded_error += frame->coded_error;
@ -221,7 +222,8 @@ static void accumulate_stats(FIRSTPASS_STATS *section, FIRSTPASS_STATS *frame) {
section->duration += frame->duration; section->duration += frame->duration;
} }
static void subtract_stats(FIRSTPASS_STATS *section, FIRSTPASS_STATS *frame) { static void subtract_stats(FIRSTPASS_STATS *section,
const FIRSTPASS_STATS *frame) {
section->frame -= frame->frame; section->frame -= frame->frame;
section->intra_error -= frame->intra_error; section->intra_error -= frame->intra_error;
section->coded_error -= frame->coded_error; section->coded_error -= frame->coded_error;
@ -1851,10 +1853,12 @@ static int test_candidate_kf(VP9_COMP *cpi,
static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
int i, j; int i, j;
RATE_CONTROL *const rc = &cpi->rc;
struct twopass_rc *const twopass = &cpi->twopass;
FIRSTPASS_STATS last_frame; FIRSTPASS_STATS last_frame;
FIRSTPASS_STATS first_frame; const FIRSTPASS_STATS first_frame = *this_frame;
FIRSTPASS_STATS next_frame; FIRSTPASS_STATS next_frame;
const FIRSTPASS_STATS *start_position; const FIRSTPASS_STATS *start_position = twopass->stats_in;
double decay_accumulator = 1.0; double decay_accumulator = 1.0;
double zero_motion_accumulator = 1.0; double zero_motion_accumulator = 1.0;
@ -1865,14 +1869,8 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
double kf_group_err = 0.0; double kf_group_err = 0.0;
double recent_loop_decay[8] = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}; double recent_loop_decay[8] = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0};
RATE_CONTROL *const rc = &cpi->rc;
struct twopass_rc *const twopass = &cpi->twopass;
vp9_zero(next_frame); vp9_zero(next_frame);
vp9_clear_system_state();
start_position = twopass->stats_in;
cpi->common.frame_type = KEY_FRAME; cpi->common.frame_type = KEY_FRAME;
// Is this a forced key frame by interval. // Is this a forced key frame by interval.
@ -1886,9 +1884,6 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
rc->frames_to_key = 1; rc->frames_to_key = 1;
// Take a copy of the initial frame details.
first_frame = *this_frame;
twopass->kf_group_bits = 0; // Total bits available to kf group twopass->kf_group_bits = 0; // Total bits available to kf group
twopass->kf_group_error_left = 0; // Group modified error score. twopass->kf_group_error_left = 0; // Group modified error score.
@ -1947,13 +1942,10 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
// is between 1x and 2x. // is between 1x and 2x.
if (cpi->oxcf.auto_key && if (cpi->oxcf.auto_key &&
rc->frames_to_key > (int)cpi->key_frame_frequency) { rc->frames_to_key > (int)cpi->key_frame_frequency) {
FIRSTPASS_STATS tmp_frame; FIRSTPASS_STATS tmp_frame = first_frame;
rc->frames_to_key /= 2; rc->frames_to_key /= 2;
// Copy first frame details.
tmp_frame = first_frame;
// Reset to the start of the group. // Reset to the start of the group.
reset_fpf_position(twopass, start_position); reset_fpf_position(twopass, start_position);
@ -1961,10 +1953,7 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
// Rescan to get the correct error data for the forced kf group. // Rescan to get the correct error data for the forced kf group.
for (i = 0; i < rc->frames_to_key; ++i) { for (i = 0; i < rc->frames_to_key; ++i) {
// Accumulate kf group errors.
kf_group_err += calculate_modified_err(cpi, &tmp_frame); kf_group_err += calculate_modified_err(cpi, &tmp_frame);
// Load the next frame's stats.
input_stats(twopass, &tmp_frame); input_stats(twopass, &tmp_frame);
} }
rc->next_key_frame_forced = 1; rc->next_key_frame_forced = 1;
@ -1983,7 +1972,7 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
// Calculate the number of bits that should be assigned to the kf group. // Calculate the number of bits that should be assigned to the kf group.
if (twopass->bits_left > 0 && twopass->modified_error_left > 0.0) { if (twopass->bits_left > 0 && twopass->modified_error_left > 0.0) {
// Maximum number of bits for a single normal frame (not key frame). // Maximum number of bits for a single normal frame (not key frame).
int max_bits = frame_max_bits(cpi); const int max_bits = frame_max_bits(cpi);
// Maximum number of bits allocated to the key frame group. // Maximum number of bits allocated to the key frame group.
int64_t max_grp_bits; int64_t max_grp_bits;
@ -2010,20 +1999,19 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
// Scan through the kf group collating various stats. // Scan through the kf group collating various stats.
for (i = 0; i < rc->frames_to_key; ++i) { for (i = 0; i < rc->frames_to_key; ++i) {
double r;
if (EOF == input_stats(twopass, &next_frame)) if (EOF == input_stats(twopass, &next_frame))
break; break;
// Monitor for static sections. // Monitor for static sections.
if ((next_frame.pcnt_inter - next_frame.pcnt_motion) < if ((next_frame.pcnt_inter - next_frame.pcnt_motion) <
zero_motion_accumulator) { zero_motion_accumulator) {
zero_motion_accumulator = zero_motion_accumulator = (next_frame.pcnt_inter -
(next_frame.pcnt_inter - next_frame.pcnt_motion); next_frame.pcnt_motion);
} }
// For the first few frames collect data to decide kf boost. // For the first few frames collect data to decide kf boost.
if (i <= (rc->max_gf_interval * 2)) { if (i <= (rc->max_gf_interval * 2)) {
double r;
if (next_frame.intra_error > twopass->kf_intra_err_min) if (next_frame.intra_error > twopass->kf_intra_err_min)
r = (IIKFACTOR2 * next_frame.intra_error / r = (IIKFACTOR2 * next_frame.intra_error /
DOUBLE_DIVIDE_CHECK(next_frame.coded_error)); DOUBLE_DIVIDE_CHECK(next_frame.coded_error));