ref: cfc79a357a4a6c954781d755b786fadf65f46b60
parent: b89ba05ab45cfafaf92a95fda21b9e4c5142db88
author: paulwilkins <[email protected]>
date: Wed Feb 15 05:33:10 EST 2017
Disconnect ARF breakout from frame boost. This small change replaces the frame boost check in the arf group length break out clause with a test against a prediction decay value. The boost value is in fact partly dependent on the decay value but this change means that the per frame boost calculation can be adjusted without influencing the group length calculation. The value chosen gives a close match on all the test sets with the previous code (on average) but it was noted that a lower threshold was slightly better for 1080P and up and a slightly higher value for small image sizes. Change-Id: I4d5b9f67d5b17b0d99ea3f796d3d6202fd61ee0c
--- a/vp9/encoder/vp9_firstpass.c
+++ b/vp9/encoder/vp9_firstpass.c
@@ -42,7 +42,6 @@
#define OUTPUT_FPF 0
#define ARF_STATS_OUTPUT 0
-#define BOOST_BREAKOUT 12.5
#define FACTOR_PT_LOW 0.70
#define FACTOR_PT_HIGH 0.90
#define FIRST_PASS_Q 10.0
@@ -2269,6 +2268,7 @@
}
// Analyse and define a gf/arf group.
+#define ARF_DECAY_BREAKOUT 0.10
static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
VP9_COMMON *const cm = &cpi->common;
RATE_CONTROL *const rc = &cpi->rc;
@@ -2447,7 +2447,7 @@
((mv_ratio_accumulator > mv_ratio_accumulator_thresh) ||
(abs_mv_in_out_accumulator > abs_mv_in_out_thresh) ||
(mv_in_out_accumulator < -mv_in_out_thresh) ||
- ((boost_score - old_boost_score) < BOOST_BREAKOUT)))) {
+ (decay_accumulator < ARF_DECAY_BREAKOUT)))) {
boost_score = old_boost_score;
break;
}
@@ -2601,7 +2601,7 @@
// ratio in the next frame.
#define II_IMPROVEMENT_THRESHOLD 3.5
#define KF_II_MAX 128.0
-#define BOOST_FACTOR 12.5
+#define II_FACTOR 12.5
static int test_candidate_kf(TWO_PASS *twopass,
const FIRSTPASS_STATS *last_frame,
const FIRSTPASS_STATS *this_frame,
@@ -2640,7 +2640,7 @@
// Examine how well the key frame predicts subsequent frames.
for (i = 0; i < 16; ++i) {
- double next_iiratio = (BOOST_FACTOR * local_next_frame.intra_error /
+ double next_iiratio = (II_FACTOR * local_next_frame.intra_error /
DOUBLE_DIVIDE_CHECK(local_next_frame.coded_error));
if (next_iiratio > KF_II_MAX) next_iiratio = KF_II_MAX;