xref: /aosp_15_r20/external/libvpx/vp9/encoder/vp9_denoiser.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_VP9_ENCODER_VP9_DENOISER_H_
12*fb1b10abSAndroid Build Coastguard Worker #define VPX_VP9_ENCODER_VP9_DENOISER_H_
13*fb1b10abSAndroid Build Coastguard Worker 
14*fb1b10abSAndroid Build Coastguard Worker #include "vp9/encoder/vp9_block.h"
15*fb1b10abSAndroid Build Coastguard Worker #include "vp9/encoder/vp9_skin_detection.h"
16*fb1b10abSAndroid Build Coastguard Worker #include "vpx_scale/yv12config.h"
17*fb1b10abSAndroid Build Coastguard Worker 
18*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus
19*fb1b10abSAndroid Build Coastguard Worker extern "C" {
20*fb1b10abSAndroid Build Coastguard Worker #endif
21*fb1b10abSAndroid Build Coastguard Worker 
22*fb1b10abSAndroid Build Coastguard Worker #define MOTION_MAGNITUDE_THRESHOLD (8 * 3)
23*fb1b10abSAndroid Build Coastguard Worker 
24*fb1b10abSAndroid Build Coastguard Worker // Denoiser is used in non svc real-time mode which does not use alt-ref, so no
25*fb1b10abSAndroid Build Coastguard Worker // need to allocate for it, and hence we need MAX_REF_FRAME - 1
26*fb1b10abSAndroid Build Coastguard Worker #define NONSVC_REF_FRAMES MAX_REF_FRAMES - 1
27*fb1b10abSAndroid Build Coastguard Worker 
28*fb1b10abSAndroid Build Coastguard Worker // Number of frame buffers when SVC is used. [0] for current denoised buffer and
29*fb1b10abSAndroid Build Coastguard Worker // [1..8] for REF_FRAMES
30*fb1b10abSAndroid Build Coastguard Worker #define SVC_REF_FRAMES 9
31*fb1b10abSAndroid Build Coastguard Worker 
32*fb1b10abSAndroid Build Coastguard Worker typedef enum vp9_denoiser_decision {
33*fb1b10abSAndroid Build Coastguard Worker   COPY_BLOCK,
34*fb1b10abSAndroid Build Coastguard Worker   FILTER_BLOCK,
35*fb1b10abSAndroid Build Coastguard Worker   FILTER_ZEROMV_BLOCK
36*fb1b10abSAndroid Build Coastguard Worker } VP9_DENOISER_DECISION;
37*fb1b10abSAndroid Build Coastguard Worker 
38*fb1b10abSAndroid Build Coastguard Worker typedef enum vp9_denoiser_level {
39*fb1b10abSAndroid Build Coastguard Worker   kDenLowLow,
40*fb1b10abSAndroid Build Coastguard Worker   kDenLow,
41*fb1b10abSAndroid Build Coastguard Worker   kDenMedium,
42*fb1b10abSAndroid Build Coastguard Worker   kDenHigh
43*fb1b10abSAndroid Build Coastguard Worker } VP9_DENOISER_LEVEL;
44*fb1b10abSAndroid Build Coastguard Worker 
45*fb1b10abSAndroid Build Coastguard Worker typedef struct vp9_denoiser {
46*fb1b10abSAndroid Build Coastguard Worker   YV12_BUFFER_CONFIG *running_avg_y;
47*fb1b10abSAndroid Build Coastguard Worker   YV12_BUFFER_CONFIG *mc_running_avg_y;
48*fb1b10abSAndroid Build Coastguard Worker   YV12_BUFFER_CONFIG last_source;
49*fb1b10abSAndroid Build Coastguard Worker   int frame_buffer_initialized;
50*fb1b10abSAndroid Build Coastguard Worker   int reset;
51*fb1b10abSAndroid Build Coastguard Worker   int num_ref_frames;
52*fb1b10abSAndroid Build Coastguard Worker   int num_layers;
53*fb1b10abSAndroid Build Coastguard Worker   unsigned int current_denoiser_frame;
54*fb1b10abSAndroid Build Coastguard Worker   VP9_DENOISER_LEVEL denoising_level;
55*fb1b10abSAndroid Build Coastguard Worker   VP9_DENOISER_LEVEL prev_denoising_level;
56*fb1b10abSAndroid Build Coastguard Worker } VP9_DENOISER;
57*fb1b10abSAndroid Build Coastguard Worker 
58*fb1b10abSAndroid Build Coastguard Worker typedef struct {
59*fb1b10abSAndroid Build Coastguard Worker   int64_t zero_last_cost_orig;
60*fb1b10abSAndroid Build Coastguard Worker   int *ref_frame_cost;
61*fb1b10abSAndroid Build Coastguard Worker   int_mv (*frame_mv)[MAX_REF_FRAMES];
62*fb1b10abSAndroid Build Coastguard Worker   int reuse_inter_pred;
63*fb1b10abSAndroid Build Coastguard Worker   TX_SIZE best_tx_size;
64*fb1b10abSAndroid Build Coastguard Worker   PREDICTION_MODE best_mode;
65*fb1b10abSAndroid Build Coastguard Worker   MV_REFERENCE_FRAME best_ref_frame;
66*fb1b10abSAndroid Build Coastguard Worker   INTERP_FILTER best_pred_filter;
67*fb1b10abSAndroid Build Coastguard Worker   uint8_t best_mode_skip_txfm;
68*fb1b10abSAndroid Build Coastguard Worker } VP9_PICKMODE_CTX_DEN;
69*fb1b10abSAndroid Build Coastguard Worker 
70*fb1b10abSAndroid Build Coastguard Worker struct VP9_COMP;
71*fb1b10abSAndroid Build Coastguard Worker struct SVC;
72*fb1b10abSAndroid Build Coastguard Worker 
73*fb1b10abSAndroid Build Coastguard Worker void vp9_denoiser_update_frame_info(
74*fb1b10abSAndroid Build Coastguard Worker     VP9_DENOISER *denoiser, YV12_BUFFER_CONFIG src, struct SVC *svc,
75*fb1b10abSAndroid Build Coastguard Worker     FRAME_TYPE frame_type, int refresh_alt_ref_frame, int refresh_golden_frame,
76*fb1b10abSAndroid Build Coastguard Worker     int refresh_last_frame, int alt_fb_idx, int gld_fb_idx, int lst_fb_idx,
77*fb1b10abSAndroid Build Coastguard Worker     int resized, int svc_refresh_denoiser_buffers, int second_spatial_layer);
78*fb1b10abSAndroid Build Coastguard Worker 
79*fb1b10abSAndroid Build Coastguard Worker void vp9_denoiser_denoise(struct VP9_COMP *cpi, MACROBLOCK *mb, int mi_row,
80*fb1b10abSAndroid Build Coastguard Worker                           int mi_col, BLOCK_SIZE bs, PICK_MODE_CONTEXT *ctx,
81*fb1b10abSAndroid Build Coastguard Worker                           VP9_DENOISER_DECISION *denoiser_decision,
82*fb1b10abSAndroid Build Coastguard Worker                           int use_gf_temporal_ref);
83*fb1b10abSAndroid Build Coastguard Worker 
84*fb1b10abSAndroid Build Coastguard Worker void vp9_denoiser_reset_frame_stats(PICK_MODE_CONTEXT *ctx);
85*fb1b10abSAndroid Build Coastguard Worker 
86*fb1b10abSAndroid Build Coastguard Worker void vp9_denoiser_update_frame_stats(MODE_INFO *mi, unsigned int sse,
87*fb1b10abSAndroid Build Coastguard Worker                                      PREDICTION_MODE mode,
88*fb1b10abSAndroid Build Coastguard Worker                                      PICK_MODE_CONTEXT *ctx);
89*fb1b10abSAndroid Build Coastguard Worker 
90*fb1b10abSAndroid Build Coastguard Worker int vp9_denoiser_realloc_svc(VP9_COMMON *cm, VP9_DENOISER *denoiser,
91*fb1b10abSAndroid Build Coastguard Worker                              struct SVC *svc, int svc_buf_shift,
92*fb1b10abSAndroid Build Coastguard Worker                              int refresh_alt, int refresh_gld, int refresh_lst,
93*fb1b10abSAndroid Build Coastguard Worker                              int alt_fb_idx, int gld_fb_idx, int lst_fb_idx);
94*fb1b10abSAndroid Build Coastguard Worker 
95*fb1b10abSAndroid Build Coastguard Worker int vp9_denoiser_alloc(VP9_COMMON *cm, struct SVC *svc, VP9_DENOISER *denoiser,
96*fb1b10abSAndroid Build Coastguard Worker                        int use_svc, int noise_sen, int width, int height,
97*fb1b10abSAndroid Build Coastguard Worker                        int ssx, int ssy,
98*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
99*fb1b10abSAndroid Build Coastguard Worker                        int use_highbitdepth,
100*fb1b10abSAndroid Build Coastguard Worker #endif
101*fb1b10abSAndroid Build Coastguard Worker                        int border);
102*fb1b10abSAndroid Build Coastguard Worker 
103*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_TEMPORAL_DENOISING
104*fb1b10abSAndroid Build Coastguard Worker // This function is used by both c and sse2 denoiser implementations.
105*fb1b10abSAndroid Build Coastguard Worker // Define it as a static function within the scope where vp9_denoiser.h
106*fb1b10abSAndroid Build Coastguard Worker // is referenced.
total_adj_strong_thresh(BLOCK_SIZE bs,int increase_denoising)107*fb1b10abSAndroid Build Coastguard Worker static INLINE int total_adj_strong_thresh(BLOCK_SIZE bs,
108*fb1b10abSAndroid Build Coastguard Worker                                           int increase_denoising) {
109*fb1b10abSAndroid Build Coastguard Worker   return (1 << num_pels_log2_lookup[bs]) * (increase_denoising ? 3 : 2);
110*fb1b10abSAndroid Build Coastguard Worker }
111*fb1b10abSAndroid Build Coastguard Worker #endif
112*fb1b10abSAndroid Build Coastguard Worker 
113*fb1b10abSAndroid Build Coastguard Worker void vp9_denoiser_free(VP9_DENOISER *denoiser);
114*fb1b10abSAndroid Build Coastguard Worker 
115*fb1b10abSAndroid Build Coastguard Worker void vp9_denoiser_set_noise_level(struct VP9_COMP *const cpi, int noise_level);
116*fb1b10abSAndroid Build Coastguard Worker 
117*fb1b10abSAndroid Build Coastguard Worker void vp9_denoiser_reset_on_first_frame(struct VP9_COMP *const cpi);
118*fb1b10abSAndroid Build Coastguard Worker 
119*fb1b10abSAndroid Build Coastguard Worker int64_t vp9_scale_part_thresh(int64_t threshold, VP9_DENOISER_LEVEL noise_level,
120*fb1b10abSAndroid Build Coastguard Worker                               int content_state, int temporal_layer_id);
121*fb1b10abSAndroid Build Coastguard Worker 
122*fb1b10abSAndroid Build Coastguard Worker int64_t vp9_scale_acskip_thresh(int64_t threshold,
123*fb1b10abSAndroid Build Coastguard Worker                                 VP9_DENOISER_LEVEL noise_level, int abs_sumdiff,
124*fb1b10abSAndroid Build Coastguard Worker                                 int temporal_layer_id);
125*fb1b10abSAndroid Build Coastguard Worker 
126*fb1b10abSAndroid Build Coastguard Worker void vp9_denoiser_update_ref_frame(struct VP9_COMP *const cpi);
127*fb1b10abSAndroid Build Coastguard Worker 
128*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus
129*fb1b10abSAndroid Build Coastguard Worker }  // extern "C"
130*fb1b10abSAndroid Build Coastguard Worker #endif
131*fb1b10abSAndroid Build Coastguard Worker 
132*fb1b10abSAndroid Build Coastguard Worker #endif  // VPX_VP9_ENCODER_VP9_DENOISER_H_
133