Index: source/libvpx/vp9/encoder/vp9_speed_features.c |
diff --git a/source/libvpx/vp9/encoder/vp9_speed_features.c b/source/libvpx/vp9/encoder/vp9_speed_features.c |
index 3515b6e75305ed1a37e6544d1261430d861d294a..4f93578326beab8ee8b9a5dfffbe33dc03f51d61 100644 |
--- a/source/libvpx/vp9/encoder/vp9_speed_features.c |
+++ b/source/libvpx/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); |
@@ -115,8 +138,8 @@ 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->rd_auto_partition_min_limit = set_partition_min_limit(cpi); |
sf->allow_partition_search_skip = 1; |
} |
@@ -301,7 +324,7 @@ static void set_rt_speed_feature(VP9_COMP *cpi, SPEED_FEATURES *sf, |
(frames_since_key % (sf->last_partitioning_redo_frequency << 1) == 1); |
sf->max_delta_qindex = is_keyframe ? 20 : 15; |
sf->partition_search_type = REFERENCE_PARTITION; |
- sf->use_nonrd_pick_mode = !is_keyframe; |
+ sf->use_nonrd_pick_mode = 1; |
sf->allow_skip_recode = 0; |
sf->inter_mode_mask[BLOCK_32X32] = INTER_NEAREST_NEW_ZERO; |
sf->inter_mode_mask[BLOCK_32X64] = INTER_NEAREST_NEW_ZERO; |
@@ -318,11 +341,15 @@ static void set_rt_speed_feature(VP9_COMP *cpi, SPEED_FEATURES *sf, |
if (!is_keyframe) { |
int i; |
if (content == VP9E_CONTENT_SCREEN) { |
- for (i = 0; i < TX_SIZES; ++i) |
- sf->intra_y_mode_mask[i] = INTRA_DC_TM_H_V; |
+ for (i = 0; i < BLOCK_SIZES; ++i) |
+ sf->intra_y_mode_bsize_mask[i] = INTRA_DC_TM_H_V; |
} else { |
- for (i = 0; i < TX_SIZES; i++) |
- sf->intra_y_mode_mask[i] = INTRA_DC; |
+ for (i = 0; i < BLOCK_SIZES; ++i) |
+ if (i >= BLOCK_16X16) |
+ sf->intra_y_mode_bsize_mask[i] = INTRA_DC; |
+ else |
+ // Use H and V intra mode for block sizes <= 16X16. |
+ sf->intra_y_mode_bsize_mask[i] = INTRA_DC_H_V; |
} |
} |
} |
@@ -416,6 +443,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; |