shithub: libvpx

Download patch

ref: a1680ad3242da554631ef448f79bfa5e04e21c72
parent: b22cc559b6f3d17a5b230f239066158328bbfb9a
parent: 59a5c7d5506385b2a034ee2e0a871ea7703f09f1
author: Paul Wilkins <paulwilkins@google.com>
date: Tue May 15 10:44:34 EDT 2012

Merge "Two pass rc refactoring." into experimental

--- a/vp8/encoder/firstpass.c
+++ b/vp8/encoder/firstpass.c
@@ -31,6 +31,7 @@
 #include "encodemv.h"
 
 //#define OUTPUT_FPF 1
+#define NEW_BOOST
 
 #if CONFIG_RUNTIME_CPU_DETECT
 #define IF_RTCD(x) (x)
@@ -50,11 +51,12 @@
 extern void vp8_set_mbmode_and_mvs(MACROBLOCK *x, MB_PREDICTION_MODE mb, int_mv *mv);
 extern void vp8_alloc_compressor_data(VP8_COMP *cpi);
 
-#define IIFACTOR   1.5
-#define IIKFACTOR1 1.40
-#define IIKFACTOR2 1.5
-#define RMAX       14.0
-#define GF_RMAX    48.0
+#define IIFACTOR   9.375
+#define IIKFACTOR1 8.75
+#define IIKFACTOR2 9.375
+#define RMAX       87.5
+#define GF_RMAX    300.0
+#define ERR_DIVISOR   150.0
 
 #define KF_MB_INTRA_MIN 300
 #define GF_MB_INTRA_MIN 200
@@ -800,7 +802,8 @@
     // Copy the previous Last Frame into the GF buffer if specific conditions for doing so are met
     if ((cm->current_video_frame > 0) &&
         (cpi->twopass.this_frame_stats->pcnt_inter > 0.20) &&
-        ((cpi->twopass.this_frame_stats->intra_error / cpi->twopass.this_frame_stats->coded_error) > 2.0))
+        ((cpi->twopass.this_frame_stats->intra_error /
+            cpi->twopass.this_frame_stats->coded_error) > 2.0))
     {
         vp8_yv12_copy_frame_ptr(lst_yv12, gld_yv12);
     }
@@ -937,7 +940,7 @@
             break;
     }
 }
-#define ERR_DIVISOR   150.0
+
 static int estimate_max_q(VP8_COMP *cpi,
                           FIRSTPASS_STATS * fpstats,
                           int section_target_bandwitdh,
@@ -1580,7 +1583,6 @@
     double this_frame_mv_in_out = 0.0;
     double mv_in_out_accumulator = 0.0;
     double abs_mv_in_out_accumulator = 0.0;
-    double r;
     BOOL flash_detected = FALSE;
 
     // Search forward from the proposed arf/next gf position
@@ -1594,9 +1596,6 @@
             &this_frame_mv_in_out, &mv_in_out_accumulator,
             &abs_mv_in_out_accumulator, &mv_ratio_accumulator );
 
-        // Calculate the baseline boost number for this frame
-        r = calc_frame_boost( cpi, &this_frame, this_frame_mv_in_out );
-
         // We want to discount the the flash frame itself and the recovery
         // frame that follows as both will have poor scores.
         flash_detected = detect_flash(cpi, (i+offset)) ||
@@ -1611,8 +1610,10 @@
             decay_accumulator =
                 decay_accumulator < 0.1 ? 0.1 : decay_accumulator;
         }
-        boost_score += (decay_accumulator * r);
 
+        boost_score += (decay_accumulator *
+            calc_frame_boost( cpi, &this_frame, this_frame_mv_in_out ));
+
         // Break out conditions.
         if  ( (!flash_detected) &&
               ((mv_ratio_accumulator > 100.0) ||
@@ -1623,7 +1624,7 @@
         }
     }
 
-    *f_boost = (int)(boost_score * 100.0) >> 4;
+    *f_boost = boost_score;
 
     // Reset for backward looking loop
     boost_score = 0.0;
@@ -1633,7 +1634,7 @@
     mv_in_out_accumulator = 0.0;
     abs_mv_in_out_accumulator = 0.0;
 
