xref: /aosp_15_r20/external/libvpx/vp8/encoder/denoising.h (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
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