Coverage Report

Created: 2026-08-31 07:01

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
562k
                         FRAME_CONTEXT *fc) {
84
562k
  int i, j;
85
86
11.2M
  for (i = 0; i < PARTITION_CONTEXTS; ++i)
87
10.6M
    av1_cost_tokens_from_cdf(mode_costs->partition_cost[i],
88
10.6M
                             fc->partition_cdf[i], NULL);
89
90
562k
  if (cm->current_frame.skip_mode_info.skip_mode_flag) {
91
55.0k
    for (i = 0; i < SKIP_MODE_CONTEXTS; ++i) {
92
41.2k
      av1_cost_tokens_from_cdf(mode_costs->skip_mode_cost[i],
93
41.2k
                               fc->skip_mode_cdfs[i], NULL);
94
41.2k
    }
95
549k
  } else {
96
549k
    av1_zero(mode_costs->skip_mode_cost);
97
549k
  }
98
99
2.23M
  for (i = 0; i < SKIP_CONTEXTS; ++i) {
100
1.67M
    av1_cost_tokens_from_cdf(mode_costs->skip_txfm_cost[i],
101
1.67M
                             fc->skip_txfm_cdfs[i], NULL);
102
1.67M
  }
103
104
3.31M
  for (i = 0; i < KF_MODE_CONTEXTS; ++i)
105
15.8M
    for (j = 0; j < KF_MODE_CONTEXTS; ++j)
106
13.1M
      av1_cost_tokens_from_cdf(mode_costs->y_mode_costs[i][j],
107
13.1M
                               fc->kf_y_cdf[i][j], NULL);
108
109
2.77M
  for (i = 0; i < BLOCK_SIZE_GROUPS; ++i)
110
2.20M
    av1_cost_tokens_from_cdf(mode_costs->mbmode_cost[i], fc->y_mode_cdf[i],
111
2.20M
                             NULL);
112
1.67M
  for (i = 0; i < CFL_ALLOWED_TYPES; ++i)
113
14.7M
    for (j = 0; j < INTRA_MODES; ++j)
114
13.6M
      av1_cost_tokens_from_cdf(mode_costs->intra_uv_mode_cost[i][j],
115
13.6M
                               fc->uv_mode_cdf[i][j], NULL);
116
117
562k
  av1_cost_tokens_from_cdf(mode_costs->filter_intra_mode_cost,
118
562k
                           fc->filter_intra_mode_cdf, NULL);
119
12.6M
  for (i = 0; i < BLOCK_SIZES_ALL; ++i) {
120
12.1M
    if (av1_filter_intra_allowed_bsize(cm, i))
121
7.73M
      av1_cost_tokens_from_cdf(mode_costs->filter_intra_cost[i],
122
7.73M
                               fc->filter_intra_cdfs[i], NULL);
123
12.1M
  }
124
125
9.35M
  for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; ++i)
126
8.79M
    av1_cost_tokens_from_cdf(mode_costs->switchable_interp_costs[i],
127
8.79M
                             fc->switchable_interp_cdf[i], NULL);
128
129
4.39M
  for (i = 0; i < PALATTE_BSIZE_CTXS; ++i) {
130
3.83M
    av1_cost_tokens_from_cdf(mode_costs->palette_y_size_cost[i],
131
3.83M
                             fc->palette_y_size_cdf[i], NULL);
132
3.83M
    av1_cost_tokens_from_cdf(mode_costs->palette_uv_size_cost[i],
133
3.83M
                             fc->palette_uv_size_cdf[i], NULL);
134
15.1M
    for (j = 0; j < PALETTE_Y_MODE_CONTEXTS; ++j) {
135
11.3M
      av1_cost_tokens_from_cdf(mode_costs->palette_y_mode_cost[i][j],
136
11.3M
                               fc->palette_y_mode_cdf[i][j], NULL);
137
11.3M
    }
138
3.83M
  }
139
140
1.68M
  for (i = 0; i < PALETTE_UV_MODE_CONTEXTS; ++i) {
141
1.11M
    av1_cost_tokens_from_cdf(mode_costs->palette_uv_mode_cost[i],
142
1.11M
                             fc->palette_uv_mode_cdf[i], NULL);
143
1.11M
  }
144
145
4.40M
  for (i = 0; i < PALETTE_SIZES; ++i) {
146
22.3M
    for (j = 0; j < PALETTE_COLOR_INDEX_CONTEXTS; ++j) {
147
18.4M
      av1_cost_tokens_from_cdf(mode_costs->palette_y_color_cost[i][j],
148
18.4M
                               fc->palette_y_color_index_cdf[i][j], NULL);
149
18.4M
      av1_cost_tokens_from_cdf(mode_costs->palette_uv_color_cost[i][j],
150
18.4M
                               fc->palette_uv_color_index_cdf[i][j], NULL);
151
18.4M
    }
152
3.84M
  }
153
154
562k
  int sign_cost[CFL_JOINT_SIGNS];
155
562k
  av1_cost_tokens_from_cdf(sign_cost, fc->cfl_sign_cdf, NULL);
156
5.00M
  for (int joint_sign = 0; joint_sign < CFL_JOINT_SIGNS; joint_sign++) {
157
4.44M
    int *cost_u = mode_costs->cfl_cost[joint_sign][CFL_PRED_U];
158
4.44M
    int *cost_v = mode_costs->cfl_cost[joint_sign][CFL_PRED_V];
159
4.44M
    if (CFL_SIGN_U(joint_sign) == CFL_SIGN_ZERO) {
160
1.11M
      memset(cost_u, 0, CFL_ALPHABET_SIZE * sizeof(*cost_u));
161
3.32M
    } else {
162
3.32M
      const aom_cdf_prob *cdf_u = fc->cfl_alpha_cdf[CFL_CONTEXT_U(joint_sign)];
163
3.32M
      av1_cost_tokens_from_cdf(cost_u, cdf_u, NULL);
164
3.32M
    }
165
4.44M
    if (CFL_SIGN_V(joint_sign) == CFL_SIGN_ZERO) {
166
1.11M
      memset(cost_v, 0, CFL_ALPHABET_SIZE * sizeof(*cost_v));
167
3.33M
    } else {
168
3.33M
      const aom_cdf_prob *cdf_v = fc->cfl_alpha_cdf[CFL_CONTEXT_V(joint_sign)];
169
3.33M
      av1_cost_tokens_from_cdf(cost_v, cdf_v, NULL);
170
3.33M
    }
171
74.3M
    for (int u = 0; u < CFL_ALPHABET_SIZE; u++)
172
69.9M
      cost_u[u] += sign_cost[joint_sign];
173
4.44M
  }
174
175
2.79M
  for (i = 0; i < MAX_TX_CATS; ++i)
176
8.88M
    for (j = 0; j < TX_SIZE_CONTEXTS; ++j)
177
6.65M
      av1_cost_tokens_from_cdf(mode_costs->tx_size_cost[i][j],
178
6.65M
                               fc->tx_size_cdf[i][j], NULL);
179
180
12.1M
  for (i = 0; i < TXFM_PARTITION_CONTEXTS; ++i) {
181
11.5M
    av1_cost_tokens_from_cdf(mode_costs->txfm_partition_cost[i],
182
11.5M
                             fc->txfm_partition_cdf[i], NULL);
183
11.5M
  }
184
185
2.78M
  for (i = TX_4X4; i < EXT_TX_SIZES; ++i) {
186
2.22M
    int s;
187
8.84M
    for (s = 1; s < EXT_TX_SETS_INTER; ++s) {
188
6.61M
      if (use_inter_ext_tx_for_txsize[s][i]) {
189
3.31M
        av1_cost_tokens_from_cdf(
190
3.31M
            mode_costs->inter_tx_type_costs[s][i], fc->inter_ext_tx_cdf[s][i],
191
3.31M
            av1_ext_tx_inv[av1_ext_tx_set_idx_to_type[1][s]]);
192
3.31M
      }
193
6.61M
    }
194
6.64M
    for (s = 1; s < EXT_TX_SETS_INTRA; ++s) {
195
4.42M
      if (use_intra_ext_tx_for_txsize[s][i]) {
196
22.3M
        for (j = 0; j < INTRA_MODES; ++j) {
197
20.6M
          av1_cost_tokens_from_cdf(
198
20.6M
              mode_costs->intra_tx_type_costs[s][i][j],
199
20.6M
              fc->intra_ext_tx_cdf[s][i][j],
200
20.6M
              av1_ext_tx_inv[av1_ext_tx_set_idx_to_type[0][s]]);
201
20.6M
        }
202
1.67M
      }
203
4.42M
    }
204
2.22M
  }
205
4.97M
  for (i = 0; i < DIRECTIONAL_MODES; ++i) {
206
4.41M
    av1_cost_tokens_from_cdf(mode_costs->angle_delta_cost[i],
207
4.41M
                             fc->angle_delta_cdf[i], NULL);
208
4.41M
  }
209
562k
  av1_cost_tokens_from_cdf(mode_costs->intrabc_cost, fc->intrabc_cdf, NULL);
210
211
2.23M
  for (i = 0; i < SPATIAL_PREDICTION_PROBS; ++i) {
212
1.67M
    av1_cost_tokens_from_cdf(mode_costs->spatial_pred_cost[i],
213
1.67M
                             fc->seg.spatial_pred_seg_cdf[i], NULL);
214
1.67M
  }
215
216
2.24M
  for (i = 0; i < SEG_TEMPORAL_PRED_CTXS; ++i) {
217
1.67M
    av1_cost_tokens_from_cdf(mode_costs->tmp_pred_cost[i], fc->seg.pred_cdf[i],
218
1.67M
                             NULL);
219
1.67M
  }