-    // Search forward from the proposed arf/next gf position
+    // Search backward towards last gf position
     for ( i = -1; i >= -b_frames; i-- )
     {
         if ( read_frame_stats(cpi, &this_frame, (i+offset)) == EOF )
@@ -1644,9 +1645,6 @@
             &this_frame_mv_in_out, &mv_in_out_accumulator,
             &abs_mv_in_out_accumulator, &mv_ratio_accumulator );
 
-        // Calculate the baseline boost number for this frame
-        r = calc_frame_boost( cpi, &this_frame, this_frame_mv_in_out );
-
         // We want to discount the the flash frame itself and the recovery
         // frame that follows as both will have poor scores.
         flash_detected = detect_flash(cpi, (i+offset)) ||
@@ -1662,7 +1660,8 @@
                 decay_accumulator < 0.1 ? 0.1 : decay_accumulator;
         }
 
-        boost_score += (decay_accumulator * r);
+        boost_score += (decay_accumulator *
+            calc_frame_boost( cpi, &this_frame, this_frame_mv_in_out ));
 
         // Break out conditions.
         if  ( (!flash_detected) &&
@@ -1673,7 +1672,7 @@
             break;
         }
     }
-    *b_boost = (int)(boost_score * 100.0) >> 4;
+    *b_boost = boost_score;
 
     return (*f_boost + *b_boost);
 }
@@ -1763,9 +1762,6 @@
             &this_frame_mv_in_out, &mv_in_out_accumulator,
             &abs_mv_in_out_accumulator, &mv_ratio_accumulator );
 
-        // Calculate a baseline boost number for this frame
-        r = calc_frame_boost( cpi, &next_frame, this_frame_mv_in_out );
-
         // Cumulative effect of prediction quality decay
         if ( !flash_detected )
         {
@@ -1774,7 +1770,9 @@
             decay_accumulator =
                 decay_accumulator < 0.1 ? 0.1 : decay_accumulator;
         }
-        boost_score += (decay_accumulator * r);
+        boost_score += decay_accumulator *
+                       calc_frame_boost( cpi, &next_frame,
+                                         this_frame_mv_in_out );
 
         // Break clause to detect very still sections after motion
         // For example a staic image after a fade or other transition.
@@ -1796,12 +1794,12 @@
                 (i > MIN_GF_INTERVAL) &&
                 // Dont break out very close to a key frame
                 ((cpi->twopass.frames_to_key - i) >= MIN_GF_INTERVAL) &&
-                ((boost_score > 20.0) || (next_frame.pcnt_inter < 0.75)) &&
+                ((boost_score > 125.0) || (next_frame.pcnt_inter < 0.75)) &&
                 (!flash_detected) &&
                 ((mv_ratio_accumulator > 100.0) ||
                  (abs_mv_in_out_accumulator > 3.0) ||
                  (mv_in_out_accumulator < -2.0) ||
-                 ((boost_score - old_boost_score) < 2.0))
+                 ((boost_score - old_boost_score) < 12.5))
             ) )
         {
             boost_score = old_boost_score;
@@ -1831,7 +1829,7 @@
         }
     }
 
-    cpi->gfu_boost = (int)(boost_score * 100.0) >> 4;
+    cpi->gfu_boost = boost_score;
 
     // Alterrnative boost calculation for alt ref
     alt_boost = calc_arf_boost( cpi, 0, (i-1), (i-1), &f_boost, &b_boost );
@@ -1881,11 +1879,12 @@
 
         allocation_chunks = (i * 100) + Boost;
 
-        // Normalize Altboost and allocations chunck down to prevent overflow
-        while (Boost > 1000)
+        // Prevent overflow
+        if ( Boost > 1028 )
         {
-            Boost /= 2;
-            allocation_chunks /= 2;
+            int divisor = Boost >> 10;
+            Boost /= divisor;
+            allocation_chunks /= divisor;
         }
 
         // Calculate the number of bits to be spent on the arf based on the
