Refactor InterpFilters variable

Replacing packed filter variable with union
for better readability.

Change-Id: I455e391d75826503cb8e34b01f5ee856ca8e2674
diff --git a/aom_dsp/variance.c b/aom_dsp/variance.c
index 18a33c5..f68c6cc 100644
--- a/aom_dsp/variance.c
+++ b/aom_dsp/variance.c
@@ -353,7 +353,7 @@
 
       // Get convolve parameters.
       ConvolveParams conv_params = get_conv_params(0, plane, xd->bd);
-      const InterpFilters filters =
+      const int_interpfilters filters =
           av1_broadcast_interp_filter(EIGHTTAP_REGULAR);
 
       // Get the inter predictor.
@@ -945,7 +945,7 @@
 
       // Get convolve parameters.
       ConvolveParams conv_params = get_conv_params(0, plane, xd->bd);
-      const InterpFilters filters =
+      const int_interpfilters filters =
           av1_broadcast_interp_filter(EIGHTTAP_REGULAR);
 
       // Get the inter predictor.
diff --git a/aom_dsp/x86/highbd_variance_sse2.c b/aom_dsp/x86/highbd_variance_sse2.c
index fc5678d..7c80df7 100644
--- a/aom_dsp/x86/highbd_variance_sse2.c
+++ b/aom_dsp/x86/highbd_variance_sse2.c
@@ -686,7 +686,7 @@
 
       // Get convolve parameters.
       ConvolveParams conv_params = get_conv_params(0, plane, xd->bd);
-      const InterpFilters filters =
+      const int_interpfilters filters =
           av1_broadcast_interp_filter(EIGHTTAP_REGULAR);
 
       // Get the inter predictor.
diff --git a/aom_dsp/x86/variance_sse2.c b/aom_dsp/x86/variance_sse2.c
index 3b39b9e..f78b199 100644
--- a/aom_dsp/x86/variance_sse2.c
+++ b/aom_dsp/x86/variance_sse2.c
@@ -565,7 +565,7 @@
 
       // Get convolve parameters.
       ConvolveParams conv_params = get_conv_params(0, plane, xd->bd);
-      const InterpFilters filters =
+      const int_interpfilters filters =
           av1_broadcast_interp_filter(EIGHTTAP_REGULAR);
 
       // Get the inter predictor.
diff --git a/av1/common/blockd.h b/av1/common/blockd.h
index 7c1e1e0..e853c3f 100644
--- a/av1/common/blockd.h
+++ b/av1/common/blockd.h
@@ -217,7 +217,7 @@
   int_mv mv[2];
   int current_qindex;
   // Only for INTER blocks
-  InterpFilters interp_filters;
+  int_interpfilters interp_filters;
   // TODO(debargha): Consolidate these flags
 #if CONFIG_RD_DEBUG
   RD_STATS rd_stats;
