Changes to ARF boost calculation. Some refactoring of ARF boost calculation. Use calc_arf_boost() for calculating GF boost with 0 backwards frames. Also fixes bug in some stats code. STATS_CHANGED Change-Id: Iee0b7035c7e8f748a555cd3c2789cf28eb4e51c7
diff --git a/av1/encoder/pass2_strategy.c b/av1/encoder/pass2_strategy.c index ad1c928..c85d919 100644 --- a/av1/encoder/pass2_strategy.c +++ b/av1/encoder/pass2_strategy.c
@@ -421,8 +421,8 @@ #define MIN_ARF_GF_BOOST 240 #define MIN_DECAY_FACTOR 0.01 -static int calc_arf_boost(AV1_COMP *cpi, int offset, int f_frames, int b_frames, - int *f_boost, int *b_boost) { +static int calc_arf_boost(AV1_COMP *cpi, int offset, int f_frames, + int b_frames) { TWO_PASS *const twopass = &cpi->twopass; int i; double boost_score = 0.0; @@ -462,7 +462,7 @@ calc_frame_boost(cpi, this_frame, this_frame_mv_in_out, GF_MAX_BOOST); } - *f_boost = (int)boost_score; + arf_boost = (int)boost_score; // Reset for backward looking loop. boost_score = 0.0; @@ -499,9 +499,8 @@ decay_accumulator * calc_frame_boost(cpi, this_frame, this_frame_mv_in_out, GF_MAX_BOOST); } - *b_boost = (int)boost_score; + arf_boost += (int)boost_score; - arf_boost = (*f_boost + *b_boost); if (arf_boost < ((b_frames + f_frames) * 20)) arf_boost = ((b_frames + f_frames) * 20); arf_boost = AOMMAX(arf_boost, MIN_ARF_GF_BOOST); @@ -787,6 +786,7 @@ } // Analyse and define a gf/arf group. +#define MAX_GF_BOOST 5400 static void define_gf_group(AV1_COMP *cpi, FIRSTPASS_STATS *this_frame, const EncodeFrameParams *const frame_params) { AV1_COMMON *const cm = &cpi->common; @@ -820,8 +820,6 @@ unsigned int allow_alt_ref = is_altref_enabled(cpi); - int f_boost = 0; - int b_boost = 0; int flash_detected; int64_t gf_group_bits; double gf_group_error_left; @@ -1089,12 +1087,17 @@ // Should we use the alternate reference frame. if (use_alt_ref) { + const int forward_frames = (rc->frames_to_key - i >= i - 1) + ? i - 1 + : AOMMAX(0, rc->frames_to_key - i); + // Calculate the boost for alt ref. - rc->gfu_boost = - calc_arf_boost(cpi, alt_offset, (i - 1), (i - 1), &f_boost, &b_boost); + rc->gfu_boost = calc_arf_boost(cpi, alt_offset, forward_frames, (i - 1)); rc->source_alt_ref_pending = 1; } else { - rc->gfu_boost = AOMMAX((int)boost_score, MIN_ARF_GF_BOOST); + reset_fpf_position(twopass, start_pos); + rc->gfu_boost = + AOMMIN(MAX_GF_BOOST, calc_arf_boost(cpi, alt_offset, (i - 1), 0)); rc->source_alt_ref_pending = 0; } @@ -1774,7 +1777,8 @@ FILE *fpfile; fpfile = fopen("arf.stt", "a"); ++arf_count; - fprintf(fpfile, "%10d %10d %10d %10d %10d\n", current_frame->frame_number, + fprintf(fpfile, "%10d %10d %10d %10d %10d\n", + cpi->common.current_frame.frame_number, rc->frames_till_gf_update_due, rc->kf_boost, arf_count, rc->gfu_boost);