summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vp9/encoder/vp9_pickmode.c13
-rw-r--r--vp9/encoder/vp9_speed_features.c3
-rw-r--r--vp9/encoder/vp9_speed_features.h6
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;