220
221
562k
  if (!frame_is_intra_only(cm)) {
222
584k
    for (i = 0; i < COMP_INTER_CONTEXTS; ++i) {
223
486k
      av1_cost_tokens_from_cdf(mode_costs->comp_inter_cost[i],
224
486k
                               fc->comp_inter_cdf[i], NULL);
225
486k
    }
226
227
389k
    for (i = 0; i < REF_CONTEXTS; ++i) {
228
2.03M
      for (j = 0; j < SINGLE_REFS - 1; ++j) {
229
1.74M
        av1_cost_tokens_from_cdf(mode_costs->single_ref_cost[i][j],
230
1.74M
                                 fc->single_ref_cdf[i][j], NULL);
231
1.74M
      }
232
292k
    }
233
234
584k
    for (i = 0; i < COMP_REF_TYPE_CONTEXTS; ++i) {
235
486k
      av1_cost_tokens_from_cdf(mode_costs->comp_ref_type_cost[i],
236
486k
                               fc->comp_ref_type_cdf[i], NULL);
237
486k
    }
238
239
389k
    for (i = 0; i < UNI_COMP_REF_CONTEXTS; ++i) {
240
1.16M
      for (j = 0; j < UNIDIR_COMP_REFS - 1; ++j) {
241
874k
        av1_cost_tokens_from_cdf(mode_costs->uni_comp_ref_cost[i][j],
242
874k
                                 fc->uni_comp_ref_cdf[i][j], NULL);
243
874k
      }
244
292k
    }
245
246
389k
    for (i = 0; i < REF_CONTEXTS; ++i) {
247
1.16M
      for (j = 0; j < FWD_REFS - 1; ++j) {
248
874k
        av1_cost_tokens_from_cdf(mode_costs->comp_ref_cost[i][j],
249
874k
                                 fc->comp_ref_cdf[i][j], NULL);
250
874k
      }
251
292k
    }
252
253
389k
    for (i = 0; i < REF_CONTEXTS; ++i) {
254
875k
      for (j = 0; j < BWD_REFS - 1; ++j) {
255
583k
        av1_cost_tokens_from_cdf(mode_costs->comp_bwdref_cost[i][j],
256
583k
                                 fc->comp_bwdref_cdf[i][j], NULL);
257
583k
      }
258
292k
    }
259
260
487k
    for (i = 0; i < INTRA_INTER_CONTEXTS; ++i) {
261
389k
      av1_cost_tokens_from_cdf(mode_costs->intra_inter_cost[i],
262
389k
                               fc->intra_inter_cdf[i], NULL);
263
389k
    }
264
265
681k
    for (i = 0; i < NEWMV_MODE_CONTEXTS; ++i) {
266
583k
      av1_cost_tokens_from_cdf(mode_costs->newmv_mode_cost[i], fc->newmv_cdf[i],
267
583k
                               NULL);
268
583k
    }
269
270
292k
    for (i = 0; i < GLOBALMV_MODE_CONTEXTS; ++i) {
271
194k
      av1_cost_tokens_from_cdf(mode_costs->zeromv_mode_cost[i],
272
194k
                               fc->zeromv_cdf[i], NULL);
273
194k
    }
274
275
681k
    for (i = 0; i < REFMV_MODE_CONTEXTS; ++i) {
276
583k
      av1_cost_tokens_from_cdf(mode_costs->refmv_mode_cost[i], fc->refmv_cdf[i],
277
583k
                               NULL);
278
583k
    }
279
280
389k
    for (i = 0; i < DRL_MODE_CONTEXTS; ++i) {
281
292k
      av1_cost_tokens_from_cdf(mode_costs->drl_mode_cost0[i], fc->drl_cdf[i],
282
292k
                               NULL);
283
292k
    }
284
869k
    for (i = 0; i < INTER_MODE_CONTEXTS; ++i)
285
772k
      av1_cost_tokens_from_cdf(mode_costs->inter_compound_mode_cost[i],
286
772k
                               fc->inter_compound_mode_cdf[i], NULL);
287
2.22M
    for (i = 0; i < BLOCK_SIZES_ALL; ++i)
288
2.12M
      av1_cost_tokens_from_cdf(mode_costs->compound_type_cost[i],
289
2.12M
                               fc->compound_type_cdf[i], NULL);
290
2.20M
    for (i = 0; i < BLOCK_SIZES_ALL; ++i) {
291
2.10M
      if (av1_is_wedge_used(i)) {
292
865k
        av1_cost_tokens_from_cdf(mode_costs->wedge_idx_cost[i],
293
865k
                                 fc->wedge_idx_cdf[i], NULL);
294
865k
      }
295
2.10M
    }
296
486k
    for (i = 0; i < BLOCK_SIZE_GROUPS; ++i) {
297
388k
      av1_cost_tokens_from_cdf(mode_costs->interintra_cost[i],
298
388k
                               fc->interintra_cdf[i], NULL);
299
388k
      av1_cost_tokens_from_cdf(mode_costs->interintra_mode_cost[i],
300
388k
                               fc->interintra_mode_cdf[i], NULL);
301
388k
    }
302
2.22M
    for (i = 0; i < BLOCK_SIZES_ALL; ++i) {
303
2.12M
      av1_cost_tokens_from_cdf(mode_costs->wedge_interintra_cost[i],
304
2.12M
                               fc->wedge_interintra_cdf[i], NULL);
305
2.12M
    }
306
1.93M
    for (i = BLOCK_8X8; i < BLOCK_SIZES_ALL; i++) {
307
1.83M
      av1_cost_tokens_from_cdf(mode_costs->motion_mode_cost[i],
308
1.83M
                               fc->motion_mode_cdf[i], NULL);
309
1.83M
    }
310
1.93M
    for (i = BLOCK_8X8; i < BLOCK_SIZES_ALL; i++) {
311
1.83M
      av1_cost_tokens_from_cdf(mode_costs->motion_mode_cost1[i],
312
1.83M
                               fc->obmc_cdf[i], NULL);
313
1.83M
    }
314
681k
    for (i = 0; i < COMP_INDEX_CONTEXTS; ++i) {
315
584k
      av1_cost_tokens_from_cdf(mode_costs->comp_idx_cost[i],
316
584k
                               fc->compound_index_cdf[i], NULL);
317
584k
    }
318
681k
    for (i = 0; i < COMP_GROUP_IDX_CONTEXTS; ++i) {
319
584k
      av1_cost_tokens_from_cdf(mode_costs->comp_group_idx_cost[i],
320
584k
                               fc->comp_group_idx_cdf[i], NULL);
321
584k
    }
322
97.5k
  }
323
562k
}
324
325
#if !CONFIG_REALTIME_ONLY
326
11.0k
void av1_fill_lr_rates(ModeCosts *mode_costs, FRAME_CONTEXT *fc) {
327
11.0k
  av1_cost_tokens_from_cdf(mode_costs->switchable_restore_cost,
328
11.0k
                           fc->switchable_restore_cdf, NULL);
329
11.0k
  av1_cost_tokens_from_cdf(mode_costs->wiener_restore_cost,
330
11.0k
                           fc->wiener_restore_cdf, NULL);
331
11.0k
  av1_cost_tokens_from_cdf(mode_costs->sgrproj_restore_cost,
332
11.0k
                           fc->sgrproj_restore_cdf, NULL);
333
11.0k
}
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
90.0k
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
49.5k
static double def_inter_rd_multiplier(int qindex) {
372
49.5k
  return 3.2 + (0.0015 * (double)qindex);
373
49.5k
}
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
75.3k
static double def_arf_rd_multiplier(int qindex) {
379
75.3k
  return 3.25 + (0.0015 * (double)qindex);
380
75.3k
}
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
33.6M
static double def_kf_rd_multiplier(int qindex) {
386
33.6M
  return 3.3 + (0.0015 * (double)qindex);
387
33.6M
}
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
33.8M
                                        MODE mode) {
393
33.8M
  const int q = av1_dc_quant_QTX(qindex, 0, bit_depth);
394
33.8M
  int64_t rdmult = q * q;
395
33.8M
  if (update_type == KF_UPDATE) {
396
33.6M
    double def_rd_q_mult = def_kf_rd_multiplier(q);
397
33.6M
    rdmult = (int64_t)((double)rdmult * def_rd_q_mult);
398
33.6M
  } else if ((update_type == GF_UPDATE) || (update_type == ARF_UPDATE)) {
399
75.3k
    double def_rd_q_mult = def_arf_rd_multiplier(q);
400
75.3k
    rdmult = (int64_t)((double)rdmult * def_rd_q_mult);
401
75.3k
  } else {
402
57.7k
    double def_rd_q_mult = def_inter_rd_multiplier(q);
403
57.7k
    rdmult = (int64_t)((double)rdmult * def_rd_q_mult);
404
57.7k
  }
405
406
33.8M
  if (tuning == AOM_TUNE_IQ || tuning == AOM_TUNE_SSIMULACRA2) {
407
33.3M
    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
33.3M
    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
33.3M
    } 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
33.3M
      weight = clamp(((255 - qindex) * 3) / 4, 0, 72) + 128;
432
33.3M
    }
433
33.3M
    rdmult = (int64_t)((double)rdmult * weight / 128.0);
434
33.3M
  }
435
436
33.8M
  switch (bit_depth) {
437
24.9M
    case AOM_BITS_8: break;
438
3.85M
    case AOM_BITS_10: rdmult = ROUND_POWER_OF_TWO(rdmult, 4); break;
439
4.96M
    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
33.8M
  }
444
33.7M
  return rdmult > 0 ? (int)AOMMIN(rdmult, INT_MAX) : 1;
