added work buffer for denoiser The denoiser was writing to LAST_FRAME buffer. If LAST_FRAME isn't being updated, the reference frame buffers were out of sync between the encoder and the denoised raw buffers. This patch resolves the discrepancy by always writing to a work buffer (INTRA_FRAME) and then copying from that buffer to any buffers that needs to be updated. Change-Id: I6dd855b9749978b542bc3d515914d5f16faf25df
diff --git a/vp8/encoder/denoising.c b/vp8/encoder/denoising.c index c0dd7c1..f3faa22 100644 --- a/vp8/encoder/denoising.c +++ b/vp8/encoder/denoising.c
@@ -140,8 +140,7 @@ int i; assert(denoiser); - /* don't need one for intra start at 1 */ - for (i = 1; i < MAX_REF_FRAMES; i++) + for (i = 0; i < MAX_REF_FRAMES; i++) { denoiser->yv12_running_avg[i].flags = 0; @@ -175,8 +174,7 @@ int i; assert(denoiser); - /* we don't have one for intra ref frame */ - for (i = 1; i < MAX_REF_FRAMES ; i++) + for (i = 0; i < MAX_REF_FRAMES ; i++) { vp8_yv12_de_alloc_frame_buffer(&denoiser->yv12_running_avg[i]); } @@ -291,7 +289,7 @@ { /* Filter. */ decision = vp8_denoiser_filter(&denoiser->yv12_mc_running_avg, - &denoiser->yv12_running_avg[LAST_FRAME], + &denoiser->yv12_running_avg[INTRA_FRAME], x, motion_magnitude2, recon_yoffset, recon_uvoffset); @@ -303,7 +301,7 @@ */ vp8_copy_mem16x16( x->thismb, 16, - denoiser->yv12_running_avg[LAST_FRAME].y_buffer + recon_yoffset, - denoiser->yv12_running_avg[LAST_FRAME].y_stride); + denoiser->yv12_running_avg[INTRA_FRAME].y_buffer + recon_yoffset, + denoiser->yv12_running_avg[INTRA_FRAME].y_stride); } }
diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c index f0e0da0..3847c1e 100644 --- a/vp8/encoder/onyx_if.c +++ b/vp8/encoder/onyx_if.c
@@ -3177,8 +3177,6 @@ #if CONFIG_TEMPORAL_DENOISING if (cpi->oxcf.noise_sensitivity) { - - /* we shouldn't have to keep multiple copies as we know in advance which * buffer we should start - for now to get something up and running * I've chosen to copy the buffers @@ -3195,26 +3193,32 @@ for (i = 2; i < MAX_REF_FRAMES - 1; i++) vp8_yv12_copy_frame( - cpi->Source, + &cpi->denoiser.yv12_running_avg[LAST_FRAME], &cpi->denoiser.yv12_running_avg[i]); } else /* For non key frames */ { vp8_yv12_extend_frame_borders( - &cpi->denoiser.yv12_running_avg[LAST_FRAME]); + &cpi->denoiser.yv12_running_avg[INTRA_FRAME]); if (cm->refresh_alt_ref_frame || cm->copy_buffer_to_arf) { vp8_yv12_copy_frame( - &cpi->denoiser.yv12_running_avg[LAST_FRAME], + &cpi->denoiser.yv12_running_avg[INTRA_FRAME], &cpi->denoiser.yv12_running_avg[ALTREF_FRAME]); } if (cm->refresh_golden_frame || cm->copy_buffer_to_gf) { vp8_yv12_copy_frame( - &cpi->denoiser.yv12_running_avg[LAST_FRAME], + &cpi->denoiser.yv12_running_avg[INTRA_FRAME], &cpi->denoiser.yv12_running_avg[GOLDEN_FRAME]); } + if(cm->refresh_last_frame) + { + vp8_yv12_copy_frame( + &cpi->denoiser.yv12_running_avg[INTRA_FRAME], + &cpi->denoiser.yv12_running_avg[LAST_FRAME]); + } } }