summaryrefslogtreecommitdiff
path: root/vp9/encoder/vp9_speed_features.c
diff options
context:
space:
mode:
authorpaulwilkins <paulwilkins@google.com>2015-05-01 13:45:43 +0100
committerpaulwilkins <paulwilkins@google.com>2015-05-01 16:16:02 +0100
commit4a7dcf8eb2bfc888166225a450ce8ae50f167fd5 (patch)
tree7881fbbfac18c0cf91de6b2ee71a341f75ca9868 /vp9/encoder/vp9_speed_features.c
parent287b0c6da95d74f7f20e23f29aa0ff964856f4e4 (diff)
downloadlibvpx-4a7dcf8eb2bfc888166225a450ce8ae50f167fd5.tar
libvpx-4a7dcf8eb2bfc888166225a450ce8ae50f167fd5.tar.gz
libvpx-4a7dcf8eb2bfc888166225a450ce8ae50f167fd5.tar.bz2
libvpx-4a7dcf8eb2bfc888166225a450ce8ae50f167fd5.zip
Image size restriction to rd auto partition search.
Impose a limit on the rd auto partition search based on the image format. Smaller formats require that the search includes includes a smaller minimum block size. This change is intended to mitigate the visual impact of ringing in some problem clips, for smaller image formats. Change-Id: Ie039e5f599ee079bbef5d272f3e40e2e27d8f97b
Diffstat (limited to 'vp9/encoder/vp9_speed_features.c')
-rw-r--r--vp9/encoder/vp9_speed_features.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/vp9/encoder/vp9_speed_features.c b/vp9/encoder/vp9_speed_features.c
index 372f1673d..fd763f4f3 100644
--- a/vp9/encoder/vp9_speed_features.c
+++ b/vp9/encoder/vp9_speed_features.c
@@ -72,6 +72,29 @@ static void set_good_speed_feature_framesize_dependent(VP9_COMMON *cm,
}
}
+// Sets a partition size down to which the auto partition code will always
+// search (can go lower), based on the image dimensions. The logic here
+// is that the extent to which ringing artefacts are offensive, depends
+// partly on the screen area that over which they propogate. Propogation is
+// limited by transform block size but the screen area take up by a given block
+// size will be larger for a small image format stretched to full screen.
+static BLOCK_SIZE set_partition_min_limit(VP9_COMP *cpi) {
+ VP9_COMMON *const cm = &cpi->common;
+ unsigned int screen_area = (cm->width * cm->height);
+
+ // Select block size based on image format size.
+ if (screen_area < 1280 * 720) {
+ // Formats smaller in area than 720P
+ return BLOCK_4X4;
+ } else if (screen_area < 1920 * 1080) {
+ // Format >= 720P and < 1080P
+ return BLOCK_8X8;
+ } else {
+ // Formats 1080P and up
+ return BLOCK_16X16;
+ }
+}
+
static void set_good_speed_feature(VP9_COMP *cpi, VP9_COMMON *cm,
SPEED_FEATURES *sf, int speed) {
const int boosted = frame_is_boosted(cpi);
@@ -116,7 +139,7 @@ static void set_good_speed_feature(VP9_COMP *cpi, VP9_COMMON *cm,
sf->disable_filter_search_var_thresh = 100;
sf->comp_inter_joint_search_thresh = BLOCK_SIZES;
sf->auto_min_max_partition_size = RELAXED_NEIGHBORING_MIN_MAX;
-
+ sf->rd_auto_partition_min_limit = set_partition_min_limit(cpi);
sf->allow_partition_search_skip = 1;
}
@@ -416,6 +439,7 @@ void vp9_set_speed_features_framesize_independent(VP9_COMP *cpi) {
sf->less_rectangular_check = 0;
sf->use_square_partition_only = 0;
sf->auto_min_max_partition_size = NOT_IN_USE;
+ sf->rd_auto_partition_min_limit = BLOCK_4X4;
sf->default_max_partition_size = BLOCK_64X64;
sf->default_min_partition_size = BLOCK_4X4;
sf->adjust_partitioning_from_last_frame = 0;