1*fb1b10abSAndroid Build Coastguard Worker /* 2*fb1b10abSAndroid Build Coastguard Worker * Copyright (c) 2012 The WebM project authors. All Rights Reserved. 3*fb1b10abSAndroid Build Coastguard Worker * 4*fb1b10abSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*fb1b10abSAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*fb1b10abSAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*fb1b10abSAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*fb1b10abSAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*fb1b10abSAndroid Build Coastguard Worker */ 10*fb1b10abSAndroid Build Coastguard Worker 11*fb1b10abSAndroid Build Coastguard Worker #ifndef VPX_VP8_ENCODER_DENOISING_H_ 12*fb1b10abSAndroid Build Coastguard Worker #define VPX_VP8_ENCODER_DENOISING_H_ 13*fb1b10abSAndroid Build Coastguard Worker 14*fb1b10abSAndroid Build Coastguard Worker #include "block.h" 15*fb1b10abSAndroid Build Coastguard Worker #include "vp8/common/loopfilter.h" 16*fb1b10abSAndroid Build Coastguard Worker 17*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus 18*fb1b10abSAndroid Build Coastguard Worker extern "C" { 19*fb1b10abSAndroid Build Coastguard Worker #endif 20*fb1b10abSAndroid Build Coastguard Worker 21*fb1b10abSAndroid Build Coastguard Worker #define SUM_DIFF_THRESHOLD 512 22*fb1b10abSAndroid Build Coastguard Worker #define SUM_DIFF_THRESHOLD_HIGH 600 23*fb1b10abSAndroid Build Coastguard Worker #define MOTION_MAGNITUDE_THRESHOLD (8 * 3) 24*fb1b10abSAndroid Build Coastguard Worker 25*fb1b10abSAndroid Build Coastguard Worker #define SUM_DIFF_THRESHOLD_UV (96) // (8 * 8 * 1.5) 26*fb1b10abSAndroid Build Coastguard Worker #define SUM_DIFF_THRESHOLD_HIGH_UV (8 * 8 * 2) 27*fb1b10abSAndroid Build Coastguard Worker #define SUM_DIFF_FROM_AVG_THRESH_UV (8 * 8 * 8) 28*fb1b10abSAndroid Build Coastguard Worker #define MOTION_MAGNITUDE_THRESHOLD_UV (8 * 3) 29*fb1b10abSAndroid Build Coastguard Worker 30*fb1b10abSAndroid Build Coastguard Worker #define MAX_GF_ARF_DENOISE_RANGE (8) 31*fb1b10abSAndroid Build Coastguard Worker 32*fb1b10abSAndroid Build Coastguard Worker enum vp8_denoiser_decision { COPY_BLOCK, FILTER_BLOCK }; 33*fb1b10abSAndroid Build Coastguard Worker 34*fb1b10abSAndroid Build Coastguard Worker enum vp8_denoiser_filter_state { kNoFilter, kFilterZeroMV, kFilterNonZeroMV }; 35*fb1b10abSAndroid Build Coastguard Worker 36*fb1b10abSAndroid Build Coastguard Worker enum vp8_denoiser_mode { 37*fb1b10abSAndroid Build Coastguard Worker kDenoiserOff, 38*fb1b10abSAndroid Build Coastguard Worker kDenoiserOnYOnly, 39*fb1b10abSAndroid Build Coastguard Worker kDenoiserOnYUV, 40*fb1b10abSAndroid Build Coastguard Worker kDenoiserOnYUVAggressive, 41*fb1b10abSAndroid Build Coastguard Worker kDenoiserOnAdaptive 42*fb1b10abSAndroid Build Coastguard Worker }; 43*fb1b10abSAndroid Build Coastguard Worker 44*fb1b10abSAndroid Build Coastguard Worker typedef struct { 45*fb1b10abSAndroid Build Coastguard Worker // Scale factor on sse threshold above which no denoising is done. 46*fb1b10abSAndroid Build Coastguard Worker unsigned int scale_sse_thresh; 47*fb1b10abSAndroid Build Coastguard Worker // Scale factor on motion magnitude threshold above which no 48*fb1b10abSAndroid Build Coastguard Worker // denoising is done. 49*fb1b10abSAndroid Build Coastguard Worker unsigned int scale_motion_thresh; 50*fb1b10abSAndroid Build Coastguard Worker // Scale factor on motion magnitude below which we increase the strength of 51*fb1b10abSAndroid Build Coastguard Worker // the temporal filter (in function vp8_denoiser_filter). 52*fb1b10abSAndroid Build Coastguard Worker unsigned int scale_increase_filter; 53*fb1b10abSAndroid Build Coastguard Worker // Scale factor to bias to ZEROMV for denoising. 54*fb1b10abSAndroid Build Coastguard Worker unsigned int denoise_mv_bias; 55*fb1b10abSAndroid Build Coastguard Worker // Scale factor to bias to ZEROMV for coding mode selection. 56*fb1b10abSAndroid Build Coastguard Worker unsigned int pickmode_mv_bias; 57*fb1b10abSAndroid Build Coastguard Worker // Quantizer threshold below which we use the segmentation map to switch off 58*fb1b10abSAndroid Build Coastguard Worker // loop filter for blocks that have been coded as ZEROMV-LAST a certain number 59*fb1b10abSAndroid Build Coastguard Worker // (consec_zerolast) of consecutive frames. Note that the delta-QP is set to 60*fb1b10abSAndroid Build Coastguard Worker // 0 when segmentation map is used for shutting off loop filter. 61*fb1b10abSAndroid Build Coastguard Worker unsigned int qp_thresh; 62*fb1b10abSAndroid Build Coastguard Worker // Threshold for number of consecutive frames for blocks coded as ZEROMV-LAST. 63*fb1b10abSAndroid Build Coastguard Worker unsigned int consec_zerolast; 64*fb1b10abSAndroid Build Coastguard Worker // Threshold for amount of spatial blur on Y channel. 0 means no spatial blur. 65*fb1b10abSAndroid Build Coastguard Worker unsigned int spatial_blur; 66*fb1b10abSAndroid Build Coastguard Worker } denoise_params; 67*fb1b10abSAndroid Build Coastguard Worker 68*fb1b10abSAndroid Build Coastguard Worker typedef struct vp8_denoiser { 69*fb1b10abSAndroid Build Coastguard Worker YV12_BUFFER_CONFIG yv12_running_avg[MAX_REF_FRAMES]; 70*fb1b10abSAndroid Build Coastguard Worker YV12_BUFFER_CONFIG yv12_mc_running_avg; 71*fb1b10abSAndroid Build Coastguard Worker // TODO(marpan): Should remove yv12_last_source and use vp8_lookahead_peak. 72*fb1b10abSAndroid Build Coastguard Worker YV12_BUFFER_CONFIG yv12_last_source; 73*fb1b10abSAndroid Build Coastguard Worker unsigned char *denoise_state; 74*fb1b10abSAndroid Build Coastguard Worker int num_mb_cols; 75*fb1b10abSAndroid Build Coastguard Worker int denoiser_mode; 76*fb1b10abSAndroid Build Coastguard Worker int threshold_aggressive_mode; 77*fb1b10abSAndroid Build Coastguard Worker int nmse_source_diff; 78*fb1b10abSAndroid Build Coastguard Worker int nmse_source_diff_count; 79*fb1b10abSAndroid Build Coastguard Worker int qp_avg; 80*fb1b10abSAndroid Build Coastguard Worker int qp_threshold_up; 81*fb1b10abSAndroid Build Coastguard Worker int qp_threshold_down; 82*fb1b10abSAndroid Build Coastguard Worker int bitrate_threshold; 83*fb1b10abSAndroid Build Coastguard Worker denoise_params denoise_pars; 84*fb1b10abSAndroid Build Coastguard Worker } VP8_DENOISER; 85*fb1b10abSAndroid Build Coastguard Worker 86*fb1b10abSAndroid Build Coastguard Worker int vp8_denoiser_allocate(VP8_DENOISER *denoiser, int width, int height, 87*fb1b10abSAndroid Build Coastguard Worker int num_mb_rows, int num_mb_cols, int mode); 88*fb1b10abSAndroid Build Coastguard Worker 89*fb1b10abSAndroid Build Coastguard Worker void vp8_denoiser_free(VP8_DENOISER *denoiser); 90*fb1b10abSAndroid Build Coastguard Worker 91*fb1b10abSAndroid Build Coastguard Worker void vp8_denoiser_set_parameters(VP8_DENOISER *denoiser, int mode); 92*fb1b10abSAndroid Build Coastguard Worker 93*fb1b10abSAndroid Build Coastguard Worker void vp8_denoiser_denoise_mb(VP8_DENOISER *denoiser, MACROBLOCK *x, 94*fb1b10abSAndroid Build Coastguard Worker unsigned int best_sse, unsigned int zero_mv_sse, 95*fb1b10abSAndroid Build Coastguard Worker int recon_yoffset, int recon_uvoffset, 96*fb1b10abSAndroid Build Coastguard Worker loop_filter_info_n *lfi_n, int mb_row, int mb_col, 97*fb1b10abSAndroid Build Coastguard Worker int block_index, int consec_zero_last); 98*fb1b10abSAndroid Build Coastguard Worker 99*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus 100*fb1b10abSAndroid Build Coastguard Worker } // extern "C" 101*fb1b10abSAndroid Build Coastguard Worker #endif 102*fb1b10abSAndroid Build Coastguard Worker 103*fb1b10abSAndroid Build Coastguard Worker #endif // VPX_VP8_ENCODER_DENOISING_H_ 104