From cdb322dd72fe47e8a2f63f15d8b188281ff7d508 Mon Sep 17 00:00:00 2001 From: Paul Wilkins Date: Mon, 18 Mar 2013 16:17:04 +0000 Subject: [PATCH] Adapt ARNR filter length and strength. Adjust the filter length and strength for each ARF group based on a measure of difficulty (the boost) and the active q range. Remove lower limit on RDMULT value. Average gains on the different sets in range 0.4%-0.9%. However the ARNR changes give a very big boost on a few clips. Eg. Soccer ~5%, in derf set and Cyclist ~ 10% in the std-hd set Change-Id: I2078d78798e27ad2bcc2b32d703ea37b67412ec4 --- vp9/encoder/vp9_firstpass.c | 26 ++++++++++++++++++++++++-- vp9/encoder/vp9_onyx_if.c | 4 ---- vp9/encoder/vp9_onyx_int.h | 1 + vp9/encoder/vp9_rdopt.c | 3 --- vp9/encoder/vp9_temporal_filter.c | 4 +--- 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/vp9/encoder/vp9_firstpass.c b/vp9/encoder/vp9_firstpass.c index 5c2067b00..f30403cda 100644 --- a/vp9/encoder/vp9_firstpass.c +++ b/vp9/encoder/vp9_firstpass.c @@ -1428,11 +1428,14 @@ static int calc_arf_boost( return arf_boost; } -static void configure_arnr_filter(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { +static void configure_arnr_filter(VP9_COMP *cpi, + FIRSTPASS_STATS *this_frame, + int group_boost) { int half_gf_int; int frames_after_arf; int frames_bwd = cpi->oxcf.arnr_max_frames - 1; int frames_fwd = cpi->oxcf.arnr_max_frames - 1; + int q; // Define the arnr filter width for this group of frames: // We only filter frames that lie within a distance of half @@ -1477,6 +1480,25 @@ static void configure_arnr_filter(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { } cpi->active_arnr_frames = frames_bwd + 1 + frames_fwd; + + // Adjust the strength based on active max q + q = ((int)vp9_convert_qindex_to_q(cpi->active_worst_quality) >> 1); + if (q > 8) { + cpi->active_arnr_strength = cpi->oxcf.arnr_strength; + } else { + cpi->active_arnr_strength = cpi->oxcf.arnr_strength - (8 - q); + if (cpi->active_arnr_strength < 0) + cpi->active_arnr_strength = 0; + } + + // Adjust number of frames in filter and strength based on gf boost level. + if (cpi->active_arnr_frames > (group_boost / 150)) { + cpi->active_arnr_frames = (group_boost / 150); + cpi->active_arnr_frames += !(cpi->active_arnr_frames & 1); + } + if (cpi->active_arnr_strength > (group_boost / 300)) { + cpi->active_arnr_strength = (group_boost / 300); + } } // Analyse and define a gf/arf group . @@ -1655,7 +1677,7 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { cpi->gfu_boost = calc_arf_boost(cpi, 0, (i - 1), (i - 1), &f_boost, &b_boost); cpi->source_alt_ref_pending = TRUE; - configure_arnr_filter(cpi, this_frame); + configure_arnr_filter(cpi, this_frame, cpi->gfu_boost); } else { cpi->gfu_boost = (int)boost_score; cpi->source_alt_ref_pending = FALSE; diff --git a/vp9/encoder/vp9_onyx_if.c b/vp9/encoder/vp9_onyx_if.c index c3353cee9..4901e6a90 100644 --- a/vp9/encoder/vp9_onyx_if.c +++ b/vp9/encoder/vp9_onyx_if.c @@ -2727,10 +2727,6 @@ static void encode_frame_to_data_rate(VP9_COMP *cpi, else cpi->zbin_mode_boost_enabled = TRUE; - if (cpi->gfu_boost <= 400) { - cpi->zbin_mode_boost_enabled = FALSE; - } - // Current default encoder behaviour for the altref sign bias if (cpi->source_alt_ref_active) cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1; diff --git a/vp9/encoder/vp9_onyx_int.h b/vp9/encoder/vp9_onyx_int.h index 300e12869..5de6a7ad2 100644 --- a/vp9/encoder/vp9_onyx_int.h +++ b/vp9/encoder/vp9_onyx_int.h @@ -416,6 +416,7 @@ typedef struct VP9_COMP { int max_gf_interval; int baseline_gf_interval; int active_arnr_frames; // <= cpi->oxcf.arnr_max_frames + int active_arnr_strength; // <= cpi->oxcf.arnr_max_strength int64_t key_frame_count; int prior_key_frame_distance[KEY_FRAME_CONTEXT]; diff --git a/vp9/encoder/vp9_rdopt.c b/vp9/encoder/vp9_rdopt.c index 3004d6bf3..2f03a264c 100644 --- a/vp9/encoder/vp9_rdopt.c +++ b/vp9/encoder/vp9_rdopt.c @@ -284,9 +284,6 @@ void vp9_initialize_rd_consts(VP9_COMP *cpi, int qindex) { (cpi->RDMULT * rd_iifactor[cpi->twopass.next_iiratio]) >> 4; } - if (cpi->RDMULT < 7) - cpi->RDMULT = 7; - cpi->mb.errorperbit = (cpi->RDMULT / 110); cpi->mb.errorperbit += (cpi->mb.errorperbit == 0); diff --git a/vp9/encoder/vp9_temporal_filter.c b/vp9/encoder/vp9_temporal_filter.c index a6cd1c0c3..fb61ece09 100644 --- a/vp9/encoder/vp9_temporal_filter.c +++ b/vp9/encoder/vp9_temporal_filter.c @@ -381,10 +381,8 @@ void vp9_temporal_filter_prepare(VP9_COMP *cpi, int distance) { int frames_to_blur = 0; int start_frame = 0; - int strength = cpi->oxcf.arnr_strength; - + int strength = cpi->active_arnr_strength; int blur_type = cpi->oxcf.arnr_type; - int max_frames = cpi->active_arnr_frames; num_frames_backward = distance;