ref: 61b569b461c681da643169ad06927d678f40d772
parent: 7e23f895ca868a5b3ad5ec8eda3433a19a58d750
author: Marco <marpan@google.com>
date: Mon Dec 19 04:22:44 EST 2016
vp9 denoiser: Fix the logic for re-evaluating zeromv after denoising. Correctly set interp_filter to SWITCHABLE for INTRA mode. Also reduce threshold on noise level for re-evaluating zeromv. Change-Id: Id32c01e193209fb380aa07204f0be3babf29f70a
--- a/vp9/encoder/vp9_pickmode.c
+++ b/vp9/encoder/vp9_pickmode.c
@@ -1235,7 +1235,7 @@
// denoised result. Only do this under noise conditions, and if rdcost of
// ZEROMV onoriginal source is not significantly higher than rdcost of best
// mode.
- if (cpi->noise_estimate.enabled && cpi->noise_estimate.level > kHigh &&
+ if (cpi->noise_estimate.enabled && cpi->noise_estimate.level > kLow &&
ctx_den->zero_last_cost_orig < (best_rdc->rdcost << 3) &&
((ctx_den->best_ref_frame == INTRA_FRAME && decision >= FILTER_BLOCK) ||
(ctx_den->best_ref_frame == GOLDEN_FRAME &&
@@ -1259,16 +1259,17 @@
[INTER_OFFSET(ZEROMV)];
this_rdc.dist = dist;
this_rdc.rdcost = RDCOST(x->rdmult, x->rddiv, rate, dist);
- // Switch to ZEROMV if the rdcost for ZEROMV on denoised source
- // is lower than best_ref mode (on original source).
+ // Don't switch to ZEROMV if the rdcost for ZEROMV on denoised source
+ // is higher than best_ref mode (on original source).
if (this_rdc.rdcost > best_rdc->rdcost) {
this_rdc = *best_rdc;
mi->mode = ctx_den->best_mode;
mi->ref_frame[0] = ctx_den->best_ref_frame;
mi->interp_filter = ctx_den->best_pred_filter;
- if (ctx_den->best_ref_frame == INTRA_FRAME)
+ if (ctx_den->best_ref_frame == INTRA_FRAME) {
mi->mv[0].as_int = INVALID_MV;
- else if (ctx_den->best_ref_frame == GOLDEN_FRAME) {
+ mi->interp_filter = SWITCHABLE_FILTERS;
+ } else if (ctx_den->best_ref_frame == GOLDEN_FRAME) {
mi->mv[0].as_int =
ctx_den->frame_mv[ctx_den->best_mode][ctx_den->best_ref_frame]
.as_int;