Refactor InterpFilters variable

Replacing packed filter variable with union
for better readability.

Change-Id: I455e391d75826503cb8e34b01f5ee856ca8e2674
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 1178f82..af496d5 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -620,9 +620,10 @@
   FRAME_CONTEXT *ec_ctx = xd->tile_ctx;
 
   if (!av1_is_interp_needed(xd)) {
-    assert(mbmi->interp_filters ==
-           av1_broadcast_interp_filter(
-               av1_unswitchable_filter(cm->interp_filter)));
+    int_interpfilters filters =
+        av1_broadcast_interp_filter(av1_unswitchable_filter(cm->interp_filter));
+    assert(mbmi->interp_filters.as_int == filters.as_int);
+    (void)filters;
     return;
   }
   if (cm->interp_filter == SWITCHABLE) {
diff --git a/av1/encoder/block.h b/av1/encoder/block.h
index 1d1cbbe..35b4705 100644
--- a/av1/encoder/block.h
+++ b/av1/encoder/block.h
@@ -153,7 +153,7 @@
 
 #define MAX_INTERP_FILTER_STATS 64
 typedef struct {
-  InterpFilters filters;
+  int_interpfilters filters;
   int_mv mv[2];
   int8_t ref_frames[2];
   COMPOUND_TYPE comp_type;
@@ -171,7 +171,7 @@
   int_mv mv[2];
   MV_REFERENCE_FRAME ref_frames[2];
   PREDICTION_MODE mode;
-  InterpFilters filter;
+  int_interpfilters filter;
   int ref_mv_idx;
   int is_global[2];
 } COMP_RD_STATS;
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index d9f8292..a351cac 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -2769,7 +2769,7 @@
     if (cpi->sf.adaptive_pred_interp_filter && bsize == BLOCK_8X8 &&
         partition_none_allowed) {
       pc_tree->horizontal[0].pred_interp_filter =
-          av1_extract_interp_filter(ctx_none->mic.interp_filters, 0);
+          ctx_none->mic.interp_filters.as_filters.y_filter;
     }
     sum_rdc.rate = partition_cost[PARTITION_HORZ];
     sum_rdc.rdcost = RDCOST(x->rdmult, sum_rdc.rate, 0);
@@ -2814,7 +2814,7 @@
       if (cpi->sf.adaptive_pred_interp_filter && bsize == BLOCK_8X8 &&
           partition_none_allowed) {
         pc_tree->horizontal[1].pred_interp_filter =
-            av1_extract_interp_filter(ctx_h->mic.interp_filters, 0);
+            ctx_h->mic.interp_filters.as_filters.y_filter;
       }
 
       av1_rd_stats_subtraction(x->rdmult, &best_rdc, &sum_rdc,
@@ -2868,7 +2868,7 @@
     if (cpi->sf.adaptive_pred_interp_filter && bsize == BLOCK_8X8 &&
         partition_none_allowed) {
       pc_tree->vertical[0].pred_interp_filter =
-          av1_extract_interp_filter(ctx_none->mic.interp_filters, 0);
+          ctx_none->mic.interp_filters.as_filters.y_filter;
     }
     sum_rdc.rate = partition_cost[PARTITION_VERT];
     sum_rdc.rdcost = RDCOST(x->rdmult, sum_rdc.rate, 0);
@@ -2912,7 +2912,7 @@
       if (cpi->sf.adaptive_pred_interp_filter && bsize == BLOCK_8X8 &&
           partition_none_allowed) {
         pc_tree->vertical[1].pred_interp_filter =
-            av1_extract_interp_filter(ctx_none->mic.interp_filters, 0);
+            ctx_none->mic.interp_filters.as_filters.y_filter;
       }
 
       av1_rd_stats_subtraction(x->rdmult, &best_rdc, &sum_rdc,
diff --git a/av1/encoder/nonrd_pickmode.c b/av1/encoder/nonrd_pickmode.c
index 8463ba1..f1395fa 100644
--- a/av1/encoder/nonrd_pickmode.c
+++ b/av1/encoder/nonrd_pickmode.c
@@ -51,7 +51,7 @@
   MV_REFERENCE_FRAME best_ref_frame;
   MV_REFERENCE_FRAME best_second_ref_frame;
   uint8_t best_mode_skip_txfm;
-  InterpFilters best_pred_filter;
+  int_interpfilters best_pred_filter;
 } BEST_PICKMODE;
 
 typedef struct {
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 52958d5..524c3a9 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -158,10 +158,10 @@
 #define MODELRD_TYPE_MOTION_MODE_RD 1
 
 #define DUAL_FILTER_SET_SIZE (SWITCHABLE_FILTERS * SWITCHABLE_FILTERS)
-static const InterpFilters filter_sets[DUAL_FILTER_SET_SIZE] = {
-  0x00000000, 0x00010000, 0x00020000,  // y = 0
-  0x00000001, 0x00010001, 0x00020001,  // y = 1
-  0x00000002, 0x00010002, 0x00020002,  // y = 2
+static const int_interpfilters filter_sets[DUAL_FILTER_SET_SIZE] = {
+  { 0x00000000 }, { 0x00010000 }, { 0x00020000 },  // y = 0
+  { 0x00000001 }, { 0x00010001 }, { 0x00020001 },  // y = 1
+  { 0x00000002 }, { 0x00010002 }, { 0x00020002 },  // y = 2
 };
 
 typedef struct {
@@ -6625,7 +6625,7 @@
     ref_yv12[1] = xd->plane[plane].pre[1];
 
     // Get the prediction block from the 'other' reference frame.
-    const InterpFilters interp_filters =
+    const int_interpfilters interp_filters =
         av1_broadcast_interp_filter(EIGHTTAP_REGULAR);
 
     // Since we have scaled the reference frames to match the size of the
@@ -8113,11 +8113,11 @@
 }
 
 static INLINE int get_switchable_rate(MACROBLOCK *const x,
-                                      const InterpFilters filters,
+                                      const int_interpfilters filters,
                                       const int ctx[2]) {
   int inter_filter_cost;
-  const InterpFilter filter0 = av1_extract_interp_filter(filters, 0);
-  const InterpFilter filter1 = av1_extract_interp_filter(filters, 1);
+  const InterpFilter filter0 = filters.as_filters.y_filter;
+  const InterpFilter filter1 = filters.as_filters.x_filter;
   inter_filter_cost = x->switchable_interp_costs[ctx[0]][filter0];
   inter_filter_cost += x->switchable_interp_costs[ctx[1]][filter1];
   return SWITCHABLE_INTERP_RATE_FACTOR * inter_filter_cost;
@@ -8139,7 +8139,7 @@
   int tmp_rate[2], tmp_skip_sb[2] = { 1, 1 };
   int64_t tmp_dist[2], tmp_skip_sse[2] = { 0, 0 };
 
-  const InterpFilters last_best = mbmi->interp_filters;
+  const int_interpfilters last_best = mbmi->interp_filters;
   mbmi->interp_filters = filter_sets[filter_idx];
   const int tmp_rs =
       get_switchable_rate(x, mbmi->interp_filters, switchable_ctx);
@@ -8320,7 +8320,7 @@
 
   // Regular filter evaluation should have been done and hence the same should
   // be the winner
-  assert(x->e_mbd.mi[0]->interp_filters == filter_sets[0]);
+  assert(x->e_mbd.mi[0]->interp_filters.as_int == filter_sets[0].as_int);
   assert(filter_set_size == DUAL_FILTER_SET_SIZE);
   if ((skip_hor & skip_ver) != cpi->default_interp_skip_flags) {
     int pred_filter_search;
@@ -8329,10 +8329,10 @@
     const MB_MODE_INFO *const above_mbmi = xd->above_mbmi;
     const MB_MODE_INFO *const left_mbmi = xd->left_mbmi;
     if (above_mbmi && is_inter_block(above_mbmi)) {
-      af_horiz = av1_extract_interp_filter(above_mbmi->interp_filters, 1);
+      af_horiz = above_mbmi->interp_filters.as_filters.x_filter;
     }
     if (left_mbmi && is_inter_block(left_mbmi)) {
-      lf_horiz = av1_extract_interp_filter(left_mbmi->interp_filters, 1);
+      lf_horiz = left_mbmi->interp_filters.as_filters.x_filter;
     }
     pred_filter_search = is_pred_filter_search_allowed(
         cpi, bsize, mi_row, mi_col, af_horiz, af_horiz, lf_horiz, lf_horiz);
@@ -8340,8 +8340,8 @@
       assert(af_horiz != INTERP_INVALID);
       filter_idx = SWITCHABLE * af_horiz;
       // This assert tells that (filter_x == filter_y) for non-dual filter case
-      assert((filter_sets[filter_idx] & 0xffff) ==
-             (filter_sets[filter_idx] >> 16));
+      assert(filter_sets[filter_idx].as_filters.x_filter ==
+             filter_sets[filter_idx].as_filters.y_filter);
       if (cpi->sf.adaptive_interp_filter_search &&
           (cpi->sf.interp_filter_search_mask & (1 << (filter_idx >> 2)))) {
         return;
@@ -8373,7 +8373,8 @@
     int skip_pred = cpi->default_interp_skip_flags;
     for (i = filter_set_size - 1; i > 0; i -= (SWITCHABLE_FILTERS + 1)) {
       // This assert tells that (filter_x == filter_y) for non-dual filter case
-      assert((filter_sets[i] & 0xffff) == (filter_sets[i] >> 16));
+      assert(filter_sets[i].as_filters.x_filter ==
+             filter_sets[i].as_filters.y_filter);
       if (cpi->sf.adaptive_interp_filter_search &&
           (cpi->sf.interp_filter_search_mask & (1 << (i >> 2)))) {
         continue;
@@ -8389,7 +8390,8 @@
     for (i = (SWITCHABLE_FILTERS + 1); i < filter_set_size;
          i += (SWITCHABLE_FILTERS + 1)) {
       // This assert tells that (filter_x == filter_y) for non-dual filter case
-      assert((filter_sets[i] & 0xffff) == (filter_sets[i] >> 16));
+      assert(filter_sets[i].as_filters.x_filter ==
+             filter_sets[i].as_filters.y_filter);
       if (cpi->sf.adaptive_interp_filter_search &&
           (cpi->sf.interp_filter_search_mask & (1 << (i >> 2)))) {
         continue;
@@ -8405,7 +8407,8 @@
       // accounting switchable filter rate)
       if (cpi->sf.skip_sharp_interp_filter_search &&
           skip_pred != cpi->default_interp_skip_flags) {
-        if (mbmi->interp_filters == filter_sets[(SWITCHABLE_FILTERS + 1)])
+        if (mbmi->interp_filters.as_int ==
+            filter_sets[(SWITCHABLE_FILTERS + 1)].as_int)
           break;
       }
     }
@@ -8435,7 +8438,7 @@
   // TODO(ranjit): Ensure that compound type search use regular filter always
   // and check if following check can be removed
   // Check if interp filter matches with previous case
-  if (st->filter != mi->interp_filters) return 0;
+  if (st->filter.as_int != mi->interp_filters.as_int) return 0;
 
   const MACROBLOCKD *const xd = &x->e_mbd;
   // Match MV and reference indices
@@ -8632,8 +8635,9 @@
     return 0;
   }
   if (!need_search) {
-    assert(mbmi->interp_filters ==
-           av1_broadcast_interp_filter(EIGHTTAP_REGULAR));
+    int_interpfilters filters = av1_broadcast_interp_filter(EIGHTTAP_REGULAR);
+    assert(mbmi->interp_filters.as_int == filters.as_int);
+    (void)filters;
     return 0;
   }
   if (args->modelled_rd != NULL) {
@@ -8722,12 +8726,12 @@
       const MB_MODE_INFO *const above_mbmi = xd->above_mbmi;
       const MB_MODE_INFO *const left_mbmi = xd->left_mbmi;
       if (above_mbmi && is_inter_block(above_mbmi)) {
-        af_horiz = av1_extract_interp_filter(above_mbmi->interp_filters, 1);
-        af_vert = av1_extract_interp_filter(above_mbmi->interp_filters, 0);
+        af_horiz = above_mbmi->interp_filters.as_filters.x_filter;
+        af_vert = above_mbmi->interp_filters.as_filters.y_filter;
       }
       if (left_mbmi && is_inter_block(left_mbmi)) {
-        lf_horiz = av1_extract_interp_filter(left_mbmi->interp_filters, 1);
-        lf_vert = av1_extract_interp_filter(left_mbmi->interp_filters, 0);
+        lf_horiz = left_mbmi->interp_filters.as_filters.x_filter;
+        lf_vert = left_mbmi->interp_filters.as_filters.y_filter;
       }
       pred_filter_search = is_pred_filter_search_allowed(
           cpi, bsize, mi_row, mi_col, af_horiz, af_vert, lf_horiz, lf_vert);
@@ -9218,7 +9222,7 @@
 
   if (nb_mi->ref_frame[0] != current_mi->ref_frame[0] ||
       nb_mi->mv[0].as_int != current_mi->mv[0].as_int ||
-      nb_mi->interp_filters != current_mi->interp_filters) {
+      nb_mi->interp_filters.as_int != current_mi->interp_filters.as_int) {
     ctxt->mv_field_check_result = 0;
   }
 }
@@ -10577,7 +10581,7 @@
 
       if (!is_comp_pred)
         args->single_filter[this_mode][refs[0]] =
-            av1_extract_interp_filter(mbmi->interp_filters, 0);
+            mbmi->interp_filters.as_filters.y_filter;
 
       if (args->modelled_rd != NULL) {
         if (is_comp_pred) {
@@ -13026,16 +13030,14 @@
     return;
   }
 
-  assert(
-      (cm->interp_filter == SWITCHABLE) ||
-      (cm->interp_filter ==
-       av1_extract_interp_filter(search_state.best_mbmode.interp_filters, 0)) ||
-      !is_inter_block(&search_state.best_mbmode));
-  assert(
-      (cm->interp_filter == SWITCHABLE) ||
-      (cm->interp_filter ==
-       av1_extract_interp_filter(search_state.best_mbmode.interp_filters, 1)) ||
-      !is_inter_block(&search_state.best_mbmode));
+  assert((cm->interp_filter == SWITCHABLE) ||
+         (cm->interp_filter ==
+          search_state.best_mbmode.interp_filters.as_filters.y_filter) ||
+         !is_inter_block(&search_state.best_mbmode));
+  assert((cm->interp_filter == SWITCHABLE) ||
+         (cm->interp_filter ==
+          search_state.best_mbmode.interp_filters.as_filters.x_filter) ||
+         !is_inter_block(&search_state.best_mbmode));
 
   if (!cpi->rc.is_src_frame_alt_ref)
     av1_update_rd_thresh_fact(cm, tile_data->thresh_freq_fact,
@@ -13051,9 +13053,10 @@
   if (mbmi->mode == GLOBALMV || mbmi->mode == GLOBAL_GLOBALMV) {
     // Correct the interp filters for GLOBALMV
     if (is_nontrans_global_motion(xd, xd->mi[0])) {
-      assert(mbmi->interp_filters ==
-             av1_broadcast_interp_filter(
-                 av1_unswitchable_filter(cm->interp_filter)));
+      int_interpfilters filters = av1_broadcast_interp_filter(
+          av1_unswitchable_filter(cm->interp_filter));
+      assert(mbmi->interp_filters.as_int == filters.as_int);
+      (void)filters;
     }
   }
 
@@ -13604,16 +13607,14 @@
     return;
   }
 
-  assert(
-      (cm->interp_filter == SWITCHABLE) ||
-      (cm->interp_filter ==
-       av1_extract_interp_filter(search_state.best_mbmode.interp_filters, 0)) ||
-      !is_inter_block(&search_state.best_mbmode));
-  assert(
-      (cm->interp_filter == SWITCHABLE) ||
-      (cm->interp_filter ==
-       av1_extract_interp_filter(search_state.best_mbmode.interp_filters, 1)) ||
-      !is_inter_block(&search_state.best_mbmode));
+  assert((cm->interp_filter == SWITCHABLE) ||
+         (cm->interp_filter ==
+          search_state.best_mbmode.interp_filters.as_filters.y_filter) ||
+         !is_inter_block(&search_state.best_mbmode));
+  assert((cm->interp_filter == SWITCHABLE) ||
+         (cm->interp_filter ==
+          search_state.best_mbmode.interp_filters.as_filters.x_filter) ||
+         !is_inter_block(&search_state.best_mbmode));
 
   if (!cpi->rc.is_src_frame_alt_ref)
     av1_update_rd_thresh_fact(cm, tile_data->thresh_freq_fact,
@@ -13629,9 +13630,10 @@
   if (mbmi->mode == GLOBALMV || mbmi->mode == GLOBAL_GLOBALMV) {
     // Correct the interp filters for GLOBALMV
     if (is_nontrans_global_motion(xd, xd->mi[0])) {
-      assert(mbmi->interp_filters ==
-             av1_broadcast_interp_filter(
-                 av1_unswitchable_filter(cm->interp_filter)));
+      int_interpfilters filters = av1_broadcast_interp_filter(
+          av1_unswitchable_filter(cm->interp_filter));
+      assert(mbmi->interp_filters.as_int == filters.as_int);
+      (void)filters;
     }
   }
 
@@ -13735,7 +13737,7 @@
         rs = av1_get_switchable_rate(cm, x, xd);
         if (rs < best_rs) {
           best_rs = rs;
-          best_filter = av1_extract_interp_filter(mbmi->interp_filters, 0);
+          best_filter = mbmi->interp_filters.as_filters.y_filter;
         }
       }
     }
@@ -13763,8 +13765,7 @@
   }
 
   assert((cm->interp_filter == SWITCHABLE) ||
-         (cm->interp_filter ==
-          av1_extract_interp_filter(mbmi->interp_filters, 0)));
+         (cm->interp_filter == mbmi->interp_filters.as_filters.y_filter));
 
   av1_update_rd_thresh_fact(cm, tile_data->thresh_freq_fact,
                             cpi->sf.adaptive_rd_thresh, bsize, THR_GLOBALMV);
diff --git a/av1/encoder/reconinter_enc.c b/av1/encoder/reconinter_enc.c
index 9198901..4ac2de1 100644
--- a/av1/encoder/reconinter_enc.c
+++ b/av1/encoder/reconinter_enc.c
@@ -281,7 +281,7 @@
                                int dst_stride, const MV *src_mv,
                                const struct scale_factors *sf, int w, int h,
                                ConvolveParams *conv_params,
-                               InterpFilters interp_filters,
+                               int_interpfilters interp_filters,
                                const WarpTypesAllowed *warp_types, int p_col,
                                int p_row, int plane, int ref,
                                mv_precision precision, int x, int y,
diff --git a/av1/encoder/reconinter_enc.h b/av1/encoder/reconinter_enc.h
index 5687168..3104600 100644
--- a/av1/encoder/reconinter_enc.h
+++ b/av1/encoder/reconinter_enc.h
@@ -32,7 +32,7 @@
                                int dst_stride, const MV *src_mv,
                                const struct scale_factors *sf, int w, int h,
                                ConvolveParams *conv_params,
-                               InterpFilters interp_filters,
+                               int_interpfilters interp_filters,
                                const WarpTypesAllowed *warp_types, int p_col,
                                int p_row, int plane, int ref,
                                mv_precision precision, int x, int y,
diff --git a/av1/encoder/temporal_filter.c b/av1/encoder/temporal_filter.c
index 1c5550e..6c353b1 100644
--- a/av1/encoder/temporal_filter.c
+++ b/av1/encoder/temporal_filter.c
@@ -61,8 +61,8 @@
   int uv_stride;
   // TODO(angiebird): change plane setting accordingly
   ConvolveParams conv_params = get_conv_params(0, 0, xd->bd);
-  const InterpFilters interp_filters =
-      av1_make_interp_filters(MULTITAP_SHARP, MULTITAP_SHARP);
+  const int_interpfilters interp_filters =
+      av1_broadcast_interp_filter(MULTITAP_SHARP);
   WarpTypesAllowed warp_types;
   memset(&warp_types, 0, sizeof(WarpTypesAllowed));
 
diff --git a/av1/encoder/tpl_model.c b/av1/encoder/tpl_model.c
index b1a9fb5..4f98c09 100644
--- a/av1/encoder/tpl_model.c
+++ b/av1/encoder/tpl_model.c
@@ -113,8 +113,8 @@
   const int bw = 4 << mi_size_wide_log2[bsize];
   const int bh = 4 << mi_size_high_log2[bsize];
   const int pix_num = bw * bh;
-  const InterpFilters kernel =
-      av1_make_interp_filters(EIGHTTAP_REGULAR, EIGHTTAP_REGULAR);
+  const int_interpfilters kernel =
+      av1_broadcast_interp_filter(EIGHTTAP_REGULAR);
 
   int64_t best_intra_cost = INT64_MAX;
   int64_t intra_cost;
@@ -747,8 +747,8 @@
   ConvolveParams conv_params = get_conv_params(0, 0, xd->bd);
   WarpTypesAllowed warp_types;
   memset(&warp_types, 0, sizeof(WarpTypesAllowed));
-  const InterpFilters kernel =
-      av1_make_interp_filters(EIGHTTAP_REGULAR, EIGHTTAP_REGULAR);
+  const int_interpfilters kernel =
+      av1_broadcast_interp_filter(EIGHTTAP_REGULAR);
   xd->above_mbmi = NULL;
   xd->left_mbmi = NULL;
   xd->mi[0]->sb_type = bsize;
diff --git a/av1/encoder/var_based_part.c b/av1/encoder/var_based_part.c
index a5772dc..0aaac58 100644
--- a/av1/encoder/var_based_part.c
+++ b/av1/encoder/var_based_part.c
@@ -501,7 +501,7 @@
     mi->ref_frame[1] = NONE_FRAME;
     mi->sb_type = cm->seq_params.sb_size;
     mi->mv[0].as_int = 0;
-    mi->interp_filters = av1_make_interp_filters(BILINEAR, BILINEAR);
+    mi->interp_filters = av1_broadcast_interp_filter(BILINEAR);
     if (cpi->sf.estimate_motion_for_var_based_partition) {
       if (xd->mb_to_right_edge >= 0 && xd->mb_to_bottom_edge >= 0) {
         const MV dummy_mv = { 0, 0 };