445
33.8M
}
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
33.7M
                        const aom_tune_metric tuning, const MODE mode) {
454
33.7M
  int64_t rdmult = av1_compute_rd_mult_based_on_qindex(bit_depth, update_type,
455
33.7M
                                                       qindex, tuning, mode);
456
33.7M
  if (is_stat_consumption_stage && (use_fixed_qp_offsets == 0) &&
457
298k
      (frame_type != KEY_FRAME)) {
458
    // Layer depth adjustment
459
117k
    rdmult = (rdmult * rd_layer_depth_factor[layer_depth]) >> 7;
460
    // ARF boost adjustment
461
117k
    rdmult += ((rdmult * rd_boost_factor[boost_index]) >> 7);
462
117k
  }
463
33.7M
  return rdmult > 0 ? (int)AOMMIN(rdmult, INT_MAX) : 1;
464
33.7M
}
465
466
29.6k
int av1_get_deltaq_offset(aom_bit_depth_t bit_depth, int qindex, double beta) {
467
29.6k
  assert(beta > 0.0);
468
29.6k
  int q = av1_dc_quant_QTX(qindex, 0, bit_depth);
469
29.6k
  int newq = (int)rint(q / sqrt(beta));
470
29.6k
  int orig_qindex = qindex;
471
29.6k
  if (newq == q) {
472
22.8k
    return 0;
473
22.8k
  }
474
6.78k
  if (newq < q) {
475
8.39k
    while (qindex > 0) {
476
8.39k
      qindex--;
477
8.39k
      q = av1_dc_quant_QTX(qindex, 0, bit_depth);
478
8.39k
      if (newq >= q) {
479
3.18k
        break;
480
3.18k
      }
481
8.39k
    }
482
3.60k
  } else {
483
6.27k
    while (qindex < MAXQ) {
484
5.69k
      qindex++;
485
5.69k
      q = av1_dc_quant_QTX(qindex, 0, bit_depth);
486
5.69k
      if (newq <= q) {
487
3.02k
        break;
488
3.02k
      }
489
5.69k
    }
490
3.60k
  }
491
6.78k
  return qindex - orig_qindex;
492
29.6k
}
493
494
int av1_adjust_q_from_delta_q_res(int delta_q_res, int prev_qindex,
495
247k
                                  int curr_qindex) {
496
247k
  curr_qindex = clamp(curr_qindex, delta_q_res, 256 - delta_q_res);
497
247k
  const int sign_deltaq_index = curr_qindex - prev_qindex >= 0 ? 1 : -1;
498
247k
  const int deltaq_deadzone = delta_q_res / 4;
499
247k
  const int qmask = ~(delta_q_res - 1);
500
247k
  int abs_deltaq_index = abs(curr_qindex - prev_qindex);
501
247k
  abs_deltaq_index = (abs_deltaq_index + deltaq_deadzone) & qmask;
502
247k
  int adjust_qindex = prev_qindex + sign_deltaq_index * abs_deltaq_index;
503
247k
  adjust_qindex = AOMMAX(adjust_qindex, MINQ + 1);
504
247k
  return adjust_qindex;
505
247k
}
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.16M
static int compute_rd_thresh_factor(int qindex, aom_bit_depth_t bit_depth) {
530
1.16M
  double q;
531
1.16M
  switch (bit_depth) {
532
824k
    case AOM_BITS_8: q = av1_dc_quant_QTX(qindex, 0, AOM_BITS_8) / 4.0; break;
533
158k
    case AOM_BITS_10:
534
158k
      q = av1_dc_quant_QTX(qindex, 0, AOM_BITS_10) / 16.0;
535
158k
      break;
536
179k
    case AOM_BITS_12:
537
179k
      q = av1_dc_quant_QTX(qindex, 0, AOM_BITS_12) / 64.0;
538
179k
      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.16M
  }
543
  // TODO(debargha): Adjust the function below.
544
1.16M
  return AOMMAX((int)(pow(q, RD_THRESH_POW) * 5.12), 8);
545
1.16M
}
546
547
556k
void av1_set_sad_per_bit(const AV1_COMP *cpi, int *sadperbit, int qindex) {
548
556k
  switch (cpi->common.seq_params->bit_depth) {
549
415k
    case AOM_BITS_8: *sadperbit = sad_per_bit_lut_8[qindex]; break;
550
64.5k
    case AOM_BITS_10: *sadperbit = sad_per_bit_lut_10[qindex]; break;
551
75.9k
    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
556k
  }
555
556k
}
556
557
static void set_block_thresholds(const AV1_COMMON *cm, RD_OPT *rd,
558
145k
                                 int use_nonrd_pick_mode) {
559
145k
  int i, bsize, segment_id;
560
145k
  THR_MODES mode_indices[RTC_REFS * RTC_MODES] = { 0 };
561
145k
  int num_modes_count = use_nonrd_pick_mode ? 0 : MAX_MODES;
562
563
145k
  if (use_nonrd_pick_mode) {
564
204k
    for (int r_idx = 0; r_idx < RTC_REFS; r_idx++) {
565
163k
      const MV_REFERENCE_FRAME ref = real_time_ref_combos[r_idx][0];
566
163k
      if (ref != INTRA_FRAME) {
567
613k
        for (i = 0; i < RTC_INTER_MODES; i++)
568
491k
          mode_indices[num_modes_count++] =
569
491k
              mode_idx[ref][mode_offset(inter_mode_list[i])];
570
122k
      } else {
571
204k
        for (i = 0; i < RTC_INTRA_MODES; i++)
572
163k
          mode_indices[num_modes_count++] =
573
163k
              mode_idx[ref][mode_offset(intra_mode_list[i])];
574
40.9k
      }
575
163k
    }
576
40.9k
  }
577
578
1.30M
  for (segment_id = 0; segment_id < MAX_SEGMENTS; ++segment_id) {
579
1.16M
    const int qindex = clamp(
580
1.16M
        av1_get_qindex(&cm->seg, segment_id, cm->quant_params.base_qindex) +
581
1.16M
            cm->quant_params.y_dc_delta_q,
582
1.16M
        0, MAXQ);
583
1.16M
    const int q = compute_rd_thresh_factor(qindex, cm->seq_params->bit_depth);
584
585
26.7M
    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
25.5M
      const int t = q * rd_thresh_block_size_factor[bsize];
589
25.5M
      const int thresh_max = INT_MAX / t;
590
591
3.24G
      for (i = 0; i < num_modes_count; ++i) {
592
3.22G
        const int mode_index = use_nonrd_pick_mode ? mode_indices[i] : i;
593
3.22G
        rd->threshes[segment_id][bsize][mode_index] =
594
3.22G
            rd->thresh_mult[mode_index] < thresh_max
595
3.22G
                ? rd->thresh_mult[mode_index] * t / 4
596
3.22G
                : INT_MAX;
597
3.22G
      }
598
25.5M
    }
599
1.16M
  }
600
145k
}
601
602
void av1_fill_coeff_costs(CoeffCosts *coeff_costs, FRAME_CONTEXT *fc,
603
560k
                          const int num_planes) {
604
560k
  const int nplanes = AOMMIN(num_planes, PLANE_TYPES);
605
4.32M
  for (int eob_multi_size = 0; eob_multi_size < 7; ++eob_multi_size) {
606
8.89M
    for (int plane = 0; plane < nplanes; ++plane) {
607
5.12M
      LV_MAP_EOB_COST *pcost = &coeff_costs->eob_costs[eob_multi_size][plane];
608
609
15.2M
      for (int ctx = 0; ctx < 2; ++ctx) {
610
10.0M
        aom_cdf_prob *pcdf;
611
10.0M
        switch (eob_multi_size) {
612
1.52M
          case 0: pcdf = fc->eob_flag_cdf16[plane][ctx]; break;
613
1.51M
          case 1: pcdf = fc->eob_flag_cdf32[plane][ctx]; break;
614
1.51M
          case 2: pcdf = fc->eob_flag_cdf64[plane][ctx]; break;
615
1.51M
          case 3: pcdf = fc->eob_flag_cdf128[plane][ctx]; break;
616
1.51M
          case 4: pcdf = fc->eob_flag_cdf256[plane][ctx]; break;
617
1.51M
          case 5: pcdf = fc->eob_flag_cdf512[plane][ctx]; break;
618
1.51M
          case 6:
619
1.51M
          default: pcdf = fc->eob_flag_cdf1024[plane][ctx]; break;
620
10.0M
        }
621
10.0M
        av1_cost_tokens_from_cdf(pcost->eob_cost[ctx], pcdf, NULL);
622
10.0M
      }
623
5.12M
    }
624
3.73M
  }
625
3.38M
  for (int tx_size = 0; tx_size < TX_SIZES; ++tx_size) {
626
6.68M
    for (int plane = 0; plane < nplanes; ++plane) {
627
3.89M
      LV_MAP_COEFF_COST *pcost = &coeff_costs->coeff_costs[tx_size][plane];
628
629
52.6M
      for (int ctx = 0; ctx < TXB_SKIP_CONTEXTS; ++ctx)
630
48.7M
        av1_cost_tokens_from_cdf(pcost->txb_skip_cost[ctx],
631
48.7M
                                 fc->txb_skip_cdf[tx_size][ctx], NULL);
632
633
19.0M
      for (int ctx = 0; ctx < SIG_COEF_CONTEXTS_EOB; ++ctx)
634
15.1M
        av1_cost_tokens_from_cdf(pcost->base_eob_cost[ctx],
635
15.1M
                                 fc->coeff_base_eob_cdf[tx_size][plane][ctx],
636
15.1M
                                 NULL);
637
148M
      for (int ctx = 0; ctx < SIG_COEF_CONTEXTS; ++ctx)
638
144M
        av1_cost_tokens_from_cdf(pcost->base_cost[ctx],
639
144M
                                 fc->coeff_base_cdf[tx_size][plane][ctx], NULL);
640
641
165M
      for (int ctx = 0; ctx < SIG_COEF_CONTEXTS; ++ctx) {
642
161M
        pcost->base_cost[ctx][4] = 0;
643
161M
        pcost->base_cost[ctx][5] = pcost->base_cost[ctx][1] +
644
161M
                                   av1_cost_literal(1) -
645
161M
                                   pcost->base_cost[ctx][0];
646
161M
        pcost->base_cost[ctx][6] =
647
161M
            pcost->base_cost[ctx][2] - pcost->base_cost[ctx][1];
648
161M
        pcost->base_cost[ctx][7] =
649
161M
            pcost->base_cost[ctx][3] - pcost->base_cost[ctx][2];
650
161M
      }
651
652
38.0M
      for (int ctx = 0; ctx < EOB_COEF_CONTEXTS; ++ctx)
653
34.1M
        av1_cost_tokens_from_cdf(pcost->eob_extra_cost[ctx],
654
34.1M
                                 fc->eob_extra_cdf[tx_size][plane][ctx], NULL);
655
656
15.3M
      for (int ctx = 0; ctx < DC_SIGN_CONTEXTS; ++ctx)
657
11.4M
        av1_cost_tokens_from_cdf(pcost->dc_sign_cost[ctx],
658
11.4M
                                 fc->dc_sign_cdf[plane][ctx], NULL);
659
660
84.4M
      for (int ctx = 0; ctx < LEVEL_CONTEXTS; ++ctx) {
661
80.5M
        int br_rate[BR_CDF_SIZE];
662
80.5M
        int prev_cost = 0;
663
80.5M
        int i, j;
664
80.5M
        av1_cost_tokens_from_cdf(
665
80.5M
            br_rate, fc->coeff_br_cdf[AOMMIN(tx_size, TX_32X32)][plane][ctx],
666
80.5M
            NULL);
667
380M
        for (i = 0; i < COEFF_BASE_RANGE; i += BR_CDF_SIZE - 1) {
668
1.19G
          for (j = 0; j < BR_CDF_SIZE - 1; j++) {
669
896M
            pcost->lps_cost[ctx][i + j] = prev_cost + br_rate[j];
670
896M
          }
671
300M
          prev_cost += br_rate[j];
672
300M
        }
673
80.5M
        pcost->lps_cost[ctx][i] = prev_cost;
674
80.5M
      }
675
85.2M
      for (int ctx = 0; ctx < LEVEL_CONTEXTS; ++ctx) {
676
81.4M
        pcost->lps_cost[ctx][0 + COEFF_BASE_RANGE + 1] =
677
81.4M
            pcost->lps_cost[ctx][0];
678
1.05G
        for (int i = 1; i <= COEFF_BASE_RANGE; ++i) {
679
976M
          pcost->lps_cost[ctx][i + COEFF_BASE_RANGE + 1] =
680
976M
              pcost->lps_cost[ctx][i] - pcost->lps_cost[ctx][i - 1];
681
976M
        }
682
81.4M
      }
683
3.89M
    }
684
2.79M
  }
685
586k
}
686
687
void av1_fill_mv_costs(const nmv_context *nmvc, int integer_mv, int usehp,
688
209k
                       MvCosts *mv_costs) {
689
  // Avoid accessing 'mv_costs' when it is not allocated.
690
209k
  if (mv_costs == NULL) return;
691
692
138k
  mv_costs->nmv_cost[0] = &mv_costs->nmv_cost_alloc[0][MV_MAX];
693
138k
  mv_costs->nmv_cost[1] = &mv_costs->nmv_cost_alloc[1][MV_MAX];
694
138k
  mv_costs->nmv_cost_hp[0] = &mv_costs->nmv_cost_hp_alloc[0][MV_MAX];
695
138k
  mv_costs->nmv_cost_hp[1] = &mv_costs->nmv_cost_hp_alloc[1][MV_MAX];
696
138k
  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
138k
  } else {
701
138k
    mv_costs->mv_cost_stack =
702
138k
        usehp ? mv_costs->nmv_cost_hp : mv_costs->nmv_cost;
703
138k
    av1_build_nmv_cost_table(mv_costs->nmv_joint_cost, mv_costs->mv_cost_stack,
704
138k
                             nmvc, usehp);
705
138k
  }
