]> granicus.if.org Git - libvpx/commitdiff
Fix interpolation values and decouple interintra
authorDebargha Mukherjee <debargha@google.com>
Thu, 31 Mar 2016 00:33:15 +0000 (17:33 -0700)
committerDebargha Mukherjee <debargha@google.com>
Thu, 31 Mar 2016 19:12:51 +0000 (12:12 -0700)
Decouples interintra modes and probability models from regular
intra modes, to enable creating/optimizing new interintra modes.
Also, fixes interpolation values for 128x128 interintra and obmc.

Change-Id: I5c2016db49b8f029164e5fe84c6274d4e02ff90e

13 files changed:
vp10/common/blockd.h
vp10/common/entropymode.c
vp10/common/entropymode.h
vp10/common/enums.h
vp10/common/reconinter.c
vp10/common/thread_common.c
vp10/decoder/decodeframe.c
vp10/decoder/decodemv.c
vp10/encoder/bitstream.c
vp10/encoder/encodeframe.c
vp10/encoder/encoder.h
vp10/encoder/rd.c
vp10/encoder/rdopt.c

index 821d67c957849f01fd0e638f7e4d4475ee3743f9..b8e5d49030eb8622d36cd8017b4c3a720a7a2830 100644 (file)
@@ -190,8 +190,8 @@ typedef struct {
 #endif  // CONFIG_EXT_INTRA
 
 #if CONFIG_EXT_INTER
-  PREDICTION_MODE interintra_mode;
-  PREDICTION_MODE interintra_uv_mode;
+  INTERINTRA_MODE interintra_mode;
+  INTERINTRA_MODE interintra_uv_mode;
   // TODO(debargha): Consolidate these flags
   int use_wedge_interintra;
   int interintra_wedge_index;
index 29d541951dd34348923916bd2bb3ebe21263b1f6..27685f0d40402e6661048c50f1d354b16385f2a3 100644 (file)
@@ -310,7 +310,7 @@ const vpx_tree_index vp10_intra_mode_tree[TREE_SIZE(INTRA_MODES)] = {
   -D135_PRED, -D117_PRED,           /* 5 = D135_NODE */
   -D45_PRED, 14,                    /* 6 = D45_NODE */
   -D63_PRED, 16,                    /* 7 = D63_NODE */
-  -D153_PRED, -D207_PRED             /* 8 = D153_NODE */
+  -D153_PRED, -D207_PRED            /* 8 = D153_NODE */
 };
 
 const vpx_tree_index vp10_inter_mode_tree[TREE_SIZE(INTER_MODES)] = {
@@ -325,6 +325,26 @@ const vpx_tree_index vp10_inter_mode_tree[TREE_SIZE(INTER_MODES)] = {
 };
 
 #if CONFIG_EXT_INTER
+const vpx_tree_index vp10_interintra_mode_tree[TREE_SIZE(INTERINTRA_MODES)] = {
+  -II_DC_PRED, 2,                   /* 0 = II_DC_NODE     */
+  -II_TM_PRED, 4,                   /* 1 = II_TM_NODE     */
+  -II_V_PRED, 6,                    /* 2 = II_V_NODE      */
+  8, 12,                            /* 3 = II_COM_NODE    */
+  -II_H_PRED, 10,                   /* 4 = II_H_NODE      */
+  -II_D135_PRED, -II_D117_PRED,     /* 5 = II_D135_NODE   */
+  -II_D45_PRED, 14,                 /* 6 = II_D45_NODE    */
+  -II_D63_PRED, 16,                 /* 7 = II_D63_NODE    */
+  -II_D153_PRED, -II_D207_PRED      /* 8 = II_D153_NODE   */
+};
+
+static const vpx_prob
+    default_interintra_mode_prob[BLOCK_SIZE_GROUPS][INTERINTRA_MODES - 1] = {
+  {  65,  32,  18, 144, 162, 194,  41,  51,  98 },  // block_size < 8x8
+  { 132,  68,  18, 165, 217, 196,  45,  40,  78 },  // block_size < 16x16
+  { 173,  80,  19, 176, 240, 193,  64,  35,  46 },  // block_size < 32x32
+  { 221, 135,  38, 194, 248, 121,  96,  85,  29 }   // block_size >= 32x32
+};
+
 const vpx_tree_index vp10_inter_compound_mode_tree
       [TREE_SIZE(INTER_COMPOUND_MODES)] = {
   -INTER_COMPOUND_OFFSET(ZERO_ZEROMV), 2,
@@ -1211,6 +1231,7 @@ static void init_mode_probs(FRAME_CONTEXT *fc) {
 #if CONFIG_EXT_INTER
   vp10_copy(fc->inter_compound_mode_probs, default_inter_compound_mode_probs);
   vp10_copy(fc->interintra_prob, default_interintra_prob);
+  vp10_copy(fc->interintra_mode_prob, default_interintra_mode_prob);
   vp10_copy(fc->wedge_interintra_prob, default_wedge_interintra_prob);
   vp10_copy(fc->wedge_interinter_prob, default_wedge_interinter_prob);
 #endif  // CONFIG_EXT_INTER
@@ -1322,6 +1343,11 @@ void vp10_adapt_inter_frame_probs(VP10_COMMON *cm) {
       fc->interintra_prob[i] = mode_mv_merge_probs(pre_fc->interintra_prob[i],
                                                    counts->interintra[i]);
   }
+  for (i = 0; i < BLOCK_SIZE_GROUPS; i++) {
+    vpx_tree_merge_probs(
+        vp10_interintra_mode_tree, pre_fc->interintra_mode_prob[i],
+        counts->interintra_mode[i], fc->interintra_mode_prob[i]);
+  }
   for (i = 0; i < BLOCK_SIZES; ++i) {
     if (is_interintra_allowed_bsize(i) && get_wedge_bits(i))
       fc->wedge_interintra_prob[i] = mode_mv_merge_probs(
index 8219dc5e003d1a032526d349ef4aeefd34ccf7d4..f3257bdb43b71cee92729b2b955399fa475ad6f5 100644 (file)
@@ -71,6 +71,7 @@ typedef struct frame_contexts {
   vpx_prob inter_compound_mode_probs[INTER_MODE_CONTEXTS]
                                     [INTER_COMPOUND_MODES - 1];
   vpx_prob interintra_prob[BLOCK_SIZES];
+  vpx_prob interintra_mode_prob[BLOCK_SIZE_GROUPS][INTERINTRA_MODES - 1];
   vpx_prob wedge_interintra_prob[BLOCK_SIZES];
   vpx_prob wedge_interinter_prob[BLOCK_SIZES];
 #endif  // CONFIG_EXT_INTER
@@ -138,6 +139,7 @@ typedef struct FRAME_COUNTS {
 #if CONFIG_EXT_INTER
   unsigned int inter_compound_mode[INTER_MODE_CONTEXTS][INTER_COMPOUND_MODES];
   unsigned int interintra[BLOCK_SIZES][2];
+  unsigned int interintra_mode[BLOCK_SIZE_GROUPS][INTERINTRA_MODES];
   unsigned int wedge_interintra[BLOCK_SIZES][2];
   unsigned int wedge_interinter[BLOCK_SIZES][2];
 #endif  // CONFIG_EXT_INTER
@@ -195,6 +197,8 @@ extern const vpx_prob vp10_default_palette_uv_color_prob
 extern const vpx_tree_index vp10_intra_mode_tree[TREE_SIZE(INTRA_MODES)];
 extern const vpx_tree_index vp10_inter_mode_tree[TREE_SIZE(INTER_MODES)];
 #if CONFIG_EXT_INTER
+extern const vpx_tree_index vp10_interintra_mode_tree
+                            [TREE_SIZE(INTERINTRA_MODES)];
 extern const vpx_tree_index vp10_inter_compound_mode_tree
                             [TREE_SIZE(INTER_COMPOUND_MODES)];
 #endif  // CONFIG_EXT_INTER
index 5615cee936b3e0da8ea23cbbdf134aeecd5c129c..a3c0c1c0c977efb5ed6a309ef0a9dfaf320ce90d 100644 (file)
@@ -252,6 +252,23 @@ typedef uint8_t PREDICTION_MODE;
 
 #define INTRA_MODES (TM_PRED + 1)
 
+#if CONFIG_EXT_INTER
+typedef enum {
+  II_DC_PRED = 0,
+  II_V_PRED,
+  II_H_PRED,
+  II_D45_PRED,
+  II_D135_PRED,
+  II_D117_PRED,
+  II_D153_PRED,
+  II_D207_PRED,
+  II_D63_PRED,
+  II_TM_PRED,
+  INTERINTRA_MODES
+} INTERINTRA_MODE;
+
+#endif  // CONFIG_EXT_INTER
+
 #if CONFIG_EXT_INTRA
 typedef enum {
   FILTER_DC_PRED,
index a2aa34e0a72383fd907fa432df7ddbf77453f35a..547c202a468ad021fadbddcea9feea313dd7ba55 100644 (file)
@@ -1176,24 +1176,18 @@ static const uint8_t obmc_mask_32[2][32] = {
 };
 
 #if CONFIG_EXT_PARTITION
-// TODO(debargha): What are the correct values here?
 static const uint8_t obmc_mask_64[2][64] = {
-    { 33, 33, 35, 35, 36, 36, 38, 38,
-      40, 40, 41, 41, 43, 43, 44, 44,
-      45, 45, 47, 47, 48, 48, 50, 50,
-      51, 51, 52, 52, 53, 53, 55, 55,
-      56, 56, 57, 57, 58, 58, 59, 59,
-      60, 60, 60, 60, 61, 61, 62, 62,
-      62, 62, 63, 63, 63, 63, 64, 64,
-      64, 64, 64, 64, 64, 64, 64, 64 },
-    { 31, 31, 29, 29, 28, 28, 26, 26,
-      24, 24, 23, 23, 21, 21, 20, 20,
-      19, 19, 17, 17, 16, 16, 14, 14,
-      13, 13, 12, 12, 11, 11,  9,  9,
-       8,  8,  7,  7,  6,  6,  5,  5,
-       4,  4,  4,  4,  3,  3,  2,  2,
-       2,  2,  1,  1,  1,  1,  0,  0,
-       0,  0,  0,  0,  0,  0,  0,  0 }
+    {
+      33, 34, 35, 35, 36, 37, 38, 39, 40, 40, 41, 42, 43, 44, 44, 44,
+      45, 46, 47, 47, 48, 49, 50, 51, 51, 51, 52, 52, 53, 54, 55, 56,
+      56, 56, 57, 57, 58, 58, 59, 60, 60, 60, 60, 60, 61, 62, 62, 62,
+      62, 62, 63, 63, 63, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+    }, {
+      31, 30, 29, 29, 28, 27, 26, 25, 24, 24, 23, 22, 21, 20, 20, 20,
+      19, 18, 17, 17, 16, 15, 14, 13, 13, 13, 12, 12, 11, 10,  9,  8,
+      8,  8,  7,  7,  6,  6,  5, 4,  4,  4,  4,  4,  3,  2,  2,  2,
+      2,  2,  1,  1, 1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    }
 };
 #endif  // CONFIG_EXT_PARTITION
 
@@ -1599,7 +1593,45 @@ void vp10_build_prediction_by_left_preds(VP10_COMMON *cm,
 #endif  // CONFIG_OBMC
 
 #if CONFIG_EXT_INTER
-static void combine_interintra(PREDICTION_MODE mode,
+#if CONFIG_EXT_PARTITION
+static const int weights1d[MAX_SB_SIZE] = {
+  128, 127, 125, 124, 123, 122, 120, 119,
+  118, 117, 116, 115, 113, 112, 111, 110,
+  109, 108, 107, 106, 105, 104, 103, 103,
+  102, 101, 100,  99,  98,  97,  97,  96,
+  95,  94,  94,  93,  92,  91,  91,  90,
+  89,  89,  88,  87,  87,  86,  86,  85,
+  84,  84,  83,  83,  82,  82,  81,  81,
+  80,  80,  79,  79,  78,  78,  77,  77,
+  76,  76,  75,  75,  75,  74,  74,  73,
+  73,  73,  72,  72,  72,  71,  71,  70,
+  70,  70,  69,  69,  69,  69,  68,  68,
+  68,  67,  67,  67,  67,  66,  66,  66,
+  66,  65,  65,  65,  65,  64,  64,  64,
+  64,  63,  63,  63,  63,  63,  62,  62,
+  62,  62,  62,  61,  61,  61,  61,  61,
+  61,  60,  60,  60,  60,  60,  60,  60,
+};
+static int size_scales[BLOCK_SIZES] = {
+  32, 16, 16, 16, 8, 8, 8, 4, 4, 4, 2, 2, 2, 1, 1, 1
+};
+#else
+static const int weights1d[MAX_SB_SIZE] = {
+  128, 125, 123, 120, 118, 116, 113, 111,
+  109, 107, 105, 103, 102, 100,  98,  97,
+  95,  94,  92,  91,  89,  88,  87,  86,
+  84,  83,  82,  81,  80,  79,  78,  77,
+  76,  75,  75,  74,  73,  72,  72,  71,
+  70,  69,  69,  68,  68,  67,  67,  66,
+  66,  65,  65,  64,  64,  63,  63,  62,
+  62,  62,  61,  61,  61,  60,  60,  60,
+};
+static int size_scales[BLOCK_SIZES] = {
+  16, 8, 8, 8, 4, 4, 4, 2, 2, 2, 1, 1, 1
+};
+#endif  // CONFIG_EXT_PARTITION
+
+static void combine_interintra(INTERINTRA_MODE mode,
                                int use_wedge_interintra,
                                int wedge_index,
                                BLOCK_SIZE bsize,
@@ -1613,45 +1645,6 @@ static void combine_interintra(PREDICTION_MODE mode,
   static const int scale_bits = 8;
   static const int scale_max = 256;
   static const int scale_round = 127;
-#if CONFIG_EXT_PARTITION
-  // TODO(debargha): Fill in the correct weights for 128 wide blocks.
-  static const int weights1d[MAX_SB_SIZE] = {
-    128, 128, 125, 125, 122, 122, 119, 119,
-    116, 116, 114, 114, 111, 111, 109, 109,
-    107, 107, 105, 105, 103, 103, 101, 101,
-    99,  99,  97,  97,  96,  96,  94,  94,
-    93,  93,  91,  91,  90,  90,  89,  89,
-    88,  88,  86,  86,  85,  85,  84,  84,
-    83,  83,  82,  82,  81,  81,  81,  81,
-    80,  80,  79,  79,  78,  78,  78,  78,
-    77,  77,  76,  76,  76,  76,  75,  75,
-    75,  75,  74,  74,  74,  74,  73,  73,
-    73,  73,  72,  72,  72,  72,  71,  71,
-    71,  71,  71,  71,  70,  70,  70,  70,
-    70,  70,  70,  70,  69,  69,  69,  69,
-    69,  69,  69,  69,  68,  68,  68,  68,
-    68,  68,  68,  68,  68,  68,  67,  67,
-    67,  67,  67,  67,  67,  67,  67,  67,
-  };
-  static int size_scales[BLOCK_SIZES] = {
-    32, 16, 16, 16, 8, 8, 8, 4, 4, 4, 2, 2, 2, 1, 1, 1
-  };
-#else
-  static const int weights1d[MAX_SB_SIZE] = {
-    128, 125, 122, 119, 116, 114, 111, 109,
-    107, 105, 103, 101,  99,  97,  96,  94,
-    93,  91,  90,  89,  88,  86,  85,  84,
-    83,  82,  81,  81,  80,  79,  78,  78,
-    77,  76,  76,  75,  75,  74,  74,  73,
-    73,  72,  72,  71,  71,  71,  70,  70,
-    70,  70,  69,  69,  69,  69,  68,  68,
-    68,  68,  68,  67,  67,  67,  67,  67,
-  };
-  static int size_scales[BLOCK_SIZES] = {
-    16, 8, 8, 8, 4, 4, 4, 2, 2, 2, 1, 1, 1
-  };
-#endif  // CONFIG_EXT_PARTITION
-
   const int bw = 4 * num_4x4_blocks_wide_lookup[plane_bsize];
   const int bh = 4 * num_4x4_blocks_high_lookup[plane_bsize];
   const int size_scale = size_scales[plane_bsize];
@@ -1674,7 +1667,7 @@ static void combine_interintra(PREDICTION_MODE mode,
   }
 
   switch (mode) {
-    case V_PRED:
+    case II_V_PRED:
       for (i = 0; i < bh; ++i) {
         for (j = 0; j < bw; ++j) {
           int scale = weights1d[i * size_scale];
@@ -1686,7 +1679,7 @@ static void combine_interintra(PREDICTION_MODE mode,
       }
       break;
 
-    case H_PRED:
+    case II_H_PRED:
       for (i = 0; i < bh; ++i) {
         for (j = 0; j < bw; ++j) {
           int scale = weights1d[j * size_scale];
@@ -1698,8 +1691,8 @@ static void combine_interintra(PREDICTION_MODE mode,
       }
       break;
 
-    case D63_PRED:
-    case D117_PRED:
+    case II_D63_PRED:
+    case II_D117_PRED:
       for (i = 0; i < bh; ++i) {
         for (j = 0; j < bw; ++j) {
           int scale = (weights1d[i * size_scale] * 3 +
@@ -1712,8 +1705,8 @@ static void combine_interintra(PREDICTION_MODE mode,
       }
       break;
 
-    case D207_PRED:
-    case D153_PRED:
+    case II_D207_PRED:
+    case II_D153_PRED:
       for (i = 0; i < bh; ++i) {
         for (j = 0; j < bw; ++j) {
           int scale = (weights1d[j * size_scale] * 3 +
@@ -1726,7 +1719,7 @@ static void combine_interintra(PREDICTION_MODE mode,
       }
       break;
 
-    case D135_PRED:
+    case II_D135_PRED:
       for (i = 0; i < bh; ++i) {
         for (j = 0; j < bw; ++j) {
           int scale = weights1d[(i < j ? i : j) * size_scale];
@@ -1738,7 +1731,7 @@ static void combine_interintra(PREDICTION_MODE mode,
       }
       break;
 
-    case D45_PRED:
+    case II_D45_PRED:
       for (i = 0; i < bh; ++i) {
         for (j = 0; j < bw; ++j) {
           int scale = (weights1d[i * size_scale] +
@@ -1751,8 +1744,8 @@ static void combine_interintra(PREDICTION_MODE mode,
       }
       break;
 
-    case TM_PRED:
-    case DC_PRED:
+    case II_TM_PRED:
+    case II_DC_PRED:
     default:
       for (i = 0; i < bh; ++i) {
         for (j = 0; j < bw; ++j) {
@@ -1765,7 +1758,7 @@ static void combine_interintra(PREDICTION_MODE mode,
 }
 
 #if CONFIG_VP9_HIGHBITDEPTH
-static void combine_interintra_highbd(PREDICTION_MODE mode,
+static void combine_interintra_highbd(INTERINTRA_MODE mode,
                                       int use_wedge_interintra,
                                       int wedge_index,
                                       BLOCK_SIZE bsize,
@@ -1779,45 +1772,6 @@ static void combine_interintra_highbd(PREDICTION_MODE mode,
   static const int scale_bits = 8;
   static const int scale_max = 256;
   static const int scale_round = 127;
-#if CONFIG_EXT_PARTITION
-  // TODO(debargha): Fill in the correct weights for 128 wide blocks.
-  static const int weights1d[MAX_SB_SIZE] = {
-    128, 128, 125, 125, 122, 122, 119, 119,
-    116, 116, 114, 114, 111, 111, 109, 109,
-    107, 107, 105, 105, 103, 103, 101, 101,
-    99,  99,  97,  97,  96,  96,  94,  94,
-    93,  93,  91,  91,  90,  90,  89,  89,
-    88,  88,  86,  86,  85,  85,  84,  84,
-    83,  83,  82,  82,  81,  81,  81,  81,
-    80,  80,  79,  79,  78,  78,  78,  78,
-    77,  77,  76,  76,  76,  76,  75,  75,
-    75,  75,  74,  74,  74,  74,  73,  73,
-    73,  73,  72,  72,  72,  72,  71,  71,
-    71,  71,  71,  71,  70,  70,  70,  70,
-    70,  70,  70,  70,  69,  69,  69,  69,
-    69,  69,  69,  69,  68,  68,  68,  68,
-    68,  68,  68,  68,  68,  68,  67,  67,
-    67,  67,  67,  67,  67,  67,  67,  67,
-  };
-  static int size_scales[BLOCK_SIZES] = {
-    32, 16, 16, 16, 8, 8, 8, 4, 4, 4, 2, 2, 2, 1, 1, 1
-  };
-#else
-  static const int weights1d[MAX_SB_SIZE] = {
-    128, 125, 122, 119, 116, 114, 111, 109,
-    107, 105, 103, 101,  99,  97,  96,  94,
-    93,  91,  90,  89,  88,  86,  85,  84,
-    83,  82,  81,  81,  80,  79,  78,  78,
-    77,  76,  76,  75,  75,  74,  74,  73,
-    73,  72,  72,  71,  71,  71,  70,  70,
-    70,  70,  69,  69,  69,  69,  68,  68,
-    68,  68,  68,  67,  67,  67,  67,  67,
-  };
-  static int size_scales[BLOCK_SIZES] = {
-    16, 8, 8, 8, 4, 4, 4, 2, 2, 2, 1, 1, 1
-  };
-#endif  // CONFIG_EXT_PARTITION
-
   const int bw = 4 * num_4x4_blocks_wide_lookup[plane_bsize];
   const int bh = 4 * num_4x4_blocks_high_lookup[plane_bsize];
   const int size_scale = size_scales[plane_bsize];
@@ -1843,7 +1797,7 @@ static void combine_interintra_highbd(PREDICTION_MODE mode,
   }
 
   switch (mode) {
-    case V_PRED:
+    case II_V_PRED:
       for (i = 0; i < bh; ++i) {
         for (j = 0; j < bw; ++j) {
           int scale = weights1d[i * size_scale];
@@ -1855,7 +1809,7 @@ static void combine_interintra_highbd(PREDICTION_MODE mode,
       }
       break;
 
-    case H_PRED:
+    case II_H_PRED:
       for (i = 0; i < bh; ++i) {
         for (j = 0; j < bw; ++j) {
           int scale = weights1d[j * size_scale];
@@ -1867,8 +1821,8 @@ static void combine_interintra_highbd(PREDICTION_MODE mode,
       }
       break;
 
-    case D63_PRED:
-    case D117_PRED:
+    case II_D63_PRED:
+    case II_D117_PRED:
       for (i = 0; i < bh; ++i) {
         for (j = 0; j < bw; ++j) {
           int scale = (weights1d[i * size_scale] * 3 +
@@ -1881,8 +1835,8 @@ static void combine_interintra_highbd(PREDICTION_MODE mode,
       }
       break;
 
-    case D207_PRED:
-    case D153_PRED:
+    case II_D207_PRED:
+    case II_D153_PRED:
       for (i = 0; i < bh; ++i) {
         for (j = 0; j < bw; ++j) {
           int scale = (weights1d[j * size_scale] * 3 +
@@ -1895,7 +1849,7 @@ static void combine_interintra_highbd(PREDICTION_MODE mode,
       }
       break;
 
-    case D135_PRED:
+    case II_D135_PRED:
       for (i = 0; i < bh; ++i) {
         for (j = 0; j < bw; ++j) {
           int scale = weights1d[(i < j ? i : j) * size_scale];
@@ -1907,7 +1861,7 @@ static void combine_interintra_highbd(PREDICTION_MODE mode,
       }
       break;
 
-    case D45_PRED:
+    case II_D45_PRED:
       for (i = 0; i < bh; ++i) {
         for (j = 0; j < bw; ++j) {
           int scale = (weights1d[i * size_scale] +
@@ -1920,8 +1874,8 @@ static void combine_interintra_highbd(PREDICTION_MODE mode,
       }
       break;
 
-    case TM_PRED:
-    case DC_PRED:
+    case II_TM_PRED:
+    case II_DC_PRED:
     default:
       for (i = 0; i < bh; ++i) {
         for (j = 0; j < bw; ++j) {
@@ -1999,13 +1953,29 @@ static void build_intra_predictors_for_interintra(
   }
 }
 
+// Mapping of interintra to intra mode for use in the intra component
+static const int interintra_to_intra_mode[INTERINTRA_MODES] = {
+  DC_PRED,
+  V_PRED,
+  H_PRED,
+  D45_PRED,
+  D135_PRED,
+  D117_PRED,
+  D153_PRED,
+  D207_PRED,
+  D63_PRED,
+  TM_PRED
+};
+
 void vp10_build_intra_predictors_for_interintra(
     MACROBLOCKD *xd,
     BLOCK_SIZE bsize, int plane,
     uint8_t *dst, int dst_stride) {
   build_intra_predictors_for_interintra(
       xd, xd->plane[plane].dst.buf, xd->plane[plane].dst.stride,
-      dst, dst_stride, xd->mi[0]->mbmi.interintra_mode, bsize, plane);
+      dst, dst_stride,
+      interintra_to_intra_mode[xd->mi[0]->mbmi.interintra_mode],
+      bsize, plane);
 }
 
 void vp10_combine_interintra(MACROBLOCKD *xd,
index b2339c686b662ffbafc2d09cae39e88963b93ea2..5219b91bdcc891375ac7e8856579463591d7ae71 100644 (file)
@@ -432,6 +432,10 @@ void vp10_accumulate_frame_counts(VP10_COMMON *cm, FRAME_COUNTS *counts,
     for (j = 0; j < 2; j++)
       cm->counts.interintra[i][j] += counts->interintra[i][j];
 
+  for (i = 0; i < BLOCK_SIZE_GROUPS; i++)
+    for (j = 0; j < INTERINTRA_MODES; j++)
+      cm->counts.interintra_mode[i][j] += counts->interintra_mode[i][j];
+
   for (i = 0; i < BLOCK_SIZES; i++)
     for (j = 0; j < 2; j++)
       cm->counts.wedge_interintra[i][j] += counts->wedge_interintra[i][j];
index 2e49b36853e1f450cd4b953aa828da6cc51552a6..f3ddc0b1ed0cf0f8ff4af679bbc19b02a2917f10 100644 (file)
@@ -4039,6 +4039,10 @@ static int read_compressed_header(VP10Decoder *pbi, const uint8_t *data,
           vp10_diff_update_prob(&r, &fc->interintra_prob[i]);
         }
       }
+      for (i = 0; i < BLOCK_SIZE_GROUPS; i++) {
+        for (j = 0; j < INTERINTRA_MODES - 1; j++)
+          vp10_diff_update_prob(&r, &fc->interintra_mode_prob[i][j]);
+      }
       for (i = 0; i < BLOCK_SIZES; i++) {
         if (is_interintra_allowed_bsize(i) && get_wedge_bits(i)) {
           vp10_diff_update_prob(&r, &fc->wedge_interintra_prob[i]);
index 8035e063d2fa0ea1686a2cef3e5c291dd31e7bbf..05fc8bfffaa7d99af6a3565f39a0f3efc9ffa5f7 100644 (file)
@@ -62,6 +62,19 @@ static PREDICTION_MODE read_intra_mode_uv(VP10_COMMON *cm, MACROBLOCKD *xd,
   return uv_mode;
 }
 
+#if CONFIG_EXT_INTER
+static INTERINTRA_MODE read_interintra_mode(VP10_COMMON *cm, MACROBLOCKD *xd,
+                                            vpx_reader *r, int size_group) {
+  const INTERINTRA_MODE ii_mode =
+      (INTERINTRA_MODE)vpx_read_tree(r, vp10_interintra_mode_tree,
+                                     cm->fc->interintra_mode_prob[size_group]);
+  FRAME_COUNTS *counts = xd->counts;
+  if (counts)
+    ++counts->interintra_mode[size_group][ii_mode];
+  return ii_mode;
+}
+#endif  // CONFIG_EXT_INTER
+
 static PREDICTION_MODE read_inter_mode(VP10_COMMON *cm, MACROBLOCKD *xd,
 #if CONFIG_REF_MV && CONFIG_EXT_INTER
                                        MB_MODE_INFO *mbmi,
@@ -1518,8 +1531,8 @@ static void read_inter_block_mode_info(VP10Decoder *const pbi,
       xd->counts->interintra[bsize][interintra]++;
     assert(mbmi->ref_frame[1] == NONE);
     if (interintra) {
-      const PREDICTION_MODE interintra_mode =
-          read_intra_mode_y(cm, xd, r, size_group_lookup[bsize]);
+      const INTERINTRA_MODE interintra_mode =
+          read_interintra_mode(cm, xd, r, size_group_lookup[bsize]);
       mbmi->ref_frame[1] = INTRA_FRAME;
       mbmi->interintra_mode = interintra_mode;
       mbmi->interintra_uv_mode = interintra_mode;
index 721a7a6dab8d950d6946e1b92e59665d6097b10a..800eecb3be8bbabb4641019dd154476c8b661ef9 100644 (file)
@@ -115,6 +115,9 @@ static struct vp10_token ext_tx_encodings[TX_TYPES];
 #if CONFIG_EXT_INTRA
 static struct vp10_token intra_filter_encodings[INTRA_FILTERS];
 #endif  // CONFIG_EXT_INTRA
+#if CONFIG_EXT_INTER
+static struct vp10_token interintra_mode_encodings[INTERINTRA_MODES];
+#endif  // CONFIG_EXT_INTER
 
 void vp10_encode_token_init() {
 #if CONFIG_EXT_TX
@@ -131,6 +134,9 @@ void vp10_encode_token_init() {
 #if CONFIG_EXT_INTRA
   vp10_tokens_from_tree(intra_filter_encodings, vp10_intra_filter_tree);
 #endif  // CONFIG_EXT_INTRA
+#if CONFIG_EXT_INTER
+  vp10_tokens_from_tree(interintra_mode_encodings, vp10_interintra_mode_tree);
+#endif  // CONFIG_EXT_INTER
 }
 
 static void write_intra_mode(vpx_writer *w, PREDICTION_MODE mode,
@@ -138,6 +144,14 @@ static void write_intra_mode(vpx_writer *w, PREDICTION_MODE mode,
   vp10_write_token(w, vp10_intra_mode_tree, probs, &intra_mode_encodings[mode]);
 }
 
+#if CONFIG_EXT_INTER
+static void write_interintra_mode(vpx_writer *w, INTERINTRA_MODE mode,
+                                  const vpx_prob *probs) {
+  vp10_write_token(w, vp10_interintra_mode_tree, probs,
+                   &interintra_mode_encodings[mode]);
+}
+#endif  // CONFIG_EXT_INTER
+
 static void write_inter_mode(VP10_COMMON *cm,
                              vpx_writer *w, PREDICTION_MODE mode,
 #if CONFIG_REF_MV && CONFIG_EXT_INTER
@@ -1282,8 +1296,9 @@ static void pack_inter_mode_mvs(VP10_COMP *cpi, const MODE_INFO *mi,
       const int interintra = mbmi->ref_frame[1] == INTRA_FRAME;
       vpx_write(w, interintra, cm->fc->interintra_prob[bsize]);
       if (interintra) {
-        write_intra_mode(w, mbmi->interintra_mode,
-                         cm->fc->y_mode_prob[size_group_lookup[bsize]]);
+        write_interintra_mode(
+            w, mbmi->interintra_mode,
+            cm->fc->interintra_mode_prob[size_group_lookup[bsize]]);
         assert(mbmi->interintra_mode == mbmi->interintra_uv_mode);
         if (get_wedge_bits(bsize)) {
           vpx_write(w, mbmi->use_wedge_interintra,
@@ -3151,6 +3166,12 @@ static uint32_t write_compressed_header(VP10_COMP *cpi, uint8_t *data) {
                                      cm->counts.interintra[i]);
         }
       }
+      for (i = 0; i < BLOCK_SIZE_GROUPS; i++) {
+        prob_diff_update(vp10_interintra_mode_tree,
+                         cm->fc->interintra_mode_prob[i],
+                         counts->interintra_mode[i],
+                         INTERINTRA_MODES, &header_bc);
+      }
       for (i = 0; i < BLOCK_SIZES; i++) {
         if (is_interintra_allowed_bsize(i) && get_wedge_bits(i))
           vp10_cond_prob_diff_update(&header_bc,
index b73f66cceb320fbbcf4205a18c14e248daeb2623..50ed244b8a2d4f599af1270f117368db139e2355 100644 (file)
@@ -2023,8 +2023,9 @@ static void update_stats(VP10_COMMON *cm, ThreadData *td
 #endif
         is_interintra_allowed(mbmi)) {
       if (mbmi->ref_frame[1] == INTRA_FRAME) {
-        counts->y_mode[size_group_lookup[bsize]][mbmi->interintra_mode]++;
         counts->interintra[bsize][1]++;
+        counts->interintra_mode[size_group_lookup[bsize]]
+                               [mbmi->interintra_mode]++;
         if (get_wedge_bits(bsize))
           counts->wedge_interintra[bsize][mbmi->use_wedge_interintra]++;
       } else {
index 9e1b6fb7a070280410645d26dc17ba2dd7e4997d..ddc20f00cf24711cc65cc4da944a388af2c1ac68 100644 (file)
@@ -507,6 +507,7 @@ typedef struct VP10_COMP {
 #if CONFIG_EXT_INTER
   unsigned int inter_compound_mode_cost[INTER_MODE_CONTEXTS]
                                        [INTER_COMPOUND_MODES];
+  unsigned int interintra_mode_cost[BLOCK_SIZE_GROUPS][INTERINTRA_MODES];
 #endif  // CONFIG_EXT_INTER
 #if CONFIG_OBMC
   int obmc_cost[BLOCK_SIZES][2];
index 203ac42138d8ebea05864cf51a5b59c728cda715..b9b4f064c520a385ec9502d001af6872618e49eb 100644 (file)
@@ -445,12 +445,16 @@ void vp10_initialize_rd_consts(VP10_COMP *cpi) {
       for (i = 0; i < INTER_MODE_CONTEXTS; ++i)
         vp10_cost_tokens((int *)cpi->inter_mode_cost[i],
                          cm->fc->inter_mode_probs[i], vp10_inter_mode_tree);
-#endif
+#endif  // CONFIG_REF_MV
 #if CONFIG_EXT_INTER
       for (i = 0; i < INTER_MODE_CONTEXTS; ++i)
         vp10_cost_tokens((int *)cpi->inter_compound_mode_cost[i],
                          cm->fc->inter_compound_mode_probs[i],
                          vp10_inter_compound_mode_tree);
+      for (i = 0; i < BLOCK_SIZE_GROUPS; ++i)
+        vp10_cost_tokens((int *)cpi->interintra_mode_cost[i],
+                         cm->fc->interintra_mode_prob[i],
+                         vp10_interintra_mode_tree);
 #endif  // CONFIG_EXT_INTER
 #if CONFIG_OBMC
       for (i = BLOCK_8X8; i < BLOCK_SIZES; i++) {
index 9084f5a1821675ca39bd70053b89c0a964812c77..5a2ae2c75719dbc62ea9953bea652b0579f6384f 100644 (file)
@@ -6202,8 +6202,8 @@ static int64_t handle_inter_mode(VP10_COMP *cpi, MACROBLOCK *x,
 #if CONFIG_EXT_INTER
   int mv_idx = (this_mode == NEWFROMNEARMV) ? 1 : 0;
   int_mv single_newmv[MAX_REF_FRAMES];
-  const int * const intra_mode_cost =
-    cpi->mbmode_cost[size_group_lookup[bsize]];
+  const unsigned int *const interintra_mode_cost =
+    cpi->interintra_mode_cost[size_group_lookup[bsize]];
   const int is_comp_interintra_pred = (mbmi->ref_frame[1] == INTRA_FRAME);
 #if CONFIG_REF_MV
   uint8_t ref_frame_type = vp10_ref_frame_type(mbmi->ref_frame);
@@ -6778,7 +6778,7 @@ static int64_t handle_inter_mode(VP10_COMP *cpi, MACROBLOCK *x,
   }
 
   if (is_comp_interintra_pred) {
-    PREDICTION_MODE interintra_mode, best_interintra_mode = DC_PRED;
+    INTERINTRA_MODE best_interintra_mode = II_DC_PRED;
     int64_t best_interintra_rd = INT64_MAX;
     int rmode, rate_sum;
     int64_t dist_sum;
@@ -6810,11 +6810,10 @@ static int64_t handle_inter_mode(VP10_COMP *cpi, MACROBLOCK *x,
     restore_dst_buf(xd, orig_dst, orig_dst_stride);
     mbmi->ref_frame[1] = INTRA_FRAME;
 
-    for (interintra_mode = DC_PRED; interintra_mode <= TM_PRED;
-         ++interintra_mode) {
-      mbmi->interintra_mode = interintra_mode;
-      mbmi->interintra_uv_mode = interintra_mode;
-      rmode = intra_mode_cost[mbmi->interintra_mode];
+    for (j = 0; j < INTERINTRA_MODES; ++j) {
+      mbmi->interintra_mode = (INTERINTRA_MODE)j;
+      mbmi->interintra_uv_mode = (INTERINTRA_MODE)j;
+      rmode = interintra_mode_cost[mbmi->interintra_mode];
       vp10_build_interintra_predictors(xd,
                                        tmp_buf,
                                        tmp_buf + MAX_SB_SQUARE,
@@ -6828,7 +6827,7 @@ static int64_t handle_inter_mode(VP10_COMP *cpi, MACROBLOCK *x,
       rd = RDCOST(x->rdmult, x->rddiv, rate_mv + rmode + rate_sum, dist_sum);
       if (rd < best_interintra_rd) {
         best_interintra_rd = rd;
-        best_interintra_mode = interintra_mode;
+        best_interintra_mode = mbmi->interintra_mode;
       }
     }
     mbmi->interintra_mode = best_interintra_mode;
@@ -6845,7 +6844,7 @@ static int64_t handle_inter_mode(VP10_COMP *cpi, MACROBLOCK *x,
         xd, bsize, 2, intrapred + 2 * MAX_SB_SQUARE, MAX_SB_SIZE);
 
     wedge_bits = get_wedge_bits(bsize);
-    rmode = intra_mode_cost[mbmi->interintra_mode];
+    rmode = interintra_mode_cost[mbmi->interintra_mode];
     if (wedge_bits) {
       vp10_combine_interintra(xd, bsize, 0, tmp_buf, MAX_SB_SIZE,
                               intrapred, MAX_SB_SIZE);
@@ -6932,7 +6931,7 @@ static int64_t handle_inter_mode(VP10_COMP *cpi, MACROBLOCK *x,
     tmp_rd = best_interintra_rd;
     *compmode_interintra_cost =
         vp10_cost_bit(cm->fc->interintra_prob[bsize], 1);
-    *compmode_interintra_cost += intra_mode_cost[mbmi->interintra_mode];
+    *compmode_interintra_cost += interintra_mode_cost[mbmi->interintra_mode];
     if (get_wedge_bits(bsize)) {
       *compmode_interintra_cost += vp10_cost_bit(
           cm->fc->wedge_interintra_prob[bsize], mbmi->use_wedge_interintra);