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
This commit is contained in:
Angie Chiang 2016-11-21 11:13:19 -08:00
Родитель 4ce287aa33
Коммит 9c4f895c9c
1 изменённых файлов: 52 добавлений и 41 удалений

Просмотреть файл

@ -1034,37 +1034,66 @@ static void read_ref_frames(AV1_COMMON *const cm, MACROBLOCKD *const xd,
}
}
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 @@ static void read_inter_block_mode_info(AV1Decoder *const pbi,
#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 @@ static void read_inter_block_mode_info(AV1Decoder *const pbi,
}
#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,