rd.h 10.9 KB
Newer Older
Jingning Han's avatar
Jingning Han committed
1
2
3
4
5
6
7
8
9
10
/*
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

11
12
#ifndef VP10_ENCODER_RD_H_
#define VP10_ENCODER_RD_H_
Jingning Han's avatar
Jingning Han committed
13
14
15

#include <limits.h>

16
17
18
#if CONFIG_ANS
#include "vp10/common/ans.h"
#endif  // CONFIG_ANS
19
#include "vp10/common/blockd.h"
Jingning Han's avatar
Jingning Han committed
20

21
22
#include "vp10/encoder/block.h"
#include "vp10/encoder/context_tree.h"
23
#include "vp10/encoder/cost.h"
Jingning Han's avatar
Jingning Han committed
24
25
26
27
28
29

#ifdef __cplusplus
extern "C" {
#endif

#define RDDIV_BITS          7
30
#define RD_EPB_SHIFT        6
Jingning Han's avatar
Jingning Han committed
31
32

#define RDCOST(RM, DM, R, D) \
33
  (ROUND_POWER_OF_TWO(((int64_t)R) * (RM), VP9_PROB_COST_SHIFT) + (D << DM))
Debargha Mukherjee's avatar
Debargha Mukherjee committed
34

35
36
37
#define RDCOST_DBL(RM, DM, R, D)                                   \
  (((((double)(R)) * (RM)) / (double)(1 << VP9_PROB_COST_SHIFT)) + \
   ((double)(D) * (1 << (DM))))
Debargha Mukherjee's avatar
Debargha Mukherjee committed
38

Jingning Han's avatar
Jingning Han committed
39
40
41
42
43
44
45
#define QIDX_SKIP_THRESH     115

#define MV_COST_WEIGHT      108
#define MV_COST_WEIGHT_SUB  120

#define INVALID_MV 0x80008000

46
#if CONFIG_EXT_REFS
47

Yue Chen's avatar
Yue Chen committed
48
#if CONFIG_EXT_INTER
49
#define MAX_MODES 144
50
#else  // CONFIG_EXT_INTER
51
#define MAX_MODES 66
Yue Chen's avatar
Yue Chen committed
52
#endif  // CONFIG_EXT_INTER
53
54
55

#else  // CONFIG_EXT_REFS

Yue Chen's avatar
Yue Chen committed
56
#if CONFIG_EXT_INTER
57
#define MAX_MODES 57
58
#else  // CONFIG_EXT_INTER
Jingning Han's avatar
Jingning Han committed
59
#define MAX_MODES 30
Yue Chen's avatar
Yue Chen committed
60
#endif  // CONFIG_EXT_INTER
61

62
63
64
#endif  // CONFIG_EXT_REFS

#if CONFIG_EXT_REFS
65
66
#define MAX_REFS  15
#else
Jingning Han's avatar
Jingning Han committed
67
#define MAX_REFS  6
68
#endif  // CONFIG_EXT_REFS
Jingning Han's avatar
Jingning Han committed
69
70
71
72
73
74
75
76

#define RD_THRESH_MAX_FACT 64
#define RD_THRESH_INC      1

// This enumerator type needs to be kept aligned with the mode order in
// const MODE_DEFINITION vp10_mode_order[MAX_MODES] used in the rd code.
typedef enum {
  THR_NEARESTMV,
77
78
79
#if CONFIG_EXT_REFS
  THR_NEARESTL2,
  THR_NEARESTL3,
80
  THR_NEARESTB,
81
#endif  // CONFIG_EXT_REFS
Jingning Han's avatar
Jingning Han committed
82
83
84
85
86
87
  THR_NEARESTA,
  THR_NEARESTG,

  THR_DC,

  THR_NEWMV,
88
89
90
#if CONFIG_EXT_REFS
  THR_NEWL2,
  THR_NEWL3,
91
  THR_NEWB,
92
#endif  // CONFIG_EXT_REFS
Jingning Han's avatar
Jingning Han committed
93
94
95
96
  THR_NEWA,
  THR_NEWG,

  THR_NEARMV,
97
98
99
#if CONFIG_EXT_REFS
  THR_NEARL2,
  THR_NEARL3,
100
  THR_NEARB,
101
#endif  // CONFIG_EXT_REFS
Jingning Han's avatar
Jingning Han committed
102
103
104
  THR_NEARA,
  THR_NEARG,

Yue Chen's avatar
Yue Chen committed
105
106
#if CONFIG_EXT_INTER
  THR_NEWFROMNEARMV,
107
#if CONFIG_EXT_REFS
Yue Chen's avatar
Yue Chen committed
108
109
  THR_NEWFROMNEARL2,
  THR_NEWFROMNEARL3,
110
  THR_NEWFROMNEARB,
111
#endif  // CONFIG_EXT_REFS
Yue Chen's avatar
Yue Chen committed
112
113
114
115
  THR_NEWFROMNEARA,
  THR_NEWFROMNEARG,
#endif  // CONFIG_EXT_INTER

Jingning Han's avatar
Jingning Han committed
116
  THR_ZEROMV,
117
118
119
#if CONFIG_EXT_REFS
  THR_ZEROL2,
  THR_ZEROL3,
120
  THR_ZEROB,
121
#endif  // CONFIG_EXT_REFS
Jingning Han's avatar
Jingning Han committed
122
123
124
  THR_ZEROG,
  THR_ZEROA,

125
#if CONFIG_EXT_INTER
126

127
128
129
130
  THR_COMP_NEAREST_NEARESTLA,
#if CONFIG_EXT_REFS
  THR_COMP_NEAREST_NEARESTL2A,
  THR_COMP_NEAREST_NEARESTL3A,
131
132
133
#endif  // CONFIG_EXT_REFS
  THR_COMP_NEAREST_NEARESTGA,
#if CONFIG_EXT_REFS
134
  THR_COMP_NEAREST_NEARESTLB,
135
136
  THR_COMP_NEAREST_NEARESTL2B,
  THR_COMP_NEAREST_NEARESTL3B,
137
  THR_COMP_NEAREST_NEARESTGB,
138
#endif  // CONFIG_EXT_REFS
139

140
#else  // CONFIG_EXT_INTER
141

Jingning Han's avatar
Jingning Han committed
142
  THR_COMP_NEARESTLA,
143
144
145
#if CONFIG_EXT_REFS
  THR_COMP_NEARESTL2A,
  THR_COMP_NEARESTL3A,
146
147
148
#endif  // CONFIG_EXT_REFS
  THR_COMP_NEARESTGA,
#if CONFIG_EXT_REFS
149
  THR_COMP_NEARESTLB,
150
151
  THR_COMP_NEARESTL2B,
  THR_COMP_NEARESTL3B,
152
  THR_COMP_NEARESTGB,
153
#endif  // CONFIG_EXT_REFS
154

155
#endif  // CONFIG_EXT_INTER
Jingning Han's avatar
Jingning Han committed
156
157
158

  THR_TM,

159
#if CONFIG_EXT_INTER
160

161
162
  THR_COMP_NEAR_NEARESTLA,
  THR_COMP_NEAREST_NEARLA,
163
  THR_COMP_NEAR_NEARLA,
164
165
166
167
168
169
170
171
172
173
  THR_COMP_NEW_NEARESTLA,
  THR_COMP_NEAREST_NEWLA,
  THR_COMP_NEW_NEARLA,
  THR_COMP_NEAR_NEWLA,
  THR_COMP_NEW_NEWLA,
  THR_COMP_ZERO_ZEROLA,

#if CONFIG_EXT_REFS
  THR_COMP_NEAR_NEARESTL2A,
  THR_COMP_NEAREST_NEARL2A,
174
  THR_COMP_NEAR_NEARL2A,
175
176
177
178
179
180
181
182
183
  THR_COMP_NEW_NEARESTL2A,
  THR_COMP_NEAREST_NEWL2A,
  THR_COMP_NEW_NEARL2A,
  THR_COMP_NEAR_NEWL2A,
  THR_COMP_NEW_NEWL2A,
  THR_COMP_ZERO_ZEROL2A,

  THR_COMP_NEAR_NEARESTL3A,
  THR_COMP_NEAREST_NEARL3A,
184
  THR_COMP_NEAR_NEARL3A,
185
186
187
188
189
190
  THR_COMP_NEW_NEARESTL3A,
  THR_COMP_NEAREST_NEWL3A,
  THR_COMP_NEW_NEARL3A,
  THR_COMP_NEAR_NEWL3A,
  THR_COMP_NEW_NEWL3A,
  THR_COMP_ZERO_ZEROL3A,
191
#endif  // CONFIG_EXT_REFS
192

193
194
195
196
197
198
199
200
201
  THR_COMP_NEAR_NEARESTGA,
  THR_COMP_NEAREST_NEARGA,
  THR_COMP_NEAR_NEARGA,
  THR_COMP_NEW_NEARESTGA,
  THR_COMP_NEAREST_NEWGA,
  THR_COMP_NEW_NEARGA,
  THR_COMP_NEAR_NEWGA,
  THR_COMP_NEW_NEWGA,
  THR_COMP_ZERO_ZEROGA,
202

203
#if CONFIG_EXT_REFS
204
205
  THR_COMP_NEAR_NEARESTLB,
  THR_COMP_NEAREST_NEARLB,
206
  THR_COMP_NEAR_NEARLB,
207
208
209
210
211
212
  THR_COMP_NEW_NEARESTLB,
  THR_COMP_NEAREST_NEWLB,
  THR_COMP_NEW_NEARLB,
  THR_COMP_NEAR_NEWLB,
  THR_COMP_NEW_NEWLB,
  THR_COMP_ZERO_ZEROLB,
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241

  THR_COMP_NEAR_NEARESTL2B,
  THR_COMP_NEAREST_NEARL2B,
  THR_COMP_NEAR_NEARL2B,
  THR_COMP_NEW_NEARESTL2B,
  THR_COMP_NEAREST_NEWL2B,
  THR_COMP_NEW_NEARL2B,
  THR_COMP_NEAR_NEWL2B,
  THR_COMP_NEW_NEWL2B,
  THR_COMP_ZERO_ZEROL2B,

  THR_COMP_NEAR_NEARESTL3B,
  THR_COMP_NEAREST_NEARL3B,
  THR_COMP_NEAR_NEARL3B,
  THR_COMP_NEW_NEARESTL3B,
  THR_COMP_NEAREST_NEWL3B,
  THR_COMP_NEW_NEARL3B,
  THR_COMP_NEAR_NEWL3B,
  THR_COMP_NEW_NEWL3B,
  THR_COMP_ZERO_ZEROL3B,

  THR_COMP_NEAR_NEARESTGB,
  THR_COMP_NEAREST_NEARGB,
  THR_COMP_NEAR_NEARGB,
  THR_COMP_NEW_NEARESTGB,
  THR_COMP_NEAREST_NEWGB,
  THR_COMP_NEW_NEARGB,
  THR_COMP_NEAR_NEWGB,
  THR_COMP_NEW_NEWGB,
242
  THR_COMP_ZERO_ZEROGB,
243
#endif  // CONFIG_EXT_REFS
244
245
246

#else  // CONFIG_EXT_INTER

Jingning Han's avatar
Jingning Han committed
247
248
  THR_COMP_NEARLA,
  THR_COMP_NEWLA,
249
250
251
252
253
#if CONFIG_EXT_REFS
  THR_COMP_NEARL2A,
  THR_COMP_NEWL2A,
  THR_COMP_NEARL3A,
  THR_COMP_NEWL3A,
254
255
256
257
258
#endif  // CONFIG_EXT_REFS
  THR_COMP_NEARGA,
  THR_COMP_NEWGA,

#if CONFIG_EXT_REFS
259
260
  THR_COMP_NEARLB,
  THR_COMP_NEWLB,
261
262
263
264
  THR_COMP_NEARL2B,
  THR_COMP_NEWL2B,
  THR_COMP_NEARL3B,
  THR_COMP_NEWL3B,
265
266
  THR_COMP_NEARGB,
  THR_COMP_NEWGB,
267
#endif  // CONFIG_EXT_REFS
Jingning Han's avatar
Jingning Han committed
268
269

  THR_COMP_ZEROLA,
270
271
272
#if CONFIG_EXT_REFS
  THR_COMP_ZEROL2A,
  THR_COMP_ZEROL3A,
273
274
275
276
#endif  // CONFIG_EXT_REFS
  THR_COMP_ZEROGA,

#if CONFIG_EXT_REFS
277
  THR_COMP_ZEROLB,
278
279
  THR_COMP_ZEROL2B,
  THR_COMP_ZEROL3B,
280
  THR_COMP_ZEROGB,
281
#endif  // CONFIG_EXT_REFS
282

283
#endif  // CONFIG_EXT_INTER
Jingning Han's avatar
Jingning Han committed
284
285
286
287
288
289
290
291
292

  THR_H_PRED,
  THR_V_PRED,
  THR_D135_PRED,
  THR_D207_PRED,
  THR_D153_PRED,
  THR_D63_PRED,
  THR_D117_PRED,
  THR_D45_PRED,
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316

#if CONFIG_EXT_INTER
  THR_COMP_INTERINTRA_ZEROL,
  THR_COMP_INTERINTRA_NEARESTL,
  THR_COMP_INTERINTRA_NEARL,
  THR_COMP_INTERINTRA_NEWL,

#if CONFIG_EXT_REFS
  THR_COMP_INTERINTRA_ZEROL2,
  THR_COMP_INTERINTRA_NEARESTL2,
  THR_COMP_INTERINTRA_NEARL2,
  THR_COMP_INTERINTRA_NEWL2,

  THR_COMP_INTERINTRA_ZEROL3,
  THR_COMP_INTERINTRA_NEARESTL3,
  THR_COMP_INTERINTRA_NEARL3,
  THR_COMP_INTERINTRA_NEWL3,
#endif  // CONFIG_EXT_REFS

  THR_COMP_INTERINTRA_ZEROG,
  THR_COMP_INTERINTRA_NEARESTG,
  THR_COMP_INTERINTRA_NEARG,
  THR_COMP_INTERINTRA_NEWG,

317
318
319
320
321
322
323
#if CONFIG_EXT_REFS
  THR_COMP_INTERINTRA_ZEROB,
  THR_COMP_INTERINTRA_NEARESTB,
  THR_COMP_INTERINTRA_NEARB,
  THR_COMP_INTERINTRA_NEWB,
#endif  // CONFIG_EXT_REFS

324
325
326
327
328
  THR_COMP_INTERINTRA_ZEROA,
  THR_COMP_INTERINTRA_NEARESTA,
  THR_COMP_INTERINTRA_NEARA,
  THR_COMP_INTERINTRA_NEWA,
#endif  // CONFIG_EXT_INTER
Jingning Han's avatar
Jingning Han committed
329
330
331
332
} THR_MODES;

typedef enum {
  THR_LAST,
333
334
335
#if CONFIG_EXT_REFS
  THR_LAST2,
  THR_LAST3,
336
  THR_BWDR,
337
#endif  // CONFIG_EXT_REFS
Jingning Han's avatar
Jingning Han committed
338
339
  THR_GOLD,
  THR_ALTR,
340

Jingning Han's avatar
Jingning Han committed
341
  THR_COMP_LA,
342
343
344
#if CONFIG_EXT_REFS
  THR_COMP_L2A,
  THR_COMP_L3A,
345
346
347
348
#endif  // CONFIG_EXT_REFS
  THR_COMP_GA,

#if CONFIG_EXT_REFS
349
  THR_COMP_LB,
350
351
  THR_COMP_L2B,
  THR_COMP_L3B,
352
  THR_COMP_GB,
353
#endif  // CONFIG_EXT_REFS
354

Jingning Han's avatar
Jingning Han committed
355
356
357
358
359
360
361
362
363
364
365
366
367
  THR_INTRA,
} THR_MODES_SUB8X8;

typedef struct RD_OPT {
  // Thresh_mult is used to set a threshold for the rd score. A higher value
  // means that we will accept the best mode so far more often. This number
  // is used in combination with the current block size, and thresh_freq_fact
  // to pick a threshold.
  int thresh_mult[MAX_MODES];
  int thresh_mult_sub8x8[MAX_REFS];

  int threshes[MAX_SEGMENTS][BLOCK_SIZES][MAX_MODES];

368
  int64_t prediction_type_threshes[TOTAL_REFS_PER_FRAME][REFERENCE_MODES];
Jingning Han's avatar
Jingning Han committed
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386

  int RDMULT;
  int RDDIV;
} RD_OPT;

typedef struct RD_COST {
  int rate;
  int64_t dist;
  int64_t rdcost;
} RD_COST;

// Reset the rate distortion cost values to maximum (invalid) value.
void vp10_rd_cost_reset(RD_COST *rd_cost);
// Initialize the rate distortion cost values to zero.
void vp10_rd_cost_init(RD_COST *rd_cost);

struct TileInfo;
struct TileDataEnc;
Yaowu Xu's avatar
Yaowu Xu committed
387
struct VP10_COMP;
Jingning Han's avatar
Jingning Han committed
388
389
struct macroblock;

Yaowu Xu's avatar
Yaowu Xu committed
390
int vp10_compute_rd_mult(const struct VP10_COMP *cpi, int qindex);
Jingning Han's avatar
Jingning Han committed
391

Yaowu Xu's avatar
Yaowu Xu committed
392
void vp10_initialize_rd_consts(struct VP10_COMP *cpi);
Jingning Han's avatar
Jingning Han committed
393

394
void vp10_initialize_me_consts(const struct VP10_COMP *cpi,
Yaowu Xu's avatar
Yaowu Xu committed
395
                               MACROBLOCK *x, int qindex);
Jingning Han's avatar
Jingning Han committed
396

Yaowu Xu's avatar
Yaowu Xu committed
397
398
399
void vp10_model_rd_from_var_lapndz(int64_t var, unsigned int n,
                                   unsigned int qstep, int *rate,
                                   int64_t *dist);
Jingning Han's avatar
Jingning Han committed
400

Yaowu Xu's avatar
Yaowu Xu committed
401
int vp10_get_switchable_rate(const struct VP10_COMP *cpi,
Yaowu Xu's avatar
Yaowu Xu committed
402
                             const MACROBLOCKD *const xd);
Jingning Han's avatar
Jingning Han committed
403
404

int vp10_raster_block_offset(BLOCK_SIZE plane_bsize,
Yaowu Xu's avatar
Yaowu Xu committed
405
                             int raster_block, int stride);
Jingning Han's avatar
Jingning Han committed
406
407

int16_t* vp10_raster_block_offset_int16(BLOCK_SIZE plane_bsize,
Yaowu Xu's avatar
Yaowu Xu committed
408
                                        int raster_block, int16_t *base);
Jingning Han's avatar
Jingning Han committed
409

Yaowu Xu's avatar
Yaowu Xu committed
410
YV12_BUFFER_CONFIG *vp10_get_scaled_ref_frame(const struct VP10_COMP *cpi,
Yaowu Xu's avatar
Yaowu Xu committed
411
                                              int ref_frame);
Jingning Han's avatar
Jingning Han committed
412
413
414

void vp10_init_me_luts(void);

415
416
417
418
#if CONFIG_REF_MV
void vp10_set_mvcost(MACROBLOCK *x, MV_REFERENCE_FRAME ref_frame);
#endif

Jingning Han's avatar
Jingning Han committed
419
void vp10_get_entropy_contexts(BLOCK_SIZE bsize, TX_SIZE tx_size,
Yaowu Xu's avatar
Yaowu Xu committed
420
421
422
                               const struct macroblockd_plane *pd,
                               ENTROPY_CONTEXT t_above[2 * MAX_MIB_SIZE],
                               ENTROPY_CONTEXT t_left[2 * MAX_MIB_SIZE]);
Jingning Han's avatar
Jingning Han committed
423

Yaowu Xu's avatar
Yaowu Xu committed
424
void vp10_set_rd_speed_thresholds(struct VP10_COMP *cpi);
Jingning Han's avatar
Jingning Han committed
425

Yaowu Xu's avatar
Yaowu Xu committed
426
void vp10_set_rd_speed_thresholds_sub8x8(struct VP10_COMP *cpi);
Jingning Han's avatar
Jingning Han committed
427

428
429
430
void vp10_update_rd_thresh_fact(const VP10_COMMON *const cm,
                                int (*fact)[MAX_MODES], int rd_thresh,
                                int bsize, int best_mode_index);
Jingning Han's avatar
Jingning Han committed
431

432
void vp10_fill_token_costs(vp10_coeff_cost *c,
433
434
435
#if CONFIG_ANS
                           coeff_cdf_model (*cdf)[PLANE_TYPES],
#endif  // CONFIG_ANS
436
                           vp10_coeff_probs_model (*p)[PLANE_TYPES]);
hui su's avatar
hui su committed
437

Jingning Han's avatar
Jingning Han committed
438
439
440
441
442
static INLINE int rd_less_than_thresh(int64_t best_rd, int thresh,
                                      int thresh_fact) {
    return best_rd < ((int64_t)thresh * thresh_fact >> 5) || thresh == INT_MAX;
}

Yaowu Xu's avatar
Yaowu Xu committed
443
void vp10_mv_pred(struct VP10_COMP *cpi, MACROBLOCK *x,
Yaowu Xu's avatar
Yaowu Xu committed
444
445
                  uint8_t *ref_y_buffer, int ref_y_stride,
                  int ref_frame, BLOCK_SIZE block_size);
Jingning Han's avatar
Jingning Han committed
446

447
448
449
450
451
static INLINE void set_error_per_bit(MACROBLOCK *x, int rdmult) {
  x->errorperbit = rdmult >> RD_EPB_SHIFT;
  x->errorperbit += (x->errorperbit == 0);
}

Jingning Han's avatar
Jingning Han committed
452
void vp10_setup_pred_block(const MACROBLOCKD *xd,
Yaowu Xu's avatar
Yaowu Xu committed
453
454
455
456
457
                           struct buf_2d dst[MAX_MB_PLANE],
                           const YV12_BUFFER_CONFIG *src,
                           int mi_row, int mi_col,
                           const struct scale_factors *scale,
                           const struct scale_factors *scale_uv);
Jingning Han's avatar
Jingning Han committed
458
459

int vp10_get_intra_cost_penalty(int qindex, int qdelta,
Yaowu Xu's avatar
Yaowu Xu committed
460
                                vpx_bit_depth_t bit_depth);
Jingning Han's avatar
Jingning Han committed
461
462
463
464
465

#ifdef __cplusplus
}  // extern "C"
#endif

466
#endif  // VP10_ENCODER_RD_H_