Make ext-intra/intra-interp work with ec-multisymbol

Use cdf to signal intra filter type.
Skip forward update when ec-adapt is on.

Change-Id: Idd446e081b8e9ea33356e60423b372bfd85a80db
diff --git a/av1/common/entropy.c b/av1/common/entropy.c
index ad68d3a..d6294bd 100644
--- a/av1/common/entropy.c
+++ b/av1/common/entropy.c
@@ -5699,13 +5699,10 @@
 #if CONFIG_DELTA_Q
   AVERAGE_TILE_CDFS(delta_q_cdf)
 #endif
-#if CONFIG_EXT_INTRA
-#if CONFIG_INTRA_INTERP
-// FIXME: intra_filter probs
-#endif  // CONFIG_INTRA_INTERP
-#endif  // CONFIG_EXT_INTRA
+#if CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP
+  AVERAGE_TILE_CDFS(intra_filter_cdf)
+#endif  // CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP
 #if CONFIG_FILTER_INTRA
-// FIXME: intra_filter probs
 #endif  // CONFIG_FILTER_INTRA
 }
 
diff --git a/av1/common/entropymode.c b/av1/common/entropymode.c
index 4bc470a..7541a4c 100644
--- a/av1/common/entropymode.c
+++ b/av1/common/entropymode.c
@@ -1531,8 +1531,7 @@
 };
 #endif  // CONFIG_EXT_TX
 
-#if CONFIG_EXT_INTRA
-#if CONFIG_INTRA_INTERP
+#if CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP
 static const aom_prob
     default_intra_filter_probs[INTRA_FILTERS + 1][INTRA_FILTERS - 1] = {
       { 98, 63, 60 }, { 98, 82, 80 }, { 94, 65, 103 },
@@ -1542,8 +1541,11 @@
   -INTRA_FILTER_LINEAR,      2, -INTRA_FILTER_8TAP, 4, -INTRA_FILTER_8TAP_SHARP,
   -INTRA_FILTER_8TAP_SMOOTH,
 };
-#endif  // CONFIG_INTRA_INTERP
-#endif  // CONFIG_EXT_INTRA
+#if CONFIG_EC_MULTISYMBOL
+int av1_intra_filter_ind[INTRA_FILTERS];
+int av1_intra_filter_inv[INTRA_FILTERS];
+#endif  // CONFIG_EC_MULTISYMBOL
+#endif  // CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP
 
 #if CONFIG_FILTER_INTRA
 static const aom_prob default_filter_intra_probs[2] = { 230, 230 };
@@ -1742,7 +1744,16 @@
       { 22528, 25928, 29348, 32768, 0 },
       { 24576, 27296, 30032, 32768, 0 },
     };
-#endif
+#endif  // !CONFIG_EXT_TX
+
+#if CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP
+static const aom_cdf_prob
+    default_intra_filter_cdf[INTRA_FILTERS + 1][CDF_SIZE(INTRA_FILTERS)] = {
+      { 12544, 17521, 21095, 32768, 0 }, { 12544, 19022, 23318, 32768, 0 },
+      { 12032, 17297, 23522, 32768, 0 }, { 6272, 8860, 11101, 32768, 0 },
+      { 9216, 12712, 16629, 32768, 0 },
+    };
+#endif  // CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP
 
 // CDF version of 'av1_kf_y_mode_prob'.
 const aom_cdf_prob
@@ -2284,16 +2295,19 @@
 #if !CONFIG_EXT_TX
   av1_copy(fc->intra_ext_tx_cdf, default_intra_ext_tx_cdf);
   av1_copy(fc->inter_ext_tx_cdf, default_inter_ext_tx_cdf);
-#endif
+#endif  // !CONFIG_EXT_TX
+#if CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP
+  av1_copy(fc->intra_filter_cdf, default_intra_filter_cdf);
+#endif  // CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP
   av1_copy(fc->seg.tree_cdf, default_seg_tree_cdf);
   av1_copy(fc->tx_size_cdf, default_tx_size_cdf);
-#endif
+#endif  // CONFIG_EC_MULTISYMBOL
 #if CONFIG_DELTA_Q
   av1_copy(fc->delta_q_prob, default_delta_q_probs);
 #if CONFIG_EC_MULTISYMBOL
   av1_copy(fc->delta_q_cdf, default_delta_q_cdf);
-#endif
-#endif
+#endif  // CONFIG_EC_MULTISYMBOL
+#endif  // CONFIG_DELTA_Q
 }
 
 #if CONFIG_EC_MULTISYMBOL
@@ -2374,9 +2388,15 @@
                       fc->tx_size_cdf[i][j]);
     }
   }
