shithub: libvpx

Download patch

ref: 4f792921e74cff85fd130cf482669846fcd809e5
parent: eb15fe85e088ff7788a39cb0998ece58afd692c2
author: Paul Wilkins <paulwilkins@google.com>
date: Fri Nov 18 14:44:57 EST 2011

CONFIG_T8X8 experiment.:

Block the selection of 4x4 modes in key frames if 8x8 is selected.

Change-Id: Ie5729ec22a999d9a1996f020bd4b941e29514992

--- a/vp8/encoder/encodeframe.c
+++ b/vp8/encoder/encodeframe.c
@@ -1355,7 +1355,8 @@
     vp8_tokenize_mb(cpi, &x->e_mbd, t);
 #if CONFIG_T8X8
         if ( get_seg_tx_type(&x->e_mbd,
-                             x->e_mbd.mode_info_context->mbmi.segment_id) )
+                             x->e_mbd.mode_info_context->mbmi.segment_id)
+             == TX_8X8 )
         {
             cpi->t8x8_count++;
         }
--- a/vp8/encoder/pickinter.c
+++ b/vp8/encoder/pickinter.c
@@ -539,6 +539,7 @@
         {
             continue;
         }
+#if CONFIG_T8X8
         // No 4x4 modes if segment flagged as 8x8
         else if ( ( get_seg_tx_type( xd, segment_id ) == TX_8X8 ) &&
                   ( (this_mode == B_PRED) || (this_mode == SPLITMV) ) )
@@ -545,6 +546,7 @@
         {
             continue;
         }
+#endif
 //#if !CONFIG_SEGFEATURES
         // Disable this drop out case if either the mode or ref frame
         // segment level feature is enabled for this segment. This is to
@@ -920,6 +922,7 @@
 
 void vp8_pick_intra_mode(VP8_COMP *cpi, MACROBLOCK *x, int *rate_)
 {
+    MACROBLOCKD *xd = &x->e_mbd;
     int error4x4, error16x16 = INT_MAX;
     int rate, best_rate = 0, distortion, best_sse;
     MB_PREDICTION_MODE mode, best_mode = DC_PRED;
@@ -951,8 +954,22 @@
     }
     x->e_mbd.mode_info_context->mbmi.mode = best_mode;
 
+#if CONFIG_T8X8
+    if ( get_seg_tx_type( xd,
+                          xd->mode_info_context->mbmi.segment_id ) == TX_4X4 )
+    {
+        error4x4 = pick_intra4x4mby_modes(IF_RTCD(&cpi->rtcd), x, &rate,
+                                          &best_sse);
+    }
+    else
+    {
+        error4x4 = INT_MAX;
+    }
+#else
     error4x4 = pick_intra4x4mby_modes(IF_RTCD(&cpi->rtcd), x, &rate,
                                       &best_sse);
+#endif
+
     if (error4x4 < error16x16)
     {
         x->e_mbd.mode_info_context->mbmi.mode = B_PRED;
--- a/vp8/encoder/rdopt.c
+++ b/vp8/encoder/rdopt.c
@@ -2146,6 +2146,7 @@
         {
             continue;
         }
+#if CONFIG_T8X8
         // No 4x4 modes if segment flagged as 8x8
         else if ( ( get_seg_tx_type( xd, segment_id ) == TX_8X8 ) &&
                   ( (this_mode == B_PRED) || (this_mode == SPLITMV) ) )
@@ -2152,6 +2153,8 @@
         {
             continue;
         }
+#endif
+
 //#if !CONFIG_SEGFEATURES
         // Disable this drop out case if either the mode or ref frame
         // segment level feature is enabled for this segment. This is to
@@ -2729,6 +2732,7 @@
 
 void vp8_rd_pick_intra_mode(VP8_COMP *cpi, MACROBLOCK *x, int *rate_)
 {
+    MACROBLOCKD *xd = &x->e_mbd;
     int error4x4, error16x16;
     int rate4x4, rate16x16 = 0, rateuv;
     int dist4x4, dist16x16, distuv;
@@ -2761,9 +2765,24 @@
     mode8x8[2]= x->e_mbd.mode_info_context->bmi[8].as_mode;
     mode8x8[3]= x->e_mbd.mode_info_context->bmi[10].as_mode;
 #endif
+
+#if CONFIG_T8X8
+    if ( get_seg_tx_type( xd,
+                          xd->mode_info_context->mbmi.segment_id ) == TX_4X4 )
+    {
+        error4x4 = rd_pick_intra4x4mby_modes(cpi, x,
+                                             &rate4x4, &rate4x4_tokenonly,
+                                             &dist4x4, error16x16);
+    }
+    else
+    {
+        error4x4 = INT_MAX;
+    }
+#else
     error4x4 = rd_pick_intra4x4mby_modes(cpi, x,
                                          &rate4x4, &rate4x4_tokenonly,
                                          &dist4x4, error16x16);
+#endif
 
 #if CONFIG_I8X8
     if(error8x8> error16x16)
--