706
138k
}
707
708
6.22k
void av1_fill_dv_costs(const nmv_context *ndvc, IntraBCMVCosts *dv_costs) {
709
6.22k
  dv_costs->dv_costs[0] = &dv_costs->dv_costs_alloc[0][MV_MAX];
710
6.22k
  dv_costs->dv_costs[1] = &dv_costs->dv_costs_alloc[1][MV_MAX];
711
6.22k
  av1_build_nmv_cost_table(dv_costs->joint_mv, dv_costs->dv_costs, ndvc,
712
6.22k
                           MV_SUBPEL_NONE);
713
6.22k
}
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
145k
    const CostUpdateFreq cost_upd_freq, SPEED_FEATURES *const sf) {
725
145k
  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
145k
  static const INTERNAL_COST_UPDATE_TYPE
730
145k
      map_cost_upd_to_internal_cost_upd[NUM_COST_UPDATE_TYPES] = {
731
145k
        INTERNAL_COST_UPD_SB, INTERNAL_COST_UPD_SBROW, INTERNAL_COST_UPD_TILE,
732
145k
        INTERNAL_COST_UPD_OFF
733
145k
      };
734
735
145k
  inter_sf->mv_cost_upd_level =
736
145k
      AOMMIN(inter_sf->mv_cost_upd_level,
737
145k
             map_cost_upd_to_internal_cost_upd[cost_upd_freq.mv]);
738
145k
  inter_sf->coeff_cost_upd_level =
739
145k
      AOMMIN(inter_sf->coeff_cost_upd_level,
740
145k
             map_cost_upd_to_internal_cost_upd[cost_upd_freq.coeff]);
741
145k
  inter_sf->mode_cost_upd_level =
742
145k
      AOMMIN(inter_sf->mode_cost_upd_level,
743
145k
             map_cost_upd_to_internal_cost_upd[cost_upd_freq.mode]);
744
145k
  sf->intra_sf.dv_cost_upd_level =
745
145k
      AOMMIN(sf->intra_sf.dv_cost_upd_level,
746
145k
             map_cost_upd_to_internal_cost_upd[cost_upd_freq.dv]);
747
145k
}
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
427k
    const int use_nonrd_pick_mode, const int frames_since_key) {
753
427k
  const int fill_costs =
754
427k
      frame_is_intra_only(cm) ||
755
104k
      (use_nonrd_pick_mode ? frames_since_key < 2
756
104k
                           : (cm->current_frame.frame_number & 0x07) == 1);
757
427k
  return ((!use_nonrd_pick_mode && cost_upd_level != INTERNAL_COST_UPD_OFF) ||
758
165k
          cost_upd_level == INTERNAL_COST_UPD_TILE || fill_costs);
759
427k
}
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
145k
static inline int should_force_mode_cost_update(const AV1_COMP *cpi) {
764
145k
  const REAL_TIME_SPEED_FEATURES *const rt_sf = &cpi->sf.rt_sf;
765
145k
  if (!rt_sf->frame_level_mode_cost_update) {
766
136k
    return false;
767
136k
  }
768
769
8.56k
  if (cpi->oxcf.algo_cfg.cdf_update_mode == 2) {
770
0
    return cpi->frames_since_last_update == 1;
771
8.56k
  } else if (cpi->oxcf.algo_cfg.cdf_update_mode == 1) {
772
8.56k
    if (cpi->svc.number_spatial_layers == 1 &&
773
8.56k
        cpi->svc.number_temporal_layers == 1) {
774
8.56k
      const AV1_COMMON *const cm = &cpi->common;
775
8.56k
      const RATE_CONTROL *const rc = &cpi->rc;
776
777
8.56k
      return frame_is_intra_only(cm) || is_frame_resize_pending(cpi) ||
778
3.98k
             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.56k
    } 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.56k
  }
785
786
0
  return false;
787
8.56k
}
788
789
145k
void av1_initialize_rd_consts(AV1_COMP *cpi) {
790
145k
  AV1_COMMON *const cm = &cpi->common;
791
145k
  MACROBLOCK *const x = &cpi->td.mb;
792
145k
  SPEED_FEATURES *const sf = &cpi->sf;
793
145k
  RD_OPT *const rd = &cpi->rd;
794
145k
  int use_nonrd_pick_mode = cpi->sf.rt_sf.use_nonrd_pick_mode;
795
145k
  int frames_since_key = cpi->rc.frames_since_key;
796
797
145k
  const GF_GROUP *const gf_group = &cpi->ppi->gf_group;
798
145k
  const int boost_index = AOMMIN(15, (cpi->ppi->p_rc.gfu_boost / 100));
799
145k
  const int layer_depth = AOMMIN(gf_group->layer_depth[cpi->gf_frame_index], 6);
800
145k
  const FRAME_TYPE frame_type = cm->current_frame.frame_type;
801
802
145k
  const int qindex_rdmult =
803
145k
      cm->quant_params.base_qindex + cm->quant_params.y_dc_delta_q;
804
145k
  rd->RDMULT = av1_compute_rd_mult(
805
145k
      qindex_rdmult, cm->seq_params->bit_depth,
806
145k
      cpi->ppi->gf_group.update_type[cpi->gf_frame_index], layer_depth,
807
145k
      boost_index, frame_type, cpi->oxcf.q_cfg.use_fixed_qp_offsets,
808
145k
      is_stat_consumption_stage(cpi), cpi->oxcf.tune_cfg.tuning,
809
145k
      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
145k
  av1_set_error_per_bit(&x->errorperbit, rd->RDMULT);
821
822
145k
  set_block_thresholds(cm, rd, cpi->sf.rt_sf.use_nonrd_pick_mode);
823
824
145k
  populate_unified_cost_update_freq(cpi->oxcf.cost_upd_freq, sf);
825
145k
  const INTER_MODE_SPEED_FEATURES *const inter_sf = &cpi->sf.inter_sf;
826
  // Frame level mv cost update
827
145k
  if (is_frame_level_cost_upd_freq_set(cm, inter_sf->mv_cost_upd_level,
828
145k
                                       use_nonrd_pick_mode, frames_since_key))
829
140k
    av1_fill_mv_costs(&cm->fc->nmvc, cm->features.cur_frame_force_integer_mv,
830
140k
                      cm->features.allow_high_precision_mv, x->mv_costs);
831
832
  // Frame level coefficient cost update
833
145k
  if (is_frame_level_cost_upd_freq_set(cm, inter_sf->coeff_cost_upd_level,
834
145k
                                       use_nonrd_pick_mode, frames_since_key))
835
140k
    av1_fill_coeff_costs(&x->coeff_costs, cm->fc, av1_num_planes(cm));
836
837
  // Frame level mode cost update
838
145k
  if (should_force_mode_cost_update(cpi) ||
839
136k
      is_frame_level_cost_upd_freq_set(cm, inter_sf->mode_cost_upd_level,
840
136k
                                       use_nonrd_pick_mode, frames_since_key))
841
142k
    av1_fill_mode_rates(cm, &x->mode_costs, cm->fc);
842
843
  // Frame level dv cost update
844
145k
  if (av1_need_dv_costs(cpi)) {
845
6.22k
    if (cpi->td.dv_costs_alloc == NULL) {
846
6.22k
      CHECK_MEM_ERROR(
847
6.22k
          cm, cpi->td.dv_costs_alloc,
848
6.22k
          (IntraBCMVCosts *)aom_malloc(sizeof(*cpi->td.dv_costs_alloc)));
849
6.22k
      cpi->td.mb.dv_costs = cpi->td.dv_costs_alloc;
850
6.22k
    }
851
6.22k
    av1_fill_dv_costs(&cm->fc->ndvc, x->dv_costs);
852
6.22k
  }
853
145k
}
854
855
3.83M
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.83M
  static const int rate_tab_q10[] = {
869
3.83M
    65536, 6086, 5574, 5275, 5063, 4899, 4764, 4651, 4553, 4389, 4255, 4142,
870
3.83M
    4044,  3958, 3881, 3811, 3748, 3635, 3538, 3453, 3376, 3307, 3244, 3186,
871
3.83M
    3133,  3037, 2952, 2877, 2809, 2747, 2690, 2638, 2589, 2501, 2423, 2353,
872
3.83M
    2290,  2232, 2179, 2130, 2084, 2001, 1928, 1862, 1802, 1748, 1698, 1651,
873
3.83M
    1608,  1530, 1460, 1398, 1342, 1290, 1243, 1199, 1159, 1086, 1021, 963,
874
3.83M
    911,   864,  821,  781,  745,  680,  623,  574,  530,  490,  455,  424,
875
3.83M
    395,   345,  304,  269,  239,  213,  190,  171,  154,  126,  104,  87,
876
3.83M
    73,    61,   52,   44,   38,   28,   21,   16,   12,   10,   8,    6,
877
3.83M
    5,     3,    2,    1,    1,    1,    0,    0,
878
3.83M
  };
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.83M
  static const int dist_tab_q10[] = {
887
3.83M
    0,    0,    1,    1,    1,    2,    2,    2,    3,    3,    4,    5,
888
3.83M
    5,    6,    7,    7,    8,    9,    11,   12,   13,   15,   16,   17,
889
3.83M
    18,   21,   24,   26,   29,   31,   34,   36,   39,   44,   49,   54,
890
3.83M
    59,   64,   69,   73,   78,   88,   97,   106,  115,  124,  133,  142,
891
3.83M
    151,  167,  184,  200,  215,  231,  245,  260,  274,  301,  327,  351,
892
3.83M
    375,  397,  418,  439,  458,  495,  528,  559,  587,  613,  637,  659,
893
3.83M
    680,  717,  749,  777,  801,  823,  842,  859,  874,  899,  919,  936,
894
3.83M
    949,  960,  969,  977,  983,  994,  1001, 1006, 1010, 1013, 1015, 1017,
895
3.83M
    1018, 1020, 1022, 1022, 1023, 1023, 1023, 1024,
896
3.83M
  };
897
3.83M
  static const int xsq_iq_q10[] = {
898
3.83M
    0,      4,      8,      12,     16,     20,     24,     28,     32,
899
3.83M
    40,     48,     56,     64,     72,     80,     88,     96,     112,
900
3.83M
    128,    144,    160,    176,    192,    208,    224,    256,    288,
901
3.83M
    320,    352,    384,    416,    448,    480,    544,    608,    672,
902
3.83M
    736,    800,    864,    928,    992,    1120,   1248,   1376,   1504,
903
3.83M
    1632,   1760,   1888,   2016,   2272,   2528,   2784,   3040,   3296,
904
3.83M
    3552,   3808,   4064,   4576,   5088,   5600,   6112,   6624,   7136,
905
3.83M
    7648,   8160,   9184,   10208,  11232,  12256,  13280,  14304,  15328,
906
3.83M
    16352,  18400,  20448,  22496,  24544,  26592,  28640,  30688,  32736,
907
3.83M
    36832,  40928,  45024,  49120,  53216,  57312,  61408,  65504,  73696,
908
3.83M
    81888,  90080,  98272,  106464, 114656, 122848, 131040, 147424, 163808,
909
3.83M
    180192, 196576, 212960, 229344, 245728,
910
3.83M
  };
911
3.83M
  const int tmp = (xsq_q10 >> 2) + 8;
912
3.83M
  const int k = get_msb(tmp) - 3;
913
3.83M
  const int xq = (k << 3) + ((tmp >> k) & 0x7);
914
3.83M
  const int one_q10 = 1 << 10;
915
3.83M
  const int a_q10 = ((xsq_q10 - xsq_iq_q10[xq]) << 10) >> (2 + k);
916
3.83M
  const int b_q10 = one_q10 - a_q10;
917
3.83M
  *r_q10 = (rate_tab_q10[xq] * b_q10 + rate_tab_q10[xq + 1] * a_q10) >> 10;
918
3.83M
  *d_q10 = (dist_tab_q10[xq] * b_q10 + dist_tab_q10[xq + 1] * a_q10) >> 10;
919
3.83M
}
920
921
void av1_model_rd_from_var_lapndz(int64_t var, unsigned int n_log2,
922
                                  unsigned int qstep, int *rate,
923
3.85M
                                  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.85M
  if (var == 0) {
931
18.2k
    *rate = 0;
932
18.2k
    *dist = 0;
933
3.83M
  } else {
934
3.83M
    int d_q10, r_q10;
935
3.83M
    static const uint32_t MAX_XSQ_Q10 = 245727;
936
3.83M
    const uint64_t xsq_q10_64 =
937
3.83M
        (((uint64_t)qstep * qstep << (n_log2 + 10)) + (var >> 1)) / var;
938
3.83M
    const int xsq_q10 = (int)AOMMIN(xsq_q10_64, MAX_XSQ_Q10);
939
3.83M
    model_rd_norm(xsq_q10, &r_q10, &d_q10);
940
3.83M
    *rate = ROUND_POWER_OF_TWO(r_q10 << n_log2, 10 - AV1_PROB_COST_SHIFT);
941
3.83M
    *dist = (var * (int64_t)d_q10 + 512) >> 10;
942
3.83M
  }
943
3.85M
}
944
945
0
static double interp_cubic(const double *p, double x) {
946
0
  return p[1] + 0.5 * x *
947
0
                    (p[2] - p[0] +
948
0
                     x * (2.0 * p[0] - 5.0 * p[1] + 4.0 * p[2] - p[3] +
949
0
                          x * (3.0 * (p[1] - p[2]) + p[3] - p[0])));
950
0
}
951
952
void av1_interp_cubic_rate_dist_c(const double *p1, const double *p2, double x,
953
0
                                  double rate_dist_f[2]) {
954
0
  rate_dist_f[0] = interp_cubic(p1, x);
955
0
  rate_dist_f[1] = interp_cubic(p2, x);
956
0
}
957
958
/*
959
static double interp_bicubic(const double *p, int p_stride, double x,
960
                             double y) {
961
  double q[4];
962
  q[0] = interp_cubic(p, x);
963
  q[1] = interp_cubic(p + p_stride, x);
964
  q[2] = interp_cubic(p + 2 * p_stride, x);
965
  q[3] = interp_cubic(p + 3 * p_stride, x);
966
  return interp_cubic(q, y);
967
}
968
*/
969
970
static const uint8_t bsize_curvfit_model_cat_lookup[BLOCK_SIZES_ALL] = {
971
  0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 1, 1, 2, 2, 3, 3
972
};
973
974
3.78M
static int sse_norm_curvfit_model_cat_lookup(double sse_norm) {
975
3.78M
  return (sse_norm > 16.0);
976
3.78M
}
977
978
static const double interp_rgrid_curv[4][65] = {
979
  {
980
      0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
981
      0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
982
      0.000000,    118.257702,  120.210658,  121.434853,  122.100487,
983
      122.377758,  122.436865,  72.290102,   96.974289,   101.652727,
984
      126.830141,  140.417377,  157.644879,  184.315291,  215.823873,
985
      262.300169,  335.919859,  420.624173,  519.185032,  619.854243,
986
      726.053595,  827.663369,  933.127475,  1037.988755, 1138.839609,
987
      1233.342933, 1333.508064, 1428.760126, 1533.396364, 1616.952052,
988
      1744.539319, 1803.413586, 1951.466618, 1994.227838, 2086.031680,
989
      2148.635443, 2239.068450, 2222.590637, 2338.859809, 2402.929011,
990
      2418.727875, 2435.342670, 2471.159469, 2523.187446, 2591.183827,
991
      2674.905840, 2774.110714, 2888.555675, 3017.997952, 3162.194773,
992
      3320.903365, 3493.880956, 3680.884773, 3881.672045, 4096.000000,
993
  },
994
  {
995
      0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
996
      0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
997
      0.000000,    13.087244,   15.919735,   25.930313,   24.412411,
998
      28.567417,   29.924194,   30.857010,   32.742979,   36.382570,
999
      39.210386,   42.265690,   47.378572,   57.014850,   82.740067,
1000
      137.346562,  219.968084,  316.781856,  415.643773,  516.706538,
1001
      614.914364,  714.303763,  815.512135,  911.210485,  1008.501528,
1002
      1109.787854, 1213.772279, 1322.922561, 1414.752579, 1510.505641,
1003
      1615.741888, 1697.989032, 1780.123933, 1847.453790, 1913.742309,
1004
      1960.828122, 2047.500168, 2085.454095, 2129.230668, 2158.171824,
1005
      2182.231724, 2217.684864, 2269.589211, 2337.264824, 2420.618694,
1006
      2519.557814, 2633.989178, 2763.819779, 2908.956609, 3069.306660,
1007
      3244.776927, 3435.274401, 3640.706076, 3860.978945, 4096.000000,
1008
  },
1009
  {
1010
      0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
1011
      0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
1012
      0.000000,    4.656893,    5.123633,    5.594132,    6.162376,
1013
      6.918433,    7.768444,    8.739415,    10.105862,   11.477328,
1014
      13.236604,   15.421030,   19.093623,   25.801871,   46.724612,
1015
      98.841054,   181.113466,  272.586364,  359.499769,  445.546343,
1016
      525.944439,  605.188743,  681.793483,  756.668359,  838.486885,
1017
      926.950356,  1015.482542, 1113.353926, 1204.897193, 1288.871992,
1018
      1373.464145, 1455.746628, 1527.796460, 1588.475066, 1658.144771,
1019
      1710.302500, 1807.563351, 1863.197608, 1927.281616, 1964.450872,
1020
      2022.719898, 2100.041145, 2185.205712, 2280.993936, 2387.616216,
1021
      2505.282950, 2634.204540, 2774.591385, 2926.653884, 3090.602436,
1022
      3266.647443, 3454.999303, 3655.868416, 3869.465182, 4096.000000,
1023
  },
1024
  {
1025
      0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
1026
      0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
1027
      0.000000,    0.337370,    0.391916,    0.468839,    0.566334,
1028
      0.762564,    1.069225,    1.384361,    1.787581,    2.293948,
1029
      3.251909,    4.412991,    8.050068,    11.606073,   27.668092,
1030
      65.227758,   128.463938,  202.097653,  262.715851,  312.464873,
1031
      355.601398,  400.609054,  447.201352,  495.761568,  552.871938,
1032
      619.067625,  691.984883,  773.753288,  860.628503,  946.262808,
1033
      1019.805896, 1106.061360, 1178.422145, 1244.852258, 1302.173987,
1034
      1399.650266, 1548.092912, 1545.928652, 1670.817500, 1694.523823,
1035
      1779.195362, 1882.155494, 1990.662097, 2108.325181, 2235.456119,
1036
      2372.366287, 2519.367059, 2676.769812, 2844.885918, 3024.026754,
1037
      3214.503695, 3416.628115, 3630.711389, 3857.064892, 4096.000000,
1038
  },
1039
};
1040
1041
static const double interp_dgrid_curv[3][65] = {
1042
  {
1043
      16.000000, 15.962891, 15.925174, 15.886888, 15.848074, 15.808770,
1044
      15.769015, 15.728850, 15.688313, 15.647445, 15.606284, 15.564870,
1045
      15.525918, 15.483820, 15.373330, 15.126844, 14.637442, 14.184387,
1046
      13.560070, 12.880717, 12.165995, 11.378144, 10.438769, 9.130790,
1047
      7.487633,  5.688649,  4.267515,  3.196300,  2.434201,  1.834064,
1048
      1.369920,  1.035921,  0.775279,  0.574895,  0.427232,  0.314123,
1049
      0.233236,  0.171440,  0.128188,  0.092762,  0.067569,  0.049324,
1050
      0.036330,  0.027008,  0.019853,  0.015539,  0.011093,  0.008733,
1051
      0.007624,  0.008105,  0.005427,  0.004065,  0.003427,  0.002848,
1052
      0.002328,  0.001865,  0.001457,  0.001103,  0.000801,  0.000550,
1053
      0.000348,  0.000193,  0.000085,  0.000021,  0.000000,
1054
  },
1055
  {
1056
      16.000000, 15.996116, 15.984769, 15.966413, 15.941505, 15.910501,
1057
      15.873856, 15.832026, 15.785466, 15.734633, 15.679981, 15.621967,
1058
      15.560961, 15.460157, 15.288367, 15.052462, 14.466922, 13.921212,
1059
      13.073692, 12.222005, 11.237799, 9.985848,  8.898823,  7.423519,
1060
      5.995325,  4.773152,  3.744032,  2.938217,  2.294526,  1.762412,
1061
      1.327145,  1.020728,  0.765535,  0.570548,  0.425833,  0.313825,
1062
      0.232959,  0.171324,  0.128174,  0.092750,  0.067558,  0.049319,
1063
      0.036330,  0.027008,  0.019853,  0.015539,  0.011093,  0.008733,
1064
      0.007624,  0.008105,  0.005427,  0.004065,  0.003427,  0.002848,
1065
      0.002328,  0.001865,  0.001457,  0.001103,  0.000801,  0.000550,
1066
      0.000348,  0.000193,  0.000085,  0.000021,  -0.000000,
1067
  },
1068
};
1069
1070
void av1_model_rd_curvfit(BLOCK_SIZE bsize, double sse_norm, double xqr,
1071
3.78M
                          double rate_dist_f[2]) {
1072
3.78M
  const double x_start = -15.5;
1073
3.78M
  const double x_end = 16.5;
1074
3.78M
  const double x_step = 0.5;
1075
3.78M
  const double epsilon = 1e-6;
1076
3.78M
  const int rcat = bsize_curvfit_model_cat_lookup[bsize];
1077
3.78M
  const int dcat = sse_norm_curvfit_model_cat_lookup(sse_norm);
1078
3.78M
  (void)x_end;
1079
1080
3.78M
  xqr = AOMMAX(xqr, x_start + x_step + epsilon);
1081
3.78M
  xqr = AOMMIN(xqr, x_end - x_step - epsilon);
1082
3.78M
  const double x = (xqr - x_start) / x_step;
1083
3.78M
  const int xi = (int)floor(x);
1084
3.78M
  const double xo = x - xi;
1085
1086
3.78M
  assert(xi > 0);
1087
1088
3.78M
  const double *prate = &interp_rgrid_curv[rcat][(xi - 1)];
1089
3.78M
  const double *pdist = &interp_dgrid_curv[dcat][(xi - 1)];
1090
3.78M
  av1_interp_cubic_rate_dist(prate, pdist, xo, rate_dist_f);
1091
3.78M
}
1092
1093
static void get_entropy_contexts_plane(BLOCK_SIZE plane_bsize,
1094
                                       const struct macroblockd_plane *pd,
1095
                                       ENTROPY_CONTEXT t_above[MAX_MIB_SIZE],
1096
192M
                                       ENTROPY_CONTEXT t_left[MAX_MIB_SIZE]) {
1097
192M
  const int num_4x4_w = mi_size_wide[plane_bsize];
1098
192M
  const int num_4x4_h = mi_size_high[plane_bsize];
1099
192M
  const ENTROPY_CONTEXT *const above = pd->above_entropy_context;
1100
192M
  const ENTROPY_CONTEXT *const left = pd->left_entropy_context;
1101
1102
192M
  memcpy(t_above, above, sizeof(ENTROPY_CONTEXT) * num_4x4_w);
1103
192M
  memcpy(t_left, left, sizeof(ENTROPY_CONTEXT) * num_4x4_h);
1104
192M
}
1105
1106
void av1_get_entropy_contexts(BLOCK_SIZE plane_bsize,
1107
                              const struct macroblockd_plane *pd,
1108
                              ENTROPY_CONTEXT t_above[MAX_MIB_SIZE],
1109
192M
                              ENTROPY_CONTEXT t_left[MAX_MIB_SIZE]) {
1110
192M
  assert(plane_bsize < BLOCK_SIZES_ALL);
1111
192M
  get_entropy_contexts_plane(plane_bsize, pd, t_above, t_left);
1112
192M
}
1113
1114
// Special clamping used in the encoder when calculating a prediction
1115
//
1116
// Logically, all pixel fetches used for prediction are clamped against the
1117
// edges of the frame. But doing this directly is slow, so instead we allocate
1118
// a finite border around the frame and fill it with copies of the outermost
1119
// pixels.
1120
//
1121
// Since this border is finite, we need to clamp the motion vector before
1122
// prediction in order to avoid out-of-bounds reads. At the same time, this
1123
// clamp must not change the prediction result.
1124
//
1125
// We can balance both of these concerns by calculating how far we would have
1126
// to go in each direction before the extended prediction region (the current
1127
// block + AOM_INTERP_EXTEND many pixels around the block) would be mapped
1128
// so that it touches the frame only at one row or column. This is a special
1129
// point because any more extreme MV will always lead to the same prediction.
1130
// So it is safe to clamp at that point.
1131
//
1132
// In the worst case, this requires a border of
1133
//   max_block_width + 2*AOM_INTERP_EXTEND = 128 + 2*4 = 136 pixels
1134
// around the frame edges.
1135
static inline void enc_clamp_mv(const AV1_COMMON *cm, const MACROBLOCKD *xd,
1136
3.74M
                                MV *mv) {
1137
3.74M
  int bw = xd->width << MI_SIZE_LOG2;
1138
3.74M
  int bh = xd->height << MI_SIZE_LOG2;
1139
1140
3.74M
  int px_to_left_edge = xd->mi_col << MI_SIZE_LOG2;
1141
3.74M
  int px_to_right_edge = (cm->mi_params.mi_cols - xd->mi_col) << MI_SIZE_LOG2;
1142
3.74M
  int px_to_top_edge = xd->mi_row << MI_SIZE_LOG2;
1143
3.74M
  int px_to_bottom_edge = (cm->mi_params.mi_rows - xd->mi_row) << MI_SIZE_LOG2;
1144
1145
3.74M
  const SubpelMvLimits mv_limits = {
1146
3.74M
    .col_min = -GET_MV_SUBPEL(px_to_left_edge + bw + AOM_INTERP_EXTEND),
1147
3.74M
    .col_max = GET_MV_SUBPEL(px_to_right_edge + AOM_INTERP_EXTEND),
1148
3.74M
    .row_min = -GET_MV_SUBPEL(px_to_top_edge + bh + AOM_INTERP_EXTEND),
1149
3.74M
    .row_max = GET_MV_SUBPEL(px_to_bottom_edge + AOM_INTERP_EXTEND)
1150
3.74M
  };
1151
3.74M
  clamp_mv(mv, &mv_limits);
1152
3.74M
}
1153
1154
void av1_mv_pred(const AV1_COMP *cpi, MACROBLOCK *x, uint8_t *ref_y_buffer,
1155
2.42M
                 int ref_y_stride, int ref_frame, BLOCK_SIZE block_size) {
1156
2.42M
  const MV_REFERENCE_FRAME ref_frames[2] = { ref_frame, NONE_FRAME };
1157
2.42M
  const int_mv ref_mv =
1158
2.42M
      av1_get_ref_mv_from_stack(0, ref_frames, 0, &x->mbmi_ext);
1159
2.42M
  const int_mv ref_mv1 =
1160
2.42M
      av1_get_ref_mv_from_stack(0, ref_frames, 1, &x->mbmi_ext);
1161
2.42M
  MV pred_mv[MAX_MV_REF_CANDIDATES + 1];
1162
2.42M
  int num_mv_refs = 0;
1163
2.42M
  pred_mv[num_mv_refs++] = ref_mv.as_mv;
1164
2.42M
  if (ref_mv.as_int != ref_mv1.as_int) {
1165
1.32M
    pred_mv[num_mv_refs++] = ref_mv1.as_mv;
1166
1.32M
  }
1167
1168
2.42M
  assert(num_mv_refs <= (int)(sizeof(pred_mv) / sizeof(pred_mv[0])));
1169
1170
2.42M
  const uint8_t *const src_y_ptr = x->plane[0].src.buf;
1171
2.42M
  int zero_seen = 0;
1172
2.42M
  int best_sad = INT_MAX;
1173
2.42M
  int max_mv = 0;
1174
  // Get the sad for each candidate reference mv.
1175
6.17M
  for (int i = 0; i < num_mv_refs; ++i) {
1176
3.74M
    MV *this_mv = &pred_mv[i];
1177
3.74M
    enc_clamp_mv(&cpi->common, &x->e_mbd, this_mv);
1178
1179
3.74M
    const int fp_row = (this_mv->row + 3 + (this_mv->row >= 0)) >> 3;
1180
3.74M
    const int fp_col = (this_mv->col + 3 + (this_mv->col >= 0)) >> 3;
1181
3.74M
    max_mv = AOMMAX(max_mv, AOMMAX(abs(this_mv->row), abs(this_mv->col)) >> 3);
1182
1183
3.74M
    if (fp_row == 0 && fp_col == 0 && zero_seen) continue;
1184
3.72M
    zero_seen |= (fp_row == 0 && fp_col == 0);
1185
1186
3.72M
    const uint8_t *const ref_y_ptr =
1187
3.72M
        &ref_y_buffer[ref_y_stride * fp_row + fp_col];
1188
    // Find sad for current vector.
1189
3.72M
    const int this_sad = cpi->ppi->fn_ptr[block_size].sdf(
1190
3.72M
        src_y_ptr, x->plane[0].src.stride, ref_y_ptr, ref_y_stride);
1191
    // Note if it is the best so far.
1192
3.72M
    if (this_sad < best_sad) {
1193
3.04M
      best_sad = this_sad;
1194
3.04M
    }
1195
3.72M
    if (i == 0)
1196
2.42M
      x->pred_mv0_sad[ref_frame] = this_sad;
1197
1.30M
    else if (i == 1)
1198
1.30M
      x->pred_mv1_sad[ref_frame] = this_sad;
1199
3.72M
  }
1200
1201
  // Note the index of the mv that worked best in the reference list.
1202
2.42M
  x->max_mv_context[ref_frame] = max_mv;
1203
2.42M
  x->pred_mv_sad[ref_frame] = best_sad;
1204
2.42M
}
1205
1206
void av1_setup_pred_block(const MACROBLOCKD *xd,
1207
                          struct buf_2d dst[MAX_MB_PLANE],
1208
                          const YV12_BUFFER_CONFIG *src,
1209
                          const struct scale_factors *scale,
1210
                          const struct scale_factors *scale_uv,
1211
3.91M
                          const int num_planes) {
1212
3.91M
  dst[0].buf = src->y_buffer;
1213
3.91M
  dst[0].stride = src->y_stride;
1214
3.91M
  dst[1].buf = src->u_buffer;
1215
3.91M
  dst[2].buf = src->v_buffer;
1216
3.91M
  dst[1].stride = dst[2].stride = src->uv_stride;
1217
1218
3.91M
  const int mi_row = xd->mi_row;
1219
3.91M
  const int mi_col = xd->mi_col;
1220
11.5M
  for (int i = 0; i < num_planes; ++i) {
1221
7.63M
    setup_pred_plane(dst + i, xd->mi[0]->bsize, dst[i].buf,
1222
7.63M
                     i ? src->uv_crop_width : src->y_crop_width,
1223
7.63M
                     i ? src->uv_crop_height : src->y_crop_height,
1224
7.63M
                     dst[i].stride, mi_row, mi_col, i ? scale_uv : scale,
1225
7.63M
                     xd->plane[i].subsampling_x, xd->plane[i].subsampling_y);
1226
7.63M
  }
1227
3.91M
}
1228
1229
YV12_BUFFER_CONFIG *av1_get_scaled_ref_frame(const AV1_COMP *cpi,
1230
6.54M
                                             int ref_frame) {
1231
6.54M
  assert(ref_frame >= LAST_FRAME && ref_frame <= ALTREF_FRAME);
1232
6.54M
  RefCntBuffer *const scaled_buf = cpi->scaled_ref_buf[ref_frame - 1];
1233
6.54M
  const RefCntBuffer *const ref_buf =
1234
6.54M
      get_ref_frame_buf(&cpi->common, ref_frame);
1235
6.54M
  return (scaled_buf != ref_buf && scaled_buf != NULL) ? &scaled_buf->buf
1236
6.54M
                                                       : NULL;
1237
6.54M
}
1238
1239
int av1_get_switchable_rate(const MACROBLOCK *x, const MACROBLOCKD *xd,
1240
7.79M
                            InterpFilter interp_filter, int dual_filter) {
1241
7.79M
  if (interp_filter == SWITCHABLE) {
1242
7.79M
    const MB_MODE_INFO *const mbmi = xd->mi[0];
1243
7.79M
    int inter_filter_cost = 0;
1244
15.5M
    for (int dir = 0; dir < 2; ++dir) {
1245
15.5M
      if (dir && !dual_filter) break;
1246
7.70M
      const int ctx = av1_get_pred_context_switchable_interp(xd, dir);
1247
7.70M
      const InterpFilter filter =
1248
7.70M
          av1_extract_interp_filter(mbmi->interp_filters, dir);
1249
7.70M
      inter_filter_cost += x->mode_costs.switchable_interp_costs[ctx][filter];
1250
7.70M
    }
1251
7.79M
    return SWITCHABLE_INTERP_RATE_FACTOR * inter_filter_cost;
1252
7.79M
  } else {
1253
1.10k
    return 0;
1254
1.10k
  }
1255
7.79M
}
1256
1257
127k
void av1_set_rd_speed_thresholds(AV1_COMP *cpi) {
1258
127k
  RD_OPT *const rd = &cpi->rd;
1259
1260
  // Set baseline threshold values.
1261
127k
  av1_zero(rd->thresh_mult);
1262
1263
127k
  rd->thresh_mult[THR_NEARESTMV] = 300;
1264
127k
  rd->thresh_mult[THR_NEARESTL2] = 300;
1265
127k
  rd->thresh_mult[THR_NEARESTL3] = 300;
1266
127k
  rd->thresh_mult[THR_NEARESTB] = 300;
1267
127k
  rd->thresh_mult[THR_NEARESTA2] = 300;
1268
127k
  rd->thresh_mult[THR_NEARESTA] = 300;
1269
127k
  rd->thresh_mult[THR_NEARESTG] = 300;
1270
1271
127k
  rd->thresh_mult[THR_NEWMV] = 1000;
1272
127k
  rd->thresh_mult[THR_NEWL2] = 1000;
1273
127k
  rd->thresh_mult[THR_NEWL3] = 1000;
1274
127k
  rd->thresh_mult[THR_NEWB] = 1000;
1275
127k
  rd->thresh_mult[THR_NEWA2] = 1100;
1276
127k
  rd->thresh_mult[THR_NEWA] = 1000;
1277
127k
  rd->thresh_mult[THR_NEWG] = 1000;
1278
1279
127k
  rd->thresh_mult[THR_NEARMV] = 1000;
1280
127k
  rd->thresh_mult[THR_NEARL2] = 1000;
1281
127k
  rd->thresh_mult[THR_NEARL3] = 1000;
1282
127k
  rd->thresh_mult[THR_NEARB] = 1000;
1283
127k
  rd->thresh_mult[THR_NEARA2] = 1000;
1284
127k
  rd->thresh_mult[THR_NEARA] = 1000;
1285
127k
  rd->thresh_mult[THR_NEARG] = 1000;
1286
1287
127k
  rd->thresh_mult[THR_GLOBALMV] = 2200;
1288
127k
  rd->thresh_mult[THR_GLOBALL2] = 2000;
1289
127k
  rd->thresh_mult[THR_GLOBALL3] = 2000;
1290
127k
  rd->thresh_mult[THR_GLOBALB] = 2400;
1291
127k
  rd->thresh_mult[THR_GLOBALA2] = 2000;
1292
127k
  rd->thresh_mult[THR_GLOBALG] = 2000;
1293
127k
  rd->thresh_mult[THR_GLOBALA] = 2400;
1294
1295
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTLA] = 1100;
1296
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTL2A] = 1000;
1297
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTL3A] = 800;
1298
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTGA] = 900;
1299
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTLB] = 1000;
1300
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTL2B] = 1000;
1301
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTL3B] = 1000;
1302
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTGB] = 1000;
1303
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTLA2] = 1000;
1304
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTL2A2] = 1000;
1305
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTL3A2] = 1000;
1306
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTGA2] = 1000;
1307
1308
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTLL2] = 2000;
1309
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTLL3] = 2000;
1310
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTLG] = 2000;
1311
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEARESTBA] = 2000;
1312
1313
127k
  rd->thresh_mult[THR_COMP_NEAR_NEARLA] = 1200;
