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