15c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org/* 25c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * Copyright (c) 2012 The WebM project authors. All Rights Reserved. 35c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * 45c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * Use of this source code is governed by a BSD-style license 55c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * that can be found in the LICENSE file in the root of the source 65c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * tree. An additional intellectual property rights grant can be found 75c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * in the file PATENTS. All contributing project authors may 85c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * be found in the AUTHORS file in the root of the source tree. 95c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org */ 105c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 115c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#ifndef VP8_ENCODER_DENOISING_H_ 125c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#define VP8_ENCODER_DENOISING_H_ 135c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 145c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#include "block.h" 1588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#include "vp8/common/loopfilter.h" 165c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 17dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#ifdef __cplusplus 18dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.orgextern "C" { 19dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#endif 20dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org 215c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#define SUM_DIFF_THRESHOLD (16 * 16 * 2) 2287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#define SUM_DIFF_THRESHOLD_HIGH (600) 23ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#define MOTION_MAGNITUDE_THRESHOLD (8*3) 245c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 25e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org#define SUM_DIFF_THRESHOLD_UV (96) // (8 * 8 * 1.5) 26e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org#define SUM_DIFF_THRESHOLD_HIGH_UV (8 * 8 * 2) 2741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#define SUM_DIFF_FROM_AVG_THRESH_UV (8 * 8 * 8) 28e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org#define MOTION_MAGNITUDE_THRESHOLD_UV (8*3) 29e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org 305c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgenum vp8_denoiser_decision 315c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org{ 325c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org COPY_BLOCK, 33ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org FILTER_BLOCK 345c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org}; 355c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 3688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgenum vp8_denoiser_filter_state { 3788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org kNoFilter, 3888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org kFilterZeroMV, 3988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org kFilterNonZeroMV 4088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}; 4188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org 4241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgenum vp8_denoiser_mode { 4341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org kDenoiserOff, 4441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org kDenoiserOnYOnly, 4541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org kDenoiserOnYUV, 4641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org kDenoiserOnYUVAggressive, 4741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org kDenoiserOnAdaptive 4841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}; 4941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 5041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgtypedef struct { 5141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // Scale factor on sse threshold above which no denoising is done. 5241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org unsigned int scale_sse_thresh; 5341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // Scale factor on motion magnitude threshold above which no 5441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // denoising is done. 5541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org unsigned int scale_motion_thresh; 5641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // Scale factor on motion magnitude below which we increase the strength of 5741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // the temporal filter (in function vp8_denoiser_filter). 5841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org unsigned int scale_increase_filter; 5941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // Scale factor to bias to ZEROMV for denoising. 6041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org unsigned int denoise_mv_bias; 6141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // Scale factor to bias to ZEROMV for coding mode selection. 6241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org unsigned int pickmode_mv_bias; 6341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // Quantizer threshold below which we use the segmentation map to switch off 6441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // loop filter for blocks that have been coded as ZEROMV-LAST a certain number 6541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // (consec_zerolast) of consecutive frames. Note that the delta-QP is set to 6641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // 0 when segmentation map is used for shutting off loop filter. 6741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org unsigned int qp_thresh; 6841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // Threshold for number of consecutive frames for blocks coded as ZEROMV-LAST. 6941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org unsigned int consec_zerolast; 7087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org // Threshold for amount of spatial blur on Y channel. 0 means no spatial blur. 7187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org unsigned int spatial_blur; 7241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org} denoise_params; 7341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 745c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgtypedef struct vp8_denoiser 755c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org{ 765c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org YV12_BUFFER_CONFIG yv12_running_avg[MAX_REF_FRAMES]; 775c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org YV12_BUFFER_CONFIG yv12_mc_running_avg; 7841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // TODO(marpan): Should remove yv12_last_source and use vp8_lookahead_peak. 7941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org YV12_BUFFER_CONFIG yv12_last_source; 8088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org unsigned char* denoise_state; 8188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org int num_mb_cols; 8241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int denoiser_mode; 8341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int threshold_aggressive_mode; 8441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int nmse_source_diff; 8541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int nmse_source_diff_count; 8687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org int qp_avg; 8787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org int qp_threshold_up; 8887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org int qp_threshold_down; 8987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org int bitrate_threshold; 9041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org denoise_params denoise_pars; 915c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org} VP8_DENOISER; 925c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 9388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgint vp8_denoiser_allocate(VP8_DENOISER *denoiser, int width, int height, 9441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int num_mb_rows, int num_mb_cols, int mode); 955c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 965c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgvoid vp8_denoiser_free(VP8_DENOISER *denoiser); 975c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 9841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgvoid vp8_denoiser_set_parameters(VP8_DENOISER *denoiser, int mode); 9941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 1005c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgvoid vp8_denoiser_denoise_mb(VP8_DENOISER *denoiser, 1015c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org MACROBLOCK *x, 1025c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org unsigned int best_sse, 1035c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org unsigned int zero_mv_sse, 1045c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int recon_yoffset, 10588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org int recon_uvoffset, 10688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org loop_filter_info_n *lfi_n, 10788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org int mb_row, 10888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org int mb_col, 10941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int block_index); 1105c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 111dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#ifdef __cplusplus 112dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org} // extern "C" 113dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#endif 114dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org 1158b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#endif // VP8_ENCODER_DENOISING_H_ 116