diff --git a/av1/common/convolve.c b/av1/common/convolve.c
index d43d168..bd40e72 100644
--- a/av1/common/convolve.c
+++ b/av1/common/convolve.c
@@ -577,9 +577,10 @@
 
 void av1_convolve_2d_facade(const uint8_t *src, int src_stride, uint8_t *dst,
                             int dst_stride, int w, int h,
-                            InterpFilters interp_filters, const int subpel_x_qn,
-                            int x_step_q4, const int subpel_y_qn, int y_step_q4,
-                            int scaled, ConvolveParams *conv_params,
+                            int_interpfilters interp_filters,
+                            const int subpel_x_qn, int x_step_q4,
+                            const int subpel_y_qn, int y_step_q4, int scaled,
+                            ConvolveParams *conv_params,
                             const struct scale_factors *sf, int is_intrabc) {
   assert(IMPLIES(is_intrabc, !scaled));
   (void)x_step_q4;
@@ -597,10 +598,8 @@
   InterpFilter filter_y = 0;
   const int need_filter_params_x = (subpel_x_qn != 0) | scaled;
   const int need_filter_params_y = (subpel_y_qn != 0) | scaled;
-  if (need_filter_params_x)
-    filter_x = av1_extract_interp_filter(interp_filters, 1);
-  if (need_filter_params_y)
-    filter_y = av1_extract_interp_filter(interp_filters, 0);
+  if (need_filter_params_x) filter_x = interp_filters.as_filters.x_filter;
+  if (need_filter_params_y) filter_y = interp_filters.as_filters.y_filter;
   const InterpFilterParams *filter_params_x =
       need_filter_params_x
           ? av1_get_interp_filter_params_with_block_size(filter_x, w)
@@ -1070,7 +1069,7 @@
 
 void av1_highbd_convolve_2d_facade(const uint8_t *src8, int src_stride,
                                    uint8_t *dst8, int dst_stride, int w, int h,
-                                   InterpFilters interp_filters,
+                                   int_interpfilters interp_filters,
                                    const int subpel_x_qn, int x_step_q4,
                                    const int subpel_y_qn, int y_step_q4,
                                    int scaled, ConvolveParams *conv_params,
@@ -1093,10 +1092,8 @@
   InterpFilter filter_y = 0;
   const int need_filter_params_x = (subpel_x_qn != 0) | scaled;
   const int need_filter_params_y = (subpel_y_qn != 0) | scaled;
-  if (need_filter_params_x)
-    filter_x = av1_extract_interp_filter(interp_filters, 1);
-  if (need_filter_params_y)
-    filter_y = av1_extract_interp_filter(interp_filters, 0);
+  if (need_filter_params_x) filter_x = interp_filters.as_filters.x_filter;
+  if (need_filter_params_y) filter_y = interp_filters.as_filters.y_filter;
   const InterpFilterParams *filter_params_x =
       need_filter_params_x
           ? av1_get_interp_filter_params_with_block_size(filter_x, w)
diff --git a/av1/common/convolve.h b/av1/common/convolve.h
index 61829a6..83232bd 100644
--- a/av1/common/convolve.h
+++ b/av1/common/convolve.h
@@ -55,9 +55,10 @@
 
 void av1_convolve_2d_facade(const uint8_t *src, int src_stride, uint8_t *dst,
                             int dst_stride, int w, int h,
-                            InterpFilters interp_filters, const int subpel_x_qn,
-                            int x_step_q4, const int subpel_y_qn, int y_step_q4,
-                            int scaled, ConvolveParams *conv_params,
+                            int_interpfilters interp_filters,
+                            const int subpel_x_qn, int x_step_q4,
+                            const int subpel_y_qn, int y_step_q4, int scaled,
+                            ConvolveParams *conv_params,
                             const struct scale_factors *sf, int is_intrabc);
 
 static INLINE ConvolveParams get_conv_params_no_round(int do_average, int plane,
@@ -111,7 +112,7 @@
 
 void av1_highbd_convolve_2d_facade(const uint8_t *src8, int src_stride,
                                    uint8_t *dst, int dst_stride, int w, int h,
-                                   InterpFilters interp_filters,
+                                   int_interpfilters interp_filters,
                                    const int subpel_x_qn, int x_step_q4,
                                    const int subpel_y_qn, int y_step_q4,
                                    int scaled, ConvolveParams *conv_params,
diff --git a/av1/common/filter.h b/av1/common/filter.h
index fa431fd..99b2e22 100644
--- a/av1/common/filter.h
+++ b/av1/common/filter.h
@@ -48,21 +48,28 @@
 // Pack two InterpFilter's into a uint32_t: since there are at most 10 filters,
 // we can use 16 bits for each and have more than enough space. This reduces
 // argument passing and unifies the operation of setting a (pair of) filters.
-typedef uint32_t InterpFilters;
-static INLINE InterpFilter av1_extract_interp_filter(InterpFilters filters,
-                                                     int x_filter) {
-  return (InterpFilter)((filters >> (x_filter ? 16 : 0)) & 0xf);
+typedef struct InterpFilters {
+  uint16_t y_filter;
+  uint16_t x_filter;
+} InterpFilters;
+
+typedef union int_interpfilters {
+  uint32_t as_int;
+  InterpFilters as_filters;
+} int_interpfilters;
+
+static INLINE InterpFilter av1_extract_interp_filter(int_interpfilters filters,
+                                                     int dir) {
+  return (InterpFilter)((dir) ? filters.as_filters.x_filter
+                              : filters.as_filters.y_filter);
 }
 
-static INLINE InterpFilters av1_make_interp_filters(InterpFilter y_filter,
-                                                    InterpFilter x_filter) {
-  uint16_t y16 = y_filter & 0xf;
-  uint16_t x16 = x_filter & 0xf;
-  return y16 | ((uint32_t)x16 << 16);
-}
-
-static INLINE InterpFilters av1_broadcast_interp_filter(InterpFilter filter) {
-  return av1_make_interp_filters(filter, filter);
+static INLINE int_interpfilters
+av1_broadcast_interp_filter(InterpFilter filter) {
+  int_interpfilters filters;
+  filters.as_filters.x_filter = filter;
+  filters.as_filters.y_filter = filter;
+  return filters;
 }
 
 static INLINE InterpFilter av1_unswitchable_filter(InterpFilter filter) {
diff --git a/av1/common/reconinter.c b/av1/common/reconinter.c
index 024cdcb..bd040cf 100644
--- a/av1/common/reconinter.c
+++ b/av1/common/reconinter.c
@@ -63,7 +63,7 @@
                               int dst_stride, const SubpelParams *subpel_params,
                               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,
                               const MB_MODE_INFO *mi, int build_for_obmc,
@@ -582,9 +582,9 @@
 void av1_make_masked_inter_predictor(
     const uint8_t *pre, int pre_stride, uint8_t *dst, int dst_stride,
     const SubpelParams *subpel_params, const struct scale_factors *sf, int w,
-    int h, ConvolveParams *conv_params, InterpFilters interp_filters, int plane,
-    const WarpTypesAllowed *warp_types, int p_col, int p_row, int ref,
-    MACROBLOCKD *xd, int can_use_previous) {
+    int h, ConvolveParams *conv_params, int_interpfilters interp_filters,
+    int plane, const WarpTypesAllowed *warp_types, int p_col, int p_row,
+    int ref, MACROBLOCKD *xd, int can_use_previous) {
   MB_MODE_INFO *mi = xd->mi[0];
   (void)dst;
   (void)dst_stride;
diff --git a/av1/common/reconinter.h b/av1/common/reconinter.h
index 0cf7ea3..7d69e2b 100644
--- a/av1/common/reconinter.h
+++ b/av1/common/reconinter.h
@@ -113,7 +113,7 @@
                                    const SubpelParams *subpel_params,
                                    const struct scale_factors *sf, int w, int h,
                                    ConvolveParams *conv_params,
-                                   InterpFilters interp_filters,
+                                   int_interpfilters interp_filters,
                                    int is_intrabc) {
   assert(conv_params->do_average == 0 || conv_params->do_average == 1);
   assert(sf);
@@ -138,7 +138,7 @@
                                           const SubpelParams *subpel_params,
                                           const struct scale_factors *sf, int w,
                                           int h, ConvolveParams *conv_params,
-                                          InterpFilters interp_filters,
+                                          int_interpfilters interp_filters,
                                           int is_intrabc, int bd) {
   assert(conv_params->do_average == 0 || conv_params->do_average == 1);
   assert(sf);
@@ -209,7 +209,7 @@
                               int dst_stride, const SubpelParams *subpel_params,
                               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,
                               const MB_MODE_INFO *mi, int build_for_obmc,
@@ -218,9 +218,9 @@
 void av1_make_masked_inter_predictor(
     const uint8_t *pre, int pre_stride, uint8_t *dst, int dst_stride,
     const SubpelParams *subpel_params, const struct scale_factors *sf, int w,
-    int h, ConvolveParams *conv_params, InterpFilters interp_filters, int plane,
-    const WarpTypesAllowed *warp_types, int p_col, int p_row, int ref,
-    MACROBLOCKD *xd, int can_use_previous);
+    int h, ConvolveParams *conv_params, int_interpfilters interp_filters,
+    int plane, const WarpTypesAllowed *warp_types, int p_col, int p_row,
+    int ref, MACROBLOCKD *xd, int can_use_previous);
 
 // TODO(jkoleszar): yet another mv clamping function :-(
 static INLINE MV clamp_mv_to_umv_border_sb(const MACROBLOCKD *xd,
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c
index 3880d54..c6f469b 100644
--- a/av1/decoder/decodemv.c
+++ b/av1/decoder/decodemv.c
@@ -1033,8 +1033,8 @@
       }
     }
     // The index system works as: (0, 1) -> (vertical, horizontal) filter types
-    mbmi->interp_filters =
-        av1_make_interp_filters(ref0_filter[0], ref0_filter[1]);
+    mbmi->interp_filters.as_filters.x_filter = ref0_filter[1];
+    mbmi->interp_filters.as_filters.y_filter = ref0_filter[0];
   }
 }
 
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 };