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