vp9: Reuse motion from choose_partitioning in NEWMV search.
When int_pro_motion_estimation is done for superblock in choose_partitioning, use it to avoid the full_pixel_search for NEWMV mode, if bsize is >= 32X32. For speed > 7. Small/neutral change on RTC metrics. ~1-2% speedup on arm on high motion clip. Change-Id: I3cfe6833ff4bf75d4afa83eaf058ad45729de85b
This commit is contained in:
parent
9223b947ca
commit
0c9e2f4c15
@ -172,6 +172,12 @@ struct macroblock {
|
|||||||
|
|
||||||
uint8_t last_sb_high_content;
|
uint8_t last_sb_high_content;
|
||||||
|
|
||||||
|
int sb_use_mv_part;
|
||||||
|
|
||||||
|
int sb_mvcol_part;
|
||||||
|
|
||||||
|
int sb_mvrow_part;
|
||||||
|
|
||||||
// For each superblock: saves the content value (e.g., low/high sad/sumdiff)
|
// For each superblock: saves the content value (e.g., low/high sad/sumdiff)
|
||||||
// based on source sad, prior to encoding the frame.
|
// based on source sad, prior to encoding the frame.
|
||||||
uint8_t content_state_sb;
|
uint8_t content_state_sb;
|
||||||
|
@ -1090,6 +1090,7 @@ static int choose_partitioning(VP9_COMP *cpi, const TileInfo *const tile,
|
|||||||
// If source_sad is low copy the partition without computing the y_sad.
|
// If source_sad is low copy the partition without computing the y_sad.
|
||||||
if (x->skip_low_source_sad && cpi->sf.copy_partition_flag &&
|
if (x->skip_low_source_sad && cpi->sf.copy_partition_flag &&
|
||||||
copy_partitioning(cpi, x, xd, mi_row, mi_col, segment_id, sb_offset)) {
|
copy_partitioning(cpi, x, xd, mi_row, mi_col, segment_id, sb_offset)) {
|
||||||
|
x->sb_use_mv_part = 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1166,12 +1167,17 @@ static int choose_partitioning(VP9_COMP *cpi, const TileInfo *const tile,
|
|||||||
mi->mv[0].as_int = 0;
|
mi->mv[0].as_int = 0;
|
||||||
mi->interp_filter = BILINEAR;
|
mi->interp_filter = BILINEAR;
|
||||||
|
|
||||||
if (cpi->oxcf.speed >= 8 && !low_res && x->content_state_sb != kVeryHighSad)
|
if (cpi->oxcf.speed >= 8 && !low_res &&
|
||||||
|
x->content_state_sb != kVeryHighSad) {
|
||||||
y_sad = cpi->fn_ptr[bsize].sdf(
|
y_sad = cpi->fn_ptr[bsize].sdf(
|
||||||
x->plane[0].src.buf, x->plane[0].src.stride, xd->plane[0].pre[0].buf,
|
x->plane[0].src.buf, x->plane[0].src.stride, xd->plane[0].pre[0].buf,
|
||||||
xd->plane[0].pre[0].stride);
|
xd->plane[0].pre[0].stride);
|
||||||
else
|
} else {
|
||||||
y_sad = vp9_int_pro_motion_estimation(cpi, x, bsize, mi_row, mi_col);
|
y_sad = vp9_int_pro_motion_estimation(cpi, x, bsize, mi_row, mi_col);
|
||||||
|
x->sb_use_mv_part = 1;
|
||||||
|
x->sb_mvcol_part = mi->mv[0].as_mv.col;
|
||||||
|
x->sb_mvrow_part = mi->mv[0].as_mv.row;
|
||||||
|
}
|
||||||
|
|
||||||
y_sad_last = y_sad;
|
y_sad_last = y_sad;
|
||||||
// Pick ref frame for partitioning, bias last frame when y_sad_g and y_sad
|
// Pick ref frame for partitioning, bias last frame when y_sad_g and y_sad
|
||||||
@ -4145,6 +4151,9 @@ static void encode_nonrd_sb_row(VP9_COMP *cpi, ThreadData *td,
|
|||||||
x->skip_low_source_sad = 0;
|
x->skip_low_source_sad = 0;
|
||||||
x->lowvar_highsumdiff = 0;
|
x->lowvar_highsumdiff = 0;
|
||||||
x->content_state_sb = 0;
|
x->content_state_sb = 0;
|
||||||
|
x->sb_use_mv_part = 0;
|
||||||
|
x->sb_mvcol_part = 0;
|
||||||
|
x->sb_mvrow_part = 0;
|
||||||
|
|
||||||
if (seg->enabled) {
|
if (seg->enabled) {
|
||||||
const uint8_t *const map =
|
const uint8_t *const map =
|
||||||
|
@ -193,9 +193,14 @@ static int combined_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
|
|||||||
else
|
else
|
||||||
center_mv = tmp_mv->as_mv;
|
center_mv = tmp_mv->as_mv;
|
||||||
|
|
||||||
vp9_full_pixel_search(
|
if (x->sb_use_mv_part) {
|
||||||
cpi, x, bsize, &mvp_full, step_param, cpi->sf.mv.search_method, sadpb,
|
tmp_mv->as_mv.row = x->sb_mvrow_part >> 3;
|
||||||
cond_cost_list(cpi, cost_list), ¢er_mv, &tmp_mv->as_mv, INT_MAX, 0);
|
tmp_mv->as_mv.col = x->sb_mvcol_part >> 3;
|
||||||
|
} else {
|
||||||
|
vp9_full_pixel_search(
|
||||||
|
cpi, x, bsize, &mvp_full, step_param, cpi->sf.mv.search_method, sadpb,
|
||||||
|
cond_cost_list(cpi, cost_list), ¢er_mv, &tmp_mv->as_mv, INT_MAX, 0);
|
||||||
|
}
|
||||||
|
|
||||||
x->mv_limits = tmp_mv_limits;
|
x->mv_limits = tmp_mv_limits;
|
||||||
|
|
||||||
@ -1628,6 +1633,8 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, TileDataEnc *tile_data,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cpi->oxcf.speed <= 7 || bsize < BLOCK_32X32) x->sb_use_mv_part = 0;
|
||||||
|
|
||||||
for (idx = 0; idx < RT_INTER_MODES; ++idx) {
|
for (idx = 0; idx < RT_INTER_MODES; ++idx) {
|
||||||
int rate_mv = 0;
|
int rate_mv = 0;
|
||||||
int mode_rd_thresh;
|
int mode_rd_thresh;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user