shithub: libvpx

Download patch

ref: 8f730cede071dcb6157acc237aec85e1e439f6de
parent: 9d377ff930d42ee080333ade5c983c0edff5b1e0
author: angiebird <angiebird@google.com>
date: Mon Oct 14 08:34:55 EDT 2019

Move code of deciding gop size into brackets

Identify the internal params used for deciding gop size

Change-Id: Ifa24a501952e06e5779a4fd2050dd486083cfa4c

--- a/vp9/encoder/vp9_firstpass.c
+++ b/vp9/encoder/vp9_firstpass.c
@@ -2496,21 +2496,12 @@
   double gf_group_inter = 0.0;
   double gf_group_motion = 0.0;
 
-  double mv_ratio_accumulator = 0.0;
   double zero_motion_accumulator = 1.0;
-  double loop_decay_rate = 1.00;
 
-  double this_frame_mv_in_out = 0.0;
-  double mv_in_out_accumulator = 0.0;
-  double abs_mv_in_out_accumulator = 0.0;
-  double mv_ratio_accumulator_thresh;
-  double abs_mv_in_out_thresh;
-  double sr_accumulator = 0.0;
   const double av_err = get_distribution_av_err(cpi, twopass);
   const double mean_mod_score = twopass->mean_mod_score;
   unsigned int allow_alt_ref = is_altref_enabled(cpi);
 
-  int flash_detected;
   int active_max_gf_interval;
   int active_min_gf_interval;
   int64_t gf_group_bits;
@@ -2532,11 +2523,6 @@
 
   vpx_clear_system_state();
 
-  // Motion breakout threshold for loop below depends on image size.
-  mv_ratio_accumulator_thresh =
-      (cpi->initial_height + cpi->initial_width) / 4.0;
-  abs_mv_in_out_thresh = ARF_ABS_ZOOM_THRESH;
-
   // Set a maximum and minimum interval for the GF group.
   // If the image appears almost completely static we can extend beyond this.
   {
@@ -2590,87 +2576,101 @@
   }
 
   i = 0;
