ref: 27c13712c9c5d665ee84d8753255a23257c43600
parent: be916257bdd9edf114a6e3f4685ee0dc3ac08197
parent: 7da6324cab32d8080f497c912107f94b661a866e
author: Alex Converse <[email protected]>
date: Fri Jan 22 21:04:37 EST 2016
Merge "Short circuit flat blocks when coding screen content at realtime speed."
--- a/vp9/encoder/vp9_pickmode.c
+++ b/vp9/encoder/vp9_pickmode.c
@@ -1251,6 +1251,17 @@
mi->tx_size = VPXMIN(max_txsize_lookup[bsize],
tx_mode_to_biggest_tx_size[cm->tx_mode]);
+ if (sf->short_circuit_flat_blocks) {
+#if CONFIG_VP9_HIGHBITDEPTH
+ if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH)
+ x->source_variance = vp9_high_get_sby_perpixel_variance(
+ cpi, &x->plane[0].src, bsize, xd->bd);
+ else
+#endif // CONFIG_VP9_HIGHBITDEPTH
+ x->source_variance =
+ vp9_get_sby_perpixel_variance(cpi, &x->plane[0].src, bsize);
+ }
+
#if CONFIG_VP9_TEMPORAL_DENOISING
vp9_denoiser_reset_frame_stats(ctx);
#endif
@@ -1289,6 +1300,11 @@
if (cpi->use_svc)
this_mode = ref_mode_set_svc[idx].pred_mode;
+ if (sf->short_circuit_flat_blocks && x->source_variance == 0 &&
+ this_mode != NEARESTMV) {
+ continue;
+ }
+
if (!(cpi->sf.inter_mode_mask[bsize] & (1 << this_mode)))
continue;
@@ -1704,6 +1720,10 @@
const PREDICTION_MODE this_mode = intra_mode_list[i];
THR_MODES mode_index = mode_idx[INTRA_FRAME][mode_offset(this_mode)];
int mode_rd_thresh = rd_threshes[mode_index];
+ if (sf->short_circuit_flat_blocks && x->source_variance == 0 &&
+ this_mode != DC_PRED) {
+ continue;
+ }
if (!((1 << this_mode) & cpi->sf.intra_y_mode_bsize_mask[bsize]))
continue;
--- a/vp9/encoder/vp9_rd.h
+++ b/vp9/encoder/vp9_rd.h
@@ -182,6 +182,15 @@
int vp9_get_intra_cost_penalty(int qindex, int qdelta,
vpx_bit_depth_t bit_depth);
+unsigned int vp9_get_sby_perpixel_variance(struct VP9_COMP *cpi,
+ const struct buf_2d *ref,
+ BLOCK_SIZE bs);
+#if CONFIG_VP9_HIGHBITDEPTH
+unsigned int vp9_high_get_sby_perpixel_variance(struct VP9_COMP *cpi,
+ const struct buf_2d *ref,
+ BLOCK_SIZE bs, int bd);
+#endif
+
#ifdef __cplusplus
} // extern "C"
#endif
--- a/vp9/encoder/vp9_rdopt.h
+++ b/vp9/encoder/vp9_rdopt.h
@@ -29,15 +29,6 @@
struct RD_COST *rd_cost, BLOCK_SIZE bsize,
PICK_MODE_CONTEXT *ctx, int64_t best_rd);
-unsigned int vp9_get_sby_perpixel_variance(VP9_COMP *cpi,
- const struct buf_2d *ref,
- BLOCK_SIZE bs);
-#if CONFIG_VP9_HIGHBITDEPTH
-unsigned int vp9_high_get_sby_perpixel_variance(VP9_COMP *cpi,
- const struct buf_2d *ref,
- BLOCK_SIZE bs, int bd);
-#endif
-
void vp9_rd_pick_inter_mode_sb(struct VP9_COMP *cpi,
struct TileDataEnc *tile_data,
struct macroblock *x,
--- a/vp9/encoder/vp9_speed_features.c
+++ b/vp9/encoder/vp9_speed_features.c
@@ -401,6 +401,9 @@
sf->intra_y_mode_bsize_mask[i] = INTRA_DC_H_V;
}
}
+ if (content == VP9E_CONTENT_SCREEN) {
+ sf->short_circuit_flat_blocks = 1;
+ }
}
if (speed >= 6) {
@@ -534,6 +537,7 @@
sf->recode_tolerance = 25;
sf->default_interp_filter = SWITCHABLE;
sf->simple_model_rd_from_var = 0;
+ sf->short_circuit_flat_blocks = 0;
// Some speed-up features even for best quality as minimal impact on quality.
sf->adaptive_rd_thresh = 1;
--- a/vp9/encoder/vp9_speed_features.h
+++ b/vp9/encoder/vp9_speed_features.h
@@ -438,6 +438,10 @@
// Fast approximation of vp9_model_rd_from_var_lapndz
int simple_model_rd_from_var;
+
+ // Skip a number of expensive mode evaluations for blocks with zero source
+ // variance.
+ int short_circuit_flat_blocks;
} SPEED_FEATURES;
struct VP9_COMP;