+#if CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP
+  for (i = 0; i < INTRA_FILTERS + 1; ++i) {
+    av1_tree_to_cdf(av1_intra_filter_tree, fc->intra_filter_probs[i],
+                    fc->intra_filter_cdf[i]);
+  }
+#endif  // CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP
 }
 #endif  // !CONFIG_EC_ADAPT
-#endif
+#endif  // CONFIG_EC_MULTISYMBOL
 
 #if CONFIG_DUAL_FILTER
 const aom_tree_index av1_switchable_interp_tree[TREE_SIZE(SWITCHABLE_FILTERS)] =
diff --git a/av1/common/entropymode.h b/av1/common/entropymode.h
index 902b5fb..a91d8ce 100644
--- a/av1/common/entropymode.h
+++ b/av1/common/entropymode.h
@@ -260,12 +260,15 @@
                           [CDF_SIZE(MAX_TX_DEPTH + 1)];
 #if CONFIG_DELTA_Q
   aom_cdf_prob delta_q_cdf[CDF_SIZE(DELTA_Q_PROBS + 1)];
-#endif
+#endif  // CONFIG_DELTA_Q
 #if !CONFIG_EXT_TX
   aom_cdf_prob intra_ext_tx_cdf[EXT_TX_SIZES][TX_TYPES][CDF_SIZE(TX_TYPES)];
   aom_cdf_prob inter_ext_tx_cdf[EXT_TX_SIZES][CDF_SIZE(TX_TYPES)];
-#endif
-#endif
+#endif  // !CONFIG_EXT_TX
+#if CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP
+  aom_cdf_prob intra_filter_cdf[INTRA_FILTERS + 1][CDF_SIZE(INTRA_FILTERS)];
+#endif  // CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP
+#endif  // CONFIG_EC_MULTISYMBOL
 #if CONFIG_DELTA_Q
   aom_prob delta_q_prob[DELTA_Q_PROBS];
 #endif
@@ -450,11 +453,9 @@
     av1_palette_color_index_tree[PALETTE_SIZES][TREE_SIZE(PALETTE_COLORS)];
 #endif  // CONFIG_PALETTE
 extern const aom_tree_index av1_tx_size_tree[MAX_TX_DEPTH][TREE_SIZE(TX_SIZES)];
-#if CONFIG_EXT_INTRA
-#if CONFIG_INTRA_INTERP
+#if CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP
 extern const aom_tree_index av1_intra_filter_tree[TREE_SIZE(INTRA_FILTERS)];
-#endif  // CONFIG_INTRA_INTERP
-#endif  // CONFIG_EXT_INTRA
+#endif  // CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP
 #if CONFIG_EXT_TX
 extern const aom_tree_index av1_ext_tx_inter_tree[EXT_TX_SETS_INTER]
                                                  [TREE_SIZE(TX_TYPES)];
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index f040bb1..6b224c7 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -4471,7 +4471,7 @@
   FRAME_CONTEXT *const fc = cm->fc;
   aom_reader r;
   int k, i;
-#if !CONFIG_EC_ADAPT || CONFIG_EXT_INTRA
+#if !CONFIG_EC_ADAPT
   int j;
 #endif
 
@@ -4548,13 +4548,13 @@
   for (; j < PARTITION_CONTEXTS_PRIMARY + 2 * PARTITION_BLOCK_SIZES; ++j)
     av1_diff_update_prob(&r, &fc->partition_prob[j][PARTITION_HORZ], ACCT_STR);
 #endif  // CONFIG_UNPOISON_PARTITION_CTX
-#endif  // !CONFIG_EC_ADAPT
 
 #if CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP
   for (i = 0; i < INTRA_FILTERS + 1; ++i)
     for (j = 0; j < INTRA_FILTERS - 1; ++j)
       av1_diff_update_prob(&r, &fc->intra_filter_probs[i][j], ACCT_STR);
 #endif  // CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP
+#endif  // !CONFIG_EC_ADAPT
 
   if (frame_is_intra_only(cm)) {
     av1_copy(cm->kf_y_prob, av1_kf_y_mode_prob);
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c
index afd2654..2f3c3a3 100644
--- a/av1/decoder/decodemv.c
+++ b/av1/decoder/decodemv.c
@@ -709,6 +709,11 @@
   MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
   const BLOCK_SIZE bsize = mbmi->sb_type;
 #if CONFIG_INTRA_INTERP
+#if CONFIG_EC_ADAPT
+  FRAME_CONTEXT *const ec_ctx = xd->tile_ctx;
+#else
+  FRAME_CONTEXT *const ec_ctx = cm->fc;
+#endif  // CONFIG_EC_ADAPT
   const int ctx = av1_get_pred_context_intra_interp(xd);
   int p_angle;
 #endif  // CONFIG_INTRA_INTERP
@@ -725,8 +730,13 @@
               mbmi->angle_delta[0] * av1_get_angle_step(mbmi->sb_type, 0);
     if (av1_is_intra_filter_switchable(p_angle)) {
       FRAME_COUNTS *counts = xd->counts;
+#if CONFIG_EC_MULTISYMBOL
+      mbmi->intra_filter = aom_read_symbol(r, ec_ctx->intra_filter_cdf[ctx],
+                                           INTRA_FILTERS, ACCT_STR);
+#else
       mbmi->intra_filter = aom_read_tree(
-          r, av1_intra_filter_tree, cm->fc->intra_filter_probs[ctx], ACCT_STR);
+          r, av1_intra_filter_tree, ec_ctx->intra_filter_probs[ctx], ACCT_STR);
+#endif  // CONFIG_EC_MULTISYMBOL
       if (counts) ++counts->intra_filter[ctx][mbmi->intra_filter];
     } else {
       mbmi->intra_filter = INTRA_FILTER_LINEAR;
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index d9eaf23..af94487 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -168,11 +168,9 @@
   }
 #endif  // CONFIG_PALETTE
 