1314
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEWLA] = 1500;
1315
127k
  rd->thresh_mult[THR_COMP_NEW_NEARESTLA] = 1500;
1316
127k
  rd->thresh_mult[THR_COMP_NEAR_NEWLA] = 1530;
1317
127k
  rd->thresh_mult[THR_COMP_NEW_NEARLA] = 1870;
1318
127k
  rd->thresh_mult[THR_COMP_NEW_NEWLA] = 2400;
1319
127k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLA] = 2750;
1320
1321
127k
  rd->thresh_mult[THR_COMP_NEAR_NEARL2A] = 1200;
1322
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEWL2A] = 1500;
1323
127k
  rd->thresh_mult[THR_COMP_NEW_NEARESTL2A] = 1500;
1324
127k
  rd->thresh_mult[THR_COMP_NEAR_NEWL2A] = 1870;
1325
127k
  rd->thresh_mult[THR_COMP_NEW_NEARL2A] = 1700;
1326
127k
  rd->thresh_mult[THR_COMP_NEW_NEWL2A] = 1800;
1327
127k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL2A] = 2500;
1328
1329
127k
  rd->thresh_mult[THR_COMP_NEAR_NEARL3A] = 1200;
1330
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEWL3A] = 1500;
1331
127k
  rd->thresh_mult[THR_COMP_NEW_NEARESTL3A] = 1500;
