1 /*
2 * Copyright (c) 2012 The WebM project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #ifndef VP9_ENCODER_DENOISER_H_
12 #define VP9_ENCODER_DENOISER_H_
13
14 #include "vp9/encoder/vp9_block.h"
15 #include "vp9/encoder/vp9_skin_detection.h"
16 #include "vpx_scale/yv12config.h"
17
18 #ifdef __cplusplus
19 extern "C" {
20 #endif
21
22 #define MOTION_MAGNITUDE_THRESHOLD (8 * 3)
23
24 typedef enum vp9_denoiser_decision {
25 COPY_BLOCK,
26 FILTER_BLOCK
27 } VP9_DENOISER_DECISION;
28
29 typedef struct vp9_denoiser {
30 YV12_BUFFER_CONFIG running_avg_y[MAX_REF_FRAMES];
31 YV12_BUFFER_CONFIG mc_running_avg_y;
32 YV12_BUFFER_CONFIG last_source;
33 int increase_denoising;
34 int frame_buffer_initialized;
35 int denoising_on;
36 int noise_estimate;
37 int thresh_noise_estimate;
38 int noise_estimate_count;
39 } VP9_DENOISER;
40
41 struct VP9_COMP;
42
43 void vp9_denoiser_update_frame_info(VP9_DENOISER *denoiser,
44 YV12_BUFFER_CONFIG src,
45 FRAME_TYPE frame_type,
46 int refresh_alt_ref_frame,
47 int refresh_golden_frame,
48 int refresh_last_frame,
49 int resized);
50
51 void vp9_denoiser_denoise(VP9_DENOISER *denoiser, MACROBLOCK *mb,
52 int mi_row, int mi_col, BLOCK_SIZE bs,
53 PICK_MODE_CONTEXT *ctx);
54
55 void vp9_denoiser_reset_frame_stats(PICK_MODE_CONTEXT *ctx);
56
57 void vp9_denoiser_update_frame_stats(MB_MODE_INFO *mbmi,
58 unsigned int sse, PREDICTION_MODE mode,
59 PICK_MODE_CONTEXT *ctx);
60
61 int vp9_denoiser_alloc(VP9_DENOISER *denoiser, int width, int height,
62 int ssx, int ssy,
63 #if CONFIG_VP9_HIGHBITDEPTH
64 int use_highbitdepth,
65 #endif
66 int border);
67
68 #if CONFIG_VP9_TEMPORAL_DENOISING
69 // This function is used by both c and sse2 denoiser implementations.
70 // Define it as a static function within the scope where vp9_denoiser.h
71 // is referenced.
total_adj_strong_thresh(BLOCK_SIZE bs,int increase_denoising)72 static int total_adj_strong_thresh(BLOCK_SIZE bs, int increase_denoising) {
73 return (1 << num_pels_log2_lookup[bs]) * (increase_denoising ? 3 : 2);
74 }
75 #endif
76
77 void vp9_denoiser_free(VP9_DENOISER *denoiser);
78
79 void vp9_denoiser_init_noise_estimate(VP9_DENOISER *denoiser,
80 int width,
81 int height);
82
83 void vp9_denoiser_update_noise_estimate(struct VP9_COMP *const cpi);
84
85 #ifdef __cplusplus
86 } // extern "C"
87 #endif
88
89 #endif // VP9_ENCODER_DENOISER_H_
90