Adaptive txfm size selection depending on residual sse/variance

This commit enables an adaptive transform size selection method
for speed -6. It uses largest transform size when the sse is more
than 4 times of variance, i.e., most energy is compacted in the
DC coefficient. Otherwise, use the default TX_8X8. It improves
the compression efficiency for rtc set of speed -6 by 0.8%, no
speed change observed.

Change-Id: Ie6ed1e728ff7bf88ebe940a60811361cdd19969c
This commit is contained in:
Jingning Han 2014-06-25 16:53:07 -07:00
Родитель 73eeb3beff
Коммит 5a3e3c6d3f
3 изменённых файлов: 30 добавлений и 7 удалений

Просмотреть файл

@ -2390,7 +2390,7 @@ static TX_MODE select_tx_mode(const VP9_COMP *cpi) {
rd_opt->tx_select_threshes[frame_type][TX_MODE_SELECT] ? rd_opt->tx_select_threshes[frame_type][TX_MODE_SELECT] ?
ALLOW_32X32 : TX_MODE_SELECT; ALLOW_32X32 : TX_MODE_SELECT;
} else if (cpi->sf.tx_size_search_method == USE_TX_8X8) { } else if (cpi->sf.tx_size_search_method == USE_TX_8X8) {
return ALLOW_8X8; return TX_MODE_SELECT;
} else { } else {
unsigned int total = 0; unsigned int total = 0;
int i; int i;

Просмотреть файл

@ -252,6 +252,17 @@ static void model_rd_for_sb_y(VP9_COMP *cpi, BLOCK_SIZE bsize,
else else
x->skip_txfm = 0; x->skip_txfm = 0;
if (cpi->common.tx_mode == TX_MODE_SELECT) {
if (sse > (var << 2))
xd->mi[0]->mbmi.tx_size = MIN(max_txsize_lookup[bsize],
tx_mode_to_biggest_tx_size[cpi->common.tx_mode]);
else
xd->mi[0]->mbmi.tx_size = TX_8X8;
} else {
xd->mi[0]->mbmi.tx_size = MIN(max_txsize_lookup[bsize],
tx_mode_to_biggest_tx_size[cpi->common.tx_mode]);
}
vp9_model_rd_from_var_lapndz(sse - var, 1 << num_pels_log2_lookup[bsize], vp9_model_rd_from_var_lapndz(sse - var, 1 << num_pels_log2_lookup[bsize],
dc_quant >> 3, &rate, &dist); dc_quant >> 3, &rate, &dist);
*out_rate_sum = rate >> 1; *out_rate_sum = rate >> 1;
@ -293,6 +304,8 @@ int64_t vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
struct macroblockd_plane *const pd = &xd->plane[0]; struct macroblockd_plane *const pd = &xd->plane[0];
PREDICTION_MODE this_mode, best_mode = ZEROMV; PREDICTION_MODE this_mode, best_mode = ZEROMV;
MV_REFERENCE_FRAME ref_frame, best_ref_frame = LAST_FRAME; MV_REFERENCE_FRAME ref_frame, best_ref_frame = LAST_FRAME;
TX_SIZE best_tx_size = MIN(max_txsize_lookup[bsize],
tx_mode_to_biggest_tx_size[cpi->common.tx_mode]);
INTERP_FILTER best_pred_filter = EIGHTTAP; INTERP_FILTER best_pred_filter = EIGHTTAP;
int_mv frame_mv[MB_MODE_COUNT][MAX_REF_FRAMES]; int_mv frame_mv[MB_MODE_COUNT][MAX_REF_FRAMES];
struct buf_2d yv12_mb[4][MAX_MB_PLANE]; struct buf_2d yv12_mb[4][MAX_MB_PLANE];
@ -486,6 +499,7 @@ int64_t vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
int64_t pf_dist[3]; int64_t pf_dist[3];
unsigned int pf_var[3]; unsigned int pf_var[3];
unsigned int pf_sse[3]; unsigned int pf_sse[3];
TX_SIZE pf_tx_size[3];
int64_t best_cost = INT64_MAX; int64_t best_cost = INT64_MAX;
INTERP_FILTER best_filter = SWITCHABLE, filter; INTERP_FILTER best_filter = SWITCHABLE, filter;
PRED_BUFFER *current_pred = this_mode_pred; PRED_BUFFER *current_pred = this_mode_pred;
@ -499,6 +513,7 @@ int64_t vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
cost = RDCOST(x->rdmult, x->rddiv, cost = RDCOST(x->rdmult, x->rddiv,
vp9_get_switchable_rate(cpi) + pf_rate[filter], vp9_get_switchable_rate(cpi) + pf_rate[filter],
pf_dist[filter]); pf_dist[filter]);
pf_tx_size[filter] = mbmi->tx_size;
if (cost < best_cost) { if (cost < best_cost) {
best_filter = filter; best_filter = filter;
best_cost = cost; best_cost = cost;
@ -523,6 +538,7 @@ int64_t vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
free_pred_buffer(current_pred); free_pred_buffer(current_pred);
mbmi->interp_filter = best_filter; mbmi->interp_filter = best_filter;
mbmi->tx_size = pf_tx_size[mbmi->interp_filter];
rate = pf_rate[mbmi->interp_filter]; rate = pf_rate[mbmi->interp_filter];
dist = pf_dist[mbmi->interp_filter]; dist = pf_dist[mbmi->interp_filter];
var_y = pf_var[mbmi->interp_filter]; var_y = pf_var[mbmi->interp_filter];
@ -624,6 +640,7 @@ int64_t vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
*returndistortion = dist; *returndistortion = dist;
best_mode = this_mode; best_mode = this_mode;
best_pred_filter = mbmi->interp_filter; best_pred_filter = mbmi->interp_filter;
best_tx_size = mbmi->tx_size;
best_ref_frame = ref_frame; best_ref_frame = ref_frame;
skip_txfm = x->skip_txfm; skip_txfm = x->skip_txfm;
@ -657,10 +674,11 @@ int64_t vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
bw, bh); bw, bh);
} }
mbmi->mode = best_mode; mbmi->mode = best_mode;
mbmi->interp_filter = best_pred_filter; mbmi->interp_filter = best_pred_filter;
mbmi->ref_frame[0] = best_ref_frame; mbmi->tx_size = best_tx_size;
mbmi->mv[0].as_int = frame_mv[best_mode][best_ref_frame].as_int; mbmi->ref_frame[0] = best_ref_frame;
mbmi->mv[0].as_int = frame_mv[best_mode][best_ref_frame].as_int;
xd->mi[0]->bmi[0].as_mv[0].as_int = mbmi->mv[0].as_int; xd->mi[0]->bmi[0].as_mv[0].as_int = mbmi->mv[0].as_int;
x->skip_txfm = skip_txfm; x->skip_txfm = skip_txfm;
@ -669,7 +687,6 @@ int64_t vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
if (!x->skip && best_rd > inter_mode_thresh && if (!x->skip && best_rd > inter_mode_thresh &&
bsize <= cpi->sf.max_intra_bsize) { bsize <= cpi->sf.max_intra_bsize) {
int i, j; int i, j;
const int step = 1 << mbmi->tx_size;
const int width = num_4x4_blocks_wide_lookup[bsize]; const int width = num_4x4_blocks_wide_lookup[bsize];
const int height = num_4x4_blocks_high_lookup[bsize]; const int height = num_4x4_blocks_high_lookup[bsize];
@ -679,6 +696,10 @@ int64_t vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
const int src_stride = p->src.stride; const int src_stride = p->src.stride;
int block_idx = 0; int block_idx = 0;
TX_SIZE tmp_tx_size = MIN(max_txsize_lookup[bsize],
tx_mode_to_biggest_tx_size[cpi->common.tx_mode]);
const int step = 1 << tmp_tx_size;
for (this_mode = DC_PRED; this_mode <= DC_PRED; ++this_mode) { for (this_mode = DC_PRED; this_mode <= DC_PRED; ++this_mode) {
if (cpi->sf.reuse_inter_pred_sby) { if (cpi->sf.reuse_inter_pred_sby) {
pd->dst.buf = tmp[0].data; pd->dst.buf = tmp[0].data;
@ -688,7 +709,7 @@ int64_t vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
for (j = 0; j < height; j += step) { for (j = 0; j < height; j += step) {
for (i = 0; i < width; i += step) { for (i = 0; i < width; i += step) {
vp9_predict_intra_block(xd, block_idx, b_width_log2(bsize), vp9_predict_intra_block(xd, block_idx, b_width_log2(bsize),
mbmi->tx_size, this_mode, tmp_tx_size, this_mode,
&p->src.buf[4 * (j * dst_stride + i)], &p->src.buf[4 * (j * dst_stride + i)],
src_stride, src_stride,
&pd->dst.buf[4 * (j * dst_stride + i)], &pd->dst.buf[4 * (j * dst_stride + i)],
@ -715,6 +736,7 @@ int64_t vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
*returnrate = rate; *returnrate = rate;
*returndistortion = dist; *returndistortion = dist;
mbmi->mode = this_mode; mbmi->mode = this_mode;
mbmi->tx_size = tmp_tx_size;
mbmi->ref_frame[0] = INTRA_FRAME; mbmi->ref_frame[0] = INTRA_FRAME;
mbmi->uv_mode = this_mode; mbmi->uv_mode = this_mode;
mbmi->mv[0].as_int = INVALID_MV; mbmi->mv[0].as_int = INVALID_MV;

Просмотреть файл

@ -272,7 +272,8 @@ static void set_rt_speed_feature(VP9_COMP *cpi, SPEED_FEATURES *sf,
sf->search_type_check_frequency = 50; sf->search_type_check_frequency = 50;
sf->source_var_thresh = 360; sf->source_var_thresh = 360;
sf->tx_size_search_method = USE_TX_8X8; sf->tx_size_search_method = (cm->frame_type == KEY_FRAME) ?
USE_LARGESTALL : USE_TX_8X8;
sf->max_intra_bsize = BLOCK_8X8; sf->max_intra_bsize = BLOCK_8X8;
// This feature is only enabled when partition search is disabled. // This feature is only enabled when partition search is disabled.