From 75d2443bf0acda58d195fc50c2125a845ea27c36 Mon Sep 17 00:00:00 2001 From: Ranjit Kumar Tulabandu Date: Wed, 11 Jan 2017 18:59:11 +0530 Subject: [PATCH] Initialize errorperbit and sabperbit in ARNR filtering (Yunqing) This patch added the missing initialization in temporal filter. Borg test BDRate results: PSNR: -0.019%(lowres); -0.013%(hdres); SSIM: -0.001%(lowres); -0.010%(hdres). Other q values gave comparable but no better results. Change-Id: I7ad0c18b39e6f558342688e2fe1e12fdb133ce9b --- vp9/encoder/vp9_rd.c | 8 +++++++- vp9/encoder/vp9_rd.h | 3 +++ vp9/encoder/vp9_temporal_filter.c | 7 +++++++ vp9/encoder/vp9_temporal_filter.h | 2 ++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/vp9/encoder/vp9_rd.c b/vp9/encoder/vp9_rd.c index 76c639a64..3bbfa1aac 100644 --- a/vp9/encoder/vp9_rd.c +++ b/vp9/encoder/vp9_rd.c @@ -146,7 +146,7 @@ static const int rd_boost_factor[16] = { 64, 32, 32, 32, 24, 16, 12, 12, static const int rd_frame_type_factor[FRAME_UPDATE_TYPES] = { 128, 144, 128, 128, 144 }; -int vp9_compute_rd_mult(const VP9_COMP *cpi, int qindex) { +int64_t vp9_compute_rd_mult_based_on_qindex(const VP9_COMP *cpi, int qindex) { const int64_t q = vp9_dc_quant(qindex, 0, cpi->common.bit_depth); #if CONFIG_VP9_HIGHBITDEPTH int64_t rdmult = 0; @@ -161,6 +161,12 @@ int vp9_compute_rd_mult(const VP9_COMP *cpi, int qindex) { #else int64_t rdmult = 88 * q * q / 24; #endif // CONFIG_VP9_HIGHBITDEPTH + return rdmult; +} + +int vp9_compute_rd_mult(const VP9_COMP *cpi, int qindex) { + int64_t rdmult = vp9_compute_rd_mult_based_on_qindex(cpi, qindex); + if (cpi->oxcf.pass == 2 && (cpi->common.frame_type != KEY_FRAME)) { const GF_GROUP *const gf_group = &cpi->twopass.gf_group; const FRAME_UPDATE_TYPE frame_type = gf_group->update_type[gf_group->index]; diff --git a/vp9/encoder/vp9_rd.h b/vp9/encoder/vp9_rd.h index 05344b6cf..1c6831358 100644 --- a/vp9/encoder/vp9_rd.h +++ b/vp9/encoder/vp9_rd.h @@ -128,6 +128,9 @@ struct TileDataEnc; struct VP9_COMP; struct macroblock; +int64_t vp9_compute_rd_mult_based_on_qindex(const struct VP9_COMP *cpi, + int qindex); + int vp9_compute_rd_mult(const struct VP9_COMP *cpi, int qindex); void vp9_initialize_rd_consts(struct VP9_COMP *cpi); diff --git a/vp9/encoder/vp9_temporal_filter.c b/vp9/encoder/vp9_temporal_filter.c index 344658483..e2770281b 100644 --- a/vp9/encoder/vp9_temporal_filter.c +++ b/vp9/encoder/vp9_temporal_filter.c @@ -646,6 +646,7 @@ void vp9_temporal_filter(VP9_COMP *cpi, int distance) { int frames_to_blur_forward; struct scale_factors sf; YV12_BUFFER_CONFIG *frames[MAX_LAG_BUFFERS] = { NULL }; + int rdmult; // Apply context specific adjustments to the arnr filter parameters. adjust_arnr_filter(cpi, distance, rc->gfu_boost, &frames_to_blur, &strength); @@ -719,6 +720,12 @@ void vp9_temporal_filter(VP9_COMP *cpi, int distance) { } } + // Initialize errorperbit and sabperbit. + rdmult = (int)vp9_compute_rd_mult_based_on_qindex(cpi, ARNR_FILT_QINDEX); + if (rdmult < 1) rdmult = 1; + set_error_per_bit(&cpi->td.mb, rdmult); + vp9_initialize_me_consts(cpi, &cpi->td.mb, ARNR_FILT_QINDEX); + temporal_filter_iterate_c(cpi, frames, frames_to_blur, frames_to_blur_backward, strength, &sf); } diff --git a/vp9/encoder/vp9_temporal_filter.h b/vp9/encoder/vp9_temporal_filter.h index f537b8870..88ad8b45c 100644 --- a/vp9/encoder/vp9_temporal_filter.h +++ b/vp9/encoder/vp9_temporal_filter.h @@ -15,6 +15,8 @@ extern "C" { #endif +#define ARNR_FILT_QINDEX 128 + void vp9_temporal_filter_init(void); void vp9_temporal_filter(VP9_COMP *cpi, int distance); -- 2.40.0