Commit 8be7e572 authored by JackyChen's avatar JackyChen

vp9 svc: SVC encoder speed up.

Bias towards base_mv and skip 1/4 pixel motion search when using base mv.
2~3% speed up for 2 spatial layers, 3~5% speed up for 3 spatial layers.
PSNR loss:
(2 layers) 0.07dB for gips_stationary, 0.04dB for gips_motion;
(3 layers) 0.07dB for gips_stationary, 0.06dB for gips_motion.

Change-Id: I773acbda080c301cabe8cd259f842bcc5b8bc999
parent 1c07abca
......@@ -203,9 +203,12 @@ static int combined_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
!(RDCOST(x->rdmult, x->rddiv, (*rate_mv + rate_mode), 0) > best_rd_sofar);
if (rv) {
const int subpel_force_stop = use_base_mv && cpi->sf.base_mv_aggressive
? 2
: cpi->sf.mv.subpel_force_stop;
cpi->find_fractional_mv_step(
x, &tmp_mv->as_mv, &ref_mv, cpi->common.allow_high_precision_mv,
x->errorperbit, &cpi->fn_ptr[bsize], cpi->sf.mv.subpel_force_stop,
x->errorperbit, &cpi->fn_ptr[bsize], subpel_force_stop,
cpi->sf.mv.subpel_iters_per_step, cond_cost_list(cpi, cost_list),
x->nmvjointcost, x->mvcost, &dis, &x->pred_sse[ref], NULL, 0, 0);
*rate_mv = vp9_mv_bit_cost(&tmp_mv->as_mv, &ref_mv, x->nmvjointcost,
......@@ -1602,10 +1605,10 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, TileDataEnc *tile_data,
x->nmvjointcost, x->mvcost, &dis, &x->pred_sse[ref_frame], NULL, 0,
0);
} else if (svc->use_base_mv && svc->spatial_layer_id) {
if (frame_mv[NEWMV][ref_frame].as_int != INVALID_MV &&
frame_mv[NEWMV][ref_frame].as_int != 0) {
if (frame_mv[NEWMV][ref_frame].as_int != INVALID_MV) {
const int pre_stride = xd->plane[0].pre[0].stride;
int base_mv_sad = INT_MAX;
const float base_mv_bias = sf->base_mv_aggressive ? 1.5 : 1.0;
const uint8_t *const pre_buf =
xd->plane[0].pre[0].buf +
(frame_mv[NEWMV][ref_frame].as_mv.row >> 3) * pre_stride +
......@@ -1613,9 +1616,7 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, TileDataEnc *tile_data,
base_mv_sad = cpi->fn_ptr[bsize].sdf(
x->plane[0].src.buf, x->plane[0].src.stride, pre_buf, pre_stride);
// TODO(wonkap): make the decision to use base layer mv on RD;
// not just SAD.
if (base_mv_sad < x->pred_mv_sad[ref_frame]) {
if (base_mv_sad < base_mv_bias * x->pred_mv_sad[ref_frame]) {
// Base layer mv is good.
if (!combined_motion_search(cpi, x, bsize, mi_row, mi_col,
&frame_mv[NEWMV][ref_frame], &rate_mv,
......
......@@ -445,6 +445,7 @@ static void set_rt_speed_feature(VP9_COMP *cpi, SPEED_FEATURES *sf, int speed,
// Enable short circuit for low temporal variance.
sf->short_circuit_low_temp_var = 1;
}
if (cpi->use_svc) sf->base_mv_aggressive = 1;
}
if (speed >= 7) {
......@@ -457,6 +458,7 @@ static void set_rt_speed_feature(VP9_COMP *cpi, SPEED_FEATURES *sf, int speed,
sf->mv.fullpel_search_step_param = 6;
}
}
if (speed >= 8) {
sf->adaptive_rd_thresh = 4;
sf->mv.subpel_force_stop = (content == VP9E_CONTENT_SCREEN) ? 3 : 2;
......@@ -587,6 +589,7 @@ void vp9_set_speed_features_framesize_independent(VP9_COMP *cpi) {
sf->short_circuit_low_temp_var = 0;
sf->limit_newmv_early_exit = 0;
sf->bias_golden = 0;
sf->base_mv_aggressive = 0;
// Some speed-up features even for best quality as minimal impact on quality.
sf->adaptive_rd_thresh = 1;
......
......@@ -453,11 +453,17 @@ typedef struct SPEED_FEATURES {
// INTRA for bsize >= 32x32 and vert/horz INTRA for bsize 16x16, 16x32 and
// 32x16.
int short_circuit_low_temp_var;
// Limits the rd-threshold update for early exit for the newmv-last mode,
// for non-rd mode.
int limit_newmv_early_exit;
// Adds a bias against golden reference, for non-rd mode.
int bias_golden;
// Bias to use base mv and skip 1/4 subpel search when use base mv in
// enhancement layer.
int base_mv_aggressive;
} SPEED_FEATURES;
struct VP9_COMP;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment