Refactor encoder tile data structure
Make the common tile info as one element in the encoder tile data struct. Change-Id: I8c474b4ba67ee3e2c86ab164f353ff71ea9992be
This commit is contained in:
parent
192010d218
commit
d56b3eb0cf
@ -929,13 +929,11 @@ static int get_refresh_mask(VP9_COMP *cpi) {
|
||||
static size_t encode_tiles(VP9_COMP *cpi, uint8_t *data_ptr) {
|
||||
VP9_COMMON *const cm = &cpi->common;
|
||||
vp9_writer residual_bc;
|
||||
|
||||
int tile_row, tile_col;
|
||||
TOKENEXTRA *tok[4][1 << 6], *tok_end;
|
||||
size_t total_size = 0;
|
||||
const int tile_cols = 1 << cm->log2_tile_cols;
|
||||
const int tile_rows = 1 << cm->log2_tile_rows;
|
||||
TileInfo tile[4][1 << 6];
|
||||
TOKENEXTRA *pre_tok = cpi->tok;
|
||||
int tile_tok = 0;
|
||||
|
||||
@ -944,18 +942,16 @@ static size_t encode_tiles(VP9_COMP *cpi, uint8_t *data_ptr) {
|
||||
|
||||
for (tile_row = 0; tile_row < tile_rows; ++tile_row) {
|
||||
for (tile_col = 0; tile_col < tile_cols; ++tile_col) {
|
||||
vp9_tile_init(&tile[tile_row][tile_col], cm, tile_row, tile_col);
|
||||
|
||||
int tile_idx = tile_row * tile_cols + tile_col;
|
||||
tok[tile_row][tile_col] = pre_tok + tile_tok;
|
||||
pre_tok = tok[tile_row][tile_col];
|
||||
tile_tok = allocated_tokens(tile[tile_row][tile_col]);
|
||||
tile_tok = allocated_tokens(cpi->tile_data[tile_idx].tile_info);
|
||||
}
|
||||
}
|
||||
|
||||
for (tile_row = 0; tile_row < tile_rows; tile_row++) {
|
||||
for (tile_col = 0; tile_col < tile_cols; tile_col++) {
|
||||
const TileInfo * const ptile = &tile[tile_row][tile_col];
|
||||
|
||||
int tile_idx = tile_row * tile_cols + tile_col;
|
||||
tok_end = tok[tile_row][tile_col] + cpi->tok_count[tile_row][tile_col];
|
||||
|
||||
if (tile_col < tile_cols - 1 || tile_row < tile_rows - 1)
|
||||
@ -963,7 +959,8 @@ static size_t encode_tiles(VP9_COMP *cpi, uint8_t *data_ptr) {
|
||||
else
|
||||
vp9_start_encode(&residual_bc, data_ptr + total_size);
|
||||
|
||||
write_modes(cpi, ptile, &residual_bc, &tok[tile_row][tile_col], tok_end);
|
||||
write_modes(cpi, &cpi->tile_data[tile_idx].tile_info,
|
||||
&residual_bc, &tok[tile_row][tile_col], tok_end);
|
||||
assert(tok[tile_row][tile_col] == tok_end);
|
||||
vp9_stop_encode(&residual_bc);
|
||||
if (tile_col < tile_cols - 1 || tile_row < tile_rows - 1) {
|
||||
|
@ -780,12 +780,13 @@ static void set_mode_info_seg_skip(MACROBLOCK *x, TX_MODE tx_mode,
|
||||
vp9_rd_cost_init(rd_cost);
|
||||
}
|
||||
|
||||
static void rd_pick_sb_modes(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
static void rd_pick_sb_modes(VP9_COMP *cpi,
|
||||
TileDataEnc *tile_data,
|
||||
int mi_row, int mi_col, RD_COST *rd_cost,
|
||||
BLOCK_SIZE bsize, PICK_MODE_CONTEXT *ctx,
|
||||
int64_t best_rd) {
|
||||
VP9_COMMON *const cm = &cpi->common;
|
||||
TileInfo *const tile_info = &tile_data->tile_info;
|
||||
MACROBLOCK *const x = &cpi->mb;
|
||||
MACROBLOCKD *const xd = &x->e_mbd;
|
||||
MB_MODE_INFO *mbmi;
|
||||
@ -801,7 +802,7 @@ static void rd_pick_sb_modes(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
// Use the lower precision, but faster, 32x32 fdct for mode selection.
|
||||
x->use_lp32x32fdct = 1;
|
||||
|
||||
set_offsets(cpi, tile, mi_row, mi_col, bsize);
|
||||
set_offsets(cpi, tile_info, mi_row, mi_col, bsize);
|
||||
mbmi = &xd->mi[0].src_mi->mbmi;
|
||||
mbmi->sb_type = bsize;
|
||||
|
||||
@ -876,10 +877,10 @@ static void rd_pick_sb_modes(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
vp9_rd_pick_inter_mode_sb_seg_skip(cpi, tile_data, x, rd_cost, bsize,
|
||||
ctx, best_rd);
|
||||
else
|
||||
vp9_rd_pick_inter_mode_sb(cpi, tile_data, x, tile, mi_row, mi_col,
|
||||
vp9_rd_pick_inter_mode_sb(cpi, tile_data, x, mi_row, mi_col,
|
||||
rd_cost, bsize, ctx, best_rd);
|
||||
} else {
|
||||
vp9_rd_pick_inter_mode_sub8x8(cpi, tile_data, x, tile, mi_row, mi_col,
|
||||
vp9_rd_pick_inter_mode_sub8x8(cpi, tile_data, x, mi_row, mi_col,
|
||||
rd_cost, bsize, ctx, best_rd);
|
||||
}
|
||||
}
|
||||
@ -1423,13 +1424,15 @@ static void encode_sb_rt(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
update_partition_context(xd, mi_row, mi_col, subsize, bsize);
|
||||
}
|
||||
|
||||
static void rd_use_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
static void rd_use_partition(VP9_COMP *cpi,
|
||||
TileDataEnc *tile_data,
|
||||
MODE_INFO *mi_8x8, TOKENEXTRA **tp,
|
||||
int mi_row, int mi_col,
|
||||
BLOCK_SIZE bsize, int *rate, int64_t *dist,
|
||||
BLOCK_SIZE bsize,
|
||||
int *rate, int64_t *dist,
|
||||
int do_recon, PC_TREE *pc_tree) {
|
||||
VP9_COMMON *const cm = &cpi->common;
|
||||
TileInfo *const tile_info = &tile_data->tile_info;
|
||||
MACROBLOCK *const x = &cpi->mb;
|
||||
MACROBLOCKD *const xd = &x->e_mbd;
|
||||
const int mis = cm->mi_stride;
|
||||
@ -1465,7 +1468,7 @@ static void rd_use_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
save_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize);
|
||||
|
||||
if (bsize == BLOCK_16X16 && cpi->oxcf.aq_mode) {
|
||||
set_offsets(cpi, tile, mi_row, mi_col, bsize);
|
||||
set_offsets(cpi, tile_info, mi_row, mi_col, bsize);
|
||||
x->mb_energy = vp9_block_energy(cpi, x, bsize);
|
||||
}
|
||||
|
||||
@ -1491,7 +1494,7 @@ static void rd_use_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
mi_row + (mi_step >> 1) < cm->mi_rows &&
|
||||
mi_col + (mi_step >> 1) < cm->mi_cols) {
|
||||
pc_tree->partitioning = PARTITION_NONE;
|
||||
rd_pick_sb_modes(cpi, tile, tile_data, mi_row, mi_col, &none_rdc, bsize,
|
||||
rd_pick_sb_modes(cpi, tile_data, mi_row, mi_col, &none_rdc, bsize,
|
||||
ctx, INT64_MAX);
|
||||
|
||||
pl = partition_plane_context(xd, mi_row, mi_col, bsize);
|
||||
@ -1510,11 +1513,11 @@ static void rd_use_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
|
||||
switch (partition) {
|
||||
case PARTITION_NONE:
|
||||
rd_pick_sb_modes(cpi, tile, tile_data, mi_row, mi_col, &last_part_rdc,
|
||||
rd_pick_sb_modes(cpi, tile_data, mi_row, mi_col, &last_part_rdc,
|
||||
bsize, ctx, INT64_MAX);
|
||||
break;
|
||||
case PARTITION_HORZ:
|
||||
rd_pick_sb_modes(cpi, tile, tile_data, mi_row, mi_col, &last_part_rdc,
|
||||
rd_pick_sb_modes(cpi, tile_data, mi_row, mi_col, &last_part_rdc,
|
||||
subsize, &pc_tree->horizontal[0],
|
||||
INT64_MAX);
|
||||
if (last_part_rdc.rate != INT_MAX &&
|
||||
@ -1524,7 +1527,7 @@ static void rd_use_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
vp9_rd_cost_init(&tmp_rdc);
|
||||
update_state(cpi, ctx, mi_row, mi_col, subsize, 0);
|
||||
encode_superblock(cpi, tp, 0, mi_row, mi_col, subsize, ctx);
|
||||
rd_pick_sb_modes(cpi, tile, tile_data,
|
||||
rd_pick_sb_modes(cpi, tile_data,
|
||||
mi_row + (mi_step >> 1), mi_col, &tmp_rdc,
|
||||
subsize, &pc_tree->horizontal[1], INT64_MAX);
|
||||
if (tmp_rdc.rate == INT_MAX || tmp_rdc.dist == INT64_MAX) {
|
||||
@ -1537,7 +1540,7 @@ static void rd_use_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
}
|
||||
break;
|
||||
case PARTITION_VERT:
|
||||
rd_pick_sb_modes(cpi, tile, tile_data, mi_row, mi_col, &last_part_rdc,
|
||||
rd_pick_sb_modes(cpi, tile_data, mi_row, mi_col, &last_part_rdc,
|
||||
subsize, &pc_tree->vertical[0], INT64_MAX);
|
||||
if (last_part_rdc.rate != INT_MAX &&
|
||||
bsize >= BLOCK_8X8 && mi_col + (mi_step >> 1) < cm->mi_cols) {
|
||||
@ -1546,7 +1549,7 @@ static void rd_use_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
vp9_rd_cost_init(&tmp_rdc);
|
||||
update_state(cpi, ctx, mi_row, mi_col, subsize, 0);
|
||||
encode_superblock(cpi, tp, 0, mi_row, mi_col, subsize, ctx);
|
||||
rd_pick_sb_modes(cpi, tile, tile_data,
|
||||
rd_pick_sb_modes(cpi, tile_data,
|
||||
mi_row, mi_col + (mi_step >> 1), &tmp_rdc,
|
||||
subsize, &pc_tree->vertical[bsize > BLOCK_8X8],
|
||||
INT64_MAX);
|
||||
@ -1561,7 +1564,7 @@ static void rd_use_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
break;
|
||||
case PARTITION_SPLIT:
|
||||
if (bsize == BLOCK_8X8) {
|
||||
rd_pick_sb_modes(cpi, tile, tile_data, mi_row, mi_col, &last_part_rdc,
|
||||
rd_pick_sb_modes(cpi, tile_data, mi_row, mi_col, &last_part_rdc,
|
||||
subsize, pc_tree->leaf_split[0], INT64_MAX);
|
||||
break;
|
||||
}
|
||||
@ -1577,7 +1580,7 @@ static void rd_use_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
continue;
|
||||
|
||||
vp9_rd_cost_init(&tmp_rdc);
|
||||
rd_use_partition(cpi, tile, tile_data,
|
||||
rd_use_partition(cpi, tile_data,
|
||||
mi_8x8 + jj * bss * mis + ii * bss, tp,
|
||||
mi_row + y_idx, mi_col + x_idx, subsize,
|
||||
&tmp_rdc.rate, &tmp_rdc.dist,
|
||||
@ -1629,7 +1632,7 @@ static void rd_use_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
|
||||
save_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize);
|
||||
pc_tree->split[i]->partitioning = PARTITION_NONE;
|
||||
rd_pick_sb_modes(cpi, tile, tile_data,
|
||||
rd_pick_sb_modes(cpi, tile_data,
|
||||
mi_row + y_idx, mi_col + x_idx, &tmp_rdc,
|
||||
split_subsize, &pc_tree->split[i]->none, INT64_MAX);
|
||||
|
||||
@ -1644,7 +1647,7 @@ static void rd_use_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
chosen_rdc.dist += tmp_rdc.dist;
|
||||
|
||||
if (i != 3)
|
||||
encode_sb(cpi, tile, tp, mi_row + y_idx, mi_col + x_idx, 0,
|
||||
encode_sb(cpi, tile_info, tp, mi_row + y_idx, mi_col + x_idx, 0,
|
||||
split_subsize, pc_tree->split[i]);
|
||||
|
||||
pl = partition_plane_context(xd, mi_row + y_idx, mi_col + x_idx,
|
||||
@ -1694,7 +1697,7 @@ static void rd_use_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ)
|
||||
vp9_cyclic_refresh_set_rate_and_dist_sb(cpi->cyclic_refresh,
|
||||
chosen_rdc.rate, chosen_rdc.dist);
|
||||
encode_sb(cpi, tile, tp, mi_row, mi_col, output_enabled, bsize,
|
||||
encode_sb(cpi, tile_info, tp, mi_row, mi_col, output_enabled, bsize,
|
||||
pc_tree);
|
||||
}
|
||||
|
||||
@ -2027,12 +2030,13 @@ static INLINE int get_motion_inconsistency(MOTION_DIRECTION this_mv,
|
||||
// TODO(jingning,jimbankoski,rbultje): properly skip partition types that are
|
||||
// unlikely to be selected depending on previous rate-distortion optimization
|
||||
// results, for encoding speed-up.
|
||||
static void rd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
static void rd_pick_partition(VP9_COMP *cpi,
|
||||
TileDataEnc *tile_data,
|
||||
TOKENEXTRA **tp, int mi_row, int mi_col,
|
||||
BLOCK_SIZE bsize, RD_COST *rd_cost,
|
||||
int64_t best_rd, PC_TREE *pc_tree) {
|
||||
VP9_COMMON *const cm = &cpi->common;
|
||||
TileInfo *const tile_info = &tile_data->tile_info;
|
||||
MACROBLOCK *const x = &cpi->mb;
|
||||
MACROBLOCKD *const xd = &x->e_mbd;
|
||||
const int mi_step = num_8x8_blocks_wide_lookup[bsize] / 2;
|
||||
@ -2075,7 +2079,7 @@ static void rd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
vp9_rd_cost_reset(&best_rdc);
|
||||
best_rdc.rdcost = best_rd;
|
||||
|
||||
set_offsets(cpi, tile, mi_row, mi_col, bsize);
|
||||
set_offsets(cpi, tile_info, mi_row, mi_col, bsize);
|
||||
|
||||
if (bsize == BLOCK_16X16 && cpi->oxcf.aq_mode)
|
||||
x->mb_energy = vp9_block_energy(cpi, x, bsize);
|
||||
@ -2107,7 +2111,7 @@ static void rd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
|
||||
#if CONFIG_FP_MB_STATS
|
||||
if (cpi->use_fp_mb_stats) {
|
||||
set_offsets(cpi, tile, mi_row, mi_col, bsize);
|
||||
set_offsets(cpi, tile_info, mi_row, mi_col, bsize);
|
||||
src_diff_var = get_sby_perpixel_diff_variance(cpi, &cpi->mb.plane[0].src,
|
||||
mi_row, mi_col, bsize);
|
||||
}
|
||||
@ -2166,7 +2170,7 @@ static void rd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
|
||||
// PARTITION_NONE
|
||||
if (partition_none_allowed) {
|
||||
rd_pick_sb_modes(cpi, tile, tile_data, mi_row, mi_col,
|
||||
rd_pick_sb_modes(cpi, tile_data, mi_row, mi_col,
|
||||
&this_rdc, bsize, ctx, best_rdc.rdcost);
|
||||
if (this_rdc.rate != INT_MAX) {
|
||||
if (bsize >= BLOCK_8X8) {
|
||||
@ -2236,7 +2240,7 @@ static void rd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
}
|
||||
if (skip) {
|
||||
if (src_diff_var == UINT_MAX) {
|
||||
set_offsets(cpi, tile, mi_row, mi_col, bsize);
|
||||
set_offsets(cpi, tile_info, mi_row, mi_col, bsize);
|
||||
src_diff_var = get_sby_perpixel_diff_variance(
|
||||
cpi, &cpi->mb.plane[0].src, mi_row, mi_col, bsize);
|
||||
}
|
||||
@ -2266,7 +2270,7 @@ static void rd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
if (cpi->sf.adaptive_pred_interp_filter && partition_none_allowed)
|
||||
pc_tree->leaf_split[0]->pred_interp_filter =
|
||||
ctx->mic.mbmi.interp_filter;
|
||||
rd_pick_sb_modes(cpi, tile, tile_data, mi_row, mi_col, &sum_rdc, subsize,
|
||||
rd_pick_sb_modes(cpi, tile_data, mi_row, mi_col, &sum_rdc, subsize,
|
||||
pc_tree->leaf_split[0], best_rdc.rdcost);
|
||||
if (sum_rdc.rate == INT_MAX)
|
||||
sum_rdc.rdcost = INT64_MAX;
|
||||
@ -2282,7 +2286,7 @@ static void rd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
load_pred_mv(x, ctx);
|
||||
|
||||
pc_tree->split[i]->index = i;
|
||||
rd_pick_partition(cpi, tile, tile_data, tp,
|
||||
rd_pick_partition(cpi, tile_data, tp,
|
||||
mi_row + y_idx, mi_col + x_idx,
|
||||
subsize, &this_rdc,
|
||||
best_rdc.rdcost - sum_rdc.rdcost, pc_tree->split[i]);
|
||||
@ -2326,7 +2330,7 @@ static void rd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
partition_none_allowed)
|
||||
pc_tree->horizontal[0].pred_interp_filter =
|
||||
ctx->mic.mbmi.interp_filter;
|
||||
rd_pick_sb_modes(cpi, tile, tile_data, mi_row, mi_col, &sum_rdc, subsize,
|
||||
rd_pick_sb_modes(cpi, tile_data, mi_row, mi_col, &sum_rdc, subsize,
|
||||
&pc_tree->horizontal[0], best_rdc.rdcost);
|
||||
|
||||
if (sum_rdc.rdcost < best_rdc.rdcost && mi_row + mi_step < cm->mi_rows &&
|
||||
@ -2341,7 +2345,7 @@ static void rd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
partition_none_allowed)
|
||||
pc_tree->horizontal[1].pred_interp_filter =
|
||||
ctx->mic.mbmi.interp_filter;
|
||||
rd_pick_sb_modes(cpi, tile, tile_data, mi_row + mi_step, mi_col,
|
||||
rd_pick_sb_modes(cpi, tile_data, mi_row + mi_step, mi_col,
|
||||
&this_rdc, subsize, &pc_tree->horizontal[1],
|
||||
best_rdc.rdcost - sum_rdc.rdcost);
|
||||
if (this_rdc.rate == INT_MAX) {
|
||||
@ -2374,7 +2378,7 @@ static void rd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
partition_none_allowed)
|
||||
pc_tree->vertical[0].pred_interp_filter =
|
||||
ctx->mic.mbmi.interp_filter;
|
||||
rd_pick_sb_modes(cpi, tile, tile_data, mi_row, mi_col, &sum_rdc, subsize,
|
||||
rd_pick_sb_modes(cpi, tile_data, mi_row, mi_col, &sum_rdc, subsize,
|
||||
&pc_tree->vertical[0], best_rdc.rdcost);
|
||||
if (sum_rdc.rdcost < best_rdc.rdcost && mi_col + mi_step < cm->mi_cols &&
|
||||
bsize > BLOCK_8X8) {
|
||||
@ -2388,7 +2392,7 @@ static void rd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
partition_none_allowed)
|
||||
pc_tree->vertical[1].pred_interp_filter =
|
||||
ctx->mic.mbmi.interp_filter;
|
||||
rd_pick_sb_modes(cpi, tile, tile_data, mi_row, mi_col + mi_step,
|
||||
rd_pick_sb_modes(cpi, tile_data, mi_row, mi_col + mi_step,
|
||||
&this_rdc, subsize,
|
||||
&pc_tree->vertical[1], best_rdc.rdcost - sum_rdc.rdcost);
|
||||
if (this_rdc.rate == INT_MAX) {
|
||||
@ -2435,7 +2439,8 @@ static void rd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
vp9_cyclic_refresh_set_rate_and_dist_sb(cpi->cyclic_refresh,
|
||||
best_rdc.rate, best_rdc.dist);
|
||||
|
||||
encode_sb(cpi, tile, tp, mi_row, mi_col, output_enabled, bsize, pc_tree);
|
||||
encode_sb(cpi, tile_info, tp, mi_row, mi_col, output_enabled,
|
||||
bsize, pc_tree);
|
||||
}
|
||||
|
||||
if (bsize == BLOCK_64X64) {
|
||||
@ -2447,10 +2452,12 @@ static void rd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
}
|
||||
}
|
||||
|
||||
static void encode_rd_sb_row(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
static void encode_rd_sb_row(VP9_COMP *cpi,
|
||||
TileDataEnc *tile_data,
|
||||
int mi_row, TOKENEXTRA **tp) {
|
||||
int mi_row,
|
||||
TOKENEXTRA **tp) {
|
||||
VP9_COMMON *const cm = &cpi->common;
|
||||
TileInfo *const tile_info = &tile_data->tile_info;
|
||||
MACROBLOCKD *const xd = &cpi->mb.e_mbd;
|
||||
SPEED_FEATURES *const sf = &cpi->sf;
|
||||
int mi_col;
|
||||
@ -2460,7 +2467,7 @@ static void encode_rd_sb_row(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
vpx_memset(xd->left_seg_context, 0, sizeof(xd->left_seg_context));
|
||||
|
||||
// Code each SB in the row
|
||||
for (mi_col = tile->mi_col_start; mi_col < tile->mi_col_end;
|
||||
for (mi_col = tile_info->mi_col_start; mi_col < tile_info->mi_col_end;
|
||||
mi_col += MI_BLOCK_SIZE) {
|
||||
int dummy_rate;
|
||||
int64_t dummy_dist;
|
||||
@ -2487,32 +2494,32 @@ static void encode_rd_sb_row(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
|
||||
cpi->mb.source_variance = UINT_MAX;
|
||||
if (sf->partition_search_type == FIXED_PARTITION) {
|
||||
set_offsets(cpi, tile, mi_row, mi_col, BLOCK_64X64);
|
||||
set_fixed_partitioning(cpi, tile, mi, mi_row, mi_col,
|
||||
set_offsets(cpi, tile_info, mi_row, mi_col, BLOCK_64X64);
|
||||
set_fixed_partitioning(cpi, tile_info, mi, mi_row, mi_col,
|
||||
sf->always_this_block_size);
|
||||
rd_use_partition(cpi, tile, tile_data, mi, tp, mi_row, mi_col,
|
||||
rd_use_partition(cpi, tile_data, mi, tp, mi_row, mi_col,
|
||||
BLOCK_64X64, &dummy_rate, &dummy_dist, 1, cpi->pc_root);
|
||||
} else if (cpi->partition_search_skippable_frame) {
|
||||
BLOCK_SIZE bsize;
|
||||
set_offsets(cpi, tile, mi_row, mi_col, BLOCK_64X64);
|
||||
set_offsets(cpi, tile_info, mi_row, mi_col, BLOCK_64X64);
|
||||
bsize = get_rd_var_based_fixed_partition(cpi, mi_row, mi_col);
|
||||
set_fixed_partitioning(cpi, tile, mi, mi_row, mi_col, bsize);
|
||||
rd_use_partition(cpi, tile, tile_data, mi, tp, mi_row, mi_col,
|
||||
set_fixed_partitioning(cpi, tile_info, mi, mi_row, mi_col, bsize);
|
||||
rd_use_partition(cpi, tile_data, mi, tp, mi_row, mi_col,
|
||||
BLOCK_64X64, &dummy_rate, &dummy_dist, 1, cpi->pc_root);
|
||||
} else if (sf->partition_search_type == VAR_BASED_PARTITION &&
|
||||
cm->frame_type != KEY_FRAME ) {
|
||||
choose_partitioning(cpi, tile, mi_row, mi_col);
|
||||
rd_use_partition(cpi, tile, tile_data, mi, tp, mi_row, mi_col,
|
||||
choose_partitioning(cpi, tile_info, mi_row, mi_col);
|
||||
rd_use_partition(cpi, tile_data, mi, tp, mi_row, mi_col,
|
||||
BLOCK_64X64, &dummy_rate, &dummy_dist, 1, cpi->pc_root);
|
||||
} else {
|
||||
// If required set upper and lower partition size limits
|
||||
if (sf->auto_min_max_partition_size) {
|
||||
set_offsets(cpi, tile, mi_row, mi_col, BLOCK_64X64);
|
||||
rd_auto_partition_range(cpi, tile, mi_row, mi_col,
|
||||
set_offsets(cpi, tile_info, mi_row, mi_col, BLOCK_64X64);
|
||||
rd_auto_partition_range(cpi, tile_info, mi_row, mi_col,
|
||||
&sf->min_partition_size,
|
||||
&sf->max_partition_size);
|
||||
}
|
||||
rd_pick_partition(cpi, tile, tile_data, tp, mi_row, mi_col, BLOCK_64X64,
|
||||
rd_pick_partition(cpi, tile_data, tp, mi_row, mi_col, BLOCK_64X64,
|
||||
&dummy_rdc, INT64_MAX, cpi->pc_root);
|
||||
}
|
||||
}
|
||||
@ -2585,15 +2592,16 @@ static TX_MODE select_tx_mode(const VP9_COMP *cpi) {
|
||||
return cpi->common.tx_mode;
|
||||
}
|
||||
|
||||
static void nonrd_pick_sb_modes(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
static void nonrd_pick_sb_modes(VP9_COMP *cpi,
|
||||
TileDataEnc *tile_data,
|
||||
int mi_row, int mi_col, RD_COST *rd_cost,
|
||||
BLOCK_SIZE bsize, PICK_MODE_CONTEXT *ctx) {
|
||||
VP9_COMMON *const cm = &cpi->common;
|
||||
TileInfo *const tile_info = &tile_data->tile_info;
|
||||
MACROBLOCK *const x = &cpi->mb;
|
||||
MACROBLOCKD *const xd = &x->e_mbd;
|
||||
MB_MODE_INFO *mbmi;
|
||||
set_offsets(cpi, tile, mi_row, mi_col, bsize);
|
||||
set_offsets(cpi, tile_info, mi_row, mi_col, bsize);
|
||||
mbmi = &xd->mi[0].src_mi->mbmi;
|
||||
mbmi->sb_type = bsize;
|
||||
|
||||
@ -2604,7 +2612,7 @@ static void nonrd_pick_sb_modes(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
if (vp9_segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP))
|
||||
set_mode_info_seg_skip(x, cm->tx_mode, rd_cost, bsize);
|
||||
else
|
||||
vp9_pick_inter_mode(cpi, x, tile, tile_data, mi_row, mi_col,
|
||||
vp9_pick_inter_mode(cpi, x, tile_data, mi_row, mi_col,
|
||||
rd_cost, bsize, ctx);
|
||||
|
||||
duplicate_mode_info_in_sb(cm, xd, mi_row, mi_col, bsize);
|
||||
@ -2670,7 +2678,7 @@ static void fill_mode_info_sb(VP9_COMMON *cm, MACROBLOCK *x,
|
||||
}
|
||||
}
|
||||
|
||||
static void nonrd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
static void nonrd_pick_partition(VP9_COMP *cpi,
|
||||
TileDataEnc *tile_data,
|
||||
TOKENEXTRA **tp, int mi_row,
|
||||
int mi_col, BLOCK_SIZE bsize, RD_COST *rd_cost,
|
||||
@ -2679,6 +2687,7 @@ static void nonrd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
const SPEED_FEATURES *const sf = &cpi->sf;
|
||||
const VP9EncoderConfig *const oxcf = &cpi->oxcf;
|
||||
VP9_COMMON *const cm = &cpi->common;
|
||||
TileInfo *const tile_info = &tile_data->tile_info;
|
||||
MACROBLOCK *const x = &cpi->mb;
|
||||
MACROBLOCKD *const xd = &x->e_mbd;
|
||||
const int ms = num_8x8_blocks_wide_lookup[bsize] / 2;
|
||||
@ -2729,7 +2738,7 @@ static void nonrd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
|
||||
// PARTITION_NONE
|
||||
if (partition_none_allowed) {
|
||||
nonrd_pick_sb_modes(cpi, tile, tile_data, mi_row, mi_col,
|
||||
nonrd_pick_sb_modes(cpi, tile_data, mi_row, mi_col,
|
||||
&this_rdc, bsize, ctx);
|
||||
ctx->mic.mbmi = xd->mi[0].src_mi->mbmi;
|
||||
ctx->skip_txfm[0] = x->skip_txfm[0];
|
||||
@ -2780,7 +2789,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, tile_data, tp,
|
||||
nonrd_pick_partition(cpi, tile_data, tp,
|
||||
mi_row + y_idx, mi_col + x_idx,
|
||||
subsize, &this_rdc, 0,
|
||||
best_rdc.rdcost - sum_rdc.rdcost, pc_tree->split[i]);
|
||||
@ -2811,7 +2820,7 @@ static void nonrd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
if (sf->adaptive_motion_search)
|
||||
load_pred_mv(x, ctx);
|
||||
|
||||
nonrd_pick_sb_modes(cpi, tile, tile_data, mi_row, mi_col, &sum_rdc, subsize,
|
||||
nonrd_pick_sb_modes(cpi, tile_data, mi_row, mi_col, &sum_rdc, subsize,
|
||||
&pc_tree->horizontal[0]);
|
||||
|
||||
pc_tree->horizontal[0].mic.mbmi = xd->mi[0].src_mi->mbmi;
|
||||
@ -2821,7 +2830,7 @@ static void nonrd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
|
||||
if (sum_rdc.rdcost < best_rdc.rdcost && mi_row + ms < cm->mi_rows) {
|
||||
load_pred_mv(x, ctx);
|
||||
nonrd_pick_sb_modes(cpi, tile, tile_data, mi_row + ms, mi_col,
|
||||
nonrd_pick_sb_modes(cpi, tile_data, mi_row + ms, mi_col,
|
||||
&this_rdc, subsize,
|
||||
&pc_tree->horizontal[1]);
|
||||
|
||||
@ -2855,7 +2864,7 @@ static void nonrd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
if (sf->adaptive_motion_search)
|
||||
load_pred_mv(x, ctx);
|
||||
|
||||
nonrd_pick_sb_modes(cpi, tile, tile_data, mi_row, mi_col, &sum_rdc, subsize,
|
||||
nonrd_pick_sb_modes(cpi, tile_data, mi_row, mi_col, &sum_rdc, subsize,
|
||||
&pc_tree->vertical[0]);
|
||||
pc_tree->vertical[0].mic.mbmi = xd->mi[0].src_mi->mbmi;
|
||||
pc_tree->vertical[0].skip_txfm[0] = x->skip_txfm[0];
|
||||
@ -2864,7 +2873,7 @@ static void nonrd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
|
||||
if (sum_rdc.rdcost < best_rdc.rdcost && mi_col + ms < cm->mi_cols) {
|
||||
load_pred_mv(x, ctx);
|
||||
nonrd_pick_sb_modes(cpi, tile, tile_data, mi_row, mi_col + ms,
|
||||
nonrd_pick_sb_modes(cpi, tile_data, mi_row, mi_col + ms,
|
||||
&this_rdc, subsize,
|
||||
&pc_tree->vertical[1]);
|
||||
pc_tree->vertical[1].mic.mbmi = xd->mi[0].src_mi->mbmi;
|
||||
@ -2917,7 +2926,8 @@ static void nonrd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
vp9_cyclic_refresh_set_rate_and_dist_sb(cpi->cyclic_refresh,
|
||||
best_rdc.rate, best_rdc.dist);
|
||||
|
||||
encode_sb_rt(cpi, tile, tp, mi_row, mi_col, output_enabled, bsize, pc_tree);
|
||||
encode_sb_rt(cpi, tile_info, tp, mi_row, mi_col, output_enabled,
|
||||
bsize, pc_tree);
|
||||
}
|
||||
|
||||
if (bsize == BLOCK_64X64) {
|
||||
@ -2930,7 +2940,6 @@ static void nonrd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
}
|
||||
|
||||
static void nonrd_select_partition(VP9_COMP *cpi,
|
||||
const TileInfo *const tile,
|
||||
TileDataEnc *tile_data,
|
||||
MODE_INFO *mi,
|
||||
TOKENEXTRA **tp,
|
||||
@ -2938,6 +2947,7 @@ static void nonrd_select_partition(VP9_COMP *cpi,
|
||||
BLOCK_SIZE bsize, int output_enabled,
|
||||
RD_COST *rd_cost, PC_TREE *pc_tree) {
|
||||
VP9_COMMON *const cm = &cpi->common;
|
||||
TileInfo *const tile_info = &tile_data->tile_info;
|
||||
MACROBLOCK *const x = &cpi->mb;
|
||||
MACROBLOCKD *const xd = &x->e_mbd;
|
||||
const int bsl = b_width_log2_lookup[bsize], hbs = (1 << bsl) / 4;
|
||||
@ -2957,17 +2967,17 @@ static void nonrd_select_partition(VP9_COMP *cpi,
|
||||
subsize >= BLOCK_16X16) {
|
||||
cpi->sf.max_partition_size = BLOCK_32X32;
|
||||
cpi->sf.min_partition_size = BLOCK_8X8;
|
||||
nonrd_pick_partition(cpi, tile, tile_data, tp, mi_row, mi_col, bsize,
|
||||
nonrd_pick_partition(cpi, tile_data, tp, mi_row, mi_col, bsize,
|
||||
rd_cost, 0, INT64_MAX, pc_tree);
|
||||
} else if (bsize == BLOCK_16X16 && partition != PARTITION_NONE) {
|
||||
cpi->sf.max_partition_size = BLOCK_16X16;
|
||||
cpi->sf.min_partition_size = BLOCK_8X8;
|
||||
nonrd_pick_partition(cpi, tile, tile_data, tp, mi_row, mi_col, bsize,
|
||||
nonrd_pick_partition(cpi, tile_data, tp, mi_row, mi_col, bsize,
|
||||
rd_cost, 0, INT64_MAX, pc_tree);
|
||||
} else {
|
||||
switch (partition) {
|
||||
case PARTITION_NONE:
|
||||
nonrd_pick_sb_modes(cpi, tile, tile_data, mi_row, mi_col, rd_cost,
|
||||
nonrd_pick_sb_modes(cpi, tile_data, mi_row, mi_col, rd_cost,
|
||||
subsize, &pc_tree->none);
|
||||
pc_tree->none.mic.mbmi = xd->mi[0].src_mi->mbmi;
|
||||
pc_tree->none.skip_txfm[0] = x->skip_txfm[0];
|
||||
@ -2975,14 +2985,14 @@ static void nonrd_select_partition(VP9_COMP *cpi,
|
||||
pc_tree->none.pred_pixel_ready = 1;
|
||||
break;
|
||||
case PARTITION_VERT:
|
||||
nonrd_pick_sb_modes(cpi, tile, tile_data, mi_row, mi_col, rd_cost,
|
||||
nonrd_pick_sb_modes(cpi, tile_data, mi_row, mi_col, rd_cost,
|
||||
subsize, &pc_tree->vertical[0]);
|
||||
pc_tree->vertical[0].mic.mbmi = xd->mi[0].src_mi->mbmi;
|
||||
pc_tree->vertical[0].skip_txfm[0] = x->skip_txfm[0];
|
||||
pc_tree->vertical[0].skip = x->skip;
|
||||
pc_tree->vertical[0].pred_pixel_ready = 1;
|
||||
if (mi_col + hbs < cm->mi_cols) {
|
||||
nonrd_pick_sb_modes(cpi, tile, tile_data, mi_row, mi_col + hbs,
|
||||
nonrd_pick_sb_modes(cpi, tile_data, mi_row, mi_col + hbs,
|
||||
&this_rdc, subsize, &pc_tree->vertical[1]);
|
||||
pc_tree->vertical[1].mic.mbmi = xd->mi[0].src_mi->mbmi;
|
||||
pc_tree->vertical[1].skip_txfm[0] = x->skip_txfm[0];
|
||||
@ -2996,14 +3006,14 @@ static void nonrd_select_partition(VP9_COMP *cpi,
|
||||
}
|
||||
break;
|
||||
case PARTITION_HORZ:
|
||||
nonrd_pick_sb_modes(cpi, tile, tile_data, mi_row, mi_col, rd_cost,
|
||||
nonrd_pick_sb_modes(cpi, tile_data, mi_row, mi_col, rd_cost,
|
||||
subsize, &pc_tree->horizontal[0]);
|
||||
pc_tree->horizontal[0].mic.mbmi = xd->mi[0].src_mi->mbmi;
|
||||
pc_tree->horizontal[0].skip_txfm[0] = x->skip_txfm[0];
|
||||
pc_tree->horizontal[0].skip = x->skip;
|
||||
pc_tree->horizontal[0].pred_pixel_ready = 1;
|
||||
if (mi_row + hbs < cm->mi_rows) {
|
||||
nonrd_pick_sb_modes(cpi, tile, tile_data, mi_row + hbs, mi_col,
|
||||
nonrd_pick_sb_modes(cpi, tile_data, mi_row + hbs, mi_col,
|
||||
&this_rdc, subsize, &pc_tree->horizontal[0]);
|
||||
pc_tree->horizontal[1].mic.mbmi = xd->mi[0].src_mi->mbmi;
|
||||
pc_tree->horizontal[1].skip_txfm[0] = x->skip_txfm[0];
|
||||
@ -3018,10 +3028,10 @@ static void nonrd_select_partition(VP9_COMP *cpi,
|
||||
break;
|
||||
case PARTITION_SPLIT:
|
||||
subsize = get_subsize(bsize, PARTITION_SPLIT);
|
||||
nonrd_select_partition(cpi, tile, tile_data, mi, tp, mi_row, mi_col,
|
||||
nonrd_select_partition(cpi, tile_data, mi, tp, mi_row, mi_col,
|
||||
subsize, output_enabled, rd_cost,
|
||||
pc_tree->split[0]);
|
||||
nonrd_select_partition(cpi, tile, tile_data, mi + hbs, tp,
|
||||
nonrd_select_partition(cpi, tile_data, mi + hbs, tp,
|
||||
mi_row, mi_col + hbs, subsize, output_enabled,
|
||||
&this_rdc, pc_tree->split[1]);
|
||||
if (this_rdc.rate != INT_MAX && this_rdc.dist != INT64_MAX &&
|
||||
@ -3029,7 +3039,7 @@ static void nonrd_select_partition(VP9_COMP *cpi,
|
||||
rd_cost->rate += this_rdc.rate;
|
||||
rd_cost->dist += this_rdc.dist;
|
||||
}
|
||||
nonrd_select_partition(cpi, tile, tile_data, mi + hbs * mis, tp,
|
||||
nonrd_select_partition(cpi, tile_data, mi + hbs * mis, tp,
|
||||
mi_row + hbs, mi_col, subsize, output_enabled,
|
||||
&this_rdc, pc_tree->split[2]);
|
||||
if (this_rdc.rate != INT_MAX && this_rdc.dist != INT64_MAX &&
|
||||
@ -3037,7 +3047,7 @@ static void nonrd_select_partition(VP9_COMP *cpi,
|
||||
rd_cost->rate += this_rdc.rate;
|
||||
rd_cost->dist += this_rdc.dist;
|
||||
}
|
||||
nonrd_select_partition(cpi, tile, tile_data, mi + hbs * mis + hbs, tp,
|
||||
nonrd_select_partition(cpi, tile_data, mi + hbs * mis + hbs, tp,
|
||||
mi_row + hbs, mi_col + hbs, subsize,
|
||||
output_enabled, &this_rdc, pc_tree->split[3]);
|
||||
if (this_rdc.rate != INT_MAX && this_rdc.dist != INT64_MAX &&
|
||||
@ -3056,13 +3066,12 @@ static void nonrd_select_partition(VP9_COMP *cpi,
|
||||
if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ)
|
||||
vp9_cyclic_refresh_set_rate_and_dist_sb(cpi->cyclic_refresh,
|
||||
rd_cost->rate, rd_cost->dist);
|
||||
encode_sb_rt(cpi, tile, tp, mi_row, mi_col, 1, bsize, pc_tree);
|
||||
encode_sb_rt(cpi, tile_info, tp, mi_row, mi_col, 1, bsize, pc_tree);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void nonrd_use_partition(VP9_COMP *cpi,
|
||||
const TileInfo *const tile,
|
||||
TileDataEnc *tile_data,
|
||||
MODE_INFO *mi,
|
||||
TOKENEXTRA **tp,
|
||||
@ -3087,20 +3096,20 @@ static void nonrd_use_partition(VP9_COMP *cpi,
|
||||
|
||||
switch (partition) {
|
||||
case PARTITION_NONE:
|
||||
nonrd_pick_sb_modes(cpi, tile, tile_data, mi_row, mi_col, rd_cost,
|
||||
nonrd_pick_sb_modes(cpi, tile_data, mi_row, mi_col, rd_cost,
|
||||
subsize, &pc_tree->none);
|
||||
pc_tree->none.mic.mbmi = xd->mi[0].src_mi->mbmi;
|
||||
pc_tree->none.skip_txfm[0] = x->skip_txfm[0];
|
||||
pc_tree->none.skip = x->skip;
|
||||
break;
|
||||
case PARTITION_VERT:
|
||||
nonrd_pick_sb_modes(cpi, tile, tile_data, mi_row, mi_col, rd_cost,
|
||||
nonrd_pick_sb_modes(cpi, tile_data, mi_row, mi_col, rd_cost,
|
||||
subsize, &pc_tree->vertical[0]);
|
||||
pc_tree->vertical[0].mic.mbmi = xd->mi[0].src_mi->mbmi;
|
||||
pc_tree->vertical[0].skip_txfm[0] = x->skip_txfm[0];
|
||||
pc_tree->vertical[0].skip = x->skip;
|
||||
if (mi_col + hbs < cm->mi_cols) {
|
||||
nonrd_pick_sb_modes(cpi, tile, tile_data, mi_row, mi_col + hbs,
|
||||
nonrd_pick_sb_modes(cpi, tile_data, mi_row, mi_col + hbs,
|
||||
&this_rdc, subsize, &pc_tree->vertical[1]);
|
||||
pc_tree->vertical[1].mic.mbmi = xd->mi[0].src_mi->mbmi;
|
||||
pc_tree->vertical[1].skip_txfm[0] = x->skip_txfm[0];
|
||||
@ -3113,13 +3122,13 @@ static void nonrd_use_partition(VP9_COMP *cpi,
|
||||
}
|
||||
break;
|
||||
case PARTITION_HORZ:
|
||||
nonrd_pick_sb_modes(cpi, tile, tile_data, mi_row, mi_col, rd_cost,
|
||||
nonrd_pick_sb_modes(cpi, tile_data, mi_row, mi_col, rd_cost,
|
||||
subsize, &pc_tree->horizontal[0]);
|
||||
pc_tree->horizontal[0].mic.mbmi = xd->mi[0].src_mi->mbmi;
|
||||
pc_tree->horizontal[0].skip_txfm[0] = x->skip_txfm[0];
|
||||
pc_tree->horizontal[0].skip = x->skip;
|
||||
if (mi_row + hbs < cm->mi_rows) {
|
||||
nonrd_pick_sb_modes(cpi, tile, tile_data, mi_row + hbs, mi_col,
|
||||
nonrd_pick_sb_modes(cpi, tile_data, mi_row + hbs, mi_col,
|
||||
&this_rdc, subsize, &pc_tree->horizontal[0]);
|
||||
pc_tree->horizontal[1].mic.mbmi = xd->mi[0].src_mi->mbmi;
|
||||
pc_tree->horizontal[1].skip_txfm[0] = x->skip_txfm[0];
|
||||
@ -3133,10 +3142,10 @@ static void nonrd_use_partition(VP9_COMP *cpi,
|
||||
break;
|
||||
case PARTITION_SPLIT:
|
||||
subsize = get_subsize(bsize, PARTITION_SPLIT);
|
||||
nonrd_use_partition(cpi, tile, tile_data, mi, tp, mi_row, mi_col,
|
||||
nonrd_use_partition(cpi, tile_data, mi, tp, mi_row, mi_col,
|
||||
subsize, output_enabled, rd_cost,
|
||||
pc_tree->split[0]);
|
||||
nonrd_use_partition(cpi, tile, tile_data, mi + hbs, tp,
|
||||
nonrd_use_partition(cpi, tile_data, mi + hbs, tp,
|
||||
mi_row, mi_col + hbs, subsize, output_enabled,
|
||||
&this_rdc, pc_tree->split[1]);
|
||||
if (this_rdc.rate != INT_MAX && this_rdc.dist != INT64_MAX &&
|
||||
@ -3144,7 +3153,7 @@ static void nonrd_use_partition(VP9_COMP *cpi,
|
||||
rd_cost->rate += this_rdc.rate;
|
||||
rd_cost->dist += this_rdc.dist;
|
||||
}
|
||||
nonrd_use_partition(cpi, tile, tile_data, mi + hbs * mis, tp,
|
||||
nonrd_use_partition(cpi, tile_data, mi + hbs * mis, tp,
|
||||
mi_row + hbs, mi_col, subsize, output_enabled,
|
||||
&this_rdc, pc_tree->split[2]);
|
||||
if (this_rdc.rate != INT_MAX && this_rdc.dist != INT64_MAX &&
|
||||
@ -3152,7 +3161,7 @@ static void nonrd_use_partition(VP9_COMP *cpi,
|
||||
rd_cost->rate += this_rdc.rate;
|
||||
rd_cost->dist += this_rdc.dist;
|
||||
}
|
||||
nonrd_use_partition(cpi, tile, tile_data, mi + hbs * mis + hbs, tp,
|
||||
nonrd_use_partition(cpi, tile_data, mi + hbs * mis + hbs, tp,
|
||||
mi_row + hbs, mi_col + hbs, subsize, output_enabled,
|
||||
&this_rdc, pc_tree->split[3]);
|
||||
if (this_rdc.rate != INT_MAX && this_rdc.dist != INT64_MAX &&
|
||||
@ -3170,15 +3179,18 @@ static void nonrd_use_partition(VP9_COMP *cpi,
|
||||
if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ)
|
||||
vp9_cyclic_refresh_set_rate_and_dist_sb(cpi->cyclic_refresh,
|
||||
rd_cost->rate, rd_cost->dist);
|
||||
encode_sb_rt(cpi, tile, tp, mi_row, mi_col, 1, bsize, pc_tree);
|
||||
encode_sb_rt(cpi, &tile_data->tile_info, tp, mi_row, mi_col,
|
||||
1, bsize, pc_tree);
|
||||
}
|
||||
}
|
||||
|
||||
static void encode_nonrd_sb_row(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
static void encode_nonrd_sb_row(VP9_COMP *cpi,
|
||||
TileDataEnc *tile_data,
|
||||
int mi_row, TOKENEXTRA **tp) {
|
||||
int mi_row,
|
||||
TOKENEXTRA **tp) {
|
||||
SPEED_FEATURES *const sf = &cpi->sf;
|
||||
VP9_COMMON *const cm = &cpi->common;
|
||||
TileInfo *const tile_info = &tile_data->tile_info;
|
||||
MACROBLOCK *const x = &cpi->mb;
|
||||
MACROBLOCKD *const xd = &x->e_mbd;
|
||||
int mi_col;
|
||||
@ -3188,7 +3200,7 @@ static void encode_nonrd_sb_row(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
vpx_memset(xd->left_seg_context, 0, sizeof(xd->left_seg_context));
|
||||
|
||||
// Code each SB in the row
|
||||
for (mi_col = tile->mi_col_start; mi_col < tile->mi_col_end;
|
||||
for (mi_col = tile_info->mi_col_start; mi_col < tile_info->mi_col_end;
|
||||
mi_col += MI_BLOCK_SIZE) {
|
||||
RD_COST dummy_rdc;
|
||||
const int idx_str = cm->mi_stride * mi_row + mi_col;
|
||||
@ -3202,38 +3214,38 @@ static void encode_nonrd_sb_row(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
// Set the partition type of the 64X64 block
|
||||
switch (sf->partition_search_type) {
|
||||
case VAR_BASED_PARTITION:
|
||||
choose_partitioning(cpi, tile, mi_row, mi_col);
|
||||
nonrd_use_partition(cpi, tile, tile_data, mi, tp, mi_row, mi_col,
|
||||
choose_partitioning(cpi, tile_info, mi_row, mi_col);
|
||||
nonrd_use_partition(cpi, tile_data, mi, tp, mi_row, mi_col,
|
||||
BLOCK_64X64, 1, &dummy_rdc, cpi->pc_root);
|
||||
break;
|
||||
case SOURCE_VAR_BASED_PARTITION:
|
||||
set_source_var_based_partition(cpi, tile, mi, mi_row, mi_col);
|
||||
nonrd_use_partition(cpi, tile, tile_data, mi, tp, mi_row, mi_col,
|
||||
set_source_var_based_partition(cpi, tile_info, mi, mi_row, mi_col);
|
||||
nonrd_use_partition(cpi, tile_data, mi, tp, mi_row, mi_col,
|
||||
BLOCK_64X64, 1, &dummy_rdc, cpi->pc_root);
|
||||
break;
|
||||
case FIXED_PARTITION:
|
||||
bsize = sf->partition_search_type == FIXED_PARTITION ?
|
||||
sf->always_this_block_size :
|
||||
get_nonrd_var_based_fixed_partition(cpi, mi_row, mi_col);
|
||||
set_fixed_partitioning(cpi, tile, mi, mi_row, mi_col, bsize);
|
||||
nonrd_use_partition(cpi, tile, tile_data, mi, tp, mi_row, mi_col,
|
||||
set_fixed_partitioning(cpi, tile_info, mi, mi_row, mi_col, bsize);
|
||||
nonrd_use_partition(cpi, tile_data, mi, tp, mi_row, mi_col,
|
||||
BLOCK_64X64, 1, &dummy_rdc, cpi->pc_root);
|
||||
break;
|
||||
case REFERENCE_PARTITION:
|
||||
set_offsets(cpi, tile, mi_row, mi_col, BLOCK_64X64);
|
||||
x->in_static_area = is_background(cpi, tile, mi_row, mi_col);
|
||||
set_offsets(cpi, tile_info, mi_row, mi_col, BLOCK_64X64);
|
||||
x->in_static_area = is_background(cpi, tile_info, mi_row, mi_col);
|
||||
|
||||
if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ && cm->seg.enabled &&
|
||||
xd->mi[0].src_mi->mbmi.segment_id && x->in_static_area) {
|
||||
auto_partition_range(cpi, tile, mi_row, mi_col,
|
||||
auto_partition_range(cpi, tile_info, mi_row, mi_col,
|
||||
&sf->min_partition_size,
|
||||
&sf->max_partition_size);
|
||||
nonrd_pick_partition(cpi, tile, tile_data, tp, mi_row, mi_col,
|
||||
nonrd_pick_partition(cpi, tile_data, tp, mi_row, mi_col,
|
||||
BLOCK_64X64, &dummy_rdc, 1,
|
||||
INT64_MAX, cpi->pc_root);
|
||||
} else {
|
||||
choose_partitioning(cpi, tile, mi_row, mi_col);
|
||||
nonrd_select_partition(cpi, tile, tile_data, mi, tp, mi_row, mi_col,
|
||||
choose_partitioning(cpi, tile_info, mi_row, mi_col);
|
||||
nonrd_select_partition(cpi, tile_data, mi, tp, mi_row, mi_col,
|
||||
BLOCK_64X64, 1, &dummy_rdc, cpi->pc_root);
|
||||
}
|
||||
|
||||
@ -3388,7 +3400,6 @@ static void encode_tiles(VP9_COMP *cpi) {
|
||||
const int tile_rows = 1 << cm->log2_tile_rows;
|
||||
|
||||
int tile_col, tile_row;
|
||||
TileInfo tile[4][1 << 6];
|
||||
TOKENEXTRA *tok[4][1 << 6];
|
||||
TOKENEXTRA *pre_tok = cpi->tok;
|
||||
int tile_tok = 0;
|
||||
@ -3403,33 +3414,34 @@ static void encode_tiles(VP9_COMP *cpi) {
|
||||
|
||||
for (tile_row = 0; tile_row < tile_rows; ++tile_row) {
|
||||
for (tile_col = 0; tile_col < tile_cols; ++tile_col) {
|
||||
vp9_tile_init(&tile[tile_row][tile_col], cm, tile_row, tile_col);
|
||||
TileInfo *tile_info =
|
||||
&cpi->tile_data[tile_row * tile_cols + tile_col].tile_info;
|
||||
vp9_tile_init(tile_info, cm, tile_row, tile_col);
|
||||
|
||||
tok[tile_row][tile_col] = pre_tok + tile_tok;
|
||||
pre_tok = tok[tile_row][tile_col];
|
||||
tile_tok = allocated_tokens(tile[tile_row][tile_col]);
|
||||
tile_tok = allocated_tokens(*tile_info);
|
||||
}
|
||||
}
|
||||
|
||||
for (tile_row = 0; tile_row < tile_rows; ++tile_row) {
|
||||
for (tile_col = 0; tile_col < tile_cols; ++tile_col) {
|
||||
const TileInfo * const ptile = &tile[tile_row][tile_col];
|
||||
const TileInfo * const tile_info =
|
||||
&cpi->tile_data[tile_row * tile_cols + tile_col].tile_info;
|
||||
TOKENEXTRA * const old_tok = tok[tile_row][tile_col];
|
||||
int mi_row;
|
||||
TileDataEnc *this_tile = &cpi->tile_data[tile_row * tile_cols + tile_col];
|
||||
|
||||
for (mi_row = ptile->mi_row_start; mi_row < ptile->mi_row_end;
|
||||
for (mi_row = tile_info->mi_row_start; mi_row < tile_info->mi_row_end;
|
||||
mi_row += MI_BLOCK_SIZE) {
|
||||
if (cpi->sf.use_nonrd_pick_mode && !frame_is_intra_only(cm))
|
||||
encode_nonrd_sb_row(cpi, ptile, this_tile,
|
||||
mi_row, &tok[tile_row][tile_col]);
|
||||
encode_nonrd_sb_row(cpi, this_tile, mi_row, &tok[tile_row][tile_col]);
|
||||
else
|
||||
encode_rd_sb_row(cpi, ptile, this_tile,
|
||||
mi_row, &tok[tile_row][tile_col]);
|
||||
encode_rd_sb_row(cpi, this_tile, mi_row, &tok[tile_row][tile_col]);
|
||||
}
|
||||
cpi->tok_count[tile_row][tile_col] =
|
||||
(unsigned int)(tok[tile_row][tile_col] - old_tok);
|
||||
assert(tok[tile_row][tile_col] - old_tok <= allocated_tokens(*ptile));
|
||||
assert(tok[tile_row][tile_col] - old_tok <= allocated_tokens(*tile_info));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -229,6 +229,7 @@ static INLINE int is_lossless_requested(const VP9EncoderConfig *cfg) {
|
||||
|
||||
// TODO(jingning) All spatially adaptive variables should go to TileDataEnc.
|
||||
typedef struct TileDataEnc {
|
||||
TileInfo tile_info;
|
||||
int thresh_freq_fact[BLOCK_SIZES][MAX_MODES];
|
||||
int mode_map[BLOCK_SIZES][MAX_MODES];
|
||||
} TileDataEnc;
|
||||
|
@ -459,10 +459,11 @@ static const THR_MODES mode_idx[MAX_REF_FRAMES - 1][INTER_MODES] = {
|
||||
// TODO(jingning) placeholder for inter-frame non-RD mode decision.
|
||||
// this needs various further optimizations. to be continued..
|
||||
void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
|
||||
const TileInfo *const tile, TileDataEnc *tile_data,
|
||||
TileDataEnc *tile_data,
|
||||
int mi_row, int mi_col, RD_COST *rd_cost,
|
||||
BLOCK_SIZE bsize, PICK_MODE_CONTEXT *ctx) {
|
||||
VP9_COMMON *const cm = &cpi->common;
|
||||
TileInfo *const tile_info = &tile_data->tile_info;
|
||||
MACROBLOCKD *const xd = &x->e_mbd;
|
||||
MB_MODE_INFO *const mbmi = &xd->mi[0].src_mi->mbmi;
|
||||
struct macroblockd_plane *const pd = &xd->plane[0];
|
||||
@ -571,10 +572,11 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
|
||||
sf, sf);
|
||||
|
||||
if (!cm->error_resilient_mode)
|
||||
vp9_find_mv_refs(cm, xd, tile, xd->mi[0].src_mi, ref_frame,
|
||||
vp9_find_mv_refs(cm, xd, tile_info, xd->mi[0].src_mi, ref_frame,
|
||||
candidates, mi_row, mi_col);
|
||||
else
|
||||
const_motion[ref_frame] = mv_refs_rt(cm, xd, tile, xd->mi[0].src_mi,
|
||||
const_motion[ref_frame] = mv_refs_rt(cm, xd, tile_info,
|
||||
xd->mi[0].src_mi,
|
||||
ref_frame, candidates,
|
||||
mi_row, mi_col);
|
||||
|
||||
|
@ -18,7 +18,6 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
|
||||
const struct TileInfo *const tile,
|
||||
TileDataEnc *tile_data,
|
||||
int mi_row, int mi_col, RD_COST *rd_cost,
|
||||
BLOCK_SIZE bsize,
|
||||
|
@ -2791,12 +2791,12 @@ static void update_rd_thresh_fact(VP9_COMP *cpi, TileDataEnc *tile_data,
|
||||
void vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi,
|
||||
TileDataEnc *tile_data,
|
||||
MACROBLOCK *x,
|
||||
const TileInfo *const tile,
|
||||
int mi_row, int mi_col,
|
||||
RD_COST *rd_cost, BLOCK_SIZE bsize,
|
||||
PICK_MODE_CONTEXT *ctx,
|
||||
int64_t best_rd_so_far) {
|
||||
VP9_COMMON *const cm = &cpi->common;
|
||||
TileInfo *const tile_info = &tile_data->tile_info;
|
||||
RD_OPT *const rd_opt = &cpi->rd;
|
||||
SPEED_FEATURES *const sf = &cpi->sf;
|
||||
MACROBLOCKD *const xd = &x->e_mbd;
|
||||
@ -2872,7 +2872,7 @@ void vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi,
|
||||
for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) {
|
||||
x->pred_mv_sad[ref_frame] = INT_MAX;
|
||||
if (cpi->ref_frame_flags & flag_list[ref_frame]) {
|
||||
setup_buffer_inter(cpi, x, tile, ref_frame, bsize, mi_row, mi_col,
|
||||
setup_buffer_inter(cpi, x, tile_info, ref_frame, bsize, mi_row, mi_col,
|
||||
frame_mv[NEARESTMV], frame_mv[NEARMV], yv12_mb);
|
||||
}
|
||||
frame_mv[NEWMV][ref_frame].as_int = INVALID_MV;
|
||||
@ -3026,9 +3026,9 @@ void vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi,
|
||||
|
||||
if (sf->motion_field_mode_search) {
|
||||
const int mi_width = MIN(num_8x8_blocks_wide_lookup[bsize],
|
||||
tile->mi_col_end - mi_col);
|
||||
tile_info->mi_col_end - mi_col);
|
||||
const int mi_height = MIN(num_8x8_blocks_high_lookup[bsize],
|
||||
tile->mi_row_end - mi_row);
|
||||
tile_info->mi_row_end - mi_row);
|
||||
const int bsl = mi_width_log2_lookup[bsize];
|
||||
int cb_partition_search_ctrl = (((mi_row + mi_col) >> bsl)
|
||||
+ get_chessboard_index(cm->current_video_frame)) & 0x1;
|
||||
@ -3039,7 +3039,7 @@ void vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi,
|
||||
int_mv ref_mv;
|
||||
ref_mv.as_int = INVALID_MV;
|
||||
|
||||
if ((mi_row - 1) >= tile->mi_row_start) {
|
||||
if ((mi_row - 1) >= tile_info->mi_row_start) {
|
||||
ref_mv = xd->mi[-xd->mi_stride].src_mi->mbmi.mv[0];
|
||||
rf = xd->mi[-xd->mi_stride].src_mi->mbmi.ref_frame[0];
|
||||
for (i = 0; i < mi_width; ++i) {
|
||||
@ -3050,7 +3050,7 @@ void vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi,
|
||||
}
|
||||
}
|
||||
|
||||
if ((mi_col - 1) >= tile->mi_col_start) {
|
||||
if ((mi_col - 1) >= tile_info->mi_col_start) {
|
||||
if (ref_mv.as_int == INVALID_MV)
|
||||
ref_mv = xd->mi[-1].src_mi->mbmi.mv[0];
|
||||
if (rf == NONE)
|
||||
@ -3593,13 +3593,13 @@ void vp9_rd_pick_inter_mode_sb_seg_skip(VP9_COMP *cpi,
|
||||
void vp9_rd_pick_inter_mode_sub8x8(VP9_COMP *cpi,
|
||||
TileDataEnc *tile_data,
|
||||
MACROBLOCK *x,
|
||||
const TileInfo *const tile,
|
||||
int mi_row, int mi_col,
|
||||
RD_COST *rd_cost,
|
||||
BLOCK_SIZE bsize,
|
||||
PICK_MODE_CONTEXT *ctx,
|
||||
int64_t best_rd_so_far) {
|
||||
VP9_COMMON *const cm = &cpi->common;
|
||||
TileInfo *const tile_info = &tile_data->tile_info;
|
||||
RD_OPT *const rd_opt = &cpi->rd;
|
||||
SPEED_FEATURES *const sf = &cpi->sf;
|
||||
MACROBLOCKD *const xd = &x->e_mbd;
|
||||
@ -3658,10 +3658,10 @@ void vp9_rd_pick_inter_mode_sub8x8(VP9_COMP *cpi,
|
||||
|
||||
for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ref_frame++) {
|
||||
if (cpi->ref_frame_flags & flag_list[ref_frame]) {
|
||||
setup_buffer_inter(cpi, x, tile,
|
||||
ref_frame, bsize, mi_row, mi_col,
|
||||
frame_mv[NEARESTMV], frame_mv[NEARMV],
|
||||
yv12_mb);
|
||||
setup_buffer_inter(cpi, x, tile_info,
|
||||
ref_frame, bsize, mi_row, mi_col,
|
||||
frame_mv[NEARESTMV], frame_mv[NEARMV],
|
||||
yv12_mb);
|
||||
} else {
|
||||
ref_frame_skip_mask[0] |= (1 << ref_frame);
|
||||
ref_frame_skip_mask[1] |= SECOND_REF_FRAME_MASK;
|
||||
@ -3852,7 +3852,7 @@ void vp9_rd_pick_inter_mode_sub8x8(VP9_COMP *cpi,
|
||||
int newbest, rs;
|
||||
int64_t rs_rd;
|
||||
mbmi->interp_filter = switchable_filter_index;
|
||||
tmp_rd = rd_pick_best_sub8x8_mode(cpi, x, tile,
|
||||
tmp_rd = rd_pick_best_sub8x8_mode(cpi, x, tile_info,
|
||||
&mbmi->ref_mvs[ref_frame][0],
|
||||
second_ref, best_yrd, &rate,
|
||||
&rate_y, &distortion,
|
||||
@ -3918,7 +3918,7 @@ void vp9_rd_pick_inter_mode_sub8x8(VP9_COMP *cpi,
|
||||
if (!pred_exists) {
|
||||
// Handles the special case when a filter that is not in the
|
||||
// switchable list (bilinear, 6-tap) is indicated at the frame level
|
||||
tmp_rd = rd_pick_best_sub8x8_mode(cpi, x, tile,
|
||||
tmp_rd = rd_pick_best_sub8x8_mode(cpi, x, tile_info,
|
||||
&mbmi->ref_mvs[ref_frame][0],
|
||||
second_ref, best_yrd, &rate, &rate_y,
|
||||
&distortion, &skippable, &total_sse,
|
||||
|
@ -32,7 +32,6 @@ void vp9_rd_pick_intra_mode_sb(struct VP9_COMP *cpi, struct macroblock *x,
|
||||
void vp9_rd_pick_inter_mode_sb(struct VP9_COMP *cpi,
|
||||
struct TileDataEnc *tile_data,
|
||||
struct macroblock *x,
|
||||
const struct TileInfo *const tile,
|
||||
int mi_row, int mi_col,
|
||||
struct RD_COST *rd_cost,
|
||||
BLOCK_SIZE bsize, PICK_MODE_CONTEXT *ctx,
|
||||
@ -49,7 +48,6 @@ void vp9_rd_pick_inter_mode_sb_seg_skip(struct VP9_COMP *cpi,
|
||||
void vp9_rd_pick_inter_mode_sub8x8(struct VP9_COMP *cpi,
|
||||
struct TileDataEnc *tile_data,
|
||||
struct macroblock *x,
|
||||
const struct TileInfo *const tile,
|
||||
int mi_row, int mi_col,
|
||||
struct RD_COST *rd_cost,
|
||||
BLOCK_SIZE bsize, PICK_MODE_CONTEXT *ctx,
|
||||
|
Loading…
x
Reference in New Issue
Block a user