From 86ede50943ac378a8d63dc254cc0a0c679e97b10 Mon Sep 17 00:00:00 2001 From: Marco Date: Thu, 1 Oct 2015 17:31:40 -0700 Subject: [PATCH] Fix to denoiser with dynamic resize. Temporary fix to denoiser when dynamic resizing is on. -Reallocate denoiser buffers on resized frame. -Force golden update on resized frame. -Don't denoise resized frame, and copy source into denoised buffers. Change-Id: Ife7638173b76a1c49eac7da4f2a30c9c1f4e2000 --- vp9/encoder/vp9_denoiser.c | 8 ++++--- vp9/encoder/vp9_denoiser.h | 3 ++- vp9/encoder/vp9_encodeframe.c | 6 +++-- vp9/encoder/vp9_encoder.c | 44 ++++++++++++++++++++++------------- 4 files changed, 39 insertions(+), 22 deletions(-) diff --git a/vp9/encoder/vp9_denoiser.c b/vp9/encoder/vp9_denoiser.c index 39f210cf2..e3155e33c 100644 --- a/vp9/encoder/vp9_denoiser.c +++ b/vp9/encoder/vp9_denoiser.c @@ -375,8 +375,11 @@ void vp9_denoiser_update_frame_info(VP9_DENOISER *denoiser, FRAME_TYPE frame_type, int refresh_alt_ref_frame, int refresh_golden_frame, - int refresh_last_frame) { - if (frame_type == KEY_FRAME) { + int refresh_last_frame, + int resized) { + // Copy source into denoised reference buffers on KEY_FRAME or + // if the just encoded frame was resized. + if (frame_type == KEY_FRAME || resized != 0) { int i; // Start at 1 so as not to overwrite the INTRA_FRAME for (i = 1; i < MAX_REF_FRAMES; ++i) @@ -462,7 +465,6 @@ int vp9_denoiser_alloc(VP9_DENOISER *denoiser, int width, int height, #endif denoiser->increase_denoising = 0; denoiser->frame_buffer_initialized = 1; - return 0; } diff --git a/vp9/encoder/vp9_denoiser.h b/vp9/encoder/vp9_denoiser.h index b2af792bb..c66fdf426 100644 --- a/vp9/encoder/vp9_denoiser.h +++ b/vp9/encoder/vp9_denoiser.h @@ -37,7 +37,8 @@ void vp9_denoiser_update_frame_info(VP9_DENOISER *denoiser, FRAME_TYPE frame_type, int refresh_alt_ref_frame, int refresh_golden_frame, - int refresh_last_frame); + int refresh_last_frame, + int resized); void vp9_denoiser_denoise(VP9_DENOISER *denoiser, MACROBLOCK *mb, int mi_row, int mi_col, BLOCK_SIZE bs, diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c index 1c4f35a53..99598a3de 100644 --- a/vp9/encoder/vp9_encodeframe.c +++ b/vp9/encoder/vp9_encodeframe.c @@ -1739,8 +1739,10 @@ static void encode_b_rt(VP9_COMP *cpi, ThreadData *td, update_state_rt(cpi, td, ctx, mi_row, mi_col, bsize); #if CONFIG_VP9_TEMPORAL_DENOISING - if (cpi->oxcf.noise_sensitivity > 0 && output_enabled && - cpi->common.frame_type != KEY_FRAME) { + if (cpi->oxcf.noise_sensitivity > 0 && + output_enabled && + cpi->common.frame_type != KEY_FRAME && + cpi->resize_pending == 0) { vp9_denoiser_denoise(&cpi->denoiser, x, mi_row, mi_col, VPXMAX(BLOCK_8X8, bsize), ctx); } diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c index 061536953..f9486e843 100644 --- a/vp9/encoder/vp9_encoder.c +++ b/vp9/encoder/vp9_encoder.c @@ -2756,7 +2756,8 @@ void vp9_update_reference_frames(VP9_COMP *cpi) { cpi->common.frame_type, cpi->refresh_alt_ref_frame, cpi->refresh_golden_frame, - cpi->refresh_last_frame); + cpi->refresh_last_frame, + cpi->resize_pending); } #endif } @@ -3099,6 +3100,21 @@ static void set_size_dependent_vars(VP9_COMP *cpi, int *q, #endif // CONFIG_VP9_POSTPROC } +#if CONFIG_VP9_TEMPORAL_DENOISING +static void setup_denoiser_buffer(VP9_COMP *cpi) { + VP9_COMMON *const cm = &cpi->common; + if (cpi->oxcf.noise_sensitivity > 0 && + !cpi->denoiser.frame_buffer_initialized) { + vp9_denoiser_alloc(&(cpi->denoiser), cm->width, cm->height, + cm->subsampling_x, cm->subsampling_y, +#if CONFIG_VP9_HIGHBITDEPTH + cm->use_highbitdepth, +#endif + VP9_ENC_BORDER_IN_PIXELS); + } +} +#endif + static void init_motion_estimation(VP9_COMP *cpi) { int y_stride = cpi->scaled_source.y_stride; @@ -3143,6 +3159,17 @@ static void set_frame_size(VP9_COMP *cpi) { // TODO(agrange) Scale cpi->max_mv_magnitude if frame-size has changed. set_mv_search_params(cpi); + +#if CONFIG_VP9_TEMPORAL_DENOISING + // Reset the denoiser on the resized frame. + if (cpi->oxcf.noise_sensitivity > 0) { + vp9_denoiser_free(&(cpi->denoiser)); + setup_denoiser_buffer(cpi); + // Dynamic resize is only triggered for non-SVC, so we can force + // golden frame update here as temporary fix to denoiser. + cpi->refresh_golden_frame = 1; + } +#endif } if ((oxcf->pass == 2) && @@ -3983,21 +4010,6 @@ static void check_initial_width(VP9_COMP *cpi, } } -#if CONFIG_VP9_TEMPORAL_DENOISING -static void setup_denoiser_buffer(VP9_COMP *cpi) { - VP9_COMMON *const cm = &cpi->common; - if (cpi->oxcf.noise_sensitivity > 0 && - !cpi->denoiser.frame_buffer_initialized) { - vp9_denoiser_alloc(&(cpi->denoiser), cm->width, cm->height, - cm->subsampling_x, cm->subsampling_y, -#if CONFIG_VP9_HIGHBITDEPTH - cm->use_highbitdepth, -#endif - VP9_ENC_BORDER_IN_PIXELS); - } -} -#endif - int vp9_receive_raw_frame(VP9_COMP *cpi, unsigned int frame_flags, YV12_BUFFER_CONFIG *sd, int64_t time_stamp, int64_t end_time) { -- 2.40.0