shithub: libvpx

Download patch

ref: 64baa8df2e3f5cd8036fac9715d3f7d348620fa6
parent: 81cdeb7117154dfa4ae9e8c22d3df1a23793a82b
author: Scott LaVarnway <slavarnway@google.com>
date: Thu Dec 16 12:01:27 EST 2010

Changed segmentation check order

In SPLITMV, the 8x8 segment will be checked first.  If the 8x8 rd
is better than the best, we check the other segments.  Otherwise
bail.  Adjustments to the thresh_mult were necessary to make
up for the initial quality loss.
The performance improved by 20% (average) for good quality,
speed 0 and speed 1, while the overall quality remained the same.

Change-Id: I717aef401323c8a254fba3e9777d2a316c774cc3

--- a/vp8/encoder/onyx_if.c
+++ b/vp8/encoder/onyx_if.c
@@ -683,6 +683,32 @@
         sf->thresh_mult[THR_NEARG    ] = 1000;
         sf->thresh_mult[THR_NEARA    ] = 1000;
 
+#if 1
+        sf->thresh_mult[THR_ZEROMV   ] = 0;
+        sf->thresh_mult[THR_ZEROG    ] = 0;
+        sf->thresh_mult[THR_ZEROA    ] = 0;
+        sf->thresh_mult[THR_NEARESTMV] = 0;
+        sf->thresh_mult[THR_NEARESTG ] = 0;
+        sf->thresh_mult[THR_NEARESTA ] = 0;
+        sf->thresh_mult[THR_NEARMV   ] = 0;
+        sf->thresh_mult[THR_NEARG    ] = 0;
+        sf->thresh_mult[THR_NEARA    ] = 0;
+
+//        sf->thresh_mult[THR_DC       ] = 0;
+
+//        sf->thresh_mult[THR_V_PRED   ] = 1000;
+//        sf->thresh_mult[THR_H_PRED   ] = 1000;
+//        sf->thresh_mult[THR_B_PRED   ] = 2000;
+//        sf->thresh_mult[THR_TM       ] = 1000;
+
+        sf->thresh_mult[THR_NEWMV    ] = 1000;
+        sf->thresh_mult[THR_NEWG     ] = 1000;
+        sf->thresh_mult[THR_NEWA     ] = 1000;
+
+        sf->thresh_mult[THR_SPLITMV  ] = 1700;
+        sf->thresh_mult[THR_SPLITG   ] = 4500;
+        sf->thresh_mult[THR_SPLITA   ] = 4500;
+#else
         sf->thresh_mult[THR_NEWMV    ] = 1500;
         sf->thresh_mult[THR_NEWG     ] = 1500;
         sf->thresh_mult[THR_NEWA     ] = 1500;
@@ -690,7 +716,7 @@
         sf->thresh_mult[THR_SPLITMV  ] = 5000;
         sf->thresh_mult[THR_SPLITG   ] = 10000;
         sf->thresh_mult[THR_SPLITA   ] = 10000;
-
+#endif
         sf->full_freq[0] = 15;
         sf->full_freq[1] = 31;
 
@@ -731,7 +757,7 @@
 
             cpi->mode_check_freq[THR_SPLITG] = 4;
             cpi->mode_check_freq[THR_SPLITA] = 4;
-            cpi->mode_check_freq[THR_SPLITMV] = 2;
+            cpi->mode_check_freq[THR_SPLITMV] = 0;
 
             sf->thresh_mult[THR_TM       ] = 1500;
             sf->thresh_mult[THR_V_PRED   ] = 1500;
--- a/vp8/encoder/rdopt.c
+++ b/vp8/encoder/rdopt.c
@@ -1038,7 +1038,7 @@
   int d;
   int segment_yrate;
   B_PREDICTION_MODE modes[16];
-  MV mvs[16];
+  int_mv mvs[16];
   unsigned char eobs[16];
 
   int mvthresh;
@@ -1276,7 +1276,7 @@
         {
             BLOCKD *bd = &x->e_mbd.block[i];
 
-            bsi->mvs[i] = bd->bmi.mv.as_mv;
+            bsi->mvs[i].as_mv = bd->bmi.mv.as_mv;
             bsi->modes[i] = bd->bmi.mode;
             bsi->eobs[i] = bd->eob;
         }
@@ -1305,19 +1305,32 @@
     {
         bsi.modes[i] = ZERO4X4;
     }
+    if(cpi->compressor_speed == 0)
+    {
+        /* for now, we will keep the original segmentation order
+           when in best quality mode */
+        vp8_rd_check_segment(cpi, x, &bsi, BLOCK_16X8);
+        vp8_rd_check_segment(cpi, x, &bsi, BLOCK_8X16);
+        vp8_rd_check_segment(cpi, x, &bsi, BLOCK_8X8);
+        vp8_rd_check_segment(cpi, x, &bsi, BLOCK_4X4);
+    }
+    else
+    {
+        vp8_rd_check_segment(cpi, x, &bsi, BLOCK_8X8);
+        if (bsi.segment_rd < best_rd)
+        {
+          vp8_rd_check_segment(cpi, x, &bsi, BLOCK_8X16);
+          vp8_rd_check_segment(cpi, x, &bsi, BLOCK_16X8);
+          vp8_rd_check_segment(cpi, x, &bsi, BLOCK_4X4);
+        }
+    }
 
-    /* original */
-    vp8_rd_check_segment(cpi, x, &bsi, 0);
-    vp8_rd_check_segment(cpi, x, &bsi, 1);
-    vp8_rd_check_segment(cpi, x, &bsi, 2);
-    vp8_rd_check_segment(cpi, x, &bsi, 3);
-
     /* set it to the best */
     for (i = 0; i < 16; i++)
     {
         BLOCKD *bd = &x->e_mbd.block[i];
 
-        bd->bmi.mv.as_mv = bsi.mvs[i];
+        bd->bmi.mv.as_mv = bsi.mvs[i].as_mv;
         bd->bmi.mode = bsi.modes[i];
         bd->eob = bsi.eobs[i];
     }
--