Use 8x8 block resolution for dif cts model
This resolves certain blocky artifacts caused by the 16x16 block
resolution.
BUG=b/197857708
STATS_CHANGED
Change-Id: I0b02c793a45fb3dbe76af6cf848195788eb1cb8e
diff --git a/av1/encoder/allintra_vis.c b/av1/encoder/allintra_vis.c
index 385feba..391fb25 100644
--- a/av1/encoder/allintra_vis.c
+++ b/av1/encoder/allintra_vis.c
@@ -31,7 +31,7 @@
void av1_init_mb_wiener_var_buffer(AV1_COMP *cpi) {
AV1_COMMON *cm = &cpi->common;
- cpi->weber_bsize = BLOCK_16X16;
+ cpi->weber_bsize = BLOCK_8X8;
if (cpi->mb_weber_stats) return;
@@ -112,6 +112,7 @@
continue;
WeberStats *weber_stats =
&cpi->mb_weber_stats[(row / mi_step) * mb_stride + (col / mi_step)];
+ if (weber_stats->max_scale < 1.0) continue;
if (weber_stats->max_scale < min_max_scale)
min_max_scale = weber_stats->max_scale;
}
@@ -399,33 +400,35 @@
cpi->norm_wiener_variance = (int64_t)(exp(sb_wiener_log / sb_count));
cpi->norm_wiener_variance = AOMMAX(1, cpi->norm_wiener_variance);
- sb_wiener_log = 0;
- sb_count = 0;
- for (mi_row = 0; mi_row < cm->mi_params.mi_rows; mi_row += sb_step) {
- for (mi_col = 0; mi_col < cm->mi_params.mi_cols; mi_col += sb_step) {
- int sb_wiener_var =
- get_var_perceptual_ai(cpi, cm->seq_params->sb_size, mi_row, mi_col);
+ for (int its_cnt = 0; its_cnt < 2; ++its_cnt) {
+ sb_wiener_log = 0;
+ sb_count = 0;
+ for (mi_row = 0; mi_row < cm->mi_params.mi_rows; mi_row += sb_step) {
+ for (mi_col = 0; mi_col < cm->mi_params.mi_cols; mi_col += sb_step) {
+ int sb_wiener_var =
+ get_var_perceptual_ai(cpi, cm->seq_params->sb_size, mi_row, mi_col);
- double beta = (double)cpi->norm_wiener_variance / sb_wiener_var;
- double min_max_scale =
- AOMMAX(1.0, get_max_scale(cpi, bsize, mi_row, mi_col));
- beta = 1.0 / AOMMIN(1.0 / beta, min_max_scale);
- beta = AOMMIN(beta, 4);
- beta = AOMMAX(beta, 0.25);
+ double beta = (double)cpi->norm_wiener_variance / sb_wiener_var;
+ double min_max_scale =
+ AOMMAX(1.0, get_max_scale(cpi, bsize, mi_row, mi_col));
+ beta = 1.0 / AOMMIN(1.0 / beta, min_max_scale);
+ beta = AOMMIN(beta, 4);
+ beta = AOMMAX(beta, 0.25);
- sb_wiener_var = (int)(cpi->norm_wiener_variance / beta);
+ sb_wiener_var = (int)(cpi->norm_wiener_variance / beta);
- int64_t satd = get_satd(cpi, cm->seq_params->sb_size, mi_row, mi_col);
- int64_t sse = get_sse(cpi, cm->seq_params->sb_size, mi_row, mi_col);
- double scaled_satd = (double)satd / sqrt((double)sse);
- sb_wiener_log += scaled_satd * log(sb_wiener_var);
- sb_count += scaled_satd;
+ int64_t satd = get_satd(cpi, cm->seq_params->sb_size, mi_row, mi_col);
+ int64_t sse = get_sse(cpi, cm->seq_params->sb_size, mi_row, mi_col);
+ double scaled_satd = (double)satd / sqrt((double)sse);
+ sb_wiener_log += scaled_satd * log(sb_wiener_var);
+ sb_count += scaled_satd;
+ }
}
- }
- if (sb_count > 0)
- cpi->norm_wiener_variance = (int64_t)(exp(sb_wiener_log / sb_count));
- cpi->norm_wiener_variance = AOMMAX(1, cpi->norm_wiener_variance);
+ if (sb_count > 0)
+ cpi->norm_wiener_variance = (int64_t)(exp(sb_wiener_log / sb_count));
+ cpi->norm_wiener_variance = AOMMAX(1, cpi->norm_wiener_variance);
+ }
aom_free_frame_buffer(&cm->cur_frame->buf);
}