VP8: unroll MB mode decoding tree
[ffmpeg.git] / libavcodec / vp8data.h
index 0cd29ed..d3a47fc 100644 (file)
@@ -62,6 +62,14 @@ enum inter_submvmode {
     VP8_SUBMVMODE_NEW4X4
 };
 
+enum inter_splitmvmode {
+    VP8_SPLITMVMODE_16x8 = 0,    ///< 2 16x8 blocks (vertical)
+    VP8_SPLITMVMODE_8x16,        ///< 2 8x16 blocks (horizontal)
+    VP8_SPLITMVMODE_8x8,         ///< 2x2 blocks of 8x8px each
+    VP8_SPLITMVMODE_4x4,         ///< 4x4 blocks of 4x4px each
+    VP8_SPLITMVMODE_NONE,        ///< (only used in prediction) no split MVs
+};
+
 static const uint8_t vp8_pred4x4_mode[] =
 {
     [DC_PRED8x8]    = DC_PRED,
@@ -95,24 +103,7 @@ static const int vp8_mode_contexts[6][4] = {
     { 234, 188, 128,  28 },
 };
 
-static const int8_t vp8_pred16x16_tree_mvinter[4][2] = {
-    { -VP8_MVMODE_ZERO,      1 },           // '0'
-     { -VP8_MVMODE_NEAREST,  2 },           // '10'
-      { -VP8_MVMODE_NEAR,    3 },           // '110'
-       { -VP8_MVMODE_NEW, -VP8_MVMODE_SPLIT } // '1110', '1111'
-};
-
-static const int8_t vp8_small_mvtree[7][2] = {
-    {  1, 4 },
-     {  2, 3 },
-      { -0, -1 },                           // '000', '001'
-      { -2, -3 },                           // '010', '011'
-     {  5,  6 },
-      { -4, -5 },                           // '100', '101'
-      { -6, -7 }                            // '110', '111'
-};
-
-static const uint8_t vp8_mbsplits[4][16] = {
+static const uint8_t vp8_mbsplits[5][16] = {
     {  0,  0,  0,  0,  0,  0,  0,  0,
        1,  1,  1,  1,  1,  1,  1,  1  },
     {  0,  0,  1,  1,  0,  0,  1,  1,
@@ -120,7 +111,9 @@ static const uint8_t vp8_mbsplits[4][16] = {
     {  0,  0,  1,  1,  0,  0,  1,  1,
        2,  2,  3,  3,  2,  2,  3,  3  },
     {  0,  1,  2,  3,  4,  5,  6,  7,
-       8,  9, 10, 11, 12, 13, 14, 15  }
+       8,  9, 10, 11, 12, 13, 14, 15  },
+    {  0,  0,  0,  0,  0,  0,  0,  0,
+       0,  0,  0,  0,  0,  0,  0,  0  }
 };
 
 static const uint8_t vp8_mbfirstidx[4][16] = {
@@ -130,10 +123,10 @@ static const uint8_t vp8_mbfirstidx[4][16] = {
 };
 
 static const int8_t vp8_mbsplit_tree[3][2] = {
-    { -3,  1 },                             // '0' - 16 individual MVs
-     { -2,  2 },                            // '10' - quarter-based MVs
-      { -0, -1 }                            // '110' - top/bottom MVs,
-                                            // '111' - left/right MVs
+    { -VP8_SPLITMVMODE_4x4,  1 },           // '0' - 16 individual MVs
+     { -VP8_SPLITMVMODE_8x8,  2 },          // '10' - quarter-based MVs
+      { -VP8_SPLITMVMODE_16x8,              // '110' - top/bottom MVs
+        -VP8_SPLITMVMODE_8x16 }             // '111' - left/right MVs
 };
 static const uint8_t vp8_mbsplit_count[4] = {   2,   2,   4,  16 };
 static const uint8_t vp8_mbsplit_prob[3]  = { 110, 111, 150 };
@@ -319,21 +312,6 @@ static const uint8_t vp8_coeff_band[16] =
     0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7
 };
 
-static const int8_t vp8_coeff_tree[NUM_DCT_TOKENS-1][2] =
-{
-    { -DCT_EOB, 1 },                // '0'
-     { -DCT_0, 2 },                 // '10'
-      { -DCT_1, 3 },                // '110'
-       { 4, 6 },
-        { -DCT_2, 5 },              // '11100'
-         { -DCT_3, -DCT_4 },        // '111010', '111011'
-        { 7, 8 },
-         { -DCT_CAT1, -DCT_CAT2 },  // '111100', '111101'
-         { 9, 10 },
-          { -DCT_CAT3, -DCT_CAT4 }, // '1111100', '1111101'
-          { -DCT_CAT5, -DCT_CAT6 }, // '1111110', '1111111'
-};
-
 static const uint8_t vp8_dct_cat1_prob[] = { 159, 0 };
 static const uint8_t vp8_dct_cat2_prob[] = { 165, 145, 0 };
 static const uint8_t vp8_dct_cat3_prob[] = { 173, 148, 140, 0 };
@@ -341,18 +319,15 @@ static const uint8_t vp8_dct_cat4_prob[] = { 176, 155, 140, 135, 0 };
 static const uint8_t vp8_dct_cat5_prob[] = { 180, 157, 141, 134, 130, 0 };
 static const uint8_t vp8_dct_cat6_prob[] = { 254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129, 0 };
 
-static const uint8_t * const vp8_dct_cat_prob[6] =
+// only used for cat3 and above; cat 1 and 2 are referenced directly
+static const uint8_t * const vp8_dct_cat_prob[] =
 {
-    vp8_dct_cat1_prob,
-    vp8_dct_cat2_prob,
     vp8_dct_cat3_prob,
     vp8_dct_cat4_prob,
     vp8_dct_cat5_prob,
     vp8_dct_cat6_prob,
 };
 
-static const uint8_t vp8_dct_cat_offset[6] = { 5, 7, 11, 19, 35, 67 };
-
 static const uint8_t vp8_token_default_probs[4][8][3][NUM_DCT_TOKENS-1] =
 {
     {