Coverage Report

Created: 2026-07-16 06:21

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libavif/ext/aom/av1/encoder/rd.c
Line
Count
Source
1
/*
2
 * Copyright (c) 2016, Alliance for Open Media. All rights reserved.
3
 *
4
 * This source code is subject to the terms of the BSD 2 Clause License and
5
 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6
 * was not distributed with this source code in the LICENSE file, you can
7
 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8
 * Media Patent License 1.0 was not distributed with this source code in the
9
 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10
 */
11
12
#include <assert.h>
13
#include <limits.h>
14
#include <math.h>
15
#include <stdio.h>
16
17
#include "aom_dsp/aom_dsp_common.h"
18
#include "aom_mem/aom_mem.h"
19
#include "aom_ports/bitops.h"
20
#include "aom_ports/mem.h"
21
#include "aom_ports/aom_once.h"
22
23
#include "av1/common/common.h"
24
#include "av1/common/entropy.h"
25
#include "av1/common/entropymode.h"
26
#include "av1/common/pred_common.h"
27
#include "av1/common/quant_common.h"
28
#include "av1/common/reconinter.h"
29
#include "av1/common/reconintra.h"
30
#include "av1/common/seg_common.h"
31
32
#include "av1/encoder/cost.h"
33
#include "av1/encoder/encodemv.h"
34
#include "av1/encoder/encoder.h"
35
#include "av1/encoder/nonrd_opt.h"
36
#include "av1/encoder/ratectrl.h"
37
#include "av1/encoder/rd.h"
38
#include "config/aom_config.h"
39
40
#define RD_THRESH_POW 1.25
41
42
// The baseline rd thresholds for breaking out of the rd loop for
43
// certain modes are assumed to be based on 8x8 blocks.
44
// This table is used to correct for block size.
45
// The factors here are << 2 (2 = x0.5, 32 = x8 etc).
46
static const uint8_t rd_thresh_block_size_factor[BLOCK_SIZES_ALL] = {
47
  2, 3, 3, 4, 6, 6, 8, 12, 12, 16, 24, 24, 32, 48, 48, 64, 4, 4, 8, 8, 16, 16
48
};
49
50
static const int use_intra_ext_tx_for_txsize[EXT_TX_SETS_INTRA]
51
                                            [EXT_TX_SIZES] = {
52
                                              { 1, 1, 1, 1 },  // unused
53
                                              { 1, 1, 0, 0 },
54
                                              { 0, 0, 1, 0 },
55
                                            };
56
57
static const int use_inter_ext_tx_for_txsize[EXT_TX_SETS_INTER]
58
                                            [EXT_TX_SIZES] = {
59
                                              { 1, 1, 1, 1 },  // unused
60
                                              { 1, 1, 0, 0 },
61
                                              { 0, 0, 1, 0 },
62
                                              { 0, 1, 1, 1 },
63
                                            };
64
65
static const int av1_ext_tx_set_idx_to_type[2][AOMMAX(EXT_TX_SETS_INTRA,
66
                                                      EXT_TX_SETS_INTER)] = {
67
  {
68
      // Intra
69
      EXT_TX_SET_DCTONLY,
70
      EXT_TX_SET_DTT4_IDTX_1DDCT,
71
      EXT_TX_SET_DTT4_IDTX,
72
  },
73
  {
74
      // Inter
75
      EXT_TX_SET_DCTONLY,
76
      EXT_TX_SET_ALL16,
77
      EXT_TX_SET_DTT9_IDTX_1DDCT,
78
      EXT_TX_SET_DCT_IDTX,
79
  },
80
};
81
82
void av1_fill_mode_rates(AV1_COMMON *const cm, ModeCosts *mode_costs,
83
579k
                         FRAME_CONTEXT *fc) {
84
579k
  int i, j;
85
86
12.1M
  for (i = 0; i < PARTITION_CONTEXTS; ++i)
87
11.5M
    av1_cost_tokens_from_cdf(mode_costs->partition_cost[i],
88
11.5M
                             fc->partition_cdf[i], NULL);
89
90
579k
  if (cm->current_frame.skip_mode_info.skip_mode_flag) {
91
57.7k
    for (i = 0; i < SKIP_MODE_CONTEXTS; ++i) {
92
43.3k
      av1_cost_tokens_from_cdf(mode_costs->skip_mode_cost[i],
93
43.3k
                               fc->skip_mode_cdfs[i], NULL);
94
43.3k
    }
95
564k
  } else {
96
564k
    av1_zero(mode_costs->skip_mode_cost);
97
564k
  }
98
99
2.31M
  for (i = 0; i < SKIP_CONTEXTS; ++i) {
100
1.73M
    av1_cost_tokens_from_cdf(mode_costs->skip_txfm_cost[i],
101
1.73M
                             fc->skip_txfm_cdfs[i], NULL);
102
1.73M
  }
103
104
3.47M
  for (i = 0; i < KF_MODE_CONTEXTS; ++i)
105
17.3M
    for (j = 0; j < KF_MODE_CONTEXTS; ++j)
106
14.4M
      av1_cost_tokens_from_cdf(mode_costs->y_mode_costs[i][j],
107
14.4M
                               fc->kf_y_cdf[i][j], NULL);
108
109
2.89M
  for (i = 0; i < BLOCK_SIZE_GROUPS; ++i)
110
2.31M
    av1_cost_tokens_from_cdf(mode_costs->mbmode_cost[i], fc->y_mode_cdf[i],
111
2.31M
                             NULL);
112
1.73M
  for (i = 0; i < CFL_ALLOWED_TYPES; ++i)
113
16.2M
    for (j = 0; j < INTRA_MODES; ++j)
114
15.0M
      av1_cost_tokens_from_cdf(mode_costs->intra_uv_mode_cost[i][j],
115
15.0M
                               fc->uv_mode_cdf[i][j], NULL);
116
117
579k
  av1_cost_tokens_from_cdf(mode_costs->filter_intra_mode_cost,
118
579k
                           fc->filter_intra_mode_cdf, NULL);
119
13.2M
  for (i = 0; i < BLOCK_SIZES_ALL; ++i) {
120
12.7M
    if (av1_filter_intra_allowed_bsize(cm, i))
121
8.09M
      av1_cost_tokens_from_cdf(mode_costs->filter_intra_cost[i],
122
8.09M
                               fc->filter_intra_cdfs[i], NULL);
123
12.7M
  }
124
125
9.84M
  for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; ++i)
126
9.26M
    av1_cost_tokens_from_cdf(mode_costs->switchable_interp_costs[i],
127
9.26M
                             fc->switchable_interp_cdf[i], NULL);
128
129
4.63M
  for (i = 0; i < PALATTE_BSIZE_CTXS; ++i) {
130
4.05M
    av1_cost_tokens_from_cdf(mode_costs->palette_y_size_cost[i],
131
4.05M
                             fc->palette_y_size_cdf[i], NULL);
132
4.05M
    av1_cost_tokens_from_cdf(mode_costs->palette_uv_size_cost[i],
133
4.05M
                             fc->palette_uv_size_cdf[i], NULL);
134
16.2M
    for (j = 0; j < PALETTE_Y_MODE_CONTEXTS; ++j) {
135
12.1M
      av1_cost_tokens_from_cdf(mode_costs->palette_y_mode_cost[i][j],
136
12.1M
                               fc->palette_y_mode_cdf[i][j], NULL);
137
12.1M
    }
138
4.05M
  }
139
140
1.73M
  for (i = 0; i < PALETTE_UV_MODE_CONTEXTS; ++i) {
141
1.15M
    av1_cost_tokens_from_cdf(mode_costs->palette_uv_mode_cost[i],
142
1.15M
                             fc->palette_uv_mode_cdf[i], NULL);
143
1.15M
  }
144
145
4.63M
  for (i = 0; i < PALETTE_SIZES; ++i) {
146
24.2M
    for (j = 0; j < PALETTE_COLOR_INDEX_CONTEXTS; ++j) {
147
20.2M
      av1_cost_tokens_from_cdf(mode_costs->palette_y_color_cost[i][j],
148
20.2M
                               fc->palette_y_color_index_cdf[i][j], NULL);
149
20.2M
      av1_cost_tokens_from_cdf(mode_costs->palette_uv_color_cost[i][j],
150
20.2M
                               fc->palette_uv_color_index_cdf[i][j], NULL);
151
20.2M
    }
152
4.05M
  }
153
154
579k
  int sign_cost[CFL_JOINT_SIGNS];
155
579k
  av1_cost_tokens_from_cdf(sign_cost, fc->cfl_sign_cdf, NULL);
156
5.21M
  for (int joint_sign = 0; joint_sign < CFL_JOINT_SIGNS; joint_sign++) {
157
4.63M
    int *cost_u = mode_costs->cfl_cost[joint_sign][CFL_PRED_U];
158
4.63M
    int *cost_v = mode_costs->cfl_cost[joint_sign][CFL_PRED_V];
159
4.63M
    if (CFL_SIGN_U(joint_sign) == CFL_SIGN_ZERO) {
160
1.15M
      memset(cost_u, 0, CFL_ALPHABET_SIZE * sizeof(*cost_u));
161
3.47M
    } else {
162
3.47M
      const aom_cdf_prob *cdf_u = fc->cfl_alpha_cdf[CFL_CONTEXT_U(joint_sign)];
163
3.47M
      av1_cost_tokens_from_cdf(cost_u, cdf_u, NULL);
164
3.47M
    }
165
4.63M
    if (CFL_SIGN_V(joint_sign) == CFL_SIGN_ZERO) {
166
1.15M
      memset(cost_v, 0, CFL_ALPHABET_SIZE * sizeof(*cost_v));
167
3.47M
    } else {
168
3.47M
      const aom_cdf_prob *cdf_v = fc->cfl_alpha_cdf[CFL_CONTEXT_V(joint_sign)];
169
3.47M
      av1_cost_tokens_from_cdf(cost_v, cdf_v, NULL);
170
3.47M
    }
171
78.7M
    for (int u = 0; u < CFL_ALPHABET_SIZE; u++)
172
74.1M
      cost_u[u] += sign_cost[joint_sign];
173
4.63M
  }
174
175
2.89M
  for (i = 0; i < MAX_TX_CATS; ++i)
176
9.26M
    for (j = 0; j < TX_SIZE_CONTEXTS; ++j)
177
6.94M
      av1_cost_tokens_from_cdf(mode_costs->tx_size_cost[i][j],
178
6.94M
                               fc->tx_size_cdf[i][j], NULL);
179
180
12.7M
  for (i = 0; i < TXFM_PARTITION_CONTEXTS; ++i) {
181
12.1M
    av1_cost_tokens_from_cdf(mode_costs->txfm_partition_cost[i],
182
12.1M
                             fc->txfm_partition_cdf[i], NULL);
183
12.1M
  }
184
185
2.89M
  for (i = TX_4X4; i < EXT_TX_SIZES; ++i) {
186
2.31M
    int s;
187
9.27M
    for (s = 1; s < EXT_TX_SETS_INTER; ++s) {
188
6.95M
      if (use_inter_ext_tx_for_txsize[s][i]) {
189
3.47M
        av1_cost_tokens_from_cdf(
190
3.47M
            mode_costs->inter_tx_type_costs[s][i], fc->inter_ext_tx_cdf[s][i],
191
3.47M
            av1_ext_tx_inv[av1_ext_tx_set_idx_to_type[1][s]]);
192
3.47M
      }
193
6.95M
    }
194
6.95M
    for (s = 1; s < EXT_TX_SETS_INTRA; ++s) {
195
4.63M
      if (use_intra_ext_tx_for_txsize[s][i]) {
196
24.2M
        for (j = 0; j < INTRA_MODES; ++j) {
197
22.5M
          av1_cost_tokens_from_cdf(
198
22.5M
              mode_costs->intra_tx_type_costs[s][i][j],
199
22.5M
              fc->intra_ext_tx_cdf[s][i][j],
200
22.5M
              av1_ext_tx_inv[av1_ext_tx_set_idx_to_type[0][s]]);
201
22.5M
        }
202
1.73M
      }
203
4.63M
    }
204
2.31M
  }