1332
127k
  rd->thresh_mult[THR_COMP_NEAR_NEWL3A] = 1700;
1333
127k
  rd->thresh_mult[THR_COMP_NEW_NEARL3A] = 1700;
1334
127k
  rd->thresh_mult[THR_COMP_NEW_NEWL3A] = 2000;
1335
127k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL3A] = 3000;
1336
1337
127k
  rd->thresh_mult[THR_COMP_NEAR_NEARGA] = 1320;
1338
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEWGA] = 1500;
1339
127k
  rd->thresh_mult[THR_COMP_NEW_NEARESTGA] = 1500;
1340
127k
  rd->thresh_mult[THR_COMP_NEAR_NEWGA] = 2040;
1341
127k
  rd->thresh_mult[THR_COMP_NEW_NEARGA] = 1700;
1342
127k
  rd->thresh_mult[THR_COMP_NEW_NEWGA] = 2000;
1343
127k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALGA] = 2250;
1344
1345
127k
  rd->thresh_mult[THR_COMP_NEAR_NEARLB] = 1200;
1346
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEWLB] = 1500;
1347
127k
  rd->thresh_mult[THR_COMP_NEW_NEARESTLB] = 1500;
1348
127k
  rd->thresh_mult[THR_COMP_NEAR_NEWLB] = 1360;
