shithub: libvpx

Download patch

ref: 1c24442a07b83c2ec22e9635fe570b5ea42ce784
parent: dfbc61f3ab8c20e3ac7ed94209ab62dfe080b53e
author: Paul Wilkins <paulwilkins@google.com>
date: Tue Sep 13 08:58:04 EDT 2011

Change to segment_feature_data[][] structure.

This data structure is  now [Segment ID][Features]
rather than [Features][Segment_ID]

I propose as a separate modification to make the experimental
bit stream reflect this such that all the features for a segment
are coded together.

Change-Id: I581e4e3ca2033bdbdef3d9300977a8202f55b4fb

--- a/vp8/common/blockd.h
+++ b/vp8/common/blockd.h
@@ -253,7 +253,7 @@
 #endif
 
     // Segment features
-    signed char segment_feature_data[SEG_LVL_MAX][MAX_MB_SEGMENTS];
+    signed char segment_feature_data[MAX_MB_SEGMENTS][SEG_LVL_MAX];
 
     /* mode_based Loop filter adjustment */
     unsigned char mode_ref_lf_delta_enabled;
--- a/vp8/common/loopfilter.c
+++ b/vp8/common/loopfilter.c
@@ -221,11 +221,11 @@
             /* Abs value */
             if (mbd->mb_segement_abs_delta == SEGMENT_ABSDATA)
             {
-                lvl_seg = mbd->segment_feature_data[SEG_LVL_ALT_LF][seg];
+                lvl_seg = mbd->segment_feature_data[seg][SEG_LVL_ALT_LF];
             }
             else  /* Delta Value */
             {
-                lvl_seg += mbd->segment_feature_data[SEG_LVL_ALT_LF][seg];
+                lvl_seg += mbd->segment_feature_data[seg][SEG_LVL_ALT_LF];
                 lvl_seg = (lvl_seg > 0) ? ((lvl_seg > 63) ? 63: lvl_seg) : 0;
             }
         }
@@ -541,13 +541,13 @@
         {    /* Abs value */
             if (mbd->mb_segement_abs_delta == SEGMENT_ABSDATA)
             {
-                lvl_seg[i] = mbd->segment_feature_data[SEG_LVL_ALT_LF][i];
+                lvl_seg[i] = mbd->segment_feature_data[i][SEG_LVL_ALT_LF];
             }
             /* Delta Value */
             else
             {
                 lvl_seg[i] = default_filt_lvl
-                        + mbd->segment_feature_data[SEG_LVL_ALT_LF][i];
+                        + mbd->segment_feature_data[i][SEG_LVL_ALT_LF];
                 lvl_seg[i] = (lvl_seg[i] > 0) ?
                         ((lvl_seg[i] > 63) ? 63: lvl_seg[i]) : 0;
             }
--- a/vp8/decoder/decodframe.c
+++ b/vp8/decoder/decodframe.c
@@ -80,12 +80,13 @@
     {
         /* Abs Value */
         if (xd->mb_segement_abs_delta == SEGMENT_ABSDATA)
-            QIndex = xd->segment_feature_data[SEG_LVL_ALT_Q][mbmi->segment_id];
+            QIndex = xd->segment_feature_data[mbmi->segment_id][SEG_LVL_ALT_Q];
 
         /* Delta Value */
         else
         {
-            QIndex = pc->base_qindex + xd->segment_feature_data[SEG_LVL_ALT_Q][mbmi->segment_id];
+            QIndex = pc->base_qindex +
+                xd->segment_feature_data[mbmi->segment_id][SEG_LVL_ALT_Q];
             QIndex = (QIndex >= 0) ? ((QIndex <= MAXQ) ? QIndex : MAXQ) : 0;    /* Clamp to valid range */
         }
     }
@@ -946,13 +947,13 @@
                     /* Frame level data */
                     if (vp8_read_bit(bc))
                     {
-                        xd->segment_feature_data[i][j] = (signed char)vp8_read_literal(bc, mb_feature_data_bits[i]);
+                        xd->segment_feature_data[j][i] = (signed char)vp8_read_literal(bc, mb_feature_data_bits[i]);
 
                         if (vp8_read_bit(bc))
-                            xd->segment_feature_data[i][j] = -xd->segment_feature_data[i][j];
+                            xd->segment_feature_data[j][i] = -xd->segment_feature_data[j][i];
                     }
                     else
-                        xd->segment_feature_data[i][j] = 0;
+                        xd->segment_feature_data[j][i] = 0;
                 }
             }
         }
