From a0de2692fc5ee69825b35fa6158f116448849e68 Mon Sep 17 00:00:00 2001 From: Marco Date: Mon, 21 Aug 2017 16:39:56 -0700 Subject: [PATCH] vp9: Speed 6 adapt_partition for live/vbr usage. Enable adapt_partition for vbr mode for speed 6. This allows the usage of the pickmode-based partition (used in speed 5), but only selectively for superblocks with high source sad, otherwise the faster variance based partition scheme is used. For speed 6 on ytlive set: avgPSNR/SSIM metrics up by ~0.6%, several clips up by ~1.5%. Small/negligible decrease in speed. Change-Id: I12f3efef6b3e059391de330fdbe5a44c2587f1f8 --- vp9/encoder/vp9_encodeframe.c | 5 ++++- vp9/encoder/vp9_speed_features.c | 5 +++-- vp9/encoder/vp9_speed_features.h | 6 ++++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c index 0051361bb..39c94adf3 100644 --- a/vp9/encoder/vp9_encodeframe.c +++ b/vp9/encoder/vp9_encodeframe.c @@ -4178,7 +4178,10 @@ static void encode_nonrd_sb_row(VP9_COMP *cpi, ThreadData *td, int shift = cpi->Source->y_stride * (mi_row << 3) + (mi_col << 3); int sb_offset2 = ((cm->mi_cols + 7) >> 3) * (mi_row >> 3) + (mi_col >> 3); int64_t source_sad = avg_source_sad(cpi, x, shift, sb_offset2); - if (sf->adapt_partition_source_sad && source_sad > 40000) + if (sf->adapt_partition_source_sad && + (cpi->oxcf.rc_mode == VPX_VBR && + source_sad > sf->adapt_partition_thresh && + cpi->refresh_golden_frame)) partition_search_type = REFERENCE_PARTITION; } diff --git a/vp9/encoder/vp9_speed_features.c b/vp9/encoder/vp9_speed_features.c index 43ef4254d..c4baa4fdb 100644 --- a/vp9/encoder/vp9_speed_features.c +++ b/vp9/encoder/vp9_speed_features.c @@ -535,8 +535,9 @@ static void set_rt_speed_feature_framesize_independent( if (!cpi->external_resize && cm->width <= 1920) sf->use_source_sad = 1; if (sf->use_source_sad) { - if (cm->width * cm->height <= 640 * 360) - sf->adapt_partition_source_sad = 1; + sf->adapt_partition_source_sad = 1; + sf->adapt_partition_thresh = + (cm->width * cm->height <= 640 * 360) ? 40000 : 80000; if (cpi->content_state_sb_fd == NULL && (!cpi->use_svc || cpi->svc.spatial_layer_id == cpi->svc.number_spatial_layers - 1)) { diff --git a/vp9/encoder/vp9_speed_features.h b/vp9/encoder/vp9_speed_features.h index 11e3154a0..bf266c4a3 100644 --- a/vp9/encoder/vp9_speed_features.h +++ b/vp9/encoder/vp9_speed_features.h @@ -491,9 +491,11 @@ typedef struct SPEED_FEATURES { int use_simple_block_yrd; - // If source sad of superblock is high, will switch from VARIANCE_PARTITION to - // REFERENCE_PARTITION (which selects partition based on the nonrd-pickmode). + // If source sad of superblock is high (> adapt_partition_thresh), will switch + // from VARIANCE_PARTITION to REFERENCE_PARTITION (which selects partition + // based on the nonrd-pickmode). int adapt_partition_source_sad; + int adapt_partition_thresh; } SPEED_FEATURES; struct VP9_COMP; -- 2.40.0