From 229c686c89b89ce534209fc71548fada65d5b70d Mon Sep 17 00:00:00 2001 From: Marco Date: Mon, 25 Apr 2016 08:49:08 -0700 Subject: [PATCH] vp9-denoiser: Bugfix and some adjustments for high noise case. Need to check that sse for non-zero mv has been set for the current block (i.e., check that nonzero-mv is tested as a mode, so newmv_sse != UINT_MAX) before forcing to not use zero-mv for denoising. Also increase some thresholds (sse and sse_diff) for high noise case, and use shift operaton instead of multiplication on a threshold computation. Change-Id: Iae7339475d57240316b7fa8b887c4ee3c0d0dbec --- vp9/encoder/vp9_denoiser.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/vp9/encoder/vp9_denoiser.c b/vp9/encoder/vp9_denoiser.c index 8b7006280..7f5265a94 100644 --- a/vp9/encoder/vp9_denoiser.c +++ b/vp9/encoder/vp9_denoiser.c @@ -49,16 +49,19 @@ static int noise_motion_thresh(BLOCK_SIZE bs, int increase_denoising) { } static unsigned int sse_thresh(BLOCK_SIZE bs, int increase_denoising) { - return (1 << num_pels_log2_lookup[bs]) * (increase_denoising ? 60 : 40); + return (1 << num_pels_log2_lookup[bs]) * (increase_denoising ? 80 : 40); } static int sse_diff_thresh(BLOCK_SIZE bs, int increase_denoising, int motion_magnitude) { if (motion_magnitude > noise_motion_thresh(bs, increase_denoising)) { - return 0; + if (increase_denoising) + return (1 << num_pels_log2_lookup[bs]) << 2; + else + return 0; } else { - return (1 << num_pels_log2_lookup[bs]) * 20; + return (1 << num_pels_log2_lookup[bs]) << 4; } } @@ -222,6 +225,7 @@ static VP9_DENOISER_DECISION perform_motion_compensation(VP9_DENOISER *denoiser, // If the best reference frame uses inter-prediction and there is enough of a // difference in sum-squared-error, use it. if (frame != INTRA_FRAME && + ctx->newmv_sse != UINT_MAX && sse_diff > sse_diff_thresh(bs, increase_denoising, motion_magnitude)) { mi->ref_frame[0] = ctx->best_reference_frame; mi->mode = ctx->best_sse_inter_mode;