/*
 * Copyright (c) 2021, Alliance for Open Media. All rights reserved
 *
 * This source code is subject to the terms of the BSD 3-Clause Clear License
 * and the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear
 * License was not distributed with this source code in the LICENSE file, you
 * can obtain it at aomedia.org/license/software-license/bsd-3-c-c/.  If the
 * Alliance for Open Media Patent License 1.0 was not distributed with this
 * source code in the PATENTS file, you can obtain it at
 * aomedia.org/license/patent-license/.
 */

#include <assert.h>
#include <math.h>
#include <stdio.h>

#include "av1/common/blockd.h"
#include "av1/common/enums.h"
#include "config/av1_rtcd.h"

#include "aom_dsp/aom_dsp_common.h"
#include "aom_mem/aom_mem.h"
#include "aom_ports/bitops.h"
#include "aom_ports/mem.h"
#include "aom_ports/system_state.h"

#include "av1/common/common.h"
#include "av1/common/entropy.h"
#include "av1/common/entropymode.h"
#include "av1/common/mvref_common.h"
#include "av1/common/pred_common.h"
#include "av1/common/quant_common.h"
#include "av1/common/reconinter.h"
#include "av1/common/reconintra.h"
#include "av1/common/seg_common.h"

#include "av1/encoder/av1_quantize.h"
#include "av1/common/cost.h"
#include "av1/encoder/encodemb.h"
#include "av1/encoder/encodemv.h"
#include "av1/encoder/encoder.h"
#include "av1/encoder/encodetxb.h"
#include "av1/encoder/mcomp.h"
#include "av1/encoder/ratectrl.h"
#include "av1/encoder/rd.h"
#include "av1/encoder/rdopt_utils.h"
#include "av1/encoder/tokenize.h"
#if CONFIG_TCQ
#include "av1/encoder/trellis_quant.h"
#endif  // CONFIG_TCQ

#define RD_THRESH_POW 1.25

#define RD_THRESH_MUL 4.40
#define RDMULT_FROM_Q2_NUM 96
#define RDMULT_FROM_Q2_DEN 32

// The baseline rd thresholds for breaking out of the rd loop for
// certain modes are assumed to be based on 8x8 blocks.
// This table is used to correct for block size.
// The factors here are << 2 (2 = x0.5, 32 = x8 etc).
static const uint8_t rd_thresh_block_size_factor[BLOCK_SIZES_ALL] = {
  2,  3,  3,   4,  6,  6,  8, 12, 12, 16, 24, 24, 32, 48, 48, 64,
#if CONFIG_EXT_RECUR_PARTITIONS
  96, 96, 128,
#endif  // CONFIG_EXT_RECUR_PARTITIONS
  4,  4,  8,   8,  16, 16,
#if CONFIG_EXT_RECUR_PARTITIONS
  6,  6,  12,  12, 8,  8,
#endif  // CONFIG_EXT_RECUR_PARTITIONS
};

static const int use_intra_ext_tx_for_txsize[EXT_TX_SETS_INTRA]
                                            [EXT_TX_SIZES] = { { 1, 1, 1,
                                                                 1 },  // unused
                                                               { 1, 1, 1, 0 },
                                                               { 1, 1, 1, 1 } };

static const int use_inter_ext_tx_for_txsize[EXT_TX_SETS_INTER]
                                            [EXT_TX_SIZES] = {
                                              { 1, 1, 1, 1 },  // unused
                                              { 1, 1, 0, 0 },
                                              { 0, 0, 1, 0 },
                                              { 0, 1, 1, 1 },
                                            };

static const int av1_ext_tx_set_idx_to_type[2][AOMMAX(EXT_TX_SETS_INTRA,
                                                      EXT_TX_SETS_INTER)] = {
  {
      // Intra
      EXT_TX_SET_DCTONLY,
      EXT_NEW_TX_SET,
  },
  {
      // Inter
      EXT_TX_SET_DCTONLY,
      EXT_TX_SET_ALL16,
      EXT_TX_SET_DTT9_IDTX_1DDCT,
      EXT_TX_SET_DCT_IDTX,
  },
};

void av1_fill_mode_rates(AV1_COMMON *const cm, ModeCosts *mode_costs,
                         FRAME_CONTEXT *fc) {
  int i, j;
#if CONFIG_EXTENDED_SDP
  for (i = 0; i < INTER_SDP_BSIZE_GROUP; ++i) {
    av1_cost_tokens_from_cdf(mode_costs->region_type_cost[i],
                             fc->region_type_cdf[i], NULL);
  }
#endif  // CONFIG_EXTENDED_SDP
#if CONFIG_EXT_RECUR_PARTITIONS
  for (int plane_index = 0; plane_index < PARTITION_STRUCTURE_NUM;
       plane_index++) {
    for (i = 0; i < PARTITION_CONTEXTS; ++i) {
      av1_cost_tokens_from_cdf(mode_costs->do_split_cost[plane_index][i],
                               fc->do_split_cdf[plane_index][i], NULL);
    }
  }
  for (int plane_index = 0; plane_index < PARTITION_STRUCTURE_NUM;
       plane_index++) {
    for (i = 0; i < SQUARE_SPLIT_CONTEXTS; ++i) {
      av1_cost_tokens_from_cdf(mode_costs->do_square_split_cost[plane_index][i],
                               fc->do_square_split_cdf[plane_index][i], NULL);
    }
  }
  for (int plane_index = 0; plane_index < PARTITION_STRUCTURE_NUM;
       plane_index++) {
    for (i = 0; i < PARTITION_CONTEXTS; ++i) {
      av1_cost_tokens_from_cdf(mode_costs->rect_type_cost[plane_index][i],
                               fc->rect_type_cdf[plane_index][i], NULL);
    }
  }
  for (int plane_index = 0; plane_index < PARTITION_STRUCTURE_NUM;
       plane_index++) {
    for (RECT_PART_TYPE rect_type = 0; rect_type < NUM_RECT_PARTS;
         rect_type++) {
      for (i = 0; i < PARTITION_CONTEXTS; ++i) {
        av1_cost_tokens_from_cdf(
            mode_costs->do_ext_partition_cost[plane_index][rect_type][i],
            fc->do_ext_partition_cdf[plane_index][rect_type][i], NULL);
        av1_cost_tokens_from_cdf(
            mode_costs
                ->do_uneven_4way_partition_cost[plane_index][rect_type][i],
            fc->do_uneven_4way_partition_cdf[plane_index][rect_type][i], NULL);
        av1_cost_tokens_from_cdf(
            mode_costs
                ->uneven_4way_partition_type_cost[plane_index][rect_type][i],
            fc->uneven_4way_partition_type_cdf[plane_index][rect_type][i],
            NULL);
      }
    }
  }
#else
  for (int plane_index = 0; plane_index < PARTITION_STRUCTURE_NUM;
       plane_index++) {
    for (i = 0; i < PARTITION_CONTEXTS; ++i) {
      av1_cost_tokens_from_cdf(mode_costs->partition_cost[plane_index][i],
                               fc->partition_cdf[plane_index][i], NULL);
    }
  }
#endif  // CONFIG_EXT_RECUR_PARTITIONS

  if (cm->current_frame.skip_mode_info.skip_mode_flag) {
    for (i = 0; i < SKIP_MODE_CONTEXTS; ++i) {
      av1_cost_tokens_from_cdf(mode_costs->skip_mode_cost[i],
                               fc->skip_mode_cdfs[i], NULL);
    }
  }

  for (i = 0; i < SKIP_CONTEXTS; ++i) {
    av1_cost_tokens_from_cdf(mode_costs->skip_txfm_cost[i],
                             fc->skip_txfm_cdfs[i], NULL);
  }

#if CONFIG_IMPROVED_INTRA_DIR_PRED
  for (i = 0; i < MRL_INDEX_CONTEXTS; ++i) {
    av1_cost_tokens_from_cdf(mode_costs->mrl_index_cost[i],
                             fc->mrl_index_cdf[i], NULL);
  }
#else
  av1_cost_tokens_from_cdf(mode_costs->mrl_index_cost, fc->mrl_index_cdf, NULL);
#endif  // CONFIG_IMPROVED_INTRA_DIR_PRED
#if CONFIG_LOSSLESS_DPCM
  av1_cost_tokens_from_cdf(mode_costs->dpcm_cost, fc->dpcm_cdf, NULL);

  av1_cost_tokens_from_cdf(mode_costs->dpcm_vert_horz_cost,
                           fc->dpcm_vert_horz_cdf, NULL);

  av1_cost_tokens_from_cdf(mode_costs->dpcm_uv_cost, fc->dpcm_uv_cdf, NULL);

  av1_cost_tokens_from_cdf(mode_costs->dpcm_uv_vert_horz_cost,
                           fc->dpcm_uv_vert_horz_cdf, NULL);
#endif  // CONFIG_LOSSLESS_DPCM

  for (i = 0; i < FSC_MODE_CONTEXTS; ++i) {
    for (j = 0; j < FSC_BSIZE_CONTEXTS; ++j) {
      av1_cost_tokens_from_cdf(mode_costs->fsc_cost[i][j],
                               fc->fsc_mode_cdf[i][j], NULL);
    }
  }

  av1_cost_tokens_from_cdf(mode_costs->cfl_index_cost, fc->cfl_index_cdf, NULL);
#if CONFIG_AIMC
  av1_cost_tokens_from_cdf(mode_costs->y_primary_flag_cost, fc->y_mode_set_cdf,
                           NULL);
  for (i = 0; i < Y_MODE_CONTEXTS; ++i) {
    // y mode costs
    av1_cost_tokens_from_cdf(mode_costs->y_first_mode_costs[i],
                             fc->y_mode_idx_cdf_0[i], NULL);
    av1_cost_tokens_from_cdf(mode_costs->y_second_mode_costs[i],
                             fc->y_mode_idx_cdf_1[i], NULL);
  }
#else
  for (i = 0; i < KF_MODE_CONTEXTS; ++i)
    for (j = 0; j < KF_MODE_CONTEXTS; ++j)
      av1_cost_tokens_from_cdf(mode_costs->y_mode_costs[i][j],
                               fc->kf_y_cdf[i][j], NULL);
  for (i = 0; i < BLOCK_SIZE_GROUPS; ++i)
    av1_cost_tokens_from_cdf(mode_costs->mbmode_cost[i], fc->y_mode_cdf[i],
                             NULL);
#endif  // CONFIG_AIMC

#if CONFIG_AIMC
  for (j = 0; j < UV_MODE_CONTEXTS; ++j)
    av1_cost_tokens_from_cdf(mode_costs->intra_uv_mode_cost[j],
                             fc->uv_mode_cdf[j], NULL);
  for (i = 0; i < CFL_CONTEXTS; ++i)
    av1_cost_tokens_from_cdf(mode_costs->cfl_mode_cost[i], fc->cfl_cdf[i],
                             NULL);
#else
  for (i = 0; i < CFL_ALLOWED_TYPES; ++i)
    for (j = 0; j < INTRA_MODES; ++j)
      av1_cost_tokens_from_cdf(mode_costs->intra_uv_mode_cost[i][j],
                               fc->uv_mode_cdf[i][j], NULL);
#endif  // CONFIG_AIMC

  av1_cost_tokens_from_cdf(mode_costs->filter_intra_mode_cost,
                           fc->filter_intra_mode_cdf, NULL);
#if CONFIG_D149_CTX_MODELING_OPT
  av1_cost_tokens_from_cdf(mode_costs->filter_intra_cost, fc->filter_intra_cdfs,
                           NULL);
#else
  for (i = 0; i < BLOCK_SIZES_ALL; ++i) {
    if (av1_filter_intra_allowed_bsize(cm, i))
      av1_cost_tokens_from_cdf(mode_costs->filter_intra_cost[i],
                               fc->filter_intra_cdfs[i], NULL);
  }
#endif  // CONFIG_D149_CTX_MODELING_OPT

#if CONFIG_DIP
  for (i = 0; i < DIP_CTXS; i++) {
    av1_cost_tokens_from_cdf(mode_costs->intra_dip_cost[i],
                             fc->intra_dip_cdf[i], NULL);
  }
  av1_cost_tokens_from_cdf(mode_costs->intra_dip_mode_cost,
                           fc->intra_dip_mode_n6_cdf, NULL);
#endif  // CONFIG_DIP

  for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; ++i)
    av1_cost_tokens_from_cdf(mode_costs->switchable_interp_costs[i],
                             fc->switchable_interp_cdf[i], NULL);

  for (i = 0; i < PALATTE_BSIZE_CTXS; ++i) {
    av1_cost_tokens_from_cdf(mode_costs->palette_y_size_cost[i],
                             fc->palette_y_size_cdf[i], NULL);
    av1_cost_tokens_from_cdf(mode_costs->palette_uv_size_cost[i],
                             fc->palette_uv_size_cdf[i], NULL);
    for (j = 0; j < PALETTE_Y_MODE_CONTEXTS; ++j) {
      av1_cost_tokens_from_cdf(mode_costs->palette_y_mode_cost[i][j],
                               fc->palette_y_mode_cdf[i][j], NULL);
    }
  }

  for (i = 0; i < PALETTE_UV_MODE_CONTEXTS; ++i) {
    av1_cost_tokens_from_cdf(mode_costs->palette_uv_mode_cost[i],
                             fc->palette_uv_mode_cdf[i], NULL);
  }

  for (i = 0; i < PALETTE_SIZES; ++i) {
    for (j = 0; j < PALETTE_COLOR_INDEX_CONTEXTS; ++j) {
      av1_cost_tokens_from_cdf(mode_costs->palette_y_color_cost[i][j],
                               fc->palette_y_color_index_cdf[i][j], NULL);
      av1_cost_tokens_from_cdf(mode_costs->palette_uv_color_cost[i][j],
                               fc->palette_uv_color_index_cdf[i][j], NULL);
    }
  }

#if CONFIG_PALETTE_IMPROVEMENTS
#if CONFIG_PALETTE_LINE_COPY
  av1_cost_tokens_from_cdf(mode_costs->palette_direction_cost,
                           fc->palette_direction_cdf, NULL);
#endif  // CONFIG_PALETTE_LINE_COPY
  for (i = 0; i < PALETTE_ROW_FLAG_CONTEXTS; ++i) {
    av1_cost_tokens_from_cdf(mode_costs->palette_y_row_flag_cost[i],
                             fc->identity_row_cdf_y[i], NULL);
    av1_cost_tokens_from_cdf(mode_costs->palette_uv_row_flag_cost[i],
                             fc->identity_row_cdf_uv[i], NULL);
  }
#endif
  int sign_cost[CFL_JOINT_SIGNS];
  av1_cost_tokens_from_cdf(sign_cost, fc->cfl_sign_cdf, NULL);
  for (int joint_sign = 0; joint_sign < CFL_JOINT_SIGNS; joint_sign++) {
    int *cost_u = mode_costs->cfl_cost[joint_sign][CFL_PRED_U];
    int *cost_v = mode_costs->cfl_cost[joint_sign][CFL_PRED_V];
    if (CFL_SIGN_U(joint_sign) == CFL_SIGN_ZERO) {
      memset(cost_u, 0, CFL_ALPHABET_SIZE * sizeof(*cost_u));
    } else {
      const aom_cdf_prob *cdf_u = fc->cfl_alpha_cdf[CFL_CONTEXT_U(joint_sign)];
      av1_cost_tokens_from_cdf(cost_u, cdf_u, NULL);
    }
    if (CFL_SIGN_V(joint_sign) == CFL_SIGN_ZERO) {
      memset(cost_v, 0, CFL_ALPHABET_SIZE * sizeof(*cost_v));
    } else {
      const aom_cdf_prob *cdf_v = fc->cfl_alpha_cdf[CFL_CONTEXT_V(joint_sign)];
      av1_cost_tokens_from_cdf(cost_v, cdf_v, NULL);
    }
    for (int u = 0; u < CFL_ALPHABET_SIZE; u++)
      cost_u[u] += sign_cost[joint_sign];
  }
#if CONFIG_ENABLE_MHCCP
  for (int dir = 0; dir < MHCCP_CONTEXT_GROUP_SIZE; dir++) {
    av1_cost_tokens_from_cdf(mode_costs->filter_dir_cost[dir],
                             fc->filter_dir_cdf[dir], NULL);
  }
