shithub: libvpx

Download patch

ref: 07892531256d4cce9ee2f0e18f0234e5b4752bf2
parent: b0f9f15dbd200a02103afc18e5674d2000699f65
author: Paul Wilkins <paulwilkins@google.com>
date: Wed Nov 9 09:05:28 EST 2011

T8x8 experiment merge.

For ease of testing and merging experiments I have
removed in line code in encode_frame() that assigns
MBs to be t8x8 or t4x4 coded segments and have
moved the decision point and segment setup to
the init_seg_features0 test function.

Keeping everything in one place helps make sure
for now that experiments using segmentation are
not fighting each other.

Also made sure mode selection code can't choose 4x4
modes if t8x8 is selected.

Patch2: In init_seg_features() add checks
for SEG_LVL_TRANSFORM active.

Change-Id: Ia1767edd99b78510011d4251539f9bc325842e3a

--- a/vp8/encoder/encodeframe.c
+++ b/vp8/encoder/encodeframe.c
@@ -674,18 +674,11 @@
             vp8_activity_masking(cpi, x);
 
         // Is segmentation enabled
-        // MB level adjutment to quantizer
         if (xd->segmentation_enabled)
         {
-            // Code to set segment id in xd->mbmi.segment_id for current MB (with range checking)
-#if CONFIG_T8X8
-            // Reset segment_id to 0 or 1 so that the default transform mode is 4x4
+            // Code to set segment id in xd->mbmi.segment_id
             if (cpi->segmentation_map[map_index+mb_col] <= 3)
-                xd->mode_info_context->mbmi.segment_id = cpi->segmentation_map[map_index+mb_col]&1;
-#else
-            if (cpi->segmentation_map[map_index+mb_col] <= 3)
                 xd->mode_info_context->mbmi.segment_id = cpi->segmentation_map[map_index+mb_col];
-#endif
             else
                 xd->mode_info_context->mbmi.segment_id = 0;
 
@@ -692,7 +685,8 @@
             vp8cx_mb_init_quantizer(cpi, x);
         }
         else
-            xd->mode_info_context->mbmi.segment_id = 0;         // Set to Segment 0 by default
+            // Set to Segment 0 by default
+            xd->mode_info_context->mbmi.segment_id = 0;
 
         x->active_ptr = cpi->active_map + map_index + mb_col;
 
@@ -1522,10 +1516,6 @@
 {
     int rate;
 
-#if CONFIG_T8X8
-    if (x->e_mbd.segmentation_enabled)
-        x->e_mbd.update_mb_segmentation_map = 1;
-#endif
     if (cpi->sf.RD && cpi->compressor_speed != 2)
         vp8_rd_pick_intra_mode(cpi, x, &rate);
     else
@@ -1549,10 +1539,6 @@
         vp8_encode_intra4x4mby(IF_RTCD(&cpi->rtcd), x);
     else
     {
-#if CONFIG_T8X8
-        if (x->e_mbd.segmentation_enabled)
-            x->e_mbd.mode_info_context->mbmi.segment_id |= (vp8_8x8_selection_intra(x) << 1);
-#endif
         vp8_encode_intra16x16mby(IF_RTCD(&cpi->rtcd), x);
     }
 #if CONFIG_I8X8
@@ -1729,11 +1715,6 @@
         cpi->count_mb_ref_frame_usage[xd->mode_info_context->mbmi.ref_frame]++;
     }
 
-#if CONFIG_T8X8
-    if (xd->segmentation_enabled)
-        x->e_mbd.update_mb_segmentation_map = 1;
-#endif
-
     if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME)
     {
         if (xd->mode_info_context->mbmi.mode == B_PRED)
@@ -1743,10 +1724,6 @@
         }
         else
         {
-#if CONFIG_T8X8
-            if (xd->segmentation_enabled)
-                *segment_id |= (vp8_8x8_selection_intra(x) << 1);
-#endif
             vp8_encode_intra16x16mbuv(IF_RTCD(&cpi->rtcd), x);
             vp8_encode_intra16x16mby(IF_RTCD(&cpi->rtcd), x);
         }