205
5.21M
  for (i = 0; i < DIRECTIONAL_MODES; ++i) {
206
4.63M
    av1_cost_tokens_from_cdf(mode_costs->angle_delta_cost[i],
207
4.63M
                             fc->angle_delta_cdf[i], NULL);
208
4.63M
  }
209
579k
  av1_cost_tokens_from_cdf(mode_costs->intrabc_cost, fc->intrabc_cdf, NULL);
210
211
2.31M
  for (i = 0; i < SPATIAL_PREDICTION_PROBS; ++i) {
212
1.73M
    av1_cost_tokens_from_cdf(mode_costs->spatial_pred_cost[i],
213
1.73M
                             fc->seg.spatial_pred_seg_cdf[i], NULL);
214
1.73M
  }
215
216
2.31M
  for (i = 0; i < SEG_TEMPORAL_PRED_CTXS; ++i) {
217
1.73M
    av1_cost_tokens_from_cdf(mode_costs->tmp_pred_cost[i], fc->seg.pred_cdf[i],
218
1.73M
                             NULL);
219
1.73M
  }
220
221
579k
  if (!frame_is_intra_only(cm)) {
222
608k
    for (i = 0; i < COMP_INTER_CONTEXTS; ++i) {
223
506k
      av1_cost_tokens_from_cdf(mode_costs->comp_inter_cost[i],
224
506k
                               fc->comp_inter_cdf[i], NULL);
225
506k
    }
226
227
405k
    for (i = 0; i < REF_CONTEXTS; ++i) {
228
2.12M
      for (j = 0; j < SINGLE_REFS - 1; ++j) {
229
1.82M
        av1_cost_tokens_from_cdf(mode_costs->single_ref_cost[i][j],
230
1.82M
                                 fc->single_ref_cdf[i][j], NULL);
231
1.82M
      }
232
304k
    }
233
234
608k
    for (i = 0; i < COMP_REF_TYPE_CONTEXTS; ++i) {
235
507k
      av1_cost_tokens_from_cdf(mode_costs->comp_ref_type_cost[i],
236
507k
                               fc->comp_ref_type_cdf[i], NULL);
237
507k
    }
238
239
405k
    for (i = 0; i < UNI_COMP_REF_CONTEXTS; ++i) {
240
1.21M
      for (j = 0; j < UNIDIR_COMP_REFS - 1; ++j) {
241
912k
        av1_cost_tokens_from_cdf(mode_costs->uni_comp_ref_cost[i][j],
242
912k
                                 fc->uni_comp_ref_cdf[i][j], NULL);
243
912k
      }
244
304k
    }
245
246
405k
    for (i = 0; i < REF_CONTEXTS; ++i) {
247
1.21M
      for (j = 0; j < FWD_REFS - 1; ++j) {
248
912k
        av1_cost_tokens_from_cdf(mode_costs->comp_ref_cost[i][j],
249
912k
                                 fc->comp_ref_cdf[i][j], NULL);
250
912k
      }
251
304k
    }
252
253
405k
    for (i = 0; i < REF_CONTEXTS; ++i) {
254
912k
      for (j = 0; j < BWD_REFS - 1; ++j) {
255
608k
        av1_cost_tokens_from_cdf(mode_costs->comp_bwdref_cost[i][j],
256
608k
                                 fc->comp_bwdref_cdf[i][j], NULL);
257
608k
      }
258
304k
    }
259
260
507k
    for (i = 0; i < INTRA_INTER_CONTEXTS; ++i) {
261
405k
      av1_cost_tokens_from_cdf(mode_costs->intra_inter_cost[i],
262
405k
                               fc->intra_inter_cdf[i], NULL);
263
405k
    }
264
265
709k
    for (i = 0; i < NEWMV_MODE_CONTEXTS; ++i) {
266
608k
      av1_cost_tokens_from_cdf(mode_costs->newmv_mode_cost[i], fc->newmv_cdf[i],
267
608k
                               NULL);
268
608k
    }
269
270
304k
    for (i = 0; i < GLOBALMV_MODE_CONTEXTS; ++i) {
271
202k
      av1_cost_tokens_from_cdf(mode_costs->zeromv_mode_cost[i],
272
202k
                               fc->zeromv_cdf[i], NULL);
273
202k
    }
274
275
709k
    for (i = 0; i < REFMV_MODE_CONTEXTS; ++i) {
276
608k
      av1_cost_tokens_from_cdf(mode_costs->refmv_mode_cost[i], fc->refmv_cdf[i],
277
608k
                               NULL);
278
608k
    }
279
280
405k
    for (i = 0; i < DRL_MODE_CONTEXTS; ++i) {
281
304k
      av1_cost_tokens_from_cdf(mode_costs->drl_mode_cost0[i], fc->drl_cdf[i],
282
304k
                               NULL);
283
304k
    }
284
912k
    for (i = 0; i < INTER_MODE_CONTEXTS; ++i)
285
811k
      av1_cost_tokens_from_cdf(mode_costs->inter_compound_mode_cost[i],
286
811k
                               fc->inter_compound_mode_cdf[i], NULL);
287
2.33M
    for (i = 0; i < BLOCK_SIZES_ALL; ++i)
288
2.22M
      av1_cost_tokens_from_cdf(mode_costs->compound_type_cost[i],
289
2.22M
                               fc->compound_type_cdf[i], NULL);
290
2.32M
    for (i = 0; i < BLOCK_SIZES_ALL; ++i) {
291
2.22M
      if (av1_is_wedge_used(i)) {
292
911k
        av1_cost_tokens_from_cdf(mode_costs->wedge_idx_cost[i],
293
911k
                                 fc->wedge_idx_cdf[i], NULL);
294
911k
      }
295
2.22M
    }
296
507k
    for (i = 0; i < BLOCK_SIZE_GROUPS; ++i) {
297
405k
      av1_cost_tokens_from_cdf(mode_costs->interintra_cost[i],
298
405k
                               fc->interintra_cdf[i], NULL);
299
405k
      av1_cost_tokens_from_cdf(mode_costs->interintra_mode_cost[i],
300
405k
                               fc->interintra_mode_cdf[i], NULL);
301
405k
    }
302
2.32M
    for (i = 0; i < BLOCK_SIZES_ALL; ++i) {
303
2.22M
      av1_cost_tokens_from_cdf(mode_costs->wedge_interintra_cost[i],
304
2.22M
                               fc->wedge_interintra_cdf[i], NULL);
305
2.22M
    }
306
2.02M
    for (i = BLOCK_8X8; i < BLOCK_SIZES_ALL; i++) {
307
1.92M
      av1_cost_tokens_from_cdf(mode_costs->motion_mode_cost[i],
308
1.92M
                               fc->motion_mode_cdf[i], NULL);
309
1.92M
    }
310
2.02M
    for (i = BLOCK_8X8; i < BLOCK_SIZES_ALL; i++) {
311
1.92M
      av1_cost_tokens_from_cdf(mode_costs->motion_mode_cost1[i],
312
1.92M
                               fc->obmc_cdf[i], NULL);
313
1.92M
    }
314
709k
    for (i = 0; i < COMP_INDEX_CONTEXTS; ++i) {
315
608k
      av1_cost_tokens_from_cdf(mode_costs->comp_idx_cost[i],
316
608k
                               fc->compound_index_cdf[i], NULL);
317
608k
    }
318
709k
    for (i = 0; i < COMP_GROUP_IDX_CONTEXTS; ++i) {
319
608k
      av1_cost_tokens_from_cdf(mode_costs->comp_group_idx_cost[i],
320
608k
                               fc->comp_group_idx_cdf[i], NULL);
321
608k
    }
322
101k
  }
323
579k
}
324
325
#if !CONFIG_REALTIME_ONLY
326
12.3k
void av1_fill_lr_rates(ModeCosts *mode_costs, FRAME_CONTEXT *fc) {
327
12.3k
  av1_cost_tokens_from_cdf(mode_costs->switchable_restore_cost,
328
12.3k
                           fc->switchable_restore_cdf, NULL);
329
12.3k
  av1_cost_tokens_from_cdf(mode_costs->wiener_restore_cost,
330
12.3k
                           fc->wiener_restore_cdf, NULL);
331
12.3k
  av1_cost_tokens_from_cdf(mode_costs->sgrproj_restore_cost,
332
12.3k
                           fc->sgrproj_restore_cdf, NULL);
333
12.3k
}
334
#endif  // !CONFIG_REALTIME_ONLY
335
336
// Values are now correlated to quantizer.
337
static int sad_per_bit_lut_8[QINDEX_RANGE];
338
static int sad_per_bit_lut_10[QINDEX_RANGE];
339
static int sad_per_bit_lut_12[QINDEX_RANGE];
340
341
static void init_me_luts_bd(int *bit16lut, int range,
342
12
                            aom_bit_depth_t bit_depth) {
343
12
  int i;
344
  // Initialize the sad lut tables using a formulaic calculation for now.
345
  // This is to make it easier to resolve the impact of experimental changes
346
  // to the quantizer tables.
347
3.08k
  for (i = 0; i < range; i++) {
348
3.07k
    const double q = av1_convert_qindex_to_q(i, bit_depth);
349
3.07k
    bit16lut[i] = (int)(0.0418 * q + 2.4107);
350
3.07k
  }
351
12
}
352
353
4
static void init_me_luts(void) {
354
4
  init_me_luts_bd(sad_per_bit_lut_8, QINDEX_RANGE, AOM_BITS_8);
355
4
  init_me_luts_bd(sad_per_bit_lut_10, QINDEX_RANGE, AOM_BITS_10);
356
4
  init_me_luts_bd(sad_per_bit_lut_12, QINDEX_RANGE, AOM_BITS_12);
357
4
}
358
359
91.2k
void av1_init_me_luts(void) { aom_once(init_me_luts); }
360
361
static const int rd_boost_factor[16] = { 64, 32, 32, 32, 24, 16, 12, 12,
362
                                         8,  8,  4,  4,  2,  2,  1,  0 };
