summaryrefslogtreecommitdiff
path: root/vp9
diff options
context:
space:
mode:
Diffstat (limited to 'vp9')
-rw-r--r--vp9/encoder/vp9_encodeframe.c7
-rw-r--r--vp9/encoder/vp9_pickmode.c6
-rw-r--r--vp9/encoder/vp9_speed_features.c4
-rw-r--r--vp9/encoder/vp9_speed_features.h1
4 files changed, 15 insertions, 3 deletions
diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c
index 3ab05375f..5f1175bb7 100644
--- a/vp9/encoder/vp9_encodeframe.c
+++ b/vp9/encoder/vp9_encodeframe.c
@@ -742,9 +742,12 @@ static void set_low_temp_var_flag(VP9_COMP *cpi, MACROBLOCK *x, MACROBLOCKD *xd,
continue;
if ((*this_mi)->sb_type == BLOCK_32X32) {
- if (vt->split[i].part_variances.none.variance < (thresholds[1] >> 1))
+ int64_t threshold_32x32 = cpi->sf.short_circuit_low_temp_var == 3
+ ? ((3 * thresholds[1]) >> 2)
+ : (thresholds[1] >> 1);
+ if (vt->split[i].part_variances.none.variance < threshold_32x32)
x->variance_low[i + 5] = 1;
- } else if (cpi->sf.short_circuit_low_temp_var == 2) {
+ } else if (cpi->sf.short_circuit_low_temp_var >= 2) {
// For 32x16 and 16x32 blocks, the flag is set on each 16x16 block
// inside.
if ((*this_mi)->sb_type == BLOCK_16X16 ||
diff --git a/vp9/encoder/vp9_pickmode.c b/vp9/encoder/vp9_pickmode.c
index 2b7ddbcd9..8b84c3825 100644
--- a/vp9/encoder/vp9_pickmode.c
+++ b/vp9/encoder/vp9_pickmode.c
@@ -1490,6 +1490,10 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, TileDataEnc *tile_data,
if (cpi->sf.short_circuit_low_temp_var) {
force_skip_low_temp_var =
get_force_skip_low_temp_var(&x->variance_low[0], mi_row, mi_col, bsize);
+ // In the most aggresive short circuit, skip golden in any mode
+ if (cpi->sf.short_circuit_low_temp_var == 3 && force_skip_low_temp_var) {
+ usable_ref_frame = LAST_FRAME;
+ }
}
if (!((cpi->ref_frame_flags & flag_list[GOLDEN_FRAME]) &&
@@ -1558,7 +1562,7 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, TileDataEnc *tile_data,
continue;
}
- if (cpi->sf.short_circuit_low_temp_var == 2 && force_skip_low_temp_var &&
+ if (cpi->sf.short_circuit_low_temp_var >= 2 && force_skip_low_temp_var &&
ref_frame == LAST_FRAME && this_mode == NEWMV) {
continue;
}
diff --git a/vp9/encoder/vp9_speed_features.c b/vp9/encoder/vp9_speed_features.c
index 3e1ed50a6..67526e5b7 100644
--- a/vp9/encoder/vp9_speed_features.c
+++ b/vp9/encoder/vp9_speed_features.c
@@ -506,6 +506,10 @@ static void set_rt_speed_feature(VP9_COMP *cpi, SPEED_FEATURES *sf, int speed,
content != VP9E_CONTENT_SCREEN) {
// More aggressive short circuit for speed 8.
sf->short_circuit_low_temp_var = 2;
+ // More aggressive short circuit for low resolution
+ if (cm->width <= 352 && cm->height <= 288) {
+ sf->short_circuit_low_temp_var = 3;
+ }
}
sf->limit_newmv_early_exit = 0;
}
diff --git a/vp9/encoder/vp9_speed_features.h b/vp9/encoder/vp9_speed_features.h
index 6d0b9420a..050443765 100644
--- a/vp9/encoder/vp9_speed_features.h
+++ b/vp9/encoder/vp9_speed_features.h
@@ -457,6 +457,7 @@ typedef struct SPEED_FEATURES {
// 2: Skip golden non-zeromv and newmv-last for bsize >= 16x16, skip ALL
// INTRA for bsize >= 32x32 and vert/horz INTRA for bsize 16x16, 16x32 and
// 32x16.
+ // 3: Same as (2), also skip golden in any mode for low res
int short_circuit_low_temp_var;
// Limits the rd-threshold update for early exit for the newmv-last mode,