--- a/vp8/encoder/bitstream.c
+++ b/vp8/encoder/bitstream.c
@@ -1852,7 +1852,7 @@
                 // For each of the segments
                 for (j = 0; j < MAX_MB_SEGMENTS; j++)
                 {
-                    Data = xd->segment_feature_data[i][j];
+                    Data = xd->segment_feature_data[j][i];
 
                     // Frame level data
                     if (Data)
--- a/vp8/encoder/onyx_int.h
+++ b/vp8/encoder/onyx_int.h
@@ -478,7 +478,7 @@
     unsigned char *segmentation_map;
 
     // Segment data (can be deltas or absolute values)
-    signed char segment_feature_data[SEG_LVL_MAX][MAX_MB_SEGMENTS];
+    signed char segment_feature_data[MAX_MB_SEGMENTS][SEG_LVL_MAX];
 
     // segment threashold for encode breakout
     int  segment_encode_breakout[MAX_MB_SEGMENTS];
--- a/vp8/encoder/picklpf.c
+++ b/vp8/encoder/picklpf.c
@@ -259,10 +259,10 @@
     MACROBLOCKD *mbd = &cpi->mb.e_mbd;
     (void) filt_val;
 
-    mbd->segment_feature_data[SEG_LVL_ALT_LF][0] = cpi->segment_feature_data[SEG_LVL_ALT_LF][0];
-    mbd->segment_feature_data[SEG_LVL_ALT_LF][1] = cpi->segment_feature_data[SEG_LVL_ALT_LF][1];
-    mbd->segment_feature_data[SEG_LVL_ALT_LF][2] = cpi->segment_feature_data[SEG_LVL_ALT_LF][2];
-    mbd->segment_feature_data[SEG_LVL_ALT_LF][3] = cpi->segment_feature_data[SEG_LVL_ALT_LF][3];
+    mbd->segment_feature_data[0][SEG_LVL_ALT_LF] = cpi->segment_feature_data[0][SEG_LVL_ALT_LF];
+    mbd->segment_feature_data[1][SEG_LVL_ALT_LF] = cpi->segment_feature_data[1][SEG_LVL_ALT_LF];
+    mbd->segment_feature_data[2][SEG_LVL_ALT_LF] = cpi->segment_feature_data[2[SEG_LVL_ALT_LF]];
+    mbd->segment_feature_data[3][SEG_LVL_ALT_LF] = cpi->segment_feature_data[3][SEG_LVL_ALT_LF];
 }
 
 void vp8cx_pick_filter_level(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi)
--- a/vp8/encoder/quantize.c
+++ b/vp8/encoder/quantize.c
@@ -1174,11 +1174,11 @@
         // Abs Value
         if (xd->mb_segement_abs_delta == SEGMENT_ABSDATA)
 
-            QIndex = xd->segment_feature_data[SEG_LVL_ALT_Q][xd->mode_info_context->mbmi.segment_id];
+            QIndex = xd->segment_feature_data[xd->mode_info_context->mbmi.segment_id][SEG_LVL_ALT_Q];
         // Delta Value
         else
         {
-            QIndex = cpi->common.base_qindex + xd->segment_feature_data[SEG_LVL_ALT_Q][xd->mode_info_context->mbmi.segment_id];
+            QIndex = cpi->common.base_qindex + xd->segment_feature_data[xd->mode_info_context->mbmi.segment_id][SEG_LVL_ALT_Q];
             QIndex = (QIndex >= 0) ? ((QIndex <= MAXQ) ? QIndex : MAXQ) : 0;    // Clamp to valid range
         }
     }
@@ -1316,10 +1316,10 @@
 
 
     // Set Segment specific quatizers
-    mbd->segment_feature_data[SEG_LVL_ALT_Q][0] = cpi->segment_feature_data[SEG_LVL_ALT_Q][0];
-    mbd->segment_feature_data[SEG_LVL_ALT_Q][1] = cpi->segment_feature_data[SEG_LVL_ALT_Q][1];
-    mbd->segment_feature_data[SEG_LVL_ALT_Q][2] = cpi->segment_feature_data[SEG_LVL_ALT_Q][2];
-    mbd->segment_feature_data[SEG_LVL_ALT_Q][3] = cpi->segment_feature_data[SEG_LVL_ALT_Q][3];
+    mbd->segment_feature_data[0][SEG_LVL_ALT_Q] = cpi->segment_feature_data[0][SEG_LVL_ALT_Q];
+    mbd->segment_feature_data[1][SEG_LVL_ALT_Q] = cpi->segment_feature_data[1][SEG_LVL_ALT_Q];
+    mbd->segment_feature_data[2][SEG_LVL_ALT_Q] = cpi->segment_feature_data[2][SEG_LVL_ALT_Q];
+    mbd->segment_feature_data[3][SEG_LVL_ALT_Q] = cpi->segment_feature_data[3][SEG_LVL_ALT_Q];
 
     /* quantizer has to be reinitialized for any delta_q changes */
     if(update)