shithub: libvpx

Download patch

ref: d11221f43387696e6ffe80186ab874fd9148cba3
parent: 14330abdc6e7681b867cbb955931a6c96336088a
author: Deb Mukherjee <[email protected]>
date: Thu Sep 19 20:41:29 EDT 2013

Improves constant qual, constrained qual turned on

Adds modeled functions to decide the qp for altref frames in constant q
mode similar to other functions in use in bitrate mode.

Also turns on the constrained quality mode (end-usage=2) option which
was turned off before. Basic testing shows the mode works in principle,
to cap bitrate to the target-bitrate specified, while allowing lower
bitrate depending on the cq-level specified. The mode will need to be
improved over time.

Results for constant quality vs bitrate control mode:
derfraw300/fullderfraw: +3.0% at constant quality over bitrate control.
fullstdhdraw: +4.341%
stdhdraw250: +5.361%

Change-Id: If5027c9ec66c8e88d33e47062c6cb84a07b1cda9

--- a/vp9/encoder/vp9_firstpass.c
+++ b/vp9/encoder/vp9_firstpass.c
@@ -2093,14 +2093,19 @@
       cpi->twopass.est_max_qcorrection_factor = 1.0;
 
       // Set a cq_level in constrained quality mode.
+      // Commenting this code out for now since it does not seem to be
+      // working well.
+      /*
       if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
         int est_cq = estimate_cq(cpi, &cpi->twopass.total_left_stats,
-                                 section_target_bandwidth);
+           section_target_bandwidth);
 
-        cpi->cq_target_quality = cpi->oxcf.cq_level;
         if (est_cq > cpi->cq_target_quality)
           cpi->cq_target_quality = est_cq;
+        else
+          cpi->cq_target_quality = cpi->oxcf.cq_level;
       }
+      */
 
       // guess at maxq needed in 2nd pass
       cpi->twopass.maxq_max_limit = cpi->worst_quality;
--- a/vp9/encoder/vp9_onyx_if.c
+++ b/vp9/encoder/vp9_onyx_if.c
@@ -122,6 +122,8 @@
 static int gf_low_motion_minq[QINDEX_RANGE];
 static int gf_high_motion_minq[QINDEX_RANGE];
 static int inter_minq[QINDEX_RANGE];
+static int afq_low_motion_minq[QINDEX_RANGE];
+static int afq_high_motion_minq[QINDEX_RANGE];
 
 static INLINE void Scale2Ratio(int mode, int *hr, int *hs) {
   switch (mode) {
@@ -205,7 +207,16 @@
                                          -0.00113,
                                          0.697,
                                          0.0);
-
+    afq_low_motion_minq[i] = calculate_minq_index(maxq,
+                                                  0.0000015,
+                                                  -0.0009,
+                                                  0.33,
+                                                  0.0);
+    afq_high_motion_minq[i] = calculate_minq_index(maxq,
+                                                   0.0000021,
+                                                   -0.00125,
+                                                   0.57,
+                                                   0.0);
   }
 }
 
@@ -2765,16 +2776,16 @@
       } else {
         if (cpi->frames_since_key > 1) {
           if (cpi->gfu_boost > high) {
-            cpi->active_best_quality = cpi->cq_target_quality * 6 / 16;
+            cpi->active_best_quality = afq_low_motion_minq[q];
           } else if (cpi->gfu_boost < low) {
-            cpi->active_best_quality = cpi->cq_target_quality * 11 / 16;
+            cpi->active_best_quality = afq_high_motion_minq[q];
           } else {
             const int gap = high - low;
             const int offset = high - cpi->gfu_boost;
-            const int qdiff = cpi->cq_target_quality * 5 / 16;
+            const int qdiff = afq_high_motion_minq[q] - afq_low_motion_minq[q];
             const int adjustment = ((offset * qdiff) + (gap >> 1)) / gap;
-            cpi->active_best_quality = cpi->cq_target_quality * 6 / 16
-                + adjustment;
+
+            cpi->active_best_quality = afq_low_motion_minq[q] + adjustment;
           }
         }
       }
@@ -3262,7 +3273,7 @@
   // in this frame.
   // update_base_skip_probs(cpi);
 
-#if CONFIG_INTERNAL_STATS
+#if 0  // CONFIG_INTERNAL_STATS
   {
     FILE *f = fopen("tmp.stt", cm->current_video_frame ? "a" : "w");
     int recon_err;
--- a/vp9/vp9_cx_iface.c
+++ b/vp9/vp9_cx_iface.c
@@ -277,11 +277,9 @@
   // CBR code has been deprectated for experimental phase.
   // CQ mode not yet tested
   oxcf->end_usage        = USAGE_LOCAL_FILE_PLAYBACK;
-  /*
   if (cfg.rc_end_usage == VPX_CQ)
     oxcf->end_usage      = USAGE_CONSTRAINED_QUALITY;
-    */
-  if (cfg.rc_end_usage == VPX_Q)
+  else if (cfg.rc_end_usage == VPX_Q)
     oxcf->end_usage      = USAGE_CONSTANT_QUALITY;
 
   oxcf->target_bandwidth        = cfg.rc_target_bitrate;