summaryrefslogtreecommitdiff
path: root/vp9/encoder/vp9_firstpass.c
diff options
context:
space:
mode:
authorDmitry Kovalev <dkovalev@google.com>2014-05-22 11:38:02 -0700
committerDmitry Kovalev <dkovalev@google.com>2014-05-22 11:38:02 -0700
commitb8a65127ae8a0e96ff6895233455137b4232b626 (patch)
tree7af855e87c03058b17600ba573fc567940bb28ca /vp9/encoder/vp9_firstpass.c
parent56966ea8cedc6217d11a932e977f2165e39708f4 (diff)
downloadlibvpx-b8a65127ae8a0e96ff6895233455137b4232b626.tar
libvpx-b8a65127ae8a0e96ff6895233455137b4232b626.tar.gz
libvpx-b8a65127ae8a0e96ff6895233455137b4232b626.tar.bz2
libvpx-b8a65127ae8a0e96ff6895233455137b4232b626.zip
Cleaning up calculate_section_intra_ratio().
Addition of reset_fpf_position() call fixes previous issue with this patch. Change-Id: I356186d5a1032297a147194e81e9c7db252d14a6
Diffstat (limited to 'vp9/encoder/vp9_firstpass.c')
-rw-r--r--vp9/encoder/vp9_firstpass.c51
1 files changed, 24 insertions, 27 deletions
diff --git a/vp9/encoder/vp9_firstpass.c b/vp9/encoder/vp9_firstpass.c
index a7c527af4..3a56c979b 100644
--- a/vp9/encoder/vp9_firstpass.c
+++ b/vp9/encoder/vp9_firstpass.c
@@ -1403,30 +1403,22 @@ void define_fixed_arf_period(VP9_COMP *cpi) {
#endif
// Calculate a section intra ratio used in setting max loop filter.
-static void calculate_section_intra_ratio(TWO_PASS *twopass,
- const FIRSTPASS_STATS *start_pos,
- int section_length) {
- FIRSTPASS_STATS next_frame;
- FIRSTPASS_STATS sectionstats;
- int i;
-
- vp9_zero(next_frame);
- vp9_zero(sectionstats);
-
- reset_fpf_position(twopass, start_pos);
-
- for (i = 0; i < section_length; ++i) {
- input_stats(twopass, &next_frame);
- accumulate_stats(&sectionstats, &next_frame);
+static int calculate_section_intra_ratio(const FIRSTPASS_STATS *begin,
+ const FIRSTPASS_STATS *end,
+ int section_length) {
+ const FIRSTPASS_STATS *s = begin;
+ double intra_error = 0.0;
+ double coded_error = 0.0;
+ int i = 0;
+
+ while (s < end && i < section_length) {
+ intra_error += s->intra_error;
+ coded_error += s->coded_error;
+ ++s;
+ ++i;
}
- avg_stats(&sectionstats);
-
- twopass->section_intra_rating =
- (int)(sectionstats.intra_error /
- DOUBLE_DIVIDE_CHECK(sectionstats.coded_error));
-
- reset_fpf_position(twopass, start_pos);
+ return (int)(intra_error / DOUBLE_DIVIDE_CHECK(coded_error));
}
// Calculate the total bits to allocate in this GF/ARF group.
@@ -1486,7 +1478,7 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
const VP9EncoderConfig *const oxcf = &cpi->oxcf;
TWO_PASS *const twopass = &cpi->twopass;
FIRSTPASS_STATS next_frame;
- const FIRSTPASS_STATS *start_pos;
+ const FIRSTPASS_STATS *const start_pos = twopass->stats_in;
int i;
double boost_score = 0.0;
double old_boost_score = 0.0;
@@ -1516,7 +1508,6 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
vp9_zero(next_frame);
twopass->gf_group_bits = 0;
- start_pos = twopass->stats_in;
// Load stats for the current frame.
mod_frame_err = calculate_modified_err(cpi, this_frame);
@@ -1768,7 +1759,9 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
// Calculate a section intra ratio used in setting max loop filter.
if (cpi->common.frame_type != KEY_FRAME) {
- calculate_section_intra_ratio(twopass, start_pos, rc->baseline_gf_interval);
+ twopass->section_intra_rating =
+ calculate_section_intra_ratio(start_pos, twopass->stats_in_end,
+ rc->baseline_gf_interval);
}
}
@@ -1885,7 +1878,7 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
RATE_CONTROL *const rc = &cpi->rc;
TWO_PASS *const twopass = &cpi->twopass;
const FIRSTPASS_STATS first_frame = *this_frame;
- const FIRSTPASS_STATS *start_position = twopass->stats_in;
+ const FIRSTPASS_STATS *const start_position = twopass->stats_in;
FIRSTPASS_STATS next_frame;
FIRSTPASS_STATS last_frame;
double decay_accumulator = 1.0;
@@ -2064,11 +2057,15 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
}
}
+ reset_fpf_position(twopass, start_position);
+
// Store the zero motion percentage
twopass->kf_zeromotion_pct = (int)(zero_motion_accumulator * 100.0);
// Calculate a section intra ratio used in setting max loop filter.
- calculate_section_intra_ratio(twopass, start_position, rc->frames_to_key);
+ twopass->section_intra_rating =
+ calculate_section_intra_ratio(start_position, twopass->stats_in_end,
+ rc->frames_to_key);
// Work out how many bits to allocate for the key frame itself.
rc->kf_boost = (int)boost_score;