/*
 * 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 "av2/common/blockd.h"
#include "av2/common/enums.h"
#include "config/av2_rtcd.h"

#include "avm_dsp/avm_dsp_common.h"
#include "avm_mem/avm_mem.h"
#include "avm_ports/bitops.h"
#include "avm_ports/mem.h"
#include "avm_ports/system_state.h"

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

#include "av2/encoder/av2_quantize.h"
#include "av2/common/cost.h"
#include "av2/encoder/encodemb.h"
#include "av2/encoder/encodemv.h"
#include "av2/encoder/encoder.h"
#include "av2/encoder/encodetxb.h"
#include "av2/encoder/mcomp.h"
#include "av2/encoder/ratectrl.h"
#include "av2/encoder/rd.h"
#include "av2/encoder/rdopt_utils.h"
#include "av2/encoder/tokenize.h"
#include "av2/encoder/trellis_quant.h"

#define RD_THRESH_POW 1.25

#define RD_THRESH_MUL 4.40
#define RDMULT_FROM_Q2_NUM 84
#define RDMULT_FROM_Q2_NUM_AI 80
#define RDMULT_FROM_Q2_NUM_LD 82
#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,
};

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 av2_ext_tx_set_idx_to_type[2][AVMMAX(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,
      EXT_TX_SET_DCT_IDTX_IDDCT,
  },
};

void av2_fill_mode_rates(AV2_COMMON *const cm, ModeCosts *mode_costs,
                         FRAME_CONTEXT *fc) {
  int i, j;
  for (i = 0; i < INTER_SDP_BSIZE_GROUP; ++i) {
    av2_cost_tokens_from_cdf(mode_costs->region_type_cost[i],
                             fc->region_type_cdf[i], REGION_TYPES, NULL);
  }
  for (int plane_index = 0; plane_index < PARTITION_STRUCTURE_NUM;
       plane_index++) {
    for (i = 0; i < PARTITION_CONTEXTS; ++i) {
      av2_cost_tokens_from_cdf(mode_costs->do_split_cost[plane_index][i],
                               fc->do_split_cdf[plane_index][i], 2, NULL);
    }
  }
  for (int plane_index = 0; plane_index < PARTITION_STRUCTURE_NUM;
       plane_index++) {
    for (i = 0; i < SQUARE_SPLIT_CONTEXTS; ++i) {
      av2_cost_tokens_from_cdf(mode_costs->do_square_split_cost[plane_index][i],
                               fc->do_square_split_cdf[plane_index][i], 2,
                               NULL);
    }
  }
  for (int plane_index = 0; plane_index < PARTITION_STRUCTURE_NUM;
       plane_index++) {
    for (i = 0; i < PARTITION_CONTEXTS; ++i) {
      av2_cost_tokens_from_cdf(mode_costs->rect_type_cost[plane_index][i],
                               fc->rect_type_cdf[plane_index][i], 2, 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) {
        av2_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], 2, NULL);
        av2_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], 2,
            NULL);
      }
    }
  }

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

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

  for (i = 0; i < MRL_INDEX_CONTEXTS; ++i) {
    av2_cost_tokens_from_cdf(mode_costs->mrl_index_cost[i],
                             fc->mrl_index_cdf[i], MRL_LINE_NUMBER, NULL);
    av2_cost_tokens_from_cdf(mode_costs->multi_line_mrl_cost[i],
                             fc->multi_line_mrl_cdf[i], 2, NULL);
  }
  av2_cost_tokens_from_cdf(mode_costs->dpcm_cost, fc->dpcm_cdf, 2, NULL);

  av2_cost_tokens_from_cdf(mode_costs->dpcm_vert_horz_cost,
                           fc->dpcm_vert_horz_cdf, 2, NULL);

  av2_cost_tokens_from_cdf(mode_costs->dpcm_uv_cost, fc->dpcm_uv_cdf, 2, NULL);

  av2_cost_tokens_from_cdf(mode_costs->dpcm_uv_vert_horz_cost,
                           fc->dpcm_uv_vert_horz_cdf, 2, NULL);

  for (i = 0; i < FSC_MODE_CONTEXTS; ++i) {
    for (j = 0; j < FSC_BSIZE_CONTEXTS; ++j) {
      av2_cost_tokens_from_cdf(mode_costs->fsc_cost[i][j],
                               fc->fsc_mode_cdf[i][j], FSC_MODES, NULL);
    }
  }
  av2_cost_tokens_from_cdf(mode_costs->cfl_mhccp_cost, fc->cfl_mhccp_cdf,
                           CFL_MHCCP_SWITCH_NUM, NULL);
  av2_cost_tokens_from_cdf(mode_costs->cfl_index_cost, fc->cfl_index_cdf,
                           CFL_TYPE_COUNT - 1, NULL);
  av2_cost_tokens_from_cdf(mode_costs->y_primary_flag_cost, fc->y_mode_set_cdf,
                           INTRA_MODE_SETS, NULL);
  for (i = 0; i < Y_MODE_CONTEXTS; ++i) {
    // y mode costs
    av2_cost_tokens_from_cdf(mode_costs->y_mode_idx_costs[i],
                             fc->y_mode_idx_cdf[i], LUMA_INTRA_MODE_INDEX_COUNT,
                             NULL);
    av2_cost_tokens_from_cdf(mode_costs->y_mode_idx_offset_costs[i],
                             fc->y_mode_idx_offset_cdf[i],
                             LUMA_INTRA_MODE_OFFSET_COUNT, NULL);
  }

  for (j = 0; j < UV_MODE_CONTEXTS; ++j)
    av2_cost_tokens_from_cdf(mode_costs->intra_uv_mode_cost[j],
                             fc->uv_mode_cdf[j], CHROMA_INTRA_MODE_INDEX_COUNT,
                             NULL);
  for (i = 0; i < CFL_CONTEXTS; ++i)
    av2_cost_tokens_from_cdf(mode_costs->cfl_mode_cost[i], fc->cfl_cdf[i], 2,
                             NULL);
  for (i = 0; i < DIP_CTXS; i++) {
    av2_cost_tokens_from_cdf(mode_costs->intra_dip_cost[i],
                             fc->intra_dip_cdf[i], 2, NULL);
  }
  av2_cost_tokens_from_cdf(mode_costs->intra_dip_mode_cost,
                           fc->intra_dip_mode_n6_cdf, 6, NULL);

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

  av2_cost_tokens_from_cdf(mode_costs->palette_y_size_cost,
                           fc->palette_y_size_cdf, PALETTE_SIZES, NULL);
  av2_cost_tokens_from_cdf(mode_costs->palette_uv_size_cost,
                           fc->palette_uv_size_cdf, PALETTE_SIZES, NULL);
  av2_cost_tokens_from_cdf(mode_costs->palette_y_mode_cost,
                           fc->palette_y_mode_cdf, 2, NULL);
  av2_cost_tokens_from_cdf(mode_costs->palette_uv_mode_cost,
                           fc->palette_uv_mode_cdf, 2, NULL);

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

  for (i = 0; i < PALETTE_ROW_FLAG_CONTEXTS; ++i) {
    av2_cost_tokens_from_cdf(mode_costs->palette_y_row_flag_cost[i],
                             fc->identity_row_cdf_y[i], 3, NULL);
    av2_cost_tokens_from_cdf(mode_costs->palette_uv_row_flag_cost[i],
                             fc->identity_row_cdf_uv[i], 3, NULL);
  }
  int sign_cost[CFL_JOINT_SIGNS];
  av2_cost_tokens_from_cdf(sign_cost, fc->cfl_sign_cdf, CFL_JOINT_SIGNS, 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 avm_cdf_prob *cdf_u = fc->cfl_alpha_cdf[CFL_CONTEXT_U(joint_sign)];
      av2_cost_tokens_from_cdf(cost_u, cdf_u, CFL_ALPHABET_SIZE, NULL);
    }
    if (CFL_SIGN_V(joint_sign) == CFL_SIGN_ZERO) {
      memset(cost_v, 0, CFL_ALPHABET_SIZE * sizeof(*cost_v));
    } else {
      const avm_cdf_prob *cdf_v = fc->cfl_alpha_cdf[CFL_CONTEXT_V(joint_sign)];
      av2_cost_tokens_from_cdf(cost_v, cdf_v, CFL_ALPHABET_SIZE, NULL);
    }
    for (int u = 0; u < CFL_ALPHABET_SIZE; u++)
      cost_u[u] += sign_cost[joint_sign];
  }
  for (int dir = 0; dir < MHCCP_CONTEXT_GROUP_SIZE; dir++) {
    av2_cost_tokens_from_cdf(mode_costs->filter_dir_cost[dir],
                             fc->filter_dir_cdf[dir], MHCCP_MODE_NUM, NULL);
  }

  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) {
        av2_cost_tokens_from_cdf(mode_costs->txfm_do_partition_cost[k][i][j],
                                 fc->txfm_do_partition_cdf[k][i][j], 2, NULL);
      }
      for (j = 0; j < TX_PARTITION_TYPE_NUM_VERT_AND_HORZ; ++j) {
        av2_cost_tokens_from_cdf(
            mode_costs->txfm_4way_partition_type_cost[k][i][j],
            fc->txfm_4way_partition_type_cdf[k][i][j], TX_PARTITION_TYPE_NUM,
            NULL);
      }
      for (j = 0; j < TX_PARTITION_TYPE_NUM_VERT_OR_HORZ - 1; ++j) {
        av2_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], 2, NULL);
      }
    }
  }

  for (i = 0; i < BLOCK_SIZE_GROUPS; ++i) {
    for (j = 0; j < 2; ++j) {
      av2_cost_tokens_from_cdf(mode_costs->lossless_tx_size_cost[i][j],
                               fc->lossless_tx_size_cdf[i][j], 2, NULL);
    }
  }
  av2_cost_tokens_from_cdf(mode_costs->lossless_inter_tx_type_cost,
                           fc->lossless_inter_tx_type_cdf, 2, NULL);

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

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

  for (i = TX_4X4; i < EXT_TX_SIZES; ++i) {
    av2_cost_tokens_from_cdf(mode_costs->intra_ext_tx_short_side_costs[i],
                             fc->intra_ext_tx_short_side_cdf[i], 4, NULL);
  }

  for (i = TX_4X4; i < EXT_TX_SIZES; ++i) {
    int s;
    int k;
    for (k = 0; k < EOB_TX_CTXS; ++k) {
      for (s = 0; s < 2; ++s) {
        av2_cost_tokens_from_cdf(mode_costs->inter_tx_type_set_cost[s][k][i],
                                 fc->inter_tx_type_set[s][k][i], 2, NULL);
      }
    }
  }
  for (int k = 0; k < EOB_TX_CTXS; ++k) {
    for (int s = 0; s < 2; ++s) {
      av2_cost_tokens_from_cdf(mode_costs->inter_tx_type_idx_cost[s][k],
                               fc->inter_tx_type_idx[s][k],
                               INTER_TX_TYPE_INDEX_COUNT, NULL);
    }
    av2_cost_tokens_from_cdf(mode_costs->inter_tx_type_offset_1_cost[k],
                             fc->inter_tx_type_offset_1[k],
                             INTER_TX_TYPE_OFFSET1_COUNT, NULL);
    av2_cost_tokens_from_cdf(mode_costs->inter_tx_type_offset_2_cost[k],
                             fc->inter_tx_type_offset_2[k],
                             INTER_TX_TYPE_OFFSET2_COUNT, 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]) {
          av2_cost_tokens_from_cdf(
              mode_costs->inter_tx_type_costs[s][k][i],
              fc->inter_ext_tx_cdf[s][k][i], TX_TYPES,
              av2_ext_tx_inv[av2_ext_tx_set_idx_to_type[1][s]]);
        }
      }
    }

    for (s = 1; s < EXT_TX_SETS_INTRA; ++s) {
      if (use_intra_ext_tx_for_txsize[s][i]) {
        av2_cost_tokens_from_cdf(mode_costs->intra_tx_type_costs[s][i],
                                 fc->intra_ext_tx_cdf[s][i], TX_TYPES, NULL);
      }
    }
  }
  for (i = 0; i < INTRABC_CONTEXTS; ++i) {
    av2_cost_tokens_from_cdf(mode_costs->intrabc_cost[i], fc->intrabc_cdf[i], 2,
                             NULL);
  }
  av2_cost_tokens_from_cdf(mode_costs->intrabc_mode_cost, fc->intrabc_mode_cdf,
                           2, NULL);
  for (i = 0; i < NUM_BV_PRECISION_CONTEXTS; ++i) {
    av2_cost_tokens_from_cdf(mode_costs->intrabc_bv_precision_cost[i],
                             fc->intrabc_bv_precision_cdf[i],
                             NUM_ALLOWED_BV_PRECISIONS, NULL);
  }

  for (i = 0; i < 3; ++i) {
    av2_cost_tokens_from_cdf(mode_costs->morph_pred_cost[i],
                             fc->morph_pred_cdf[i], 2, NULL);
  }
  for (j = 0; j < 2; ++j) {
    for (i = 0; i < TX_SIZES; ++i) {
      av2_cost_tokens_from_cdf(mode_costs->stx_flag_cost[j][i],
                               fc->stx_cdf[j][i], STX_TYPES, NULL);
    }
  }
  av2_cost_tokens_from_cdf(mode_costs->most_probable_stx_set_flag_cost,
                           fc->most_probable_stx_set_cdf, IST_SET_SIZE, NULL);
  av2_cost_tokens_from_cdf(
      mode_costs->most_probable_stx_set_flag_cost_ADST_ADST,
      fc->most_probable_stx_set_cdf_ADST_ADST, IST_REDUCED_SET_SIZE, NULL);

  av2_cost_tokens_from_cdf(mode_costs->cctx_type_cost, fc->cctx_type_cdf,
                           CCTX_TYPES, NULL);

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

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

    av2_cost_tokens_from_cdf(mode_costs->tip_mode_cost, fc->tip_pred_mode_cdf,
                             TIP_PRED_MODES, NULL);

    for (i = 0; i < REF_CONTEXTS; ++i) {
      for (j = 0; j < INTER_REFS_PER_FRAME - 1; ++j) {
        av2_cost_tokens_from_cdf(mode_costs->single_ref_cost[i][j],
                                 fc->single_ref_cdf[i][j], 2, NULL);
      }
    }

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

    for (i = 0; i < INTRA_INTER_CONTEXTS; ++i) {
      av2_cost_tokens_from_cdf(mode_costs->intra_inter_cost[i],
                               fc->intra_inter_cdf[i], 2, NULL);
    }

    for (i = 0; i < INTER_MODE_CONTEXTS; ++i) {
      av2_cost_tokens_from_cdf(mode_costs->inter_single_mode_cost[i],
                               fc->inter_single_mode_cdf[i], INTER_SINGLE_MODES,
                               NULL);
    }

    for (j = 0; j < NUM_AMVD_MODES; ++j) {
      for (i = 0; i < AMVD_MODE_CONTEXTS; ++i) {
        av2_cost_tokens_from_cdf(mode_costs->amvd_mode_cost[j][i],
                                 fc->amvd_mode_cdf[j][i], 2, NULL);
      }
    }

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

    av2_cost_tokens_from_cdf(mode_costs->is_warpmv_or_warp_newmv_cost,
                             fc->is_warpmv_or_warp_newmv_cdf, 2, NULL);

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

    for (i = 0; i < 3; ++i) {
      av2_cost_tokens_from_cdf(mode_costs->skip_drl_mode_cost[i],
                               fc->skip_drl_cdf[i], 2, NULL);
      av2_cost_tokens_from_cdf(mode_costs->tip_drl_mode_cost[i],
                               fc->tip_drl_cdf[i], 2, NULL);
    }

    for (i = 0; i < OPFL_MODE_CONTEXTS; ++i) {
      av2_cost_tokens_from_cdf(mode_costs->use_optflow_cost[i],
                               fc->use_optflow_cdf[i], 2, NULL);
    }

    for (j = 0; j < NUM_MV_PREC_MPP_CONTEXT; ++j) {
      av2_cost_tokens_from_cdf(mode_costs->pb_block_mv_mpp_flag_costs[j],
                               fc->pb_mv_mpp_flag_cdf[j], 2, NULL);
    }
    for (i = MV_PRECISION_HALF_PEL; i < NUM_MV_PRECISIONS; ++i) {
      for (j = 0; j < MV_PREC_DOWN_CONTEXTS; ++j)
        av2_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],
            FLEX_MV_COSTS_SIZE, NULL);
    }

    av2_cost_tokens_from_cdf(mode_costs->jmvd_scale_mode_cost,
                             fc->jmvd_scale_mode_cdf,
                             JOINT_NEWMV_SCALE_FACTOR_CNT, NULL);
    av2_cost_tokens_from_cdf(mode_costs->jmvd_amvd_scale_mode_cost,
                             fc->jmvd_amvd_scale_mode_cdf,
                             JOINT_AMVD_SCALE_FACTOR_CNT, NULL);

    for (i = 0; i < NUM_CTX_IS_JOINT; ++i) {
      av2_cost_tokens_from_cdf(mode_costs->inter_compound_mode_is_joint_cost[i],
                               fc->inter_compound_mode_is_joint_cdf[i],
                               NUM_OPTIONS_IS_JOINT, NULL);
    }
    for (i = 0; i < NUM_CTX_NON_JOINT_TYPE; ++i) {
      av2_cost_tokens_from_cdf(
          mode_costs->inter_compound_mode_non_joint_type_cost[i],
          fc->inter_compound_mode_non_joint_type_cdf[i],
          NUM_OPTIONS_NON_JOINT_TYPE, NULL);
    }

    for (i = 0; i < INTER_MODE_CONTEXTS; ++i) {
      av2_cost_tokens_from_cdf(
          mode_costs->inter_compound_mode_same_refs_cost[i],
          fc->inter_compound_mode_same_refs_cdf[i],
          INTER_COMPOUND_SAME_REFS_TYPES, NULL);
    }

    av2_cost_tokens_from_cdf(mode_costs->compound_type_cost,
                             fc->compound_type_cdf, MASKED_COMPOUND_TYPES,
                             NULL);

    av2_cost_tokens_from_cdf(mode_costs->wedge_quad_cost, fc->wedge_quad_cdf,
                             WEDGE_QUADS, NULL);
    for (i = 0; i < WEDGE_QUADS; ++i) {
      av2_cost_tokens_from_cdf(mode_costs->wedge_angle_cost[i],
                               fc->wedge_angle_cdf[i], QUAD_WEDGE_ANGLES, NULL);
    }
    av2_cost_tokens_from_cdf(mode_costs->wedge_dist_cost, fc->wedge_dist_cdf,
                             NUM_WEDGE_DIST, NULL);
    av2_cost_tokens_from_cdf(mode_costs->wedge_dist_cost2, fc->wedge_dist_cdf2,
                             NUM_WEDGE_DIST, NULL);

    for (i = 0; i < BLOCK_SIZE_GROUPS; ++i) {
      av2_cost_tokens_from_cdf(mode_costs->interintra_cost[i],
                               fc->interintra_cdf[i], 2, NULL);
      av2_cost_tokens_from_cdf(mode_costs->interintra_mode_cost[i],
                               fc->interintra_mode_cdf[i], INTERINTRA_MODES,
                               NULL);
      av2_cost_tokens_from_cdf(mode_costs->warp_interintra_cost[i],
                               fc->warp_interintra_cdf[i], 2, NULL);
    }

    av2_cost_tokens_from_cdf(mode_costs->wedge_interintra_cost,
                             fc->wedge_interintra_cdf, 2, NULL);

    for (i = 0; i < NUM_REFINEMV_CTX; ++i) {
      av2_cost_tokens_from_cdf(mode_costs->refinemv_flag_cost[i],
                               fc->refinemv_flag_cdf[i], REFINEMV_NUM_MODES,
                               NULL);
    }

    for (i = 0; i < WARP_CAUSAL_MODE_CTX; i++) {
      av2_cost_tokens_from_cdf(mode_costs->warp_causal_cost[i],
                               fc->warp_causal_cdf[i], 2, NULL);
    }

    av2_cost_tokens_from_cdf(mode_costs->warpmv_with_mvd_flag_cost,
                             fc->warpmv_with_mvd_flag_cdf, 2, NULL);

    for (i = BLOCK_8X8; i < BLOCK_SIZES_ALL; i++) {
      av2_cost_tokens_from_cdf(mode_costs->warp_precision_idx_cost[i],
                               fc->warp_precision_idx_cdf[i],
                               NUM_WARP_PRECISION_MODES, NULL);
    }

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

    for (i = 0; i < 2; i++) {
      av2_cost_tokens_from_cdf(mode_costs->warp_delta_param_cost[i],
                               fc->warp_delta_param_cdf[i],
                               WARP_DELTA_NUMSYMBOLS_LOW, NULL);
    }

    av2_cost_tokens_from_cdf(mode_costs->warp_param_sign_cost,
                             fc->warp_param_sign_cdf, 2, NULL);
    for (i = 0; i < 2; i++) {
      av2_cost_tokens_from_cdf(mode_costs->warp_delta_param_high_cost[i],
                               fc->warp_delta_param_high_cdf[i],
                               WARP_DELTA_NUMSYMBOLS_HIGH, NULL);
    }

    for (i = 0; i < WARP_EXTEND_CTX; i++) {
      av2_cost_tokens_from_cdf(mode_costs->warp_extend_cost[i],
                               fc->warp_extend_cdf[i], 2, NULL);
    }

    av2_cost_tokens_from_cdf(mode_costs->bawp_flg_cost[0], fc->bawp_cdf[0], 2,
                             NULL);
    av2_cost_tokens_from_cdf(mode_costs->bawp_flg_cost[1], fc->bawp_cdf[1], 2,
                             NULL);
    for (i = 0; i < BAWP_SCALES_CTX_COUNT; ++i) {
      av2_cost_tokens_from_cdf(mode_costs->explicit_bawp_cost[i],
                               fc->explicit_bawp_cdf[i], 2, NULL);
    }
    av2_cost_tokens_from_cdf(mode_costs->explicit_bawp_scale_cost,
                             fc->explicit_bawp_scale_cdf,
                             EXPLICIT_BAWP_SCALE_CNT, NULL);

    for (i = 0; i < COMP_GROUP_IDX_CONTEXTS; ++i) {
      av2_cost_tokens_from_cdf(mode_costs->comp_group_idx_cost[i],
                               fc->comp_group_idx_cdf[i], 2, NULL);
    }
    for (j = 0; j < MAX_CWP_CONTEXTS; j++) {
      for (i = 0; i < MAX_CWP_NUM - 1; ++i) {
        av2_cost_tokens_from_cdf(mode_costs->cwp_idx_cost[j][i],
                                 fc->cwp_idx_cdf[j][i], 2, NULL);
      }
    }
  }
}

void av2_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)
      av2_cost_tokens_from_cdf(mode_costs->switchable_flex_restore_cost[c][p],
                               fc->switchable_flex_restore_cdf[c][p], 2, NULL);
  av2_cost_tokens_from_cdf(mode_costs->wienerns_restore_cost,
                           fc->wienerns_restore_cdf, 2, NULL);
  for (int c = 0; c < 2; ++c)
    av2_cost_tokens_from_cdf(mode_costs->wienerns_length_cost[c],
                             fc->wienerns_length_cdf[c], 2, NULL);
  av2_cost_tokens_from_cdf(mode_costs->wienerns_uv_sym_cost,
                           fc->wienerns_uv_sym_cdf, 2, NULL);
  for (int c = 0; c < WIENERNS_4PART_CTX_MAX; ++c)
    av2_cost_tokens_from_cdf(mode_costs->wienerns_4part_cost[c],
                             fc->wienerns_4part_cdf[c], 4, NULL);
  av2_cost_tokens_from_cdf(mode_costs->pc_wiener_restore_cost,
                           fc->pc_wiener_restore_cdf, 2, NULL);
  // Bit cost for parameter to designate whether unit coeffs are merged.
  mode_costs->merged_param_cost[0] = av2_cost_literal(1);
  mode_costs->merged_param_cost[1] = av2_cost_literal(1);
}

// 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,
                            avm_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 = av2_convert_qindex_to_q(i, bit_depth);
    bit16lut[i] = (int)(0.0836 * q + 2.4107);
  }
}

void av2_init_me_luts(void) {
  init_me_luts_bd(sad_per_bit_lut_8, QINDEX_RANGE_8_BITS, AVM_BITS_8);
  init_me_luts_bd(sad_per_bit_lut_10, QINDEX_RANGE_10_BITS, AVM_BITS_10);
  init_me_luts_bd(sad_per_bit_lut_12, QINDEX_RANGE, AVM_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 av2_compute_rd_mult_based_on_qindex(const AV2_COMP *cpi, int qindex) {
  const int rdmult_from_q2_num =
      (cpi->oxcf.kf_cfg.key_freq_max == 0
           ? RDMULT_FROM_Q2_NUM_AI
           : (cpi->oxcf.gf_cfg.lag_in_frames == 0 ? RDMULT_FROM_Q2_NUM_LD
                                                  : RDMULT_FROM_Q2_NUM));
  const int q =
      av2_dc_quant_QTX(qindex, 0, cpi->common.seq_params.base_y_dc_delta_q,
                       cpi->common.seq_params.bit_depth);

  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 AVM_BITS_8: break;
    case AVM_BITS_10: rdmult = ROUND_POWER_OF_TWO(rdmult, 4); break;
    case AVM_BITS_12: rdmult = ROUND_POWER_OF_TWO(rdmult, 8); break;
    default:
      assert(0 && "bit_depth should be AVM_BITS_8, AVM_BITS_10 or AVM_BITS_12");
      return -1;
  }
  return (int)(rdmult > 0 ? rdmult : 1);
}

int av2_compute_rd_mult(const AV2_COMP *cpi, int qindex) {
  int64_t rdmult = av2_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 = AVMMIN(15, (cpi->rc.gfu_boost / 100));
    const int layer_depth = AVMMIN(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 av2_get_deltaq_offset(const AV2_COMP *cpi, int qindex, double beta) {
  assert(beta > 0.0);
  int q = av2_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 = av2_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 = av2_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 == AVM_BITS_8    ? MAXQ_8_BITS
               : cpi->common.seq_params.bit_depth == AVM_BITS_10 ? MAXQ_10_BITS
                                                                 : MAXQ)));
  }
  return qindex - orig_qindex;
}

int av2_get_adaptive_rdmult(const AV2_COMP *cpi, double beta) {
  assert(beta > 0.0);
  const int rdmult_from_q2_num =
      (cpi->oxcf.kf_cfg.key_freq_max == 0
           ? RDMULT_FROM_Q2_NUM_AI
           : (cpi->oxcf.gf_cfg.lag_in_frames == 0 ? RDMULT_FROM_Q2_NUM_LD
                                                  : RDMULT_FROM_Q2_NUM));
  const AV2_COMMON *cm = &cpi->common;
  int64_t q = av2_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 AVM_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 AVM_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 AVM_BITS_12:
    default:
      assert(cm->seq_params.bit_depth == AVM_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 = AVMMIN(15, (cpi->rc.gfu_boost / 100));

    const int layer_depth = AVMMIN(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,
                                    avm_bit_depth_t bit_depth) {
  double q;
  switch (bit_depth) {
    case AVM_BITS_8:
      q = av2_dc_quant_QTX(qindex, 0, base_y_dc_delta_q, AVM_BITS_8) / 4.0;
      break;
    case AVM_BITS_10:
      q = av2_dc_quant_QTX(qindex, 0, base_y_dc_delta_q, AVM_BITS_10) / 16.0;
      break;
    case AVM_BITS_12:
      q = av2_dc_quant_QTX(qindex, 0, base_y_dc_delta_q, AVM_BITS_12) / 64.0;
      break;
    default:
      assert(0 && "bit_depth should be AVM_BITS_8, AVM_BITS_10 or AVM_BITS_12");
      return -1;
  }
  // TODO(debargha): Adjust the function below.
  q /= (1 << QUANT_TABLE_BITS);
  return AVMMAX((int)(pow(q, RD_THRESH_POW) * RD_THRESH_MUL), 8);
}

void av2_set_sad_per_bit(const AV2_COMP *cpi, MvCosts *mv_costs, int qindex) {
  switch (cpi->common.seq_params.bit_depth) {
    case AVM_BITS_8: mv_costs->sadperbit = sad_per_bit_lut_8[qindex]; break;
    case AVM_BITS_10: mv_costs->sadperbit = sad_per_bit_lut_10[qindex]; break;
    case AVM_BITS_12: mv_costs->sadperbit = sad_per_bit_lut_12[qindex]; break;
    default:
      assert(0 && "bit_depth should be AVM_BITS_8, AVM_BITS_10 or AVM_BITS_12");
  }
}

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

  for (segment_id = 0; segment_id < MAX_SEGMENTS; ++segment_id) {
    const int qindex =
        clamp(av2_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 == AVM_BITS_8    ? MAXQ_8_BITS
              : cm->seq_params.bit_depth == AVM_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 av2_fill_coeff_costs(CoeffCosts *coeff_costs, FRAME_CONTEXT *fc,
                          const int num_planes) {
  // 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
  };
  const int nplanes = AVMMIN(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];
      avm_cdf_prob *pcdf;
      {
        for (int is_inter = 0; is_inter < 2; is_inter++) {
          int pl_ctx = get_eob_plane_ctx(plane, is_inter);
          int nsymb = 0;
          switch (eob_multi_size) {
            case 0:
              pcdf = fc->eob_flag_cdf16[pl_ctx];
              nsymb = EOB_MAX_SYMS - 6;
              break;
            case 1:
              pcdf = fc->eob_flag_cdf32[pl_ctx];
              nsymb = EOB_MAX_SYMS - 5;
              break;
            case 2:
              pcdf = fc->eob_flag_cdf64[pl_ctx];
              nsymb = EOB_MAX_SYMS - 4;
              break;
            case 3:
              pcdf = fc->eob_flag_cdf128[pl_ctx];
              nsymb = EOB_MAX_SYMS - 3;
              break;
            case 4:
              pcdf = fc->eob_flag_cdf256[pl_ctx];
              nsymb = EOB_MAX_SYMS - 3;
              break;
            case 5:
              pcdf = fc->eob_flag_cdf512[pl_ctx];
              nsymb = EOB_MAX_SYMS - 3;
              break;
            case 6:
              pcdf = fc->eob_flag_cdf1024[pl_ctx];
              nsymb = EOB_MAX_SYMS - 3;
              break;
            default: assert(0 && "Invalid eob_multi_size");
          }
          av2_cost_tokens_from_cdf(pcost->eob_cost[is_inter], pcdf, nsymb,
                                   NULL);
        }
      }
    }
  }
  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) {
        av2_cost_tokens_from_cdf(pcost->txb_skip_cost[0][ctx],
                                 fc->txb_skip_cdf[0][tx_size][ctx], 2, NULL);
        av2_cost_tokens_from_cdf(pcost->txb_skip_cost[1][ctx],
                                 fc->txb_skip_cdf[1][tx_size][ctx], 2, NULL);
      }

      for (int ctx = 0; ctx < V_TXB_SKIP_CONTEXTS; ++ctx)
        av2_cost_tokens_from_cdf(pcost->v_txb_skip_cost[ctx],
                                 fc->v_txb_skip_cdf[ctx], 2, NULL);
      for (int ctx = 0; ctx < SIG_COEF_CONTEXTS_EOB; ++ctx)
        av2_cost_tokens_from_cdf(pcost->base_lf_eob_cost_uv[ctx],
                                 fc->coeff_base_lf_eob_uv_cdf[ctx],
                                 LF_BASE_SYMBOLS - 1, NULL);
      for (int ctx = 0; ctx < SIG_COEF_CONTEXTS_EOB; ++ctx)
        av2_cost_tokens_from_cdf(pcost->base_eob_cost_uv[ctx],
                                 fc->coeff_base_eob_uv_cdf[ctx], 3, NULL);
      for (int ctx = 0; ctx < SIG_COEF_CONTEXTS_EOB; ++ctx)
        av2_cost_tokens_from_cdf(pcost->base_eob_cost[ctx],
                                 fc->coeff_base_eob_cdf[tx_size][ctx], 3, NULL);

      for (int ctx = 0; ctx < SIG_COEF_CONTEXTS_EOB; ++ctx)
        av2_cost_tokens_from_cdf(pcost->base_lf_eob_cost[ctx],
                                 fc->coeff_base_lf_eob_cdf[tx_size][ctx],
                                 LF_BASE_SYMBOLS - 1, NULL);
      for (int ctx = 0; ctx < LF_SIG_COEF_CONTEXTS; ++ctx) {
        for (int q_i = 0; q_i < TCQ_CTXS; q_i++) {
          av2_cost_tokens_from_cdf(pcost->base_lf_cost[ctx][q_i],
                                   fc->coeff_base_lf_cdf[tx_size][ctx][q_i],
                                   LF_BASE_SYMBOLS, NULL);
        }
      }
      for (int ctx = 0; ctx < LF_SIG_COEF_CONTEXTS_UV; ++ctx) {
        av2_cost_tokens_from_cdf(pcost->base_lf_cost_uv[ctx],
                                 fc->coeff_base_lf_uv_cdf[ctx], LF_BASE_SYMBOLS,
                                 NULL);
      }
      for (int ctx = 0; ctx < SIG_COEF_CONTEXTS; ++ctx) {
        for (int q_i = 0; q_i < TCQ_CTXS; q_i++) {
          av2_cost_tokens_from_cdf(pcost->base_cost[ctx][q_i],
                                   fc->coeff_base_cdf[tx_size][ctx][q_i], 4,
                                   NULL);
        }
      }
      for (int ctx = 0; ctx < SIG_COEF_CONTEXTS_UV; ++ctx) {
        av2_cost_tokens_from_cdf(pcost->base_cost_uv[ctx],
                                 fc->coeff_base_uv_cdf[ctx], 4, 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[ctx] = pcost->base_cost_uv[ctx][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[ctx] = pcost->base_lf_cost_uv[ctx][0];
      }

      // Precompute some base_costs for trellis, interleaved for quick access.
      for (int idx = 0; idx < 5; idx++) {
        int a0 = AVMMIN(trel_abslev[idx][0], 3);
        int a1 = AVMMIN(trel_abslev[idx][1], 3);
        int a2 = AVMMIN(trel_abslev[idx][2], 3);
        int a3 = AVMMIN(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] + av2_cost_literal(1);
          pcost->base_cost_low_tbl[idx][ctx][0][1] =
              pcost->base_cost[ctx][0][a2] + av2_cost_literal(1);
          // Q1, absLev 1 / 3
          pcost->base_cost_low_tbl[idx][ctx][1][0] =
              pcost->base_cost[ctx][1][a1] + av2_cost_literal(1);
          pcost->base_cost_low_tbl[idx][ctx][1][1] =
              pcost->base_cost[ctx][1][a3] + av2_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] + av2_cost_literal(1);
          pcost->base_eob_cost_tbl[idx][ctx][1] =
              pcost->base_eob_cost[ctx][a2 - 1] + av2_cost_literal(1);
        }
        for (int ctx = 0; ctx < SIG_COEF_CONTEXTS_UV; ++ctx) {
          // UV coeffs, absLev 0 / 2
          pcost->base_cost_uv_low_tbl[idx][ctx][0] =
              pcost->base_cost_uv[ctx][a0] + av2_cost_literal(1);
          pcost->base_cost_uv_low_tbl[idx][ctx][1] =
              pcost->base_cost_uv[ctx][a2] + av2_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] + av2_cost_literal(1);
          pcost->base_eob_cost_uv_tbl[idx][ctx][1] =
              pcost->base_eob_cost_uv[ctx][a2 - 1] + av2_cost_literal(1);
        }
      }
      for (int idx = 0; idx < 9; idx++) {
        int max = LF_BASE_SYMBOLS - 1;
        int a0 = AVMMIN(trel_abslev[idx][0], max);
        int a1 = AVMMIN(trel_abslev[idx][1], max);
        int a2 = AVMMIN(trel_abslev[idx][2], max);
        int a3 = AVMMIN(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] + av2_cost_literal(1);
          pcost->base_lf_cost_low_tbl[idx][ctx][0][1] =
              pcost->base_lf_cost[ctx][0][a2] + av2_cost_literal(1);
          // Q1, absLev 1 / 3
          pcost->base_lf_cost_low_tbl[idx][ctx][1][0] =
              pcost->base_lf_cost[ctx][1][a1] + av2_cost_literal(1);
          pcost->base_lf_cost_low_tbl[idx][ctx][1][1] =
              pcost->base_lf_cost[ctx][1][a3] + av2_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] + av2_cost_literal(1);
          pcost->base_lf_eob_cost_tbl[idx][ctx][1] =
              pcost->base_lf_eob_cost[ctx][a2 - 1] + av2_cost_literal(1);
        }
        for (int ctx = 0; ctx < LF_SIG_COEF_CONTEXTS_UV; ++ctx) {
          // LF UV Coeffs, absLev 0 / 2
          pcost->base_lf_cost_uv_low_tbl[idx][ctx][0] =
              pcost->base_lf_cost_uv[ctx][a0] + av2_cost_literal(1);
          pcost->base_lf_cost_uv_low_tbl[idx][ctx][1] =
              pcost->base_lf_cost_uv[ctx][a2] + av2_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] + av2_cost_literal(1);
          pcost->base_lf_eob_cost_uv_tbl[idx][ctx][1] =
              pcost->base_lf_eob_cost_uv[ctx][a2 - 1] + av2_cost_literal(1);
        }
      }
      for (int ctx = 0; ctx < SIG_COEF_CONTEXTS_BOB; ++ctx)
        av2_cost_tokens_from_cdf(
            pcost->base_bob_cost[ctx],
            fc->coeff_base_bob_cdf[AVMMIN(tx_size, TX_16X16)][ctx], 3, NULL);
      for (int ctx = 0; ctx < EOB_COEF_CONTEXTS; ++ctx)
        av2_cost_tokens_from_cdf(pcost->eob_extra_cost[ctx], fc->eob_extra_cdf,
                                 2, NULL);
      for (int gr = 0; gr < DC_SIGN_GROUPS; ++gr) {
        for (int ctx = 0; ctx < DC_SIGN_CONTEXTS; ++ctx) {
          if (plane == PLANE_TYPE_Y) {
            av2_cost_tokens_from_cdf(pcost->dc_sign_cost[gr][ctx],
                                     fc->dc_sign_cdf[plane][gr][ctx], 2, NULL);
          } else {
            pcost->dc_sign_cost[gr][ctx][0] = av2_cost_literal(1);
            pcost->dc_sign_cost[gr][ctx][1] = av2_cost_literal(1);
          }
        }
      }
      if (plane == PLANE_TYPE_UV) {
        for (int i = 0; i < CROSS_COMPONENT_CONTEXTS; ++i)
          for (int ctx = 0; ctx < DC_SIGN_CONTEXTS; ++ctx) {
            pcost->v_dc_sign_cost[i][ctx][0] = av2_cost_literal(1);
            pcost->v_dc_sign_cost[i][ctx][1] = av2_cost_literal(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;
        av2_cost_tokens_from_cdf(br_rate_cctx, fc->coeff_br_uv_cdf[ctx],
                                 BR_CDF_SIZE, 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;
        av2_cost_tokens_from_cdf(br_lf_rate, fc->coeff_br_lf_cdf[ctx],
                                 BR_CDF_SIZE, 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;
        av2_cost_tokens_from_cdf(br_rate, fc->coeff_br_cdf[ctx], BR_CDF_SIZE,
                                 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];
        }
      }
      // 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];
        }
      }
    }
  }

  for (int tx_size = 0; tx_size < TX_SIZES; ++tx_size) {
    int plane = PLANE_TYPE_Y;
    int tx_size_ctx = AVMMIN(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)
      av2_cost_tokens_from_cdf(pcost->idtx_base_cost[ctx],
                               fc->coeff_base_cdf_idtx[tx_size_ctx][ctx], 4,
                               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] +
                                      av2_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)
      av2_cost_tokens_from_cdf(pcost->idtx_sign_cost[ctx],
                               fc->idtx_sign_cdf[tx_size_ctx][ctx], 2, 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;
      av2_cost_tokens_from_cdf(br_rate_skip,
                               fc->coeff_br_cdf_idtx[tx_size_ctx][ctx],
                               BR_CDF_SIZE, 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) {
    av2_cost_tokens_from_cdf(pcost->base_ph_cost[ctx],
                             fc->coeff_base_ph_cdf[ctx], NUM_BASE_LEVELS + 2,
                             NULL);
  }
}

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++) {
    av2_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];
      }
    }
  }
}

void av2_fill_mv_costs(const FRAME_CONTEXT *fc, int integer_mv,
                       MvSubpelPrecision fr_mv_precision, MvCosts *mv_costs) {
  int mb_precision_set = fr_mv_precision < MV_PRECISION_HALF_PEL
                             ? 0
                             : MV_PRECISION_ONE_EIGHTH_PEL - fr_mv_precision;
  const PRECISION_SET *precision_def = &av2_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];

    av2_build_vq_nmv_cost_table(mv_costs, &fc->nmvc, pb_mv_prec, NULL, 0);
    (void)integer_mv;
  }
  av2_build_vq_amvd_nmv_cost_table(mv_costs, &fc->nmvc);
  (void)fr_mv_precision;
}

void av2_initialize_rd_consts(AV2_COMP *cpi) {
  AV2_COMMON *const cm = &cpi->common;
  MACROBLOCK *const x = &cpi->td.mb;
  RD_OPT *const rd = &cpi->rd;
  MvCosts *mv_costs = &x->mv_costs;

  avm_clear_system_state();

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

  av2_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)
    av2_fill_mv_costs(cm->fc, cm->features.cur_frame_force_integer_mv,
                      cm->features.fr_mv_precision, mv_costs);

  if (cm->features.allow_intrabc && !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 av2_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)AVMMIN(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 - AV2_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,
};

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

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 av2_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 = AVMMAX(xqr, x_start + x_step + epsilon);
  xqr = AVMMIN(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 av2_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 av2_mv_pred(const AV2_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 =
      av2_get_ref_mv_from_stack(0, ref_frames, 0, x->mbmi_ext, mbmi);
  const int_mv ref_mv1 =
      av2_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 = AVMMAX(max_mv, AVMMAX(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 av2_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_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);
  }
}

YV12_BUFFER_CONFIG *av2_get_scaled_ref_frame(const AV2_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 av2_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 = av2_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 av2_set_rd_speed_thresholds(AV2_COMP *cpi) {
  RD_OPT *const rd = &cpi->rd;

  // Set baseline threshold values.
  av2_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 av2_update_rd_thresh_fact(const AV2_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 = AVMMAX(bsize - 2, BLOCK_4X4);
    max_size = AVMMIN(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 = AVMMIN(*fact + RD_THRESH_INC, max_rd_thresh_factor);
      }
    }
  }
}

#define INTRA_COST_PENALTY_Q_FACTOR 8

int av2_get_intra_cost_penalty(int qindex, int qdelta, int base_y_dc_delta_q,
                               avm_bit_depth_t bit_depth) {
  const int q = av2_dc_quant_QTX(qindex, qdelta, base_y_dc_delta_q, bit_depth);
  switch (bit_depth) {
    case AVM_BITS_8:
      return ROUND_POWER_OF_TWO(INTRA_COST_PENALTY_Q_FACTOR * q,
                                0 + QUANT_TABLE_BITS);
    case AVM_BITS_10:
      return ROUND_POWER_OF_TWO(INTRA_COST_PENALTY_Q_FACTOR * q,
                                2 + QUANT_TABLE_BITS);
    case AVM_BITS_12:
      return ROUND_POWER_OF_TWO(INTRA_COST_PENALTY_Q_FACTOR * q,
                                4 + QUANT_TABLE_BITS);
    default:
      assert(0 && "bit_depth should be AVM_BITS_8, AVM_BITS_10 or AVM_BITS_12");
      return -1;
  }
}
