From 287b0c6da95d74f7f20e23f29aa0ff964856f4e4 Mon Sep 17 00:00:00 2001 From: paulwilkins Date: Fri, 1 May 2015 11:31:13 +0100 Subject: Remove CONSTRAIN_NEIGHBORING_MIN_MAX. Remove one of the auto partition size cases. This case can behaves badly in some types of animated content and was only used for the rd encode path. A subsequent patch will add additional checks to help further improve visual quality. Change-Id: I0ebd8da3d45ab8501afa45d7959ced8c2d60ee4e --- vp9/encoder/vp9_encodeframe.c | 29 +---------------------------- vp9/encoder/vp9_speed_features.c | 2 +- vp9/encoder/vp9_speed_features.h | 3 +-- 3 files changed, 3 insertions(+), 31 deletions(-) diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c index fa7a694c5..568314174 100644 --- a/vp9/encoder/vp9_encodeframe.c +++ b/vp9/encoder/vp9_encodeframe.c @@ -2157,7 +2157,6 @@ static void rd_auto_partition_range(VP9_COMP *cpi, const TileInfo *const tile, int bh, bw; BLOCK_SIZE min_size = BLOCK_4X4; BLOCK_SIZE max_size = BLOCK_64X64; - int i = 0; int bs_hist[BLOCK_SIZES] = {0}; // Trap case where we do not have a prediction. @@ -2187,36 +2186,10 @@ static void rd_auto_partition_range(VP9_COMP *cpi, const TileInfo *const tile, bs_hist); } - // adjust observed min and max + // Adjust observed min and max for "relaxed" auto partition case. if (cpi->sf.auto_min_max_partition_size == RELAXED_NEIGHBORING_MIN_MAX) { min_size = min_partition_size[min_size]; max_size = max_partition_size[max_size]; - } else if (cpi->sf.auto_min_max_partition_size == - CONSTRAIN_NEIGHBORING_MIN_MAX) { - // adjust the search range based on the histogram of the observed - // partition sizes from left, above the previous co-located blocks - int sum = 0; - int first_moment = 0; - int second_moment = 0; - int var_unnormalized = 0; - - for (i = 0; i < BLOCK_SIZES; i++) { - sum += bs_hist[i]; - first_moment += bs_hist[i] * i; - second_moment += bs_hist[i] * i * i; - } - - // if variance is small enough, - // adjust the range around its mean size, which gives a tighter range - var_unnormalized = second_moment - first_moment * first_moment / sum; - if (var_unnormalized <= 4 * sum) { - int mean = first_moment / sum; - min_size = min_partition_size[mean]; - max_size = max_partition_size[mean]; - } else { - min_size = min_partition_size[min_size]; - max_size = max_partition_size[max_size]; - } } } diff --git a/vp9/encoder/vp9_speed_features.c b/vp9/encoder/vp9_speed_features.c index 4c5ba5df3..372f1673d 100644 --- a/vp9/encoder/vp9_speed_features.c +++ b/vp9/encoder/vp9_speed_features.c @@ -115,7 +115,7 @@ static void set_good_speed_feature(VP9_COMP *cpi, VP9_COMMON *cm, FLAG_SKIP_INTRA_LOWVAR; sf->disable_filter_search_var_thresh = 100; sf->comp_inter_joint_search_thresh = BLOCK_SIZES; - sf->auto_min_max_partition_size = CONSTRAIN_NEIGHBORING_MIN_MAX; + sf->auto_min_max_partition_size = RELAXED_NEIGHBORING_MIN_MAX; sf->allow_partition_search_skip = 1; } diff --git a/vp9/encoder/vp9_speed_features.h b/vp9/encoder/vp9_speed_features.h index 8722d9cec..ec2560e90 100644 --- a/vp9/encoder/vp9_speed_features.h +++ b/vp9/encoder/vp9_speed_features.h @@ -101,8 +101,7 @@ typedef enum { typedef enum { NOT_IN_USE = 0, RELAXED_NEIGHBORING_MIN_MAX = 1, - CONSTRAIN_NEIGHBORING_MIN_MAX = 2, - STRICT_NEIGHBORING_MIN_MAX = 3 + STRICT_NEIGHBORING_MIN_MAX = 2 } AUTO_MIN_MAX_MODE; typedef enum { -- cgit v1.2.3