@@ -2025,7 +2024,7 @@
 
     // Assign  bits to the arf or gf.
     for (i = 0; i <= (cpi->source_alt_ref_pending && cpi->common.frame_type != KEY_FRAME); i++) {
-        int Boost;
+        int boost;
         int allocation_chunks;
         int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q;
         int gf_bits;
@@ -2033,44 +2032,45 @@
         // For ARF frames
         if (cpi->source_alt_ref_pending && i == 0)
         {
-            Boost = (alt_boost * vp8_gfboost_qadjust(Q)) / 100;
-            Boost += (cpi->baseline_gf_interval * 50);
+            boost = (alt_boost * vp8_gfboost_qadjust(Q)) / 100;
+            boost += (cpi->baseline_gf_interval * 50);
 
             // Set max and minimum boost and hence minimum allocation
-            if (Boost > ((cpi->baseline_gf_interval + 1) * 200))
-                Boost = ((cpi->baseline_gf_interval + 1) * 200);
-            else if (Boost < 125)
-                Boost = 125;
+            if (boost > ((cpi->baseline_gf_interval + 1) * 200))
+                boost = ((cpi->baseline_gf_interval + 1) * 200);
+            else if (boost < 125)
+                boost = 125;
 
             allocation_chunks =
-                ((cpi->baseline_gf_interval + 1) * 100) + Boost;
+                ((cpi->baseline_gf_interval + 1) * 100) + boost;
         }
         // Else for standard golden frames
         else
         {
             // boost based on inter / intra ratio of subsequent frames
-            Boost = (cpi->gfu_boost * vp8_gfboost_qadjust(Q)) / 100;
+            boost = (cpi->gfu_boost * vp8_gfboost_qadjust(Q)) / 100;
 
             // Set max and minimum boost and hence minimum allocation
-            if (Boost > (cpi->baseline_gf_interval * 150))
-                Boost = (cpi->baseline_gf_interval * 150);
-            else if (Boost < 125)
-                Boost = 125;
+            if (boost > (cpi->baseline_gf_interval * 150))
+                boost = (cpi->baseline_gf_interval * 150);
+            else if (boost < 125)
+                boost = 125;
 
             allocation_chunks =
-                (cpi->baseline_gf_interval * 100) + (Boost - 100);
+                (cpi->baseline_gf_interval * 100) + (boost - 100);
         }
 
-        // Normalize Altboost and allocations chunck down to prevent overflow
-        while (Boost > 1000)
+        // Prevent overflow
+        if ( boost > 1028 )
         {
-            Boost /= 2;
-            allocation_chunks /= 2;
+            int divisor = boost >> 10;
+            boost/= divisor;
+            allocation_chunks /= divisor;
         }
 
         // Calculate the number of bits to be spent on the gf or arf based on
         // the boost number
-        gf_bits = (int)((double)Boost *
+        gf_bits = (int)((double)boost *
                         (cpi->twopass.gf_group_bits /
                          (double)allocation_chunks));
 
@@ -2087,7 +2087,7 @@
                 (mod_frame_err * (double)cpi->baseline_gf_interval) /
                 DOUBLE_DIVIDE_CHECK((double)cpi->twopass.kf_group_error_left);
 
-            alt_gf_bits = (int)((double)Boost * (alt_gf_grp_bits /
+            alt_gf_bits = (int)((double)boost * (alt_gf_grp_bits /
                                                  (double)allocation_chunks));
 
             if (gf_bits > alt_gf_bits)
@@ -2136,7 +2136,9 @@
             cpi->twopass.kf_group_bits = 0;
 
         // Note the error score left in the remaining frames of the group.
-        // For normal GFs we want to remove the error score for the first frame of the group (except in Key frame case where this has already happened)
+        // For normal GFs we want to remove the error score for the first frame
+        // of the group (except in Key frame case where this has already
+        // happened)
         if (!cpi->source_alt_ref_pending && cpi->common.frame_type != KEY_FRAME)
             cpi->twopass.gf_group_error_left = gf_group_err - gf_first_frame_err;
         else
@@ -2197,17 +2199,11 @@
             DOUBLE_DIVIDE_CHECK(sectionstats.coded_error);
 
         Ratio = sectionstats.intra_error / DOUBLE_DIVIDE_CHECK(sectionstats.coded_error);
-        //if( (Ratio > 11) ) //&& (sectionstats.pcnt_second_ref < .20) )
-        //{
         cpi->twopass.section_max_qfactor = 1.0 - ((Ratio - 10.0) * 0.025);
 
         if (cpi->twopass.section_max_qfactor < 0.80)
             cpi->twopass.section_max_qfactor = 0.80;
 
-        //}
-        //else
-        //    cpi->twopass.section_max_qfactor = 1.0;
-
         reset_fpf_position(cpi, start_pos);
     }
 }
@@ -2525,7 +2521,7 @@
                 (((local_next_frame.pcnt_inter -
                    local_next_frame.pcnt_neutral) < 0.20) &&
                  (next_iiratio < 3.0)) ||
-                ((boost_score - old_boost_score) < 0.5) ||
+                ((boost_score - old_boost_score) < 3.0) ||
                 (local_next_frame.intra_error < 200)
                )
             {
@@ -2540,7 +2536,7 @@
         }
 
         // If there is tolerable prediction for at least the next 3 frames then break out else discard this pottential key frame and move on
-        if (boost_score > 5.0 && (i > 3))
+        if (boost_score > 30.0 && (i > 3))
             is_viable_kf = TRUE;
         else
         {
@@ -2772,7 +2768,7 @@
         boost_score += (decay_accumulator * r);
 
         if ((i > MIN_GF_INTERVAL) &&
-            ((boost_score - old_boost_score) < 1.0))
+            ((boost_score - old_boost_score) < 6.25))
         {
             break;
         }
@@ -2801,16 +2797,10 @@
             / DOUBLE_DIVIDE_CHECK(sectionstats.coded_error);
 
         Ratio = sectionstats.intra_error / DOUBLE_DIVIDE_CHECK(sectionstats.coded_error);
-        // if( (Ratio > 11) ) //&& (sectionstats.pcnt_second_ref < .20) )
-        //{
         cpi->twopass.section_max_qfactor = 1.0 - ((Ratio - 10.0) * 0.025);
 
         if (cpi->twopass.section_max_qfactor < 0.80)
             cpi->twopass.section_max_qfactor = 0.80;
-
-        //}
-        //else
-        //    cpi->twopass.section_max_qfactor = 1.0;
     }
 
     // Reset the first pass file position
