/*
 * 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
#if CONFIG_ADJ_Q_OFFSET
#define RDMULT_FROM_Q2_NUM 80
#else
#define RDMULT_FROM_Q2_NUM 96
#endif  // CONFIG_ADJ_Q_OFFSET
#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,
  96, 96, 128, 4, 4, 8, 8, 16, 16, 6,  6,  12, 12, 8,  8,
};

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;
  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);
  }
  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_CONTEXTS;
         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);
#if !CONFIG_NEW_PART_CTX
        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);
#endif  // !CONFIG_NEW_PART_CTX
      }
    }
  }

  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);
    av1_cost_tokens_from_cdf(mode_costs->multi_line_mrl_cost[i],
                             fc->multi_line_mrl_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);
  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);
  }

  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);

  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

  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);

  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

  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
      }
    }
  }

#if CONFIG_IMPROVE_LOSSLESS_TXM
  for (i = 0; i < BLOCK_SIZE_GROUPS; ++i) {
    for (j = 0; j < 2; ++j) {
      av1_cost_tokens_from_cdf(mode_costs->lossless_tx_size_cost[i][j],
                               fc->lossless_tx_size_cdf[i][j], NULL);
    }
  }
  av1_cost_tokens_from_cdf(mode_costs->lossless_inter_tx_type_cost,
                           fc->lossless_inter_tx_type_cdf, NULL);
#endif  // CONFIG_IMPROVE_LOSSLESS_TXM

  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);
  }

  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]) {
        av1_cost_tokens_from_cdf(mode_costs->intra_tx_type_costs[s][i],
                                 fc->intra_ext_tx_cdf[s + cdf_offset][i], NULL);
      }
    }
  }
#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
  av1_cost_tokens_from_cdf(mode_costs->most_probable_stx_set_flag_cost,
                           fc->most_probable_stx_set_cdf, NULL);
#if CONFIG_F105_IST_MEM_REDUCE
  av1_cost_tokens_from_cdf(
      mode_costs->most_probable_stx_set_flag_cost_ADST_ADST,
      fc->most_probable_stx_set_cdf_ADST_ADST, NULL);
#endif  // CONFIG_F105_IST_MEM_REDUCE
#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);
    }

    av1_cost_tokens_from_cdf(mode_costs->tip_mode_cost, fc->tip_pred_mode_cdf,
                             NULL);

    for (i = 0; i < REF_CONTEXTS; ++i) {
      for (j = 0; j < INTER_REFS_PER_FRAME - 1; ++j) {
        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) {
      for (j = 0; j < INTER_REFS_PER_FRAME - 1; ++j) {
        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++) {
        for (int k = 0; k < INTER_REFS_PER_FRAME - 1; ++k) {
          av1_cost_tokens_from_cdf(mode_costs->comp_ref1_cost[i][j][k],
                                   fc->comp_ref1_cdf[i][j][k], NULL);
        }
      }
    }

    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);
    }

#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 (j = 0; j < NUM_AMVD_MODES; ++j) {
      for (i = 0; i < AMVD_MODE_CONTEXTS; ++i) {
        av1_cost_tokens_from_cdf(mode_costs->amvd_mode_cost[j][i],
                                 fc->amvd_mode_cdf[j][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);
    }

#if CONFIG_REDESIGN_WARP_MODES_SIGNALING_FLOW
    av1_cost_tokens_from_cdf(mode_costs->is_warpmv_or_warp_newmv_cost,
                             fc->is_warpmv_or_warp_newmv_cdf, NULL);
#endif  // CONFIG_REDESIGN_WARP_MODES_SIGNALING_FLOW

    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
    for (i = 0; i < 3; ++i) {
      av1_cost_tokens_from_cdf(mode_costs->skip_drl_mode_cost[i],
                               fc->skip_drl_cdf[i], NULL);
      av1_cost_tokens_from_cdf(mode_costs->tip_drl_mode_cost[i],
                               fc->tip_drl_cdf[i], NULL);
    }
#endif  // CONFIG_SKIP_MODE_ENHANCEMENT

#if CONFIG_OPFL_CTX_OPT
    for (i = 0; i < OPFL_MODE_CONTEXTS; ++i) {
      av1_cost_tokens_from_cdf(mode_costs->use_optflow_cost[i],
                               fc->use_optflow_cdf[i], NULL);
    }
#else
#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);
    }
#endif  // CONFIG_OPFL_CTX_OPT

    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
    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);
    }

#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
#if CONFIG_REDUCE_SYMBOL_SIZE
    av1_cost_tokens_from_cdf(mode_costs->wedge_quad_cost, fc->wedge_quad_cdf,
                             NULL);
    for (i = 0; i < WEDGE_QUADS; ++i) {
      av1_cost_tokens_from_cdf(mode_costs->wedge_angle_cost[i],
                               fc->wedge_angle_cdf[i], NULL);
    }
#else
    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);
#endif  // CONFIG_REDUCE_SYMBOL_SIZE
    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_WARP_INTER_INTRA
      av1_cost_tokens_from_cdf(mode_costs->warp_interintra_cost[i],
                               fc->warp_interintra_cdf[i], NULL);
#endif  // CONFIG_WARP_INTER_INTRA
    }
#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_REDESIGN_WARP_MODES_SIGNALING_FLOW
    for (i = 0; i < WARP_CAUSAL_MODE_CTX; i++) {
      av1_cost_tokens_from_cdf(mode_costs->warp_causal_cost[i],
                               fc->warp_causal_cdf[i], NULL);
    }
#else
#if CONFIG_D149_CTX_MODELING_OPT && !NO_D149_FOR_WARP_CAUSAL
    av1_cost_tokens_from_cdf(mode_costs->warp_causal_cost, fc->warp_causal_cdf,
                             NULL);
#else
    for (i = BLOCK_8X8; i < BLOCK_SIZES_ALL; i++) {
      av1_cost_tokens_from_cdf(mode_costs->warp_causal_cost[i],
                               fc->warp_causal_cdf[i], NULL);
    }
#endif  // CONFIG_D149_CTX_MODELING_OPT && !NO_D149_FOR_WARP_CAUSAL
#endif  // CONFIG_REDESIGN_WARP_MODES_SIGNALING_FLOW
#if CONFIG_D149_CTX_MODELING_OPT
    av1_cost_tokens_from_cdf(mode_costs->warp_causal_warpmv_cost,
                             fc->warp_causal_warpmv_cdf, NULL);
#else
    for (i = BLOCK_8X8; i < BLOCK_SIZES_ALL; i++) {
      av1_cost_tokens_from_cdf(mode_costs->warp_causal_warpmv_cost[i],
                               fc->warp_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_REDESIGN_WARP_MODES_SIGNALING_FLOW
#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
#endif  // !CONFIG_REDESIGN_WARP_MODES_SIGNALING_FLOW
    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

    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);
    }

    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);
    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);

    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->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.features.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 (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);
  }
  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) {
        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);
      }

#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
      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
      for (int ctx = 0; ctx < SIG_COEF_CONTEXTS_BOB; ++ctx)
        av1_cost_tokens_from_cdf(
            pcost->base_bob_cost[ctx],
            fc->coeff_base_bob_cdf[AOMMIN(tx_size, TX_16X16)][ctx], NULL);
      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);
      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);
        }
      }
#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);
#if !CONFIG_CTX_V_AC_SIGN
        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_CTX_V_AC_SIGN
      }
#endif  // CONFIG_CONTEXT_DERIVATION

      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];
        }
      }

      for (int ctx = 0; ctx < LF_LEVEL_CONTEXTS; ++ctx) {
        int br_lf_rate[BR_CDF_SIZE];
        int prev_cost_lf = 0;
        int i, j;
        av1_cost_tokens_from_cdf(br_lf_rate, fc->coeff_br_lf_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[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(br_rate, fc->coeff_br_cdf[ctx], 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;
    int tx_size_ctx = AOMMIN(tx_size, TX_16X16);
    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],
                               fc->coeff_base_cdf_idtx[tx_size_ctx][ctx], NULL);
    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],
                               fc->idtx_sign_cdf[tx_size_ctx][ctx], NULL);
    for (int ctx = 0; ctx < IDTX_LEVEL_CONTEXTS; ++ctx) {
      int br_rate_skip[BR_CDF_SIZE];
      int prev_cost_skip = 0;
      int i, j;
      av1_cost_tokens_from_cdf(br_rate_skip,
                               fc->coeff_br_cdf_idtx[tx_size_ctx][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_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,
  3, 3, 3, 1, 1, 2, 2, 3, 3, 1, 1, 2, 2, 2, 2,
};

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,
  8, 8, 8, 0, 0, 2, 2, 4, 4, 1, 1, 3, 3, 2, 2,
};

// 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 };

  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);
  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) {
#if CONFIG_F054_PIC_BOUNDARY
    setup_pred_plane(dst + i, dst[i].buf, i ? src->uv_width : src->y_width,
                     i ? src->uv_height : src->y_height,
                     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);
#else
    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,
        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);
#endif  // CONFIG_F054_PIC_BOUNDARY
  }
}

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;
  }
}
