[NORMATIVE] Add frame-level flag to enable/disable filter_intra

BUG=aomedia:1401

Change-Id: I0f9adce33118a8e50e26a42a5a828a8bc887a594
diff --git a/av1/common/blockd.h b/av1/common/blockd.h
index 3a7f442..4d0720e 100644
--- a/av1/common/blockd.h
+++ b/av1/common/blockd.h
@@ -755,18 +755,6 @@
   0, 90, 180, 45, 135, 113, 157, 203, 67, 0, 0, 0, 0,
 };
 
-static INLINE int av1_filter_intra_allowed_bsize(BLOCK_SIZE bs) {
-  if (bs == BLOCK_INVALID) return 0;
-
-  return block_size_wide[bs] <= 32 && block_size_high[bs] <= 32;
-}
-
-static INLINE int av1_filter_intra_allowed(const MB_MODE_INFO *mbmi) {
-  return mbmi->mode == DC_PRED &&
-         mbmi->palette_mode_info.palette_size[0] == 0 &&
-         av1_filter_intra_allowed_bsize(mbmi->sb_type);
-}
-
 // Converts block_index for given transform size to index of the block in raster
 // order.
 static INLINE int av1_block_index_to_raster_order(TX_SIZE tx_size,
diff --git a/av1/common/onyxc_int.h b/av1/common/onyxc_int.h
index a15fd14..30a7a57 100644
--- a/av1/common/onyxc_int.h
+++ b/av1/common/onyxc_int.h
@@ -321,6 +321,7 @@
   int disable_intra_edge_filter;  // 1 - disable corner/edge/upsampling
   int allow_screen_content_tools;
   int allow_intrabc;
+  int allow_filter_intra;
   int allow_interintra_compound;
   int allow_masked_compound;
 
diff --git a/av1/common/reconintra.h b/av1/common/reconintra.h
index eb813c4..29b32cc 100644
--- a/av1/common/reconintra.h
+++ b/av1/common/reconintra.h
@@ -64,6 +64,20 @@
   return cm->allow_screen_content_tools && cm->allow_intrabc;
 }
 
+static INLINE int av1_filter_intra_allowed_bsize(const AV1_COMMON *const cm,
+                                                 BLOCK_SIZE bs) {
+  if (!cm->allow_filter_intra || bs == BLOCK_INVALID) return 0;
+
+  return block_size_wide[bs] <= 32 && block_size_high[bs] <= 32;
+}
+
+static INLINE int av1_filter_intra_allowed(const AV1_COMMON *const cm,
+                                           const MB_MODE_INFO *mbmi) {
+  return mbmi->mode == DC_PRED &&
+         mbmi->palette_mode_info.palette_size[0] == 0 &&
+         av1_filter_intra_allowed_bsize(cm, mbmi->sb_type);
+}
+
 extern const int8_t av1_filter_intra_taps[FILTER_INTRA_MODES][8][8];
 
 #ifdef __cplusplus
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index a98eaf0..6414736 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -2697,6 +2697,7 @@
   cm->intra_only = cm->frame_type == INTRA_ONLY_FRAME;
   cm->error_resilient_mode = aom_rb_read_bit(rb);
   cm->disable_intra_edge_filter = aom_rb_read_bit(rb);
+  cm->allow_filter_intra = aom_rb_read_bit(rb);
 
 #if CONFIG_CDF_UPDATE_MODE
   cm->disable_cdf_update = aom_rb_read_bit(rb);
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c
index a8a5f1e..c042066 100644
--- a/av1/decoder/decodemv.c
+++ b/av1/decoder/decodemv.c
@@ -630,13 +630,14 @@
   return sym - MAX_ANGLE_DELTA;
 }
 
