Coverage Report

Created: 2024-09-06 07:53

/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_