Apply constrained partition search range to non-RD mode decision
This commit enables a chessboard pattern for partition search. All the black blocks run regular partition search ranging from 8x8 to 32x32. The rest white blocks take the nearby blocks' information to adaptively decide the effective search range. The compression performance for rtc set at speed -5 is down by 1.5%. For pedestrian 1080p at speed -5, the runtime goes from 41594 ms to 39697 ms, i.e., about 5% faster. Change-Id: Ia4b96e237abfaada487c743bca08fe1afd298685
This commit is contained in:
Родитель
ff3baaef94
Коммит
734c5ffa2c
|
@ -1871,6 +1871,67 @@ static void rd_auto_partition_range(VP9_COMP *cpi, const TileInfo *const tile,
|
|||
*max_block_size = max_size;
|
||||
}
|
||||
|
||||
static void auto_partition_range(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
int mi_row, int mi_col,
|
||||
BLOCK_SIZE *min_block_size,
|
||||
BLOCK_SIZE *max_block_size) {
|
||||
VP9_COMMON *const cm = &cpi->common;
|
||||
MACROBLOCKD *const xd = &cpi->mb.e_mbd;
|
||||
MODE_INFO **mi_8x8 = xd->mi;
|
||||
const int left_in_image = xd->left_available && mi_8x8[-1];
|
||||
const int above_in_image = xd->up_available &&
|
||||
mi_8x8[-xd->mi_stride];
|
||||
int row8x8_remaining = tile->mi_row_end - mi_row;
|
||||
int col8x8_remaining = tile->mi_col_end - mi_col;
|
||||
int bh, bw;
|
||||
BLOCK_SIZE min_size = BLOCK_32X32;
|
||||
BLOCK_SIZE max_size = BLOCK_8X8;
|
||||
int bsl = mi_width_log2_lookup[BLOCK_64X64];
|
||||
int search_range_ctrl = (((mi_row + mi_col) >> bsl) +
|
||||
cpi->sf.chessboard_index) & 0x01;
|
||||
// Trap case where we do not have a prediction.
|
||||
if (search_range_ctrl &&
|
||||
(left_in_image || above_in_image || cm->frame_type != KEY_FRAME)) {
|
||||
int block;
|
||||
MODE_INFO **mi;
|
||||
BLOCK_SIZE sb_type;
|
||||
|
||||
// Find the min and max partition sizes used in the left SB64.
|
||||
if (left_in_image) {
|
||||
MODE_INFO *cur_mi;
|
||||
mi = &mi_8x8[-1];
|
||||
for (block = 0; block < MI_BLOCK_SIZE; ++block) {
|
||||
cur_mi = mi[block * xd->mi_stride];
|
||||
sb_type = cur_mi ? cur_mi->mbmi.sb_type : 0;
|
||||
min_size = MIN(min_size, sb_type);
|
||||
max_size = MAX(max_size, sb_type);
|
||||
}
|
||||
}
|
||||
// Find the min and max partition sizes used in the above SB64.
|
||||
if (above_in_image) {
|
||||
mi = &mi_8x8[-xd->mi_stride * MI_BLOCK_SIZE];
|
||||
for (block = 0; block < MI_BLOCK_SIZE; ++block) {
|
||||
sb_type = mi[block] ? mi[block]->mbmi.sb_type : 0;
|
||||
min_size = MIN(min_size, sb_type);
|
||||
max_size = MAX(max_size, sb_type);
|
||||
}
|
||||
}
|
||||
|
||||
min_size = min_partition_size[min_size];
|
||||
max_size = find_partition_size(max_size, row8x8_remaining, col8x8_remaining,
|
||||
&bh, &bw);
|
||||
min_size = MIN(min_size, max_size);
|
||||
min_size = MAX(min_size, BLOCK_8X8);
|
||||
max_size = MIN(max_size, BLOCK_32X32);
|
||||
} else {
|
||||
min_size = BLOCK_8X8;
|
||||
max_size = BLOCK_32X32;
|
||||
}
|
||||
|
||||
*min_block_size = min_size;
|
||||
*max_block_size = max_size;
|
||||
}
|
||||
|
||||
static INLINE void store_pred_mv(MACROBLOCK *x, PICK_MODE_CONTEXT *ctx) {
|
||||
vpx_memcpy(ctx->pred_mv, x->pred_mv, sizeof(x->pred_mv));
|
||||
}
|
||||
|
@ -2623,9 +2684,7 @@ static void nonrd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
|||
|
||||
if (mi_row + y_idx >= cm->mi_rows || mi_col + x_idx >= cm->mi_cols)
|
||||
continue;
|
||||
|
||||
load_pred_mv(x, ctx);
|
||||
|
||||
nonrd_pick_partition(cpi, tile, tp, mi_row + y_idx, mi_col + x_idx,
|
||||
subsize, &this_rate, &this_dist, 0,
|
||||
best_rd - sum_rd, pc_tree->split[i]);
|
||||
|
@ -2915,6 +2974,10 @@ static void encode_nonrd_sb_row(VP9_COMP *cpi, const TileInfo *const tile,
|
|||
case REFERENCE_PARTITION:
|
||||
if (cpi->sf.partition_check ||
|
||||
!is_background(cpi, tile, mi_row, mi_col)) {
|
||||
set_modeinfo_offsets(cm, xd, mi_row, mi_col);
|
||||
auto_partition_range(cpi, tile, mi_row, mi_col,
|
||||
&cpi->sf.min_partition_size,
|
||||
&cpi->sf.max_partition_size);
|
||||
nonrd_pick_partition(cpi, tile, tp, mi_row, mi_col, BLOCK_64X64,
|
||||
&dummy_rate, &dummy_dist, 1, INT64_MAX,
|
||||
x->pc_root);
|
||||
|
|
Загрузка…
Ссылка в новой задаче