From 8be7e572a70ebe98693762868e2a72673e74feb9 Mon Sep 17 00:00:00 2001 From: JackyChen Date: Fri, 5 Aug 2016 11:10:29 -0700 Subject: [PATCH] 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 --- vp9/encoder/vp9_pickmode.c | 13 +++++++------ vp9/encoder/vp9_speed_features.c | 3 +++ vp9/encoder/vp9_speed_features.h | 6 ++++++ 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/vp9/encoder/vp9_pickmode.c b/vp9/encoder/vp9_pickmode.c index b95514332..ef41c6bf7 100644 --- a/vp9/encoder/vp9_pickmode.c +++ b/vp9/encoder/vp9_pickmode.c @@ -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, diff --git a/vp9/encoder/vp9_speed_features.c b/vp9/encoder/vp9_speed_features.c index 77b96792f..10f0a2642 100644 --- a/vp9/encoder/vp9_speed_features.c +++ b/vp9/encoder/vp9_speed_features.c @@ -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; diff --git a/vp9/encoder/vp9_speed_features.h b/vp9/encoder/vp9_speed_features.h index b86c18662..573a38e66 100644 --- a/vp9/encoder/vp9_speed_features.h +++ b/vp9/encoder/vp9_speed_features.h @@ -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;