363
364
static const int rd_layer_depth_factor[7] = {
365
  160, 160, 160, 160, 192, 208, 224
366
};
367
368
// Returns the default rd multiplier for inter frames for a given qindex.
369
// The function here is a first pass estimate based on data from
370
// a previous Vizer run
371
52.7k
static double def_inter_rd_multiplier(int qindex) {
372
52.7k
  return 3.2 + (0.0015 * (double)qindex);
373
52.7k
}
374
375
// Returns the default rd multiplier for ARF/Golden Frames for a given qindex.
376
// The function here is a first pass estimate based on data from
377
// a previous Vizer run
378
84.6k
static double def_arf_rd_multiplier(int qindex) {
379
84.6k
  return 3.25 + (0.0015 * (double)qindex);
380
84.6k
}
381
382
// Returns the default rd multiplier for key frames for a given qindex.
383
// The function here is a first pass estimate based on data from
384
// a previous Vizer run
385
34.5M
static double def_kf_rd_multiplier(int qindex) {
386
34.5M
  return 3.3 + (0.0015 * (double)qindex);
387
34.5M
}
388
389
int av1_compute_rd_mult_based_on_qindex(aom_bit_depth_t bit_depth,
390
                                        FRAME_UPDATE_TYPE update_type,
391
                                        int qindex, aom_tune_metric tuning,
392
34.7M
                                        MODE mode) {
393
34.7M
  const int q = av1_dc_quant_QTX(qindex, 0, bit_depth);
394
34.7M
  int64_t rdmult = q * q;
395
34.7M
  if (update_type == KF_UPDATE) {
396
34.5M
    double def_rd_q_mult = def_kf_rd_multiplier(q);
397
34.5M
    rdmult = (int64_t)((double)rdmult * def_rd_q_mult);
398
34.5M
  } else if ((update_type == GF_UPDATE) || (update_type == ARF_UPDATE)) {
399
84.6k
    double def_rd_q_mult = def_arf_rd_multiplier(q);
400
84.6k
    rdmult = (int64_t)((double)rdmult * def_rd_q_mult);
401
84.6k
  } else {
402
49.5k
    double def_rd_q_mult = def_inter_rd_multiplier(q);
403
49.5k
    rdmult = (int64_t)((double)rdmult * def_rd_q_mult);
404
49.5k
  }
405
406
34.7M
  if (tuning == AOM_TUNE_IQ || tuning == AOM_TUNE_SSIMULACRA2) {
407
34.2M
    int weight;
408
409
    // Weight terms were determined by iteratively testing various weights
410
    // on CID22 and Daala's subset1, and observing its effects on visual
411
    // quality and SSIMULACRA 2 scores along the usable (0-100) range.
412
34.2M
    if (mode == REALTIME) {
413
      // Realtime mode: further multiply rdmult by a fourth (32/128 = 0.25)
414
      // to improve image quality.
415
      // The most noticeable effect is that for inter frames, there's a
416
      // stronger bias towards choosing inter prediction modes with encoded
417
      // coefficient residuals (i.e. no skip mode).
418
0
      weight = 32;
419
34.2M
    } else {
420
      // All-intra and good-quality modes: Further multiply rdmult (by up to
421
      // 200/128 = 1.5625) to improve image quality.
422
      // The most noticeable effect is a mild bias towards choosing larger
423
      // transform sizes (e.g. one 16x16 transform instead of 4 8x8 transforms).
424
      // For very high qindexes, start progressively reducing the weight towards
425
      // unity (128/128), as transforms are large enough and making them even
426
      // larger actually harms subjective quality and SSIMULACRA 2 scores.
427
      // The ramp-down part of the equation was determined by choosing a fixed
428
      // initial qindex point [qindex 159 = (255 - 159) * 3 / 4] where
429
      // SSIMULACRA 2 scores for encodes with qindexes greater than 159 scored
430
      // at or above their equivalents with no rdmult adjustment.
431
34.2M
      weight = clamp(((255 - qindex) * 3) / 4, 0, 72) + 128;
432
34.2M
    }
433
34.2M
    rdmult = (int64_t)((double)rdmult * weight / 128.0);
434
34.2M
  }
435
436
34.7M
  switch (bit_depth) {
437
25.8M
    case AOM_BITS_8: break;
438
3.81M
    case AOM_BITS_10: rdmult = ROUND_POWER_OF_TWO(rdmult, 4); break;
439
5.07M
    case AOM_BITS_12: rdmult = ROUND_POWER_OF_TWO(rdmult, 8); break;
440
0
    default:
441
0
      assert(0 && "bit_depth should be AOM_BITS_8, AOM_BITS_10 or AOM_BITS_12");
442
0
      return -1;
443
34.7M
  }
444
34.7M
  return rdmult > 0 ? (int)AOMMIN(rdmult, INT_MAX) : 1;
445
34.7M
}
446
447
int av1_compute_rd_mult(const int qindex, const aom_bit_depth_t bit_depth,
448
                        const FRAME_UPDATE_TYPE update_type,
449
                        const int layer_depth, const int boost_index,
450
                        const FRAME_TYPE frame_type,
451
                        const int use_fixed_qp_offsets,
452
                        const int is_stat_consumption_stage,
453
34.7M
                        const aom_tune_metric tuning, const MODE mode) {
454
34.7M
  int64_t rdmult = av1_compute_rd_mult_based_on_qindex(bit_depth, update_type,
455
34.7M
                                                       qindex, tuning, mode);
456
34.7M
  if (is_stat_consumption_stage && (use_fixed_qp_offsets == 0) &&
457
325k
      (frame_type != KEY_FRAME)) {
458
    // Layer depth adjustment
459
130k
    rdmult = (rdmult * rd_layer_depth_factor[layer_depth]) >> 7;
460
    // ARF boost adjustment
461
130k
    rdmult += ((rdmult * rd_boost_factor[boost_index]) >> 7);
462
130k
  }
463
34.7M
  return rdmult > 0 ? (int)AOMMIN(rdmult, INT_MAX) : 1;
464
34.7M
}
465
466
32.6k
int av1_get_deltaq_offset(aom_bit_depth_t bit_depth, int qindex, double beta) {
467
32.6k
  assert(beta > 0.0);
468
32.6k
  int q = av1_dc_quant_QTX(qindex, 0, bit_depth);
469
32.6k
  int newq = (int)rint(q / sqrt(beta));
470
32.6k
  int orig_qindex = qindex;
471
32.6k
  if (newq == q) {
472
24.5k
    return 0;
473
24.5k
  }
474
8.07k
  if (newq < q) {
475
9.65k
    while (qindex > 0) {
476
9.65k
      qindex--;
477
9.65k
      q = av1_dc_quant_QTX(qindex, 0, bit_depth);
478
9.65k
      if (newq >= q) {
479
3.77k
        break;
480
3.77k
      }
481
9.65k
    }
482
4.30k
  } else {
483
7.38k
    while (qindex < MAXQ) {
484
6.64k
      qindex++;
485
6.64k
      q = av1_dc_quant_QTX(qindex, 0, bit_depth);
486
6.64k
      if (newq <= q) {
487
3.55k
        break;
488
3.55k
      }
489
6.64k
    }
490
4.30k
  }
491
8.07k
  return qindex - orig_qindex;
492
32.6k
}
493
494
int av1_adjust_q_from_delta_q_res(int delta_q_res, int prev_qindex,
495
253k
                                  int curr_qindex) {
496
253k
  curr_qindex = clamp(curr_qindex, delta_q_res, 256 - delta_q_res);
497
253k
  const int sign_deltaq_index = curr_qindex - prev_qindex >= 0 ? 1 : -1;
498
253k
  const int deltaq_deadzone = delta_q_res / 4;
499
253k
  const int qmask = ~(delta_q_res - 1);
500
253k
  int abs_deltaq_index = abs(curr_qindex - prev_qindex);
501
253k
  abs_deltaq_index = (abs_deltaq_index + deltaq_deadzone) & qmask;
502
253k
  int adjust_qindex = prev_qindex + sign_deltaq_index * abs_deltaq_index;
503
253k
  adjust_qindex = AOMMAX(adjust_qindex, MINQ + 1);
504
253k
  return adjust_qindex;
505
253k
}
506
507
#if !CONFIG_REALTIME_ONLY
508
0
int av1_get_adaptive_rdmult(const AV1_COMP *cpi, double beta) {
509
0
  assert(beta > 0.0);
510
0
  const AV1_COMMON *cm = &cpi->common;
511
512
0
  const GF_GROUP *const gf_group = &cpi->ppi->gf_group;
513
0
  const int boost_index = AOMMIN(15, (cpi->ppi->p_rc.gfu_boost / 100));
514
0
  const int layer_depth = AOMMIN(gf_group->layer_depth[cpi->gf_frame_index], 6);
515
0
  const FRAME_TYPE frame_type = cm->current_frame.frame_type;
516
517
0
  const int qindex_rdmult = cm->quant_params.base_qindex;
518
0
  return (int)(av1_compute_rd_mult(
519
0
                   qindex_rdmult, cm->seq_params->bit_depth,
520
0
                   cpi->ppi->gf_group.update_type[cpi->gf_frame_index],
521
0
                   layer_depth, boost_index, frame_type,
522
0
                   cpi->oxcf.q_cfg.use_fixed_qp_offsets,
523
0
                   is_stat_consumption_stage(cpi), cpi->oxcf.tune_cfg.tuning,
524
0
                   cpi->oxcf.mode) /
525
0
               beta);
526
0
}
527
#endif  // !CONFIG_REALTIME_ONLY
528
529
1.21M
static int compute_rd_thresh_factor(int qindex, aom_bit_depth_t bit_depth) {
530
1.21M
  double q;
531
1.21M
  switch (bit_depth) {
532
857k
    case AOM_BITS_8: q = av1_dc_quant_QTX(qindex, 0, AOM_BITS_8) / 4.0; break;
533
169k
    case AOM_BITS_10:
534
169k
      q = av1_dc_quant_QTX(qindex, 0, AOM_BITS_10) / 16.0;
535
169k
      break;
536
187k
    case AOM_BITS_12:
537
187k
      q = av1_dc_quant_QTX(qindex, 0, AOM_BITS_12) / 64.0;
538
187k
      break;
539
0
    default:
540
0
      assert(0 && "bit_depth should be AOM_BITS_8, AOM_BITS_10 or AOM_BITS_12");
541
0
      return -1;
542
1.21M
  }
543
  // TODO(debargha): Adjust the function below.
544
1.21M
  return AOMMAX((int)(pow(q, RD_THRESH_POW) * 5.12), 8);
545
1.21M
}
546
547
575k
void av1_set_sad_per_bit(const AV1_COMP *cpi, int *sadperbit, int qindex) {
548
575k
  switch (cpi->common.seq_params->bit_depth) {
549
429k
    case AOM_BITS_8: *sadperbit = sad_per_bit_lut_8[qindex]; break;
550
67.5k
    case AOM_BITS_10: *sadperbit = sad_per_bit_lut_10[qindex]; break;
551
78.3k
    case AOM_BITS_12: *sadperbit = sad_per_bit_lut_12[qindex]; break;
552
0
    default:
553
0
      assert(0 && "bit_depth should be AOM_BITS_8, AOM_BITS_10 or AOM_BITS_12");
554
575k
  }
555
575k
}
556
557
static void set_block_thresholds(const AV1_COMMON *cm, RD_OPT *rd,
558
151k
                                 int use_nonrd_pick_mode) {
559
151k
  int i, bsize, segment_id;
560
151k
  THR_MODES mode_indices[RTC_REFS * RTC_MODES] = { 0 };
561
151k
  int num_modes_count = use_nonrd_pick_mode ? 0 : MAX_MODES;
562
563
151k
  if (use_nonrd_pick_mode) {
564
207k
    for (int r_idx = 0; r_idx < RTC_REFS; r_idx++) {
565
165k
      const MV_REFERENCE_FRAME ref = real_time_ref_combos[r_idx][0];
566
165k
      if (ref != INTRA_FRAME) {
567
622k
        for (i = 0; i < RTC_INTER_MODES; i++)
568
497k
          mode_indices[num_modes_count++] =
569
497k
              mode_idx[ref][mode_offset(inter_mode_list[i])];
570
124k
      } else {
571
207k
        for (i = 0; i < RTC_INTRA_MODES; i++)
572
165k
          mode_indices[num_modes_count++] =
573
165k
              mode_idx[ref][mode_offset(intra_mode_list[i])];
574
41.4k
      }
575
165k
    }
576
41.4k
  }
577
578
1.36M
  for (segment_id = 0; segment_id < MAX_SEGMENTS; ++segment_id) {
579
1.21M
    const int qindex = clamp(
580
1.21M
        av1_get_qindex(&cm->seg, segment_id, cm->quant_params.base_qindex) +
581
1.21M
            cm->quant_params.y_dc_delta_q,
582
1.21M
        0, MAXQ);
583
1.21M
    const int q = compute_rd_thresh_factor(qindex, cm->seq_params->bit_depth);
584
585
27.9M
    for (bsize = 0; bsize < BLOCK_SIZES_ALL; ++bsize) {
586
      // Threshold here seems unnecessarily harsh but fine given actual
587
      // range of values used for cpi->sf.thresh_mult[].
588
26.7M
      const int t = q * rd_thresh_block_size_factor[bsize];
589
26.7M
      const int thresh_max = INT_MAX / t;
590
591
3.42G
      for (i = 0; i < num_modes_count; ++i) {
592
3.39G
        const int mode_index = use_nonrd_pick_mode ? mode_indices[i] : i;
593
3.39G
        rd->threshes[segment_id][bsize][mode_index] =
594
3.39G
            rd->thresh_mult[mode_index] < thresh_max
595
3.39G
                ? rd->thresh_mult[mode_index] * t / 4
596
3.39G
                : INT_MAX;
597
3.39G
      }
598
26.7M
    }
599
1.21M
  }
600
151k
}
601
602
void av1_fill_coeff_costs(CoeffCosts *coeff_costs, FRAME_CONTEXT *fc,
603
577k
                          const int num_planes) {
604
577k
  const int nplanes = AOMMIN(num_planes, PLANE_TYPES);
605
4.61M
  for (int eob_multi_size = 0; eob_multi_size < 7; ++eob_multi_size) {
606
9.65M
    for (int plane = 0; plane < nplanes; ++plane) {
607
5.61M
      LV_MAP_EOB_COST *pcost = &coeff_costs->eob_costs[eob_multi_size][plane];
608
609
16.8M
      for (int ctx = 0; ctx < 2; ++ctx) {
610
11.1M
        aom_cdf_prob *pcdf;
611
11.1M
        switch (eob_multi_size) {
612
1.60M
          case 0: pcdf = fc->eob_flag_cdf16[plane][ctx]; break;
613
1.60M
          case 1: pcdf = fc->eob_flag_cdf32[plane][ctx]; break;
614
1.60M
          case 2: pcdf = fc->eob_flag_cdf64[plane][ctx]; break;
615
1.60M
          case 3: pcdf = fc->eob_flag_cdf128[plane][ctx]; break;
616
1.60M
          case 4: pcdf = fc->eob_flag_cdf256[plane][ctx]; break;
617
1.60M
          case 5: pcdf = fc->eob_flag_cdf512[plane][ctx]; break;
618
1.60M
          case 6:
619
1.60M
          default: pcdf = fc->eob_flag_cdf1024[plane][ctx]; break;
620
11.1M
        }
621
11.1M
        av1_cost_tokens_from_cdf(pcost->eob_cost[ctx], pcdf, NULL);
622
11.1M
      }
623
5.61M
    }
624
4.03M
  }
625
3.47M
  for (int tx_size = 0; tx_size < TX_SIZES; ++tx_size) {
626
6.91M
    for (int plane = 0; plane < nplanes; ++plane) {
627
4.02M
      LV_MAP_COEFF_COST *pcost = &coeff_costs->coeff_costs[tx_size][plane];
628
629
56.1M
      for (int ctx = 0; ctx < TXB_SKIP_CONTEXTS; ++ctx)
630
52.0M
        av1_cost_tokens_from_cdf(pcost->txb_skip_cost[ctx],
631
52.0M
                                 fc->txb_skip_cdf[tx_size][ctx], NULL);
632
633
20.1M
      for (int ctx = 0; ctx < SIG_COEF_CONTEXTS_EOB; ++ctx)
634
16.0M
        av1_cost_tokens_from_cdf(pcost->base_eob_cost[ctx],
635
16.0M
                                 fc->coeff_base_eob_cdf[tx_size][plane][ctx],
636
16.0M
                                 NULL);
637
171M
      for (int ctx = 0; ctx < SIG_COEF_CONTEXTS; ++ctx)
638
167M
        av1_cost_tokens_from_cdf(pcost->base_cost[ctx],
639
167M
                                 fc->coeff_base_cdf[tx_size][plane][ctx], NULL);
640
641
172M
      for (int ctx = 0; ctx < SIG_COEF_CONTEXTS; ++ctx) {
642
168M
        pcost->base_cost[ctx][4] = 0;
643
168M
        pcost->base_cost[ctx][5] = pcost->base_cost[ctx][1] +
644
168M
                                   av1_cost_literal(1) -
645
168M
                                   pcost->base_cost[ctx][0];
646
168M
        pcost->base_cost[ctx][6] =
647
168M
            pcost->base_cost[ctx][2] - pcost->base_cost[ctx][1];
648
168M
        pcost->base_cost[ctx][7] =
649
168M
            pcost->base_cost[ctx][3] - pcost->base_cost[ctx][2];
650
168M
      }
651
652
40.1M
      for (int ctx = 0; ctx < EOB_COEF_CONTEXTS; ++ctx)
653
36.1M
        av1_cost_tokens_from_cdf(pcost->eob_extra_cost[ctx],
654
36.1M
                                 fc->eob_extra_cdf[tx_size][plane][ctx], NULL);
655
656
16.0M
      for (int ctx = 0; ctx < DC_SIGN_CONTEXTS; ++ctx)
657
12.0M
        av1_cost_tokens_from_cdf(pcost->dc_sign_cost[ctx],
658
12.0M
                                 fc->dc_sign_cdf[plane][ctx], NULL);
659
660
88.2M
      for (int ctx = 0; ctx < LEVEL_CONTEXTS; ++ctx) {
661
84.2M
        int br_rate[BR_CDF_SIZE];
662
84.2M
        int prev_cost = 0;
663
84.2M
        int i, j;
664
84.2M
        av1_cost_tokens_from_cdf(
665
84.2M
            br_rate, fc->coeff_br_cdf[AOMMIN(tx_size, TX_32X32)][plane][ctx],
666
84.2M
            NULL);
667
413M
        for (i = 0; i < COEFF_BASE_RANGE; i += BR_CDF_SIZE - 1) {
668
1.31G
          for (j = 0; j < BR_CDF_SIZE - 1; j++) {
669
984M
            pcost->lps_cost[ctx][i + j] = prev_cost + br_rate[j];
670
984M
          }
671
329M
          prev_cost += br_rate[j];
672
329M
        }
673
84.2M
        pcost->lps_cost[ctx][i] = prev_cost;
674
84.2M
      }
675
88.2M
      for (int ctx = 0; ctx < LEVEL_CONTEXTS; ++ctx) {
676
84.2M
        pcost->lps_cost[ctx][0 + COEFF_BASE_RANGE + 1] =
677
84.2M
            pcost->lps_cost[ctx][0];
678
1.09G
        for (int i = 1; i <= COEFF_BASE_RANGE; ++i) {
679
1.00G
          pcost->lps_cost[ctx][i + COEFF_BASE_RANGE + 1] =
680
1.00G
              pcost->lps_cost[ctx][i] - pcost->lps_cost[ctx][i - 1];
681
1.00G
        }
682
84.2M
      }
683
4.02M
    }
684
2.88M
  }
685
582k
}
686
687
void av1_fill_mv_costs(const nmv_context *nmvc, int integer_mv, int usehp,
688
218k
                       MvCosts *mv_costs) {
689
  // Avoid accessing 'mv_costs' when it is not allocated.
690
218k
  if (mv_costs == NULL) return;
691
692
148k
  mv_costs->nmv_cost[0] = &mv_costs->nmv_cost_alloc[0][MV_MAX];
693
148k
  mv_costs->nmv_cost[1] = &mv_costs->nmv_cost_alloc[1][MV_MAX];
694
148k
  mv_costs->nmv_cost_hp[0] = &mv_costs->nmv_cost_hp_alloc[0][MV_MAX];
695
148k
  mv_costs->nmv_cost_hp[1] = &mv_costs->nmv_cost_hp_alloc[1][MV_MAX];
696
148k
  if (integer_mv) {
697
0
    mv_costs->mv_cost_stack = (int **)&mv_costs->nmv_cost;
698
0
    av1_build_nmv_cost_table(mv_costs->nmv_joint_cost, mv_costs->mv_cost_stack,
699
0
                             nmvc, MV_SUBPEL_NONE);
700
148k
  } else {
701
148k
    mv_costs->mv_cost_stack =
702
148k
        usehp ? mv_costs->nmv_cost_hp : mv_costs->nmv_cost;
703
148k
    av1_build_nmv_cost_table(mv_costs->nmv_joint_cost, mv_costs->mv_cost_stack,
704
148k
                             nmvc, usehp);
705
148k
  }
706
148k
}
707
708
6.06k
void av1_fill_dv_costs(const nmv_context *ndvc, IntraBCMVCosts *dv_costs) {
709
6.06k
  dv_costs->dv_costs[0] = &dv_costs->dv_costs_alloc[0][MV_MAX];
710
6.06k
  dv_costs->dv_costs[1] = &dv_costs->dv_costs_alloc[1][MV_MAX];
711
6.06k
  av1_build_nmv_cost_table(dv_costs->joint_mv, dv_costs->dv_costs, ndvc,
712
6.06k
                           MV_SUBPEL_NONE);
713
6.06k
}
714
715
// Populates speed features based on codec control settings (of type
716
// COST_UPDATE_TYPE) and expected speed feature settings (of type
717
// INTERNAL_COST_UPDATE_TYPE) by considering the least frequent cost update.
718
// The populated/updated speed features are used for cost updates in the
719
// encoder.
720
// WARNING: Population of unified cost update frequency needs to be taken care
721
// accordingly, in case of any modifications/additions to the enum
722
// COST_UPDATE_TYPE/INTERNAL_COST_UPDATE_TYPE.
723
static inline void populate_unified_cost_update_freq(
724
151k
    const CostUpdateFreq cost_upd_freq, SPEED_FEATURES *const sf) {
725
151k
  INTER_MODE_SPEED_FEATURES *const inter_sf = &sf->inter_sf;
726
  // Mapping of entropy cost update frequency from the encoder's codec control
727
  // settings of type COST_UPDATE_TYPE to speed features of type
728
  // INTERNAL_COST_UPDATE_TYPE.
729
151k
  static const INTERNAL_COST_UPDATE_TYPE
730
151k
      map_cost_upd_to_internal_cost_upd[NUM_COST_UPDATE_TYPES] = {
731
151k
        INTERNAL_COST_UPD_SB, INTERNAL_COST_UPD_SBROW, INTERNAL_COST_UPD_TILE,
732
151k
        INTERNAL_COST_UPD_OFF
733
151k
      };
734
735
151k
  inter_sf->mv_cost_upd_level =
736
151k
      AOMMIN(inter_sf->mv_cost_upd_level,
737
151k
             map_cost_upd_to_internal_cost_upd[cost_upd_freq.mv]);
738
151k
  inter_sf->coeff_cost_upd_level =
739
151k
      AOMMIN(inter_sf->coeff_cost_upd_level,
740
151k
             map_cost_upd_to_internal_cost_upd[cost_upd_freq.coeff]);
741
151k
  inter_sf->mode_cost_upd_level =
742
151k
      AOMMIN(inter_sf->mode_cost_upd_level,
743
151k
             map_cost_upd_to_internal_cost_upd[cost_upd_freq.mode]);
744
151k
  sf->intra_sf.dv_cost_upd_level =
745
151k
      AOMMIN(sf->intra_sf.dv_cost_upd_level,
746
151k
             map_cost_upd_to_internal_cost_upd[cost_upd_freq.dv]);
747
151k
}
748
749
// Checks if entropy costs should be initialized/updated at frame level or not.
750
static inline int is_frame_level_cost_upd_freq_set(
751
    const AV1_COMMON *const cm, const INTERNAL_COST_UPDATE_TYPE cost_upd_level,
752
446k
    const int use_nonrd_pick_mode, const int frames_since_key) {
753
446k
  const int fill_costs =
754
446k
      frame_is_intra_only(cm) ||
755
112k
      (use_nonrd_pick_mode ? frames_since_key < 2
756
112k
                           : (cm->current_frame.frame_number & 0x07) == 1);
757
446k
  return ((!use_nonrd_pick_mode && cost_upd_level != INTERNAL_COST_UPD_OFF) ||
758
166k
          cost_upd_level == INTERNAL_COST_UPD_TILE || fill_costs);
759
446k
}
760
761
// Decide whether we want to update the mode entropy cost for the current frame.
762
// The logit is currently inherited from selective_disable_cdf_rtc.
763
151k
static inline int should_force_mode_cost_update(const AV1_COMP *cpi) {
764
151k
  const REAL_TIME_SPEED_FEATURES *const rt_sf = &cpi->sf.rt_sf;
765
151k
  if (!rt_sf->frame_level_mode_cost_update) {
766
143k
    return false;
767
143k
  }
768
769
8.75k
  if (cpi->oxcf.algo_cfg.cdf_update_mode == 2) {
770
0
    return cpi->frames_since_last_update == 1;
771
8.75k
  } else if (cpi->oxcf.algo_cfg.cdf_update_mode == 1) {
772
8.75k
    if (cpi->svc.number_spatial_layers == 1 &&
773
8.75k
        cpi->svc.number_temporal_layers == 1) {
774
8.75k
      const AV1_COMMON *const cm = &cpi->common;
775
8.75k
      const RATE_CONTROL *const rc = &cpi->rc;
776
777
8.75k
      return frame_is_intra_only(cm) || is_frame_resize_pending(cpi) ||
778
4.03k
             rc->high_source_sad || rc->frames_since_key < 10 ||
779
0
             cpi->cyclic_refresh->counter_encode_maxq_scene_change < 10 ||
780
0
             cm->current_frame.frame_number % 8 == 0;
781
8.75k
    } else if (cpi->svc.number_temporal_layers > 1) {
782
0
      return cpi->svc.temporal_layer_id != cpi->svc.number_temporal_layers - 1;
783
0
    }
784
8.75k
  }
785
786
0
  return false;
787
8.75k
}
788
789
151k
void av1_initialize_rd_consts(AV1_COMP *cpi) {
790
151k
  AV1_COMMON *const cm = &cpi->common;
791
151k
  MACROBLOCK *const x = &cpi->td.mb;
792
151k
  SPEED_FEATURES *const sf = &cpi->sf;
793
151k
  RD_OPT *const rd = &cpi->rd;
794
151k
  int use_nonrd_pick_mode = cpi->sf.rt_sf.use_nonrd_pick_mode;
795
151k
  int frames_since_key = cpi->rc.frames_since_key;
796
797
151k
  const GF_GROUP *const gf_group = &cpi->ppi->gf_group;
798
151k
  const int boost_index = AOMMIN(15, (cpi->ppi->p_rc.gfu_boost / 100));
799
151k
  const int layer_depth = AOMMIN(gf_group->layer_depth[cpi->gf_frame_index], 6);
800
151k
  const FRAME_TYPE frame_type = cm->current_frame.frame_type;
801
802
151k
  const int qindex_rdmult =
803
151k
      cm->quant_params.base_qindex + cm->quant_params.y_dc_delta_q;
804
151k
  rd->RDMULT = av1_compute_rd_mult(
805
151k
      qindex_rdmult, cm->seq_params->bit_depth,
806
151k
      cpi->ppi->gf_group.update_type[cpi->gf_frame_index], layer_depth,
807
151k
      boost_index, frame_type, cpi->oxcf.q_cfg.use_fixed_qp_offsets,
808
151k
      is_stat_consumption_stage(cpi), cpi->oxcf.tune_cfg.tuning,
809
151k
      cpi->oxcf.mode);
810
#if CONFIG_RD_COMMAND
811
  if (cpi->oxcf.pass == 2) {
812
    const RD_COMMAND *rd_command = &cpi->rd_command;
813
    if (rd_command->option_ls[rd_command->frame_index] ==
814
        RD_OPTION_SET_Q_RDMULT) {
815
      rd->RDMULT = rd_command->rdmult_ls[rd_command->frame_index];
816
    }
817
  }
818
#endif  // CONFIG_RD_COMMAND
819
820
151k
  av1_set_error_per_bit(&x->errorperbit, rd->RDMULT);
821
822
151k
  set_block_thresholds(cm, rd, cpi->sf.rt_sf.use_nonrd_pick_mode);
823
824
151k
  populate_unified_cost_update_freq(cpi->oxcf.cost_upd_freq, sf);
825
151k
  const INTER_MODE_SPEED_FEATURES *const inter_sf = &cpi->sf.inter_sf;
826
  // Frame level mv cost update
827
151k
  if (is_frame_level_cost_upd_freq_set(cm, inter_sf->mv_cost_upd_level,
828
151k
                                       use_nonrd_pick_mode, frames_since_key))
829
147k
    av1_fill_mv_costs(&cm->fc->nmvc, cm->features.cur_frame_force_integer_mv,
830
147k
                      cm->features.allow_high_precision_mv, x->mv_costs);
831
832
  // Frame level coefficient cost update
833
151k
  if (is_frame_level_cost_upd_freq_set(cm, inter_sf->coeff_cost_upd_level,
834
151k
                                       use_nonrd_pick_mode, frames_since_key))
835
147k
    av1_fill_coeff_costs(&x->coeff_costs, cm->fc, av1_num_planes(cm));
836
837
  // Frame level mode cost update
838
151k
  if (should_force_mode_cost_update(cpi) ||
839
143k
      is_frame_level_cost_upd_freq_set(cm, inter_sf->mode_cost_upd_level,
840
143k
                                       use_nonrd_pick_mode, frames_since_key))
841
149k
    av1_fill_mode_rates(cm, &x->mode_costs, cm->fc);
842
843
  // Frame level dv cost update
844
151k
  if (av1_need_dv_costs(cpi)) {
845
6.06k
    if (cpi->td.dv_costs_alloc == NULL) {
846
6.06k
      CHECK_MEM_ERROR(
847
6.06k
          cm, cpi->td.dv_costs_alloc,
848
6.06k
          (IntraBCMVCosts *)aom_malloc(sizeof(*cpi->td.dv_costs_alloc)));
849
6.06k
      cpi->td.mb.dv_costs = cpi->td.dv_costs_alloc;
850
6.06k
    }
851
6.06k
    av1_fill_dv_costs(&cm->fc->ndvc, x->dv_costs);
852
6.06k
  }
853
151k
}
854
855
3.40M
static void model_rd_norm(int xsq_q10, int *r_q10, int *d_q10) {
856
  // NOTE: The tables below must be of the same size.
857
858
  // The functions described below are sampled at the four most significant
859
  // bits of x^2 + 8 / 256.
860
861
  // Normalized rate:
862
  // This table models the rate for a Laplacian source with given variance
863
  // when quantized with a uniform quantizer with given stepsize. The
864
  // closed form expression is:
865
  // Rn(x) = H(sqrt(r)) + sqrt(r)*[1 + H(r)/(1 - r)],
866
  // where r = exp(-sqrt(2) * x) and x = qpstep / sqrt(variance),
867
  // and H(x) is the binary entropy function.
868
3.40M
  static const int rate_tab_q10[] = {
869
3.40M
    65536, 6086, 5574, 5275, 5063, 4899, 4764, 4651, 4553, 4389, 4255, 4142,
870
3.40M
    4044,  3958, 3881, 3811, 3748, 3635, 3538, 3453, 3376, 3307, 3244, 3186,
871
3.40M
    3133,  3037, 2952, 2877, 2809, 2747, 2690, 2638, 2589, 2501, 2423, 2353,
872
3.40M
    2290,  2232, 2179, 2130, 2084, 2001, 1928, 1862, 1802, 1748, 1698, 1651,
873
3.40M
    1608,  1530, 1460, 1398, 1342, 1290, 1243, 1199, 1159, 1086, 1021, 963,
874
3.40M
    911,   864,  821,  781,  745,  680,  623,  574,  530,  490,  455,  424,
875
3.40M
    395,   345,  304,  269,  239,  213,  190,  171,  154,  126,  104,  87,
876
3.40M
    73,    61,   52,   44,   38,   28,   21,   16,   12,   10,   8,    6,
877
3.40M
    5,     3,    2,    1,    1,    1,    0,    0,
878
3.40M
  };
879
  // Normalized distortion:
880
  // This table models the normalized distortion for a Laplacian source
881
  // with given variance when quantized with a uniform quantizer
882
  // with given stepsize. The closed form expression is:
883
  // Dn(x) = 1 - 1/sqrt(2) * x / sinh(x/sqrt(2))
884
  // where x = qpstep / sqrt(variance).
885
  // Note the actual distortion is Dn * variance.
886
3.40M
  static const int dist_tab_q10[] = {
887
3.40M
    0,    0,    1,    1,    1,    2,    2,    2,    3,    3,    4,    5,
888
3.40M
    5,    6,    7,    7,    8,    9,    11,   12,   13,   15,   16,   17,
889
3.40M
    18,   21,   24,   26,   29,   31,   34,   36,   39,   44,   49,   54,
890
3.40M
    59,   64,   69,   73,   78,   88,   97,   106,  115,  124,  133,  142,
891
3.40M
    151,  167,  184,  200,  215,  231,  245,  260,  274,  301,  327,  351,
892
3.40M
    375,  397,  418,  439,  458,  495,  528,  559,  587,  613,  637,  659,
893
3.40M
    680,  717,  749,  777,  801,  823,  842,  859,  874,  899,  919,  936,
894
3.40M
    949,  960,  969,  977,  983,  994,  1001, 1006, 1010, 1013, 1015, 1017,
895
3.40M
    1018, 1020, 1022, 1022, 1023, 1023, 1023, 1024,
896
3.40M
  };
897
3.40M
  static const int xsq_iq_q10[] = {
898
3.40M
    0,      4,      8,      12,     16,     20,     24,     28,     32,
899
3.40M
    40,     48,     56,     64,     72,     80,     88,     96,     112,
900
3.40M
    128,    144,    160,    176,    192,    208,    224,    256,    288,
901
3.40M
    320,    352,    384,    416,    448,    480,    544,    608,    672,
902
3.40M
    736,    800,    864,    928,    992,    1120,   1248,   1376,   1504,
903
3.40M
    1632,   1760,   1888,   2016,   2272,   2528,   2784,   3040,   3296,
904
3.40M
    3552,   3808,   4064,   4576,   5088,   5600,   6112,   6624,   7136,
905
3.40M
    7648,   8160,   9184,   10208,  11232,  12256,  13280,  14304,  15328,
906
3.40M
    16352,  18400,  20448,  22496,  24544,  26592,  28640,  30688,  32736,
907
3.40M
    36832,  40928,  45024,  49120,  53216,  57312,  61408,  65504,  73696,
908
3.40M
    81888,  90080,  98272,  106464, 114656, 122848, 131040, 147424, 163808,
909
3.40M
    180192, 196576, 212960, 229344, 245728,
910
3.40M
  };
911
3.40M
  const int tmp = (xsq_q10 >> 2) + 8;
912
3.40M
  const int k = get_msb(tmp) - 3;
913
3.40M
  const int xq = (k << 3) + ((tmp >> k) & 0x7);
914
3.40M
  const int one_q10 = 1 << 10;
915
3.40M
  const int a_q10 = ((xsq_q10 - xsq_iq_q10[xq]) << 10) >> (2 + k);
916
3.40M
  const int b_q10 = one_q10 - a_q10;
917
3.40M
  *r_q10 = (rate_tab_q10[xq] * b_q10 + rate_tab_q10[xq + 1] * a_q10) >> 10;
918
3.40M
  *d_q10 = (dist_tab_q10[xq] * b_q10 + dist_tab_q10[xq + 1] * a_q10) >> 10;
919
3.40M
}
920
921
void av1_model_rd_from_var_lapndz(int64_t var, unsigned int n_log2,
922
                                  unsigned int qstep, int *rate,
923
3.42M
                                  int64_t *dist) {
924
  // This function models the rate and distortion for a Laplacian
925
  // source with given variance when quantized with a uniform quantizer
926
  // with given stepsize. The closed form expressions are in:
927
  // Hang and Chen, "Source Model for transform video coder and its
928
  // application - Part I: Fundamental Theory", IEEE Trans. Circ.
929
  // Sys. for Video Tech., April 1997.
930
3.42M
  if (var == 0) {
931
16.6k
    *rate = 0;
932
16.6k
    *dist = 0;
933
3.40M
  } else {
934
3.40M
    int d_q10, r_q10;
935
3.40M
    static const uint32_t MAX_XSQ_Q10 = 245727;
936
3.40M
    const uint64_t xsq_q10_64 =
937
3.40M
        (((uint64_t)qstep * qstep << (n_log2 + 10)) + (var >> 1)) / var;
938
3.40M
    const int xsq_q10 = (int)AOMMIN(xsq_q10_64, MAX_XSQ_Q10);
939
3.40M
    model_rd_norm(xsq_q10, &r_q10, &d_q10);
940
3.40M
    *rate = ROUND_POWER_OF_TWO(r_q10 << n_log2, 10 - AV1_PROB_COST_SHIFT);
941
3.40M
    *dist = (var * (int64_t)d_q10 + 512) >> 10;
942
3.40M
  }
943
3.42M
}
944
945
6.97M
static double interp_cubic(const double *p, double x) {
946
6.97M
  return p[1] + 0.5 * x *
947
6.97M
                    (p[2] - p[0] +
948
6.97M
                     x * (2.0 * p[0] - 5.0 * p[1] + 4.0 * p[2] - p[3] +
949
6.97M
                          x * (3.0 * (p[1] - p[2]) + p[3] - p[0])));
950
6.97M
}
951
952
/*
953
static double interp_bicubic(const double *p, int p_stride, double x,
954
                             double y) {
955
  double q[4];
956
  q[0] = interp_cubic(p, x);
957
  q[1] = interp_cubic(p + p_stride, x);
958
  q[2] = interp_cubic(p + 2 * p_stride, x);
959
  q[3] = interp_cubic(p + 3 * p_stride, x);
960
  return interp_cubic(q, y);
961
}
962
*/
963
964
static const uint8_t bsize_curvfit_model_cat_lookup[BLOCK_SIZES_ALL] = {
965
  0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 1, 1, 2, 2, 3, 3
966
};
967
968
3.48M
static int sse_norm_curvfit_model_cat_lookup(double sse_norm) {
969
3.48M
  return (sse_norm > 16.0);
970
3.48M
}
971
972
static const double interp_rgrid_curv[4][65] = {
973
  {
974
      0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
975
      0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
976
      0.000000,    118.257702,  120.210658,  121.434853,  122.100487,
977
      122.377758,  122.436865,  72.290102,   96.974289,   101.652727,
978
      126.830141,  140.417377,  157.644879,  184.315291,  215.823873,
979
      262.300169,  335.919859,  420.624173,  519.185032,  619.854243,
980
      726.053595,  827.663369,  933.127475,  1037.988755, 1138.839609,
981
      1233.342933, 1333.508064, 1428.760126, 1533.396364, 1616.952052,
982
      1744.539319, 1803.413586, 1951.466618, 1994.227838, 2086.031680,
983
      2148.635443, 2239.068450, 2222.590637, 2338.859809, 2402.929011,
984
      2418.727875, 2435.342670, 2471.159469, 2523.187446, 2591.183827,
985
      2674.905840, 2774.110714, 2888.555675, 3017.997952, 3162.194773,
986
      3320.903365, 3493.880956, 3680.884773, 3881.672045, 4096.000000,
987
  },
988
  {
989
      0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
990
      0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
991
      0.000000,    13.087244,   15.919735,   25.930313,   24.412411,
992
      28.567417,   29.924194,   30.857010,   32.742979,   36.382570,
993
      39.210386,   42.265690,   47.378572,   57.014850,   82.740067,
994
      137.346562,  219.968084,  316.781856,  415.643773,  516.706538,
995
      614.914364,  714.303763,  815.512135,  911.210485,  1008.501528,
996
      1109.787854, 1213.772279, 1322.922561, 1414.752579, 1510.505641,
997
      1615.741888, 1697.989032, 1780.123933, 1847.453790, 1913.742309,
998
      1960.828122, 2047.500168, 2085.454095, 2129.230668, 2158.171824,
999
      2182.231724, 2217.684864, 2269.589211, 2337.264824, 2420.618694,
1000
      2519.557814, 2633.989178, 2763.819779, 2908.956609, 3069.306660,
1001
      3244.776927, 3435.274401, 3640.706076, 3860.978945, 4096.000000,
1002
  },
1003
  {
1004
      0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
1005
      0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
1006
      0.000000,    4.656893,    5.123633,    5.594132,    6.162376,
1007
      6.918433,    7.768444,    8.739415,    10.105862,   11.477328,
1008
      13.236604,   15.421030,   19.093623,   25.801871,   46.724612,
1009
      98.841054,   181.113466,  272.586364,  359.499769,  445.546343,
1010
      525.944439,  605.188743,  681.793483,  756.668359,  838.486885,
1011
      926.950356,  1015.482542, 1113.353926, 1204.897193, 1288.871992,
1012
      1373.464145, 1455.746628, 1527.796460, 1588.475066, 1658.144771,
1013
      1710.302500, 1807.563351, 1863.197608, 1927.281616, 1964.450872,
1014
      2022.719898, 2100.041145, 2185.205712, 2280.993936, 2387.616216,
1015
      2505.282950, 2634.204540, 2774.591385, 2926.653884, 3090.602436,
1016
      3266.647443, 3454.999303, 3655.868416, 3869.465182, 4096.000000,
1017
  },
1018
  {
1019
      0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
1020
      0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
1021
      0.000000,    0.337370,    0.391916,    0.468839,    0.566334,
1022
      0.762564,    1.069225,    1.384361,    1.787581,    2.293948,
1023
      3.251909,    4.412991,    8.050068,    11.606073,   27.668092,
1024
      65.227758,   128.463938,  202.097653,  262.715851,  312.464873,
1025
      355.601398,  400.609054,  447.201352,  495.761568,  552.871938,
1026
      619.067625,  691.984883,  773.753288,  860.628503,  946.262808,
1027
      1019.805896, 1106.061360, 1178.422145, 1244.852258, 1302.173987,
1028
      1399.650266, 1548.092912, 1545.928652, 1670.817500, 1694.523823,
1029
      1779.195362, 1882.155494, 1990.662097, 2108.325181, 2235.456119,
1030
      2372.366287, 2519.367059, 2676.769812, 2844.885918, 3024.026754,
1031
      3214.503695, 3416.628115, 3630.711389, 3857.064892, 4096.000000,
1032
  },
1033
};
1034
1035
static const double interp_dgrid_curv[3][65] = {
1036
  {
1037
      16.000000, 15.962891, 15.925174, 15.886888, 15.848074, 15.808770,
1038
      15.769015, 15.728850, 15.688313, 15.647445, 15.606284, 15.564870,
1039
      15.525918, 15.483820, 15.373330, 15.126844, 14.637442, 14.184387,
1040
      13.560070, 12.880717, 12.165995, 11.378144, 10.438769, 9.130790,
1041
      7.487633,  5.688649,  4.267515,  3.196300,  2.434201,  1.834064,
1042
      1.369920,  1.035921,  0.775279,  0.574895,  0.427232,  0.314123,
1043
      0.233236,  0.171440,  0.128188,  0.092762,  0.067569,  0.049324,
1044
      0.036330,  0.027008,  0.019853,  0.015539,  0.011093,  0.008733,
1045
      0.007624,  0.008105,  0.005427,  0.004065,  0.003427,  0.002848,
1046
      0.002328,  0.001865,  0.001457,  0.001103,  0.000801,  0.000550,
1047
      0.000348,  0.000193,  0.000085,  0.000021,  0.000000,
1048
  },
1049
  {
1050
      16.000000, 15.996116, 15.984769, 15.966413, 15.941505, 15.910501,
1051
      15.873856, 15.832026, 15.785466, 15.734633, 15.679981, 15.621967,
1052
      15.560961, 15.460157, 15.288367, 15.052462, 14.466922, 13.921212,
1053
      13.073692, 12.222005, 11.237799, 9.985848,  8.898823,  7.423519,
1054
      5.995325,  4.773152,  3.744032,  2.938217,  2.294526,  1.762412,
1055
      1.327145,  1.020728,  0.765535,  0.570548,  0.425833,  0.313825,
1056
      0.232959,  0.171324,  0.128174,  0.092750,  0.067558,  0.049319,
1057
      0.036330,  0.027008,  0.019853,  0.015539,  0.011093,  0.008733,
1058
      0.007624,  0.008105,  0.005427,  0.004065,  0.003427,  0.002848,
1059
      0.002328,  0.001865,  0.001457,  0.001103,  0.000801,  0.000550,
1060
      0.000348,  0.000193,  0.000085,  0.000021,  -0.000000,
1061
  },
1062
};
1063
1064
void av1_model_rd_curvfit(BLOCK_SIZE bsize, double sse_norm, double xqr,
1065
3.48M
                          double *rate_f, double *distbysse_f) {
1066
3.48M
  const double x_start = -15.5;
1067
3.48M
  const double x_end = 16.5;
1068
3.48M
  const double x_step = 0.5;
1069
3.48M
  const double epsilon = 1e-6;
1070
3.48M
  const int rcat = bsize_curvfit_model_cat_lookup[bsize];
1071
3.48M
  const int dcat = sse_norm_curvfit_model_cat_lookup(sse_norm);
1072
3.48M
  (void)x_end;
1073
1074
3.48M
  xqr = AOMMAX(xqr, x_start + x_step + epsilon);
1075
3.48M
  xqr = AOMMIN(xqr, x_end - x_step - epsilon);
1076
3.48M
  const double x = (xqr - x_start) / x_step;
1077
3.48M
  const int xi = (int)floor(x);
1078
3.48M
  const double xo = x - xi;
1079
1080
3.48M
  assert(xi > 0);
1081
1082
3.48M
  const double *prate = &interp_rgrid_curv[rcat][(xi - 1)];
1083
3.48M
  *rate_f = interp_cubic(prate, xo);
1084
3.48M
  const double *pdist = &interp_dgrid_curv[dcat][(xi - 1)];
1085
3.48M
  *distbysse_f = interp_cubic(pdist, xo);
1086
3.48M
}
1087
1088
static void get_entropy_contexts_plane(BLOCK_SIZE plane_bsize,
1089
                                       const struct macroblockd_plane *pd,
1090
                                       ENTROPY_CONTEXT t_above[MAX_MIB_SIZE],
1091
196M
                                       ENTROPY_CONTEXT t_left[MAX_MIB_SIZE]) {
1092
196M
  const int num_4x4_w = mi_size_wide[plane_bsize];
1093
196M
  const int num_4x4_h = mi_size_high[plane_bsize];
1094
196M
  const ENTROPY_CONTEXT *const above = pd->above_entropy_context;
1095
196M
  const ENTROPY_CONTEXT *const left = pd->left_entropy_context;
1096
1097
196M
  memcpy(t_above, above, sizeof(ENTROPY_CONTEXT) * num_4x4_w);
1098
196M
  memcpy(t_left, left, sizeof(ENTROPY_CONTEXT) * num_4x4_h);
1099
196M
}
1100
1101
void av1_get_entropy_contexts(BLOCK_SIZE plane_bsize,
1102
                              const struct macroblockd_plane *pd,
1103
                              ENTROPY_CONTEXT t_above[MAX_MIB_SIZE],
1104
196M
                              ENTROPY_CONTEXT t_left[MAX_MIB_SIZE]) {
1105
196M
  assert(plane_bsize < BLOCK_SIZES_ALL);
1106
196M
  get_entropy_contexts_plane(plane_bsize, pd, t_above, t_left);
1107
196M
}
1108
1109
// Special clamping used in the encoder when calculating a prediction
1110
//
1111
// Logically, all pixel fetches used for prediction are clamped against the
1112
// edges of the frame. But doing this directly is slow, so instead we allocate
1113
// a finite border around the frame and fill it with copies of the outermost
1114
// pixels.
1115
//
1116
// Since this border is finite, we need to clamp the motion vector before
1117
// prediction in order to avoid out-of-bounds reads. At the same time, this
1118
// clamp must not change the prediction result.
1119
//
1120
// We can balance both of these concerns by calculating how far we would have
1121
// to go in each direction before the extended prediction region (the current
1122
// block + AOM_INTERP_EXTEND many pixels around the block) would be mapped
1123
// so that it touches the frame only at one row or column. This is a special
1124
// point because any more extreme MV will always lead to the same prediction.
1125
// So it is safe to clamp at that point.
1126
//
1127
// In the worst case, this requires a border of
1128
//   max_block_width + 2*AOM_INTERP_EXTEND = 128 + 2*4 = 136 pixels
1129
// around the frame edges.
1130
static inline void enc_clamp_mv(const AV1_COMMON *cm, const MACROBLOCKD *xd,
1131
3.48M
                                MV *mv) {
1132
3.48M
  int bw = xd->width << MI_SIZE_LOG2;
1133
3.48M
  int bh = xd->height << MI_SIZE_LOG2;
1134
1135
3.48M
  int px_to_left_edge = xd->mi_col << MI_SIZE_LOG2;
1136
3.48M
  int px_to_right_edge = (cm->mi_params.mi_cols - xd->mi_col) << MI_SIZE_LOG2;
1137
3.48M
  int px_to_top_edge = xd->mi_row << MI_SIZE_LOG2;
1138
3.48M
  int px_to_bottom_edge = (cm->mi_params.mi_rows - xd->mi_row) << MI_SIZE_LOG2;
1139
1140
3.48M
  const SubpelMvLimits mv_limits = {
1141
3.48M
    .col_min = -GET_MV_SUBPEL(px_to_left_edge + bw + AOM_INTERP_EXTEND),
1142
3.48M
    .col_max = GET_MV_SUBPEL(px_to_right_edge + AOM_INTERP_EXTEND),
1143
3.48M
    .row_min = -GET_MV_SUBPEL(px_to_top_edge + bh + AOM_INTERP_EXTEND),
1144
3.48M
    .row_max = GET_MV_SUBPEL(px_to_bottom_edge + AOM_INTERP_EXTEND)
1145
3.48M
  };
1146
3.48M
  clamp_mv(mv, &mv_limits);
1147
3.48M
}
1148
1149
void av1_mv_pred(const AV1_COMP *cpi, MACROBLOCK *x, uint8_t *ref_y_buffer,
1150
2.27M
                 int ref_y_stride, int ref_frame, BLOCK_SIZE block_size) {
1151
2.27M
  const MV_REFERENCE_FRAME ref_frames[2] = { ref_frame, NONE_FRAME };
1152
2.27M
  const int_mv ref_mv =
1153
2.27M
      av1_get_ref_mv_from_stack(0, ref_frames, 0, &x->mbmi_ext);
1154
2.27M
  const int_mv ref_mv1 =
1155
2.27M
      av1_get_ref_mv_from_stack(0, ref_frames, 1, &x->mbmi_ext);
1156
2.27M
  MV pred_mv[MAX_MV_REF_CANDIDATES + 1];
1157
2.27M
  int num_mv_refs = 0;
1158
2.27M
  pred_mv[num_mv_refs++] = ref_mv.as_mv;
1159
2.27M
  if (ref_mv.as_int != ref_mv1.as_int) {
1160
1.20M
    pred_mv[num_mv_refs++] = ref_mv1.as_mv;
1161
1.20M
  }
1162
1163
2.27M
  assert(num_mv_refs <= (int)(sizeof(pred_mv) / sizeof(pred_mv[0])));
1164
1165
2.27M
  const uint8_t *const src_y_ptr = x->plane[0].src.buf;
1166
2.27M
  int zero_seen = 0;
1167
2.27M
  int best_sad = INT_MAX;
1168
2.27M
  int max_mv = 0;
1169
  // Get the sad for each candidate reference mv.
1170
5.75M
  for (int i = 0; i < num_mv_refs; ++i) {
1171
3.48M
    MV *this_mv = &pred_mv[i];
1172
3.48M
    enc_clamp_mv(&cpi->common, &x->e_mbd, this_mv);
1173
1174
3.48M
    const int fp_row = (this_mv->row + 3 + (this_mv->row >= 0)) >> 3;
1175
3.48M
    const int fp_col = (this_mv->col + 3 + (this_mv->col >= 0)) >> 3;
1176
3.48M
    max_mv = AOMMAX(max_mv, AOMMAX(abs(this_mv->row), abs(this_mv->col)) >> 3);
1177
1178
3.48M
    if (fp_row == 0 && fp_col == 0 && zero_seen) continue;
1179
3.46M
    zero_seen |= (fp_row == 0 && fp_col == 0);
1180
1181
3.46M
    const uint8_t *const ref_y_ptr =
1182
3.46M
        &ref_y_buffer[ref_y_stride * fp_row + fp_col];
1183
    // Find sad for current vector.
1184
3.46M
    const int this_sad = cpi->ppi->fn_ptr[block_size].sdf(
1185
3.46M
        src_y_ptr, x->plane[0].src.stride, ref_y_ptr, ref_y_stride);
1186
    // Note if it is the best so far.
1187
3.46M
    if (this_sad < best_sad) {
1188
2.85M
      best_sad = this_sad;
1189
2.85M
    }
1190
3.46M
    if (i == 0)
1191
2.27M
      x->pred_mv0_sad[ref_frame] = this_sad;
1192
1.18M
    else if (i == 1)
1193
1.19M
      x->pred_mv1_sad[ref_frame] = this_sad;
1194
3.46M
  }
1195
1196
  // Note the index of the mv that worked best in the reference list.
1197
2.27M
  x->max_mv_context[ref_frame] = max_mv;
1198
2.27M
  x->pred_mv_sad[ref_frame] = best_sad;
1199
2.27M
}
1200
1201
void av1_setup_pred_block(const MACROBLOCKD *xd,
1202
                          struct buf_2d dst[MAX_MB_PLANE],
1203
                          const YV12_BUFFER_CONFIG *src,
1204
                          const struct scale_factors *scale,
1205
                          const struct scale_factors *scale_uv,
1206
3.71M
                          const int num_planes) {
1207
3.71M
  dst[0].buf = src->y_buffer;
1208
3.71M
  dst[0].stride = src->y_stride;
1209
3.71M
  dst[1].buf = src->u_buffer;
1210
3.71M
  dst[2].buf = src->v_buffer;
1211
3.71M
  dst[1].stride = dst[2].stride = src->uv_stride;
1212
1213
3.71M
  const int mi_row = xd->mi_row;
1214
3.71M
  const int mi_col = xd->mi_col;
1215
10.8M
  for (int i = 0; i < num_planes; ++i) {
1216
7.15M
    setup_pred_plane(dst + i, xd->mi[0]->bsize, dst[i].buf,
1217
7.15M
                     i ? src->uv_crop_width : src->y_crop_width,
1218
7.15M
                     i ? src->uv_crop_height : src->y_crop_height,
1219
7.15M
                     dst[i].stride, mi_row, mi_col, i ? scale_uv : scale,
1220
7.15M
                     xd->plane[i].subsampling_x, xd->plane[i].subsampling_y);
1221
7.15M
  }
1222
3.71M
}
1223
1224
YV12_BUFFER_CONFIG *av1_get_scaled_ref_frame(const AV1_COMP *cpi,
1225
6.23M
                                             int ref_frame) {
1226
6.23M
  assert(ref_frame >= LAST_FRAME && ref_frame <= ALTREF_FRAME);
1227
6.23M
  RefCntBuffer *const scaled_buf = cpi->scaled_ref_buf[ref_frame - 1];
1228
6.23M
  const RefCntBuffer *const ref_buf =
1229
6.23M
      get_ref_frame_buf(&cpi->common, ref_frame);
1230
6.23M
  return (scaled_buf != ref_buf && scaled_buf != NULL) ? &scaled_buf->buf
1231
6.23M
                                                       : NULL;
1232
6.23M
}
1233
1234
int av1_get_switchable_rate(const MACROBLOCK *x, const MACROBLOCKD *xd,
1235
7.42M
                            InterpFilter interp_filter, int dual_filter) {
1236
7.42M
  if (interp_filter == SWITCHABLE) {
1237
7.42M
    const MB_MODE_INFO *const mbmi = xd->mi[0];
1238
7.42M
    int inter_filter_cost = 0;
1239
14.8M
    for (int dir = 0; dir < 2; ++dir) {
1240
14.8M
      if (dir && !dual_filter) break;
1241
7.40M
      const int ctx = av1_get_pred_context_switchable_interp(xd, dir);
1242
7.40M
      const InterpFilter filter =
1243
7.40M
          av1_extract_interp_filter(mbmi->interp_filters, dir);
1244
7.40M
      inter_filter_cost += x->mode_costs.switchable_interp_costs[ctx][filter];
1245
7.40M
    }
1246
7.42M
    return SWITCHABLE_INTERP_RATE_FACTOR * inter_filter_cost;
1247
7.42M
  } else {
1248
2.03k
    return 0;
1249
2.03k
  }
1250
7.42M
}
1251
1252
131k
void av1_set_rd_speed_thresholds(AV1_COMP *cpi) {
1253
131k
  RD_OPT *const rd = &cpi->rd;
1254
1255
  // Set baseline threshold values.
1256
131k
  av1_zero(rd->thresh_mult);
1257
1258
131k
  rd->thresh_mult[THR_NEARESTMV] = 300;
1259
131k
  rd->thresh_mult[THR_NEARESTL2] = 300;
1260
131k
  rd->thresh_mult[THR_NEARESTL3] = 300;
1261
131k
  rd->thresh_mult[THR_NEARESTB] = 300;
1262
131k
  rd->thresh_mult[THR_NEARESTA2] = 300;
1263
131k
  rd->thresh_mult[THR_NEARESTA] = 300;
1264
131k
  rd->thresh_mult[THR_NEARESTG] = 300;
1265
1266
131k
  rd->thresh_mult[THR_NEWMV] = 1000;
1267
131k
  rd->thresh_mult[THR_NEWL2] = 1000;
1268
131k
  rd->thresh_mult[THR_NEWL3] = 1000;
1269
131k
  rd->thresh_mult[THR_NEWB] = 1000;
1270
131k
  rd->thresh_mult[THR_NEWA2] = 1100;
1271
131k
  rd->thresh_mult[THR_NEWA] = 1000;
1272
131k
  rd->thresh_mult[THR_NEWG] = 1000;
1273
1274
131k
  rd->thresh_mult[THR_NEARMV] = 1000;
1275
131k
  rd->thresh_mult[THR_NEARL2] = 1000;
1276
131k
  rd->thresh_mult[THR_NEARL3] = 1000;
1277
131k
  rd->thresh_mult[THR_NEARB] = 1000;
1278
131k
  rd->thresh_mult[THR_NEARA2] = 1000;
1279
131k
  rd->thresh_mult[THR_NEARA] = 1000;
1280
131k
  rd->thresh_mult[THR_NEARG] = 1000;
1281
1282
131k
  rd->thresh_mult[THR_GLOBALMV] = 2200;
1283
131k
  rd->thresh_mult[THR_GLOBALL2] = 2000;
1284
131k
  rd->thresh_mult[THR_GLOBALL3] = 2000;
1285
131k
  rd->thresh_mult[THR_GLOBALB] = 2400;
1286
131k
  rd->thresh_mult[THR_GLOBALA2] = 2000;
1287
131k
  rd->thresh_mult[THR_GLOBALG] = 2000;
1288
131k
  rd->thresh_mult[THR_GLOBALA] = 2400;
1289
1290
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTLA] = 1100;
1291
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTL2A] = 1000;
1292
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTL3A] = 800;
1293
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTGA] = 900;
1294
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTLB] = 1000;
1295
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTL2B] = 1000;
1296
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTL3B] = 1000;
1297
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTGB] = 1000;
1298
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTLA2] = 1000;
1299
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTL2A2] = 1000;
1300
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTL3A2] = 1000;
1301
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTGA2] = 1000;
1302
1303
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTLL2] = 2000;
1304
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTLL3] = 2000;
1305
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTLG] = 2000;
1306
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTBA] = 2000;
1307
1308
131k
  rd->thresh_mult[THR_COMP_NEAR_NEARLA] = 1200;