1349
127k
  rd->thresh_mult[THR_COMP_NEW_NEARLB] = 1700;
1350
127k
  rd->thresh_mult[THR_COMP_NEW_NEWLB] = 2400;
1351
127k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLB] = 2250;
1352
1353
127k
  rd->thresh_mult[THR_COMP_NEAR_NEARL2B] = 1200;
1354
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEWL2B] = 1500;
1355
127k
  rd->thresh_mult[THR_COMP_NEW_NEARESTL2B] = 1500;
1356
127k
  rd->thresh_mult[THR_COMP_NEAR_NEWL2B] = 1700;
1357
127k
  rd->thresh_mult[THR_COMP_NEW_NEARL2B] = 1700;
1358
127k
  rd->thresh_mult[THR_COMP_NEW_NEWL2B] = 2000;
1359
127k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL2B] = 2500;
1360
1361
127k
  rd->thresh_mult[THR_COMP_NEAR_NEARL3B] = 1200;
1362
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEWL3B] = 1500;
1363
127k
  rd->thresh_mult[THR_COMP_NEW_NEARESTL3B] = 1500;
1364
127k
  rd->thresh_mult[THR_COMP_NEAR_NEWL3B] = 1870;
1365
127k
  rd->thresh_mult[THR_COMP_NEW_NEARL3B] = 1700;