@@ -1756,10 +1733,6 @@
     else
     {
         int ref_fb_idx;
-#if CONFIG_T8X8
-        if (xd->segmentation_enabled)
-            *segment_id |= (vp8_8x8_selection_inter(x) << 1);
-#endif
 
         if (xd->mode_info_context->mbmi.ref_frame == LAST_FRAME)
             ref_fb_idx = cpi->common.lst_fb_idx;
--- a/vp8/encoder/onyx_if.c
+++ b/vp8/encoder/onyx_if.c
@@ -488,19 +488,6 @@
         return;
     }
 
-#if CONFIG_T8X8
-    // TODO
-    // For now 8x8TX mode just set segments up for 8x8 and 4x4 modes and exit.
-    enable_segfeature(xd, 0, SEG_LVL_TRANSFORM);
-    set_segdata( xd, 0, SEG_LVL_TRANSFORM, TX_4X4 );
-    enable_segfeature(xd, 2, SEG_LVL_TRANSFORM);
-    set_segdata( xd, 2, SEG_LVL_TRANSFORM, TX_8X8 );
-
-    // Turn on segmentation
-    vp8_enable_segmentation((VP8_PTR)cpi);
-    return;
-#endif
-
     // Disable and clear down for KF
     if ( cm->frame_type == KEY_FRAME  )
     {
@@ -547,6 +534,16 @@
 
             // Where relevant assume segment data is delta data
             xd->mb_segement_abs_delta = SEGMENT_DELTADATA;
+
+#if CONFIG_T8X8
+            // 8x8TX test code.
+            // This assignment does not necessarily make sense but is
+            // just to test the mechanism for now.
+            enable_segfeature(xd, 0, SEG_LVL_TRANSFORM);
+            set_segdata( xd, 0, SEG_LVL_TRANSFORM, TX_4X4 );
+            enable_segfeature(xd, 1, SEG_LVL_TRANSFORM);
+            set_segdata( xd, 1, SEG_LVL_TRANSFORM, TX_8X8 );
+#endif
         }
     }
 
@@ -577,8 +574,13 @@
                     set_segdata( xd, 1, SEG_LVL_MODE, ZEROMV );
                     enable_segfeature(xd, 1, SEG_LVL_MODE);
 
-                    set_segdata( xd, 1, SEG_LVL_EOB, 0 );
-                    enable_segfeature(xd, 1, SEG_LVL_EOB);
+                    if ( !segfeature_active( xd, 1, SEG_LVL_TRANSFORM ) ||
+                         get_seg_tx_type( xd, 1 ) == TX_4X4 )
+                    {
+                        // EOB segment coding not fixed for 8x8 yet
+                        set_segdata( xd, 1, SEG_LVL_EOB, 0 );
+                        enable_segfeature(xd, 1, SEG_LVL_EOB);
+                    }
                 }
             }
 
@@ -617,10 +619,21 @@
             // Skip all MBs if high Q
             if ( high_q )
             {
-                enable_segfeature(xd, 0, SEG_LVL_EOB);
-                enable_segfeature(xd, 1, SEG_LVL_EOB);
-                set_segdata( xd, 0, SEG_LVL_EOB, 0 );
-                set_segdata( xd, 1, SEG_LVL_EOB, 0 );
+                // EOB segment coding not fixed for 8x8 yet
+                if ( !segfeature_active( xd, 0, SEG_LVL_TRANSFORM ) ||
+                     get_seg_tx_type( xd, 0 ) == TX_4X4 )
+                {
+                    enable_segfeature(xd, 0, SEG_LVL_EOB);
+                    set_segdata( xd, 0, SEG_LVL_EOB, 0 );
+                }
+
+                // EOB segment coding not fixed for 8x8 yet
+                if ( !segfeature_active( xd, 1, SEG_LVL_TRANSFORM ) ||
+                     get_seg_tx_type( xd, 1 ) == TX_4X4 )
+                {
+                    enable_segfeature(xd, 1, SEG_LVL_EOB);
+                    set_segdata( xd, 1, SEG_LVL_EOB, 0 );
+                }
             }
 
             // Enable data udpate
--- a/vp8/encoder/pickinter.c
+++ b/vp8/encoder/pickinter.c
@@ -539,6 +539,12 @@
         {
             continue;
         }
+        // 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) ) )
+        {
+            continue;
+        }
 //#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
--- a/vp8/encoder/rdopt.c
+++ b/vp8/encoder/rdopt.c
@@ -2146,6 +2146,12 @@
         {
             continue;
         }
+        // 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) ) )
+        {
+            continue;
+        }
 //#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
--