Home | History | Annotate | Download | only in encoder
      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 <math.h>
     14 #include <stdio.h>
     15 
     16 #include "config/av1_rtcd.h"
     17 
     18 #include "aom_dsp/aom_dsp_common.h"
     19 #include "aom_mem/aom_mem.h"
     20 #include "aom_ports/bitops.h"
     21 #include "aom_ports/mem.h"
     22 #include "aom_ports/system_state.h"
     23 
     24 #include "av1/common/common.h"
     25 #include "av1/common/entropy.h"
     26 #include "av1/common/entropymode.h"
     27 #include "av1/common/mvref_common.h"
     28 #include "av1/common/pred_common.h"
     29 #include "av1/common/quant_common.h"
     30 #include "av1/common/reconinter.h"
     31 #include "av1/common/reconintra.h"
     32 #include "av1/common/seg_common.h"
     33 
     34 #include "av1/encoder/av1_quantize.h"
     35 #include "av1/encoder/cost.h"
     36 #include "av1/encoder/encodemb.h"
     37 #include "av1/encoder/encodemv.h"
     38 #include "av1/encoder/encoder.h"
     39 #include "av1/encoder/encodetxb.h"
     40 #include "av1/encoder/mcomp.h"
     41 #include "av1/encoder/ratectrl.h"
     42 #include "av1/encoder/rd.h"
     43 #include "av1/encoder/tokenize.h"
     44 
     45 #define RD_THRESH_POW 1.25
     46 
     47 // The baseline rd thresholds for breaking out of the rd loop for
     48 // certain modes are assumed to be based on 8x8 blocks.
     49 // This table is used to correct for block size.
     50 // The factors here are << 2 (2 = x0.5, 32 = x8 etc).
     51 static const uint8_t rd_thresh_block_size_factor[BLOCK_SIZES_ALL] = {
     52   2, 3, 3, 4, 6, 6, 8, 12, 12, 16, 24, 24, 32, 48, 48, 64, 4, 4, 8, 8, 16, 16
     53 };
     54 
     55 static const int use_intra_ext_tx_for_txsize[EXT_TX_SETS_INTRA][EXT_TX_SIZES] =
     56     {
     57       { 1, 1, 1, 1 },  // unused
     58       { 1, 1, 0, 0 },
     59       { 0, 0, 1, 0 },
     60     };
     61 
     62 static const int use_inter_ext_tx_for_txsize[EXT_TX_SETS_INTER][EXT_TX_SIZES] =
     63     {
     64       { 1, 1, 1, 1 },  // unused
     65       { 1, 1, 0, 0 },
     66       { 0, 0, 1, 0 },
     67       { 0, 0, 0, 1 },
     68     };
     69 
     70 static const int av1_ext_tx_set_idx_to_type[2][AOMMAX(EXT_TX_SETS_INTRA,
     71                                                       EXT_TX_SETS_INTER)] = {
     72   {
     73       // Intra
     74       EXT_TX_SET_DCTONLY,
     75       EXT_TX_SET_DTT4_IDTX_1DDCT,
     76       EXT_TX_SET_DTT4_IDTX,
     77   },
     78   {
     79       // Inter
     80       EXT_TX_SET_DCTONLY,
     81       EXT_TX_SET_ALL16,
     82       EXT_TX_SET_DTT9_IDTX_1DDCT,
     83       EXT_TX_SET_DCT_IDTX,
     84   },
     85 };
     86 
     87 void av1_fill_mode_rates(AV1_COMMON *const cm, MACROBLOCK *x,
     88                          FRAME_CONTEXT *fc) {
     89   int i, j;
     90 
     91   for (i = 0; i < PARTITION_CONTEXTS; ++i)
     92     av1_cost_tokens_from_cdf(x->partition_cost[i], fc->partition_cdf[i], NULL);
     93 
     94   if (cm->current_frame.skip_mode_info.skip_mode_flag) {
     95     for (i = 0; i < SKIP_CONTEXTS; ++i) {
     96       av1_cost_tokens_from_cdf(x->skip_mode_cost[i], fc->skip_mode_cdfs[i],
     97                                NULL);
     98     }
     99   }
    100 
    101   for (i = 0; i < SKIP_CONTEXTS; ++i) {
    102     av1_cost_tokens_from_cdf(x->skip_cost[i], fc->skip_cdfs[i], NULL);
    103   }
    104 
    105   for (i = 0; i < KF_MODE_CONTEXTS; ++i)
    106     for (j = 0; j < KF_MODE_CONTEXTS; ++j)
    107       av1_cost_tokens_from_cdf(x->y_mode_costs[i][j], fc->kf_y_cdf[i][j], NULL);
    108 
    109   for (i = 0; i < BLOCK_SIZE_GROUPS; ++i)
    110     av1_cost_tokens_from_cdf(x->mbmode_cost[i], fc->y_mode_cdf[i], NULL);
    111   for (i = 0; i < CFL_ALLOWED_TYPES; ++i)
    112     for (j = 0; j < INTRA_MODES; ++j)
    113       av1_cost_tokens_from_cdf(x->intra_uv_mode_cost[i][j],
    114                                fc->uv_mode_cdf[i][j], NULL);
    115 
    116   av1_cost_tokens_from_cdf(x->filter_intra_mode_cost, fc->filter_intra_mode_cdf,
    117                            NULL);
    118   for (i = 0; i < BLOCK_SIZES_ALL; ++i) {
    119     if (av1_filter_intra_allowed_bsize(cm, i))
    120       av1_cost_tokens_from_cdf(x->filter_intra_cost[i],
    121                                fc->filter_intra_cdfs[i], NULL);
    122   }
    123 
    124   for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; ++i)
    125     av1_cost_tokens_from_cdf(x->switchable_interp_costs[i],
    126                              fc->switchable_interp_cdf[i], NULL);
    127 
    128   for (i = 0; i < PALATTE_BSIZE_CTXS; ++i) {
    129     av1_cost_tokens_from_cdf(x->palette_y_size_cost[i],
    130                              fc->palette_y_size_cdf[i], NULL);
    131     av1_cost_tokens_from_cdf(x->palette_uv_size_cost[i],
    132                              fc->palette_uv_size_cdf[i], NULL);
    133     for (j = 0; j < PALETTE_Y_MODE_CONTEXTS; ++j) {
    134       av1_cost_tokens_from_cdf(x->palette_y_mode_cost[i][j],
    135                                fc->palette_y_mode_cdf[i][j], NULL);
    136     }
    137   }
    138 
    139   for (i = 0; i < PALETTE_UV_MODE_CONTEXTS; ++i) {
    140     av1_cost_tokens_from_cdf(x->palette_uv_mode_cost[i],
    141                              fc->palette_uv_mode_cdf[i], NULL);
    142   }
    143 
    144   for (i = 0; i < PALETTE_SIZES; ++i) {
    145     for (j = 0; j < PALETTE_COLOR_INDEX_CONTEXTS; ++j) {
    146       av1_cost_tokens_from_cdf(x->palette_y_color_cost[i][j],
    147                                fc->palette_y_color_index_cdf[i][j], NULL);
    148       av1_cost_tokens_from_cdf(x->palette_uv_color_cost[i][j],
    149                                fc->palette_uv_color_index_cdf[i][j], NULL);
    150     }
    151   }
    152 
    153   int sign_cost[CFL_JOINT_SIGNS];
    154   av1_cost_tokens_from_cdf(sign_cost, fc->cfl_sign_cdf, NULL);
    155   for (int joint_sign = 0; joint_sign < CFL_JOINT_SIGNS; joint_sign++) {
    156     int *cost_u = x->cfl_cost[joint_sign][CFL_PRED_U];
    157     int *cost_v = x->cfl_cost[joint_sign][CFL_PRED_V];
    158     if (CFL_SIGN_U(joint_sign) == CFL_SIGN_ZERO) {
    159       memset(cost_u, 0, CFL_ALPHABET_SIZE * sizeof(*cost_u));
    160     } else {
    161       const aom_cdf_prob *cdf_u = fc->cfl_alpha_cdf[CFL_CONTEXT_U(joint_sign)];
    162       av1_cost_tokens_from_cdf(cost_u, cdf_u, NULL);
    163     }
    164     if (CFL_SIGN_V(joint_sign) == CFL_SIGN_ZERO) {
    165       memset(cost_v, 0, CFL_ALPHABET_SIZE * sizeof(*cost_v));
    166     } else {
    167       const aom_cdf_prob *cdf_v = fc->cfl_alpha_cdf[CFL_CONTEXT_V(joint_sign)];
    168       av1_cost_tokens_from_cdf(cost_v, cdf_v, NULL);
    169     }
    170     for (int u = 0; u < CFL_ALPHABET_SIZE; u++)
    171       cost_u[u] += sign_cost[joint_sign];
    172   }
    173 
    174   for (i = 0; i < MAX_TX_CATS; ++i)
    175     for (j = 0; j < TX_SIZE_CONTEXTS; ++j)
    176       av1_cost_tokens_from_cdf(x->tx_size_cost[i][j], fc->tx_size_cdf[i][j],
    177                                NULL);
    178 
    179   for (i = 0; i < TXFM_PARTITION_CONTEXTS; ++i) {
    180     av1_cost_tokens_from_cdf(x->txfm_partition_cost[i],
    181                              fc->txfm_partition_cdf[i], NULL);
    182   }
    183 
    184   for (i = TX_4X4; i < EXT_TX_SIZES; ++i) {
    185     int s;
    186     for (s = 1; s < EXT_TX_SETS_INTER; ++s) {
    187       if (use_inter_ext_tx_for_txsize[s][i]) {
    188         av1_cost_tokens_from_cdf(
    189             x->inter_tx_type_costs[s][i], fc->inter_ext_tx_cdf[s][i],
    190             av1_ext_tx_inv[av1_ext_tx_set_idx_to_type[1][s]]);
    191       }
    192     }
    193     for (s = 1; s < EXT_TX_SETS_INTRA; ++s) {
    194       if (use_intra_ext_tx_for_txsize[s][i]) {
    195         for (j = 0; j < INTRA_MODES; ++j) {
    196           av1_cost_tokens_from_cdf(
    197               x->intra_tx_type_costs[s][i][j], fc->intra_ext_tx_cdf[s][i][j],
    198               av1_ext_tx_inv[av1_ext_tx_set_idx_to_type[0][s]]);
    199         }
    200       }
    201     }
    202   }
    203   for (i = 0; i < DIRECTIONAL_MODES; ++i) {
    204     av1_cost_tokens_from_cdf(x->angle_delta_cost[i], fc->angle_delta_cdf[i],
    205                              NULL);
    206   }
    207   av1_cost_tokens_from_cdf(x->switchable_restore_cost,
    208                            fc->switchable_restore_cdf, NULL);
    209   av1_cost_tokens_from_cdf(x->wiener_restore_cost, fc->wiener_restore_cdf,
    210                            NULL);
    211   av1_cost_tokens_from_cdf(x->sgrproj_restore_cost, fc->sgrproj_restore_cdf,
    212                            NULL);
    213   av1_cost_tokens_from_cdf(x->intrabc_cost, fc->intrabc_cdf, NULL);
    214 
    215   if (!frame_is_intra_only(cm)) {
    216     for (i = 0; i < COMP_INTER_CONTEXTS; ++i) {
    217       av1_cost_tokens_from_cdf(x->comp_inter_cost[i], fc->comp_inter_cdf[i],
    218                                NULL);
    219     }
    220 
    221     for (i = 0; i < REF_CONTEXTS; ++i) {
    222       for (j = 0; j < SINGLE_REFS - 1; ++j) {
    223         av1_cost_tokens_from_cdf(x->single_ref_cost[i][j],
    224                                  fc->single_ref_cdf[i][j], NULL);
    225       }
    226     }
    227 
    228     for (i = 0; i < COMP_REF_TYPE_CONTEXTS; ++i) {
    229       av1_cost_tokens_from_cdf(x->comp_ref_type_cost[i],
    230                                fc->comp_ref_type_cdf[i], NULL);
    231     }
    232 
    233     for (i = 0; i < UNI_COMP_REF_CONTEXTS; ++i) {
    234       for (j = 0; j < UNIDIR_COMP_REFS - 1; ++j) {
    235         av1_cost_tokens_from_cdf(x->uni_comp_ref_cost[i][j],
    236                                  fc->uni_comp_ref_cdf[i][j], NULL);
    237       }
    238     }
    239 
    240     for (i = 0; i < REF_CONTEXTS; ++i) {
    241       for (j = 0; j < FWD_REFS - 1; ++j) {
    242         av1_cost_tokens_from_cdf(x->comp_ref_cost[i][j], fc->comp_ref_cdf[i][j],
    243                                  NULL);
    244       }
    245     }
    246 
    247     for (i = 0; i < REF_CONTEXTS; ++i) {
    248       for (j = 0; j < BWD_REFS - 1; ++j) {
    249         av1_cost_tokens_from_cdf(x->comp_bwdref_cost[i][j],
    250                                  fc->comp_bwdref_cdf[i][j], NULL);
    251       }
    252     }
    253 
    254     for (i = 0; i < INTRA_INTER_CONTEXTS; ++i) {
    255       av1_cost_tokens_from_cdf(x->intra_inter_cost[i], fc->intra_inter_cdf[i],
    256                                NULL);
    257     }
    258 
    259     for (i = 0; i < NEWMV_MODE_CONTEXTS; ++i) {
    260       av1_cost_tokens_from_cdf(x->newmv_mode_cost[i], fc->newmv_cdf[i], NULL);
    261     }
    262 
    263     for (i = 0; i < GLOBALMV_MODE_CONTEXTS; ++i) {
    264       av1_cost_tokens_from_cdf(x->zeromv_mode_cost[i], fc->zeromv_cdf[i], NULL);
    265     }
    266 
    267     for (i = 0; i < REFMV_MODE_CONTEXTS; ++i) {
    268       av1_cost_tokens_from_cdf(x->refmv_mode_cost[i], fc->refmv_cdf[i], NULL);
    269     }
    270 
    271     for (i = 0; i < DRL_MODE_CONTEXTS; ++i) {
    272       av1_cost_tokens_from_cdf(x->drl_mode_cost0[i], fc->drl_cdf[i], NULL);
    273     }
    274     for (i = 0; i < INTER_MODE_CONTEXTS; ++i)
    275       av1_cost_tokens_from_cdf(x->inter_compound_mode_cost[i],
    276                                fc->inter_compound_mode_cdf[i], NULL);
    277     for (i = 0; i < BLOCK_SIZES_ALL; ++i)
    278       av1_cost_tokens_from_cdf(x->compound_type_cost[i],
    279                                fc->compound_type_cdf[i], NULL);
    280     for (i = 0; i < BLOCK_SIZES_ALL; ++i) {
    281       if (get_interinter_wedge_bits(i)) {
    282         av1_cost_tokens_from_cdf(x->wedge_idx_cost[i], fc->wedge_idx_cdf[i],
    283                                  NULL);
    284       }
    285     }
    286     for (i = 0; i < BLOCK_SIZE_GROUPS; ++i) {
    287       av1_cost_tokens_from_cdf(x->interintra_cost[i], fc->interintra_cdf[i],
    288                                NULL);
    289       av1_cost_tokens_from_cdf(x->interintra_mode_cost[i],
    290                                fc->interintra_mode_cdf[i], NULL);
    291     }
    292     for (i = 0; i < BLOCK_SIZES_ALL; ++i) {
    293       av1_cost_tokens_from_cdf(x->wedge_interintra_cost[i],
    294                                fc->wedge_interintra_cdf[i], NULL);
    295     }
    296     for (i = BLOCK_8X8; i < BLOCK_SIZES_ALL; i++) {
    297       av1_cost_tokens_from_cdf(x->motion_mode_cost[i], fc->motion_mode_cdf[i],
    298                                NULL);
    299     }
    300     for (i = BLOCK_8X8; i < BLOCK_SIZES_ALL; i++) {
    301       av1_cost_tokens_from_cdf(x->motion_mode_cost1[i], fc->obmc_cdf[i], NULL);
    302     }
    303     for (i = 0; i < COMP_INDEX_CONTEXTS; ++i) {
    304       av1_cost_tokens_from_cdf(x->comp_idx_cost[i], fc->compound_index_cdf[i],
    305                                NULL);
    306     }
    307     for (i = 0; i < COMP_GROUP_IDX_CONTEXTS; ++i) {
    308       av1_cost_tokens_from_cdf(x->comp_group_idx_cost[i],
    309                                fc->comp_group_idx_cdf[i], NULL);
    310     }
    311   }
    312 }
    313 
    314 // Values are now correlated to quantizer.
    315 static int sad_per_bit16lut_8[QINDEX_RANGE];
    316 static int sad_per_bit4lut_8[QINDEX_RANGE];
    317 static int sad_per_bit16lut_10[QINDEX_RANGE];
    318 static int sad_per_bit4lut_10[QINDEX_RANGE];
    319 static int sad_per_bit16lut_12[QINDEX_RANGE];
    320 static int sad_per_bit4lut_12[QINDEX_RANGE];
    321 
    322 static void init_me_luts_bd(int *bit16lut, int *bit4lut, int range,
    323                             aom_bit_depth_t bit_depth) {
    324   int i;
    325   // Initialize the sad lut tables using a formulaic calculation for now.
    326   // This is to make it easier to resolve the impact of experimental changes
    327   // to the quantizer tables.
    328   for (i = 0; i < range; i++) {
    329     const double q = av1_convert_qindex_to_q(i, bit_depth);
    330     bit16lut[i] = (int)(0.0418 * q + 2.4107);
    331     bit4lut[i] = (int)(0.063 * q + 2.742);
    332   }
    333 }
    334 
    335 void av1_init_me_luts(void) {
    336   init_me_luts_bd(sad_per_bit16lut_8, sad_per_bit4lut_8, QINDEX_RANGE,
    337                   AOM_BITS_8);
    338   init_me_luts_bd(sad_per_bit16lut_10, sad_per_bit4lut_10, QINDEX_RANGE,
    339                   AOM_BITS_10);
    340   init_me_luts_bd(sad_per_bit16lut_12, sad_per_bit4lut_12, QINDEX_RANGE,
    341                   AOM_BITS_12);
    342 }
    343 
    344 static const int rd_boost_factor[16] = { 64, 32, 32, 32, 24, 16, 12, 12,
    345                                          8,  8,  4,  4,  2,  2,  1,  0 };
    346 static const int rd_frame_type_factor[FRAME_UPDATE_TYPES] = {
    347   128, 144, 128, 128, 144, 144, 128
    348 };
    349 
    350 int av1_compute_rd_mult_based_on_qindex(const AV1_COMP *cpi, int qindex) {
    351   const int q = av1_dc_quant_Q3(qindex, 0, cpi->common.seq_params.bit_depth);
    352   int rdmult = q * q;
    353   rdmult = rdmult * 3 + (rdmult * 2 / 3);
    354   switch (cpi->common.seq_params.bit_depth) {
    355     case AOM_BITS_8: break;
    356     case AOM_BITS_10: rdmult = ROUND_POWER_OF_TWO(rdmult, 4); break;
    357     case AOM_BITS_12: rdmult = ROUND_POWER_OF_TWO(rdmult, 8); break;
    358     default:
    359       assert(0 && "bit_depth should be AOM_BITS_8, AOM_BITS_10 or AOM_BITS_12");
    360       return -1;
    361   }
    362   return rdmult > 0 ? rdmult : 1;
    363 }
    364 
    365 int av1_compute_rd_mult(const AV1_COMP *cpi, int qindex) {
    366   int64_t rdmult = av1_compute_rd_mult_based_on_qindex(cpi, qindex);
    367   if (cpi->oxcf.pass == 2 &&
    368       (cpi->common.current_frame.frame_type != KEY_FRAME)) {
    369     const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
    370     const FRAME_UPDATE_TYPE frame_type = gf_group->update_type[gf_group->index];
    371     const int boost_index = AOMMIN(15, (cpi->rc.gfu_boost / 100));
    372 
    373     rdmult = (rdmult * rd_frame_type_factor[frame_type]) >> 7;
    374     rdmult += ((rdmult * rd_boost_factor[boost_index]) >> 7);
    375   }
    376   return (int)rdmult;
    377 }
    378 
    379 int av1_get_adaptive_rdmult(const AV1_COMP *cpi, double beta) {
    380   const AV1_COMMON *cm = &cpi->common;
    381   int64_t q =
    382       av1_dc_quant_Q3(cm->base_qindex, 0, cpi->common.seq_params.bit_depth);
    383   int64_t rdmult = 0;
    384 
    385   switch (cpi->common.seq_params.bit_depth) {
    386     case AOM_BITS_8: rdmult = (int)((88 * q * q / beta) / 24); break;
    387     case AOM_BITS_10:
    388       rdmult = ROUND_POWER_OF_TWO((int)((88 * q * q / beta) / 24), 4);
    389       break;
    390     default:
    391       assert(cpi->common.seq_params.bit_depth == AOM_BITS_12);
    392       rdmult = ROUND_POWER_OF_TWO((int)((88 * q * q / beta) / 24), 8);
    393       break;
    394   }
    395 
    396   if (cpi->oxcf.pass == 2 &&
    397       (cpi->common.current_frame.frame_type != KEY_FRAME)) {
    398     const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
    399     const FRAME_UPDATE_TYPE frame_type = gf_group->update_type[gf_group->index];
    400     const int boost_index = AOMMIN(15, (cpi->rc.gfu_boost / 100));
    401 
    402     rdmult = (rdmult * rd_frame_type_factor[frame_type]) >> 7;
    403     rdmult += ((rdmult * rd_boost_factor[boost_index]) >> 7);
    404   }
    405   if (rdmult < 1) rdmult = 1;
    406   return (int)rdmult;
    407 }
    408 
    409 static int compute_rd_thresh_factor(int qindex, aom_bit_depth_t bit_depth) {
    410   double q;
    411   switch (bit_depth) {
    412     case AOM_BITS_8: q = av1_dc_quant_Q3(qindex, 0, AOM_BITS_8) / 4.0; break;
    413     case AOM_BITS_10: q = av1_dc_quant_Q3(qindex, 0, AOM_BITS_10) / 16.0; break;
    414     case AOM_BITS_12: q = av1_dc_quant_Q3(qindex, 0, AOM_BITS_12) / 64.0; break;
    415     default:
    416       assert(0 && "bit_depth should be AOM_BITS_8, AOM_BITS_10 or AOM_BITS_12");
    417       return -1;
    418   }
    419   // TODO(debargha): Adjust the function below.
    420   return AOMMAX((int)(pow(q, RD_THRESH_POW) * 5.12), 8);
    421 }
    422 
    423 void av1_initialize_me_consts(const AV1_COMP *cpi, MACROBLOCK *x, int qindex) {
    424   switch (cpi->common.seq_params.bit_depth) {
    425     case AOM_BITS_8:
    426       x->sadperbit16 = sad_per_bit16lut_8[qindex];
    427       x->sadperbit4 = sad_per_bit4lut_8[qindex];
    428       break;
    429     case AOM_BITS_10:
    430       x->sadperbit16 = sad_per_bit16lut_10[qindex];
    431       x->sadperbit4 = sad_per_bit4lut_10[qindex];
    432       break;
    433     case AOM_BITS_12:
    434       x->sadperbit16 = sad_per_bit16lut_12[qindex];
    435       x->sadperbit4 = sad_per_bit4lut_12[qindex];
    436       break;
    437     default:
    438       assert(0 && "bit_depth should be AOM_BITS_8, AOM_BITS_10 or AOM_BITS_12");
    439   }
    440 }
    441 
    442 static void set_block_thresholds(const AV1_COMMON *cm, RD_OPT *rd) {
    443   int i, bsize, segment_id;
    444 
    445   for (segment_id = 0; segment_id < MAX_SEGMENTS; ++segment_id) {
    446     const int qindex =
    447         clamp(av1_get_qindex(&cm->seg, segment_id, cm->base_qindex) +
    448                   cm->y_dc_delta_q,
    449               0, MAXQ);
    450     const int q = compute_rd_thresh_factor(qindex, cm->seq_params.bit_depth);
    451 
    452     for (bsize = 0; bsize < BLOCK_SIZES_ALL; ++bsize) {
    453       // Threshold here seems unnecessarily harsh but fine given actual
    454       // range of values used for cpi->sf.thresh_mult[].
    455       const int t = q * rd_thresh_block_size_factor[bsize];
    456       const int thresh_max = INT_MAX / t;
    457 
    458       for (i = 0; i < MAX_MODES; ++i)
    459         rd->threshes[segment_id][bsize][i] = rd->thresh_mult[i] < thresh_max
    460                                                  ? rd->thresh_mult[i] * t / 4
    461                                                  : INT_MAX;
    462     }
    463   }
    464 }
    465 
    466 void av1_fill_coeff_costs(MACROBLOCK *x, FRAME_CONTEXT *fc,
    467                           const int num_planes) {
    468   const int nplanes = AOMMIN(num_planes, PLANE_TYPES);
    469   for (int eob_multi_size = 0; eob_multi_size < 7; ++eob_multi_size) {
    470     for (int plane = 0; plane < nplanes; ++plane) {
    471       LV_MAP_EOB_COST *pcost = &x->eob_costs[eob_multi_size][plane];
    472 
    473       for (int ctx = 0; ctx < 2; ++ctx) {
    474         aom_cdf_prob *pcdf;
    475         switch (eob_multi_size) {
    476           case 0: pcdf = fc->eob_flag_cdf16[plane][ctx]; break;
    477           case 1: pcdf = fc->eob_flag_cdf32[plane][ctx]; break;
    478           case 2: pcdf = fc->eob_flag_cdf64[plane][ctx]; break;
    479           case 3: pcdf = fc->eob_flag_cdf128[plane][ctx]; break;
    480           case 4: pcdf = fc->eob_flag_cdf256[plane][ctx]; break;
    481           case 5: pcdf = fc->eob_flag_cdf512[plane][ctx]; break;
    482           case 6:
    483           default: pcdf = fc->eob_flag_cdf1024[plane][ctx]; break;
    484         }
    485         av1_cost_tokens_from_cdf(pcost->eob_cost[ctx], pcdf, NULL);
    486       }
    487     }
    488   }
    489   for (int tx_size = 0; tx_size < TX_SIZES; ++tx_size) {
    490     for (int plane = 0; plane < nplanes; ++plane) {
    491       LV_MAP_COEFF_COST *pcost = &x->coeff_costs[tx_size][plane];
    492 
    493       for (int ctx = 0; ctx < TXB_SKIP_CONTEXTS; ++ctx)
    494         av1_cost_tokens_from_cdf(pcost->txb_skip_cost[ctx],
    495                                  fc->txb_skip_cdf[tx_size][ctx], NULL);
    496 
    497       for (int ctx = 0; ctx < SIG_COEF_CONTEXTS_EOB; ++ctx)
    498         av1_cost_tokens_from_cdf(pcost->base_eob_cost[ctx],
    499                                  fc->coeff_base_eob_cdf[tx_size][plane][ctx],
    500                                  NULL);
    501       for (int ctx = 0; ctx < SIG_COEF_CONTEXTS; ++ctx)
    502         av1_cost_tokens_from_cdf(pcost->base_cost[ctx],
    503                                  fc->coeff_base_cdf[tx_size][plane][ctx], NULL);
    504 
    505       for (int ctx = 0; ctx < SIG_COEF_CONTEXTS; ++ctx) {
    506         pcost->base_cost[ctx][4] = 0;
    507         pcost->base_cost[ctx][5] = pcost->base_cost[ctx][1] +
    508                                    av1_cost_literal(1) -
    509                                    pcost->base_cost[ctx][0];
    510         pcost->base_cost[ctx][6] =
    511             pcost->base_cost[ctx][2] - pcost->base_cost[ctx][1];
    512         pcost->base_cost[ctx][7] =
    513             pcost->base_cost[ctx][3] - pcost->base_cost[ctx][2];
    514       }
    515 
    516       for (int ctx = 0; ctx < EOB_COEF_CONTEXTS; ++ctx)
    517         av1_cost_tokens_from_cdf(pcost->eob_extra_cost[ctx],
    518                                  fc->eob_extra_cdf[tx_size][plane][ctx], NULL);
    519 
    520       for (int ctx = 0; ctx < DC_SIGN_CONTEXTS; ++ctx)
    521         av1_cost_tokens_from_cdf(pcost->dc_sign_cost[ctx],
    522                                  fc->dc_sign_cdf[plane][ctx], NULL);
    523 
    524       for (int ctx = 0; ctx < LEVEL_CONTEXTS; ++ctx) {
    525         int br_rate[BR_CDF_SIZE];
    526         int prev_cost = 0;
    527         int i, j;
    528         av1_cost_tokens_from_cdf(br_rate, fc->coeff_br_cdf[tx_size][plane][ctx],
    529                                  NULL);
    530         // printf("br_rate: ");
    531         // for(j = 0; j < BR_CDF_SIZE; j++)
    532         //  printf("%4d ", br_rate[j]);
    533         // printf("\n");
    534         for (i = 0; i < COEFF_BASE_RANGE; i += BR_CDF_SIZE - 1) {
    535           for (j = 0; j < BR_CDF_SIZE - 1; j++) {
    536             pcost->lps_cost[ctx][i + j] = prev_cost + br_rate[j];
    537           }
    538           prev_cost += br_rate[j];
    539         }
    540         pcost->lps_cost[ctx][i] = prev_cost;
    541         // printf("lps_cost: %d %d %2d : ", tx_size, plane, ctx);
    542         // for (i = 0; i <= COEFF_BASE_RANGE; i++)
    543         //  printf("%5d ", pcost->lps_cost[ctx][i]);
    544         // printf("\n");
    545       }
    546       for (int ctx = 0; ctx < LEVEL_CONTEXTS; ++ctx) {
    547         pcost->lps_cost[ctx][0 + COEFF_BASE_RANGE + 1] =
    548             pcost->lps_cost[ctx][0];
    549         for (int i = 1; i <= COEFF_BASE_RANGE; ++i) {
    550           pcost->lps_cost[ctx][i + COEFF_BASE_RANGE + 1] =
    551               pcost->lps_cost[ctx][i] - pcost->lps_cost[ctx][i - 1];
    552         }
    553       }
    554     }
    555   }
    556 }
    557 
    558 void av1_initialize_cost_tables(const AV1_COMMON *const cm, MACROBLOCK *x) {
    559   if (cm->cur_frame_force_integer_mv) {
    560     av1_build_nmv_cost_table(x->nmv_vec_cost, x->nmvcost, &cm->fc->nmvc,
    561                              MV_SUBPEL_NONE);
    562   } else {
    563     av1_build_nmv_cost_table(
    564         x->nmv_vec_cost,
    565         cm->allow_high_precision_mv ? x->nmvcost_hp : x->nmvcost, &cm->fc->nmvc,
    566         cm->allow_high_precision_mv);
    567   }
    568 }
    569 
    570 void av1_initialize_rd_consts(AV1_COMP *cpi) {
    571   AV1_COMMON *const cm = &cpi->common;
    572   MACROBLOCK *const x = &cpi->td.mb;
    573   RD_OPT *const rd = &cpi->rd;
    574 
    575   aom_clear_system_state();
    576 
    577   rd->RDMULT = av1_compute_rd_mult(cpi, cm->base_qindex + cm->y_dc_delta_q);
    578 
    579   set_error_per_bit(x, rd->RDMULT);
    580 
    581   set_block_thresholds(cm, rd);
    582 
    583   av1_initialize_cost_tables(cm, x);
    584 
    585   if (frame_is_intra_only(cm) && cm->allow_screen_content_tools &&
    586       cpi->oxcf.pass != 1) {
    587     int *dvcost[2] = { &cpi->dv_cost[0][MV_MAX], &cpi->dv_cost[1][MV_MAX] };
    588     av1_build_nmv_cost_table(cpi->dv_joint_cost, dvcost, &cm->fc->ndvc,
    589                              MV_SUBPEL_NONE);
    590   }
    591 
    592   if (cpi->oxcf.pass != 1) {
    593     for (int i = 0; i < TRANS_TYPES; ++i)
    594       // IDENTITY: 1 bit
    595       // TRANSLATION: 3 bits
    596       // ROTZOOM: 2 bits
    597       // AFFINE: 3 bits
    598       cpi->gmtype_cost[i] = (1 + (i > 0 ? (i == ROTZOOM ? 1 : 2) : 0))
    599                             << AV1_PROB_COST_SHIFT;
    600   }
    601 }
    602 
    603 static void model_rd_norm(int xsq_q10, int *r_q10, int *d_q10) {
    604   // NOTE: The tables below must be of the same size.
    605 
    606   // The functions described below are sampled at the four most significant
    607   // bits of x^2 + 8 / 256.
    608 
    609   // Normalized rate:
    610   // This table models the rate for a Laplacian source with given variance
    611   // when quantized with a uniform quantizer with given stepsize. The
    612   // closed form expression is:
    613   // Rn(x) = H(sqrt(r)) + sqrt(r)*[1 + H(r)/(1 - r)],
    614   // where r = exp(-sqrt(2) * x) and x = qpstep / sqrt(variance),
    615   // and H(x) is the binary entropy function.
    616   static const int rate_tab_q10[] = {
    617     65536, 6086, 5574, 5275, 5063, 4899, 4764, 4651, 4553, 4389, 4255, 4142,
    618     4044,  3958, 3881, 3811, 3748, 3635, 3538, 3453, 3376, 3307, 3244, 3186,
    619     3133,  3037, 2952, 2877, 2809, 2747, 2690, 2638, 2589, 2501, 2423, 2353,
    620     2290,  2232, 2179, 2130, 2084, 2001, 1928, 1862, 1802, 1748, 1698, 1651,
    621     1608,  1530, 1460, 1398, 1342, 1290, 1243, 1199, 1159, 1086, 1021, 963,
    622     911,   864,  821,  781,  745,  680,  623,  574,  530,  490,  455,  424,
    623     395,   345,  304,  269,  239,  213,  190,  171,  154,  126,  104,  87,
    624     73,    61,   52,   44,   38,   28,   21,   16,   12,   10,   8,    6,
    625     5,     3,    2,    1,    1,    1,    0,    0,
    626   };
    627   // Normalized distortion:
    628   // This table models the normalized distortion for a Laplacian source
    629   // with given variance when quantized with a uniform quantizer
    630   // with given stepsize. The closed form expression is:
    631   // Dn(x) = 1 - 1/sqrt(2) * x / sinh(x/sqrt(2))
    632   // where x = qpstep / sqrt(variance).
    633   // Note the actual distortion is Dn * variance.
    634   static const int dist_tab_q10[] = {
    635     0,    0,    1,    1,    1,    2,    2,    2,    3,    3,    4,    5,
    636     5,    6,    7,    7,    8,    9,    11,   12,   13,   15,   16,   17,
    637     18,   21,   24,   26,   29,   31,   34,   36,   39,   44,   49,   54,
    638     59,   64,   69,   73,   78,   88,   97,   106,  115,  124,  133,  142,
    639     151,  167,  184,  200,  215,  231,  245,  260,  274,  301,  327,  351,
    640     375,  397,  418,  439,  458,  495,  528,  559,  587,  613,  637,  659,
    641     680,  717,  749,  777,  801,  823,  842,  859,  874,  899,  919,  936,
    642     949,  960,  969,  977,  983,  994,  1001, 1006, 1010, 1013, 1015, 1017,
    643     1018, 1020, 1022, 1022, 1023, 1023, 1023, 1024,
    644   };
    645   static const int xsq_iq_q10[] = {
    646     0,      4,      8,      12,     16,     20,     24,     28,     32,
    647     40,     48,     56,     64,     72,     80,     88,     96,     112,
    648     128,    144,    160,    176,    192,    208,    224,    256,    288,
    649     320,    352,    384,    416,    448,    480,    544,    608,    672,
    650     736,    800,    864,    928,    992,    1120,   1248,   1376,   1504,
    651     1632,   1760,   1888,   2016,   2272,   2528,   2784,   3040,   3296,
    652     3552,   3808,   4064,   4576,   5088,   5600,   6112,   6624,   7136,
    653     7648,   8160,   9184,   10208,  11232,  12256,  13280,  14304,  15328,
    654     16352,  18400,  20448,  22496,  24544,  26592,  28640,  30688,  32736,
    655     36832,  40928,  45024,  49120,  53216,  57312,  61408,  65504,  73696,
    656     81888,  90080,  98272,  106464, 114656, 122848, 131040, 147424, 163808,
    657     180192, 196576, 212960, 229344, 245728,
    658   };
    659   const int tmp = (xsq_q10 >> 2) + 8;
    660   const int k = get_msb(tmp) - 3;
    661   const int xq = (k << 3) + ((tmp >> k) & 0x7);
    662   const int one_q10 = 1 << 10;
    663   const int a_q10 = ((xsq_q10 - xsq_iq_q10[xq]) << 10) >> (2 + k);
    664   const int b_q10 = one_q10 - a_q10;
    665   *r_q10 = (rate_tab_q10[xq] * b_q10 + rate_tab_q10[xq + 1] * a_q10) >> 10;
    666   *d_q10 = (dist_tab_q10[xq] * b_q10 + dist_tab_q10[xq + 1] * a_q10) >> 10;
    667 }
    668 
    669 void av1_model_rd_from_var_lapndz(int64_t var, unsigned int n_log2,
    670                                   unsigned int qstep, int *rate,
    671                                   int64_t *dist) {
    672   // This function models the rate and distortion for a Laplacian
    673   // source with given variance when quantized with a uniform quantizer
    674   // with given stepsize. The closed form expressions are in:
    675   // Hang and Chen, "Source Model for transform video coder and its
    676   // application - Part I: Fundamental Theory", IEEE Trans. Circ.
    677   // Sys. for Video Tech., April 1997.
    678   if (var == 0) {
    679     *rate = 0;
    680     *dist = 0;
    681   } else {
    682     int d_q10, r_q10;
    683     static const uint32_t MAX_XSQ_Q10 = 245727;
    684     const uint64_t xsq_q10_64 =
    685         (((uint64_t)qstep * qstep << (n_log2 + 10)) + (var >> 1)) / var;
    686     const int xsq_q10 = (int)AOMMIN(xsq_q10_64, MAX_XSQ_Q10);
    687     model_rd_norm(xsq_q10, &r_q10, &d_q10);
    688     *rate = ROUND_POWER_OF_TWO(r_q10 << n_log2, 10 - AV1_PROB_COST_SHIFT);
    689     *dist = (var * (int64_t)d_q10 + 512) >> 10;
    690   }
    691 }
    692 
    693 static double interp_cubic(const double *p, double x) {
    694   return p[1] + 0.5 * x *
    695                     (p[2] - p[0] +
    696                      x * (2.0 * p[0] - 5.0 * p[1] + 4.0 * p[2] - p[3] +
    697                           x * (3.0 * (p[1] - p[2]) + p[3] - p[0])));
    698 }
    699 
    700 /*
    701 static double interp_bicubic(const double *p, int p_stride, double x,
    702                              double y) {
    703   double q[4];
    704   q[0] = interp_cubic(p, x);
    705   q[1] = interp_cubic(p + p_stride, x);
    706   q[2] = interp_cubic(p + 2 * p_stride, x);
    707   q[3] = interp_cubic(p + 3 * p_stride, x);
    708   return interp_cubic(q, y);
    709 }
    710 */
    711 
    712 static const uint8_t bsize_curvfit_model_cat_lookup[BLOCK_SIZES_ALL] = {
    713   0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 0, 0, 1, 1, 2, 2
    714 };
    715 
    716 static int sse_norm_curvfit_model_cat_lookup(double sse_norm) {
    717   return (sse_norm > 16.0);
    718 }
    719 
    720 // Models distortion by sse using a logistic function on
    721 // l = log2(sse / q^2) as:
    722 // dbysse = 16 / (1 + k exp(l + c))
    723 static double get_dbysse_logistic(double l, double c, double k) {
    724   const double A = 16.0;
    725   const double dbysse = A / (1 + k * exp(l + c));
    726   return dbysse;
    727 }
    728 
    729 // Models rate using a clamped linear function on
    730 // l = log2(sse / q^2) as:
    731 // rate = max(0, a + b * l)
    732 static double get_rate_clamplinear(double l, double a, double b) {
    733   const double rate = a + b * l;
    734   return (rate < 0 ? 0 : rate);
    735 }
    736 
    737 static const uint8_t bsize_surffit_model_cat_lookup[BLOCK_SIZES_ALL] = {
    738   0, 0, 0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 0, 0, 2, 2, 4, 4
    739 };
    740 
    741 static const double surffit_rate_params[9][4] = {
    742   {
    743       638.390212,
    744       2.253108,
    745       166.585650,
    746       -3.939401,
    747   },
    748   {
    749       5.256905,
    750       81.997240,
    751       -1.321771,
    752       17.694216,
    753   },
    754   {
    755       -74.193045,
    756       72.431868,
    757       -19.033152,
    758       15.407276,
    759   },
    760   {
    761       416.770113,
    762       14.794188,
    763       167.686830,
    764       -6.997756,
    765   },
    766   {
    767       378.511276,
    768       9.558376,
    769       154.658843,
    770       -6.635663,
    771   },
    772   {
    773       277.818787,
    774       4.413180,
    775       150.317637,
    776       -9.893038,
    777   },
    778   {
    779       142.212132,
    780       11.542038,
    781       94.393964,
    782       -5.518517,
    783   },
    784   {
    785       219.100256,
    786       4.007421,
    787       108.932852,
    788       -6.981310,
    789   },
    790   {
    791       222.261971,
    792       3.251049,
    793       95.972916,
    794       -5.609789,
    795   },
    796 };
    797 
    798 static const double surffit_dist_params[7] = {
    799   1.475844, 4.328362, -5.680233, -0.500994, 0.554585, 4.839478, -0.695837
    800 };
    801 
    802 static void rate_surffit_model_params_lookup(BLOCK_SIZE bsize, double xm,
    803                                              double *rpar) {
    804   const int cat = bsize_surffit_model_cat_lookup[bsize];
    805   rpar[0] = surffit_rate_params[cat][0] + surffit_rate_params[cat][1] * xm;
    806   rpar[1] = surffit_rate_params[cat][2] + surffit_rate_params[cat][3] * xm;
    807 }
    808 
    809 static void dist_surffit_model_params_lookup(BLOCK_SIZE bsize, double xm,
    810                                              double *dpar) {
    811   (void)bsize;
    812   const double *params = surffit_dist_params;
    813   dpar[0] = params[0] + params[1] / (1 + exp((xm + params[2]) * params[3]));
    814   dpar[1] = params[4] + params[5] * exp(params[6] * xm);
    815 }
    816 
    817 void av1_model_rd_surffit(BLOCK_SIZE bsize, double sse_norm, double xm,
    818                           double yl, double *rate_f, double *distbysse_f) {
    819   (void)sse_norm;
    820   double rpar[2], dpar[2];
    821   rate_surffit_model_params_lookup(bsize, xm, rpar);
    822   dist_surffit_model_params_lookup(bsize, xm, dpar);
    823 
    824   *rate_f = get_rate_clamplinear(yl, rpar[0], rpar[1]);
    825   *distbysse_f = get_dbysse_logistic(yl, dpar[0], dpar[1]);
    826 }
    827 
    828 static const double interp_rgrid_curv[4][65] = {
    829   {
    830       0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
    831       0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
    832       0.000000,    23.801499,   28.387688,   33.388795,   42.298282,
    833       41.525408,   51.597692,   49.566271,   54.632979,   60.321507,
    834       67.730678,   75.766165,   85.324032,   96.600012,   120.839562,
    835       173.917577,  255.974908,  354.107573,  458.063476,  562.345966,
    836       668.568424,  772.072881,  878.598490,  982.202274,  1082.708946,
    837       1188.037853, 1287.702240, 1395.588773, 1490.825830, 1584.231230,
    838       1691.386090, 1766.822555, 1869.630904, 1926.743565, 2002.949495,
    839       2047.431137, 2138.486068, 2154.743767, 2209.242472, 2277.593051,
    840       2290.996432, 2307.452938, 2343.567091, 2397.654644, 2469.425868,
    841       2558.591037, 2664.860422, 2787.944296, 2927.552932, 3083.396602,
    842       3255.185579, 3442.630134, 3645.440541, 3863.327072, 4096.000000,
    843   },
    844   {
    845       0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
    846       0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
    847       0.000000,    8.998436,    9.439592,    9.731837,    10.865931,
    848       11.561347,   12.578139,   14.205101,   16.770584,   19.094853,
    849       21.330863,   23.298907,   26.901921,   34.501017,   57.891733,
    850       112.234763,  194.853189,  288.302032,  380.499422,  472.625309,
    851       560.226809,  647.928463,  734.155122,  817.489721,  906.265783,
    852       999.260562,  1094.489206, 1197.062998, 1293.296825, 1378.926484,
    853       1472.760990, 1552.663779, 1635.196884, 1692.451951, 1759.741063,
    854       1822.162720, 1916.515921, 1966.686071, 2031.647506, 2033.700134,
    855       2087.847688, 2161.688858, 2242.536028, 2334.023491, 2436.337802,
    856       2549.665519, 2674.193198, 2810.107395, 2957.594666, 3116.841567,
    857       3288.034655, 3471.360486, 3667.005616, 3875.156602, 4096.000000,
    858   },
    859   {
    860       0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
    861       0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
    862       0.000000,    2.377584,    2.557185,    2.732445,    2.851114,
    863       3.281800,    3.765589,    4.342578,    5.145582,    5.611038,
    864       6.642238,    7.945977,    11.800522,   17.346624,   37.501413,
    865       87.216800,   165.860942,  253.865564,  332.039345,  408.518863,
    866       478.120452,  547.268590,  616.067676,  680.022540,  753.863541,
    867       834.529973,  919.489191,  1008.264989, 1092.230318, 1173.971886,
    868       1249.514122, 1330.510941, 1399.523249, 1466.923387, 1530.533471,
    869       1586.515722, 1695.197774, 1746.648696, 1837.136959, 1909.075485,
    870       1975.074651, 2060.159200, 2155.335095, 2259.762505, 2373.710437,
    871       2497.447898, 2631.243895, 2775.367434, 2930.087523, 3095.673170,
    872       3272.393380, 3460.517161, 3660.313520, 3872.051464, 4096.000000,
    873   },
    874   {
    875       0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
    876       0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
    877       0.000000,    0.296997,    0.342545,    0.403097,    0.472889,
    878       0.614483,    0.842937,    1.050824,    1.326663,    1.717750,
    879       2.530591,    3.582302,    6.995373,    9.973335,    24.042464,
    880       56.598240,   113.680735,  180.018689,  231.050567,  266.101082,
    881       294.957934,  323.326511,  349.434429,  380.443211,  408.171987,
    882       441.214916,  475.716772,  512.900000,  551.186939,  592.364455,
    883       624.527378,  661.940693,  679.185473,  724.800679,  764.781792,
    884       873.050019,  950.299001,  939.292954,  1052.406153, 1033.893184,
    885       1112.182406, 1219.174326, 1337.296681, 1471.648357, 1622.492809,
    886       1790.093491, 1974.713858, 2176.617364, 2396.067465, 2633.327614,
    887       2888.661266, 3162.331876, 3454.602899, 3765.737789, 4096.000000,
    888   },
    889 };
    890 
    891 static const double interp_dgrid_curv[2][65] = {
    892   {
    893       16.000000, 15.962891, 15.925174, 15.886888, 15.848074, 15.808770,
    894       15.769015, 15.728850, 15.688313, 15.647445, 15.606284, 15.564870,
    895       15.525918, 15.483820, 15.373330, 15.126844, 14.637442, 14.184387,
    896       13.560070, 12.880717, 12.165995, 11.378144, 10.438769, 9.130790,
    897       7.487633,  5.688649,  4.267515,  3.196300,  2.434201,  1.834064,
    898       1.369920,  1.035921,  0.775279,  0.574895,  0.427232,  0.314123,
    899       0.233236,  0.171440,  0.128188,  0.092762,  0.067569,  0.049324,
    900       0.036330,  0.027008,  0.019853,  0.015539,  0.011093,  0.008733,
    901       0.007624,  0.008105,  0.005427,  0.004065,  0.003427,  0.002848,
    902       0.002328,  0.001865,  0.001457,  0.001103,  0.000801,  0.000550,
    903       0.000348,  0.000193,  0.000085,  0.000021,  0.000000,
    904   },
    905   {
    906       16.000000, 15.996116, 15.984769, 15.966413, 15.941505, 15.910501,
    907       15.873856, 15.832026, 15.785466, 15.734633, 15.679981, 15.621967,
    908       15.560961, 15.460157, 15.288367, 15.052462, 14.466922, 13.921212,
    909       13.073692, 12.222005, 11.237799, 9.985848,  8.898823,  7.423519,
    910       5.995325,  4.773152,  3.744032,  2.938217,  2.294526,  1.762412,
    911       1.327145,  1.020728,  0.765535,  0.570548,  0.425833,  0.313825,
    912       0.232959,  0.171324,  0.128174,  0.092750,  0.067558,  0.049319,
    913       0.036330,  0.027008,  0.019853,  0.015539,  0.011093,  0.008733,
    914       0.007624,  0.008105,  0.005427,  0.004065,  0.003427,  0.002848,
    915       0.002328,  0.001865,  0.001457,  0.001103,  0.000801,  0.000550,
    916       0.000348,  0.000193,  0.000085,  0.000021,  -0.000000,
    917   },
    918 };
    919 
    920 void av1_model_rd_curvfit(BLOCK_SIZE bsize, double sse_norm, double xqr,
    921                           double *rate_f, double *distbysse_f) {
    922   const double x_start = -15.5;
    923   const double x_end = 16.5;
    924   const double x_step = 0.5;
    925   const double epsilon = 1e-6;
    926   const int rcat = bsize_curvfit_model_cat_lookup[bsize];
    927   const int dcat = sse_norm_curvfit_model_cat_lookup(sse_norm);
    928   (void)x_end;
    929 
    930   xqr = AOMMAX(xqr, x_start + x_step + epsilon);
    931   xqr = AOMMIN(xqr, x_end - x_step - epsilon);
    932   const double x = (xqr - x_start) / x_step;
    933   const int xi = (int)floor(x);
    934   const double xo = x - xi;
    935 
    936   assert(xi > 0);
    937 
    938   const double *prate = &interp_rgrid_curv[rcat][(xi - 1)];
    939   *rate_f = interp_cubic(prate, xo);
    940   const double *pdist = &interp_dgrid_curv[dcat][(xi - 1)];
    941   *distbysse_f = interp_cubic(pdist, xo);
    942 }
    943 
    944 static void get_entropy_contexts_plane(BLOCK_SIZE plane_bsize,
    945                                        const struct macroblockd_plane *pd,
    946                                        ENTROPY_CONTEXT t_above[MAX_MIB_SIZE],
    947                                        ENTROPY_CONTEXT t_left[MAX_MIB_SIZE]) {
    948   const int num_4x4_w = block_size_wide[plane_bsize] >> tx_size_wide_log2[0];
    949   const int num_4x4_h = block_size_high[plane_bsize] >> tx_size_high_log2[0];
    950   const ENTROPY_CONTEXT *const above = pd->above_context;
    951   const ENTROPY_CONTEXT *const left = pd->left_context;
    952 
    953   memcpy(t_above, above, sizeof(ENTROPY_CONTEXT) * num_4x4_w);
    954   memcpy(t_left, left, sizeof(ENTROPY_CONTEXT) * num_4x4_h);
    955 }
    956 
    957 void av1_get_entropy_contexts(BLOCK_SIZE bsize,
    958                               const struct macroblockd_plane *pd,
    959                               ENTROPY_CONTEXT t_above[MAX_MIB_SIZE],
    960                               ENTROPY_CONTEXT t_left[MAX_MIB_SIZE]) {
    961   const BLOCK_SIZE plane_bsize =
    962       get_plane_block_size(bsize, pd->subsampling_x, pd->subsampling_y);
    963   get_entropy_contexts_plane(plane_bsize, pd, t_above, t_left);
    964 }
    965 
    966 void av1_mv_pred(const AV1_COMP *cpi, MACROBLOCK *x, uint8_t *ref_y_buffer,
    967                  int ref_y_stride, int ref_frame, BLOCK_SIZE block_size) {
    968   int i;
    969   int zero_seen = 0;
    970   int best_sad = INT_MAX;
    971   int this_sad = INT_MAX;
    972   int max_mv = 0;
    973   uint8_t *src_y_ptr = x->plane[0].src.buf;
    974   uint8_t *ref_y_ptr;
    975   MV pred_mv[MAX_MV_REF_CANDIDATES + 1];
    976   int num_mv_refs = 0;
    977   const MV_REFERENCE_FRAME ref_frames[2] = { ref_frame, NONE_FRAME };
    978   const int_mv ref_mv =
    979       av1_get_ref_mv_from_stack(0, ref_frames, 0, x->mbmi_ext);
    980   const int_mv ref_mv1 =
    981       av1_get_ref_mv_from_stack(0, ref_frames, 1, x->mbmi_ext);
    982 
    983   pred_mv[num_mv_refs++] = ref_mv.as_mv;
    984   if (ref_mv.as_int != ref_mv1.as_int) {
    985     pred_mv[num_mv_refs++] = ref_mv1.as_mv;
    986   }
    987   if (cpi->sf.adaptive_motion_search && block_size < x->max_partition_size)
    988     pred_mv[num_mv_refs++] = x->pred_mv[ref_frame];
    989 
    990   assert(num_mv_refs <= (int)(sizeof(pred_mv) / sizeof(pred_mv[0])));
    991 
    992   // Get the sad for each candidate reference mv.
    993   for (i = 0; i < num_mv_refs; ++i) {
    994     const MV *this_mv = &pred_mv[i];
    995     int fp_row, fp_col;
    996     fp_row = (this_mv->row + 3 + (this_mv->row >= 0)) >> 3;
    997     fp_col = (this_mv->col + 3 + (this_mv->col >= 0)) >> 3;
    998     max_mv = AOMMAX(max_mv, AOMMAX(abs(this_mv->row), abs(this_mv->col)) >> 3);
    999 
   1000     if (fp_row == 0 && fp_col == 0 && zero_seen) continue;
   1001     zero_seen |= (fp_row == 0 && fp_col == 0);
   1002 
   1003     ref_y_ptr = &ref_y_buffer[ref_y_stride * fp_row + fp_col];
   1004     // Find sad for current vector.
   1005     this_sad = cpi->fn_ptr[block_size].sdf(src_y_ptr, x->plane[0].src.stride,
   1006                                            ref_y_ptr, ref_y_stride);
   1007     // Note if it is the best so far.
   1008     if (this_sad < best_sad) {
   1009       best_sad = this_sad;
   1010     }
   1011   }
   1012 
   1013   // Note the index of the mv that worked best in the reference list.
   1014   x->max_mv_context[ref_frame] = max_mv;
   1015   x->pred_mv_sad[ref_frame] = best_sad;
   1016 }
   1017 
   1018 void av1_setup_pred_block(const MACROBLOCKD *xd,
   1019                           struct buf_2d dst[MAX_MB_PLANE],
   1020                           const YV12_BUFFER_CONFIG *src, int mi_row, int mi_col,
   1021                           const struct scale_factors *scale,
   1022                           const struct scale_factors *scale_uv,
   1023                           const int num_planes) {
   1024   int i;
   1025 
   1026   dst[0].buf = src->y_buffer;
   1027   dst[0].stride = src->y_stride;
   1028   dst[1].buf = src->u_buffer;
   1029   dst[2].buf = src->v_buffer;
   1030   dst[1].stride = dst[2].stride = src->uv_stride;
   1031 
   1032   for (i = 0; i < num_planes; ++i) {
   1033     setup_pred_plane(dst + i, xd->mi[0]->sb_type, dst[i].buf,
   1034                      i ? src->uv_crop_width : src->y_crop_width,
   1035                      i ? src->uv_crop_height : src->y_crop_height,
   1036                      dst[i].stride, mi_row, mi_col, i ? scale_uv : scale,
   1037                      xd->plane[i].subsampling_x, xd->plane[i].subsampling_y);
   1038   }
   1039 }
   1040 
   1041 int av1_raster_block_offset(BLOCK_SIZE plane_bsize, int raster_block,
   1042                             int stride) {
   1043   const int bw = mi_size_wide_log2[plane_bsize];
   1044   const int y = 4 * (raster_block >> bw);
   1045   const int x = 4 * (raster_block & ((1 << bw) - 1));
   1046   return y * stride + x;
   1047 }
   1048 
   1049 int16_t *av1_raster_block_offset_int16(BLOCK_SIZE plane_bsize, int raster_block,
   1050                                        int16_t *base) {
   1051   const int stride = block_size_wide[plane_bsize];
   1052   return base + av1_raster_block_offset(plane_bsize, raster_block, stride);
   1053 }
   1054 
   1055 YV12_BUFFER_CONFIG *av1_get_scaled_ref_frame(const AV1_COMP *cpi,
   1056                                              int ref_frame) {
   1057   assert(ref_frame >= LAST_FRAME && ref_frame <= ALTREF_FRAME);
   1058   RefCntBuffer *const scaled_buf = cpi->scaled_ref_buf[ref_frame - 1];
   1059   const RefCntBuffer *const ref_buf =
   1060       get_ref_frame_buf(&cpi->common, ref_frame);
   1061   return (scaled_buf != ref_buf && scaled_buf != NULL) ? &scaled_buf->buf
   1062                                                        : NULL;
   1063 }
   1064 
   1065 int av1_get_switchable_rate(const AV1_COMMON *const cm, MACROBLOCK *x,
   1066                             const MACROBLOCKD *xd) {
   1067   if (cm->interp_filter == SWITCHABLE) {
   1068     const MB_MODE_INFO *const mbmi = xd->mi[0];
   1069     int inter_filter_cost = 0;
   1070     int dir;
   1071 
   1072     for (dir = 0; dir < 2; ++dir) {
   1073       const int ctx = av1_get_pred_context_switchable_interp(xd, dir);
   1074       const InterpFilter filter =
   1075           av1_extract_interp_filter(mbmi->interp_filters, dir);
   1076       inter_filter_cost += x->switchable_interp_costs[ctx][filter];
   1077     }
   1078     return SWITCHABLE_INTERP_RATE_FACTOR * inter_filter_cost;
   1079   } else {
   1080     return 0;
   1081   }
   1082 }
   1083 
   1084 void av1_set_rd_speed_thresholds(AV1_COMP *cpi) {
   1085   int i;
   1086   RD_OPT *const rd = &cpi->rd;
   1087   SPEED_FEATURES *const sf = &cpi->sf;
   1088 
   1089   // Set baseline threshold values.
   1090   for (i = 0; i < MAX_MODES; ++i) rd->thresh_mult[i] = cpi->oxcf.mode == 0;
   1091 
   1092   if (sf->adaptive_rd_thresh) {
   1093     rd->thresh_mult[THR_NEARESTMV] = 300;
   1094     rd->thresh_mult[THR_NEARESTL2] = 300;
   1095     rd->thresh_mult[THR_NEARESTL3] = 300;
   1096     rd->thresh_mult[THR_NEARESTB] = 300;
   1097     rd->thresh_mult[THR_NEARESTA2] = 300;
   1098     rd->thresh_mult[THR_NEARESTA] = 300;
   1099     rd->thresh_mult[THR_NEARESTG] = 300;
   1100   } else {
   1101     rd->thresh_mult[THR_NEARESTMV] = 0;
   1102     rd->thresh_mult[THR_NEARESTL2] = 0;
   1103     rd->thresh_mult[THR_NEARESTL3] = 100;
   1104     rd->thresh_mult[THR_NEARESTB] = 0;
   1105     rd->thresh_mult[THR_NEARESTA2] = 0;
   1106     rd->thresh_mult[THR_NEARESTA] = 0;
   1107     rd->thresh_mult[THR_NEARESTG] = 0;
   1108   }
   1109 
   1110   rd->thresh_mult[THR_NEWMV] += 1000;
   1111   rd->thresh_mult[THR_NEWL2] += 1000;
   1112   rd->thresh_mult[THR_NEWL3] += 1000;
   1113   rd->thresh_mult[THR_NEWB] += 1000;
   1114   rd->thresh_mult[THR_NEWA2] = 1100;
   1115   rd->thresh_mult[THR_NEWA] += 1000;
   1116   rd->thresh_mult[THR_NEWG] += 1000;
   1117 
   1118   rd->thresh_mult[THR_NEARMV] += 1000;
   1119   rd->thresh_mult[THR_NEARL2] += 1000;
   1120   rd->thresh_mult[THR_NEARL3] += 1000;
   1121   rd->thresh_mult[THR_NEARB] += 1000;
   1122   rd->thresh_mult[THR_NEARA2] = 1000;
   1123   rd->thresh_mult[THR_NEARA] += 1000;
   1124   rd->thresh_mult[THR_NEARG] += 1000;
   1125 
   1126   rd->thresh_mult[THR_GLOBALMV] += 2200;
   1127   rd->thresh_mult[THR_GLOBALL2] += 2000;
   1128   rd->thresh_mult[THR_GLOBALL3] += 2000;
   1129   rd->thresh_mult[THR_GLOBALB] += 2400;
   1130   rd->thresh_mult[THR_GLOBALA2] = 2000;
   1131   rd->thresh_mult[THR_GLOBALG] += 2000;
   1132   rd->thresh_mult[THR_GLOBALA] += 2400;
   1133 
   1134   rd->thresh_mult[THR_COMP_NEAREST_NEARESTLA] += 1100;
   1135   rd->thresh_mult[THR_COMP_NEAREST_NEARESTL2A] += 1000;
   1136   rd->thresh_mult[THR_COMP_NEAREST_NEARESTL3A] += 800;
   1137   rd->thresh_mult[THR_COMP_NEAREST_NEARESTGA] += 900;
   1138   rd->thresh_mult[THR_COMP_NEAREST_NEARESTLB] += 1000;
   1139   rd->thresh_mult[THR_COMP_NEAREST_NEARESTL2B] += 1000;
   1140   rd->thresh_mult[THR_COMP_NEAREST_NEARESTL3B] += 1000;
   1141   rd->thresh_mult[THR_COMP_NEAREST_NEARESTGB] += 1000;
   1142   rd->thresh_mult[THR_COMP_NEAREST_NEARESTLA2] += 1000;
   1143   rd->thresh_mult[THR_COMP_NEAREST_NEARESTL2A2] += 1000;
   1144   rd->thresh_mult[THR_COMP_NEAREST_NEARESTL3A2] += 1000;
   1145   rd->thresh_mult[THR_COMP_NEAREST_NEARESTGA2] += 1000;
   1146 
   1147   rd->thresh_mult[THR_COMP_NEAREST_NEARESTLL2] += 2000;
   1148   rd->thresh_mult[THR_COMP_NEAREST_NEARESTLL3] += 2000;
   1149   rd->thresh_mult[THR_COMP_NEAREST_NEARESTLG] += 2000;
   1150   rd->thresh_mult[THR_COMP_NEAREST_NEARESTBA] += 2000;
   1151 
   1152   rd->thresh_mult[THR_COMP_NEAR_NEARLA] += 1200;
   1153   rd->thresh_mult[THR_COMP_NEAREST_NEWLA] += 1500;
   1154   rd->thresh_mult[THR_COMP_NEW_NEARESTLA] += 1500;
   1155   rd->thresh_mult[THR_COMP_NEAR_NEWLA] += 1530;
   1156   rd->thresh_mult[THR_COMP_NEW_NEARLA] += 1870;
   1157   rd->thresh_mult[THR_COMP_NEW_NEWLA] += 2400;
   1158   rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLA] += 2750;
   1159 
   1160   rd->thresh_mult[THR_COMP_NEAR_NEARL2A] += 1200;
   1161   rd->thresh_mult[THR_COMP_NEAREST_NEWL2A] += 1500;
   1162   rd->thresh_mult[THR_COMP_NEW_NEARESTL2A] += 1500;
   1163   rd->thresh_mult[THR_COMP_NEAR_NEWL2A] += 1870;
   1164   rd->thresh_mult[THR_COMP_NEW_NEARL2A] += 1700;
   1165   rd->thresh_mult[THR_COMP_NEW_NEWL2A] += 1800;
   1166   rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL2A] += 2500;
   1167 
   1168   rd->thresh_mult[THR_COMP_NEAR_NEARL3A] += 1200;
   1169   rd->thresh_mult[THR_COMP_NEAREST_NEWL3A] += 1500;
   1170   rd->thresh_mult[THR_COMP_NEW_NEARESTL3A] += 1500;
   1171   rd->thresh_mult[THR_COMP_NEAR_NEWL3A] += 1700;
   1172   rd->thresh_mult[THR_COMP_NEW_NEARL3A] += 1700;
   1173   rd->thresh_mult[THR_COMP_NEW_NEWL3A] += 2000;
   1174   rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL3A] += 3000;
   1175 
   1176   rd->thresh_mult[THR_COMP_NEAR_NEARGA] += 1320;
   1177   rd->thresh_mult[THR_COMP_NEAREST_NEWGA] += 1500;
   1178   rd->thresh_mult[THR_COMP_NEW_NEARESTGA] += 1500;
   1179   rd->thresh_mult[THR_COMP_NEAR_NEWGA] += 2040;
   1180   rd->thresh_mult[THR_COMP_NEW_NEARGA] += 1700;
   1181   rd->thresh_mult[THR_COMP_NEW_NEWGA] += 2000;
   1182   rd->thresh_mult[THR_COMP_GLOBAL_GLOBALGA] += 2250;
   1183 
   1184   rd->thresh_mult[THR_COMP_NEAR_NEARLB] += 1200;
   1185   rd->thresh_mult[THR_COMP_NEAREST_NEWLB] += 1500;
   1186   rd->thresh_mult[THR_COMP_NEW_NEARESTLB] += 1500;
   1187   rd->thresh_mult[THR_COMP_NEAR_NEWLB] += 1360;
   1188   rd->thresh_mult[THR_COMP_NEW_NEARLB] += 1700;
   1189   rd->thresh_mult[THR_COMP_NEW_NEWLB] += 2400;
   1190   rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLB] += 2250;
   1191 
   1192   rd->thresh_mult[THR_COMP_NEAR_NEARL2B] += 1200;
   1193   rd->thresh_mult[THR_COMP_NEAREST_NEWL2B] += 1500;
   1194   rd->thresh_mult[THR_COMP_NEW_NEARESTL2B] += 1500;
   1195   rd->thresh_mult[THR_COMP_NEAR_NEWL2B] += 1700;
   1196   rd->thresh_mult[THR_COMP_NEW_NEARL2B] += 1700;
   1197   rd->thresh_mult[THR_COMP_NEW_NEWL2B] += 2000;
   1198   rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL2B] += 2500;
   1199 
   1200   rd->thresh_mult[THR_COMP_NEAR_NEARL3B] += 1200;
   1201   rd->thresh_mult[THR_COMP_NEAREST_NEWL3B] += 1500;
   1202   rd->thresh_mult[THR_COMP_NEW_NEARESTL3B] += 1500;
   1203   rd->thresh_mult[THR_COMP_NEAR_NEWL3B] += 1870;
   1204   rd->thresh_mult[THR_COMP_NEW_NEARL3B] += 1700;
   1205   rd->thresh_mult[THR_COMP_NEW_NEWL3B] += 2000;
   1206   rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL3B] += 2500;
   1207 
   1208   rd->thresh_mult[THR_COMP_NEAR_NEARGB] += 1200;
   1209   rd->thresh_mult[THR_COMP_NEAREST_NEWGB] += 1500;
   1210   rd->thresh_mult[THR_COMP_NEW_NEARESTGB] += 1500;
   1211   rd->thresh_mult[THR_COMP_NEAR_NEWGB] += 1700;
   1212   rd->thresh_mult[THR_COMP_NEW_NEARGB] += 1700;
   1213   rd->thresh_mult[THR_COMP_NEW_NEWGB] += 2000;
   1214   rd->thresh_mult[THR_COMP_GLOBAL_GLOBALGB] += 2500;
   1215 
   1216   rd->thresh_mult[THR_COMP_NEAR_NEARLA2] += 1200;
   1217   rd->thresh_mult[THR_COMP_NEAREST_NEWLA2] += 1800;
   1218   rd->thresh_mult[THR_COMP_NEW_NEARESTLA2] += 1500;
   1219   rd->thresh_mult[THR_COMP_NEAR_NEWLA2] += 1700;
   1220   rd->thresh_mult[THR_COMP_NEW_NEARLA2] += 1700;
   1221   rd->thresh_mult[THR_COMP_NEW_NEWLA2] += 2000;
   1222   rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLA2] += 2500;
   1223 
   1224   rd->thresh_mult[THR_COMP_NEAR_NEARL2A2] += 1200;
   1225   rd->thresh_mult[THR_COMP_NEAREST_NEWL2A2] += 1500;
   1226   rd->thresh_mult[THR_COMP_NEW_NEARESTL2A2] += 1500;
   1227   rd->thresh_mult[THR_COMP_NEAR_NEWL2A2] += 1700;
   1228   rd->thresh_mult[THR_COMP_NEW_NEARL2A2] += 1700;
   1229   rd->thresh_mult[THR_COMP_NEW_NEWL2A2] += 2000;
   1230   rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL2A2] += 2500;
   1231 
   1232   rd->thresh_mult[THR_COMP_NEAR_NEARL3A2] += 1440;
   1233   rd->thresh_mult[THR_COMP_NEAREST_NEWL3A2] += 1500;
   1234   rd->thresh_mult[THR_COMP_NEW_NEARESTL3A2] += 1500;
   1235   rd->thresh_mult[THR_COMP_NEAR_NEWL3A2] += 1700;
   1236   rd->thresh_mult[THR_COMP_NEW_NEARL3A2] += 1700;
   1237   rd->thresh_mult[THR_COMP_NEW_NEWL3A2] += 2000;
   1238   rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL3A2] += 2500;
   1239 
   1240   rd->thresh_mult[THR_COMP_NEAR_NEARGA2] += 1200;
   1241   rd->thresh_mult[THR_COMP_NEAREST_NEWGA2] += 1500;
   1242   rd->thresh_mult[THR_COMP_NEW_NEARESTGA2] += 1500;
   1243   rd->thresh_mult[THR_COMP_NEAR_NEWGA2] += 1700;
   1244   rd->thresh_mult[THR_COMP_NEW_NEARGA2] += 1700;
   1245   rd->thresh_mult[THR_COMP_NEW_NEWGA2] += 2000;
   1246   rd->thresh_mult[THR_COMP_GLOBAL_GLOBALGA2] += 2750;
   1247 
   1248   rd->thresh_mult[THR_COMP_NEAR_NEARLL2] += 1600;
   1249   rd->thresh_mult[THR_COMP_NEAREST_NEWLL2] += 2000;
   1250   rd->thresh_mult[THR_COMP_NEW_NEARESTLL2] += 2000;
   1251   rd->thresh_mult[THR_COMP_NEAR_NEWLL2] += 2640;
   1252   rd->thresh_mult[THR_COMP_NEW_NEARLL2] += 2200;
   1253   rd->thresh_mult[THR_COMP_NEW_NEWLL2] += 2400;
   1254   rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLL2] += 3200;
   1255 
   1256   rd->thresh_mult[THR_COMP_NEAR_NEARLL3] += 1600;
   1257   rd->thresh_mult[THR_COMP_NEAREST_NEWLL3] += 2000;
   1258   rd->thresh_mult[THR_COMP_NEW_NEARESTLL3] += 1800;
   1259   rd->thresh_mult[THR_COMP_NEAR_NEWLL3] += 2200;
   1260   rd->thresh_mult[THR_COMP_NEW_NEARLL3] += 2200;
   1261   rd->thresh_mult[THR_COMP_NEW_NEWLL3] += 2400;
   1262   rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLL3] += 3200;
   1263 
   1264   rd->thresh_mult[THR_COMP_NEAR_NEARLG] += 1760;
   1265   rd->thresh_mult[THR_COMP_NEAREST_NEWLG] += 2400;
   1266   rd->thresh_mult[THR_COMP_NEW_NEARESTLG] += 2000;
   1267   rd->thresh_mult[THR_COMP_NEAR_NEWLG] += 1760;
   1268   rd->thresh_mult[THR_COMP_NEW_NEARLG] += 2640;
   1269   rd->thresh_mult[THR_COMP_NEW_NEWLG] += 2400;
   1270   rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLG] += 3200;
   1271 
   1272   rd->thresh_mult[THR_COMP_NEAR_NEARBA] += 1600;
   1273   rd->thresh_mult[THR_COMP_NEAREST_NEWBA] += 2000;
   1274   rd->thresh_mult[THR_COMP_NEW_NEARESTBA] += 2000;
   1275   rd->thresh_mult[THR_COMP_NEAR_NEWBA] += 2200;
   1276   rd->thresh_mult[THR_COMP_NEW_NEARBA] += 1980;
   1277   rd->thresh_mult[THR_COMP_NEW_NEWBA] += 2640;
   1278   rd->thresh_mult[THR_COMP_GLOBAL_GLOBALBA] += 3200;
   1279 
   1280   rd->thresh_mult[THR_DC] += 1000;
   1281   rd->thresh_mult[THR_PAETH] += 1000;
   1282   rd->thresh_mult[THR_SMOOTH] += 2200;
   1283   rd->thresh_mult[THR_SMOOTH_V] += 2000;
   1284   rd->thresh_mult[THR_SMOOTH_H] += 2000;
   1285   rd->thresh_mult[THR_H_PRED] += 2000;
   1286   rd->thresh_mult[THR_V_PRED] += 1800;
   1287   rd->thresh_mult[THR_D135_PRED] += 2500;
   1288   rd->thresh_mult[THR_D203_PRED] += 2000;
   1289   rd->thresh_mult[THR_D157_PRED] += 2500;
   1290   rd->thresh_mult[THR_D67_PRED] += 2000;
   1291   rd->thresh_mult[THR_D113_PRED] += 2500;
   1292   rd->thresh_mult[THR_D45_PRED] += 2500;
   1293 }
   1294 
   1295 void av1_update_rd_thresh_fact(const AV1_COMMON *const cm,
   1296                                int (*factor_buf)[MAX_MODES], int rd_thresh,
   1297                                int bsize, int best_mode_index) {
   1298   if (rd_thresh > 0) {
   1299     const int top_mode = MAX_MODES;
   1300     int mode;
   1301     for (mode = 0; mode < top_mode; ++mode) {
   1302       const BLOCK_SIZE min_size = AOMMAX(bsize - 1, BLOCK_4X4);
   1303       const BLOCK_SIZE max_size =
   1304           AOMMIN(bsize + 2, (int)cm->seq_params.sb_size);
   1305       BLOCK_SIZE bs;
   1306       for (bs = min_size; bs <= max_size; ++bs) {
   1307         int *const fact = &factor_buf[bs][mode];
   1308         if (mode == best_mode_index) {
   1309           *fact -= (*fact >> 4);
   1310         } else {
   1311           *fact = AOMMIN(*fact + RD_THRESH_INC, rd_thresh * RD_THRESH_MAX_FACT);
   1312         }
   1313       }
   1314     }
   1315   }
   1316 }
   1317 
   1318 int av1_get_intra_cost_penalty(int qindex, int qdelta,
   1319                                aom_bit_depth_t bit_depth) {
   1320   const int q = av1_dc_quant_Q3(qindex, qdelta, bit_depth);
   1321   switch (bit_depth) {
   1322     case AOM_BITS_8: return 20 * q;
   1323     case AOM_BITS_10: return 5 * q;
   1324     case AOM_BITS_12: return ROUND_POWER_OF_TWO(5 * q, 2);
   1325     default:
   1326       assert(0 && "bit_depth should be AOM_BITS_8, AOM_BITS_10 or AOM_BITS_12");
   1327       return -1;
   1328   }
   1329 }
   1330