ref: 28881dcfda9082507ba806e35474e699877d4d0b
parent: 8af27dcd90cf3781097dce665d734e68fa9f5c78
author: Marco Paniconi <marpan@google.com>
date: Fri Mar 15 05:13:45 EDT 2019
vp9-rtc: Adjustments for base layer in screen. On scene/content changes for base layer of screen: reduce 32x32 split threshold, bias rdcost for flat blocks if sse_y is non-zero, and avoid early exit on intra-check. Reduce artifacts in scroll content. Change-Id: I144357a61462351173af900e0b8a47dac4aad6ca
--- a/vp9/encoder/vp9_encodeframe.c
+++ b/vp9/encoder/vp9_encodeframe.c
@@ -1352,6 +1352,11 @@
} else {
set_vbp_thresholds(cpi, thresholds, cm->base_qindex, content_state);
}
+ // Decrease 32x32 split threshold for screen on base layer, for scene
+ // change/high motion frames.
+ if (cpi->oxcf.content == VP9E_CONTENT_SCREEN &&
+ cpi->svc.spatial_layer_id == 0 && force_64_split)
+ thresholds[1] = 3 * thresholds[1] >> 2;
// For non keyframes, disable 4x4 average for low resolution when speed = 8
threshold_4x4avg = (cpi->oxcf.speed < 8) ? thresholds[1] << 1 : INT64_MAX;
--- a/vp9/encoder/vp9_pickmode.c
+++ b/vp9/encoder/vp9_pickmode.c
@@ -2337,7 +2337,8 @@
// Skipping checking: test to see if this block can be reconstructed by
// prediction only.
- if (cpi->allow_encode_breakout && !xd->lossless && !scene_change_detected) {
+ if (cpi->allow_encode_breakout && !xd->lossless && !scene_change_detected &&
+ !svc->high_num_blocks_with_motion) {
encode_breakout_test(cpi, x, bsize, mi_row, mi_col, ref_frame, this_mode,
var_y, sse_y, yv12_mb, &this_rdc.rate,
&this_rdc.dist, flag_preduv_computed);
@@ -2348,6 +2349,15 @@
}
}
+ // On spatially flat blocks for screne content: bias against zero-last
+ // if the sse_y is non-zero. Only on scene change or high motion frames.
+ if (cpi->oxcf.content == VP9E_CONTENT_SCREEN &&
+ (scene_change_detected || svc->high_num_blocks_with_motion) &&
+ ref_frame == LAST_FRAME && frame_mv[this_mode][ref_frame].as_int == 0 &&
+ svc->spatial_layer_id == 0 && x->source_variance == 0 && sse_y > 0) {
+ this_rdc.rdcost = this_rdc.rdcost << 2;
+ }
+
#if CONFIG_VP9_TEMPORAL_DENOISING
if (cpi->oxcf.noise_sensitivity > 0 && denoise_svc_pickmode &&
cpi->denoiser.denoising_level > kDenLowLow) {
@@ -2489,8 +2499,14 @@
&rd_thresh_freq_fact[mode_index])) ||
(!cpi->sf.adaptive_rd_thresh_row_mt &&
rd_less_than_thresh(best_rdc.rdcost, mode_rd_thresh,
- &rd_thresh_freq_fact[mode_index])))
- continue;
+ &rd_thresh_freq_fact[mode_index]))) {
+ // Avoid this early exit for screen on base layer, for scene
+ // changes or high motion frames.
+ if (cpi->oxcf.content != VP9E_CONTENT_SCREEN ||
+ svc->spatial_layer_id > 0 ||
+ (!scene_change_detected && !svc->high_num_blocks_with_motion))
+ continue;
+ }
mi->mode = this_mode;
mi->ref_frame[0] = INTRA_FRAME;