shithub: libvpx

Download patch

ref: 9f291d85b6f6bf8056422bae17d98f1762bcc7e4
parent: 9dadf3189ac6d0798f12bdf2ba2d2408b2825b1d
author: angiebird <angiebird@google.com>
date: Mon Oct 14 06:43:29 EDT 2019

Add compute_arf_boost()

It's behavior is the same as that of calc_arf_boost()
But, we avoid using cpi and twopass->stats_in

Change-Id: I31cf7889abf43effcca9004a9d55f4b424ce388a

--- a/vp9/encoder/vp9_firstpass.c
+++ b/vp9/encoder/vp9_firstpass.c
@@ -1962,10 +1962,10 @@
   return VPXMIN(frame_boost, max_boost * boost_q_correction);
 }
 
-static int calc_arf_boost(VP9_COMP *cpi, int f_frames, int b_frames) {
-  const FRAME_INFO *frame_info = &cpi->frame_info;
-  TWO_PASS *const twopass = &cpi->twopass;
-  const int avg_inter_frame_qindex = cpi->rc.avg_frame_qindex[INTER_FRAME];
+static int compute_arf_boost(const FRAME_INFO *frame_info,
+                             const FIRST_PASS_INFO *first_pass_info,
+                             int arf_show_idx, int f_frames, int b_frames,
+                             int avg_frame_qindex) {
   int i;
   double boost_score = 0.0;
   double mv_ratio_accumulator = 0.0;
@@ -1978,8 +1978,10 @@
 
   // Search forward from the proposed arf/next gf position.
   for (i = 0; i < f_frames; ++i) {
-    const FIRSTPASS_STATS *this_frame = read_frame_stats(twopass, i);
-    const FIRSTPASS_STATS *next_frame = read_frame_stats(twopass, i + 1);
+    const FIRSTPASS_STATS *this_frame =
+        fps_get_frame_stats(first_pass_info, arf_show_idx + i);
+    const FIRSTPASS_STATS *next_frame =
+        fps_get_frame_stats(first_pass_info, arf_show_idx + i + 1);
     if (this_frame == NULL) break;
 
     // Update the motion related elements to the boost calculation.
@@ -2000,7 +2002,7 @@
                               : decay_accumulator;
     }
     boost_score += decay_accumulator * calc_frame_boost(frame_info, this_frame,
-                                                        avg_inter_frame_qindex,
+                                                        avg_frame_qindex,
                                                         this_frame_mv_in_out);
   }
 
@@ -2016,8 +2018,10 @@
 
   // Search backward towards last gf position.
   for (i = -1; i >= -b_frames; --i) {
-    const FIRSTPASS_STATS *this_frame = read_frame_stats(twopass, i);
-    const FIRSTPASS_STATS *next_frame = read_frame_stats(twopass, i + 1);
+    const FIRSTPASS_STATS *this_frame =
+        fps_get_frame_stats(first_pass_info, arf_show_idx + i);
+    const FIRSTPASS_STATS *next_frame =
+        fps_get_frame_stats(first_pass_info, arf_show_idx + i + 1);
     if (this_frame == NULL) break;
 
     // Update the motion related elements to the boost calculation.
@@ -2038,7 +2042,7 @@
                               : decay_accumulator;
     }
     boost_score += decay_accumulator * calc_frame_boost(frame_info, this_frame,
-                                                        avg_inter_frame_qindex,
+                                                        avg_frame_qindex,
                                                         this_frame_mv_in_out);
   }
   arf_boost += (int)boost_score;
@@ -2050,6 +2054,15 @@
   return arf_boost;
 }
 
+static int calc_arf_boost(VP9_COMP *cpi, int f_frames, int b_frames) {
+  const FRAME_INFO *frame_info = &cpi->frame_info;
+  TWO_PASS *const twopass = &cpi->twopass;
+  const int avg_inter_frame_qindex = cpi->rc.avg_frame_qindex[INTER_FRAME];
+  int arf_show_idx = (int)(twopass->stats_in - twopass->stats_in_start);
+  return compute_arf_boost(frame_info, &twopass->first_pass_info, arf_show_idx,
+                           f_frames, b_frames, avg_inter_frame_qindex);
+}
+
 // Calculate a section intra ratio used in setting max loop filter.
 static int calculate_section_intra_ratio(const FIRSTPASS_STATS *begin,
                                          const FIRSTPASS_STATS *end,
@@ -2450,7 +2463,7 @@
 #define ARF_ABS_ZOOM_THRESH 4.0
 
 #define MAX_GF_BOOST 5400
-static void define_gf_group(VP9_COMP *cpi) {
+static void define_gf_group(VP9_COMP *cpi, int gf_start_show_idx) {
   VP9_COMMON *const cm = &cpi->common;
   RATE_CONTROL *const rc = &cpi->rc;
   VP9EncoderConfig *const oxcf = &cpi->oxcf;
@@ -2459,7 +2472,6 @@
   const FIRST_PASS_INFO *first_pass_info = &twopass->first_pass_info;
   FIRSTPASS_STATS next_frame;
   const FIRSTPASS_STATS *const start_pos = twopass->stats_in;
-  const int gf_start_show_idx = cm->current_video_frame;
   int i;
   int j;
 
@@ -2592,8 +2604,7 @@
     // Accumulate the effect of prediction quality decay.
     if (!flash_detected) {
       last_loop_decay_rate = loop_decay_rate;
-      loop_decay_rate =
-          get_prediction_decay_rate(&cpi->frame_info, &next_frame);
+      loop_decay_rate = get_prediction_decay_rate(frame_info, &next_frame);
 
       // Break clause to detect very still sections after motion. For example,
       // a static image after a fade or other transition.
@@ -2648,12 +2659,19 @@
   if ((zero_motion_accumulator < 0.995) && allow_alt_ref &&
       (twopass->kf_zeromotion_pct < STATIC_KF_GROUP_THRESH) &&
       (i < cpi->oxcf.lag_in_frames) && (i >= rc->min_gf_interval)) {
-    const int forward_frames = (rc->frames_to_key - i >= i - 1)
-                                   ? i - 1
-                                   : VPXMAX(0, rc->frames_to_key - i);
+    const int f_frames = (rc->frames_to_key - i >= i - 1)
+                             ? i - 1
+                             : VPXMAX(0, rc->frames_to_key - i);
+    const int b_frames = i - 1;
+    const int avg_inter_frame_qindex = rc->avg_frame_qindex[INTER_FRAME];
+    // TODO(angiebird): figure out why arf's location is assigned this way
+    const int arf_show_idx =
+        VPXMIN(gf_start_show_idx + i + 1, first_pass_info->num_frames);
 
     // Calculate the boost for alt ref.
-    rc->gfu_boost = calc_arf_boost(cpi, forward_frames, (i - 1));
+    rc->gfu_boost =
+        compute_arf_boost(frame_info, first_pass_info, arf_show_idx, f_frames,
+                          b_frames, avg_inter_frame_qindex);
     rc->source_alt_ref_pending = 1;
   } else {
     reset_fpf_position(twopass, start_pos);
@@ -3396,7 +3414,8 @@
 
   // Define a new GF/ARF group. (Should always enter here for key frames).
   if (rc->frames_till_gf_update_due == 0) {
-    define_gf_group(cpi);
+    const int gf_start_show_idx = cm->current_video_frame;
+    define_gf_group(cpi, gf_start_show_idx);
 
     rc->frames_till_gf_update_due = rc->baseline_gf_interval;