From 3b789d36934161b741a82998685be856e72ac217 Mon Sep 17 00:00:00 2001 From: Marco Date: Tue, 7 Oct 2014 16:15:32 -0700 Subject: [PATCH] vp8: Suppress denoising with respect to old reference frames. If the GOLDEN or ALTREF frame was last updated > x frames in the past, don't use them for denoising (only consider LAST). Using an old reference frame for denoising, e.g., if it is a long-term reference or the last key frame, can cause some visible artifacts, in particular in the aggressive denoising mode. Change-Id: I239c9fbb092c36cba7e95328f1fa67a58d6a7ed9 --- vp8/encoder/denoising.h | 2 ++ vp8/encoder/pickinter.c | 11 +++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/vp8/encoder/denoising.h b/vp8/encoder/denoising.h index fb7930b6b..6c1f9e22b 100644 --- a/vp8/encoder/denoising.h +++ b/vp8/encoder/denoising.h @@ -27,6 +27,8 @@ extern "C" { #define SUM_DIFF_FROM_AVG_THRESH_UV (8 * 8 * 8) #define MOTION_MAGNITUDE_THRESHOLD_UV (8*3) +#define MAX_GF_ARF_DENOISE_RANGE (16) + enum vp8_denoiser_decision { COPY_BLOCK, diff --git a/vp8/encoder/pickinter.c b/vp8/encoder/pickinter.c index 43f8957d1..ea3b46eda 100644 --- a/vp8/encoder/pickinter.c +++ b/vp8/encoder/pickinter.c @@ -1083,7 +1083,14 @@ void vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, { /* Store for later use by denoiser. */ - if (this_mode == ZEROMV && sse < zero_mv_sse ) + // Dont' denoise with GOLDEN OR ALTREF is they are old reference + // frames (greater than MAX_GF_ARF_DENOISE_RANGE frames in past). + int skip_old_reference = ((this_ref_frame != LAST_FRAME) && + (cpi->common.current_video_frame - + cpi->current_ref_frames[this_ref_frame] > + MAX_GF_ARF_DENOISE_RANGE)) ? 1 : 0; + if (this_mode == ZEROMV && sse < zero_mv_sse && + !skip_old_reference) { zero_mv_sse = sse; x->best_zeromv_reference_frame = @@ -1092,7 +1099,7 @@ void vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, /* Store the best NEWMV in x for later use in the denoiser. */ if (x->e_mbd.mode_info_context->mbmi.mode == NEWMV && - sse < best_sse) + sse < best_sse && !skip_old_reference) { best_sse = sse; x->best_sse_inter_mode = NEWMV; -- 2.40.0