Refactor out zero motion vector equivalence.
Change-Id: I6b20248b6f76545356f910ca6386f5466e287b6e
This commit is contained in:
parent
de3fc51712
commit
9fe1450da3
@ -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)
|
||||
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;
|
||||
} 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
!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;
|
||||
} 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mbmi->mode = this_mode;
|
||||
|
Loading…
Reference in New Issue
Block a user