1309
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEWLA] = 1500;
1310
131k
  rd->thresh_mult[THR_COMP_NEW_NEARESTLA] = 1500;
1311
131k
  rd->thresh_mult[THR_COMP_NEAR_NEWLA] = 1530;
1312
131k
  rd->thresh_mult[THR_COMP_NEW_NEARLA] = 1870;
1313
131k
  rd->thresh_mult[THR_COMP_NEW_NEWLA] = 2400;
1314
131k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLA] = 2750;
1315
1316
131k
  rd->thresh_mult[THR_COMP_NEAR_NEARL2A] = 1200;
1317
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEWL2A] = 1500;
1318
131k
  rd->thresh_mult[THR_COMP_NEW_NEARESTL2A] = 1500;
1319
131k
  rd->thresh_mult[THR_COMP_NEAR_NEWL2A] = 1870;
1320
131k
  rd->thresh_mult[THR_COMP_NEW_NEARL2A] = 1700;
1321
131k
  rd->thresh_mult[THR_COMP_NEW_NEWL2A] = 1800;
1322
131k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL2A] = 2500;
1323
1324
131k
  rd->thresh_mult[THR_COMP_NEAR_NEARL3A] = 1200;
1325
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEWL3A] = 1500;
1326
131k
  rd->thresh_mult[THR_COMP_NEW_NEARESTL3A] = 1500;
