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