Merge "Key frame non-RD mode decision process"
This commit is contained in:
commit
e6fb9c0b0b
@ -2601,7 +2601,9 @@ static void nonrd_pick_sb_modes(VP9_COMP *cpi,
|
|||||||
if (mbmi->segment_id)
|
if (mbmi->segment_id)
|
||||||
x->rdmult = vp9_cyclic_refresh_get_rdmult(cpi->cyclic_refresh);
|
x->rdmult = vp9_cyclic_refresh_get_rdmult(cpi->cyclic_refresh);
|
||||||
|
|
||||||
if (vp9_segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP))
|
if (cm->frame_type == KEY_FRAME)
|
||||||
|
vp9_pick_intra_mode(cpi, x, rd_cost, bsize, ctx);
|
||||||
|
else if (vp9_segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP))
|
||||||
set_mode_info_seg_skip(x, cm->tx_mode, rd_cost, bsize);
|
set_mode_info_seg_skip(x, cm->tx_mode, rd_cost, bsize);
|
||||||
else
|
else
|
||||||
vp9_pick_inter_mode(cpi, x, tile_data, mi_row, mi_col,
|
vp9_pick_inter_mode(cpi, x, tile_data, mi_row, mi_col,
|
||||||
@ -3456,7 +3458,7 @@ static void encode_tiles(VP9_COMP *cpi) {
|
|||||||
|
|
||||||
for (mi_row = tile_info->mi_row_start; mi_row < tile_info->mi_row_end;
|
for (mi_row = tile_info->mi_row_start; mi_row < tile_info->mi_row_end;
|
||||||
mi_row += MI_BLOCK_SIZE) {
|
mi_row += MI_BLOCK_SIZE) {
|
||||||
if (cpi->sf.use_nonrd_pick_mode && !frame_is_intra_only(cm))
|
if (cpi->sf.use_nonrd_pick_mode)
|
||||||
encode_nonrd_sb_row(cpi, this_tile, mi_row, &tok[tile_row][tile_col]);
|
encode_nonrd_sb_row(cpi, this_tile, mi_row, &tok[tile_row][tile_col]);
|
||||||
else
|
else
|
||||||
encode_rd_sb_row(cpi, this_tile, mi_row, &tok[tile_row][tile_col]);
|
encode_rd_sb_row(cpi, this_tile, mi_row, &tok[tile_row][tile_col]);
|
||||||
|
@ -464,6 +464,57 @@ static const PREDICTION_MODE intra_mode_list[] = {
|
|||||||
DC_PRED, V_PRED, H_PRED, TM_PRED
|
DC_PRED, V_PRED, H_PRED, TM_PRED
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void vp9_pick_intra_mode(VP9_COMP *cpi, MACROBLOCK *x, RD_COST *rd_cost,
|
||||||
|
BLOCK_SIZE bsize, PICK_MODE_CONTEXT *ctx) {
|
||||||
|
MACROBLOCKD *const xd = &x->e_mbd;
|
||||||
|
MB_MODE_INFO *const mbmi = &xd->mi[0].src_mi->mbmi;
|
||||||
|
RD_COST this_rdc, best_rdc;
|
||||||
|
PREDICTION_MODE this_mode;
|
||||||
|
struct estimate_block_intra_args args = { cpi, x, DC_PRED, 0, 0 };
|
||||||
|
const TX_SIZE intra_tx_size =
|
||||||
|
MIN(max_txsize_lookup[bsize],
|
||||||
|
tx_mode_to_biggest_tx_size[cpi->common.tx_mode]);
|
||||||
|
MODE_INFO *const mic = xd->mi[0].src_mi;
|
||||||
|
int *bmode_costs;
|
||||||
|
const MODE_INFO *above_mi = xd->mi[-xd->mi_stride].src_mi;
|
||||||
|
const MODE_INFO *left_mi = xd->left_available ? xd->mi[-1].src_mi : NULL;
|
||||||
|
const PREDICTION_MODE A = vp9_above_block_mode(mic, above_mi, 0);
|
||||||
|
const PREDICTION_MODE L = vp9_left_block_mode(mic, left_mi, 0);
|
||||||
|
bmode_costs = cpi->y_mode_costs[A][L];
|
||||||
|
|
||||||
|
(void) ctx;
|
||||||
|
vp9_rd_cost_reset(&best_rdc);
|
||||||
|
vp9_rd_cost_reset(&this_rdc);
|
||||||
|
|
||||||
|
mbmi->ref_frame[0] = INTRA_FRAME;
|
||||||
|
mbmi->mv[0].as_int = INVALID_MV;
|
||||||
|
mbmi->uv_mode = DC_PRED;
|
||||||
|
vpx_memset(x->skip_txfm, 0, sizeof(x->skip_txfm));
|
||||||
|
|
||||||
|
// Change the limit of this loop to add other intra prediction
|
||||||
|
// mode tests.
|
||||||
|
for (this_mode = DC_PRED; this_mode <= H_PRED; ++this_mode) {
|
||||||
|
args.mode = this_mode;
|
||||||
|
args.rate = 0;
|
||||||
|
args.dist = 0;
|
||||||
|
mbmi->tx_size = intra_tx_size;
|
||||||
|
vp9_foreach_transformed_block_in_plane(xd, bsize, 0,
|
||||||
|
estimate_block_intra, &args);
|
||||||
|
this_rdc.rate = args.rate;
|
||||||
|
this_rdc.dist = args.dist;
|
||||||
|
this_rdc.rate += bmode_costs[this_mode];
|
||||||
|
this_rdc.rdcost = RDCOST(x->rdmult, x->rddiv,
|
||||||
|
this_rdc.rate, this_rdc.dist);
|
||||||
|
|
||||||
|
if (this_rdc.rdcost < best_rdc.rdcost) {
|
||||||
|
best_rdc = this_rdc;
|
||||||
|
mbmi->mode = this_mode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*rd_cost = best_rdc;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO(jingning) placeholder for inter-frame non-RD mode decision.
|
// TODO(jingning) placeholder for inter-frame non-RD mode decision.
|
||||||
// this needs various further optimizations. to be continued..
|
// this needs various further optimizations. to be continued..
|
||||||
void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
|
void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
|
||||||
|
@ -17,6 +17,9 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void vp9_pick_intra_mode(VP9_COMP *cpi, MACROBLOCK *x, RD_COST *rd_cost,
|
||||||
|
BLOCK_SIZE bsize, PICK_MODE_CONTEXT *ctx);
|
||||||
|
|
||||||
void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
|
void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
|
||||||
TileDataEnc *tile_data,
|
TileDataEnc *tile_data,
|
||||||
int mi_row, int mi_col, RD_COST *rd_cost,
|
int mi_row, int mi_col, RD_COST *rd_cost,
|
||||||
|
@ -294,7 +294,7 @@ static void set_rt_speed_feature(VP9_COMP *cpi, SPEED_FEATURES *sf,
|
|||||||
(frames_since_key % (sf->last_partitioning_redo_frequency << 1) == 1);
|
(frames_since_key % (sf->last_partitioning_redo_frequency << 1) == 1);
|
||||||
sf->max_delta_qindex = is_keyframe ? 20 : 15;
|
sf->max_delta_qindex = is_keyframe ? 20 : 15;
|
||||||
sf->partition_search_type = REFERENCE_PARTITION;
|
sf->partition_search_type = REFERENCE_PARTITION;
|
||||||
sf->use_nonrd_pick_mode = 1;
|
sf->use_nonrd_pick_mode = !is_keyframe;
|
||||||
sf->allow_skip_recode = 0;
|
sf->allow_skip_recode = 0;
|
||||||
sf->inter_mode_mask[BLOCK_32X32] = INTER_NEAREST_NEW_ZERO;
|
sf->inter_mode_mask[BLOCK_32X32] = INTER_NEAREST_NEW_ZERO;
|
||||||
sf->inter_mode_mask[BLOCK_32X64] = INTER_NEAREST_NEW_ZERO;
|
sf->inter_mode_mask[BLOCK_32X64] = INTER_NEAREST_NEW_ZERO;
|
||||||
@ -319,6 +319,9 @@ static void set_rt_speed_feature(VP9_COMP *cpi, SPEED_FEATURES *sf,
|
|||||||
if (speed >= 6) {
|
if (speed >= 6) {
|
||||||
// Adaptively switch between SOURCE_VAR_BASED_PARTITION and FIXED_PARTITION.
|
// Adaptively switch between SOURCE_VAR_BASED_PARTITION and FIXED_PARTITION.
|
||||||
sf->partition_search_type = VAR_BASED_PARTITION;
|
sf->partition_search_type = VAR_BASED_PARTITION;
|
||||||
|
|
||||||
|
// Turn on this to use non-RD key frame coding mode.
|
||||||
|
// sf->use_nonrd_pick_mode = 1;
|
||||||
sf->search_type_check_frequency = 50;
|
sf->search_type_check_frequency = 50;
|
||||||
sf->mv.search_method = NSTEP;
|
sf->mv.search_method = NSTEP;
|
||||||
sf->tx_size_search_method = is_keyframe ? USE_LARGESTALL : USE_TX_8X8;
|
sf->tx_size_search_method = is_keyframe ? USE_LARGESTALL : USE_TX_8X8;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user