@@ -2824,32 +2814,20 @@
         int Counter = cpi->twopass.frames_to_key;
         int alt_kf_bits;
         YV12_BUFFER_CONFIG *lst_yv12 = &cpi->common.yv12_fb[cpi->common.lst_fb_idx];
-        // Min boost based on kf interval
-#if 0
 
-        while ((kf_boost < 48) && (Counter > 0))
+        if ( kf_boost < 300 )
         {
-            Counter -= 2;
-            kf_boost ++;
+            kf_boost += (cpi->twopass.frames_to_key * 3);
+            if ( kf_boost > 300 )
+                kf_boost = 300;
         }
 
-#endif
-
-        if (kf_boost < 48)
-        {
-            kf_boost += ((Counter + 1) >> 1);
-
-            if (kf_boost > 48) kf_boost = 48;
-        }
-
         // bigger frame sizes need larger kf boosts, smaller frames smaller boosts...
         if ((lst_yv12->y_width * lst_yv12->y_height) > (320 * 240))
-            kf_boost += 2 * (lst_yv12->y_width * lst_yv12->y_height) / (320 * 240);
+            kf_boost += 12 * (lst_yv12->y_width * lst_yv12->y_height) / (320 * 240);
         else if ((lst_yv12->y_width * lst_yv12->y_height) < (320 * 240))
-            kf_boost -= 4 * (320 * 240) / (lst_yv12->y_width * lst_yv12->y_height);
+            kf_boost -= 25 * (320 * 240) / (lst_yv12->y_width * lst_yv12->y_height);
 
-        kf_boost = (int)((double)kf_boost * 100.0) >> 4;                          // Scale 16 to 100
-
         if (kf_boost < 250)                                                      // Min KF boost
             kf_boost = 250;
 
@@ -2876,11 +2854,12 @@
                 ((cpi->twopass.frames_to_key - 1) * 100) + kf_boost;
         }
 
-        // Normalize Altboost and allocations chunck down to prevent overflow
-        while (kf_boost > 1000)
+        // Prevent overflow
+        if ( kf_boost > 1028 )
         {
-            kf_boost /= 2;
-            allocation_chunks /= 2;
+            int divisor = kf_boost >> 10;
+            kf_boost /= divisor;
+            allocation_chunks /= divisor;
         }
 
         cpi->twopass.kf_group_bits = (cpi->twopass.kf_group_bits < 0) ? 0 : cpi->twopass.kf_group_bits;