]> granicus.if.org Git - libvpx/commitdiff
T8x8 experiment merge.
authorPaul Wilkins <paulwilkins@google.com>
Wed, 9 Nov 2011 14:05:28 +0000 (14:05 +0000)
committerPaul Wilkins <paulwilkins@google.com>
Wed, 9 Nov 2011 15:46:05 +0000 (15:46 +0000)
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

vp8/encoder/encodeframe.c
vp8/encoder/onyx_if.c
vp8/encoder/pickinter.c
vp8/encoder/rdopt.c

index 031e63ac774e7dc6216c9ed97695ec1b732ebc8f..b24b39633a9ce1da49087c989173abc9fcf1e047 100644 (file)
@@ -674,25 +674,19 @@ void encode_mb_row(VP8_COMP *cpi,
             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
-            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
+            // 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];
-#endif
             else
                 xd->mode_info_context->mbmi.segment_id = 0;
 
             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 vp8cx_encode_intra_macro_block(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t)
 {
     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 @@ int vp8cx_encode_intra_macro_block(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t)
         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 @@ int vp8cx_encode_inter_macroblock
         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 @@ int vp8cx_encode_inter_macroblock
         }
         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 @@ int vp8cx_encode_inter_macroblock
     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;
index 05cb4243922690ef6e765eeeba0a5d0633141a97..c98c9805987d62cb19a483fc8b8260308ce1715c 100644 (file)
@@ -488,19 +488,6 @@ static void init_seg_features(VP8_COMP *cpi)
         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 @@ static void init_seg_features(VP8_COMP *cpi)
 
             // 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 @@ static void init_seg_features(VP8_COMP *cpi)
                     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 @@ static void init_seg_features(VP8_COMP *cpi)
             // 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
index 71c2a14305e5806ed94d727a5d8d394ea8cd0550..4d8c0b97be5de3c699fce0f7a3096c2ab22cbd8c 100644 (file)
@@ -539,6 +539,12 @@ void vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset,
         {
             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
index 3941474a87356b90b6291d6052a0cb3811cbb0b6..688451f0502a9871a53f83192a8b61be2398e96f 100644 (file)
@@ -2146,6 +2146,12 @@ void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int
         {
             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