1366
127k
  rd->thresh_mult[THR_COMP_NEW_NEWL3B] = 2000;
1367
127k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL3B] = 2500;
1368
1369
127k
  rd->thresh_mult[THR_COMP_NEAR_NEARGB] = 1200;
1370
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEWGB] = 1500;
1371
127k
  rd->thresh_mult[THR_COMP_NEW_NEARESTGB] = 1500;
1372
127k
  rd->thresh_mult[THR_COMP_NEAR_NEWGB] = 1700;
1373
127k
  rd->thresh_mult[THR_COMP_NEW_NEARGB] = 1700;
1374
127k
  rd->thresh_mult[THR_COMP_NEW_NEWGB] = 2000;
1375
127k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALGB] = 2500;
1376
1377
127k
  rd->thresh_mult[THR_COMP_NEAR_NEARLA2] = 1200;
1378
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEWLA2] = 1800;
1379
127k
  rd->thresh_mult[THR_COMP_NEW_NEARESTLA2] = 1500;
1380
127k
  rd->thresh_mult[THR_COMP_NEAR_NEWLA2] = 1700;
1381
127k
  rd->thresh_mult[THR_COMP_NEW_NEARLA2] = 1700;
1382
127k
  rd->thresh_mult[THR_COMP_NEW_NEWLA2] = 2000;
1383
127k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLA2] = 2500;
1384
1385
127k
  rd->thresh_mult[THR_COMP_NEAR_NEARL2A2] = 1200;
1386
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEWL2A2] = 1500;
1387
127k
  rd->thresh_mult[THR_COMP_NEW_NEARESTL2A2] = 1500;
1388
127k
  rd->thresh_mult[THR_COMP_NEAR_NEWL2A2] = 1700;
1389
127k
  rd->thresh_mult[THR_COMP_NEW_NEARL2A2] = 1700;
1390
127k
  rd->thresh_mult[THR_COMP_NEW_NEWL2A2] = 2000;
1391
127k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL2A2] = 2500;
1392
1393
127k
  rd->thresh_mult[THR_COMP_NEAR_NEARL3A2] = 1440;
1394
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEWL3A2] = 1500;
1395
127k
  rd->thresh_mult[THR_COMP_NEW_NEARESTL3A2] = 1500;
1396
127k
  rd->thresh_mult[THR_COMP_NEAR_NEWL3A2] = 1700;
1397
127k
  rd->thresh_mult[THR_COMP_NEW_NEARL3A2] = 1700;
1398
127k
  rd->thresh_mult[THR_COMP_NEW_NEWL3A2] = 2000;
1399
127k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL3A2] = 2500;
1400
1401
127k
  rd->thresh_mult[THR_COMP_NEAR_NEARGA2] = 1200;
1402
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEWGA2] = 1500;
1403
127k
  rd->thresh_mult[THR_COMP_NEW_NEARESTGA2] = 1500;
1404
127k
  rd->thresh_mult[THR_COMP_NEAR_NEWGA2] = 1700;
1405
127k
  rd->thresh_mult[THR_COMP_NEW_NEARGA2] = 1700;
1406
127k
  rd->thresh_mult[THR_COMP_NEW_NEWGA2] = 2000;
1407
127k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALGA2] = 2750;
1408
1409
127k
  rd->thresh_mult[THR_COMP_NEAR_NEARLL2] = 1600;
1410
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEWLL2] = 2000;
1411
127k
  rd->thresh_mult[THR_COMP_NEW_NEARESTLL2] = 2000;
1412
127k
  rd->thresh_mult[THR_COMP_NEAR_NEWLL2] = 2640;
1413
127k
  rd->thresh_mult[THR_COMP_NEW_NEARLL2] = 2200;
1414
127k
  rd->thresh_mult[THR_COMP_NEW_NEWLL2] = 2400;
1415
127k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLL2] = 3200;
1416
1417
127k
  rd->thresh_mult[THR_COMP_NEAR_NEARLL3] = 1600;
1418
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEWLL3] = 2000;
1419
127k
  rd->thresh_mult[THR_COMP_NEW_NEARESTLL3] = 1800;
1420
127k
  rd->thresh_mult[THR_COMP_NEAR_NEWLL3] = 2200;
1421
127k
  rd->thresh_mult[THR_COMP_NEW_NEARLL3] = 2200;
1422
127k
  rd->thresh_mult[THR_COMP_NEW_NEWLL3] = 2400;
1423
127k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLL3] = 3200;
1424
1425
127k
  rd->thresh_mult[THR_COMP_NEAR_NEARLG] = 1760;
1426
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEWLG] = 2400;
1427
127k
  rd->thresh_mult[THR_COMP_NEW_NEARESTLG] = 2000;
1428
127k
  rd->thresh_mult[THR_COMP_NEAR_NEWLG] = 1760;
1429
127k
  rd->thresh_mult[THR_COMP_NEW_NEARLG] = 2640;
1430
127k
  rd->thresh_mult[THR_COMP_NEW_NEWLG] = 2400;
1431
127k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLG] = 3200;
1432
1433
127k
  rd->thresh_mult[THR_COMP_NEAR_NEARBA] = 1600;
1434
127k
  rd->thresh_mult[THR_COMP_NEAREST_NEWBA] = 2000;
1435
127k
  rd->thresh_mult[THR_COMP_NEW_NEARESTBA] = 2000;
1436
127k
  rd->thresh_mult[THR_COMP_NEAR_NEWBA] = 2200;
1437
127k
  rd->thresh_mult[THR_COMP_NEW_NEARBA] = 1980;
1438
127k
  rd->thresh_mult[THR_COMP_NEW_NEWBA] = 2640;
1439
127k
  rd->thresh_mult[THR_COMP_GLOBAL_GLOBALBA] = 3200;
1440
1441
127k
  rd->thresh_mult[THR_DC] = 1000;
1442
127k
  rd->thresh_mult[THR_PAETH] = 1000;
1443
127k
  rd->thresh_mult[THR_SMOOTH] = 2200;
1444
127k
  rd->thresh_mult[THR_SMOOTH_V] = 2000;
1445
127k
  rd->thresh_mult[THR_SMOOTH_H] = 2000;
1446
127k
  rd->thresh_mult[THR_H_PRED] = 2000;
1447
127k
  rd->thresh_mult[THR_V_PRED] = 1800;
1448
127k
  rd->thresh_mult[THR_D135_PRED] = 2500;
1449
127k
  rd->thresh_mult[THR_D203_PRED] = 2000;
1450
127k
  rd->thresh_mult[THR_D157_PRED] = 2500;
1451
127k
  rd->thresh_mult[THR_D67_PRED] = 2000;
1452
127k
  rd->thresh_mult[THR_D113_PRED] = 2500;
1453
127k
  rd->thresh_mult[THR_D45_PRED] = 2500;
1454
127k
}
1455
1456
static inline void update_thr_fact(int (*factor_buf)[MAX_MODES],
1457
                                   THR_MODES best_mode_index,
1458
                                   THR_MODES mode_start, THR_MODES mode_end,
1459
                                   BLOCK_SIZE min_size, BLOCK_SIZE max_size,
1460
1.78M
                                   int max_rd_thresh_factor) {
1461
152M
  for (THR_MODES mode = mode_start; mode < mode_end; ++mode) {
1462
901M
    for (BLOCK_SIZE bs = min_size; bs <= max_size; ++bs) {
1463
750M
      int *const fact = &factor_buf[bs][mode];
1464
750M
      if (mode == best_mode_index) {
1465
4.46M
        *fact -= (*fact >> RD_THRESH_LOG_DEC_FACTOR);
1466
746M
      } else {
1467
746M
        *fact = AOMMIN(*fact + RD_THRESH_INC, max_rd_thresh_factor);
1468
746M
      }
1469
750M
    }
1470
150M
  }
1471
1.78M
}
1472
1473
void av1_update_rd_thresh_fact(
1474
    const AV1_COMMON *const cm, int (*factor_buf)[MAX_MODES],
1475
    int use_adaptive_rd_thresh, BLOCK_SIZE bsize, THR_MODES best_mode_index,
1476
    THR_MODES inter_mode_start, THR_MODES inter_mode_end,
1477
894k
    THR_MODES intra_mode_start, THR_MODES intra_mode_end) {
1478
894k
  assert(use_adaptive_rd_thresh > 0);
1479
894k
  const int max_rd_thresh_factor = use_adaptive_rd_thresh * RD_THRESH_MAX_FACT;
1480
1481
894k
  const int bsize_is_1_to_4 = bsize > cm->seq_params->sb_size;
1482
894k
  BLOCK_SIZE min_size, max_size;
1483
894k
  if (bsize_is_1_to_4) {
1484
    // This part handles block sizes with 1:4 and 4:1 aspect ratios
1485
    // TODO(any): Experiment with threshold update for parent/child blocks
1486
0
    min_size = bsize;
1487
0
    max_size = bsize;
1488
894k
  } else {
1489
894k
    min_size = AOMMAX(bsize - 2, BLOCK_4X4);
1490
894k
    max_size = AOMMIN(bsize + 2, (int)cm->seq_params->sb_size);
1491
894k
  }
1492
1493
894k
  update_thr_fact(factor_buf, best_mode_index, inter_mode_start, inter_mode_end,
1494
894k
                  min_size, max_size, max_rd_thresh_factor);
1495
894k
  update_thr_fact(factor_buf, best_mode_index, intra_mode_start, intra_mode_end,
1496
894k
                  min_size, max_size, max_rd_thresh_factor);
1497
894k
}
1498
1499
int av1_get_intra_cost_penalty(int qindex, int qdelta,
1500
501k
                               aom_bit_depth_t bit_depth) {
1501
501k
  const int q = av1_dc_quant_QTX(qindex, qdelta, bit_depth);
1502
501k
  switch (bit_depth) {
1503
472k
    case AOM_BITS_8: return 20 * q;
1504
13.0k
    case AOM_BITS_10: return 5 * q;
1505
15.9k
    case AOM_BITS_12: return ROUND_POWER_OF_TWO(5 * q, 2);
1506
0
    default:
1507
      assert(0 && "bit_depth should be AOM_BITS_8, AOM_BITS_10 or AOM_BITS_12");
1508
0
      return -1;
1509
501k
  }
1510
501k
}