-  while (i < rc->static_scene_max_gf_interval && i < rc->frames_to_key) {
-    const FIRSTPASS_STATS *next_next_frame;
-    const FIRSTPASS_STATS *next_frame;
-    ++i;
+  {
+    double loop_decay_rate = 1.00;
+    double mv_ratio_accumulator = 0.0;
+    double this_frame_mv_in_out = 0.0;
+    double mv_in_out_accumulator = 0.0;
+    double abs_mv_in_out_accumulator = 0.0;
+    double sr_accumulator = 0.0;
+    // Motion breakout threshold for loop below depends on image size.
+    double mv_ratio_accumulator_thresh =
+        (cpi->initial_height + cpi->initial_width) / 4.0;
 
-    next_frame = fps_get_frame_stats(first_pass_info, gf_start_show_idx + i);
-    if (next_frame == NULL) {
-      break;
-    }
+    while (i < rc->static_scene_max_gf_interval && i < rc->frames_to_key) {
+      const FIRSTPASS_STATS *next_next_frame;
+      const FIRSTPASS_STATS *next_frame;
+      int flash_detected;
+      ++i;
 
-    // Test for the case where there is a brief flash but the prediction
-    // quality back to an earlier frame is then restored.
-    next_next_frame =
-        fps_get_frame_stats(first_pass_info, gf_start_show_idx + i + 1);
-    flash_detected = detect_flash_from_frame_stats(next_next_frame);
+      next_frame = fps_get_frame_stats(first_pass_info, gf_start_show_idx + i);
+      if (next_frame == NULL) {
+        break;
+      }
 
-    // Update the motion related elements to the boost calculation.
-    accumulate_frame_motion_stats(
-        next_frame, &this_frame_mv_in_out, &mv_in_out_accumulator,
-        &abs_mv_in_out_accumulator, &mv_ratio_accumulator);
+      // Test for the case where there is a brief flash but the prediction
+      // quality back to an earlier frame is then restored.
+      next_next_frame =
+          fps_get_frame_stats(first_pass_info, gf_start_show_idx + i + 1);
+      flash_detected = detect_flash_from_frame_stats(next_next_frame);
 
-    // Monitor for static sections.
-    if ((rc->frames_since_key + i - 1) > 1) {
-      zero_motion_accumulator =
-          VPXMIN(zero_motion_accumulator,
-                 get_zero_motion_factor(frame_info, next_frame));
-    }
+      // Update the motion related elements to the boost calculation.
+      accumulate_frame_motion_stats(
+          next_frame, &this_frame_mv_in_out, &mv_in_out_accumulator,
+          &abs_mv_in_out_accumulator, &mv_ratio_accumulator);
 
-    // Accumulate the effect of prediction quality decay.
-    if (!flash_detected) {
-      double last_loop_decay_rate = loop_decay_rate;
-      loop_decay_rate = get_prediction_decay_rate(frame_info, next_frame);
+      // Monitor for static sections.
+      if ((rc->frames_since_key + i - 1) > 1) {
+        zero_motion_accumulator =
+            VPXMIN(zero_motion_accumulator,
+                   get_zero_motion_factor(frame_info, next_frame));
+      }
 
-      // Break clause to detect very still sections after motion. For example,
-      // a static image after a fade or other transition.
-      if (i > rc->min_gf_interval && loop_decay_rate >= 0.999 &&
-          last_loop_decay_rate < 0.9) {
-        int still_interval = 5;
-        if (check_transition_to_still(first_pass_info, gf_start_show_idx + i,
-                                      still_interval)) {
-          allow_alt_ref = 0;
-          break;
+      // Accumulate the effect of prediction quality decay.
+      if (!flash_detected) {
+        double last_loop_decay_rate = loop_decay_rate;
+        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.
+        if (i > rc->min_gf_interval && loop_decay_rate >= 0.999 &&
+            last_loop_decay_rate < 0.9) {
+          int still_interval = 5;
+          if (check_transition_to_still(first_pass_info, gf_start_show_idx + i,
+                                        still_interval)) {
+            allow_alt_ref = 0;
+            break;
+          }
         }
-      }
 
-      // Update the accumulator for second ref error difference.
-      // This is intended to give an indication of how much the coded error is
-      // increasing over time.
-      if (i == 1) {
-        sr_accumulator += next_frame->coded_error;
-      } else {
-        sr_accumulator +=
-            (next_frame->sr_coded_error - next_frame->coded_error);
+        // Update the accumulator for second ref error difference.
+        // This is intended to give an indication of how much the coded error is
+        // increasing over time.
+        if (i == 1) {
+          sr_accumulator += next_frame->coded_error;
+        } else {
+          sr_accumulator +=
+              (next_frame->sr_coded_error - next_frame->coded_error);
+        }
       }
-    }
 
-    // Break out conditions.
-    // Break at maximum of active_max_gf_interval unless almost totally static.
-    //
-    // Note that the addition of a test of rc->source_alt_ref_active is
-    // deliberate. The effect of this is that after a normal altref group even
-    // if the material is static there will be one normal length GF group
-    // before allowing longer GF groups. The reason for this is that in cases
-    // such as slide shows where slides are separated by a complex transition
-    // such as a fade, the arf group spanning the transition may not be coded
-    // at a very high quality and hence this frame (with its overlay) is a
-    // poor golden frame to use for an extended group.
-    if ((i >= active_max_gf_interval) &&
-        ((zero_motion_accumulator < 0.995) || (rc->source_alt_ref_active))) {
-      break;
-    }
-    if (
-        // Don't break out with a very short interval.
-        (i >= active_min_gf_interval) &&
-        // If possible dont break very close to a kf
-        ((rc->frames_to_key - i) >= rc->min_gf_interval) && (i & 0x01) &&
-        (!flash_detected) &&
-        ((mv_ratio_accumulator > mv_ratio_accumulator_thresh) ||
-         (abs_mv_in_out_accumulator > abs_mv_in_out_thresh) ||
-         (sr_accumulator > gop_intra_factor * next_frame->intra_error))) {
-      break;
+      // Break out conditions.
+      // Break at maximum of active_max_gf_interval unless almost totally
+      // static.
+      //
+      // Note that the addition of a test of rc->source_alt_ref_active is
+      // deliberate. The effect of this is that after a normal altref group even
+      // if the material is static there will be one normal length GF group
+      // before allowing longer GF groups. The reason for this is that in cases
+      // such as slide shows where slides are separated by a complex transition
+      // such as a fade, the arf group spanning the transition may not be coded
+      // at a very high quality and hence this frame (with its overlay) is a
+      // poor golden frame to use for an extended group.
+      if ((i >= active_max_gf_interval) &&
+          ((zero_motion_accumulator < 0.995) || (rc->source_alt_ref_active))) {
+        break;
+      }
+      if (
+          // Don't break out with a very short interval.
+          (i >= active_min_gf_interval) &&
+          // If possible dont break very close to a kf
+          ((rc->frames_to_key - i) >= rc->min_gf_interval) && (i & 0x01) &&
+          (!flash_detected) &&
+          ((mv_ratio_accumulator > mv_ratio_accumulator_thresh) ||
+           (abs_mv_in_out_accumulator > ARF_ABS_ZOOM_THRESH) ||
+           (sr_accumulator > gop_intra_factor * next_frame->intra_error))) {
+        break;
+      }
     }
   }