1327
131k
  rd->thresh_mult[THR_COMP_NEAR_NEWL3A] = 1700;
1328
131k
  rd->thresh_mult[THR_COMP_NEW_NEARL3A] = 1700;
1329
131k
  rd->thresh_mult[THR_COMP_NEW_NEWL3A] = 2000;
1330
131k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL3A] = 3000;
1331
1332
131k
  rd->thresh_mult[THR_COMP_NEAR_NEARGA] = 1320;
1333
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEWGA] = 1500;
1334
131k
  rd->thresh_mult[THR_COMP_NEW_NEARESTGA] = 1500;
1335
131k
  rd->thresh_mult[THR_COMP_NEAR_NEWGA] = 2040;
1336
131k
  rd->thresh_mult[THR_COMP_NEW_NEARGA] = 1700;
1337
131k
  rd->thresh_mult[THR_COMP_NEW_NEWGA] = 2000;
1338
131k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALGA] = 2250;
1339
1340
131k
  rd->thresh_mult[THR_COMP_NEAR_NEARLB] = 1200;
1341
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEWLB] = 1500;
1342
131k
  rd->thresh_mult[THR_COMP_NEW_NEARESTLB] = 1500;
1343
131k
  rd->thresh_mult[THR_COMP_NEAR_NEWLB] = 1360;