-#if CONFIG_EXT_INTRA
-#if CONFIG_INTRA_INTERP
+#if CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP
   av1_tokens_from_tree(intra_filter_encodings, av1_intra_filter_tree);
-#endif  // CONFIG_INTRA_INTERP
-#endif  // CONFIG_EXT_INTRA
+#endif  // CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP
 #if CONFIG_EXT_INTER
   av1_tokens_from_tree(interintra_mode_encodings, av1_interintra_mode_tree);
   av1_tokens_from_tree(compound_type_encodings, av1_compound_type_tree);
@@ -1263,8 +1261,8 @@
 #endif  // CONFIG_FILTER_INTRA
 
 #if CONFIG_EXT_INTRA
-static void write_intra_angle_info(const AV1_COMMON *cm, const MACROBLOCKD *xd,
-                                   aom_writer *w) {
+static void write_intra_angle_info(const MACROBLOCKD *xd,
+                                   FRAME_CONTEXT *const ec_ctx, aom_writer *w) {
   const MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
   const BLOCK_SIZE bsize = mbmi->sb_type;
 #if CONFIG_INTRA_INTERP
@@ -1272,7 +1270,7 @@
   int p_angle;
 #endif  // CONFIG_INTRA_INTERP
 
-  (void)cm;
+  (void)ec_ctx;
   if (bsize < BLOCK_8X8) return;
 
   if (av1_is_directional_mode(mbmi->mode, bsize)) {
@@ -1283,9 +1281,15 @@
     p_angle = mode_to_angle_map[mbmi->mode] +
               mbmi->angle_delta[0] * av1_get_angle_step(mbmi->sb_type, 0);
     if (av1_is_intra_filter_switchable(p_angle)) {
+#if CONFIG_EC_MULTISYMBOL
+      aom_write_symbol(w, mbmi->intra_filter,
+                       ec_ctx->intra_filter_cdf[intra_filter_ctx],
+                       INTRA_FILTERS);
+#else
       av1_write_token(w, av1_intra_filter_tree,
-                      cm->fc->intra_filter_probs[intra_filter_ctx],
+                      ec_ctx->intra_filter_probs[intra_filter_ctx],
                       &intra_filter_encodings[mbmi->intra_filter]);
+#endif  // CONFIG_EC_MULTISYMBOL
     }
 #endif  // CONFIG_INTRA_INTERP
   }
@@ -1653,7 +1657,7 @@
 #endif  // CONFIG_CB4X4
 
 #if CONFIG_EXT_INTRA
-    write_intra_angle_info(cm, xd, w);
+    write_intra_angle_info(xd, ec_ctx, w);
 #endif  // CONFIG_EXT_INTRA
 #if CONFIG_PALETTE
     if (bsize >= BLOCK_8X8 && cm->allow_screen_content_tools)
@@ -1994,7 +1998,7 @@
 #endif  // CONFIG_CB4X4
 
 #if CONFIG_EXT_INTRA
-  write_intra_angle_info(cm, xd, w);
+  write_intra_angle_info(xd, ec_ctx, w);
 #endif  // CONFIG_EXT_INTRA
 #if CONFIG_PALETTE
   if (bsize >= BLOCK_8X8 && cm->allow_screen_content_tools)
@@ -4623,13 +4627,12 @@
                               ct, probwt);
   }
 #endif
-#endif  // !CONFIG_EC_ADAPT
-
 #if CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP
   for (i = 0; i < INTRA_FILTERS + 1; ++i)
     prob_diff_update(av1_intra_filter_tree, fc->intra_filter_probs[i],
                      counts->intra_filter[i], INTRA_FILTERS, probwt, header_bc);
 #endif  // CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP
+#endif  // !CONFIG_EC_ADAPT
 
   if (frame_is_intra_only(cm)) {
     av1_copy(cm->kf_y_prob, av1_kf_y_mode_prob);