Refactor read_mb_interp_filter
Move detail logic of reading interp_filter type from
read_inter_block_mode_info to read_mb_interp_filter
Change-Id: I2880488acbd994ead3bed4ae94eaae017e33546b
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c
index fc1c8e9..a788b54 100644
--- a/av1/decoder/decodemv.c
+++ b/av1/decoder/decodemv.c
@@ -1034,37 +1034,66 @@
}
}
-static INLINE InterpFilter read_mb_interp_filter(AV1_COMMON *const cm,
- MACROBLOCKD *const xd,
+static INLINE void read_mb_interp_filter(AV1_COMMON *const cm,
+ MACROBLOCKD *const xd,
+ MB_MODE_INFO *const mbmi,
+ aom_reader *r) {
+ FRAME_COUNTS *counts = xd->counts;
#if CONFIG_DUAL_FILTER
- int dir,
-#endif
- aom_reader *r) {
-#if CONFIG_EXT_INTERP
- if (!av1_is_interp_needed(xd)) return EIGHTTAP_REGULAR;
-#endif
+ int dir;
if (cm->interp_filter != SWITCHABLE) {
- return cm->interp_filter;
+ for (dir = 0; dir < 4; ++dir) mbmi->interp_filter[dir] = cm->interp_filter;
} else {
-#if CONFIG_DUAL_FILTER
- const int ctx = av1_get_pred_context_switchable_interp(xd, dir);
-#else
- const int ctx = av1_get_pred_context_switchable_interp(xd);
-#endif
- FRAME_COUNTS *counts = xd->counts;
+ for (dir = 0; dir < 2; ++dir) {
+ const int ctx = av1_get_pred_context_switchable_interp(xd, dir);
+ mbmi->interp_filter[dir] = EIGHTTAP_REGULAR;
+
+ if (has_subpel_mv_component(xd->mi[0], xd, dir) ||
+ (mbmi->ref_frame[1] > INTRA_FRAME &&
+ has_subpel_mv_component(xd->mi[0], xd, dir + 2))) {
#if CONFIG_DAALA_EC
- const InterpFilter type =
+ mbmi->interp_filter[dir] =
+ (InterpFilter)av1_switchable_interp_inv[aom_read_symbol(
+ r, cm->fc->switchable_interp_cdf[ctx], SWITCHABLE_FILTERS,
+ ACCT_STR)];
+#else
+ mbmi->interp_filter[dir] = (InterpFilter)aom_read_tree(
+ r, av1_switchable_interp_tree, cm->fc->switchable_interp_prob[ctx],
+ ACCT_STR);
+#endif
+ if (counts) ++counts->switchable_interp[ctx][mbmi->interp_filter[dir]];
+ }
+ }
+ // The index system works as:
+ // (0, 1) -> (vertical, horizontal) filter types for the first ref frame.
+ // (2, 3) -> (vertical, horizontal) filter types for the second ref frame.
+ mbmi->interp_filter[2] = mbmi->interp_filter[0];
+ mbmi->interp_filter[3] = mbmi->interp_filter[1];
+ }
+#else // CONFIG_DUAL_FILTER
+#if CONFIG_EXT_INTERP
+ if (!av1_is_interp_needed(xd)) {
+ mbmi->interp_filter = EIGHTTAP_REGULAR;
+ return;
+ }
+#endif // CONFIG_EXT_INTERP
+ if (cm->interp_filter != SWITCHABLE) {
+ mbmi->interp_filter = cm->interp_filter;
+ } else {
+ const int ctx = av1_get_pred_context_switchable_interp(xd);
+#if CONFIG_DAALA_EC
+ mbmi->interp_filter =
(InterpFilter)av1_switchable_interp_inv[aom_read_symbol(
r, cm->fc->switchable_interp_cdf[ctx], SWITCHABLE_FILTERS,
ACCT_STR)];
#else
- const InterpFilter type = (InterpFilter)aom_read_tree(
+ mbmi->interp_filter = (InterpFilter)aom_read_tree(
r, av1_switchable_interp_tree, cm->fc->switchable_interp_prob[ctx],
ACCT_STR);
#endif
- if (counts) ++counts->switchable_interp[ctx][type];
- return type;
+ if (counts) ++counts->switchable_interp[ctx][mbmi->interp_filter];
}
+#endif // CONFIG_DUAL_FILTER
}
static void read_intra_block_mode_info(AV1_COMMON *const cm,
@@ -1563,7 +1592,7 @@
#endif
#if !CONFIG_EXT_INTERP && !CONFIG_DUAL_FILTER
- mbmi->interp_filter = read_mb_interp_filter(cm, xd, r);
+ read_mb_interp_filter(cm, xd, mbmi, r);
#endif // !CONFIG_EXT_INTERP && !CONFIG_DUAL_FILTER
if (bsize < BLOCK_8X8) {
@@ -1778,27 +1807,9 @@
}
#endif // CONFIG_EXT_INTER
-#if CONFIG_DUAL_FILTER
- for (ref = 0; ref < 2; ++ref) {
- mbmi->interp_filter[ref] = (cm->interp_filter == SWITCHABLE)
- ? EIGHTTAP_REGULAR
- : cm->interp_filter;
-
- if (has_subpel_mv_component(xd->mi[0], xd, ref) ||
- (mbmi->ref_frame[1] > INTRA_FRAME &&
- has_subpel_mv_component(xd->mi[0], xd, ref + 2)))
- mbmi->interp_filter[ref] = read_mb_interp_filter(cm, xd, ref, r);
- }
- // The index system worsk as:
- // (0, 1) -> (vertical, horizontal) filter types for the first ref frame.
- // (2, 3) -> (vertical, horizontal) filter types for the second ref frame.
- mbmi->interp_filter[2] = mbmi->interp_filter[0];
- mbmi->interp_filter[3] = mbmi->interp_filter[1];
-#else
-#if CONFIG_EXT_INTERP
- mbmi->interp_filter = read_mb_interp_filter(cm, xd, r);
-#endif // CONFIG_EXT_INTERP
-#endif // CONFIG_DUAL_FILTER
+#if CONFIG_DUAL_FILTER || CONFIG_EXT_INTERP
+ read_mb_interp_filter(cm, xd, mbmi, r);
+#endif // CONFIG_DUAL_FILTER || CONFIG_EXT_INTERP
}
static void read_inter_frame_mode_info(AV1Decoder *const pbi,