1344
131k
  rd->thresh_mult[THR_COMP_NEW_NEARLB] = 1700;
1345
131k
  rd->thresh_mult[THR_COMP_NEW_NEWLB] = 2400;
1346
131k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLB] = 2250;
1347
1348
131k
  rd->thresh_mult[THR_COMP_NEAR_NEARL2B] = 1200;
1349
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEWL2B] = 1500;
1350
131k
  rd->thresh_mult[THR_COMP_NEW_NEARESTL2B] = 1500;
1351
131k
  rd->thresh_mult[THR_COMP_NEAR_NEWL2B] = 1700;
1352
131k
  rd->thresh_mult[THR_COMP_NEW_NEARL2B] = 1700;
1353
131k
  rd->thresh_mult[THR_COMP_NEW_NEWL2B] = 2000;
1354
131k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL2B] = 2500;
1355
1356
131k
  rd->thresh_mult[THR_COMP_NEAR_NEARL3B] = 1200;
1357
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEWL3B] = 1500;
1358
131k
  rd->thresh_mult[THR_COMP_NEW_NEARESTL3B] = 1500;
1359
131k
  rd->thresh_mult[THR_COMP_NEAR_NEWL3B] = 1870;
1360
131k
  rd->thresh_mult[THR_COMP_NEW_NEARL3B] = 1700;
