From 25b7b6e20fed47e73b66c3b0c59c602bf19b76d8 Mon Sep 17 00:00:00 2001 From: Marco Paniconi Date: Mon, 14 May 2018 20:52:20 -0700 Subject: [PATCH] vp9: Some speed feature settings for speed 9. Disable 8x8 blocks for higher resolutions, reduce mv_thresh for 1/2 subpel motion, and disable golden reference at superblock level based on source sad and motion content. ~6% loss in RTC metrics over current speed 9. Speedup about ~10% for high motion clip on linux. Change-Id: I7ff8f81ac93ee8a90d5a1f4837c955d000bd75e7 --- test/vp9_datarate_test.cc | 2 +- vp9/encoder/vp9_encodeframe.c | 1 + vp9/encoder/vp9_pickmode.c | 4 ++++ vp9/encoder/vp9_speed_features.c | 9 +++++++++ vp9/encoder/vp9_speed_features.h | 6 ++++++ 5 files changed, 21 insertions(+), 1 deletion(-) diff --git a/test/vp9_datarate_test.cc b/test/vp9_datarate_test.cc index e50ebda..a8bcc2a 100644 --- a/test/vp9_datarate_test.cc +++ b/test/vp9_datarate_test.cc @@ -266,7 +266,7 @@ TEST_P(DatarateTestVP9Large, BasicRateTargetingVBRLagZero) { ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); ASSERT_GE(effective_datarate_[0], cfg_.rc_target_bitrate * 0.75) << " The datarate for the file is lower than target by too much!"; - ASSERT_LE(effective_datarate_[0], cfg_.rc_target_bitrate * 1.35) + ASSERT_LE(effective_datarate_[0], cfg_.rc_target_bitrate * 1.36) << " The datarate for the file is greater than target by too much!"; } diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c index 33fc02f..c7e9f9b 100644 --- a/vp9/encoder/vp9_encodeframe.c +++ b/vp9/encoder/vp9_encodeframe.c @@ -583,6 +583,7 @@ static void set_vbp_thresholds(VP9_COMP *cpi, int64_t thresholds[], int q, } else { thresholds[1] = (5 * threshold_base) >> 1; } + if (cpi->sf.disable_16x16part_nonkey) thresholds[2] = INT64_MAX; } } diff --git a/vp9/encoder/vp9_pickmode.c b/vp9/encoder/vp9_pickmode.c index f86c9f0..a2f305d 100644 --- a/vp9/encoder/vp9_pickmode.c +++ b/vp9/encoder/vp9_pickmode.c @@ -1660,6 +1660,10 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, TileDataEnc *tile_data, } } + if (sf->disable_golden_ref && (x->content_state_sb != kVeryHighSad || + cpi->rc.avg_frame_low_motion < 60)) + usable_ref_frame = LAST_FRAME; + if (!((cpi->ref_frame_flags & flag_list[GOLDEN_FRAME]) && !svc_force_zero_mode[GOLDEN_FRAME - 1] && !force_skip_low_temp_var)) use_golden_nonzeromv = 0; diff --git a/vp9/encoder/vp9_speed_features.c b/vp9/encoder/vp9_speed_features.c index 01365d8..8f1ec21 100644 --- a/vp9/encoder/vp9_speed_features.c +++ b/vp9/encoder/vp9_speed_features.c @@ -375,6 +375,8 @@ static void set_rt_speed_feature_framesize_independent( sf->nonrd_keyframe = 0; sf->svc_use_lowres_part = 0; sf->re_encode_overshoot_rt = 0; + sf->disable_16x16part_nonkey = 0; + sf->disable_golden_ref = 0; if (speed >= 1) { sf->allow_txfm_domain_distortion = 1; @@ -671,8 +673,15 @@ static void set_rt_speed_feature_framesize_independent( if (speed >= 9) { sf->mv.enable_adaptive_subpel_force_stop = 1; sf->mv.adapt_subpel_force_stop.mv_thresh = 2; + if (cpi->rc.avg_frame_low_motion < 40) + sf->mv.adapt_subpel_force_stop.mv_thresh = 1; sf->mv.adapt_subpel_force_stop.force_stop_below = 1; sf->mv.adapt_subpel_force_stop.force_stop_above = 2; + // Disable partition blocks below 16x16, except for low-resolutions. + if (cm->frame_type != KEY_FRAME && cm->width >= 320 && cm->height >= 240) + sf->disable_16x16part_nonkey = 1; + // Allow for disabling GOLDEN reference, for CBR mode. + if (cpi->oxcf.rc_mode == VPX_CBR) sf->disable_golden_ref = 1; } if (sf->use_altref_onepass) { diff --git a/vp9/encoder/vp9_speed_features.h b/vp9/encoder/vp9_speed_features.h index 8595e54..251cfdb 100644 --- a/vp9/encoder/vp9_speed_features.h +++ b/vp9/encoder/vp9_speed_features.h @@ -531,6 +531,12 @@ typedef struct SPEED_FEATURES { // Enable re-encoding on scene change with potential high overshoot, // for real-time encoding flow. int re_encode_overshoot_rt; + + // Disable partitioning of 16x16 blocks. + int disable_16x16part_nonkey; + + // Allow for disabling golden reference. + int disable_golden_ref; } SPEED_FEATURES; struct VP9_COMP; -- 2.7.4