/src/libvpx/vp9/encoder/vp9_rd.h
Line | Count | Source |
1 | | /* |
2 | | * Copyright (c) 2010 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 VPX_VP9_ENCODER_VP9_RD_H_ |
12 | | #define VPX_VP9_ENCODER_VP9_RD_H_ |
13 | | |
14 | | #include <limits.h> |
15 | | |
16 | | #include "vp9/common/vp9_blockd.h" |
17 | | |
18 | | #include "vp9/encoder/vp9_block.h" |
19 | | #include "vp9/encoder/vp9_context_tree.h" |
20 | | #include "vp9/encoder/vp9_cost.h" |
21 | | |
22 | | #ifdef __cplusplus |
23 | | extern "C" { |
24 | | #endif |
25 | | |
26 | 42.2k | #define RDDIV_BITS 7 |
27 | 8.93M | #define RD_EPB_SHIFT 6 |
28 | | |
29 | | #define RDCOST(RM, DM, R, D) \ |
30 | 2.38G | ROUND_POWER_OF_TWO(((int64_t)(R)) * (RM), VP9_PROB_COST_SHIFT) + ((D) << (DM)) |
31 | | #define RDCOST_NEG_R(RM, DM, R, D) \ |
32 | 475k | ((D) << (DM)) - ROUND_POWER_OF_TWO(((int64_t)(R)) * (RM), VP9_PROB_COST_SHIFT) |
33 | | #define RDCOST_NEG_D(RM, DM, R, D) \ |
34 | 68.1k | ROUND_POWER_OF_TWO(((int64_t)(R)) * (RM), VP9_PROB_COST_SHIFT) - ((D) << (DM)) |
35 | | |
36 | 5.99M | #define QIDX_SKIP_THRESH 115 |
37 | | |
38 | 6.18M | #define MV_COST_WEIGHT 108 |
39 | 22.4M | #define MV_COST_WEIGHT_SUB 120 |
40 | | |
41 | 296M | #define MAX_MODES 30 |
42 | 27.8M | #define MAX_REFS 6 |
43 | | |
44 | 3.64M | #define RD_THRESH_INIT_FACT 32 |
45 | | #define RD_THRESH_MAX_FACT 64 |
46 | | #define RD_THRESH_INC 1 |
47 | | |
48 | 52.6M | #define VP9_DIST_SCALE_LOG2 4 |
49 | | #define VP9_DIST_SCALE (1 << VP9_DIST_SCALE_LOG2) |
50 | | |
51 | | // This enumerator type needs to be kept aligned with the mode order in |
52 | | // const MODE_DEFINITION vp9_mode_order[MAX_MODES] used in the rd code. |
53 | | typedef enum { |
54 | | THR_NEARESTMV, |
55 | | THR_NEARESTA, |
56 | | THR_NEARESTG, |
57 | | |
58 | | THR_DC, |
59 | | |
60 | | THR_NEWMV, |
61 | | THR_NEWA, |
62 | | THR_NEWG, |
63 | | |
64 | | THR_NEARMV, |
65 | | THR_NEARA, |
66 | | THR_NEARG, |
67 | | |
68 | | THR_ZEROMV, |
69 | | THR_ZEROG, |
70 | | THR_ZEROA, |
71 | | |
72 | | THR_COMP_NEARESTLA, |
73 | | THR_COMP_NEARESTGA, |
74 | | |
75 | | THR_TM, |
76 | | |
77 | | THR_COMP_NEARLA, |
78 | | THR_COMP_NEWLA, |
79 | | THR_COMP_NEARGA, |
80 | | THR_COMP_NEWGA, |
81 | | |
82 | | THR_COMP_ZEROLA, |
83 | | THR_COMP_ZEROGA, |
84 | | |
85 | | THR_H_PRED, |
86 | | THR_V_PRED, |
87 | | THR_D135_PRED, |
88 | | THR_D207_PRED, |
89 | | THR_D153_PRED, |
90 | | THR_D63_PRED, |
91 | | THR_D117_PRED, |
92 | | THR_D45_PRED, |
93 | | } THR_MODES; |
94 | | |
95 | | typedef enum { |
96 | | THR_LAST, |
97 | | THR_GOLD, |
98 | | THR_ALTR, |
99 | | THR_COMP_LA, |
100 | | THR_COMP_GA, |
101 | | THR_INTRA, |
102 | | } THR_MODES_SUB8X8; |
103 | | |
104 | | typedef struct { |
105 | | // RD multiplier control factors added for Vizier project. |
106 | | double rd_mult_inter_qp_fac; |
107 | | double rd_mult_arf_qp_fac; |
108 | | double rd_mult_key_qp_fac; |
109 | | } RD_CONTROL; |
110 | | |
111 | | typedef struct RD_OPT { |
112 | | // Thresh_mult is used to set a threshold for the rd score. A higher value |
113 | | // means that we will accept the best mode so far more often. This number |
114 | | // is used in combination with the current block size, and thresh_freq_fact to |
115 | | // pick a threshold. |
116 | | int thresh_mult[MAX_MODES]; |
117 | | int thresh_mult_sub8x8[MAX_REFS]; |
118 | | |
119 | | int threshes[MAX_SEGMENTS][BLOCK_SIZES][MAX_MODES]; |
120 | | |
121 | | int64_t prediction_type_threshes[MAX_REF_FRAMES][REFERENCE_MODES]; |
122 | | |
123 | | int64_t filter_threshes[MAX_REF_FRAMES][SWITCHABLE_FILTER_CONTEXTS]; |
124 | | int64_t prediction_type_threshes_prev[MAX_REF_FRAMES][REFERENCE_MODES]; |
125 | | |
126 | | int64_t filter_threshes_prev[MAX_REF_FRAMES][SWITCHABLE_FILTER_CONTEXTS]; |
127 | | int RDMULT; |
128 | | int RDDIV; |
129 | | double r0; |
130 | | } RD_OPT; |
131 | | |
132 | | typedef struct RD_COST { |
133 | | int rate; |
134 | | int64_t dist; |
135 | | int64_t rdcost; |
136 | | } RD_COST; |
137 | | |
138 | | // Reset the rate distortion cost values to maximum (invalid) value. |
139 | | void vp9_rd_cost_reset(RD_COST *rd_cost); |
140 | | // Initialize the rate distortion cost values to zero. |
141 | | void vp9_rd_cost_init(RD_COST *rd_cost); |
142 | | // It supports negative rate and dist, which is different from RDCOST(). |
143 | | int64_t vp9_calculate_rd_cost(int mult, int div, int rate, int64_t dist); |
144 | | // Update the cost value based on its rate and distortion. |
145 | | void vp9_rd_cost_update(int mult, int div, RD_COST *rd_cost); |
146 | | |
147 | | struct TileInfo; |
148 | | struct TileDataEnc; |
149 | | struct VP9_COMP; |
150 | | struct macroblock; |
151 | | |
152 | | void vp9_init_rd_parameters(struct VP9_COMP *cpi); |
153 | | |
154 | | int vp9_compute_rd_mult_based_on_qindex(const struct VP9_COMP *cpi, int qindex); |
155 | | |
156 | | int vp9_compute_rd_mult(const struct VP9_COMP *cpi, int qindex); |
157 | | |
158 | | int vp9_get_adaptive_rdmult(const struct VP9_COMP *cpi, double beta); |
159 | | |
160 | | void vp9_initialize_rd_consts(struct VP9_COMP *cpi); |
161 | | |
162 | | void vp9_initialize_me_consts(struct VP9_COMP *cpi, MACROBLOCK *x, int qindex); |
163 | | |
164 | | void vp9_model_rd_from_var_lapndz(unsigned int var, unsigned int n_log2, |
165 | | unsigned int qstep, int *rate, int64_t *dist); |
166 | | |
167 | | int vp9_get_switchable_rate(const struct VP9_COMP *cpi, |
168 | | const MACROBLOCKD *const xd); |
169 | | |
170 | | int vp9_raster_block_offset(BLOCK_SIZE plane_bsize, int raster_block, |
171 | | int stride); |
172 | | |
173 | | int16_t *vp9_raster_block_offset_int16(BLOCK_SIZE plane_bsize, int raster_block, |
174 | | int16_t *base); |
175 | | |
176 | | YV12_BUFFER_CONFIG *vp9_get_scaled_ref_frame(const struct VP9_COMP *cpi, |
177 | | int ref_frame); |
178 | | |
179 | | void vp9_init_me_luts(void); |
180 | | |
181 | | void vp9_get_entropy_contexts(BLOCK_SIZE bsize, TX_SIZE tx_size, |
182 | | const struct macroblockd_plane *pd, |
183 | | ENTROPY_CONTEXT t_above[16], |
184 | | ENTROPY_CONTEXT t_left[16]); |
185 | | |
186 | | void vp9_set_rd_speed_thresholds(struct VP9_COMP *cpi); |
187 | | |
188 | | void vp9_set_rd_speed_thresholds_sub8x8(struct VP9_COMP *cpi); |
189 | | |
190 | | void vp9_update_rd_thresh_fact(int (*factor_buf)[MAX_MODES], int rd_thresh, |
191 | | int bsize, int best_mode_index); |
192 | | |
193 | | static INLINE int rd_less_than_thresh(int64_t best_rd, int thresh, |
194 | 13.7M | const int *const thresh_fact) { |
195 | 13.7M | return best_rd < ((int64_t)thresh * (*thresh_fact) >> 5) || thresh == INT_MAX; |
196 | 13.7M | } Unexecuted instantiation: vp9_cx_iface.c:rd_less_than_thresh Unexecuted instantiation: vp9_firstpass.c:rd_less_than_thresh Unexecuted instantiation: vp9_mcomp.c:rd_less_than_thresh Unexecuted instantiation: vp9_encoder.c:rd_less_than_thresh Unexecuted instantiation: vp9_picklpf.c:rd_less_than_thresh Unexecuted instantiation: vp9_quantize.c:rd_less_than_thresh Unexecuted instantiation: vp9_ratectrl.c:rd_less_than_thresh Unexecuted instantiation: vp9_rd.c:rd_less_than_thresh Unexecuted instantiation: vp9_segmentation.c:rd_less_than_thresh Unexecuted instantiation: vp9_speed_features.c:rd_less_than_thresh Unexecuted instantiation: vp9_svc_layercontext.c:rd_less_than_thresh Unexecuted instantiation: vp9_tokenize.c:rd_less_than_thresh Unexecuted instantiation: vp9_aq_variance.c:rd_less_than_thresh Unexecuted instantiation: vp9_aq_360.c:rd_less_than_thresh Unexecuted instantiation: vp9_aq_cyclicrefresh.c:rd_less_than_thresh Unexecuted instantiation: vp9_aq_complexity.c:rd_less_than_thresh Unexecuted instantiation: vp9_alt_ref_aq.c:rd_less_than_thresh Unexecuted instantiation: vp9_skin_detection.c:rd_less_than_thresh Unexecuted instantiation: vp9_noise_estimate.c:rd_less_than_thresh Unexecuted instantiation: vp9_ext_ratectrl.c:rd_less_than_thresh Unexecuted instantiation: vp9_temporal_filter.c:rd_less_than_thresh Unexecuted instantiation: vp9_tpl_model.c:rd_less_than_thresh Unexecuted instantiation: vp9_mbgraph.c:rd_less_than_thresh Unexecuted instantiation: vp9_bitstream.c:rd_less_than_thresh Unexecuted instantiation: vp9_context_tree.c:rd_less_than_thresh Unexecuted instantiation: vp9_encodeframe.c:rd_less_than_thresh Unexecuted instantiation: vp9_encodemb.c:rd_less_than_thresh Unexecuted instantiation: vp9_encodemv.c:rd_less_than_thresh Unexecuted instantiation: vp9_ethread.c:rd_less_than_thresh Unexecuted instantiation: vp9_frame_scale.c:rd_less_than_thresh Unexecuted instantiation: vp9_lookahead.c:rd_less_than_thresh Unexecuted instantiation: vp9_multi_thread.c:rd_less_than_thresh vp9_rdopt.c:rd_less_than_thresh Line | Count | Source | 194 | 13.7M | const int *const thresh_fact) { | 195 | 13.7M | return best_rd < ((int64_t)thresh * (*thresh_fact) >> 5) || thresh == INT_MAX; | 196 | 13.7M | } |
Unexecuted instantiation: vp9_pickmode.c:rd_less_than_thresh Unexecuted instantiation: temporal_filter_sse4.c:rd_less_than_thresh Unexecuted instantiation: highbd_temporal_filter_sse4.c:rd_less_than_thresh |
197 | | |
198 | 8.93M | static INLINE void set_error_per_bit(MACROBLOCK *x, int rdmult) { |
199 | 8.93M | x->errorperbit = rdmult >> RD_EPB_SHIFT; |
200 | 8.93M | x->errorperbit += (x->errorperbit == 0); |
201 | 8.93M | } Unexecuted instantiation: vp9_cx_iface.c:set_error_per_bit Unexecuted instantiation: vp9_firstpass.c:set_error_per_bit Unexecuted instantiation: vp9_mcomp.c:set_error_per_bit Unexecuted instantiation: vp9_encoder.c:set_error_per_bit Unexecuted instantiation: vp9_picklpf.c:set_error_per_bit vp9_quantize.c:set_error_per_bit Line | Count | Source | 198 | 8.89M | static INLINE void set_error_per_bit(MACROBLOCK *x, int rdmult) { | 199 | 8.89M | x->errorperbit = rdmult >> RD_EPB_SHIFT; | 200 | 8.89M | x->errorperbit += (x->errorperbit == 0); | 201 | 8.89M | } |
Unexecuted instantiation: vp9_ratectrl.c:set_error_per_bit vp9_rd.c:set_error_per_bit Line | Count | Source | 198 | 42.2k | static INLINE void set_error_per_bit(MACROBLOCK *x, int rdmult) { | 199 | 42.2k | x->errorperbit = rdmult >> RD_EPB_SHIFT; | 200 | 42.2k | x->errorperbit += (x->errorperbit == 0); | 201 | 42.2k | } |
Unexecuted instantiation: vp9_segmentation.c:set_error_per_bit Unexecuted instantiation: vp9_speed_features.c:set_error_per_bit Unexecuted instantiation: vp9_svc_layercontext.c:set_error_per_bit Unexecuted instantiation: vp9_tokenize.c:set_error_per_bit Unexecuted instantiation: vp9_aq_variance.c:set_error_per_bit Unexecuted instantiation: vp9_aq_360.c:set_error_per_bit Unexecuted instantiation: vp9_aq_cyclicrefresh.c:set_error_per_bit Unexecuted instantiation: vp9_aq_complexity.c:set_error_per_bit Unexecuted instantiation: vp9_alt_ref_aq.c:set_error_per_bit Unexecuted instantiation: vp9_skin_detection.c:set_error_per_bit Unexecuted instantiation: vp9_noise_estimate.c:set_error_per_bit Unexecuted instantiation: vp9_ext_ratectrl.c:set_error_per_bit Unexecuted instantiation: vp9_temporal_filter.c:set_error_per_bit Unexecuted instantiation: vp9_tpl_model.c:set_error_per_bit Unexecuted instantiation: vp9_mbgraph.c:set_error_per_bit Unexecuted instantiation: vp9_bitstream.c:set_error_per_bit Unexecuted instantiation: vp9_context_tree.c:set_error_per_bit Unexecuted instantiation: vp9_encodeframe.c:set_error_per_bit Unexecuted instantiation: vp9_encodemb.c:set_error_per_bit Unexecuted instantiation: vp9_encodemv.c:set_error_per_bit Unexecuted instantiation: vp9_ethread.c:set_error_per_bit Unexecuted instantiation: vp9_frame_scale.c:set_error_per_bit Unexecuted instantiation: vp9_lookahead.c:set_error_per_bit Unexecuted instantiation: vp9_multi_thread.c:set_error_per_bit Unexecuted instantiation: vp9_rdopt.c:set_error_per_bit Unexecuted instantiation: vp9_pickmode.c:set_error_per_bit Unexecuted instantiation: temporal_filter_sse4.c:set_error_per_bit Unexecuted instantiation: highbd_temporal_filter_sse4.c:set_error_per_bit |
202 | | |
203 | | void vp9_mv_pred(struct VP9_COMP *cpi, MACROBLOCK *x, uint8_t *ref_y_buffer, |
204 | | int ref_y_stride, int ref_frame, BLOCK_SIZE block_size); |
205 | | |
206 | | void vp9_setup_pred_block(const MACROBLOCKD *xd, |
207 | | struct buf_2d dst[MAX_MB_PLANE], |
208 | | const YV12_BUFFER_CONFIG *src, int mi_row, int mi_col, |
209 | | const struct scale_factors *scale, |
210 | | const struct scale_factors *scale_uv); |
211 | | |
212 | | int vp9_get_intra_cost_penalty(const struct VP9_COMP *const cpi, |
213 | | BLOCK_SIZE bsize, int qindex, int qdelta); |
214 | | |
215 | | unsigned int vp9_get_sby_variance(struct VP9_COMP *cpi, |
216 | | const struct buf_2d *ref, BLOCK_SIZE bs); |
217 | | unsigned int vp9_get_sby_perpixel_variance(struct VP9_COMP *cpi, |
218 | | const struct buf_2d *ref, |
219 | | BLOCK_SIZE bs); |
220 | | #if CONFIG_VP9_HIGHBITDEPTH |
221 | | unsigned int vp9_high_get_sby_variance(struct VP9_COMP *cpi, |
222 | | const struct buf_2d *ref, BLOCK_SIZE bs, |
223 | | int bd); |
224 | | unsigned int vp9_high_get_sby_perpixel_variance(struct VP9_COMP *cpi, |
225 | | const struct buf_2d *ref, |
226 | | BLOCK_SIZE bs, int bd); |
227 | | #endif |
228 | | |
229 | | void vp9_build_inter_mode_cost(struct VP9_COMP *cpi); |
230 | | |
231 | | #ifdef __cplusplus |
232 | | } // extern "C" |
233 | | #endif |
234 | | |
235 | | #endif // VPX_VP9_ENCODER_VP9_RD_H_ |