1361
131k
  rd->thresh_mult[THR_COMP_NEW_NEWL3B] = 2000;
1362
131k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL3B] = 2500;
1363
1364
131k
  rd->thresh_mult[THR_COMP_NEAR_NEARGB] = 1200;
1365
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEWGB] = 1500;
1366
131k
  rd->thresh_mult[THR_COMP_NEW_NEARESTGB] = 1500;
1367
131k
  rd->thresh_mult[THR_COMP_NEAR_NEWGB] = 1700;
1368
131k
  rd->thresh_mult[THR_COMP_NEW_NEARGB] = 1700;
1369
131k
  rd->thresh_mult[THR_COMP_NEW_NEWGB] = 2000;
1370
131k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALGB] = 2500;
1371
1372
131k
  rd->thresh_mult[THR_COMP_NEAR_NEARLA2] = 1200;
1373
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEWLA2] = 1800;
1374
131k
  rd->thresh_mult[THR_COMP_NEW_NEARESTLA2] = 1500;
1375
131k
  rd->thresh_mult[THR_COMP_NEAR_NEWLA2] = 1700;
1376
131k
  rd->thresh_mult[THR_COMP_NEW_NEARLA2] = 1700;
1377
131k
  rd->thresh_mult[THR_COMP_NEW_NEWLA2] = 2000;
