ref: e92a68c226f6de7a87d3e9d992651f799b0b117c
parent: a2d35b234f176316fb978d8c7099a003ddd4e8ab
author: Marco Paniconi <[email protected]>
date: Fri Jun 29 07:15:00 EDT 2018
vp9: Reduce quality artifact for real-time scene-content. Add scene detection flag to choose_partitioning to force split of 64x64 block partition. This reduces artifacts on slide changes. Bug:b/110978869 Change-Id: I9cc79a7c03f3aa2edeb28656b09a2177b72d59a8
--- a/vp9/encoder/vp9_encodeframe.c
+++ b/vp9/encoder/vp9_encodeframe.c
@@ -592,6 +592,11 @@
cpi->vbp_threshold_copy = (cpi->y_dequant[q][1] << 3) > 8000
? (cpi->y_dequant[q][1] << 3)
: 8000;
+ if (cpi->rc.high_source_sad ||
+ (cpi->use_svc && cpi->svc.high_source_sad_superframe)) {
+ cpi->vbp_threshold_sad = 0;
+ cpi->vbp_threshold_copy = 0;
+ }
}
cpi->vbp_threshold_minmax = 15 + (q >> 3);
}
@@ -1213,6 +1218,9 @@
int pixels_wide = 64, pixels_high = 64;
int64_t thresholds[4] = { cpi->vbp_thresholds[0], cpi->vbp_thresholds[1],
cpi->vbp_thresholds[2], cpi->vbp_thresholds[3] };
+ int scene_change_detected =
+ cpi->rc.high_source_sad ||
+ (cpi->use_svc && cpi->svc.high_source_sad_superframe);
// For the variance computation under SVC mode, we treat the frame as key if
// the reference (base layer frame) is key frame (i.e., is_key_frame == 1).
@@ -1274,6 +1282,7 @@
}
// If source_sad is low copy the partition without computing the y_sad.
if (x->skip_low_source_sad && cpi->sf.copy_partition_flag &&
+ !scene_change_detected &&
copy_partitioning(cpi, x, xd, mi_row, mi_col, segment_id, sb_offset)) {
x->sb_use_mv_part = 1;
if (cpi->sf.svc_use_lowres_part &&
@@ -1302,7 +1311,7 @@
// Index for force_split: 0 for 64x64, 1-4 for 32x32 blocks,
// 5-20 for the 16x16 blocks.
- force_split[0] = 0;
+ force_split[0] = scene_change_detected;
if (!is_key_frame) {
// In the case of spatial/temporal scalable coding, the assumption here is