shithub: libvpx

Download patch

ref: ad343687867532a30865efd9cb004cfc4cc1e7b8
parent: d03e974fbd0d04c41609357f39442564f8707eb7
author: Ronald S. Bultje <rbultje@google.com>
date: Mon Jun 3 06:39:40 EDT 2013

New intra mode and partitioning probabilities.

Split partition probabilities between keyframes and non-keyframes,
since they are fairly different. Also have per-blocksize interframe
y intramode probabilities, since these vary heavily between different
blocksizes.

Lastly, replace default probabilities for partitioning and intra modes
with new ones generated from current codec. Replace counts with actual
probabilities also.

Change-Id: I77ca996e25e4a28e03bdbc542f27a3e64ca1234f

--- a/vp9/common/vp9_blockd.h
+++ b/vp9/common/vp9_blockd.h
@@ -21,6 +21,7 @@
 #include "vp9/common/vp9_common.h"
 #include "vp9/common/vp9_enums.h"
 
+#define BLOCK_SIZE_GROUPS   4
 #define MAX_MB_SEGMENTS     8
 #define MB_SEG_TREE_PROBS   (MAX_MB_SEGMENTS-1)
 #define PREDICTION_PROBS 3
@@ -55,7 +56,8 @@
 
 typedef enum {
   KEY_FRAME = 0,
-  INTER_FRAME = 1
+  INTER_FRAME = 1,
+  NUM_FRAME_TYPES,
 } FRAME_TYPE;
 
 typedef enum {
--- a/vp9/common/vp9_entropymode.c
+++ b/vp9/common/vp9_entropymode.c
@@ -15,58 +15,87 @@
 #include "vp9/common/vp9_alloccommon.h"
 #include "vpx_mem/vpx_mem.h"
 
-static const unsigned int y_mode_cts[VP9_INTRA_MODES] = {
-  /* DC V  H D45 D135 D117 D153 D27 D63 TM */
-  98, 19, 15, 14, 14, 14, 14, 12, 12, 13,
+static const vp9_prob default_kf_uv_probs[VP9_INTRA_MODES]
+                                         [VP9_INTRA_MODES - 1] = {
+  { 149,  13,  48, 141, 174, 131,  54,  61, 109 } /* y = dc */,
+  { 120,  17, 119, 132, 103, 103,  54, 100, 130 } /* y = v */,
+  { 114,  16,  19, 177, 220, 145,  31,  33, 122 } /* y = h */,
+  { 119,  12,  43, 102, 133, 133,  77,  90, 102 } /* y = d45 */,
+  { 110,  10,  28, 144,  78, 158,  40,  49, 161 } /* y = d135 */,
+  { 114,  10,  46, 169,  50,  96,  48,  70, 150 } /* y = d117 */,
+  { 116,  10,  24, 125, 134, 168,  26,  27, 193 } /* y = d153 */,
+  { 121,  14,  26, 124, 175, 143,  36,  37,  79 } /* y = d27 */,
+  { 116,  13,  54, 100, 105, 122,  58, 126, 122 } /* y = d63 */,
+  {  98,  22,  60, 147, 159, 124,  45,  68, 128 } /* y = tm */
 };
 
-static const unsigned int uv_mode_cts[VP9_INTRA_MODES][VP9_INTRA_MODES] = {
-  /* DC   V   H  D45 135 117 153 D27 D63 TM */
-  { 200, 15, 15, 10, 10, 10, 10, 10, 10,  6}, /* DC */
-  { 130, 75, 10, 10, 10, 10, 10, 10, 10,  6}, /* V */
-  { 130, 10, 75, 10, 10, 10, 10, 10, 10,  6}, /* H */
-  { 130, 15, 10, 75, 10, 10, 10, 10, 10,  6}, /* D45 */
-  { 150, 15, 10, 10, 75, 10, 10, 10, 10,  6}, /* D135 */
-  { 150, 15, 10, 10, 10, 75, 10, 10, 10,  6}, /* D117 */
-  { 150, 15, 10, 10, 10, 10, 75, 10, 10,  6}, /* D153 */
-  { 150, 15, 10, 10, 10, 10, 10, 75, 10,  6}, /* D27 */
-  { 150, 15, 10, 10, 10, 10, 10, 10, 75,  6}, /* D63 */
-  { 160, 30, 30, 10, 10, 10, 10, 10, 10, 16}, /* TM */
+static const vp9_prob default_if_y_probs[BLOCK_SIZE_GROUPS]
+                                        [VP9_INTRA_MODES - 1] = {
+  {  42,  31,  23, 150, 161, 193,  32,  53, 100 } /* block_size < 8x8 */,
+  { 132,  58,  30, 160, 209, 195,  52,  47,  76 } /* block_size < 16x16 */,
+  { 179,  85,  24, 168, 236, 198,  87,  45,  46 } /* block_size < 32x32 */,
+  { 221, 176,  63, 133, 233, 121, 125, 105,  34 } /* block_size >= 32x32 */
 };
 
-static const unsigned int kf_uv_mode_cts[VP9_INTRA_MODES][VP9_INTRA_MODES] = {
-  // DC   V   H  D45 135 117 153 D27 D63 TM
-  { 160, 24, 24, 20, 20, 20, 20, 20, 20,  8}, /* DC */
-  { 102, 64, 30, 20, 20, 20, 20, 20, 20, 10}, /* V */
-  { 102, 30, 64, 20, 20, 20, 20, 20, 20, 10}, /* H */
-  { 102, 33, 20, 64, 20, 20, 20, 20, 20, 14}, /* D45 */
-  { 102, 33, 20, 20, 64, 20, 20, 20, 20, 14}, /* D135 */
-  { 122, 33, 20, 20, 20, 64, 20, 20, 20, 14}, /* D117 */
-  { 102, 33, 20, 20, 20, 20, 64, 20, 20, 14}, /* D153 */
-  { 102, 33, 20, 20, 20, 20, 20, 64, 20, 14}, /* D27 */
-  { 102, 33, 20, 20, 20, 20, 20, 20, 64, 14}, /* D63 */
-  { 132, 36, 30, 20, 20, 20, 20, 20, 20, 18}, /* TM */
+static const vp9_prob default_if_uv_probs[VP9_INTRA_MODES]
+                                         [VP9_INTRA_MODES - 1] = {
+  { 115,   7,  78, 180, 210, 127,  34,  57, 104 } /* y = dc */,
+  {  43,   9, 165, 140, 112,  93,  45, 125, 117 } /* y = v */,
+  {  68,   6,  25, 206, 241, 154,  16,  23, 102 } /* y = h */,
+  {  90,   5,  48, 117, 155, 134,  61,  88,  96 } /* y = d45 */,
+  {  77,   5,  43, 148, 100, 147,  37,  60, 146 } /* y = d135 */,
+  {  75,   5,  57, 167,  62,  91,  45,  76, 139 } /* y = d117 */,
+  {  86,   4,  34, 155, 185, 163,  22,  29, 160 } /* y = d153 */,
+  {  82,   5,  34, 155, 207, 144,  26,  38,  79 } /* y = d27 */,
+  {  69,   6,  65, 105, 104, 122,  48, 131, 116 } /* y = d63 */,
+  {  86,  16, 114, 177, 189, 108,  28,  72, 120 } /* y = tm */
 };
 
-const vp9_prob vp9_partition_probs[NUM_PARTITION_CONTEXTS]
+const vp9_prob vp9_partition_probs[NUM_FRAME_TYPES][NUM_PARTITION_CONTEXTS]
                                   [PARTITION_TYPES - 1] = {
-  // FIXME(jingning,rbultje) put real probabilities here
-  {202, 162, 107},
-  {16,  2,   169},
-  {3,   246,  19},
-  {104, 90,  134},
-  {202, 162, 107},
-  {16,  2,   169},
-  {3,   246,  19},
-  {104, 90,  134},
-  {202, 162, 107},
-  {16,  2,   169},
-  {3,   246,  19},
-  {104, 90,  134},
-  {183, 70,  109},
-  {30,  14,  162},
-  {67,  208,  22},
-  {4,   17,   5},
+  { /* frame_type = keyframe */
+    /* 8x8 -> 4x4 */
+    { 164, 121, 109 } /* a/l both not split */,
+    {  69,  11, 129 } /* a split, l not split */,
+    {  52, 181,  37 } /* l split, a not split */,
+    {  66,  71,  93 } /* a/l both split */,
+    /* 16x16 -> 8x8 */
+    { 154,  48,  43 } /* a/l both not split */,
+    {  81,  11,  63 } /* a split, l not split */,
+    {  67,  65,  17 } /* l split, a not split */,
+    {  57,  18,  24 } /* a/l both split */,
+    /* 32x32 -> 16x16 */
+    { 156,  42,  35 } /* a/l both not split */,
+    {  74,  10,  40 } /* a split, l not split */,
+    {  59,  53,  10 } /* l split, a not split */,
+    {  28,  10,   9 } /* a/l both split */,
+    /* 64x64 -> 32x32 */
+    { 168,  32,  43 } /* a/l both not split */,
+    {  59,  13,  41 } /* a split, l not split */,
+    {  60,  25,  10 } /* l split, a not split */,
+    {  13,   5,   4 } /* a/l both split */
+  }, { /* frame_type = interframe */
+    /* 8x8 -> 4x4 */
+    { 192, 121, 151 } /* a/l both not split */,
+    { 134,  63, 162 } /* a split, l not split */,
+    { 136, 134, 127 } /* l split, a not split */,
+    { 101,  97, 131 } /* a/l both split */,
+    /* 16x16 -> 8x8 */
+    { 167,  67,  80 } /* a/l both not split */,
+    {  87,  36,  70 } /* a split, l not split */,
+    {  90,  61,  45 } /* l split, a not split */,
+    {  46,  31,  32 } /* a/l both split */,
+    /* 32x32 -> 16x16 */
+    { 167,  63,  75 } /* a/l both not split */,
+    {  67,  27,  61 } /* a split, l not split */,
+    {  56,  87,  31 } /* l split, a not split */,
+    {  15,  13,  11 } /* a/l both split */,
+    /* 64x64 -> 32x32 */
+    { 222,  45,  44 } /* a/l both not split */,
+    {  62,  17,  62 } /* a split, l not split */,
+    {  52,  65,  16 } /* l split, a not split */,
+    {   9,   7,   6 } /* a/l both split */
+  }
 };
 
 /* Array indices are identical to previously-existing INTRAMODECONTEXTNODES. */
@@ -101,19 +130,13 @@
 struct vp9_token vp9_partition_encodings[PARTITION_TYPES];
 
 void vp9_init_mbmode_probs(VP9_COMMON *x) {
-  unsigned int bct[VP9_INTRA_MODES][2];  // num Ymodes > num UV modes
-  int i;
+  vpx_memcpy(x->fc.uv_mode_prob, default_if_uv_probs,
+             sizeof(default_if_uv_probs));
+  vpx_memcpy(x->kf_uv_mode_prob, default_kf_uv_probs,
+             sizeof(default_kf_uv_probs));
+  vpx_memcpy(x->fc.y_mode_prob, default_if_y_probs,
+             sizeof(default_if_y_probs));
 
-  vp9_tree_probs_from_distribution(vp9_intra_mode_tree, x->fc.y_mode_prob,
-                                   bct, y_mode_cts, 0);
-
-  for (i = 0; i < VP9_INTRA_MODES; i++) {
-    vp9_tree_probs_from_distribution(vp9_intra_mode_tree, x->kf_uv_mode_prob[i],
-                                     bct, kf_uv_mode_cts[i], 0);
-    vp9_tree_probs_from_distribution(vp9_intra_mode_tree, x->fc.uv_mode_prob[i],
-                                     bct, uv_mode_cts[i], 0);
-  }
-
   vpx_memcpy(x->fc.switchable_interp_prob, vp9_switchable_interp_prob,
              sizeof(vp9_switchable_interp_prob));
 
@@ -280,9 +303,10 @@
   printf("};\n");
 #endif
 
-  update_mode_probs(VP9_INTRA_MODES, vp9_intra_mode_tree,
-                    fc->y_mode_counts, fc->pre_y_mode_prob,
-                    fc->y_mode_prob, 0);
+  for (i = 0; i < BLOCK_SIZE_GROUPS; i++)
+    update_mode_probs(VP9_INTRA_MODES, vp9_intra_mode_tree,
+                      fc->y_mode_counts[i], fc->pre_y_mode_prob[i],
+                      fc->y_mode_prob[i], 0);
 
   for (i = 0; i < VP9_INTRA_MODES; ++i)
     update_mode_probs(VP9_INTRA_MODES, vp9_intra_mode_tree,
@@ -292,7 +316,7 @@
   for (i = 0; i < NUM_PARTITION_CONTEXTS; i++)
     update_mode_probs(PARTITION_TYPES, vp9_partition_tree,
                       fc->partition_counts[i], fc->pre_partition_prob[i],
-                      fc->partition_prob[i], 0);
+                      fc->partition_prob[INTER_FRAME][i], 0);
 
   if (cm->mcomp_filter_type == SWITCHABLE) {
     for (i = 0; i <= VP9_SWITCHABLE_FILTERS; i++) {
--- a/vp9/common/vp9_entropymode.h
+++ b/vp9/common/vp9_entropymode.h
@@ -21,7 +21,7 @@
 
 extern const vp9_prob vp9_kf_default_bmode_probs[VP9_INTRA_MODES]
                                                 [VP9_INTRA_MODES]
-                                                [VP9_INTRA_MODES -1 ];
+                                                [VP9_INTRA_MODES - 1];
 
 extern const vp9_tree_index vp9_intra_mode_tree[];
 extern const vp9_tree_index  vp9_sb_mv_ref_tree[];
@@ -35,6 +35,9 @@
 // probability models for partition information
 extern const vp9_tree_index  vp9_partition_tree[];
 extern struct vp9_token vp9_partition_encodings[PARTITION_TYPES];
+extern const vp9_prob vp9_partition_probs[NUM_FRAME_TYPES]
+                                         [NUM_PARTITION_CONTEXTS]
+                                         [PARTITION_TYPES - 1];
 
 void vp9_entropy_mode_init(void);
 
--- a/vp9/common/vp9_modecontext.c
+++ b/vp9/common/vp9_modecontext.c
@@ -13,116 +13,116 @@
 
 const vp9_prob vp9_kf_default_bmode_probs[VP9_INTRA_MODES]
                                          [VP9_INTRA_MODES]
-                                         [VP9_INTRA_MODES-1] = {
-  {  // Above 0
-    { 231,    9,  124,  138,   96,  200,   76,   42,   88, },  // left 0
-    { 152,   11,  187,  112,  170,  139,  130,   91,  113, },  // left 1
-    { 175,   10,   71,  182,  212,  191,   43,   39,   82, },  // left 2
-    {  56,   23,   63,   38,   76,   60,  185,  206,  159, },  // left 3
-    { 144,   52,   89,  192,   19,  236,  134,   93,   37, },  // left 4
-    { 114,   22,   29,  133,   37,   18,   60,  156,  233, },  // left 5
-    { 121,   16,   26,  124,  176,   50,   29,   20,  234, },  // left 6
-    { 170,   19,   50,   91,  169,  216,   14,   16,    5, },  // left 7
-    {  63,   14,   21,   68,   32,   29,   71,  224,  181, },  // left 8
-    {  81,   93,   62,   65,   78,  171,  152,  103,  172, },  // left 9
-  }, {  // Above 1
-    { 134,    2,  185,  147,  159,  152,   83,   33,  136, },  // left 0
-    {  72,    9,  194,  141,  208,  108,  124,   73,  119, },  // left 1
-    {  66,    1,  102,  183,  236,  151,   35,    8,   78, },  // left 2
-    {  41,   30,   60,   26,  101,  148,  212,  206,  177, },  // left 3
-    { 104,   91,  122,  184,   33,  243,  156,   73,    1, },  // left 4
-    {  74,   23,   47,  119,   63,   60,   79,  135,  211, },  // left 5
-    {  65,   12,   40,  134,  211,   79,   42,   37,  187, },  // left 6
-    {  87,   26,   76,   97,  218,  183,   27,    7,   31, },  // left 7
-    {  47,   24,   45,   53,   78,   89,  105,  215,  128, },  // left 8
-    {  66,   89,   68,   91,  120,  113,  190,  105,   98, },  // left 9
-  }, {  // Above 2
-    {  88,    1,   88,  166,  229,  115,   30,   23,  155, },  // left 0
-    {  43,    5,   98,  198,  244,  158,   50,   14,  113, },  // left 1
-    {  39,    1,   53,  208,  247,  208,   10,   11,   92, },  // left 2
-    {  56,   42,   41,  102,  156,  110,   76,   61,  106, },  // left 3
-    { 107,   79,   78,  158,   85,  255,   20,   64,  114, },  // left 4
-    {  39,   15,   30,  174,  135,   66,   85,   28,  176, },  // left 5
-    {  34,    5,   22,  137,  222,   64,   22,    5,  220, },  // left 6
-    {  68,    7,   25,  135,  206,  192,    7,   14,    8, },  // left 7
-    {  34,   45,   24,   78,   85,   55,   85,  120,   60, },  // left 8
-    {  62,   54,   23,  142,  182,  177,   64,   57,  171, },  // left 9
-  }, {  // Above 3
-    { 193,   15,  108,   82,  121,  192,  188,  119,  145, },  // left 0
-    {  60,   15,  157,   65,  142,   61,  202,  203,   85, },  // left 1
-    { 112,   17,  121,  128,  175,  128,   94,   85,    1, },  // left 2
-    {  40,   25,   47,   12,   20,   64,  221,  194,   57, },  // left 3
-    { 100,   74,  112,   85,   43,  255,   64,  142,  128, },  // left 4
-    {  88,   24,   47,   91,   93,   73,  141,  171,   85, },  // left 5
-    {  61,    9,   65,   75,  107,  146,   53,  100,  255, },  // left 6
-    { 142,    8,   80,  105,  199,  255,   20,   43,    1, },  // left 7
-    {  41,   17,   43,   22,   64,   43,   98,  246,  255, },  // left 8
-    {  51,   37,   59,   56,   94,   64,  200,  154,  128, },  // left 9
-  }, {  // Above 4
-    { 125,   10,  103,  129,   89,  209,   65,   22,   91, },  // left 0
-    {  95,   25,   93,  146,  108,  208,   96,   34,  108, },  // left 1
-    {  75,   17,   84,  185,  188,  199,   20,    1,   43, },  // left 2
-    {  57,   91,   27,   83,   23,  205,   67,   75,  149, },  // left 3
-    { 115,   70,   29,  237,    3,  247,   73,   51,    1, },  // left 4
-    {  38,   67,   45,   73,   64,   85,   51,   96,  255, },  // left 5
-    {  41,   25,   11,  142,  133,  128,   77,   73,  205, },  // left 6
-    { 101,   26,   32,  124,   38,  247,    7,    7,    8, },  // left 7
-    {  57,   91,   28,  128,   32,   73,  128,  128,  128, },  // left 8
-    { 117,  127,   39,  164,   51,  230,  128,  183,  255, },  // left 9
-  }, {  // Above 5
-    { 138,    5,   32,  135,   70,   29,   33,  115,  208, },  // left 0
-    {  67,    9,   91,  111,  142,   38,   78,   87,  199, },  // left 1
-    {  63,    7,   60,  172,  138,   60,   85,   64,  199, },  // left 2
-    {  40,   25,   44,   87,   71,   79,  102,  183,   85, },  // left 3
-    {  57,  110,   80,  140,   85,  255,   51,  128,  128, },  // left 4
-    {  47,   12,   16,  167,   26,   23,   69,  135,  171, },  // left 5
-    {  46,   14,   18,  102,   89,   15,    7,   67,  238, },  // left 6
-    {  65,    8,   33,  123,  158,   51,   18,   79,  114, },  // left 7
-    {  40,   16,    3,   91,   28,   32,   37,  207,  224, },  // left 8
-    {  87,   66,   49,   98,   32,  146,   59,   51,  224, },  // left 9
-  }, {  // Above 6
-    { 104,    1,   55,   88,  130,   39,    9,   17,  234, },  // left 0
-    {  64,   15,   96,  103,  192,   37,   43,   15,  248, },  // left 1
-    {  54,    2,   57,  135,  213,   70,    4,   22,  203, },  // left 2
-    {  30,   38,   40,   64,  128,   43,  114,  141,  171, },  // left 3
-    {  75,   43,   38,  181,   21,  233,  154,  128,    1, },  // left 4
-    {  39,    1,   19,  126,  107,   12,   35,   40,  237, },  // left 5
-    {  31,    6,    9,   77,  221,    1,    2,    4,  244, },  // left 6
-    {  88,   20,   33,   90,  110,  192,   39,   23,   51, },  // left 7
-    {  56,   21,   23,  119,   55,   70,   48,  177,  128, },  // left 8
-    {  55,   44,   46,  120,  188,    1,   60,   98,  192, },  // left 9
-  }, {  // Above 7
-    { 102,    1,   61,   95,  192,  205,    6,    9,   31, },  // left 0
-    {  69,   12,   63,  104,  187,  166,   14,    5,   20, },  // left 1
-    {  68,    1,   45,  136,  242,  154,    1,    7,   30, },  // left 2
-    {  62,   69,   24,   92,   73,  205,   82,   90,   93, },  // left 3
-    {  75,   31,   17,  215,   12,  246,   16,   17,    1, },  // left 4
-    {  37,   18,   46,  128,   80,   93,  112,    1,  114, },  // left 5
-    {  63,    9,   10,  125,  195,   85,   20,   11,  134, },  // left 6
-    {  86,    6,    6,   54,  136,  224,    1,    1,    1, },  // left 7
-    {  56,   24,    9,  110,   43,   77,  128,   96,    1, },  // left 8
-    {  58,   60,   20,   59,  116,  171,   69,   28,   75, },  // left 9
-  }, {  // Above 8
-    { 164,   10,   52,   70,  121,   74,  105,  168,  164, },  // left 0
-    {  51,   20,  112,   95,  138,   85,  101,  166,  238, },  // left 1
-    {  86,    9,   42,  122,  140,   77,  117,   39,   23, },  // left 2
-    {  22,   18,   28,   30,  156,  146,  141,  247,  255, },  // left 3
-    {  83,   98,   20,  128,   43,  205,  128,   85,    1, },  // left 4
-    {  45,   32,   18,   92,   67,   18,   38,  238,  255, },  // left 5
-    {  56,    7,   22,  104,   98,   32,   54,   85,  154, },  // left 6
-    {  85,   13,   27,  120,  192,  128,   57,   73,   51, },  // left 7
-    {  18,    7,   12,   29,   67,   37,   40,  240,  192, },  // left 8
-    {  35,   40,   32,   55,   57,   37,  147,  165,  154, },  // left 9
-  }, {  // Above 9
-    { 190,   31,   91,  133,   82,  229,  152,   59,  141, },  // left 0
-    {  85,   47,  155,  116,  163,  213,  141,   85,  171, },  // left 1
-    { 101,    8,   78,  184,  186,  142,  118,   37,  128, },  // left 2
-    {  56,   40,   49,   37,  128,  183,  219,  149,  205, },  // left 3
-    { 146,   92,   56,  184,   45,  229,  114,  102,    1, },  // left 4
-    {  71,   45,   37,  107,   51,   32,  110,  224,    1, },  // left 5
-    { 101,   26,   43,  111,  158,  102,   45,   91,  228, },  // left 6
-    { 138,   17,   48,  117,  144,  255,   81,   20,   21, },  // left 7
-    {  32,   33,   47,   64,   93,   73,  101,  179,  171, },  // left 8
-    { 112,  125,   38,  113,   56,  213,  168,  154,  192, },  // left 9
-  },
+                                         [VP9_INTRA_MODES - 1] = {
+  { /* above = dc */
+    { 165,  25,  57, 147, 137, 207,  70,  49,  89 } /* left = dc */,
+    { 107,  33, 127, 132, 131, 173,  86,  88, 105 } /* left = v */,
+    {  87,  25,  24, 193, 225, 213,  44,  33,  94 } /* left = h */,
+    {  82,  32,  42,  91, 116, 154, 134, 119, 110 } /* left = d45 */,
+    {  87,  41,  47, 164,  49, 219,  85,  72,  84 } /* left = d135 */,
+    {  83,  29,  29, 134,  55,  84,  58, 132, 185 } /* left = d117 */,
+    {  78,  22,  24, 134, 145, 161,  37,  32, 199 } /* left = d153 */,
+    { 103,  25,  33, 121, 156, 215,  34,  32,  29 } /* left = d27 */,
+    {  73,  28,  26,  91,  75, 116,  67, 169, 128 } /* left = d63 */,
+    {  62,  79,  46, 119, 142, 197,  97,  73, 133 } /* left = tm */
+  }, { /* above = v */
+    {  77,  19, 144, 147, 131, 159,  67,  75, 108 } /* left = dc */,
+    {  48,  30, 180, 135, 139, 124,  84, 125, 102 } /* left = v */,
+    {  47,  14,  76, 169, 216, 171,  48,  35,  77 } /* left = h */,
+    {  53,  39,  82,  93,  98, 165, 128, 156, 115 } /* left = d45 */,
+    {  59,  52,  88, 155,  54, 208,  95, 109,  23 } /* left = d135 */,
+    {  45,  30,  76, 136,  51,  95,  62, 154, 157 } /* left = d117 */,
+    {  45,  22,  60, 127, 136, 156,  45,  67, 157 } /* left = d153 */,
+    {  59,  30,  78, 107, 157, 181,  49,  39,  50 } /* left = d27 */,
+    {  45,  33,  70,  85,  76, 127,  76, 185,  89 } /* left = d63 */,
+    {  41,  69, 104, 113, 125, 154, 110, 123,  88 } /* left = tm */
+  }, { /* above = h */
+    {  85,  12,  38, 172, 219, 185,  40,  29, 118 } /* left = dc */,
+    {  52,  25,  78, 175, 211, 189,  56,  37, 108 } /* left = v */,
+    {  38,  11,  17, 207, 245, 224,  18,  13,  84 } /* left = h */,
+    {  63,  42,  25, 121, 162, 179,  63,  53,  90 } /* left = d45 */,
+    {  69,  59,  35, 146, 108, 245,  33,  56, 115 } /* left = d135 */,
+    {  45,  27,  30, 160, 118, 128,  75,  49, 147 } /* left = d117 */,
+    {  40,  17,  19, 147, 198, 169,  30,  14, 181 } /* left = d153 */,
+    {  56,  19,  15, 150, 207, 212,  17,  22,  28 } /* left = d27 */,
+    {  45,  50,  21,  97, 113, 135,  68,  89,  72 } /* left = d63 */,
+    {  41,  70,  19, 165, 199, 203,  54,  52, 121 } /* left = tm */
+  }, { /* above = d45 */
+    { 124,  25,  52, 122, 127, 200, 116,  88, 105 } /* left = dc */,
+    {  60,  31, 107, 103, 119, 136, 135, 150,  90 } /* left = v */,
+    {  70,  28,  37, 157, 203, 192,  73,  67,  21 } /* left = h */,
+    {  62,  33,  39,  54,  67, 159, 150, 114,  61 } /* left = d45 */,
+    {  69,  41,  46, 102,  64, 240,  68, 103, 111 } /* left = d135 */,
+    {  59,  27,  39, 121,  68, 132, 101, 139,  96 } /* left = d117 */,
+    {  55,  19,  33, 119, 109, 198,  61,  88, 224 } /* left = d153 */,
+    {  92,  16,  40, 107, 160, 242,  48,  62,  15 } /* left = d27 */,
+    {  57,  27,  36,  65,  95, 130,  94, 213, 222 } /* left = d63 */,
+    {  47,  47,  47, 101, 130, 154, 130, 105, 102 } /* left = tm */
+  }, { /* above = d135 */
+    {  80,  19,  42, 132,  81, 205,  51,  36,  99 } /* left = dc */,
+    {  60,  34,  67, 145,  76, 196,  72,  61, 112 } /* left = v */,
+    {  46,  25,  29, 172, 181, 208,  37,  11,  79 } /* left = h */,
+    {  59,  45,  20, 103,  42, 203,  57,  68, 107 } /* left = d45 */,
+    {  68,  41,  25, 190,  21, 226,  68,  65,  38 } /* left = d135 */,
+    {  42,  38,  34, 133,  48, 145,  57, 106, 237 } /* left = d117 */,
+    {  35,  20,  11, 139,  94, 197,  49,  50, 182 } /* left = d153 */,
+    {  64,  26,  24, 122,  73, 230,  27,  27,  39 } /* left = d27 */,
+    {  53,  49,  25, 118,  52, 147,  84, 104, 103 } /* left = d63 */,
+    {  62,  70,  35, 156,  90, 214,  95, 140, 211 } /* left = tm */
+  }, { /* above = d117 */
+    {  78,  14,  37, 152,  67, 100,  44, 103, 160 } /* left = dc */,
+    {  50,  20,  86, 139,  72,  98,  62, 111, 157 } /* left = v */,
+    {  42,  17,  33, 169, 153, 139,  62,  61, 136 } /* left = h */,
+    {  48,  21,  39, 123,  65, 143,  76, 131,  87 } /* left = d45 */,
+    {  47,  41,  44, 149,  49, 221,  51, 107, 122 } /* left = d135 */,
+    {  37,  18,  26, 177,  20,  66,  58, 131, 148 } /* left = d117 */,
+    {  39,  19,  26, 125,  77, 115,  22,  75, 192 } /* left = d153 */,
+    {  48,  13,  33, 125, 113, 132,  30,  77,  99 } /* left = d27 */,
+    {  45,  27,  15, 119,  42,  96,  45, 168, 164 } /* left = d63 */,
+    {  48,  52,  52, 129,  60, 158,  58,  89, 153 } /* left = tm */
+  }, { /* above = d153 */
+    {  82,   9,  31, 121, 146, 145,  23,  28, 194 } /* left = dc */,
+    {  57,  32,  78, 121, 148, 128,  50,  37, 217 } /* left = v */,
+    {  38,  12,  19, 158, 221, 172,  12,  22, 166 } /* left = h */,
+    {  49,  32,  24, 100, 125, 142,  72,  83, 132 } /* left = d45 */,
+    {  54,  36,  22, 172,  49, 225,  88,  72,  59 } /* left = d135 */,
+    {  43,   7,  23, 130,  95,  86,  44,  57, 206 } /* left = d117 */,
+    {  34,  13,  12,  90, 196,  91,   8,  10, 226 } /* left = d153 */,
+    {  55,  23,  17, 106, 127, 207,  32,  23,  92 } /* left = d27 */,
+    {  54,  28,  20, 121,  76, 151,  45, 110, 124 } /* left = d63 */,
+    {  41,  51,  31, 120, 192,  74,  45,  62, 163 } /* left = tm */
+  }, { /* above = d27 */
+    {  88,  10,  40, 120, 157, 211,  25,  27,  54 } /* left = dc */,
+    {  64,  31,  69, 121, 129, 184,  36,  29,  45 } /* left = v */,
+    {  51,  11,  22, 170, 232, 209,  11,  20,  64 } /* left = h */,
+    {  65,  43,  19, 102,  91, 208,  68,  78,  75 } /* left = d45 */,
+    {  64,  40,  23, 171,  47, 229,  45,  48,  19 } /* left = d135 */,
+    {  43,  27,  39, 136,  76, 149,  92,  13, 114 } /* left = d117 */,
+    {  53,  19,  14, 128, 148, 173,  31,  25, 133 } /* left = d153 */,
+    {  73,  19,  13,  97, 137, 218,  12,  12,  10 } /* left = d27 */,
+    {  57,  35,  15, 111,  68, 149,  90, 102,  16 } /* left = d63 */,
+    {  43,  63,  23, 107, 144, 200,  64,  47,  88 } /* left = tm */
+  }, { /* above = d63 */
+    {  95,  19,  44,  97, 120, 145,  81, 142, 115 } /* left = dc */,
+    {  46,  29,  93,  95, 106, 133,  83, 189, 177 } /* left = v */,
+    {  54,  19,  29, 136, 181, 157,  80,  67,  47 } /* left = h */,
+    {  44,  26,  34,  83, 125, 180, 116, 218, 206 } /* left = d45 */,
+    {  56,  41,  25, 118,  55, 192,  93, 121,  22 } /* left = d135 */,
+    {  44,  31,  30, 110,  67,  80,  56, 217, 225 } /* left = d117 */,
+    {  44,  14,  25, 101, 105, 136,  57,  83, 133 } /* left = d153 */,
+    {  62,  16,  28, 105, 157, 164,  67,  92,  58 } /* left = d27 */,
+    {  36,  18,  25,  57,  88, 113,  59, 210, 127 } /* left = d63 */,
+    {  36,  41,  44,  79, 104, 129, 100, 151, 105 } /* left = tm */
+  }, { /* above = tm */
+    {  90,  61,  68, 152, 141, 209,  79,  59,  93 } /* left = dc */,
+    {  49,  71, 127, 132, 129, 187,  89, 105, 113 } /* left = v */,
+    {  48,  29,  26, 190, 225, 190,  55,  32,  75 } /* left = h */,
+    {  58,  51,  46, 110, 134, 192, 124, 100, 113 } /* left = d45 */,
+    {  69,  60,  38, 156,  82, 214,  79,  89,  24 } /* left = d135 */,
+    {  48,  54,  50, 139,  71, 106,  77, 162,  18 } /* left = d117 */,
+    {  52,  34,  33, 137, 149, 184,  45,  67, 169 } /* left = d153 */,
+    {  67,  29,  32, 123, 176, 244,  47,  27,  31 } /* left = d27 */,
+    {  38,  43,  46,  93, 106, 140,  78, 143, 111 } /* left = d63 */,
+    {  55,  98,  50, 135, 140, 208,  95, 103,  95 } /* left = tm */
+  }
 };
--- a/vp9/common/vp9_onyxc_int.h
+++ b/vp9/common/vp9_onyxc_int.h
@@ -45,18 +45,19 @@
 #define MAX_LAG_BUFFERS 25
 
 typedef struct frame_contexts {
-  vp9_prob y_mode_prob[VP9_INTRA_MODES - 1]; /* interframe intra mode probs */
+  vp9_prob y_mode_prob[BLOCK_SIZE_GROUPS][VP9_INTRA_MODES - 1];
   vp9_prob uv_mode_prob[VP9_INTRA_MODES][VP9_INTRA_MODES - 1];
-  vp9_prob partition_prob[NUM_PARTITION_CONTEXTS][PARTITION_TYPES - 1];
+  vp9_prob partition_prob[NUM_FRAME_TYPES][NUM_PARTITION_CONTEXTS]
+                         [PARTITION_TYPES - 1];
 
   nmv_context nmvc;
   nmv_context pre_nmvc;
   /* interframe intra mode probs */
-  vp9_prob pre_y_mode_prob[VP9_INTRA_MODES - 1];
+  vp9_prob pre_y_mode_prob[BLOCK_SIZE_GROUPS][VP9_INTRA_MODES - 1];
   vp9_prob pre_uv_mode_prob[VP9_INTRA_MODES][VP9_INTRA_MODES - 1];
   vp9_prob pre_partition_prob[NUM_PARTITION_CONTEXTS][PARTITION_TYPES - 1];
   /* interframe intra mode probs */
-  unsigned int y_mode_counts[VP9_INTRA_MODES];
+  unsigned int y_mode_counts[BLOCK_SIZE_GROUPS][VP9_INTRA_MODES];
   unsigned int uv_mode_counts[VP9_INTRA_MODES][VP9_INTRA_MODES];
   unsigned int partition_counts[NUM_PARTITION_CONTEXTS][PARTITION_TYPES];
 
--- a/vp9/decoder/vp9_decodemv.c
+++ b/vp9/decoder/vp9_decodemv.c
@@ -404,17 +404,20 @@
         cm->prob_comppred[i] = vp9_read_prob(r);
 
     // VP9_INTRA_MODES
-    for (i = 0; i < VP9_INTRA_MODES - 1; ++i) {
-      if (vp9_read(r, VP9_DEF_UPDATE_PROB)) {
-        cm->fc.y_mode_prob[i] =
-            vp9_read_prob_diff_update(r, cm->fc.y_mode_prob[i]);
+    for (j = 0; j < BLOCK_SIZE_GROUPS; j++) {
+      for (i = 0; i < VP9_INTRA_MODES - 1; ++i) {
+        if (vp9_read(r, VP9_DEF_UPDATE_PROB)) {
+          cm->fc.y_mode_prob[j][i] =
+              vp9_read_prob_diff_update(r, cm->fc.y_mode_prob[j][i]);
+        }
       }
     }
     for (j = 0; j < NUM_PARTITION_CONTEXTS; ++j) {
       for (i = 0; i < PARTITION_TYPES - 1; ++i) {
         if (vp9_read(r, VP9_DEF_UPDATE_PROB)) {
-          cm->fc.partition_prob[j][i] =
-              vp9_read_prob_diff_update(r, cm->fc.partition_prob[j][i]);
+          cm->fc.partition_prob[INTER_FRAME][j][i] =
+              vp9_read_prob_diff_update(r,
+                  cm->fc.partition_prob[INTER_FRAME][j][i]);
         }
       }
     }
@@ -785,16 +788,19 @@
     mv0->as_int = 0;
 
     if (bsize >= BLOCK_SIZE_SB8X8) {
-      mbmi->mode = read_intra_mode(r, cm->fc.y_mode_prob);
-      cm->fc.y_mode_counts[mbmi->mode]++;
+      const BLOCK_SIZE_TYPE bsize = xd->mode_info_context->mbmi.sb_type;
+      const int bwl = b_width_log2(bsize), bhl = b_height_log2(bsize);
+      const int bsl = MIN(bwl, bhl);
+      mbmi->mode = read_intra_mode(r, cm->fc.y_mode_prob[MIN(3, bsl)]);
+      cm->fc.y_mode_counts[MIN(3, bsl)][mbmi->mode]++;
     } else {
       int idx, idy;
       for (idy = 0; idy < 2; idy += bh) {
         for (idx = 0; idx < 2; idx += bw) {
           int ib = idy * 2 + idx, k;
-          int m = read_intra_mode(r, cm->fc.y_mode_prob);
+          int m = read_intra_mode(r, cm->fc.y_mode_prob[0]);
           mi->bmi[ib].as_mode.first = m;
-          cm->fc.y_mode_counts[m]++;
+          cm->fc.y_mode_counts[0][m]++;
           for (k = 1; k < bh; ++k)
             mi->bmi[ib + k * 2].as_mode.first = m;
           for (k = 1; k < bw; ++k)
--- a/vp9/decoder/vp9_decodframe.c
+++ b/vp9/decoder/vp9_decodframe.c
@@ -474,7 +474,7 @@
     xd->above_seg_context = pc->above_seg_context + mi_col;
     pl = partition_plane_context(xd, bsize);
     partition = treed_read(r, vp9_partition_tree,
-                           pc->fc.partition_prob[pl]);
+                           pc->fc.partition_prob[pc->frame_type][pl]);
     pc->fc.partition_counts[pl][partition]++;
   }
 
@@ -757,7 +757,7 @@
   vp9_copy(fc->pre_coef_probs, fc->coef_probs);
   vp9_copy(fc->pre_y_mode_prob, fc->y_mode_prob);
   vp9_copy(fc->pre_uv_mode_prob, fc->uv_mode_prob);
-  vp9_copy(fc->pre_partition_prob, fc->partition_prob);
+  vp9_copy(fc->pre_partition_prob, fc->partition_prob[1]);
   fc->pre_nmvc = fc->nmvc;
   vp9_copy(fc->pre_switchable_interp_prob, fc->switchable_interp_prob);
   vp9_copy(fc->pre_inter_mode_probs, fc->inter_mode_probs);
--- a/vp9/encoder/vp9_bitstream.c
+++ b/vp9/encoder/vp9_bitstream.c
@@ -325,13 +325,15 @@
 static void update_mbintra_mode_probs(VP9_COMP* const cpi,
                                       vp9_writer* const bc) {
   VP9_COMMON *const cm = &cpi->common;
-
+  int j;
   vp9_prob pnew[VP9_INTRA_MODES - 1];
   unsigned int bct[VP9_INTRA_MODES - 1][2];
 
-  update_mode(bc, VP9_INTRA_MODES, vp9_intra_mode_encodings,
-              vp9_intra_mode_tree, pnew,
-              cm->fc.y_mode_prob, bct, (unsigned int *)cpi->y_mode_count);
+  for (j = 0; j < BLOCK_SIZE_GROUPS; j++)
+    update_mode(bc, VP9_INTRA_MODES, vp9_intra_mode_encodings,
+                vp9_intra_mode_tree, pnew,
+                cm->fc.y_mode_prob[j], bct,
+                (unsigned int *)cpi->y_mode_count[j]);
 }
 
 void vp9_update_skip_probs(VP9_COMP *cpi) {
@@ -676,15 +678,19 @@
 #endif
 
     if (m->mbmi.sb_type >= BLOCK_SIZE_SB8X8) {
-      write_intra_mode(bc, mode, pc->fc.y_mode_prob);
+      const BLOCK_SIZE_TYPE bsize = xd->mode_info_context->mbmi.sb_type;
+      const int bwl = b_width_log2(bsize), bhl = b_height_log2(bsize);
+      const int bsl = MIN(bwl, bhl);
+      write_intra_mode(bc, mode, pc->fc.y_mode_prob[MIN(3, bsl)]);
     } else {
       int idx, idy;
       int bw = 1 << b_width_log2(mi->sb_type);
       int bh = 1 << b_height_log2(mi->sb_type);
       for (idy = 0; idy < 2; idy += bh)
-        for (idx = 0; idx < 2; idx += bw)
-          write_intra_mode(bc, m->bmi[idy * 2 + idx].as_mode.first,
-                           pc->fc.y_mode_prob);
+        for (idx = 0; idx < 2; idx += bw) {
+          MB_PREDICTION_MODE bm = m->bmi[idy * 2 + idx].as_mode.first;
+          write_intra_mode(bc, bm, pc->fc.y_mode_prob[0]);
+        }
     }
     write_intra_mode(bc, mi->uv_mode,
                      pc->fc.uv_mode_prob[mode]);
@@ -900,7 +906,8 @@
     xd->above_seg_context = cm->above_seg_context + mi_col;
     pl = partition_plane_context(xd, bsize);
     // encode the partition information
-    write_token(bc, vp9_partition_tree, cm->fc.partition_prob[pl],
+    write_token(bc, vp9_partition_tree,
+                cm->fc.partition_prob[cm->frame_type][pl],
                 vp9_partition_encodings + partition);
   }
 
@@ -1557,7 +1564,8 @@
   vp9_copy(pc->fc.pre_coef_probs, pc->fc.coef_probs);
   vp9_copy(pc->fc.pre_y_mode_prob, pc->fc.y_mode_prob);
   vp9_copy(pc->fc.pre_uv_mode_prob, pc->fc.uv_mode_prob);
-  vp9_copy(pc->fc.pre_partition_prob, pc->fc.partition_prob);
+  vp9_copy(cpi->common.fc.pre_partition_prob,
+           cpi->common.fc.partition_prob[INTER_FRAME]);
   pc->fc.pre_nmvc = pc->fc.nmvc;
   vp9_copy(pc->fc.pre_switchable_interp_prob, pc->fc.switchable_interp_prob);
   vp9_copy(pc->fc.pre_inter_mode_probs, pc->fc.inter_mode_probs);
@@ -1614,7 +1622,8 @@
       vp9_prob Pnew[PARTITION_TYPES - 1];
       unsigned int bct[PARTITION_TYPES - 1][2];
       update_mode(&header_bc, PARTITION_TYPES, vp9_partition_encodings,
-                  vp9_partition_tree, Pnew, pc->fc.partition_prob[i], bct,
+                  vp9_partition_tree, Pnew,
+                  pc->fc.partition_prob[pc->frame_type][i], bct,
                   (unsigned int *)cpi->partition_count[i]);
     }
 
--- a/vp9/encoder/vp9_encodeframe.c
+++ b/vp9/encoder/vp9_encodeframe.c
@@ -1928,7 +1928,10 @@
 
   ++cpi->y_uv_mode_count[m][uvm];
   if (xd->mode_info_context->mbmi.sb_type >= BLOCK_SIZE_SB8X8) {
-    ++cpi->y_mode_count[m];
+    const BLOCK_SIZE_TYPE bsize = xd->mode_info_context->mbmi.sb_type;
+    const int bwl = b_width_log2(bsize), bhl = b_height_log2(bsize);
+    const int bsl = MIN(bwl, bhl);
+    ++cpi->y_mode_count[MIN(bsl, 3)][m];
   } else {
     int idx, idy;
     int bw = 1 << b_width_log2(xd->mode_info_context->mbmi.sb_type);
@@ -1936,7 +1939,7 @@
     for (idy = 0; idy < 2; idy += bh) {
       for (idx = 0; idx < 2; idx += bw) {
         int m = xd->mode_info_context->bmi[idy * 2 + idx].as_mode.first;
-        ++cpi->y_mode_count[m];
+        ++cpi->y_mode_count[0][m];
       }
     }
   }
--- a/vp9/encoder/vp9_modecosts.c
+++ b/vp9/encoder/vp9_modecosts.c
@@ -28,7 +28,7 @@
   }
 
   // TODO(rbultje) separate tables for superblock costing?
-  vp9_cost_tokens(c->mb.mbmode_cost, x->fc.y_mode_prob,
+  vp9_cost_tokens(c->mb.mbmode_cost, x->fc.y_mode_prob[1],
                   vp9_intra_mode_tree);
   vp9_cost_tokens(c->mb.intra_uv_mode_cost[1],
                   x->fc.uv_mode_prob[VP9_INTRA_MODES - 1], vp9_intra_mode_tree);
--- a/vp9/encoder/vp9_onyx_int.h
+++ b/vp9/encoder/vp9_onyx_int.h
@@ -78,9 +78,9 @@
 
   vp9_coeff_probs_model coef_probs[TX_SIZE_MAX_SB][BLOCK_TYPES];
 
-  vp9_prob y_mode_prob[VP9_INTRA_MODES - 1]; /* interframe intra mode probs */
+  vp9_prob y_mode_prob[4][VP9_INTRA_MODES - 1];
   vp9_prob uv_mode_prob[VP9_INTRA_MODES][VP9_INTRA_MODES - 1];
-  vp9_prob partition_prob[NUM_PARTITION_CONTEXTS][PARTITION_TYPES - 1];
+  vp9_prob partition_prob[2][NUM_PARTITION_CONTEXTS][PARTITION_TYPES - 1];
 
   vp9_prob switchable_interp_prob[VP9_SWITCHABLE_FILTERS + 1]
                                  [VP9_SWITCHABLE_FILTERS - 1];
@@ -406,7 +406,7 @@
 
   int cq_target_quality;
 
-  int y_mode_count[VP9_INTRA_MODES];
+  int y_mode_count[4][VP9_INTRA_MODES];
   int y_uv_mode_count[VP9_INTRA_MODES][VP9_INTRA_MODES];
   unsigned int partition_count[NUM_PARTITION_CONTEXTS][PARTITION_TYPES];
 
--- a/vp9/encoder/vp9_rdopt.c
+++ b/vp9/encoder/vp9_rdopt.c
@@ -264,7 +264,7 @@
 
   for (i = 0; i < NUM_PARTITION_CONTEXTS; i++)
     vp9_cost_tokens(cpi->mb.partition_cost[i],
-                    cpi->common.fc.partition_prob[i],
+                    cpi->common.fc.partition_prob[cpi->common.frame_type][i],
                     vp9_partition_tree);
 
   /*rough estimate for costing*/