1378
131k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLA2] = 2500;
1379
1380
131k
  rd->thresh_mult[THR_COMP_NEAR_NEARL2A2] = 1200;
1381
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEWL2A2] = 1500;
1382
131k
  rd->thresh_mult[THR_COMP_NEW_NEARESTL2A2] = 1500;
1383
131k
  rd->thresh_mult[THR_COMP_NEAR_NEWL2A2] = 1700;
1384
131k
  rd->thresh_mult[THR_COMP_NEW_NEARL2A2] = 1700;
1385
131k
  rd->thresh_mult[THR_COMP_NEW_NEWL2A2] = 2000;
1386
131k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL2A2] = 2500;
1387
1388
131k
  rd->thresh_mult[THR_COMP_NEAR_NEARL3A2] = 1440;
1389
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEWL3A2] = 1500;
1390
131k
  rd->thresh_mult[THR_COMP_NEW_NEARESTL3A2] = 1500;
1391
131k
  rd->thresh_mult[THR_COMP_NEAR_NEWL3A2] = 1700;
1392
131k
  rd->thresh_mult[THR_COMP_NEW_NEARL3A2] = 1700;
1393
131k
  rd->thresh_mult[THR_COMP_NEW_NEWL3A2] = 2000;
1394
131k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL3A2] = 2500;
1395
1396
131k
  rd->thresh_mult[THR_COMP_NEAR_NEARGA2] = 1200;
1397
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEWGA2] = 1500;
1398
131k
  rd->thresh_mult[THR_COMP_NEW_NEARESTGA2] = 1500;
1399
131k
  rd->thresh_mult[THR_COMP_NEAR_NEWGA2] = 1700;
1400
131k
  rd->thresh_mult[THR_COMP_NEW_NEARGA2] = 1700;
1401
131k
  rd->thresh_mult[THR_COMP_NEW_NEWGA2] = 2000;
1402
131k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALGA2] = 2750;
1403
1404
131k
  rd->thresh_mult[THR_COMP_NEAR_NEARLL2] = 1600;
1405
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEWLL2] = 2000;
1406
131k
  rd->thresh_mult[THR_COMP_NEW_NEARESTLL2] = 2000;
1407
131k
  rd->thresh_mult[THR_COMP_NEAR_NEWLL2] = 2640;
1408
131k
  rd->thresh_mult[THR_COMP_NEW_NEARLL2] = 2200;
1409
131k
  rd->thresh_mult[THR_COMP_NEW_NEWLL2] = 2400;
1410
131k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLL2] = 3200;
1411
1412
131k
  rd->thresh_mult[THR_COMP_NEAR_NEARLL3] = 1600;
1413
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEWLL3] = 2000;
1414
131k
  rd->thresh_mult[THR_COMP_NEW_NEARESTLL3] = 1800;
1415
131k
  rd->thresh_mult[THR_COMP_NEAR_NEWLL3] = 2200;
1416
131k
  rd->thresh_mult[THR_COMP_NEW_NEARLL3] = 2200;
1417
131k
  rd->thresh_mult[THR_COMP_NEW_NEWLL3] = 2400;
1418
131k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLL3] = 3200;
1419
1420
131k
  rd->thresh_mult[THR_COMP_NEAR_NEARLG] = 1760;
1421
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEWLG] = 2400;
1422
131k
  rd->thresh_mult[THR_COMP_NEW_NEARESTLG] = 2000;
1423
131k
  rd->thresh_mult[THR_COMP_NEAR_NEWLG] = 1760;
1424
131k
  rd->thresh_mult[THR_COMP_NEW_NEARLG] = 2640;
1425
131k
  rd->thresh_mult[THR_COMP_NEW_NEWLG] = 2400;
1426
131k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLG] = 3200;
1427
1428
131k
  rd->thresh_mult[THR_COMP_NEAR_NEARBA] = 1600;
1429
131k
  rd->thresh_mult[THR_COMP_NEAREST_NEWBA] = 2000;
1430
131k
  rd->thresh_mult[THR_COMP_NEW_NEARESTBA] = 2000;
1431
131k
  rd->thresh_mult[THR_COMP_NEAR_NEWBA] = 2200;
1432
131k
  rd->thresh_mult[THR_COMP_NEW_NEARBA] = 1980;
1433
131k
  rd->thresh_mult[THR_COMP_NEW_NEWBA] = 2640;
1434
131k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALBA] = 3200;
1435
1436
131k
  rd->thresh_mult[THR_DC] = 1000;
1437
131k
  rd->thresh_mult[THR_PAETH] = 1000;
1438
131k
  rd->thresh_mult[THR_SMOOTH] = 2200;
1439
131k
  rd->thresh_mult[THR_SMOOTH_V] = 2000;
1440
131k
  rd->thresh_mult[THR_SMOOTH_H] = 2000;
1441
131k
  rd->thresh_mult[THR_H_PRED] = 2000;
1442
131k
  rd->thresh_mult[THR_V_PRED] = 1800;
1443
131k
  rd->thresh_mult[THR_D135_PRED] = 2500;
1444
131k
  rd->thresh_mult[THR_D203_PRED] = 2000;
1445
131k
  rd->thresh_mult[THR_D157_PRED] = 2500;
1446
131k
  rd->thresh_mult[THR_D67_PRED] = 2000;
1447
131k
  rd->thresh_mult[THR_D113_PRED] = 2500;
1448
131k
  rd->thresh_mult[THR_D45_PRED] = 2500;
1449
131k
}
1450
1451
static inline void update_thr_fact(int (*factor_buf)[MAX_MODES],
1452
                                   THR_MODES best_mode_index,
1453
                                   THR_MODES mode_start, THR_MODES mode_end,
1454
                                   BLOCK_SIZE min_size, BLOCK_SIZE max_size,
1455
1.71M
                                   int max_rd_thresh_factor) {
1456
146M
  for (THR_MODES mode = mode_start; mode < mode_end; ++mode) {
1457
863M
    for (BLOCK_SIZE bs = min_size; bs <= max_size; ++bs) {
1458
719M
      int *const fact = &factor_buf[bs][mode];
1459
719M
      if (mode == best_mode_index) {
1460
4.27M
        *fact -= (*fact >> RD_THRESH_LOG_DEC_FACTOR);
1461
715M
      } else {
1462
715M
        *fact = AOMMIN(*fact + RD_THRESH_INC, max_rd_thresh_factor);
1463
715M
      }
1464
719M
    }
1465
144M
  }
1466
1.71M
}
1467
1468
void av1_update_rd_thresh_fact(
1469
    const AV1_COMMON *const cm, int (*factor_buf)[MAX_MODES],
1470
    int use_adaptive_rd_thresh, BLOCK_SIZE bsize, THR_MODES best_mode_index,
1471
    THR_MODES inter_mode_start, THR_MODES inter_mode_end,
1472
856k
    THR_MODES intra_mode_start, THR_MODES intra_mode_end) {
1473
856k
  assert(use_adaptive_rd_thresh > 0);
1474
856k
  const int max_rd_thresh_factor = use_adaptive_rd_thresh * RD_THRESH_MAX_FACT;
1475
1476
856k
  const int bsize_is_1_to_4 = bsize > cm->seq_params->sb_size;
1477
856k
  BLOCK_SIZE min_size, max_size;
1478
856k
  if (bsize_is_1_to_4) {
1479
    // This part handles block sizes with 1:4 and 4:1 aspect ratios
1480
    // TODO(any): Experiment with threshold update for parent/child blocks
1481
0
    min_size = bsize;
1482
0
    max_size = bsize;
1483
856k
  } else {
1484
856k
    min_size = AOMMAX(bsize - 2, BLOCK_4X4);
1485
856k
    max_size = AOMMIN(bsize + 2, (int)cm->seq_params->sb_size);
1486
856k
  }
1487
1488
856k
  update_thr_fact(factor_buf, best_mode_index, inter_mode_start, inter_mode_end,
1489
856k
                  min_size, max_size, max_rd_thresh_factor);
1490
856k
  update_thr_fact(factor_buf, best_mode_index, intra_mode_start, intra_mode_end,
1491
856k
                  min_size, max_size, max_rd_thresh_factor);
1492
856k
}
1493
1494
int av1_get_intra_cost_penalty(int qindex, int qdelta,
1495
458k
                               aom_bit_depth_t bit_depth) {
1496
458k
  const int q = av1_dc_quant_QTX(qindex, qdelta, bit_depth);
1497
458k
  switch (bit_depth) {
1498
432k
    case AOM_BITS_8: return 20 * q;
1499
11.9k
    case AOM_BITS_10: return 5 * q;
1500
13.7k
    case AOM_BITS_12: return ROUND_POWER_OF_TWO(5 * q, 2);
1501
0
    default:
1502
      assert(0 && "bit_depth should be AOM_BITS_8, AOM_BITS_10 or AOM_BITS_12");
1503
0
      return -1;
1504
458k
  }
1505
458k
}