#endif  // CONFIG_ENABLE_MHCCP
#if CONFIG_NEW_TX_PARTITION
#if !CONFIG_TX_PARTITION_CTX
  av1_cost_tokens_from_cdf(mode_costs->intra_2way_txfm_partition_cost,
                           fc->intra_2way_txfm_partition_cdf, NULL);
  for (i = 0; i < TX_SIZE_CONTEXTS; ++i) {
    // Square
    av1_cost_tokens_from_cdf(mode_costs->intra_4way_txfm_partition_cost[0][i],
                             fc->intra_4way_txfm_partition_cdf[0][i], NULL);
    // Rectangular
    av1_cost_tokens_from_cdf(mode_costs->intra_4way_txfm_partition_cost[1][i],
                             fc->intra_4way_txfm_partition_cdf[1][i], NULL);
  }
#endif  // !CONFIG_TX_PARTITION_CTX
#else
  for (i = 0; i < MAX_TX_CATS; ++i)
    for (j = 0; j < TX_SIZE_CONTEXTS; ++j)
      av1_cost_tokens_from_cdf(mode_costs->tx_size_cost[i][j],
                               fc->tx_size_cdf[i][j], NULL);
#endif  // CONFIG_NEW_TX_PARTITION

#if CONFIG_NEW_TX_PARTITION
#if CONFIG_TX_PARTITION_CTX
#if CONFIG_IMPROVEIDTX
  for (int k = 0; k < 2; ++k) {
    // 0: intra, 1: inter
    for (i = 0; i < 2; ++i) {
      // Group index from block size to tx partition context mapping
      for (j = 0; j < TXFM_SPLIT_GROUP; ++j) {
        av1_cost_tokens_from_cdf(mode_costs->txfm_do_partition_cost[k][i][j],
                                 fc->txfm_do_partition_cdf[k][i][j], NULL);
      }
#if CONFIG_BUGFIX_TX_PARTITION_TYPE_SIGNALING
      for (j = 0; j < TX_PARTITION_TYPE_NUM_VERT_AND_HORZ; ++j) {
        av1_cost_tokens_from_cdf(
            mode_costs->txfm_4way_partition_type_cost[k][i][j],
            fc->txfm_4way_partition_type_cdf[k][i][j], NULL);
      }
#else
      for (j = 0; j < TXFM_PARTITION_GROUP - 1; ++j) {
        av1_cost_tokens_from_cdf(
            mode_costs->txfm_4way_partition_type_cost[k][i][j],
            fc->txfm_4way_partition_type_cdf[k][i][j], NULL);
#endif  // CONFIG_BUGFIX_TX_PARTITION_TYPE_SIGNALING
#if CONFIG_BUGFIX_TX_PARTITION_TYPE_SIGNALING
      for (j = 0; j < TX_PARTITION_TYPE_NUM_VERT_OR_HORZ - 1; ++j) {
        av1_cost_tokens_from_cdf(
            mode_costs->txfm_2or3_way_partition_type_cost[k][i][j],
            fc->txfm_2or3_way_partition_type_cdf[k][i][j], NULL);
#endif  // CONFIG_BUGFIX_TX_PARTITION_TYPE_SIGNALING
      }
    }
  }
#else
  // 0: intra, 1: inter
  for (i = 0; i < 2; ++i) {
    // Group index from block size to tx partition context mapping
    for (j = 0; j < TXFM_SPLIT_GROUP; ++j) {
      av1_cost_tokens_from_cdf(mode_costs->txfm_do_partition_cost[i][j],
                               fc->txfm_do_partition_cdf[i][j], NULL);
    }

    for (j = 0; j < TXFM_PARTITION_GROUP - 1; ++j) {
      av1_cost_tokens_from_cdf(mode_costs->txfm_4way_partition_type_cost[i][j],
                               fc->txfm_4way_partition_type_cdf[i][j], NULL);
    }
  }
#endif  // CONFIG_IMPROVEIDTX
#else
  av1_cost_tokens_from_cdf(mode_costs->inter_2way_txfm_partition_cost,
                           fc->inter_2way_txfm_partition_cdf, NULL);
  for (i = 0; i < TXFM_PARTITION_INTER_CONTEXTS; ++i) {
    // Square
    av1_cost_tokens_from_cdf(mode_costs->inter_4way_txfm_partition_cost[0][i],
                             fc->inter_4way_txfm_partition_cdf[0][i], NULL);
    // Rectangular
    av1_cost_tokens_from_cdf(mode_costs->inter_4way_txfm_partition_cost[1][i],
                             fc->inter_4way_txfm_partition_cdf[1][i], NULL);
  }
#endif  // CONFIG_TX_PARTITION_CTX
#else
  for (i = 0; i < TXFM_PARTITION_CONTEXTS; ++i) {
    av1_cost_tokens_from_cdf(mode_costs->txfm_partition_cost[i],
                             fc->txfm_partition_cdf[i], NULL);
  }
#endif  // CONFIG_NEW_TX_PARTITION

#if CONFIG_TX_TYPE_FLEX_IMPROVE
  for (i = 0; i < 2; ++i) {
    av1_cost_tokens_from_cdf(mode_costs->tx_ext_32_costs[i],
                             fc->tx_ext_32_cdf[i], NULL);
  }

  for (i = TX_4X4; i < EXT_TX_SIZES; ++i) {
    for (int k = 0; k < EOB_TX_CTXS; ++k) {
      av1_cost_tokens_from_cdf(mode_costs->inter_ext_tx_short_side_costs[k][i],
                               fc->inter_ext_tx_short_side_cdf[k][i], NULL);
    }
  }

  for (i = TX_4X4; i < EXT_TX_SIZES; ++i) {
    av1_cost_tokens_from_cdf(mode_costs->intra_ext_tx_short_side_costs[i],
                             fc->intra_ext_tx_short_side_cdf[i], NULL);
  }
#endif  // CONFIG_TX_TYPE_FLEX_IMPROVE

  for (i = TX_4X4; i < EXT_TX_SIZES; ++i) {
    int s;

    int k;
    for (k = 0; k < EOB_TX_CTXS; ++k) {
      for (s = 1; s < EXT_TX_SETS_INTER; ++s) {
        if (cm->features.reduced_tx_set_used ||
            use_inter_ext_tx_for_txsize[s][i]) {
          av1_cost_tokens_from_cdf(
              mode_costs->inter_tx_type_costs[s][k][i],
              fc->inter_ext_tx_cdf[s][k][i],
              av1_ext_tx_inv[av1_ext_tx_set_idx_to_type[1][s]]);
        }
      }
    }

    for (s = 1; s < EXT_TX_SETS_INTRA; ++s) {
      const int cdf_offset = cm->features.reduced_tx_set_used ? 1 : 0;
      if (use_intra_ext_tx_for_txsize[s][i]) {
#if CONFIG_INTRA_TX_IST_PARSE
        av1_cost_tokens_from_cdf(mode_costs->intra_tx_type_costs[s][i],
                                 fc->intra_ext_tx_cdf[s + cdf_offset][i], NULL);
#else
        int tx_set_type = av1_ext_tx_set_idx_to_type[0][s];
        for (j = 0; j < INTRA_MODES; ++j) {
          av1_cost_tokens_from_cdf(
              mode_costs->intra_tx_type_costs[s][i][j],
              fc->intra_ext_tx_cdf[s + cdf_offset][i][j],
              tx_set_type == EXT_NEW_TX_SET
                  ? av1_md_idx2type[av1_size_class[i]][av1_md_class[j]]
                  : av1_ext_tx_inv[tx_set_type]);
        }
#endif  // CONFIG_INTRA_TX_IST_PARSE
      }
    }
  }
#if !CONFIG_AIMC
  for (i = 0; i < PARTITION_STRUCTURE_NUM; ++i) {
    for (j = 0; j < DIRECTIONAL_MODES; ++j) {
      av1_cost_tokens_from_cdf(mode_costs->angle_delta_cost[i][j],
                               fc->angle_delta_cdf[i][j], NULL);
    }
  }

#endif  // !CONFIG_AIMC
#if CONFIG_NEW_CONTEXT_MODELING
  for (i = 0; i < INTRABC_CONTEXTS; ++i) {
    av1_cost_tokens_from_cdf(mode_costs->intrabc_cost[i], fc->intrabc_cdf[i],
                             NULL);
  }
#else
  av1_cost_tokens_from_cdf(mode_costs->intrabc_cost, fc->intrabc_cdf, NULL);
#endif  // CONFIG_NEW_CONTEXT_MODELING
#if CONFIG_IBC_BV_IMPROVEMENT
  av1_cost_tokens_from_cdf(mode_costs->intrabc_mode_cost, fc->intrabc_mode_cdf,
                           NULL);
#if CONFIG_IBC_MAX_DRL
  for (i = 0; i < cm->features.max_bvp_drl_bits; ++i) {
#else
  for (i = 0; i < MAX_REF_BV_STACK_SIZE - 1; ++i) {
#endif  // CONFIG_IBC_MAX_DRL
    av1_cost_tokens_from_cdf(mode_costs->intrabc_drl_idx_cost[i],
                             fc->intrabc_drl_idx_cdf[i], NULL);
  }
#endif  // CONFIG_IBC_BV_IMPROVEMENT
#if CONFIG_IBC_SUBPEL_PRECISION
  for (i = 0; i < NUM_BV_PRECISION_CONTEXTS; ++i) {
    av1_cost_tokens_from_cdf(mode_costs->intrabc_bv_precision_cost[i],
                             fc->intrabc_bv_precision_cdf[i], NULL);
  }
#endif  // CONFIG_IBC_SUBPEL_PRECISION

#if CONFIG_MORPH_PRED
  for (i = 0; i < 3; ++i) {
    av1_cost_tokens_from_cdf(mode_costs->morph_pred_cost[i],
                             fc->morph_pred_cdf[i], NULL);
  }
#endif  // CONFIG_MORPH_PRED
  for (j = 0; j < 2; ++j) {
    for (i = 0; i < TX_SIZES; ++i) {
      av1_cost_tokens_from_cdf(mode_costs->stx_flag_cost[j][i],
                               fc->stx_cdf[j][i], NULL);
    }
  }
#if CONFIG_IST_SET_FLAG
#if CONFIG_INTRA_TX_IST_PARSE
  av1_cost_tokens_from_cdf(mode_costs->most_probable_stx_set_flag_cost,
                           fc->most_probable_stx_set_cdf, NULL);
#else
  for (i = 0; i < IST_DIR_SIZE; ++i) {
    av1_cost_tokens_from_cdf(mode_costs->stx_set_flag_cost[i],
                             fc->stx_set_cdf[i], NULL);
  }
#endif  // CONFIG_INTRA_TX_IST_PARSE
#endif  // CONFIG_IST_SET_FLAG

  for (i = 0; i < EXT_TX_SIZES; ++i) {
    for (j = 0; j < CCTX_CONTEXTS; ++j) {
      av1_cost_tokens_from_cdf(mode_costs->cctx_type_cost[i][j],
                               fc->cctx_type_cdf[i][j], NULL);
    }
  }

  if (!frame_is_intra_only(cm)) {
    for (i = 0; i < COMP_INTER_CONTEXTS; ++i) {
      av1_cost_tokens_from_cdf(mode_costs->comp_inter_cost[i],
                               fc->comp_inter_cdf[i], NULL);
    }

    for (i = 0; i < TIP_CONTEXTS; ++i) {
      av1_cost_tokens_from_cdf(mode_costs->tip_cost[i], fc->tip_cdf[i], NULL);
    }

#if CONFIG_OPTIMIZE_CTX_TIP_WARP
    av1_cost_tokens_from_cdf(mode_costs->tip_mode_cost, fc->tip_pred_mode_cdf,
                             NULL);
#endif  // CONFIG_OPTIMIZE_CTX_TIP_WARP

    for (i = 0; i < REF_CONTEXTS; ++i) {
#if CONFIG_MULTIVIEW_EXTENDED_DPB
      for (j = 0; j < EXTENDED_INTER_REFS_CONTEXT; ++j) {
#else
      for (j = 0; j < INTER_REFS_PER_FRAME - 1; ++j) {
#endif
        av1_cost_tokens_from_cdf(mode_costs->single_ref_cost[i][j],
                                 fc->single_ref_cdf[i][j], NULL);
      }
    }

    for (i = 0; i < REF_CONTEXTS; ++i) {
#if CONFIG_SAME_REF_COMPOUND
#if CONFIG_MULTIVIEW_EXTENDED_DPB
      for (j = 0; j < EXTENDED_INTER_REFS_CONTEXT; ++j) {
#else
      for (j = 0; j < INTER_REFS_PER_FRAME - 1; ++j) {
#endif
#else
      for (j = 0; j < INTER_REFS_PER_FRAME - 2; ++j) {
#endif  // CONFIG_SAME_REF_COMPOUND
        av1_cost_tokens_from_cdf(mode_costs->comp_ref0_cost[i][j],
                                 fc->comp_ref0_cdf[i][j], NULL);
      }
    }
    for (i = 0; i < REF_CONTEXTS; ++i) {
      for (j = 0; j < COMPREF_BIT_TYPES; j++) {
#if CONFIG_SAME_REF_COMPOUND
#if CONFIG_MULTIVIEW_EXTENDED_DPB
        for (int k = 0; k < EXTENDED_INTER_REFS_CONTEXT; ++k) {
#else
        for (int k = 0; k < INTER_REFS_PER_FRAME - 1; ++k) {
#endif
#else
        for (int k = 0; k < INTER_REFS_PER_FRAME - 2; ++k) {
#endif  // CONFIG_SAME_REF_COMPOUND
          av1_cost_tokens_from_cdf(mode_costs->comp_ref1_cost[i][j][k],
                                   fc->comp_ref1_cdf[i][j][k], NULL);
        }
      }
    }

#if CONFIG_CONTEXT_DERIVATION && !CONFIG_SKIP_TXFM_OPT
    for (j = 0; j < INTRA_INTER_SKIP_TXFM_CONTEXTS; ++j) {
      for (i = 0; i < INTRA_INTER_CONTEXTS; ++i) {
        av1_cost_tokens_from_cdf(mode_costs->intra_inter_cost[j][i],
                                 fc->intra_inter_cdf[j][i], NULL);
      }
    }
#else
    for (i = 0; i < INTRA_INTER_CONTEXTS; ++i) {
      av1_cost_tokens_from_cdf(mode_costs->intra_inter_cost[i],
                               fc->intra_inter_cdf[i], NULL);
    }
#endif  // CONFIG_CONTEXT_DERIVATION && !CONFIG_SKIP_TXFM_OPT

#if CONFIG_OPT_INTER_MODE_CTX
    for (i = 0; i < INTER_MODE_CONTEXTS; ++i) {
#else
    for (i = 0; i < INTER_SINGLE_MODE_CONTEXTS; ++i) {
#endif  // CONFIG_OPT_INTER_MODE_CTX
      av1_cost_tokens_from_cdf(mode_costs->inter_single_mode_cost[i],
                               fc->inter_single_mode_cdf[i], NULL);
    }

    for (i = 0; i < WARPMV_MODE_CONTEXT; ++i) {
      av1_cost_tokens_from_cdf(mode_costs->inter_warp_mode_cost[i],
                               fc->inter_warp_mode_cdf[i], NULL);
    }

    for (i = 0; i < DRL_MODE_CONTEXTS; ++i) {
      av1_cost_tokens_from_cdf(mode_costs->drl_mode_cost[0][i],
                               fc->drl_cdf[0][i], NULL);
      av1_cost_tokens_from_cdf(mode_costs->drl_mode_cost[1][i],
                               fc->drl_cdf[1][i], NULL);
      av1_cost_tokens_from_cdf(mode_costs->drl_mode_cost[2][i],
                               fc->drl_cdf[2][i], NULL);
    }

#if CONFIG_SKIP_MODE_ENHANCEMENT || CONFIG_OPTIMIZE_CTX_TIP_WARP
    for (i = 0; i < 3; ++i) {
      av1_cost_tokens_from_cdf(mode_costs->skip_drl_mode_cost[i],
                               fc->skip_drl_cdf[i], NULL);
    }
#endif  // CONFIG_SKIP_MODE_ENHANCEMENT || CONFIG_OPTIMIZE_CTX_TIP_WARP

#if CONFIG_OPT_INTER_MODE_CTX
    for (i = 0; i < INTER_MODE_CONTEXTS; ++i) {
#else
    for (i = 0; i < INTER_COMPOUND_MODE_CONTEXTS; ++i) {
#endif  // CONFIG_OPT_INTER_MODE_CTX
      av1_cost_tokens_from_cdf(mode_costs->use_optflow_cost[i],
                               fc->use_optflow_cdf[i], NULL);
    }

    for (j = 0; j < NUM_MV_PREC_MPP_CONTEXT; ++j) {
      av1_cost_tokens_from_cdf(mode_costs->pb_block_mv_mpp_flag_costs[j],
                               fc->pb_mv_mpp_flag_cdf[j], NULL);
    }
    for (i = MV_PRECISION_HALF_PEL; i < NUM_MV_PRECISIONS; ++i) {
      for (j = 0; j < MV_PREC_DOWN_CONTEXTS; ++j)
        av1_cost_tokens_from_cdf(
            mode_costs
                ->pb_block_mv_precision_costs[j][i - MV_PRECISION_HALF_PEL],
            fc->pb_mv_precision_cdf[j][i - MV_PRECISION_HALF_PEL], NULL);
    }

    av1_cost_tokens_from_cdf(mode_costs->jmvd_scale_mode_cost,
                             fc->jmvd_scale_mode_cdf, NULL);
    av1_cost_tokens_from_cdf(mode_costs->jmvd_amvd_scale_mode_cost,
                             fc->jmvd_amvd_scale_mode_cdf, NULL);
#if CONFIG_OPT_INTER_MODE_CTX
#if CONFIG_INTER_COMPOUND_BY_JOINT
    for (i = 0; i < NUM_CTX_IS_JOINT; ++i) {
      av1_cost_tokens_from_cdf(mode_costs->inter_compound_mode_is_joint_cost[i],
                               fc->inter_compound_mode_is_joint_cdf[i], NULL);
    }
    for (i = 0; i < NUM_CTX_NON_JOINT_TYPE; ++i) {
      av1_cost_tokens_from_cdf(
          mode_costs->inter_compound_mode_non_joint_type_cost[i],
          fc->inter_compound_mode_non_joint_type_cdf[i], NULL);
    }
    for (i = 0; i < NUM_CTX_JOINT_TYPE; ++i) {
      av1_cost_tokens_from_cdf(
          mode_costs->inter_compound_mode_joint_type_cost[i],
          fc->inter_compound_mode_joint_type_cdf[i], NULL);
    }
#else
    for (i = 0; i < INTER_MODE_CONTEXTS; ++i) {
      av1_cost_tokens_from_cdf(mode_costs->inter_compound_mode_cost[i],
                               fc->inter_compound_mode_cdf[i], NULL);
    }
#endif  // CONFIG_INTER_COMPOUND_BY_JOINT

#else

    for (i = 0; i < INTER_COMPOUND_MODE_CONTEXTS; ++i) {
      av1_cost_tokens_from_cdf(mode_costs->inter_compound_mode_cost[i],
                               fc->inter_compound_mode_cdf[i], NULL);
    }

#endif  // CONFIG_OPT_INTER_MODE_CTX

#if CONFIG_OPT_INTER_MODE_CTX
    for (i = 0; i < INTER_MODE_CONTEXTS; ++i) {
      av1_cost_tokens_from_cdf(
          mode_costs->inter_compound_mode_same_refs_cost[i],
          fc->inter_compound_mode_same_refs_cdf[i], NULL);
    }
#endif  // CONFIG_OPT_INTER_MODE_CTX

#if CONFIG_D149_CTX_MODELING_OPT
    av1_cost_tokens_from_cdf(mode_costs->compound_type_cost,
                             fc->compound_type_cdf, NULL);
#else
    for (i = 0; i < BLOCK_SIZES_ALL; ++i)
      av1_cost_tokens_from_cdf(mode_costs->compound_type_cost[i],
                               fc->compound_type_cdf[i], NULL);
#endif  // CONFIG_D149_CTX_MODELING_OPT

#if CONFIG_D149_CTX_MODELING_OPT && CONFIG_WEDGE_MOD_EXT
    av1_cost_tokens_from_cdf(mode_costs->wedge_angle_dir_cost,
                             fc->wedge_angle_dir_cdf, NULL);
    av1_cost_tokens_from_cdf(mode_costs->wedge_angle_0_cost,
                             fc->wedge_angle_0_cdf, NULL);
    av1_cost_tokens_from_cdf(mode_costs->wedge_angle_1_cost,
                             fc->wedge_angle_1_cdf, NULL);
    av1_cost_tokens_from_cdf(mode_costs->wedge_dist_cost, fc->wedge_dist_cdf,
                             NULL);
    av1_cost_tokens_from_cdf(mode_costs->wedge_dist_cost2, fc->wedge_dist_cdf2,
                             NULL);
#else
    for (i = 0; i < BLOCK_SIZES_ALL; ++i) {
      if (av1_is_wedge_used(i)) {
#if CONFIG_WEDGE_MOD_EXT
        av1_cost_tokens_from_cdf(mode_costs->wedge_angle_dir_cost[i],
                                 fc->wedge_angle_dir_cdf[i], NULL);
        av1_cost_tokens_from_cdf(mode_costs->wedge_angle_0_cost[i],
                                 fc->wedge_angle_0_cdf[i], NULL);
        av1_cost_tokens_from_cdf(mode_costs->wedge_angle_1_cost[i],
                                 fc->wedge_angle_1_cdf[i], NULL);
        av1_cost_tokens_from_cdf(mode_costs->wedge_dist_cost[i],
                                 fc->wedge_dist_cdf[i], NULL);
        av1_cost_tokens_from_cdf(mode_costs->wedge_dist_cost2[i],
                                 fc->wedge_dist_cdf2[i], NULL);
#else
        av1_cost_tokens_from_cdf(mode_costs->wedge_idx_cost[i],
                                 fc->wedge_idx_cdf[i], NULL);
#endif  // CONFIG_WEDGE_MOD_EXT
      }
    }
#endif  // CONFIG_D149_CTX_MODELING_OPT && CONFIG_WEDGE_MOD_EXT

    for (i = 0; i < BLOCK_SIZE_GROUPS; ++i) {
      av1_cost_tokens_from_cdf(mode_costs->interintra_cost[i],
                               fc->interintra_cdf[i], NULL);
      av1_cost_tokens_from_cdf(mode_costs->interintra_mode_cost[i],
                               fc->interintra_mode_cdf[i], NULL);
    }
#if CONFIG_D149_CTX_MODELING_OPT
    av1_cost_tokens_from_cdf(mode_costs->wedge_interintra_cost,
                             fc->wedge_interintra_cdf, NULL);
#else
    for (i = 0; i < BLOCK_SIZES_ALL; ++i) {
      av1_cost_tokens_from_cdf(mode_costs->wedge_interintra_cost[i],
                               fc->wedge_interintra_cdf[i], NULL);
    }
#endif  // CONFIG_D149_CTX_MODELING_OPT

#if CONFIG_REFINEMV
    for (i = 0; i < NUM_REFINEMV_CTX; ++i) {
      av1_cost_tokens_from_cdf(mode_costs->refinemv_flag_cost[i],
                               fc->refinemv_flag_cdf[i], NULL);
    }
#endif  // CONFIG_REFINEMV

#if CONFIG_D149_CTX_MODELING_OPT
    av1_cost_tokens_from_cdf(mode_costs->obmc_cost, fc->obmc_cdf, NULL);
#else
    for (i = BLOCK_8X8; i < BLOCK_SIZES_ALL; i++) {
      av1_cost_tokens_from_cdf(mode_costs->obmc_cost[i], fc->obmc_cdf[i], NULL);
    }
#endif  // CONFIG_D149_CTX_MODELING_OPT

#if CONFIG_D149_CTX_MODELING_OPT && !NO_D149_FOR_WARPED_CAUSAL
    av1_cost_tokens_from_cdf(mode_costs->warped_causal_cost,
                             fc->warped_causal_cdf, NULL);
#else
    for (i = BLOCK_8X8; i < BLOCK_SIZES_ALL; i++) {
      av1_cost_tokens_from_cdf(mode_costs->warped_causal_cost[i],
                               fc->warped_causal_cdf[i], NULL);
    }
#endif  // CONFIG_D149_CTX_MODELING_OPT && !NO_D149_FOR_WARPED_CAUSAL
#if CONFIG_D149_CTX_MODELING_OPT
    av1_cost_tokens_from_cdf(mode_costs->warped_causal_warpmv_cost,
                             fc->warped_causal_warpmv_cdf, NULL);
#else
    for (i = BLOCK_8X8; i < BLOCK_SIZES_ALL; i++) {
      av1_cost_tokens_from_cdf(mode_costs->warped_causal_warpmv_cost[i],
                               fc->warped_causal_warpmv_cdf[i], NULL);
    }
#endif  // CONFIG_D149_CTX_MODELING_OPT
#if CONFIG_D149_CTX_MODELING_OPT
    av1_cost_tokens_from_cdf(mode_costs->warpmv_with_mvd_flag_cost,
                             fc->warpmv_with_mvd_flag_cdf, NULL);
#else
    for (i = BLOCK_8X8; i < BLOCK_SIZES_ALL; i++) {
      av1_cost_tokens_from_cdf(mode_costs->warpmv_with_mvd_flag_cost[i],
                               fc->warpmv_with_mvd_flag_cdf[i], NULL);
    }
#endif  // CONFIG_D149_CTX_MODELING_OPT

#if CONFIG_WARP_PRECISION
    for (i = BLOCK_8X8; i < BLOCK_SIZES_ALL; i++) {
      av1_cost_tokens_from_cdf(mode_costs->warp_precision_idx_cost[i],
                               fc->warp_precision_idx_cdf[i], NULL);
    }
#endif  // CONFIG_WARP_PRECISION

    for (i = 0; i < 3; i++) {
      for (j = 0; j < WARP_REF_CONTEXTS; j++) {
        av1_cost_tokens_from_cdf(mode_costs->warp_ref_idx_cost[i][j],
                                 fc->warp_ref_idx_cdf[i][j], NULL);
      }
    }

#if CONFIG_D149_CTX_MODELING_OPT
    av1_cost_tokens_from_cdf(mode_costs->warp_delta_cost, fc->warp_delta_cdf,
                             NULL);
#else
    for (i = BLOCK_8X8; i < BLOCK_SIZES_ALL; i++) {
      av1_cost_tokens_from_cdf(mode_costs->warp_delta_cost[i],
                               fc->warp_delta_cdf[i], NULL);
    }
#endif  // CONFIG_D149_CTX_MODELING_OPT
    for (i = 0; i < 2; i++) {
      av1_cost_tokens_from_cdf(mode_costs->warp_delta_param_cost[i],
                               fc->warp_delta_param_cdf[i], NULL);
    }

#if CONFIG_WARP_PRECISION
    av1_cost_tokens_from_cdf(mode_costs->warp_param_sign_cost,
                             fc->warp_param_sign_cdf, NULL);
    for (i = 0; i < 2; i++) {
      av1_cost_tokens_from_cdf(mode_costs->warp_delta_param_high_cost[i],
                               fc->warp_delta_param_high_cdf[i], NULL);
    }
#endif  // CONFIG_WARP_PRECISION

#if CONFIG_OPTIMIZE_CTX_TIP_WARP
    for (i = 0; i < WARP_EXTEND_CTX; i++) {
      av1_cost_tokens_from_cdf(mode_costs->warp_extend_cost[i],
                               fc->warp_extend_cdf[i], NULL);
    }
#else
    for (i = 0; i < WARP_EXTEND_CTXS1; i++) {
      for (j = 0; j < WARP_EXTEND_CTXS2; j++) {
        av1_cost_tokens_from_cdf(mode_costs->warp_extend_cost[i][j],
                                 fc->warp_extend_cdf[i][j], NULL);
      }
    }
#endif  // CONFIG_OPTIMIZE_CTX_TIP_WARP
#if CONFIG_BAWP
#if CONFIG_BAWP_CHROMA
    av1_cost_tokens_from_cdf(mode_costs->bawp_flg_cost[0], fc->bawp_cdf[0],
                             NULL);
    av1_cost_tokens_from_cdf(mode_costs->bawp_flg_cost[1], fc->bawp_cdf[1],
                             NULL);
#else
    av1_cost_tokens_from_cdf(mode_costs->bawp_flg_cost, fc->bawp_cdf, NULL);
#endif  // CONFIG_BAWP_CHROMA
#if CONFIG_EXPLICIT_BAWP
    for (i = 0; i < BAWP_SCALES_CTX_COUNT; ++i) {
      av1_cost_tokens_from_cdf(mode_costs->explict_bawp_cost[i],
                               fc->explicit_bawp_cdf[i], NULL);
    }
    av1_cost_tokens_from_cdf(mode_costs->explict_bawp_scale_cost,
                             fc->explicit_bawp_scale_cdf, NULL);
#endif  // CONFIG_EXPLICIT_BAWP
#endif
    for (i = 0; i < COMP_GROUP_IDX_CONTEXTS; ++i) {
      av1_cost_tokens_from_cdf(mode_costs->comp_group_idx_cost[i],
                               fc->comp_group_idx_cdf[i], NULL);
    }
    for (j = 0; j < MAX_CWP_CONTEXTS; j++) {
      for (i = 0; i < MAX_CWP_NUM - 1; ++i) {
        av1_cost_tokens_from_cdf(mode_costs->cwp_idx_cost[j][i],
                                 fc->cwp_idx_cdf[j][i], NULL);
      }
    }
  }
}

void av1_fill_lr_rates(ModeCosts *mode_costs, FRAME_CONTEXT *fc) {
  for (int c = 0; c < MAX_LR_FLEX_SWITCHABLE_BITS; ++c)
    for (int p = 0; p < MAX_MB_PLANE; ++p)
      av1_cost_tokens_from_cdf(mode_costs->switchable_flex_restore_cost[c][p],
                               fc->switchable_flex_restore_cdf[c][p], NULL);
  av1_cost_tokens_from_cdf(mode_costs->wiener_restore_cost,
                           fc->wiener_restore_cdf, NULL);
  av1_cost_tokens_from_cdf(mode_costs->sgrproj_restore_cost,
                           fc->sgrproj_restore_cdf, NULL);
  av1_cost_tokens_from_cdf(mode_costs->wienerns_restore_cost,
                           fc->wienerns_restore_cdf, NULL);
  for (int c = 0; c < 2; ++c)
    av1_cost_tokens_from_cdf(mode_costs->wienerns_length_cost[c],
                             fc->wienerns_length_cdf[c], NULL);
  av1_cost_tokens_from_cdf(mode_costs->wienerns_uv_sym_cost,
                           fc->wienerns_uv_sym_cdf, NULL);
  for (int c = 0; c < WIENERNS_4PART_CTX_MAX; ++c)
    av1_cost_tokens_from_cdf(mode_costs->wienerns_4part_cost[c],
                             fc->wienerns_4part_cdf[c], NULL);
  av1_cost_tokens_from_cdf(mode_costs->pc_wiener_restore_cost,
                           fc->pc_wiener_restore_cdf, NULL);
  // Bit cost for parameter to designate whether unit coeffs are merged.
  av1_cost_tokens_from_cdf(mode_costs->merged_param_cost, fc->merged_param_cdf,
                           NULL);
}

// Values are now correlated to quantizer.
static int sad_per_bit_lut_8[QINDEX_RANGE];
static int sad_per_bit_lut_10[QINDEX_RANGE];
static int sad_per_bit_lut_12[QINDEX_RANGE];

static void init_me_luts_bd(int *bit16lut, int range,
                            aom_bit_depth_t bit_depth) {
  int i;
  // Initialize the sad lut tables using a formulaic calculation for now.
  // This is to make it easier to resolve the impact of experimental changes
  // to the quantizer tables.
  for (i = 0; i < range; i++) {
    const double q = av1_convert_qindex_to_q(i, bit_depth);
    bit16lut[i] = (int)(0.0836 * q + 2.4107);
  }
}

void av1_init_me_luts(void) {
  init_me_luts_bd(sad_per_bit_lut_8, QINDEX_RANGE_8_BITS, AOM_BITS_8);
  init_me_luts_bd(sad_per_bit_lut_10, QINDEX_RANGE_10_BITS, AOM_BITS_10);
  init_me_luts_bd(sad_per_bit_lut_12, QINDEX_RANGE, AOM_BITS_12);
}

static const int rd_boost_factor[16] = { 64, 32, 32, 32, 24, 16, 12, 12,
                                         8,  8,  4,  4,  2,  2,  1,  0 };
static const int rd_layer_depth_factor[6] = {
  128, 128, 144, 160, 160, 180,
};

int av1_compute_rd_mult_based_on_qindex(const AV1_COMP *cpi, int qindex) {
#if CONFIG_TCQ
  const int tcq_mode = cpi->common.quant_params.tcq_mode;
  const int q =
      av1_dc_quant_QTX_tcq(qindex, 0, cpi->common.seq_params.base_y_dc_delta_q,
                           cpi->common.seq_params.bit_depth, tcq_mode);
#else
  const int q =
      av1_dc_quant_QTX(qindex, 0, cpi->common.seq_params.base_y_dc_delta_q,
                       cpi->common.seq_params.bit_depth);
#endif  // CONFIG_TCQ

  int64_t rdmult = ROUND_POWER_OF_TWO_64(
      (int64_t)((int64_t)q * q * RDMULT_FROM_Q2_NUM / RDMULT_FROM_Q2_DEN),
      2 * QUANT_TABLE_BITS);

  switch (cpi->common.seq_params.bit_depth) {
    case AOM_BITS_8: break;
    case AOM_BITS_10: rdmult = ROUND_POWER_OF_TWO(rdmult, 4); break;
    case AOM_BITS_12: rdmult = ROUND_POWER_OF_TWO(rdmult, 8); break;
    default:
      assert(0 && "bit_depth should be AOM_BITS_8, AOM_BITS_10 or AOM_BITS_12");
      return -1;
  }
  return (int)(rdmult > 0 ? rdmult : 1);
}

int av1_compute_rd_mult(const AV1_COMP *cpi, int qindex) {
  int64_t rdmult = av1_compute_rd_mult_based_on_qindex(cpi, qindex);
#if !CONFIG_MULTIVIEW_CORE
  if (is_stat_consumption_stage(cpi) &&
      (cpi->common.current_frame.frame_type != KEY_FRAME)) {
    const GF_GROUP *const gf_group = &cpi->gf_group;
    const int boost_index = AOMMIN(15, (cpi->rc.gfu_boost / 100));
    const int layer_depth = AOMMIN(gf_group->layer_depth[gf_group->index], 5);

    rdmult = (rdmult * rd_layer_depth_factor[layer_depth]) >> 7;
    rdmult += ((rdmult * rd_boost_factor[boost_index]) >> 7);
  }
#endif
  return (int)rdmult;
}

int av1_get_deltaq_offset(const AV1_COMP *cpi, int qindex, double beta) {
  assert(beta > 0.0);
  int q = av1_dc_quant_QTX(qindex, 0, cpi->common.seq_params.base_y_dc_delta_q,
                           cpi->common.seq_params.bit_depth);
  int newq = (int)rint(q / sqrt(beta));
  int orig_qindex = qindex;
  if (newq < q) {
    do {
      qindex--;
      q = av1_dc_quant_QTX(qindex, 0, cpi->common.seq_params.base_y_dc_delta_q,
                           cpi->common.seq_params.bit_depth);
    } while (newq < q && qindex > 0);
  } else {
    do {
      qindex++;
      q = av1_dc_quant_QTX(qindex, 0, cpi->common.seq_params.base_y_dc_delta_q,
                           cpi->common.seq_params.bit_depth);
    } while (newq > q &&
             (qindex <
              (cpi->common.seq_params.bit_depth == AOM_BITS_8    ? MAXQ_8_BITS
               : cpi->common.seq_params.bit_depth == AOM_BITS_10 ? MAXQ_10_BITS
                                                                 : MAXQ)));
  }
  return qindex - orig_qindex;
}

int av1_get_adaptive_rdmult(const AV1_COMP *cpi, double beta) {
  assert(beta > 0.0);
  const AV1_COMMON *cm = &cpi->common;
  int64_t q = av1_dc_quant_QTX(cm->quant_params.base_qindex, 0,
                               cm->seq_params.base_y_dc_delta_q,
                               cm->seq_params.bit_depth);
  int64_t rdmult = 0;

  switch (cm->seq_params.bit_depth) {
    case AOM_BITS_8:
      rdmult = ROUND_POWER_OF_TWO_64(
          (int64_t)((RDMULT_FROM_Q2_NUM * (double)q * q / beta) /
                    RDMULT_FROM_Q2_DEN),
          2 * QUANT_TABLE_BITS);

      break;
    case AOM_BITS_10:
      rdmult = ROUND_POWER_OF_TWO_64(
          (int64_t)((RDMULT_FROM_Q2_NUM * (double)q * q / beta) /
                    RDMULT_FROM_Q2_DEN),
          4 + 2 * QUANT_TABLE_BITS);
      break;
    case AOM_BITS_12:
    default:
      assert(cm->seq_params.bit_depth == AOM_BITS_12);
      rdmult = ROUND_POWER_OF_TWO_64(
          (int64_t)((RDMULT_FROM_Q2_NUM * (double)q * q / beta) /
                    RDMULT_FROM_Q2_DEN),
          8 + 2 * QUANT_TABLE_BITS);
      break;
  }

  if (is_stat_consumption_stage(cpi) &&
      (cm->current_frame.frame_type != KEY_FRAME)) {
    const GF_GROUP *const gf_group = &cpi->gf_group;
    const int boost_index = AOMMIN(15, (cpi->rc.gfu_boost / 100));

    const int layer_depth = AOMMIN(gf_group->layer_depth[gf_group->index], 5);
    rdmult = (rdmult * rd_layer_depth_factor[layer_depth]) >> 7;

    rdmult += ((rdmult * rd_boost_factor[boost_index]) >> 7);
  }
  if (rdmult < 1) rdmult = 1;
  return (int)rdmult;
}

static int compute_rd_thresh_factor(int qindex, int base_y_dc_delta_q,
                                    aom_bit_depth_t bit_depth) {
  double q;
  switch (bit_depth) {
    case AOM_BITS_8:
      q = av1_dc_quant_QTX(qindex, 0, base_y_dc_delta_q, AOM_BITS_8) / 4.0;
      break;
    case AOM_BITS_10:
      q = av1_dc_quant_QTX(qindex, 0, base_y_dc_delta_q, AOM_BITS_10) / 16.0;
      break;
    case AOM_BITS_12:
      q = av1_dc_quant_QTX(qindex, 0, base_y_dc_delta_q, AOM_BITS_12) / 64.0;
      break;
    default:
      assert(0 && "bit_depth should be AOM_BITS_8, AOM_BITS_10 or AOM_BITS_12");
      return -1;
  }
  // TODO(debargha): Adjust the function below.
  q /= (1 << QUANT_TABLE_BITS);
  return AOMMAX((int)(pow(q, RD_THRESH_POW) * RD_THRESH_MUL), 8);
}

void av1_set_sad_per_bit(const AV1_COMP *cpi, MvCosts *mv_costs, int qindex) {
  switch (cpi->common.seq_params.bit_depth) {
    case AOM_BITS_8: mv_costs->sadperbit = sad_per_bit_lut_8[qindex]; break;
    case AOM_BITS_10: mv_costs->sadperbit = sad_per_bit_lut_10[qindex]; break;
    case AOM_BITS_12: mv_costs->sadperbit = sad_per_bit_lut_12[qindex]; break;
    default:
      assert(0 && "bit_depth should be AOM_BITS_8, AOM_BITS_10 or AOM_BITS_12");
  }
}

static void set_block_thresholds(const AV1_COMMON *cm, RD_OPT *rd) {
  int i, bsize, segment_id;

  for (segment_id = 0; segment_id < MAX_SEGMENTS; ++segment_id) {
    const int qindex =
        clamp(av1_get_qindex(&cm->seg, segment_id, cm->quant_params.base_qindex,
                             cm->seq_params.bit_depth) +
                  cm->quant_params.y_dc_delta_q,
              0,
              cm->seq_params.bit_depth == AOM_BITS_8    ? MAXQ_8_BITS
              : cm->seq_params.bit_depth == AOM_BITS_10 ? MAXQ_10_BITS
                                                        : MAXQ);

    const int q = compute_rd_thresh_factor(
        qindex, cm->seq_params.base_y_dc_delta_q, cm->seq_params.bit_depth);

    for (bsize = 0; bsize < BLOCK_SIZES_ALL; ++bsize) {
      // Threshold here seems unnecessarily harsh but fine given actual
      // range of values used for cpi->sf.thresh_mult[].
      const int t = q * rd_thresh_block_size_factor[bsize];
      const int thresh_max = INT_MAX / t;

      for (i = 0; i < MB_MODE_COUNT; ++i)
        rd->threshes[segment_id][bsize][i] = rd->thresh_mult[i] < thresh_max
                                                 ? rd->thresh_mult[i] * t / 4
                                                 : INT_MAX;
    }
  }
}

void av1_fill_coeff_costs(CoeffCosts *coeff_costs, FRAME_CONTEXT *fc,
                          const int num_planes) {
#if CONFIG_TCQ
  // Look-up take to retrive data from precomputed cost array
  static const uint8_t trel_abslev[15][4] = {
    { 2, 1, 1, 2 },  // qIdx=1
    { 2, 3, 1, 2 },  // qidx=2
    { 2, 3, 3, 2 },  // qidx=3
    { 2, 3, 3, 4 },  // qidx=4
    { 4, 3, 3, 4 },  // qidx=5
    { 4, 5, 3, 4 },  // qidx=6
    { 4, 5, 5, 4 },  // qidx=7
    { 4, 5, 5, 6 },  // qidx=8
    { 6, 5, 5, 6 },  // qidx=9
    { 6, 7, 5, 6 },  // qidx=10
    { 6, 7, 7, 6 },  // qidx=11
    { 6, 7, 7, 8 },  // qidx=12
    { 8, 7, 7, 8 },  // qidx=13
    { 8, 9, 7, 8 },  // qidx=14
    { 8, 9, 9, 8 },  // qidx=15
  };
#endif  // CONFIG_TCQ
  const int nplanes = AOMMIN(num_planes, PLANE_TYPES);
  for (int eob_multi_size = 0; eob_multi_size < 7; ++eob_multi_size) {
    for (int plane = 0; plane < nplanes; ++plane) {
      LV_MAP_EOB_COST *pcost = &coeff_costs->eob_costs[eob_multi_size][plane];
      aom_cdf_prob *pcdf;
      {
#if CONFIG_EOB_POS_LUMA
        for (int is_inter = 0; is_inter < 2; is_inter++) {
          int pl_ctx = get_eob_plane_ctx(plane, is_inter);
          switch (eob_multi_size) {
            case 0: pcdf = fc->eob_flag_cdf16[pl_ctx]; break;
            case 1: pcdf = fc->eob_flag_cdf32[pl_ctx]; break;
            case 2: pcdf = fc->eob_flag_cdf64[pl_ctx]; break;
            case 3: pcdf = fc->eob_flag_cdf128[pl_ctx]; break;
            case 4: pcdf = fc->eob_flag_cdf256[pl_ctx]; break;
            case 5: pcdf = fc->eob_flag_cdf512[pl_ctx]; break;
            case 6: pcdf = fc->eob_flag_cdf1024[pl_ctx]; break;
            default: assert(0 && "Invalid eob_multi_size");
          }
          av1_cost_tokens_from_cdf(pcost->eob_cost[is_inter], pcdf, NULL);
        }
#else
        switch (eob_multi_size) {
          case 0: pcdf = fc->eob_flag_cdf16[plane]; break;
          case 1: pcdf = fc->eob_flag_cdf32[plane]; break;
          case 2: pcdf = fc->eob_flag_cdf64[plane]; break;
          case 3: pcdf = fc->eob_flag_cdf128[plane]; break;
          case 4: pcdf = fc->eob_flag_cdf256[plane]; break;
          case 5: pcdf = fc->eob_flag_cdf512[plane]; break;
          case 6: pcdf = fc->eob_flag_cdf1024[plane]; break;
          default: assert(0 && "Invalid eob_multi_size");
        }
        av1_cost_tokens_from_cdf(pcost->eob_cost, pcdf, NULL);
#endif  // CONFIG_EOB_POS_LUMA
      }
    }
  }
  for (int tx_size = 0; tx_size < TX_SIZES; ++tx_size) {
    for (int plane = 0; plane < nplanes; ++plane) {
      LV_MAP_COEFF_COST *pcost = &coeff_costs->coeff_costs[tx_size][plane];

      for (int ctx = 0; ctx < TXB_SKIP_CONTEXTS; ++ctx)
#if CONFIG_TX_SKIP_FLAG_MODE_DEP_CTX
      {
        av1_cost_tokens_from_cdf(pcost->txb_skip_cost[0][ctx],
                                 fc->txb_skip_cdf[0][tx_size][ctx], NULL);
        av1_cost_tokens_from_cdf(pcost->txb_skip_cost[1][ctx],
                                 fc->txb_skip_cdf[1][tx_size][ctx], NULL);
      }
#else
        av1_cost_tokens_from_cdf(pcost->txb_skip_cost[ctx],
                                 fc->txb_skip_cdf[tx_size][ctx], NULL);
#endif  // CONFIG_TX_SKIP_FLAG_MODE_DEP_CTX

#if CONFIG_CONTEXT_DERIVATION
      for (int ctx = 0; ctx < V_TXB_SKIP_CONTEXTS; ++ctx)
        av1_cost_tokens_from_cdf(pcost->v_txb_skip_cost[ctx],
                                 fc->v_txb_skip_cdf[ctx], NULL);
#endif  // CONFIG_CONTEXT_DERIVATION
#if CONFIG_CHROMA_CODING
      for (int ctx = 0; ctx < SIG_COEF_CONTEXTS_EOB; ++ctx)
        av1_cost_tokens_from_cdf(pcost->base_lf_eob_cost_uv[ctx],
                                 fc->coeff_base_lf_eob_uv_cdf[ctx], NULL);
      for (int ctx = 0; ctx < SIG_COEF_CONTEXTS_EOB; ++ctx)
        av1_cost_tokens_from_cdf(pcost->base_eob_cost_uv[ctx],
                                 fc->coeff_base_eob_uv_cdf[ctx], NULL);
      for (int ctx = 0; ctx < SIG_COEF_CONTEXTS_EOB; ++ctx)
        av1_cost_tokens_from_cdf(pcost->base_eob_cost[ctx],
                                 fc->coeff_base_eob_cdf[tx_size][ctx], NULL);

      for (int ctx = 0; ctx < SIG_COEF_CONTEXTS_EOB; ++ctx)
        av1_cost_tokens_from_cdf(pcost->base_lf_eob_cost[ctx],
                                 fc->coeff_base_lf_eob_cdf[tx_size][ctx], NULL);
#if CONFIG_TCQ
      for (int ctx = 0; ctx < LF_SIG_COEF_CONTEXTS; ++ctx) {
        for (int q_i = 0; q_i < TCQ_CTXS; q_i++) {
          av1_cost_tokens_from_cdf(pcost->base_lf_cost[ctx][q_i],
                                   fc->coeff_base_lf_cdf[tx_size][ctx][q_i],
                                   NULL);
        }
      }
      for (int ctx = 0; ctx < LF_SIG_COEF_CONTEXTS_UV; ++ctx) {
        for (int q_i = 0; q_i < TCQ_CTXS; q_i++) {
          av1_cost_tokens_from_cdf(pcost->base_lf_cost_uv[ctx][q_i],
                                   fc->coeff_base_lf_uv_cdf[ctx][q_i], NULL);
        }
      }
      for (int ctx = 0; ctx < SIG_COEF_CONTEXTS; ++ctx) {
        for (int q_i = 0; q_i < TCQ_CTXS; q_i++) {
          av1_cost_tokens_from_cdf(pcost->base_cost[ctx][q_i],
                                   fc->coeff_base_cdf[tx_size][ctx][q_i], NULL);
        }
      }
      for (int ctx = 0; ctx < SIG_COEF_CONTEXTS_UV; ++ctx) {
        for (int q_i = 0; q_i < TCQ_CTXS; q_i++) {
          av1_cost_tokens_from_cdf(pcost->base_cost_uv[ctx][q_i],
                                   fc->coeff_base_uv_cdf[ctx][q_i], NULL);
        }
      }
      // Rearrange costs into base_cost_zero[] array for quicker access.
      for (int q_i = 0; q_i < TCQ_CTXS; q_i++) {
        for (int ctx = 0; ctx < SIG_COEF_CONTEXTS; ++ctx) {
          pcost->base_cost_zero[q_i][ctx] = pcost->base_cost[ctx][q_i][0];
        }
        for (int ctx = 0; ctx < SIG_COEF_CONTEXTS_UV; ++ctx) {
          pcost->base_cost_uv_zero[q_i][ctx] = pcost->base_cost_uv[ctx][q_i][0];
        }
      }
      // Rearrange costs into base_lf_cost_zero[] array for quicker access.
      for (int q_i = 0; q_i < TCQ_CTXS; q_i++) {
        for (int ctx = 0; ctx < LF_SIG_COEF_CONTEXTS; ++ctx) {
          pcost->base_lf_cost_zero[q_i][ctx] = pcost->base_lf_cost[ctx][q_i][0];
        }
        for (int ctx = 0; ctx < LF_SIG_COEF_CONTEXTS_UV; ++ctx) {
          pcost->base_lf_cost_uv_zero[q_i][ctx] =
              pcost->base_lf_cost_uv[ctx][q_i][0];
        }
      }
      // Precompute some base_costs for trellis, interleaved for quick access.
      for (int idx = 0; idx < 5; idx++) {
        int a0 = AOMMIN(trel_abslev[idx][0], 3);
        int a1 = AOMMIN(trel_abslev[idx][1], 3);
        int a2 = AOMMIN(trel_abslev[idx][2], 3);
        int a3 = AOMMIN(trel_abslev[idx][3], 3);
        for (int ctx = 0; ctx < SIG_COEF_CONTEXTS; ++ctx) {
          // Q0, absLev 0 / 2
          pcost->base_cost_low_tbl[idx][ctx][0][0] =
              pcost->base_cost[ctx][0][a0] + av1_cost_literal(1);
          pcost->base_cost_low_tbl[idx][ctx][0][1] =
              pcost->base_cost[ctx][0][a2] + av1_cost_literal(1);
          // Q1, absLev 1 / 3
          pcost->base_cost_low_tbl[idx][ctx][1][0] =
              pcost->base_cost[ctx][1][a1] + av1_cost_literal(1);
          pcost->base_cost_low_tbl[idx][ctx][1][1] =
              pcost->base_cost[ctx][1][a3] + av1_cost_literal(1);
        }
        for (int ctx = 0; ctx < SIG_COEF_CONTEXTS_EOB; ++ctx) {
          // EOB coeff, absLev 0 / 2
          pcost->base_eob_cost_tbl[idx][ctx][0] =
              pcost->base_eob_cost[ctx][a0 - 1] + av1_cost_literal(1);
          pcost->base_eob_cost_tbl[idx][ctx][1] =
              pcost->base_eob_cost[ctx][a2 - 1] + av1_cost_literal(1);
        }
        for (int ctx = 0; ctx < SIG_COEF_CONTEXTS_UV; ++ctx) {
          // Q0, uv, absLev 0 / 2
          pcost->base_cost_uv_low_tbl[idx][ctx][0][0] =
              pcost->base_cost_uv[ctx][0][a0] + av1_cost_literal(1);
          pcost->base_cost_uv_low_tbl[idx][ctx][0][1] =
              pcost->base_cost_uv[ctx][0][a2] + av1_cost_literal(1);
          // Q1, uv,absLev 1 / 3
          pcost->base_cost_uv_low_tbl[idx][ctx][1][0] =
              pcost->base_cost_uv[ctx][1][a1] + av1_cost_literal(1);
          pcost->base_cost_uv_low_tbl[idx][ctx][1][1] =
              pcost->base_cost_uv[ctx][1][a3] + av1_cost_literal(1);
        }
        for (int ctx = 0; ctx < SIG_COEF_CONTEXTS_EOB; ++ctx) {
          // UV EOB coeff, absLev 0 / 2
          pcost->base_eob_cost_uv_tbl[idx][ctx][0] =
              pcost->base_eob_cost_uv[ctx][a0 - 1] + av1_cost_literal(1);
          pcost->base_eob_cost_uv_tbl[idx][ctx][1] =
              pcost->base_eob_cost_uv[ctx][a2 - 1] + av1_cost_literal(1);
        }
      }
      for (int idx = 0; idx < 9; idx++) {
        int max = LF_BASE_SYMBOLS - 1;
        int a0 = AOMMIN(trel_abslev[idx][0], max);
        int a1 = AOMMIN(trel_abslev[idx][1], max);
        int a2 = AOMMIN(trel_abslev[idx][2], max);
        int a3 = AOMMIN(trel_abslev[idx][3], max);
        for (int ctx = 0; ctx < LF_SIG_COEF_CONTEXTS; ++ctx) {
          // Q0, absLev 0 / 2
          pcost->base_lf_cost_low_tbl[idx][ctx][0][0] =
              pcost->base_lf_cost[ctx][0][a0] + av1_cost_literal(1);
          pcost->base_lf_cost_low_tbl[idx][ctx][0][1] =
              pcost->base_lf_cost[ctx][0][a2] + av1_cost_literal(1);
          // Q1, absLev 1 / 3
          pcost->base_lf_cost_low_tbl[idx][ctx][1][0] =
              pcost->base_lf_cost[ctx][1][a1] + av1_cost_literal(1);
          pcost->base_lf_cost_low_tbl[idx][ctx][1][1] =
              pcost->base_lf_cost[ctx][1][a3] + av1_cost_literal(1);
        }
        for (int ctx = 0; ctx < SIG_COEF_CONTEXTS_EOB; ++ctx) {
          // EOB coeff, absLev 0 / 2
          pcost->base_lf_eob_cost_tbl[idx][ctx][0] =
              pcost->base_lf_eob_cost[ctx][a0 - 1] + av1_cost_literal(1);
          pcost->base_lf_eob_cost_tbl[idx][ctx][1] =
              pcost->base_lf_eob_cost[ctx][a2 - 1] + av1_cost_literal(1);
        }
        for (int ctx = 0; ctx < LF_SIG_COEF_CONTEXTS_UV; ++ctx) {
          // Q0, absLev 0 / 2
          pcost->base_lf_cost_uv_low_tbl[idx][ctx][0][0] =
              pcost->base_lf_cost_uv[ctx][0][a0] + av1_cost_literal(1);
          pcost->base_lf_cost_uv_low_tbl[idx][ctx][0][1] =
              pcost->base_lf_cost_uv[ctx][0][a2] + av1_cost_literal(1);
          // Q1, absLev 1 / 3
          pcost->base_lf_cost_uv_low_tbl[idx][ctx][1][0] =
              pcost->base_lf_cost_uv[ctx][1][a1] + av1_cost_literal(1);
          pcost->base_lf_cost_uv_low_tbl[idx][ctx][1][1] =
              pcost->base_lf_cost_uv[ctx][1][a3] + av1_cost_literal(1);
        }
        for (int ctx = 0; ctx < SIG_COEF_CONTEXTS_EOB; ++ctx) {
          // UV EOB coeff, absLev 0 / 2
          pcost->base_lf_eob_cost_uv_tbl[idx][ctx][0] =
              pcost->base_lf_eob_cost_uv[ctx][a0 - 1] + av1_cost_literal(1);
          pcost->base_lf_eob_cost_uv_tbl[idx][ctx][1] =
              pcost->base_lf_eob_cost_uv[ctx][a2 - 1] + av1_cost_literal(1);
        }
      }
#else
      for (int ctx = 0; ctx < LF_SIG_COEF_CONTEXTS_UV; ++ctx) {
        av1_cost_tokens_from_cdf(pcost->base_lf_cost_uv[ctx],
                                 fc->coeff_base_lf_uv_cdf[ctx], NULL);
      }
      for (int ctx = 0; ctx < SIG_COEF_CONTEXTS_UV; ++ctx) {
        av1_cost_tokens_from_cdf(pcost->base_cost_uv[ctx],
                                 fc->coeff_base_uv_cdf[ctx], NULL);
      }
      for (int ctx = 0; ctx < LF_SIG_COEF_CONTEXTS; ++ctx) {
        av1_cost_tokens_from_cdf(pcost->base_lf_cost[ctx],
                                 fc->coeff_base_lf_cdf[tx_size][ctx], NULL);
      }
      for (int ctx = 0; ctx < SIG_COEF_CONTEXTS; ++ctx) {
        av1_cost_tokens_from_cdf(pcost->base_cost[ctx],
                                 fc->coeff_base_cdf[tx_size][ctx], NULL);
      }
#endif  // CONFIG_TCQ
#else
      for (int ctx = 0; ctx < SIG_COEF_CONTEXTS_EOB; ++ctx)
        av1_cost_tokens_from_cdf(pcost->base_eob_cost[ctx],
                                 fc->coeff_base_eob_cdf[tx_size][plane][ctx],
                                 NULL);
      for (int ctx = 0; ctx < SIG_COEF_CONTEXTS_EOB; ++ctx)
        av1_cost_tokens_from_cdf(pcost->base_lf_eob_cost[ctx],
                                 fc->coeff_base_lf_eob_cdf[tx_size][plane][ctx],
                                 NULL);
      for (int ctx = 0; ctx < LF_SIG_COEF_CONTEXTS; ++ctx) {
        av1_cost_tokens_from_cdf(pcost->base_lf_cost[ctx],
                                 fc->coeff_base_lf_cdf[tx_size][plane][ctx],
                                 NULL);
      }
      for (int ctx = 0; ctx < SIG_COEF_CONTEXTS; ++ctx) {
        av1_cost_tokens_from_cdf(pcost->base_cost[ctx],
                                 fc->coeff_base_cdf[tx_size][plane][ctx], NULL);
      }
#endif  // CONFIG_CHROMA_CODING
      for (int ctx = 0; ctx < SIG_COEF_CONTEXTS_BOB; ++ctx)
        av1_cost_tokens_from_cdf(
            pcost->base_bob_cost[ctx],
#if CONFIG_IMPROVEIDTX
            fc->coeff_base_bob_cdf[AOMMIN(tx_size, TX_16X16)][ctx], NULL);
#else
            fc->coeff_base_bob_cdf[ctx], NULL);
#endif  // CONFIG_IMPROVEIDTX
      for (int ctx = 0; ctx < EOB_COEF_CONTEXTS; ++ctx)
        av1_cost_tokens_from_cdf(pcost->eob_extra_cost[ctx],
                                 fc->eob_extra_cdf[tx_size][plane][ctx], NULL);
#if CONFIG_IMPROVEIDTX
      for (int gr = 0; gr < DC_SIGN_GROUPS; ++gr) {
        for (int ctx = 0; ctx < DC_SIGN_CONTEXTS; ++ctx) {
          av1_cost_tokens_from_cdf(pcost->dc_sign_cost[gr][ctx],
                                   fc->dc_sign_cdf[plane][gr][ctx], NULL);
        }
      }
#else
      for (int ctx = 0; ctx < DC_SIGN_CONTEXTS; ++ctx)
        av1_cost_tokens_from_cdf(pcost->dc_sign_cost[ctx],
                                 fc->dc_sign_cdf[plane][ctx], NULL);
#endif  // CONFIG_IMPROVEIDTX
#if CONFIG_CONTEXT_DERIVATION
      if (plane == PLANE_TYPE_UV) {
        for (int i = 0; i < CROSS_COMPONENT_CONTEXTS; ++i)
          for (int ctx = 0; ctx < DC_SIGN_CONTEXTS; ++ctx)
            av1_cost_tokens_from_cdf(pcost->v_dc_sign_cost[i][ctx],
                                     fc->v_dc_sign_cdf[i][ctx], NULL);
        for (int i = 0; i < CROSS_COMPONENT_CONTEXTS; ++i)
          av1_cost_tokens_from_cdf(pcost->v_ac_sign_cost[i],
                                   fc->v_ac_sign_cdf[i], NULL);
      }
#endif  // CONFIG_CONTEXT_DERIVATION

#if CONFIG_CHROMA_CODING
      for (int ctx = 0; ctx < LF_LEVEL_CONTEXTS_UV; ++ctx) {
        int br_lf_cctx_rate[BR_CDF_SIZE];
        int prev_cost_lf_cctx = 0;
        int i, j;
        av1_cost_tokens_from_cdf(br_lf_cctx_rate, fc->coeff_br_lf_uv_cdf[ctx],
                                 NULL);
        for (i = 0; i < COEFF_BASE_RANGE; i += BR_CDF_SIZE - 1) {
          for (j = 0; j < BR_CDF_SIZE - 1; j++) {
            pcost->lps_lf_cost_uv[ctx][i + j] =
                prev_cost_lf_cctx + br_lf_cctx_rate[j];
          }
          prev_cost_lf_cctx += br_lf_cctx_rate[j];
        }
        pcost->lps_lf_cost_uv[ctx][i] = prev_cost_lf_cctx;
      }
      for (int ctx = 0; ctx < LF_LEVEL_CONTEXTS_UV; ++ctx) {
        pcost->lps_lf_cost_uv[ctx][0 + COEFF_BASE_RANGE + 1] =
            pcost->lps_lf_cost_uv[ctx][0];
        for (int i = 1; i <= COEFF_BASE_RANGE; ++i) {
          pcost->lps_lf_cost_uv[ctx][i + COEFF_BASE_RANGE + 1] =
              pcost->lps_lf_cost_uv[ctx][i] - pcost->lps_lf_cost_uv[ctx][i - 1];
        }
      }

      for (int ctx = 0; ctx < LEVEL_CONTEXTS_UV; ++ctx) {
        int br_rate_cctx[BR_CDF_SIZE];
        int prev_cost_cctx = 0;
        int i, j;
        av1_cost_tokens_from_cdf(br_rate_cctx, fc->coeff_br_uv_cdf[ctx], NULL);
        for (i = 0; i < COEFF_BASE_RANGE; i += BR_CDF_SIZE - 1) {
          for (j = 0; j < BR_CDF_SIZE - 1; j++) {
            pcost->lps_cost_uv[ctx][i + j] = prev_cost_cctx + br_rate_cctx[j];
          }
          prev_cost_cctx += br_rate_cctx[j];
        }
        pcost->lps_cost_uv[ctx][i] = prev_cost_cctx;
      }
      for (int ctx = 0; ctx < LEVEL_CONTEXTS_UV; ++ctx) {
        pcost->lps_cost_uv[ctx][0 + COEFF_BASE_RANGE + 1] =
            pcost->lps_cost_uv[ctx][0];
        for (int i = 1; i <= COEFF_BASE_RANGE; ++i) {
          pcost->lps_cost_uv[ctx][i + COEFF_BASE_RANGE + 1] =
              pcost->lps_cost_uv[ctx][i] - pcost->lps_cost_uv[ctx][i - 1];
        }
      }
#endif  // CONFIG_CHROMA_CODING

      for (int ctx = 0; ctx < LF_LEVEL_CONTEXTS; ++ctx) {
        int br_lf_rate[BR_CDF_SIZE];
        int prev_cost_lf = 0;
        int i, j;
#if CONFIG_CHROMA_CODING
        av1_cost_tokens_from_cdf(br_lf_rate, fc->coeff_br_lf_cdf[ctx], NULL);
#else
        av1_cost_tokens_from_cdf(br_lf_rate, fc->coeff_br_lf_cdf[plane][ctx],
                                 NULL);
#endif  // CONFIG_CHROMA_CODING
        for (i = 0; i < COEFF_BASE_RANGE; i += BR_CDF_SIZE - 1) {
          for (j = 0; j < BR_CDF_SIZE - 1; j++) {
            pcost->lps_lf_cost[ctx][i + j] = prev_cost_lf + br_lf_rate[j];
          }
          prev_cost_lf += br_lf_rate[j];
        }
        pcost->lps_lf_cost[ctx][i] = prev_cost_lf;
      }
      for (int ctx = 0; ctx < LF_LEVEL_CONTEXTS; ++ctx) {
        pcost->lps_lf_cost[ctx][0 + COEFF_BASE_RANGE + 1] =
            pcost->lps_lf_cost[ctx][0];
        for (int i = 1; i <= COEFF_BASE_RANGE; ++i) {
          pcost->lps_lf_cost[ctx][i + COEFF_BASE_RANGE + 1] =
              pcost->lps_lf_cost[ctx][i] - pcost->lps_lf_cost[ctx][i - 1];
        }
      }
      for (int ctx = 0; ctx < LEVEL_CONTEXTS; ++ctx) {
        int br_rate[BR_CDF_SIZE];
        int prev_cost = 0;
        int i, j;
        av1_cost_tokens_from_cdf(
#if CONFIG_CHROMA_CODING
            br_rate, fc->coeff_br_cdf[ctx],
#else
            br_rate, fc->coeff_br_cdf[plane][ctx],
#endif  // CONFIG_CHROMA_CODING
            NULL);
        // printf("br_rate: ");
        // for(j = 0; j < BR_CDF_SIZE; j++)
        //  printf("%4d ", br_rate[j]);
        // printf("\n");
        for (i = 0; i < COEFF_BASE_RANGE; i += BR_CDF_SIZE - 1) {
          for (j = 0; j < BR_CDF_SIZE - 1; j++) {
            pcost->lps_cost[ctx][i + j] = prev_cost + br_rate[j];
          }
          prev_cost += br_rate[j];
        }
        pcost->lps_cost[ctx][i] = prev_cost;
        // printf("lps_cost: %d %d %2d : ", tx_size, plane, ctx);
        // for (i = 0; i <= COEFF_BASE_RANGE; i++)
        //  printf("%5d ", pcost->lps_cost[ctx][i]);
        // printf("\n");
      }
      for (int ctx = 0; ctx < LEVEL_CONTEXTS; ++ctx) {
        pcost->lps_cost[ctx][0 + COEFF_BASE_RANGE + 1] =
            pcost->lps_cost[ctx][0];
        for (int i = 1; i <= COEFF_BASE_RANGE; ++i) {
          pcost->lps_cost[ctx][i + COEFF_BASE_RANGE + 1] =
              pcost->lps_cost[ctx][i] - pcost->lps_cost[ctx][i - 1];
        }
      }
#if CONFIG_TCQ
      // Precalc mid costs for default region.
      for (int idx = 0; idx < 5 + 2 * COEFF_BASE_RANGE; idx++) {
        int a0 = get_low_range(trel_abslev[idx][0], 0);
        int a1 = get_low_range(trel_abslev[idx][1], 0);
        int a2 = get_low_range(trel_abslev[idx][2], 0);
        int a3 = get_low_range(trel_abslev[idx][3], 0);
        for (int ctx = 0; ctx < LEVEL_CONTEXTS; ++ctx) {
          // Q0, absLev 0 / 2
          pcost->mid_cost_tbl[idx][ctx][0][0] =
              a0 < 0 ? 0 : pcost->lps_cost[ctx][a0];
          pcost->mid_cost_tbl[idx][ctx][0][1] =
              a2 < 0 ? 0 : pcost->lps_cost[ctx][a2];
          // Q1, absLev 1 / 3
          pcost->mid_cost_tbl[idx][ctx][1][0] =
              a1 < 0 ? 0 : pcost->lps_cost[ctx][a1];
          pcost->mid_cost_tbl[idx][ctx][1][1] =
              a3 < 0 ? 0 : pcost->lps_cost[ctx][a3];
        }
      }
      // Precalc mid costs for default region.
      for (int idx = 0; idx < 9 + 2 * COEFF_BASE_RANGE; idx++) {
        int a0 = get_low_range(trel_abslev[idx][0], 1);
        int a1 = get_low_range(trel_abslev[idx][1], 1);
        int a2 = get_low_range(trel_abslev[idx][2], 1);
        int a3 = get_low_range(trel_abslev[idx][3], 1);
        for (int ctx = 0; ctx < LF_LEVEL_CONTEXTS; ++ctx) {
          // Q0, absLev 0 / 2
          pcost->mid_lf_cost_tbl[idx][ctx][0][0] =
              a0 < 0 ? 0 : pcost->lps_lf_cost[ctx][a0];
          pcost->mid_lf_cost_tbl[idx][ctx][0][1] =
              a2 < 0 ? 0 : pcost->lps_lf_cost[ctx][a2];
          // Q1, absLev 1 / 3
          pcost->mid_lf_cost_tbl[idx][ctx][1][0] =
              a1 < 0 ? 0 : pcost->lps_lf_cost[ctx][a1];
          pcost->mid_lf_cost_tbl[idx][ctx][1][1] =
              a3 < 0 ? 0 : pcost->lps_lf_cost[ctx][a3];
        }
      }
#endif  // CONFIG_TCQ
    }
  }

  for (int tx_size = 0; tx_size < TX_SIZES; ++tx_size) {
    int plane = PLANE_TYPE_Y;
#if CONFIG_IMPROVEIDTX
    int tx_size_ctx = AOMMIN(tx_size, TX_16X16);
#endif  // CONFIG_IMPROVEIDTX
    LV_MAP_COEFF_COST *pcost = &coeff_costs->coeff_costs[tx_size][plane];
    for (int ctx = 0; ctx < IDTX_SIG_COEF_CONTEXTS; ++ctx)
      av1_cost_tokens_from_cdf(pcost->idtx_base_cost[ctx],
#if CONFIG_IMPROVEIDTX
                               fc->coeff_base_cdf_idtx[tx_size_ctx][ctx], NULL);
#else
                               fc->coeff_base_cdf_idtx[ctx], NULL);
#endif  // CONFIG_IMPROVEIDTX
    for (int ctx = 0; ctx < IDTX_SIG_COEF_CONTEXTS; ++ctx) {
      pcost->idtx_base_cost[ctx][4] = 0;
      pcost->idtx_base_cost[ctx][5] = pcost->idtx_base_cost[ctx][1] +
                                      av1_cost_literal(1) -
                                      pcost->idtx_base_cost[ctx][0];
      pcost->idtx_base_cost[ctx][6] =
          pcost->idtx_base_cost[ctx][2] - pcost->idtx_base_cost[ctx][1];
      pcost->idtx_base_cost[ctx][7] =
          pcost->idtx_base_cost[ctx][3] - pcost->idtx_base_cost[ctx][2];
    }
    for (int ctx = 0; ctx < IDTX_SIGN_CONTEXTS; ++ctx)
      av1_cost_tokens_from_cdf(pcost->idtx_sign_cost[ctx],
#if CONFIG_IMPROVEIDTX
                               fc->idtx_sign_cdf[tx_size_ctx][ctx], NULL);
#else
                               fc->idtx_sign_cdf[ctx], NULL);
#endif  // CONFIG_IMPROVEIDTX
    for (int ctx = 0; ctx < IDTX_LEVEL_CONTEXTS; ++ctx) {
      int br_rate_skip[BR_CDF_SIZE];
      int prev_cost_skip = 0;
      int i, j;
#if CONFIG_IMPROVEIDTX
      av1_cost_tokens_from_cdf(br_rate_skip,
                               fc->coeff_br_cdf_idtx[tx_size_ctx][ctx], NULL);
#else
      av1_cost_tokens_from_cdf(br_rate_skip, fc->coeff_br_cdf_idtx[ctx], NULL);
#endif  // CONFIG_IMPROVEIDTX
      for (i = 0; i < COEFF_BASE_RANGE; i += BR_CDF_SIZE - 1) {
        for (j = 0; j < BR_CDF_SIZE - 1; j++) {
          pcost->lps_cost_skip[ctx][i + j] = prev_cost_skip + br_rate_skip[j];
        }
        prev_cost_skip += br_rate_skip[j];
      }
      pcost->lps_cost_skip[ctx][i] = prev_cost_skip;
    }
    for (int ctx = 0; ctx < IDTX_LEVEL_CONTEXTS; ++ctx) {
      pcost->lps_cost_skip[ctx][0 + COEFF_BASE_RANGE + 1] =
          pcost->lps_cost_skip[ctx][0];
      for (int i = 1; i <= COEFF_BASE_RANGE; ++i) {
        pcost->lps_cost_skip[ctx][i + COEFF_BASE_RANGE + 1] =
            pcost->lps_cost_skip[ctx][i] - pcost->lps_cost_skip[ctx][i - 1];
      }
    }
  }

  const int tx_size = TX_4X4;
  const int plane_type = 0;
  LV_MAP_COEFF_COST *pcost = &coeff_costs->coeff_costs[tx_size][plane_type];
  for (int ctx = 0; ctx < COEFF_BASE_PH_CONTEXTS; ++ctx) {
    av1_cost_tokens_from_cdf(pcost->base_ph_cost[ctx],
                             fc->coeff_base_ph_cdf[ctx], NULL);
  }

  for (int ctx = 0; ctx < COEFF_BR_PH_CONTEXTS; ++ctx) {
    int br_ph_rate[BR_CDF_SIZE];
    int prev_cost = 0;
    int i, j;
    av1_cost_tokens_from_cdf(br_ph_rate, fc->coeff_br_ph_cdf[ctx], NULL);
    for (i = 0; i < COEFF_BASE_RANGE; i += BR_CDF_SIZE - 1) {
      for (j = 0; j < BR_CDF_SIZE - 1; j++) {
        pcost->lps_ph_cost[ctx][i + j] = prev_cost + br_ph_rate[j];
      }
      prev_cost += br_ph_rate[j];
    }
    pcost->lps_ph_cost[ctx][i] = prev_cost;
  }
  for (int ctx = 0; ctx < COEFF_BR_PH_CONTEXTS; ++ctx) {
    pcost->lps_ph_cost[ctx][0 + COEFF_BASE_RANGE + 1] =
        pcost->lps_ph_cost[ctx][0];
    for (int i = 1; i <= COEFF_BASE_RANGE; ++i) {
      pcost->lps_ph_cost[ctx][i + COEFF_BASE_RANGE + 1] =
          pcost->lps_ph_cost[ctx][i] - pcost->lps_ph_cost[ctx][i - 1];
    }
  }
}

#if CONFIG_IBC_SUBPEL_PRECISION
void fill_dv_costs(IntraBCMvCosts *dv_costs, const FRAME_CONTEXT *fc,
                   MvCosts *mv_costs) {
  for (MvSubpelPrecision pb_mv_precision = 0;
       pb_mv_precision < NUM_MV_PRECISIONS; pb_mv_precision++) {
#if CONFIG_VQ_MVD_CODING
    av1_build_vq_nmv_cost_table(NULL, &fc->ndvc, pb_mv_precision, dv_costs, 1);
    // Copy values from the dv_costs to the mv_costs
    mv_costs->dv_joint_shell_cost[pb_mv_precision] =
        &dv_costs->dv_joint_shell_cost[pb_mv_precision][0];
    for (int i = 0; i < (MAX_COL_TRUNCATED_UNARY_VAL + 1); i++) {
      for (int j = 0; j < (MAX_COL_TRUNCATED_UNARY_VAL + 1); j++) {
        mv_costs->dv_col_mv_greater_flags_costs[pb_mv_precision][i][j] =
            dv_costs->dv_col_mv_greater_flags_costs[pb_mv_precision][i][j];
      }
    }

    for (int i = 0; i < NUM_CTX_COL_MV_INDEX; i++) {
      for (int j = 0; j < 2; j++) {
        mv_costs->dv_col_mv_index_cost[pb_mv_precision][i][j] =
            dv_costs->dv_col_mv_index_cost[pb_mv_precision][i][j];
      }
    }

    for (int i = 0; i < 2; i++) {
      for (int j = 0; j < 2; j++) {
        mv_costs->dv_sign_cost[pb_mv_precision][i][j] =
            dv_costs->dv_sign_cost[pb_mv_precision][i][j];
      }
    }
#else
    dv_costs->dv_costs[0] = &dv_costs->dv_costs_alloc[0][MV_MAX];
    dv_costs->dv_costs[1] = &dv_costs->dv_costs_alloc[1][MV_MAX];
    av1_build_nmv_cost_table(dv_costs->joint_mv, dv_costs->dv_costs, &fc->ndvc,
                             MV_PRECISION_ONE_PEL, 0
#if CONFIG_DERIVED_MVD_SIGN
                             ,
                             dv_costs->dv_sign_cost
#endif  // CONFIG_DERIVED_MVD_SIGN
    );

#if CONFIG_IBC_BV_IMPROVEMENT
    // Copy the pointer of the dv cost to the mvcost
    mv_costs->dv_joint_cost = &dv_costs->joint_mv[0];
    mv_costs->dv_nmv_cost[0] = dv_costs->dv_costs[0];
    mv_costs->dv_nmv_cost[1] = dv_costs->dv_costs[1];
#else
    (void)mv_costs;
#endif
#endif  // CONFIG_VQ_MVD_CODING
  }
}
#else
void fill_dv_costs(IntraBCMvCosts *dv_costs, const FRAME_CONTEXT *fc,
                   MvCosts *mv_costs) {
#if CONFIG_VQ_MVD_CODING
  av1_build_vq_nmv_cost_table(NULL, &fc->ndvc, MV_PRECISION_ONE_PEL, dv_costs,
                              1);

  // Copy values from the dv_costs to the mv_costs
  mv_costs->dv_joint_shell_cost = &dv_costs->dv_joint_shell_cost[0];
  for (int i = 0; i < (MAX_COL_TRUNCATED_UNARY_VAL + 1); i++) {
    for (int j = 0; j < (MAX_COL_TRUNCATED_UNARY_VAL + 1); j++) {
      mv_costs->dv_col_mv_greater_flags_costs[i][j] =
          dv_costs->dv_col_mv_greater_flags_costs[i][j];
    }
  }

  for (int i = 0; i < NUM_CTX_COL_MV_INDEX; i++) {
    for (int j = 0; j < 2; j++) {
      mv_costs->dv_col_mv_index_cost[i][j] =
          dv_costs->dv_col_mv_index_cost[i][j];
    }
  }

  for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 2; j++) {
      mv_costs->dv_sign_cost[i][j] = dv_costs->dv_sign_cost[i][j];
    }
  }
#else
  dv_costs->dv_costs[0] = &dv_costs->dv_costs_alloc[0][MV_MAX];
  dv_costs->dv_costs[1] = &dv_costs->dv_costs_alloc[1][MV_MAX];
  av1_build_nmv_cost_table(dv_costs->joint_mv, dv_costs->dv_costs, &fc->ndvc,
                           MV_PRECISION_ONE_PEL, 0
#if CONFIG_DERIVED_MVD_SIGN
                           ,
                           dv_costs->dv_sign_cost
#endif  // CONFIG_DERIVED_MVD_SIGN
  );

#if CONFIG_IBC_BV_IMPROVEMENT
  // Copy the pointer of the dv cost to the mvcost
  mv_costs->dv_joint_cost = &dv_costs->joint_mv[0];
  mv_costs->dv_nmv_cost[0] = dv_costs->dv_costs[0];
  mv_costs->dv_nmv_cost[1] = dv_costs->dv_costs[1];
#else
  (void)mv_costs;
#endif
#endif  // CONFIG_VQ_MVD_CODING
}

#endif  // CONFIG_IBC_SUBPEL_PRECISION

void av1_fill_mv_costs(const FRAME_CONTEXT *fc, int integer_mv,
                       MvSubpelPrecision fr_mv_precision, MvCosts *mv_costs) {
#if CONFIG_VQ_MVD_CODING
  int mb_precision_set =
      (fr_mv_precision == MV_PRECISION_QTR_PEL) ? NUMBER_OF_PRECISION_SETS : 0;
  const PRECISION_SET *precision_def = &av1_mv_precision_sets[mb_precision_set];
  for (int precision_dx = precision_def->num_precisions - 1; precision_dx >= 0;
       precision_dx--) {
    MvSubpelPrecision pb_mv_prec = precision_def->precision[precision_dx];

    av1_build_vq_nmv_cost_table(mv_costs, &fc->nmvc, pb_mv_prec, NULL, 0);
#else
  for (MvSubpelPrecision pb_mv_prec = MV_PRECISION_8_PEL;
       pb_mv_prec < (NUM_MV_PRECISIONS); pb_mv_prec++) {
#endif  // CONFIG_VQ_MVD_CODING

#if !CONFIG_VQ_MVD_CODING
    mv_costs->nmv_costs[pb_mv_prec][0] =
        &mv_costs->nmv_costs_alloc[pb_mv_prec][0][MV_MAX];
    mv_costs->nmv_costs[pb_mv_prec][1] =
        &mv_costs->nmv_costs_alloc[pb_mv_prec][1][MV_MAX];
    av1_build_nmv_cost_table(mv_costs->nmv_joint_cost,
                             mv_costs->nmv_costs[pb_mv_prec], &fc->nmvc,
                             pb_mv_prec, 0
#if CONFIG_DERIVED_MVD_SIGN
                             ,
                             mv_costs->nmv_sign_cost
#endif  // CONFIG_DERIVED_MVD_SIGN
    );
#endif  //! CONFIG_VQ_MVD_CODING
    (void)integer_mv;
  }
#if CONFIG_VQ_MVD_CODING
  av1_build_vq_amvd_nmv_cost_table(mv_costs, &fc->nmvc);
  (void)fr_mv_precision;
#else

  mv_costs->amvd_nmv_cost[0] = &mv_costs->amvd_nmv_cost_alloc[0][MV_MAX];
  mv_costs->amvd_nmv_cost[1] = &mv_costs->amvd_nmv_cost_alloc[1][MV_MAX];
  av1_build_nmv_cost_table(
      mv_costs->amvd_nmv_joint_cost, mv_costs->amvd_nmv_cost, &fc->nmvc,
#if BUGFIX_AMVD_AMVR
      (fr_mv_precision <= MV_PRECISION_QTR_PEL ? fr_mv_precision
                                               : MV_PRECISION_QTR_PEL),
#else
      fr_mv_precision,
#endif
      1
#if CONFIG_DERIVED_MVD_SIGN
      ,
      mv_costs->amvd_nmv_sign_cost
#endif  // CONFIG_DERIVED_MVD_SIGN
  );
#endif  // CONFIG_VQ_MVD_CODING
}

void av1_initialize_rd_consts(AV1_COMP *cpi) {
  AV1_COMMON *const cm = &cpi->common;
  MACROBLOCK *const x = &cpi->td.mb;
  RD_OPT *const rd = &cpi->rd;
  MvCosts *mv_costs = &x->mv_costs;

  aom_clear_system_state();

  rd->RDMULT = av1_compute_rd_mult(
      cpi, cm->quant_params.base_qindex + cm->quant_params.y_dc_delta_q);

  av1_set_error_per_bit(mv_costs, rd->RDMULT);

  set_block_thresholds(cm, rd);

  if ((cpi->oxcf.cost_upd_freq.mv != COST_UPD_OFF) || frame_is_intra_only(cm) ||
      (cm->current_frame.frame_number & 0x07) == 1)
    av1_fill_mv_costs(cm->fc, cm->features.cur_frame_force_integer_mv,
                      cm->features.fr_mv_precision, mv_costs);

  if (
#if CONFIG_ENABLE_IBC_NAT
      cm->features.allow_intrabc &&
#else
      cm->features.allow_screen_content_tools &&
#endif  // CONFIG_ENABLE_IBC_NAT
#if !CONFIG_IBC_BV_IMPROVEMENT
      frame_is_intra_only(cm) &&
#endif  // !CONFIG_IBC_BV_IMPROVEMENT
      !is_stat_generation_stage(cpi)) {
    fill_dv_costs(&x->dv_costs, cm->fc, mv_costs);
  }
}

static void model_rd_norm(int xsq_q10, int *r_q10, int *d_q10) {
  // NOTE: The tables below must be of the same size.

  // The functions described below are sampled at the four most significant
  // bits of x^2 + 8 / 256.

  // Normalized rate:
  // This table models the rate for a Laplacian source with given variance
  // when quantized with a uniform quantizer with given stepsize. The
  // closed form expression is:
  // Rn(x) = H(sqrt(r)) + sqrt(r)*[1 + H(r)/(1 - r)],
  // where r = exp(-sqrt(2) * x) and x = qpstep / sqrt(variance),
  // and H(x) is the binary entropy function.
  static const int rate_tab_q10[] = {
    65536, 6086, 5574, 5275, 5063, 4899, 4764, 4651, 4553, 4389, 4255, 4142,
    4044,  3958, 3881, 3811, 3748, 3635, 3538, 3453, 3376, 3307, 3244, 3186,
    3133,  3037, 2952, 2877, 2809, 2747, 2690, 2638, 2589, 2501, 2423, 2353,
    2290,  2232, 2179, 2130, 2084, 2001, 1928, 1862, 1802, 1748, 1698, 1651,
    1608,  1530, 1460, 1398, 1342, 1290, 1243, 1199, 1159, 1086, 1021, 963,
    911,   864,  821,  781,  745,  680,  623,  574,  530,  490,  455,  424,
    395,   345,  304,  269,  239,  213,  190,  171,  154,  126,  104,  87,
    73,    61,   52,   44,   38,   28,   21,   16,   12,   10,   8,    6,
    5,     3,    2,    1,    1,    1,    0,    0,
  };
  // Normalized distortion:
  // This table models the normalized distortion for a Laplacian source
  // with given variance when quantized with a uniform quantizer
  // with given stepsize. The closed form expression is:
  // Dn(x) = 1 - 1/sqrt(2) * x / sinh(x/sqrt(2))
  // where x = qpstep / sqrt(variance).
  // Note the actual distortion is Dn * variance.
  static const int dist_tab_q10[] = {
    0,    0,    1,    1,    1,    2,    2,    2,    3,    3,    4,    5,
    5,    6,    7,    7,    8,    9,    11,   12,   13,   15,   16,   17,
    18,   21,   24,   26,   29,   31,   34,   36,   39,   44,   49,   54,
    59,   64,   69,   73,   78,   88,   97,   106,  115,  124,  133,  142,
    151,  167,  184,  200,  215,  231,  245,  260,  274,  301,  327,  351,
    375,  397,  418,  439,  458,  495,  528,  559,  587,  613,  637,  659,
    680,  717,  749,  777,  801,  823,  842,  859,  874,  899,  919,  936,
    949,  960,  969,  977,  983,  994,  1001, 1006, 1010, 1013, 1015, 1017,
    1018, 1020, 1022, 1022, 1023, 1023, 1023, 1024,
  };
  static const int xsq_iq_q10[] = {
    0,      4,      8,      12,     16,     20,     24,     28,     32,
    40,     48,     56,     64,     72,     80,     88,     96,     112,
    128,    144,    160,    176,    192,    208,    224,    256,    288,
    320,    352,    384,    416,    448,    480,    544,    608,    672,
    736,    800,    864,    928,    992,    1120,   1248,   1376,   1504,
    1632,   1760,   1888,   2016,   2272,   2528,   2784,   3040,   3296,
    3552,   3808,   4064,   4576,   5088,   5600,   6112,   6624,   7136,
    7648,   8160,   9184,   10208,  11232,  12256,  13280,  14304,  15328,
    16352,  18400,  20448,  22496,  24544,  26592,  28640,  30688,  32736,
    36832,  40928,  45024,  49120,  53216,  57312,  61408,  65504,  73696,
    81888,  90080,  98272,  106464, 114656, 122848, 131040, 147424, 163808,
    180192, 196576, 212960, 229344, 245728,
  };
  const int tmp = (xsq_q10 >> 2) + 8;
  const int k = get_msb(tmp) - 3;
  const int xq = (k << 3) + ((tmp >> k) & 0x7);
  const int one_q10 = 1 << 10;
  const int a_q10 = ((xsq_q10 - xsq_iq_q10[xq]) << 10) >> (2 + k);
  const int b_q10 = one_q10 - a_q10;
  *r_q10 = (rate_tab_q10[xq] * b_q10 + rate_tab_q10[xq + 1] * a_q10) >> 10;
  *d_q10 = (dist_tab_q10[xq] * b_q10 + dist_tab_q10[xq + 1] * a_q10) >> 10;
}

void av1_model_rd_from_var_lapndz(int64_t var, unsigned int n_log2,
                                  unsigned int qstep, int *rate,
                                  int64_t *dist) {
  // This function models the rate and distortion for a Laplacian
  // source with given variance when quantized with a uniform quantizer
  // with given stepsize. The closed form expressions are in:
  // Hang and Chen, "Source Model for transform video coder and its
  // application - Part I: Fundamental Theory", IEEE Trans. Circ.
  // Sys. for Video Tech., April 1997.
  if (var == 0) {
    *rate = 0;
    *dist = 0;
  } else {
    int d_q10, r_q10;
    static const uint32_t MAX_XSQ_Q10 = 245727;
    const uint64_t xsq_q10_64 =
        (((uint64_t)qstep * qstep << (n_log2 + 10)) + (var >> 1)) / var;
    const int xsq_q10 = (int)AOMMIN(xsq_q10_64, MAX_XSQ_Q10);
    model_rd_norm(xsq_q10, &r_q10, &d_q10);
    *rate = ROUND_POWER_OF_TWO(r_q10 << n_log2, 10 - AV1_PROB_COST_SHIFT);
    *dist = (var * (int64_t)d_q10 + 512) >> 10;
  }
}

static double interp_cubic(const double *p, double x) {
  return p[1] + 0.5 * x *
                    (p[2] - p[0] +
                     x * (2.0 * p[0] - 5.0 * p[1] + 4.0 * p[2] - p[3] +
                          x * (3.0 * (p[1] - p[2]) + p[3] - p[0])));
}

/*
static double interp_bicubic(const double *p, int p_stride, double x,
                             double y) {
  double q[4];
  q[0] = interp_cubic(p, x);
  q[1] = interp_cubic(p + p_stride, x);
  q[2] = interp_cubic(p + 2 * p_stride, x);
  q[3] = interp_cubic(p + 3 * p_stride, x);
  return interp_cubic(q, y);
}
*/

static const uint8_t bsize_curvfit_model_cat_lookup[BLOCK_SIZES_ALL] = {
  0,
  0,
  0,
  1,
  1,
  1,
  2,
  2,
  2,
  3,
  3,
  3,
  3,
  3,
  3,
  3,
#if CONFIG_EXT_RECUR_PARTITIONS
  3,
  3,
  3,
#endif  // CONFIG_EXT_RECUR_PARTITIONS
  1,
  1,
  2,
  2,
  3,
  3,
#if CONFIG_EXT_RECUR_PARTITIONS
  1,
  1,
  2,
  2,
  2,
  2,
#endif  // CONFIG_EXT_RECUR_PARTITIONS
};

static int sse_norm_curvfit_model_cat_lookup(double sse_norm) {
  return (sse_norm > 16.0);
}

// Models distortion by sse using a logistic function on
// l = log2(sse / q^2) as:
// dbysse = 16 / (1 + k exp(l + c))
static double get_dbysse_logistic(double l, double c, double k) {
  const double A = 16.0;
  const double dbysse = A / (1 + k * exp(l + c));
  return dbysse;
}

// Models rate using a clamped linear function on
// l = log2(sse / q^2) as:
// rate = max(0, a + b * l)
static double get_rate_clamplinear(double l, double a, double b) {
  const double rate = a + b * l;
  return (rate < 0 ? 0 : rate);
}

static const uint8_t bsize_surffit_model_cat_lookup[BLOCK_SIZES_ALL] = {
  0,
  0,
  0,
  0,
  1,
  1,
  2,
  3,
  3,
  4,
  5,
  5,
  6,
  7,
  7,
  8,
#if CONFIG_EXT_RECUR_PARTITIONS
  8,
  8,
  8,
#endif  // CONFIG_EXT_RECUR_PARTITIONS
  0,
  0,
  2,
  2,
  4,
  4,
#if CONFIG_EXT_RECUR_PARTITIONS
  1,
  1,
  3,
  3,
  2,
  2,
#endif  // CONFIG_EXT_RECUR_PARTITIONS
};

// TODO(any): Add models for BLOCK_256
static const double surffit_rate_params[9][4] = {
  {
      638.390212,
      2.253108,
      166.585650,
      -3.939401,
  },
  {
      5.256905,
      81.997240,
      -1.321771,
      17.694216,
  },
  {
      -74.193045,
      72.431868,
      -19.033152,
      15.407276,
  },
  {
      416.770113,
      14.794188,
      167.686830,
      -6.997756,
  },
  {
      378.511276,
      9.558376,
      154.658843,
      -6.635663,
  },
  {
      277.818787,
      4.413180,
      150.317637,
      -9.893038,
  },
  {
      142.212132,
      11.542038,
      94.393964,
      -5.518517,
  },
  {
      219.100256,
      4.007421,
      108.932852,
      -6.981310,
  },
  {
      222.261971,
      3.251049,
      95.972916,
      -5.609789,
  },
};

static const double surffit_dist_params[7] = { 1.475844,  4.328362, -5.680233,
                                               -0.500994, 0.554585, 4.839478,
                                               -0.695837 };

static void rate_surffit_model_params_lookup(BLOCK_SIZE bsize, double xm,
                                             double *rpar) {
  const int cat = bsize_surffit_model_cat_lookup[bsize];
  rpar[0] = surffit_rate_params[cat][0] + surffit_rate_params[cat][1] * xm;
  rpar[1] = surffit_rate_params[cat][2] + surffit_rate_params[cat][3] * xm;
}

static void dist_surffit_model_params_lookup(BLOCK_SIZE bsize, double xm,
                                             double *dpar) {
  (void)bsize;
  const double *params = surffit_dist_params;
  dpar[0] = params[0] + params[1] / (1 + exp((xm + params[2]) * params[3]));
  dpar[1] = params[4] + params[5] * exp(params[6] * xm);
}

void av1_model_rd_surffit(BLOCK_SIZE bsize, double sse_norm, double xm,
                          double yl, double *rate_f, double *distbysse_f) {
  (void)sse_norm;
  double rpar[2], dpar[2];
  rate_surffit_model_params_lookup(bsize, xm, rpar);
  dist_surffit_model_params_lookup(bsize, xm, dpar);

  *rate_f = get_rate_clamplinear(yl, rpar[0], rpar[1]);
  *distbysse_f = get_dbysse_logistic(yl, dpar[0], dpar[1]);
}

static const double interp_rgrid_curv[4][65] = {
  {
      0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
      0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
      0.000000,    118.257702,  120.210658,  121.434853,  122.100487,
      122.377758,  122.436865,  72.290102,   96.974289,   101.652727,
      126.830141,  140.417377,  157.644879,  184.315291,  215.823873,
      262.300169,  335.919859,  420.624173,  519.185032,  619.854243,
      726.053595,  827.663369,  933.127475,  1037.988755, 1138.839609,
      1233.342933, 1333.508064, 1428.760126, 1533.396364, 1616.952052,
      1744.539319, 1803.413586, 1951.466618, 1994.227838, 2086.031680,
      2148.635443, 2239.068450, 2222.590637, 2338.859809, 2402.929011,
      2418.727875, 2435.342670, 2471.159469, 2523.187446, 2591.183827,
      2674.905840, 2774.110714, 2888.555675, 3017.997952, 3162.194773,
      3320.903365, 3493.880956, 3680.884773, 3881.672045, 4096.000000,
  },
  {
      0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
      0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
      0.000000,    13.087244,   15.919735,   25.930313,   24.412411,
      28.567417,   29.924194,   30.857010,   32.742979,   36.382570,
      39.210386,   42.265690,   47.378572,   57.014850,   82.740067,
      137.346562,  219.968084,  316.781856,  415.643773,  516.706538,
      614.914364,  714.303763,  815.512135,  911.210485,  1008.501528,
      1109.787854, 1213.772279, 1322.922561, 1414.752579, 1510.505641,
      1615.741888, 1697.989032, 1780.123933, 1847.453790, 1913.742309,
      1960.828122, 2047.500168, 2085.454095, 2129.230668, 2158.171824,
      2182.231724, 2217.684864, 2269.589211, 2337.264824, 2420.618694,
      2519.557814, 2633.989178, 2763.819779, 2908.956609, 3069.306660,
      3244.776927, 3435.274401, 3640.706076, 3860.978945, 4096.000000,
  },
  {
      0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
      0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
      0.000000,    4.656893,    5.123633,    5.594132,    6.162376,
      6.918433,    7.768444,    8.739415,    10.105862,   11.477328,
      13.236604,   15.421030,   19.093623,   25.801871,   46.724612,
      98.841054,   181.113466,  272.586364,  359.499769,  445.546343,
      525.944439,  605.188743,  681.793483,  756.668359,  838.486885,
      926.950356,  1015.482542, 1113.353926, 1204.897193, 1288.871992,
      1373.464145, 1455.746628, 1527.796460, 1588.475066, 1658.144771,
      1710.302500, 1807.563351, 1863.197608, 1927.281616, 1964.450872,
      2022.719898, 2100.041145, 2185.205712, 2280.993936, 2387.616216,
      2505.282950, 2634.204540, 2774.591385, 2926.653884, 3090.602436,
      3266.647443, 3454.999303, 3655.868416, 3869.465182, 4096.000000,
  },
  {
      0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
      0.000000,    0.000000,    0.000000,    0.000000,    0.000000,
      0.000000,    0.337370,    0.391916,    0.468839,    0.566334,
      0.762564,    1.069225,    1.384361,    1.787581,    2.293948,
      3.251909,    4.412991,    8.050068,    11.606073,   27.668092,
      65.227758,   128.463938,  202.097653,  262.715851,  312.464873,
      355.601398,  400.609054,  447.201352,  495.761568,  552.871938,
      619.067625,  691.984883,  773.753288,  860.628503,  946.262808,
      1019.805896, 1106.061360, 1178.422145, 1244.852258, 1302.173987,
      1399.650266, 1548.092912, 1545.928652, 1670.817500, 1694.523823,
      1779.195362, 1882.155494, 1990.662097, 2108.325181, 2235.456119,
      2372.366287, 2519.367059, 2676.769812, 2844.885918, 3024.026754,
      3214.503695, 3416.628115, 3630.711389, 3857.064892, 4096.000000,
  },
};

static const double interp_dgrid_curv[3][65] = {
  {
      16.000000, 15.962891, 15.925174, 15.886888, 15.848074, 15.808770,
      15.769015, 15.728850, 15.688313, 15.647445, 15.606284, 15.564870,
      15.525918, 15.483820, 15.373330, 15.126844, 14.637442, 14.184387,
      13.560070, 12.880717, 12.165995, 11.378144, 10.438769, 9.130790,
      7.487633,  5.688649,  4.267515,  3.196300,  2.434201,  1.834064,
      1.369920,  1.035921,  0.775279,  0.574895,  0.427232,  0.314123,
      0.233236,  0.171440,  0.128188,  0.092762,  0.067569,  0.049324,
      0.036330,  0.027008,  0.019853,  0.015539,  0.011093,  0.008733,
      0.007624,  0.008105,  0.005427,  0.004065,  0.003427,  0.002848,
      0.002328,  0.001865,  0.001457,  0.001103,  0.000801,  0.000550,
      0.000348,  0.000193,  0.000085,  0.000021,  0.000000,
  },
  {
      16.000000, 15.996116, 15.984769, 15.966413, 15.941505, 15.910501,
      15.873856, 15.832026, 15.785466, 15.734633, 15.679981, 15.621967,
      15.560961, 15.460157, 15.288367, 15.052462, 14.466922, 13.921212,
      13.073692, 12.222005, 11.237799, 9.985848,  8.898823,  7.423519,
      5.995325,  4.773152,  3.744032,  2.938217,  2.294526,  1.762412,
      1.327145,  1.020728,  0.765535,  0.570548,  0.425833,  0.313825,
      0.232959,  0.171324,  0.128174,  0.092750,  0.067558,  0.049319,
      0.036330,  0.027008,  0.019853,  0.015539,  0.011093,  0.008733,
      0.007624,  0.008105,  0.005427,  0.004065,  0.003427,  0.002848,
      0.002328,  0.001865,  0.001457,  0.001103,  0.000801,  0.000550,
      0.000348,  0.000193,  0.000085,  0.000021,  -0.000000,
  },
};

void av1_model_rd_curvfit(BLOCK_SIZE bsize, double sse_norm, double xqr,
                          double *rate_f, double *distbysse_f) {
  const double x_start = -15.5;
  const double x_end = 16.5;
  const double x_step = 0.5;
  const double epsilon = 1e-6;
  const int rcat = bsize_curvfit_model_cat_lookup[bsize];
  const int dcat = sse_norm_curvfit_model_cat_lookup(sse_norm);
  (void)x_end;

  xqr = AOMMAX(xqr, x_start + x_step + epsilon);
  xqr = AOMMIN(xqr, x_end - x_step - epsilon);
  const double x = (xqr - x_start) / x_step;
  const int xi = (int)floor(x);
  const double xo = x - xi;

  assert(xi > 0);

  const double *prate = &interp_rgrid_curv[rcat][(xi - 1)];
  *rate_f = interp_cubic(prate, xo);
  const double *pdist = &interp_dgrid_curv[dcat][(xi - 1)];
  *distbysse_f = interp_cubic(pdist, xo);
}

static void get_entropy_contexts_plane(BLOCK_SIZE plane_bsize,
                                       const struct macroblockd_plane *pd,
                                       ENTROPY_CONTEXT t_above[MAX_MIB_SIZE],
                                       ENTROPY_CONTEXT t_left[MAX_MIB_SIZE]) {
  const int num_4x4_w = mi_size_wide[plane_bsize];
  const int num_4x4_h = mi_size_high[plane_bsize];
  const ENTROPY_CONTEXT *const above = pd->above_entropy_context;
  const ENTROPY_CONTEXT *const left = pd->left_entropy_context;

  memcpy(t_above, above, sizeof(ENTROPY_CONTEXT) * num_4x4_w);
  memcpy(t_left, left, sizeof(ENTROPY_CONTEXT) * num_4x4_h);
}

void av1_get_entropy_contexts(BLOCK_SIZE plane_bsize,
                              const struct macroblockd_plane *pd,
                              ENTROPY_CONTEXT t_above[MAX_MIB_SIZE],
                              ENTROPY_CONTEXT t_left[MAX_MIB_SIZE]) {
  assert(plane_bsize < BLOCK_SIZES_ALL);
  get_entropy_contexts_plane(plane_bsize, pd, t_above, t_left);
}

void av1_mv_pred(const AV1_COMP *cpi, MACROBLOCK *x, uint16_t *ref_y_buffer,
                 int ref_y_stride, int ref_frame, BLOCK_SIZE block_size) {
  // When the tip buffer is invalid, for example for frames that
  // have only one reference, ref_y_buffer is invalid and should
  // not be used for computing x->pred_mv_sad.
  if (ref_frame == TIP_FRAME) {
    if (cpi->common.features.tip_frame_mode == TIP_FRAME_DISABLED) {
      const int ref_frame_idx = COMPACT_INDEX0_NRS(ref_frame);
      x->max_mv_context[ref_frame_idx] = 0;
      x->pred_mv_sad[ref_frame_idx] = INT_MAX;
      return;
    }
  }
  const MV_REFERENCE_FRAME ref_frames[2] = { ref_frame, NONE_FRAME };

#if CONFIG_SEP_COMP_DRL
  const MB_MODE_INFO *mbmi = x->e_mbd.mi[0];
  const int_mv ref_mv =
      av1_get_ref_mv_from_stack(0, ref_frames, 0, x->mbmi_ext, mbmi);
  const int_mv ref_mv1 =
      av1_get_ref_mv_from_stack(0, ref_frames, 1, x->mbmi_ext, mbmi);
#else
  const int_mv ref_mv =
      av1_get_ref_mv_from_stack(0, ref_frames, 0, x->mbmi_ext);
  const int_mv ref_mv1 =
      av1_get_ref_mv_from_stack(0, ref_frames, 1, x->mbmi_ext);
#endif  // CONFIG_SEP_COMP_DRL
  MV pred_mv[MAX_MV_REF_CANDIDATES + 1];
  int num_mv_refs = 0;
  pred_mv[num_mv_refs++] = ref_mv.as_mv;
  if (ref_mv.as_int != ref_mv1.as_int) {
    pred_mv[num_mv_refs++] = ref_mv1.as_mv;
  }

  assert(num_mv_refs <= (int)(sizeof(pred_mv) / sizeof(pred_mv[0])));

  const uint16_t *const src_y_ptr = x->plane[0].src.buf;
  int zero_seen = 0;
  int best_sad = INT_MAX;
  int max_mv = 0;
  // Get the sad for each candidate reference mv.
  for (int i = 0; i < num_mv_refs; ++i) {
    const MV *this_mv = &pred_mv[i];
    const int fp_row = (this_mv->row + 3 + (this_mv->row >= 0)) >> 3;
    const int fp_col = (this_mv->col + 3 + (this_mv->col >= 0)) >> 3;
    max_mv = AOMMAX(max_mv, AOMMAX(abs(this_mv->row), abs(this_mv->col)) >> 3);

    if (fp_row == 0 && fp_col == 0 && zero_seen) continue;
    zero_seen |= (fp_row == 0 && fp_col == 0);

    const uint16_t *const ref_y_ptr =
        &ref_y_buffer[ref_y_stride * fp_row + fp_col];
    // Find sad for current vector.
    const int this_sad = cpi->fn_ptr[block_size].sdf(
        src_y_ptr, x->plane[0].src.stride, ref_y_ptr, ref_y_stride);
    // Note if it is the best so far.
    if (this_sad < best_sad) {
      best_sad = this_sad;
    }
  }

  // Note the index of the mv that worked best in the reference list.
  const int ref_frame_idx = COMPACT_INDEX0_NRS(ref_frame);
  x->max_mv_context[ref_frame_idx] = max_mv;
  x->pred_mv_sad[ref_frame_idx] = best_sad;
}

void av1_setup_pred_block(const MACROBLOCKD *xd,
                          struct buf_2d dst[MAX_MB_PLANE],
                          const YV12_BUFFER_CONFIG *src,
                          const struct scale_factors *scale,
                          const struct scale_factors *scale_uv,
                          const int num_planes) {
  dst[0].buf = src->y_buffer;
  dst[0].stride = src->y_stride;
  dst[1].buf = src->u_buffer;
  dst[2].buf = src->v_buffer;
  dst[1].stride = dst[2].stride = src->uv_stride;

  const int mi_row = xd->mi_row;
  const int mi_col = xd->mi_col;
  for (int i = 0; i < num_planes; ++i) {
    setup_pred_plane(
        dst + i, dst[i].buf, i ? src->uv_crop_width : src->y_crop_width,
        i ? src->uv_crop_height : src->y_crop_height, dst[i].stride, mi_row,
        mi_col, i ? scale_uv : scale, xd->plane[i].subsampling_x,
        xd->plane[i].subsampling_y, &xd->mi[0]->chroma_ref_info);
  }
}

YV12_BUFFER_CONFIG *av1_get_scaled_ref_frame(const AV1_COMP *cpi,
                                             MV_REFERENCE_FRAME ref_frame) {
  if (is_tip_ref_frame(ref_frame)) {
    return NULL;
  }

  if (ref_frame >= cpi->common.ref_frames_info.num_total_refs) {
    return NULL;
  }

  RefCntBuffer *const scaled_buf = cpi->scaled_ref_buf[ref_frame];
  const RefCntBuffer *const ref_buf =
      get_ref_frame_buf(&cpi->common, ref_frame);
  return (scaled_buf != ref_buf && scaled_buf != NULL) ? &scaled_buf->buf
                                                       : NULL;
}

int av1_get_switchable_rate(const MACROBLOCK *x, const MACROBLOCKD *xd,
                            InterpFilter interp_filter) {
  if (interp_filter == SWITCHABLE) {
    const MB_MODE_INFO *const mbmi = xd->mi[0];
    assert(mbmi->mode < NEAR_NEARMV_OPTFLOW);
    const int ctx = av1_get_pred_context_switchable_interp(xd, 0);
    const int inter_filter_cost =
        x->mode_costs.switchable_interp_costs[ctx][mbmi->interp_fltr];
    return SWITCHABLE_INTERP_RATE_FACTOR * inter_filter_cost;
  } else {
    return 0;
  }
}

void av1_set_rd_speed_thresholds(AV1_COMP *cpi) {
  RD_OPT *const rd = &cpi->rd;

  // Set baseline threshold values.
  av1_zero(rd->thresh_mult);

  rd->thresh_mult[NEWMV] = 1000;
  rd->thresh_mult[NEARMV] = 1000;
  rd->thresh_mult[GLOBALMV] = 2200;
  rd->thresh_mult[NEAR_NEARMV] = 1500;
  rd->thresh_mult[NEAR_NEWMV] = 1500;
  rd->thresh_mult[NEW_NEARMV] = 1500;
  rd->thresh_mult[NEW_NEWMV] = 1500;
  rd->thresh_mult[GLOBAL_GLOBALMV] = 1500;
  rd->thresh_mult[DC_PRED] = 1000;
  rd->thresh_mult[PAETH_PRED] = 1000;
  rd->thresh_mult[SMOOTH_PRED] = 2200;
  rd->thresh_mult[SMOOTH_V_PRED] = 2000;
  rd->thresh_mult[SMOOTH_H_PRED] = 2000;
  rd->thresh_mult[H_PRED] = 2000;
  rd->thresh_mult[V_PRED] = 1800;
  rd->thresh_mult[D135_PRED] = 2500;
  rd->thresh_mult[D203_PRED] = 2000;
  rd->thresh_mult[D157_PRED] = 2500;
  rd->thresh_mult[D67_PRED] = 2000;
  rd->thresh_mult[D113_PRED] = 2500;
  rd->thresh_mult[D45_PRED] = 2500;
}

void av1_update_rd_thresh_fact(const AV1_COMMON *const cm,
                               int (*factor_buf)[MB_MODE_COUNT],
                               int use_adaptive_rd_thresh, BLOCK_SIZE bsize,
                               PREDICTION_MODE best_mode) {
  assert(use_adaptive_rd_thresh > 0);
  const int max_rd_thresh_factor = use_adaptive_rd_thresh * RD_THRESH_MAX_FACT;

  const int bsize_is_1_to_4 = bsize > cm->sb_size;
  BLOCK_SIZE min_size, max_size;
  if (bsize_is_1_to_4) {
    // This part handles block sizes with 1:4 and 4:1 aspect ratios
    // TODO(any): Experiment with threshold update for parent/child blocks
    min_size = bsize;
    max_size = bsize;
  } else {
    min_size = AOMMAX(bsize - 2, BLOCK_4X4);
    max_size = AOMMIN(bsize + 2, (int)cm->sb_size);
  }

  for (PREDICTION_MODE mode = 0; mode < MB_MODE_COUNT; ++mode) {
    for (BLOCK_SIZE bs = min_size; bs <= max_size; ++bs) {
      int *const fact = &factor_buf[bs][mode];
      if (mode == best_mode) {
        *fact -= (*fact >> RD_THRESH_LOG_DEC_FACTOR);
      } else {
        *fact = AOMMIN(*fact + RD_THRESH_INC, max_rd_thresh_factor);
      }
    }
  }
}

#define INTRA_COST_PENALTY_Q_FACTOR 8

int av1_get_intra_cost_penalty(int qindex, int qdelta, int base_y_dc_delta_q,
                               aom_bit_depth_t bit_depth) {
  const int q = av1_dc_quant_QTX(qindex, qdelta, base_y_dc_delta_q, bit_depth);
  switch (bit_depth) {
    case AOM_BITS_8:
      return ROUND_POWER_OF_TWO(INTRA_COST_PENALTY_Q_FACTOR * q,
                                0 + QUANT_TABLE_BITS);
    case AOM_BITS_10:
      return ROUND_POWER_OF_TWO(INTRA_COST_PENALTY_Q_FACTOR * q,
                                2 + QUANT_TABLE_BITS);
    case AOM_BITS_12:
      return ROUND_POWER_OF_TWO(INTRA_COST_PENALTY_Q_FACTOR * q,
                                4 + QUANT_TABLE_BITS);
    default:
      assert(0 && "bit_depth should be AOM_BITS_8, AOM_BITS_10 or AOM_BITS_12");
      return -1;
  }
}