-static void read_filter_intra_mode_info(MACROBLOCKD *const xd, aom_reader *r) {
+static void read_filter_intra_mode_info(const AV1_COMMON *const cm,
+                                        MACROBLOCKD *const xd, aom_reader *r) {
   MODE_INFO *const mi = xd->mi[0];
   MB_MODE_INFO *const mbmi = &mi->mbmi;
   FILTER_INTRA_MODE_INFO *filter_intra_mode_info =
       &mbmi->filter_intra_mode_info;
 
-  if (av1_filter_intra_allowed(mbmi)) {
+  if (av1_filter_intra_allowed(cm, mbmi)) {
     filter_intra_mode_info->use_filter_intra = aom_read_symbol(
         r, xd->tile_ctx->filter_intra_cdfs[mbmi->sb_type], 2, ACCT_STR);
     if (filter_intra_mode_info->use_filter_intra) {
@@ -885,7 +886,7 @@
   if (av1_allow_palette(cm->allow_screen_content_tools, bsize))
     read_palette_mode_info(cm, xd, mi_row, mi_col, r);
 
-  read_filter_intra_mode_info(xd, r);
+  read_filter_intra_mode_info(cm, xd, r);
 }
 
 static int read_mv_component(aom_reader *r, nmv_component *mvcomp,
@@ -1165,7 +1166,7 @@
   if (av1_allow_palette(cm->allow_screen_content_tools, bsize))
     read_palette_mode_info(cm, xd, mi_row, mi_col, r);
 
-  read_filter_intra_mode_info(xd, r);
+  read_filter_intra_mode_info(cm, xd, r);
 }
 
 static INLINE int is_mv_valid(const MV *mv) {
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index a32317a..aea6683 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -617,10 +617,11 @@
   }
 }
 
-static void write_filter_intra_mode_info(const MACROBLOCKD *xd,
+static void write_filter_intra_mode_info(const AV1_COMMON *cm,
+                                         const MACROBLOCKD *xd,
                                          const MB_MODE_INFO *const mbmi,
                                          aom_writer *w) {
-  if (av1_filter_intra_allowed(mbmi)) {
+  if (av1_filter_intra_allowed(cm, mbmi)) {
     aom_write_symbol(w, mbmi->filter_intra_mode_info.use_filter_intra,
                      xd->tile_ctx->filter_intra_cdfs[mbmi->sb_type], 2);
     if (mbmi->filter_intra_mode_info.use_filter_intra) {
@@ -1091,7 +1092,7 @@
     if (av1_allow_palette(cm->allow_screen_content_tools, bsize))
       write_palette_mode_info(cm, xd, mi, mi_row, mi_col, w);
 
-    write_filter_intra_mode_info(xd, mbmi, w);
+    write_filter_intra_mode_info(cm, xd, mbmi, w);
   } else {
     int16_t mode_ctx;
 
@@ -1355,7 +1356,7 @@
   if (av1_allow_palette(cm->allow_screen_content_tools, bsize))
     write_palette_mode_info(cm, xd, mi, mi_row, mi_col, w);
 
-  write_filter_intra_mode_info(xd, mbmi, w);
+  write_filter_intra_mode_info(cm, xd, mbmi, w);
 }
 
 #if CONFIG_RD_DEBUG
@@ -3042,6 +3043,7 @@
   aom_wb_write_bit(wb, cm->error_resilient_mode);
 
   aom_wb_write_bit(wb, cm->disable_intra_edge_filter);
+  aom_wb_write_bit(wb, cm->allow_filter_intra);
 
 #if CONFIG_CDF_UPDATE_MODE
   aom_wb_write_bit(wb, cm->disable_cdf_update);
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index 9248fcf..fc331bf 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -731,11 +731,11 @@
   }
 }
 
-static void sum_intra_stats(FRAME_COUNTS *counts, MACROBLOCKD *xd,
-                            const MODE_INFO *mi, const MODE_INFO *above_mi,
-                            const MODE_INFO *left_mi, const int intraonly,
-                            const int mi_row, const int mi_col,
-                            uint8_t allow_update_cdf) {
+static void sum_intra_stats(const AV1_COMMON *const cm, FRAME_COUNTS *counts,
+                            MACROBLOCKD *xd, const MODE_INFO *mi,
+                            const MODE_INFO *above_mi, const MODE_INFO *left_mi,
+                            const int intraonly, const int mi_row,
+                            const int mi_col, uint8_t allow_update_cdf) {
   FRAME_CONTEXT *fc = xd->tile_ctx;
   const MB_MODE_INFO *const mbmi = &mi->mbmi;
   const PREDICTION_MODE y_mode = mbmi->mode;
@@ -761,7 +761,7 @@
       update_cdf(fc->y_mode_cdf[size_group_lookup[bsize]], y_mode, INTRA_MODES);
   }
 
-  if (av1_filter_intra_allowed(mbmi)) {
+  if (av1_filter_intra_allowed(cm, mbmi)) {
     const int use_filter_intra_mode =
         mbmi->filter_intra_mode_info.use_filter_intra;
 #if CONFIG_ENTROPY_STATS
@@ -950,7 +950,7 @@
   }
 
   if (!is_inter_block(mbmi)) {
-    sum_intra_stats(td->counts, xd, mi, xd->above_mi, xd->left_mi,
+    sum_intra_stats(cm, td->counts, xd, mi, xd->above_mi, xd->left_mi,
                     frame_is_intra_only(cm), mi_row, mi_col,
                     tile_data->allow_update_cdf);
     if (av1_allow_palette(cm->allow_screen_content_tools, bsize) &&
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index fe10e9e..27b9777 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -2567,6 +2567,7 @@
   cm->seq_params.force_integer_mv = 2;
 #endif
   cm->disable_intra_edge_filter = 0;
+  cm->allow_filter_intra = 1;
 }
 
 AV1_COMP *av1_create_compressor(AV1EncoderConfig *oxcf,
diff --git a/av1/encoder/rd.c b/av1/encoder/rd.c
index 94fc38e..a62d8e8 100644
--- a/av1/encoder/rd.c
+++ b/av1/encoder/rd.c
@@ -123,7 +123,7 @@
   av1_cost_tokens_from_cdf(x->filter_intra_mode_cost, fc->filter_intra_mode_cdf,
                            NULL);
   for (i = 0; i < BLOCK_SIZES_ALL; ++i) {
-    if (av1_filter_intra_allowed_bsize(i))
+    if (av1_filter_intra_allowed_bsize(cm, i))
       av1_cost_tokens_from_cdf(x->filter_intra_cost[i],
                                fc->filter_intra_cdfs[i], NULL);
   }
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 45848fe..32f8dc1 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -2494,7 +2494,7 @@
       total_rate += palette_mode_cost;
     }
   }
-  if (av1_filter_intra_allowed(mbmi)) {
+  if (av1_filter_intra_allowed(&cpi->common, mbmi)) {
     total_rate += x->filter_intra_cost[mbmi->sb_type][use_filter_intra];
     if (use_filter_intra) {
       total_rate += x->filter_intra_mode_cost[mbmi->filter_intra_mode_info
@@ -2603,7 +2603,8 @@
         x->angle_delta_cost[mbmi->mode - V_PRED]
                            [MAX_ANGLE_DELTA + mbmi->angle_delta[PLANE_TYPE_Y]];
   }
-  if (mbmi->mode == DC_PRED && av1_filter_intra_allowed_bsize(mbmi->sb_type)) {
+  if (mbmi->mode == DC_PRED &&
+      av1_filter_intra_allowed_bsize(cm, mbmi->sb_type)) {
     if (mbmi->filter_intra_mode_info.use_filter_intra) {
       const int mode = mbmi->filter_intra_mode_info.filter_intra_mode;
       mode_cost += x->filter_intra_cost[mbmi->sb_type][1] +
@@ -3303,7 +3304,7 @@
                               ctx->blk_skip[0]);
   }
 
-  if (beat_best_rd && av1_filter_intra_allowed_bsize(bsize)) {
+  if (beat_best_rd && av1_filter_intra_allowed_bsize(&cpi->common, bsize)) {
     if (rd_pick_filter_intra_sby(cpi, x, rate, rate_tokenonly, distortion,
                                  skippable, bsize, bmode_costs[DC_PRED],
                                  &best_rd, &best_model_rd, ctx)) {
@@ -8863,7 +8864,7 @@
       memcpy(best_blk_skip, x->blk_skip[0],
              sizeof(best_blk_skip[0]) * ctx->num_4x4_blk);
 
-      if (mbmi->mode == DC_PRED && av1_filter_intra_allowed_bsize(bsize)) {
+      if (mbmi->mode == DC_PRED && av1_filter_intra_allowed_bsize(cm, bsize)) {
         RD_STATS rd_stats_y_fi;
         int filter_intra_selected_flag = 0;
         TX_SIZE best_tx_size = mbmi->tx_size;
@@ -8872,7 +8873,7 @@
                sizeof(*best_txk_type) * TXK_TYPE_BUF_LEN);
         FILTER_INTRA_MODE best_fi_mode = FILTER_DC_PRED;
         int64_t best_rd_tmp = INT64_MAX;
-        if (rate_y != INT_MAX && av1_filter_intra_allowed_bsize(bsize)) {
+        if (rate_y != INT_MAX) {
           best_rd_tmp = RDCOST(x->rdmult,
                                rate_y + x->filter_intra_cost[bsize][0] +
                                    intra_mode_cost[mbmi->mode],