Add a conservative RD based active map in vp9.
Change-Id: I47b3c38aadfd8f3ea08515a18a5948aa1375c650
This commit is contained in:
@@ -2917,9 +2917,12 @@ static int64_t handle_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
|
||||
*rate2 += get_switchable_rate(x);
|
||||
|
||||
if (!is_comp_pred) {
|
||||
if (cpi->active_map_enabled && x->active_ptr[0] == 0)
|
||||
if (!x->in_active_map) {
|
||||
if (psse)
|
||||
*psse = 0;
|
||||
*distortion = 0;
|
||||
x->skip = 1;
|
||||
else if (cpi->allow_encode_breakout && x->encode_breakout) {
|
||||
} else if (cpi->allow_encode_breakout && x->encode_breakout) {
|
||||
const BLOCK_SIZE y_size = get_plane_block_size(bsize, &xd->plane[0]);
|
||||
const BLOCK_SIZE uv_size = get_plane_block_size(bsize, &xd->plane[1]);
|
||||
unsigned int var, sse;
|
||||
@@ -3162,7 +3165,7 @@ int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x,
|
||||
const int bhs = num_8x8_blocks_high_lookup[bsize] / 2;
|
||||
int best_skip2 = 0;
|
||||
int mode_skip_mask = 0;
|
||||
const int mode_skip_start = cpi->sf.mode_skip_start + 1;
|
||||
int mode_skip_start = cpi->sf.mode_skip_start + 1;
|
||||
const int *const rd_threshes = cpi->rd_threshes[segment_id][bsize];
|
||||
const int *const rd_thresh_freq_fact = cpi->rd_thresh_freq_fact[bsize];
|
||||
const int mode_search_skip_flags = cpi->sf.mode_search_skip_flags;
|
||||
@@ -3271,6 +3274,19 @@ int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x,
|
||||
mode_skip_mask |= 0xFF30808;
|
||||
}
|
||||
|
||||
if (!x->in_active_map) {
|
||||
int mode_index;
|
||||
assert(cpi->ref_frame_flags & VP9_LAST_FLAG);
|
||||
if (frame_mv[NEARESTMV][LAST_FRAME].as_int == 0)
|
||||
mode_index = THR_NEARESTMV;
|
||||
else if (frame_mv[NEARMV][LAST_FRAME].as_int == 0)
|
||||
mode_index = THR_NEARMV;
|
||||
else
|
||||
mode_index = THR_ZEROMV;
|
||||
mode_skip_mask = ~(1 << mode_index);
|
||||
mode_skip_start = MAX_MODES;
|
||||
}
|
||||
|
||||
for (mode_index = 0; mode_index < MAX_MODES; ++mode_index) {
|
||||
int mode_excluded = 0;
|
||||
int64_t this_rd = INT64_MAX;
|
||||
@@ -3360,8 +3376,11 @@ 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 (!(disable_inter_mode_mask & (1 << INTER_OFFSET(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 &&
|
||||
@@ -3400,7 +3419,7 @@ int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x,
|
||||
}
|
||||
|
||||
mbmi->mode = this_mode;
|
||||
mbmi->uv_mode = DC_PRED;
|
||||
mbmi->uv_mode = x->in_active_map ? DC_PRED : this_mode;
|
||||
mbmi->ref_frame[0] = ref_frame;
|
||||
mbmi->ref_frame[1] = second_ref_frame;
|
||||
// Evaluate all sub-pel filters irrespective of whether we can use
|
||||
@@ -3746,6 +3765,16 @@ int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x,
|
||||
vp9_zero(best_tx_diff);
|
||||
}
|
||||
|
||||
if (!x->in_active_map) {
|
||||
assert(mbmi->ref_frame[0] == LAST_FRAME);
|
||||
assert(mbmi->ref_frame[1] == NONE);
|
||||
assert(mbmi->mode == NEARESTMV ||
|
||||
mbmi->mode == NEARMV ||
|
||||
mbmi->mode == ZEROMV);
|
||||
assert(frame_mv[mbmi->mode][LAST_FRAME].as_int == 0);
|
||||
assert(mbmi->mode == mbmi->uv_mode);
|
||||
}
|
||||
|
||||
set_ref_ptrs(cm, xd, mbmi->ref_frame[0], mbmi->ref_frame[1]);
|
||||
store_coding_context(x, ctx, best_mode_index,
|
||||
&mbmi->ref_mvs[mbmi->ref_frame[0]][0],
|
||||
|
||||
Reference in New Issue
Block a user