Refactor out zero motion vector equivalence.

Change-Id: I6b20248b6f76545356f910ca6386f5466e287b6e
This commit is contained in:
Alex Converse 2014-03-25 14:16:11 -07:00
parent de3fc51712
commit 9fe1450da3

View File

@ -1669,6 +1669,45 @@ static INLINE int mv_has_subpel(const MV *mv) {
return (mv->row & 0x0F) || (mv->col & 0x0F);
}
// Check if NEARESTMV/NEARMV/ZEROMV is the cheapest way encode zero motion.
// TODO(aconverse): Find out if this is still productive then clean up or remove
static int check_best_zero_mv(
const VP9_COMP *cpi, const uint8_t mode_context[MAX_REF_FRAMES],
int_mv frame_mv[MB_MODE_COUNT][MAX_REF_FRAMES],
int disable_inter_mode_mask, int this_mode, int ref_frame,
int second_ref_frame) {
if (!(disable_inter_mode_mask & (1 << INTER_OFFSET(ZEROMV))) &&
(this_mode == NEARMV || this_mode == NEARESTMV || this_mode == ZEROMV) &&
frame_mv[this_mode][ref_frame].as_int == 0 &&
(second_ref_frame == NONE ||
frame_mv[this_mode][second_ref_frame].as_int == 0)) {
int rfc = mode_context[ref_frame];
int c1 = cost_mv_ref(cpi, NEARMV, rfc);
int c2 = cost_mv_ref(cpi, NEARESTMV, rfc);
int c3 = cost_mv_ref(cpi, ZEROMV, rfc);
if (this_mode == NEARMV) {
if (c1 > c3) return 0;
} else if (this_mode == NEARESTMV) {
if (c2 > c3) return 0;
} else {
assert(this_mode == ZEROMV);
if (second_ref_frame == NONE) {
if ((c3 >= c2 && frame_mv[NEARESTMV][ref_frame].as_int == 0) ||
(c3 >= c1 && frame_mv[NEARMV][ref_frame].as_int == 0))
return 0;
} else {
if ((c3 >= c2 && frame_mv[NEARESTMV][ref_frame].as_int == 0 &&
frame_mv[NEARESTMV][second_ref_frame].as_int == 0) ||
(c3 >= c1 && frame_mv[NEARMV][ref_frame].as_int == 0 &&
frame_mv[NEARMV][second_ref_frame].as_int == 0))
return 0;
}
}
}
return 1;
}
static void rd_check_segment_txsize(VP9_COMP *cpi, MACROBLOCK *x,
const TileInfo *const tile,
BEST_SEG_INFO *bsi_buf, int filter_idx,
@ -1737,43 +1776,11 @@ static void rd_check_segment_txsize(VP9_COMP *cpi, MACROBLOCK *x,
if (disable_inter_mode_mask & (1 << mode_idx))
continue;
// if we're near/nearest and mv == 0,0, compare to zeromv
if (!(disable_inter_mode_mask & (1 << INTER_OFFSET(ZEROMV))) &&
(this_mode == NEARMV || this_mode == NEARESTMV ||
this_mode == ZEROMV) &&
frame_mv[this_mode][mbmi->ref_frame[0]].as_int == 0 &&
(!has_second_rf ||
frame_mv[this_mode][mbmi->ref_frame[1]].as_int == 0)) {
int rfc = mbmi->mode_context[mbmi->ref_frame[0]];
int c1 = cost_mv_ref(cpi, NEARMV, rfc);
int c2 = cost_mv_ref(cpi, NEARESTMV, rfc);
int c3 = cost_mv_ref(cpi, ZEROMV, rfc);
if (this_mode == NEARMV) {
if (c1 > c3)
continue;
} else if (this_mode == NEARESTMV) {
if (c2 > c3)
continue;
} else {
assert(this_mode == ZEROMV);
if (!has_second_rf) {
if ((c3 >= c2 &&
frame_mv[NEARESTMV][mbmi->ref_frame[0]].as_int == 0) ||
(c3 >= c1 &&
frame_mv[NEARMV][mbmi->ref_frame[0]].as_int == 0))
continue;
} else {
if ((c3 >= c2 &&
frame_mv[NEARESTMV][mbmi->ref_frame[0]].as_int == 0 &&
frame_mv[NEARESTMV][mbmi->ref_frame[1]].as_int == 0) ||
(c3 >= c1 &&
frame_mv[NEARMV][mbmi->ref_frame[0]].as_int == 0 &&
frame_mv[NEARMV][mbmi->ref_frame[1]].as_int == 0))
continue;
}
}
}
if (!check_best_zero_mv(cpi, mbmi->mode_context, frame_mv,
disable_inter_mode_mask,
this_mode, mbmi->ref_frame[0],
mbmi->ref_frame[1]))
continue;
vpx_memcpy(orig_pre, pd->pre, sizeof(orig_pre));
vpx_memcpy(bsi->rdstat[i][mode_idx].ta, t_above,
@ -3371,46 +3378,12 @@ int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x,
}
}
} else {
// TODO(aconverse): Find out if this is still productive then clean up or
// remove
// if we're near/nearest and mv == 0,0, compare to zeromv
if (x->in_active_map &&
!(disable_inter_mode_mask & (1 << INTER_OFFSET(ZEROMV))) &&
(this_mode == NEARMV || this_mode == NEARESTMV ||
this_mode == ZEROMV) &&
frame_mv[this_mode][ref_frame].as_int == 0 &&
!vp9_segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP) &&
(!comp_pred || frame_mv[this_mode][second_ref_frame].as_int == 0)) {
int rfc = mbmi->mode_context[ref_frame];
int c1 = cost_mv_ref(cpi, NEARMV, rfc);
int c2 = cost_mv_ref(cpi, NEARESTMV, rfc);
int c3 = cost_mv_ref(cpi, ZEROMV, rfc);
if (this_mode == NEARMV) {
if (c1 > c3)
continue;
} else if (this_mode == NEARESTMV) {
if (c2 > c3)
continue;
} else {
assert(this_mode == ZEROMV);
if (!comp_pred) {
if ((c3 >= c2 &&
frame_mv[NEARESTMV][ref_frame].as_int == 0) ||
(c3 >= c1 &&
frame_mv[NEARMV][ref_frame].as_int == 0))
continue;
} else {
if ((c3 >= c2 &&
frame_mv[NEARESTMV][ref_frame].as_int == 0 &&
frame_mv[NEARESTMV][second_ref_frame].as_int == 0) ||
(c3 >= c1 &&
frame_mv[NEARMV][ref_frame].as_int == 0 &&
frame_mv[NEARMV][second_ref_frame].as_int == 0))
continue;
}
}
}
!vp9_segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP))
if (!check_best_zero_mv(cpi, mbmi->mode_context, frame_mv,
disable_inter_mode_mask, this_mode, ref_frame,
second_ref_frame))
continue;
}
mbmi->mode = this_mode;