From 9c9922df972b543631e3d88680c5aac87860e9c0 Mon Sep 17 00:00:00 2001 From: Tim Kopp Date: Tue, 1 Jul 2014 11:05:16 -0700 Subject: [PATCH] VP9 denoising enabled by noise_sensitivity param As in VP8. Currently, this parameter is set with the VP8E_SET_NOISE_SENSITIVITY flag. The flag was not renamed so that we don't break the interface for webrtc. This should probably be changed at some point in the future. Change-Id: Ic73fcb0dde9d1d019e9d042050b617333ac65472 --- vp9/encoder/vp9_denoiser.c | 11 ++++++++ vp9/encoder/vp9_encoder.c | 55 ++++++++++++++++++++++++++------------ vp9/encoder/vp9_pickmode.c | 12 ++++++--- 3 files changed, 58 insertions(+), 20 deletions(-) diff --git a/vp9/encoder/vp9_denoiser.c b/vp9/encoder/vp9_denoiser.c index d6edd3573..edda2b223 100644 --- a/vp9/encoder/vp9_denoiser.c +++ b/vp9/encoder/vp9_denoiser.c @@ -15,6 +15,17 @@ #include "vp9/common/vp9_reconinter.h" #include "vp9/encoder/vp9_denoiser.h" +/* The VP9 denoiser is a work-in-progress. It currently is only designed to work + * with speed 6, though it (inexplicably) seems to also work with speed 5 (one + * would need to modify the source code in vp9_pickmode.c and vp9_encoder.c to + * make the calls to the vp9_denoiser_* functions when in speed 5). + * + * The implementation is very similar to that of the VP8 denoiser. While + * choosing the motion vectors / reference frames, the denoiser is run, and if + * it did not modify the signal to much, the denoised block is copied to the + * signal. + */ + #ifdef OUTPUT_YUV_DENOISED static void make_grayscale(YV12_BUFFER_CONFIG *yuv); #endif diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c index 54fb68bb6..5b6d27f20 100644 --- a/vp9/encoder/vp9_encoder.c +++ b/vp9/encoder/vp9_encoder.c @@ -65,7 +65,7 @@ void vp9_coef_tree_initialize(); // #define OUTPUT_YUV_REC #ifdef OUTPUT_YUV_DENOISED -FILE *yuv_denoised_file; +FILE *yuv_denoised_file = NULL; #endif #ifdef OUTPUT_YUV_SRC FILE *yuv_file; @@ -657,9 +657,11 @@ void vp9_change_config(struct VP9_COMP *cpi, const VP9EncoderConfig *oxcf) { cpi->ext_refresh_frame_context_pending = 0; #if CONFIG_DENOISING - vp9_denoiser_alloc(&(cpi->denoiser), cm->width, cm->height, - cm->subsampling_x, cm->subsampling_y, - VP9_ENC_BORDER_IN_PIXELS); + if (cpi->oxcf.noise_sensitivity > 0) { + vp9_denoiser_alloc(&(cpi->denoiser), cm->width, cm->height, + cm->subsampling_x, cm->subsampling_y, + VP9_ENC_BORDER_IN_PIXELS); + } #endif } @@ -839,8 +841,12 @@ VP9_COMP *vp9_create_compressor(VP9EncoderConfig *oxcf) { cpi->mb.nmvsadcost_hp[1] = &cpi->mb.nmvsadcosts_hp[1][MV_MAX]; cal_nmvsadcosts_hp(cpi->mb.nmvsadcost_hp); +#if CONFIG_DENOISING #ifdef OUTPUT_YUV_DENOISED - yuv_denoised_file = fopen("denoised.yuv", "ab"); + if (cpi->oxcf.noise_sensitivity > 0) { + yuv_denoised_file = fopen("denoised.yuv", "ab"); + } +#endif #endif #ifdef OUTPUT_YUV_SRC yuv_file = fopen("bd.yuv", "ab"); @@ -1079,7 +1085,9 @@ void vp9_remove_compressor(VP9_COMP *cpi) { } #if CONFIG_DENOISING - vp9_denoiser_free(&(cpi->denoiser)); + if (cpi->oxcf.noise_sensitivity > 0) { + vp9_denoiser_free(&(cpi->denoiser)); + } #endif dealloc_compressor_data(cpi); @@ -1093,8 +1101,12 @@ void vp9_remove_compressor(VP9_COMP *cpi) { vp9_remove_common(&cpi->common); vpx_free(cpi); +#if CONFIG_DENOISING #ifdef OUTPUT_YUV_DENOISED - fclose(yuv_denoised_file); + if (cpi->oxcf.noise_sensitivity > 0) { + fclose(yuv_denoised_file); + } +#endif #endif #ifdef OUTPUT_YUV_SRC fclose(yuv_file); @@ -1305,6 +1317,7 @@ void vp9_write_yuv_frame(YV12_BUFFER_CONFIG *s, FILE *f) { } #endif +#if CONFIG_DENOISING #if defined(OUTPUT_YUV_DENOISED) // The denoiser buffer is allocated as a YUV 440 buffer. This function writes it // as YUV 420. We simply use the top-left pixels of the UV buffers, since we do @@ -1336,6 +1349,7 @@ void vp9_write_yuv_frame_420(YV12_BUFFER_CONFIG *s, FILE *f) { } while (--h); } #endif +#endif #ifdef OUTPUT_YUV_REC void vp9_write_yuv_rec_frame(VP9_COMMON *cm) { @@ -1574,12 +1588,14 @@ void vp9_update_reference_frames(VP9_COMP *cpi) { &cm->ref_frame_map[cpi->lst_fb_idx], cm->new_fb_idx); } #if CONFIG_DENOISING - vp9_denoiser_update_frame_info(&cpi->denoiser, - *cpi->Source, - cpi->common.frame_type, - cpi->refresh_alt_ref_frame, - cpi->refresh_golden_frame, - cpi->refresh_last_frame); + if (cpi->oxcf.noise_sensitivity > 0) { + vp9_denoiser_update_frame_info(&cpi->denoiser, + *cpi->Source, + cpi->common.frame_type, + cpi->refresh_alt_ref_frame, + cpi->refresh_golden_frame, + cpi->refresh_last_frame); + } #endif } @@ -2171,16 +2187,21 @@ static void encode_frame_to_data_rate(VP9_COMP *cpi, } #endif -#ifdef OUTPUT_YUV_DENOISED - vp9_write_yuv_frame_420(&cpi->denoiser.running_avg_y[INTRA_FRAME], - yuv_denoised_file); -#endif #ifdef OUTPUT_YUV_SRC vp9_write_yuv_frame(cpi->Source, yuv_file); #endif set_speed_features(cpi); +#if CONFIG_DENOISING +#ifdef OUTPUT_YUV_DENOISED + if (cpi->oxcf.noise_sensitivity > 0) { + vp9_write_yuv_frame_420(&cpi->denoiser.running_avg_y[INTRA_FRAME], + yuv_denoised_file); + } +#endif +#endif + // Decide q and q bounds. q = vp9_rc_pick_q_and_bounds(cpi, &bottom_index, &top_index); diff --git a/vp9/encoder/vp9_pickmode.c b/vp9/encoder/vp9_pickmode.c index d9edeae3e..d51c55f04 100644 --- a/vp9/encoder/vp9_pickmode.c +++ b/vp9/encoder/vp9_pickmode.c @@ -440,7 +440,9 @@ int64_t vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, int i; #if CONFIG_DENOISING - vp9_denoiser_reset_frame_stats(&cpi->denoiser); + if (cpi->oxcf.noise_sensitivity > 0) { + vp9_denoiser_reset_frame_stats(&cpi->denoiser); + } #endif if (cpi->sf.reuse_inter_pred_sby) { @@ -658,7 +660,9 @@ int64_t vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, } #if CONFIG_DENOISING - vp9_denoiser_update_frame_stats(&cpi->denoiser, mbmi, sse_y, this_mode); + if (cpi->oxcf.noise_sensitivity > 0) { + vp9_denoiser_update_frame_stats(&cpi->denoiser, mbmi, sse_y, this_mode); + } #endif if (this_rd < best_rd || x->skip) { @@ -774,7 +778,9 @@ int64_t vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, } #if CONFIG_DENOISING - vp9_denoiser_denoise(&cpi->denoiser, x, mi_row, mi_col, bsize); + if (cpi->oxcf.noise_sensitivity > 0) { + vp9_denoiser_denoise(&cpi->denoiser, x, mi_row, mi_col, bsize); + } #endif return INT64_MAX; -- 2.40.0