shithub: libvpx

Download patch

ref: 55864fd530ce8f4f6f682d8cb6452aa3b8d489e9
parent: 1e2ab6ace0780d17320e0fcd7d05941fc2298868
parent: b095d9df3c7492e9ba031c4491a0a565f668c9e5
author: John Koleszar <jkoleszar@google.com>
date: Tue Jan 4 19:05:07 EST 2011

Merge remote branch 'origin/master' into experimental

Change-Id: Ib7a1fdc49f9db6ebbd6a43ca139f842d9a260c5d

--- a/vp8/encoder/firstpass.c
+++ b/vp8/encoder/firstpass.c
@@ -53,9 +53,11 @@
 #define IIFACTOR   1.4
 #define IIKFACTOR1 1.40
 #define IIKFACTOR2 1.5
-#define RMAX    14.0
-#define GF_RMAX 48.0        // 128.0
+#define RMAX       14.0
+#define GF_RMAX    48.0
 
+#define KF_MB_INTRA_MIN 300
+#define GF_MB_INTRA_MIN 200
 #define DOUBLE_DIVIDE_CHECK(X) ((X)<0?(X)-.000001:(X)+.000001)
 
 #define POW1 (double)cpi->oxcf.two_pass_vbrbias/100.0
@@ -1147,6 +1149,13 @@
     cpi->bits_left -= (long long)(cpi->total_stats->duration * two_pass_min_rate / 10000000.0);
     cpi->clip_bits_total = cpi->bits_left;
 
+    // Calculate a minimum intra value to be used in determining the IIratio
+    // scores used in the second pass. We have this minimum to make sure
+    // that clips that are static but "low complexity" in the intra domain
+    // are still boosted appropriately for KF/GF/ARF
+    cpi->kf_intra_err_min = KF_MB_INTRA_MIN * cpi->common.MBs;
+    cpi->gf_intra_err_min = GF_MB_INTRA_MIN * cpi->common.MBs;
+
     vp8_avg_stats(cpi->total_stats);
 
     // Scan the first pass file and calculate an average Intra / Inter error score ratio for the sequence
@@ -1317,6 +1326,13 @@
         // Underlying boost factor is based on inter intra error ratio
         r = (boost_factor * (next_frame.intra_error / DOUBLE_DIVIDE_CHECK(next_frame.coded_error)));
 
+        if (next_frame.intra_error > cpi->gf_intra_err_min)
+            r = (IIKFACTOR2 * next_frame.intra_error /
+                     DOUBLE_DIVIDE_CHECK(next_frame.coded_error));
+        else
+            r = (IIKFACTOR2 * cpi->gf_intra_err_min /
+                     DOUBLE_DIVIDE_CHECK(next_frame.coded_error));
+
         // Increase boost for frames where new data coming into frame (eg zoom out)
         // Slightly reduce boost if there is a net balance of motion out of the frame (zoom in)
         // The range for this_frame_mv_in_out is -1.0 to +1.0
@@ -2302,7 +2318,12 @@
         if (EOF == vp8_input_stats(cpi, &next_frame))
             break;
 
-        r = (IIKFACTOR2 * next_frame.intra_error / DOUBLE_DIVIDE_CHECK(next_frame.coded_error)) ;
+        if (next_frame.intra_error > cpi->kf_intra_err_min)
+            r = (IIKFACTOR2 * next_frame.intra_error /
+                     DOUBLE_DIVIDE_CHECK(next_frame.coded_error));
+        else
+            r = (IIKFACTOR2 * cpi->kf_intra_err_min /
+                     DOUBLE_DIVIDE_CHECK(next_frame.coded_error));
 
         if (r > RMAX)
             r = RMAX;
@@ -2443,7 +2464,7 @@
         kf_boost = (int)((double)kf_boost * 100.0) >> 4;                          // Scale 16 to 100
 
         // Adjustment to boost based on recent average q
-        kf_boost = kf_boost * vp8_kf_boost_qadjustment[cpi->ni_av_qi] / 100;
+        //kf_boost = kf_boost * vp8_kf_boost_qadjustment[cpi->ni_av_qi] / 100;
 
         if (kf_boost < 250)                                                      // Min KF boost
             kf_boost = 250;
--- a/vp8/encoder/onyx_int.h
+++ b/vp8/encoder/onyx_int.h
@@ -479,6 +479,8 @@
     double total_coded_error_left;
     double start_tot_err_left;
     double min_error;
+    double kf_intra_err_min;
+    double gf_intra_err_min;
 
     double modified_error_total;
     double modified_error_used;