shithub: libvpx

Download patch

ref: 821db08a430de29e979c7c8ae7254be21d824c47
parent: a2f62fec6906eabda6f3c0a540136640ab80bf17
author: angiebird <angiebird@google.com>
date: Fri Oct 11 12:43:47 EDT 2019

Add calc_norm_frame_score()

The behavior is the same as calculate_norm_frame_score(),
but we avoid use cpi.

Change-Id: I3400abcdd02e041eb3b1ebf402b40b97df00d6f4

--- a/vp9/encoder/vp9_firstpass.c
+++ b/vp9/encoder/vp9_firstpass.c
@@ -266,11 +266,10 @@
   return modified_score;
 }
 
-static double calculate_norm_frame_score(const VP9_COMP *cpi,
-                                         const TWO_PASS *twopass,
-                                         const VP9EncoderConfig *oxcf,
-                                         const FIRSTPASS_STATS *this_frame,
-                                         const double av_err) {
+static double calc_norm_frame_score(const VP9EncoderConfig *oxcf,
+                                    const FRAME_INFO *frame_info,
+                                    const FIRSTPASS_STATS *this_frame,
+                                    double mean_mod_score, double av_err) {
   double modified_score =
       av_err * pow(this_frame->coded_error * this_frame->weight /
                        DOUBLE_DIVIDE_CHECK(av_err),
@@ -284,15 +283,23 @@
   // remaining active MBs. The correction here assumes that coding
   // 0.5N blocks of complexity 2X is a little easier than coding N
   // blocks of complexity X.
-  modified_score *= pow(calculate_active_area(&cpi->frame_info, this_frame),
-                        ACT_AREA_CORRECTION);
+  modified_score *=
+      pow(calculate_active_area(frame_info, this_frame), ACT_AREA_CORRECTION);
 
   // Normalize to a midpoint score.
-  modified_score /= DOUBLE_DIVIDE_CHECK(twopass->mean_mod_score);
-
+  modified_score /= DOUBLE_DIVIDE_CHECK(mean_mod_score);
   return fclamp(modified_score, min_score, max_score);
 }
 
+static double calculate_norm_frame_score(const VP9_COMP *cpi,
+                                         const TWO_PASS *twopass,
+                                         const VP9EncoderConfig *oxcf,
+                                         const FIRSTPASS_STATS *this_frame,
+                                         const double av_err) {
+  return calc_norm_frame_score(oxcf, &cpi->frame_info, this_frame,
+                               twopass->mean_mod_score, av_err);
+}
+
 // This function returns the maximum target rate per frame.
 static int frame_max_bits(const RATE_CONTROL *rc,
                           const VP9EncoderConfig *oxcf) {
@@ -2448,6 +2455,7 @@
   RATE_CONTROL *const rc = &cpi->rc;
   VP9EncoderConfig *const oxcf = &cpi->oxcf;
   TWO_PASS *const twopass = &cpi->twopass;
+  const FRAME_INFO *frame_info = &cpi->frame_info;
   FIRSTPASS_STATS next_frame;
   const FIRSTPASS_STATS *const start_pos = twopass->stats_in;
   int i;
@@ -2472,6 +2480,7 @@
   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;
@@ -2498,8 +2507,8 @@
   // If this is a key frame or the overlay from a previous arf then
   // the error score / cost of this frame has already been accounted for.
   if (arf_active_or_kf) {
-    double gf_first_frame_err =
-        calculate_norm_frame_score(cpi, twopass, oxcf, this_frame, av_err);
+    double gf_first_frame_err = calc_norm_frame_score(
+        oxcf, frame_info, this_frame, mean_mod_score, av_err);
     gf_group_err -= gf_first_frame_err;
     gf_group_raw_error -= this_frame->coded_error;
     gf_group_noise -= this_frame->frame_noise_energy;
@@ -2572,8 +2581,8 @@
     ++i;
 
     // Accumulate error score of frames in this gf group.
-    gf_group_err +=
-        calculate_norm_frame_score(cpi, twopass, oxcf, this_frame, av_err);
+    gf_group_err += calc_norm_frame_score(oxcf, frame_info, this_frame,
+                                          mean_mod_score, av_err);
     gf_group_raw_error += this_frame->coded_error;
     gf_group_noise += this_frame->frame_noise_energy;
     gf_group_skip_pct += this_frame->intra_skip_pct;