/*
 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
 *
 * This source code is subject to the terms of the BSD 2 Clause License and
 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
 * was not distributed with this source code in the LICENSE file, you can
 * obtain it at www.aomedia.org/license/software. 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 www.aomedia.org/license/patent.
 */

#ifndef AOM_AV1_COMMON_ENTROPYMODE_H_
#define AOM_AV1_COMMON_ENTROPYMODE_H_

#include "av1/common/entropy.h"
#include "av1/common/entropymv.h"
#include "av1/common/filter.h"
#include "av1/common/mv.h"
#include "av1/common/seg_common.h"
#include "aom_dsp/aom_filter.h"

#if CONFIG_INTRA_ENTROPY
#include "av1/common/intra_entropy_models.h"
#include "av1/common/nn_em.h"
#endif

#ifdef __cplusplus
extern "C" {
#endif

#define BLOCK_SIZE_GROUPS 4

#define TX_SIZE_CONTEXTS 3

#define INTER_OFFSET(mode) ((mode)-SINGLE_INTER_MODE_START)
#define INTER_COMPOUND_OFFSET(mode) (uint8_t)((mode)-COMP_INTER_MODE_START)

// Number of possible contexts for a color index.
// As can be seen from av1_get_palette_color_index_context(), the possible
// contexts are (2,0,0), (2,2,1), (3,2,0), (4,1,0), (5,0,0). These are mapped to
// a value from 0 to 4 using 'palette_color_index_context_lookup' table.
#define PALETTE_COLOR_INDEX_CONTEXTS 5

// Palette Y mode context for a block is determined by number of neighboring
// blocks (top and/or left) using a palette for Y plane. So, possible Y mode'
// context values are:
// 0 if neither left nor top block uses palette for Y plane,
// 1 if exactly one of left or top block uses palette for Y plane, and
// 2 if both left and top blocks use palette for Y plane.
#define PALETTE_Y_MODE_CONTEXTS 3

// Palette UV mode context for a block is determined by whether this block uses
// palette for the Y plane. So, possible values are:
// 0 if this block doesn't use palette for Y plane.
// 1 if this block uses palette for Y plane (i.e. Y palette size > 0).
#define PALETTE_UV_MODE_CONTEXTS 2

// Map the number of pixels in a block size to a context
//   64(BLOCK_8X8, BLOCK_4x16, BLOCK_16X4)  -> 0
//  128(BLOCK_8X16, BLOCK_16x8)             -> 1
//   ...
// 4096(BLOCK_64X64)                        -> 6
#define PALATTE_BSIZE_CTXS 7

#if CONFIG_DERIVED_INTRA_MODE
#define KF_MODE_CONTEXTS 6
#define KF_IS_DR_MODE_CONTEXTS 3
#else
#define KF_MODE_CONTEXTS 5
#endif

struct AV1Common;

typedef struct {
  const int16_t *scan;
  const int16_t *iscan;
} SCAN_ORDER;

#if CONFIG_INTRA_ENTROPY
#define SPARSE_FEATURE_ARRAYS(model_name, idx, weights_size)           \
  float model_name##_input_layer_sparse_##idx##_weights[weights_size]; \
  float model_name##_input_layer_dw_sparse_##idx[weights_size];

#define INPUT_LAYER_ARRAYS(model_name, dense_weights_size, output_size) \
  float model_name##_input_layer_dense_weights[dense_weights_size];     \
  float model_name##_input_layer_bias[output_size];                     \
  float model_name##_input_layer_output[output_size];                   \
  float model_name##_input_layer_dw_dense[dense_weights_size];          \
  float model_name##_input_layer_db[output_size];                       \
  float model_name##_input_layer_dy[output_size];

#define MODEL_ARRAYS(model_name, sparse_input_size, dense_input_size, \
                     output_size)                                     \
  int model_name##_sparse_features[sparse_input_size];                \
  float model_name##_dense_features[dense_input_size];                \
  float model_name##_output[output_size];
#endif  // CONFIG_INTRA_ENTROPY

#if CONFIG_ENTROPY_CONTEXTS
#define EOB_CONTEXTS 8
#endif  // CONFIG_ENTROPY_CONTEXTS

typedef struct frame_contexts {
  aom_cdf_prob txb_skip_cdf[TX_SIZES][TXB_SKIP_CONTEXTS][CDF_SIZE(2)];
  aom_cdf_prob eob_extra_cdf[TX_SIZES][PLANE_TYPES][EOB_COEF_CONTEXTS]
                            [CDF_SIZE(2)];
  aom_cdf_prob dc_sign_cdf[PLANE_TYPES][DC_SIGN_CONTEXTS][CDF_SIZE(2)];
#if CONFIG_ENTROPY_CONTEXTS
  aom_cdf_prob eob_flag_cdf16[EOB_CONTEXTS][PLANE_TYPES][2][CDF_SIZE(5)];
  aom_cdf_prob eob_flag_cdf32[EOB_CONTEXTS][PLANE_TYPES][2][CDF_SIZE(6)];
  aom_cdf_prob eob_flag_cdf64[EOB_CONTEXTS][PLANE_TYPES][2][CDF_SIZE(7)];
  aom_cdf_prob eob_flag_cdf128[EOB_CONTEXTS][PLANE_TYPES][2][CDF_SIZE(8)];
  aom_cdf_prob eob_flag_cdf256[EOB_CONTEXTS][PLANE_TYPES][2][CDF_SIZE(9)];
  aom_cdf_prob eob_flag_cdf512[EOB_CONTEXTS][PLANE_TYPES][2][CDF_SIZE(10)];
  aom_cdf_prob eob_flag_cdf1024[EOB_CONTEXTS][PLANE_TYPES][2][CDF_SIZE(11)];
#else
  aom_cdf_prob eob_flag_cdf16[PLANE_TYPES][2][CDF_SIZE(5)];
  aom_cdf_prob eob_flag_cdf32[PLANE_TYPES][2][CDF_SIZE(6)];
  aom_cdf_prob eob_flag_cdf64[PLANE_TYPES][2][CDF_SIZE(7)];
  aom_cdf_prob eob_flag_cdf128[PLANE_TYPES][2][CDF_SIZE(8)];
  aom_cdf_prob eob_flag_cdf256[PLANE_TYPES][2][CDF_SIZE(9)];
  aom_cdf_prob eob_flag_cdf512[PLANE_TYPES][2][CDF_SIZE(10)];
  aom_cdf_prob eob_flag_cdf1024[PLANE_TYPES][2][CDF_SIZE(11)];
#endif  // CONFIG_ENTROPY_CONTEXTS
  aom_cdf_prob coeff_base_eob_cdf[TX_SIZES][PLANE_TYPES][SIG_COEF_CONTEXTS_EOB]
                                 [CDF_SIZE(3)];
  aom_cdf_prob coeff_base_cdf[TX_SIZES][PLANE_TYPES][SIG_COEF_CONTEXTS]
                             [CDF_SIZE(4)];
  aom_cdf_prob coeff_br_cdf[TX_SIZES][PLANE_TYPES][LEVEL_CONTEXTS]
                           [CDF_SIZE(BR_CDF_SIZE)];

  aom_cdf_prob newmv_cdf[NEWMV_MODE_CONTEXTS][CDF_SIZE(2)];
  aom_cdf_prob zeromv_cdf[GLOBALMV_MODE_CONTEXTS][CDF_SIZE(2)];
#if CONFIG_NEW_INTER_MODES
  aom_cdf_prob drl0_cdf[DRL_MODE_CONTEXTS][CDF_SIZE(2)];
  aom_cdf_prob drl1_cdf[DRL_MODE_CONTEXTS][CDF_SIZE(2)];
  aom_cdf_prob drl2_cdf[DRL_MODE_CONTEXTS][CDF_SIZE(2)];
#else
  aom_cdf_prob drl_cdf[DRL_MODE_CONTEXTS][CDF_SIZE(2)];
  aom_cdf_prob refmv_cdf[REFMV_MODE_CONTEXTS][CDF_SIZE(2)];
#endif  // CONFIG_NEW_INTER_MODES

  aom_cdf_prob inter_compound_mode_cdf[INTER_MODE_CONTEXTS]
                                      [CDF_SIZE(INTER_COMPOUND_MODES)];
  aom_cdf_prob compound_type_cdf[BLOCK_SIZES_ALL]
                                [CDF_SIZE(MASKED_COMPOUND_TYPES)];
  aom_cdf_prob wedge_idx_cdf[BLOCK_SIZES_ALL][CDF_SIZE(16)];
  aom_cdf_prob interintra_cdf[BLOCK_SIZE_GROUPS][CDF_SIZE(2)];
  aom_cdf_prob wedge_interintra_cdf[BLOCK_SIZES_ALL][CDF_SIZE(2)];
#if CONFIG_INTERINTRA_ML
  // Note that currently, only one of the 4 block sizes is used for
  // the interintra_ml_mode_cdf.
  aom_cdf_prob interintra_ml_mode_cdf[BLOCK_SIZE_GROUPS]
                                     [CDF_SIZE(INTERINTRA_MODES)];
  // For all other block sizes, the CDF only encompasses up to
  // the first ML mode.
  aom_cdf_prob interintra_mode_cdf[BLOCK_SIZE_GROUPS]
                                  [CDF_SIZE(INTERINTRA_MODES)];
#else
  aom_cdf_prob interintra_mode_cdf[BLOCK_SIZE_GROUPS]
                                  [CDF_SIZE(INTERINTRA_MODES)];
#endif  // CONFIG_INTERINTRA_ML
  aom_cdf_prob motion_mode_cdf[BLOCK_SIZES_ALL][CDF_SIZE(MOTION_MODES)];
#if CONFIG_EXT_WARP && CONFIG_SUB8X8_WARP
  aom_cdf_prob warp_cdf[BLOCK_SIZES_ALL][CDF_SIZE(2)];
#endif  // CONFIG_EXT_WARP && CONFIG_SUB8X8_WARP
  aom_cdf_prob obmc_cdf[BLOCK_SIZES_ALL][CDF_SIZE(2)];
  aom_cdf_prob palette_y_size_cdf[PALATTE_BSIZE_CTXS][CDF_SIZE(PALETTE_SIZES)];
  aom_cdf_prob palette_uv_size_cdf[PALATTE_BSIZE_CTXS][CDF_SIZE(PALETTE_SIZES)];
  aom_cdf_prob palette_y_color_index_cdf[PALETTE_SIZES]
                                        [PALETTE_COLOR_INDEX_CONTEXTS]
                                        [CDF_SIZE(PALETTE_COLORS)];
  aom_cdf_prob palette_uv_color_index_cdf[PALETTE_SIZES]
                                         [PALETTE_COLOR_INDEX_CONTEXTS]
                                         [CDF_SIZE(PALETTE_COLORS)];
  aom_cdf_prob palette_y_mode_cdf[PALATTE_BSIZE_CTXS][PALETTE_Y_MODE_CONTEXTS]
                                 [CDF_SIZE(2)];
  aom_cdf_prob palette_uv_mode_cdf[PALETTE_UV_MODE_CONTEXTS][CDF_SIZE(2)];
  aom_cdf_prob comp_inter_cdf[COMP_INTER_CONTEXTS][CDF_SIZE(2)];
  aom_cdf_prob single_ref_cdf[REF_CONTEXTS][SINGLE_REFS - 1][CDF_SIZE(2)];
  aom_cdf_prob comp_ref_type_cdf[COMP_REF_TYPE_CONTEXTS][CDF_SIZE(2)];
  aom_cdf_prob uni_comp_ref_cdf[UNI_COMP_REF_CONTEXTS][UNIDIR_COMP_REFS - 1]
                               [CDF_SIZE(2)];
  aom_cdf_prob comp_ref_cdf[REF_CONTEXTS][FWD_REFS - 1][CDF_SIZE(2)];
  aom_cdf_prob comp_bwdref_cdf[REF_CONTEXTS][BWD_REFS - 1][CDF_SIZE(2)];
#if CONFIG_NEW_TX_PARTITION
  aom_cdf_prob txfm_partition_cdf[2][TXFM_PARTITION_CONTEXTS]
                                 [CDF_SIZE(TX_PARTITION_TYPES)];
#else   // CONFIG_NEW_TX_PARTITION
  aom_cdf_prob txfm_partition_cdf[TXFM_PARTITION_CONTEXTS][CDF_SIZE(2)];
#endif  // CONFIG_NEW_TX_PARTITION
  aom_cdf_prob compound_index_cdf[COMP_INDEX_CONTEXTS][CDF_SIZE(2)];
  aom_cdf_prob comp_group_idx_cdf[COMP_GROUP_IDX_CONTEXTS][CDF_SIZE(2)];
  aom_cdf_prob skip_mode_cdfs[SKIP_CONTEXTS][CDF_SIZE(2)];
  aom_cdf_prob skip_cdfs[SKIP_CONTEXTS][CDF_SIZE(2)];
#if CONFIG_DSPL_RESIDUAL
  // CDF to use for entropy coding partition level residual downsampling
  // decision
  aom_cdf_prob dspl_type_cdf[CDF_SIZE(DSPL_END)];
#endif  // CONFIG_DSPL_RESIDUAL
  aom_cdf_prob intra_inter_cdf[INTRA_INTER_CONTEXTS][CDF_SIZE(2)];
  nmv_context nmvc;
  nmv_context ndvc;
  aom_cdf_prob intrabc_cdf[CDF_SIZE(2)];
#if CONFIG_EXT_IBC_MODES
  aom_cdf_prob intrabc_mode_cdf[CDF_SIZE(8)];
  // aom_cdf_prob intrabc_mode_cdf[CDF_SIZE(6)];
  // aom_cdf_prob intrabc_mode_cdf[CDF_SIZE(4)];
#endif  // CONFIG_EXT_IBC_MODES
  struct segmentation_probs seg;
  aom_cdf_prob filter_intra_cdfs[BLOCK_SIZES_ALL][CDF_SIZE(2)];
  aom_cdf_prob filter_intra_mode_cdf[CDF_SIZE(FILTER_INTRA_MODES)];
#if CONFIG_ADAPT_FILTER_INTRA
  aom_cdf_prob adapt_filter_intra_cdfs[BLOCK_SIZES_ALL][CDF_SIZE(2)];
  aom_cdf_prob
      adapt_filter_intra_mode_cdf[CDF_SIZE(USED_ADAPT_FILTER_INTRA_MODES)];
#endif  // CONFIG_ADAPT_FILTER_INTRA
#if CONFIG_LOOP_RESTORE_CNN
  aom_cdf_prob switchable_restore_cdf[2][CDF_SIZE(RESTORE_SWITCHABLE_TYPES)];
#else
  aom_cdf_prob switchable_restore_cdf[CDF_SIZE(RESTORE_SWITCHABLE_TYPES)];
#endif  // CONFIG_LOOP_RESTORE_CNN
  aom_cdf_prob wiener_restore_cdf[CDF_SIZE(2)];
  aom_cdf_prob sgrproj_restore_cdf[CDF_SIZE(2)];
#if CONFIG_LOOP_RESTORE_CNN
  aom_cdf_prob cnn_restore_cdf[CDF_SIZE(2)];
#endif  // CONFIG_LOOP_RESTORE_CNN
#if CONFIG_WIENER_NONSEP
  aom_cdf_prob wiener_nonsep_restore_cdf[CDF_SIZE(2)];
#endif  // CONFIG_WIENER_NONSEP
#if CONFIG_RST_MERGECOEFFS
  aom_cdf_prob merged_param_cdf[CDF_SIZE(2)];
#endif  // CONFIG_RST_MERGECOEFFS
#if CONFIG_DERIVED_INTRA_MODE
  aom_cdf_prob bf_is_dr_mode_cdf[BLOCK_SIZE_GROUPS][CDF_SIZE(2)];
  aom_cdf_prob bf_dr_mode_cdf[BLOCK_SIZE_GROUPS][CDF_SIZE(DIRECTIONAL_MODES)];
  aom_cdf_prob bf_none_dr_mode_cdf[BLOCK_SIZE_GROUPS]
                                  [CDF_SIZE(NONE_DIRECTIONAL_MODES)];
#else
  aom_cdf_prob y_mode_cdf[BLOCK_SIZE_GROUPS][CDF_SIZE(INTRA_MODES)];
#endif  // CONFIG_DERIVED_INTRA_MODE
  aom_cdf_prob partition_cdf[PARTITION_CONTEXTS][CDF_SIZE(EXT_PARTITION_TYPES)];
#if CONFIG_EXT_RECUR_PARTITIONS
  aom_cdf_prob partition_rec_cdf[PARTITION_CONTEXTS_REC]
                                [CDF_SIZE(PARTITION_TYPES_REC)];
#endif  // CONFIG_EXT_RECUR_PARTITIONS
  aom_cdf_prob switchable_interp_cdf[SWITCHABLE_FILTER_CONTEXTS]
                                    [CDF_SIZE(SWITCHABLE_FILTERS)];
#if CONFIG_INTRA_ENTROPY
  SPARSE_FEATURE_ARRAYS(
      intra_y_mode, 0,
      EM_Y_SPARSE_FEAT_SIZE_0 *ALIGN_MULTIPLE_OF_FOUR(EM_Y_OUTPUT_SIZE));
  SPARSE_FEATURE_ARRAYS(
      intra_y_mode, 1,
      EM_Y_SPARSE_FEAT_SIZE_1 *ALIGN_MULTIPLE_OF_FOUR(EM_Y_OUTPUT_SIZE));
  INPUT_LAYER_ARRAYS(
      intra_y_mode,
      EM_NUM_Y_DENSE_FEATURES *ALIGN_MULTIPLE_OF_FOUR(EM_Y_OUTPUT_SIZE),
      ALIGN_MULTIPLE_OF_FOUR(EM_Y_OUTPUT_SIZE));
  MODEL_ARRAYS(intra_y_mode, EM_NUM_Y_SPARSE_FEATURES,
               ALIGN_MULTIPLE_OF_FOUR(EM_NUM_Y_DENSE_FEATURES),
               ALIGN_MULTIPLE_OF_FOUR(EM_Y_OUTPUT_SIZE));

  SPARSE_FEATURE_ARRAYS(
      intra_uv_mode, 0,
      EM_UV_SPARSE_FEAT_SIZE_0 *ALIGN_MULTIPLE_OF_FOUR(EM_UV_OUTPUT_SIZE));
  SPARSE_FEATURE_ARRAYS(
      intra_uv_mode, 1,
      EM_UV_SPARSE_FEAT_SIZE_1 *ALIGN_MULTIPLE_OF_FOUR(EM_UV_OUTPUT_SIZE));
  INPUT_LAYER_ARRAYS(intra_uv_mode, 0,
                     ALIGN_MULTIPLE_OF_FOUR(EM_UV_OUTPUT_SIZE));
  MODEL_ARRAYS(intra_uv_mode, EM_NUM_UV_SPARSE_FEATURES, 0,
               ALIGN_MULTIPLE_OF_FOUR(EM_UV_OUTPUT_SIZE));

  NN_CONFIG_EM intra_y_mode;
  NN_CONFIG_EM intra_uv_mode;
#else
#if CONFIG_DERIVED_INTRA_MODE
  aom_cdf_prob kf_is_dr_mode_cdf[KF_MODE_CONTEXTS][KF_MODE_CONTEXTS]
                                [CDF_SIZE(2)];
  aom_cdf_prob kf_dr_mode_cdf[KF_MODE_CONTEXTS][KF_MODE_CONTEXTS]
                             [CDF_SIZE(DIRECTIONAL_MODES)];
  aom_cdf_prob kf_none_dr_mode_cdf[KF_MODE_CONTEXTS][KF_MODE_CONTEXTS]
                                  [CDF_SIZE(NONE_DIRECTIONAL_MODES)];
#else
  /* kf_y_cdf is discarded after use, so does not require persistent storage.
       However, we keep it with the other CDFs in this struct since it needs to
       be copied to each tile to support parallelism just like the others.
   */
  aom_cdf_prob kf_y_cdf[KF_MODE_CONTEXTS][KF_MODE_CONTEXTS]
                       [CDF_SIZE(INTRA_MODES)];
#endif  // CONFIG_DERIVED_INTRA_MODE
  aom_cdf_prob uv_mode_cdf[CFL_ALLOWED_TYPES][INTRA_MODES]
                          [CDF_SIZE(UV_INTRA_MODES)];
#endif  // CONFIG_INTRA_ENTROPY

#if CONFIG_FLEX_MVRES
  aom_cdf_prob
      sb_mv_precision_cdf[MV_SUBPEL_PRECISIONS - MV_SUBPEL_HALF_PRECISION]
                         [CDF_SIZE(MV_SUBPEL_PRECISIONS)];
#if DISALLOW_ONE_DOWN_FLEX_MVRES == 2
  aom_cdf_prob pb_mv_precision_cdf[MV_PREC_DOWN_CONTEXTS]
                                  [NUM_PB_FLEX_QUALIFIED_MAX_PREC]
                                  [CDF_SIZE(FLEX_MV_COSTS_SIZE)];
#elif DISALLOW_ONE_DOWN_FLEX_MVRES == 1
  aom_cdf_prob pb_mv_precision_cdf[MV_PREC_DOWN_CONTEXTS]
                                  [NUM_PB_FLEX_QUALIFIED_MAX_PREC]
                                  [CDF_SIZE(FLEX_MV_COSTS_SIZE)];
#else
  aom_cdf_prob pb_mv_precision_cdf[MV_PREC_DOWN_CONTEXTS]
                                  [NUM_PB_FLEX_QUALIFIED_MAX_PREC]
                                  [CDF_SIZE(FLEX_MV_COSTS_SIZE)];
#endif  // DISALLOW_ONE_DOWN_FLEX_MVRES
#endif  // CONFIG_FLEX_MVRES

  aom_cdf_prob angle_delta_cdf[DIRECTIONAL_MODES]
                              [CDF_SIZE(2 * MAX_ANGLE_DELTA + 1)];

#if CONFIG_NEW_TX_PARTITION
  aom_cdf_prob tx_size_cdf[2][TX_SIZE_CONTEXTS]
                          [CDF_SIZE(TX_PARTITION_TYPES_INTRA)];
#else
  aom_cdf_prob tx_size_cdf[MAX_TX_CATS][TX_SIZE_CONTEXTS]
                          [CDF_SIZE(MAX_TX_DEPTH + 1)];
#endif  // CONFIG_NEW_TX_PARTITION
#if CONFIG_NN_RECON
  aom_cdf_prob use_nn_recon_cdf[CDF_SIZE(2)];
#endif  // CONFIG_NN_RECON
  aom_cdf_prob delta_q_cdf[CDF_SIZE(DELTA_Q_PROBS + 1)];
  aom_cdf_prob delta_lf_multi_cdf[FRAME_LF_COUNT][CDF_SIZE(DELTA_LF_PROBS + 1)];
  aom_cdf_prob delta_lf_cdf[CDF_SIZE(DELTA_LF_PROBS + 1)];
#if CONFIG_MODE_DEP_INTRA_TX || CONFIG_MODE_DEP_INTER_TX
#if CONFIG_MODE_DEP_INTER_TX
  aom_cdf_prob mdtx_type_inter_cdf[EXT_TX_SIZES][CDF_SIZE(MDTX_TYPES_INTER)];
  aom_cdf_prob use_mdtx_inter_cdf[EXT_TX_SIZES][CDF_SIZE(2)];
#endif  // CONFIG_MODE_DEP_INTER_TX
#if CONFIG_MODE_DEP_INTRA_TX
  aom_cdf_prob mdtx_type_intra_cdf[EXT_TX_SIZES][INTRA_MODES]
                                  [CDF_SIZE(MDTX_TYPES_INTRA)];
  aom_cdf_prob use_mdtx_intra_cdf[EXT_TX_SIZES][INTRA_MODES][CDF_SIZE(2)];
#endif  // CONFIG_MODE_DEP_INTRA_TX
  aom_cdf_prob intra_ext_tx_cdf[EXT_TX_SETS_INTRA][EXT_TX_SIZES][INTRA_MODES]
                               [CDF_SIZE(TX_TYPES_NOMDTX)];
  aom_cdf_prob inter_ext_tx_cdf[EXT_TX_SETS_INTER][EXT_TX_SIZES]
                               [CDF_SIZE(TX_TYPES_NOMDTX)];
#else
  aom_cdf_prob intra_ext_tx_cdf[EXT_TX_SETS_INTRA][EXT_TX_SIZES][INTRA_MODES]
                               [CDF_SIZE(TX_TYPES)];
  aom_cdf_prob inter_ext_tx_cdf[EXT_TX_SETS_INTER][EXT_TX_SIZES]
                               [CDF_SIZE(TX_TYPES)];
#endif  // CONFIG_MODE_DEP_INTRA_TX || CONFIG_MODE_DEP_INTER_TX
  aom_cdf_prob cfl_sign_cdf[CDF_SIZE(CFL_JOINT_SIGNS)];
  aom_cdf_prob cfl_alpha_cdf[CFL_ALPHA_CONTEXTS][CDF_SIZE(CFL_ALPHABET_SIZE)];
#if CONFIG_DERIVED_INTRA_MODE
  aom_cdf_prob derived_intra_mode_cdf[2][3][CDF_SIZE(2)];
  aom_cdf_prob uv_derived_intra_mode_cdf[2][CDF_SIZE(2)];
#endif  // CONFIG_DERIVED_INTRA_MODE
#if CONFIG_DERIVED_MV
  // First index: 0: single reference; 1: compound reference; 2: skip mode.
  aom_cdf_prob use_derived_mv_cdf[3][BLOCK_SIZES_ALL][CDF_SIZE(2)];
#endif  // CONFIG_DERIVED_MV
  int initialized;
} FRAME_CONTEXT;

#if CONFIG_MODE_DEP_INTRA_TX || CONFIG_MODE_DEP_INTER_TX
static const int av1_ext_tx_ind[EXT_TX_SET_TYPES][TX_TYPES_NOMDTX] = {
#else
static const int av1_ext_tx_ind[EXT_TX_SET_TYPES][TX_TYPES] = {
#endif  // CONFIG_MODE_DEP_INTRA_TX || CONFIG_MODE_DEP_INTER_TX
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 1, 3, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 1, 5, 6, 4, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0 },
  { 3, 4, 5, 8, 6, 7, 9, 10, 11, 0, 1, 2, 0, 0, 0, 0 },
  { 7, 8, 9, 12, 10, 11, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6 },
};

#if CONFIG_MODE_DEP_INTRA_TX || CONFIG_MODE_DEP_INTER_TX
static const int av1_ext_tx_inv[EXT_TX_SET_TYPES][TX_TYPES_NOMDTX] = {
#else
static const int av1_ext_tx_inv[EXT_TX_SET_TYPES][TX_TYPES] = {
#endif  // CONFIG_MODE_DEP_INTRA_TX || CONFIG_MODE_DEP_INTER_TX
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 9, 0, 3, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 9, 0, 10, 11, 3, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 9, 10, 11, 0, 1, 2, 4, 5, 3, 6, 7, 8, 0, 0, 0, 0 },
  { 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 4, 5, 3, 6, 7, 8 },
};

void av1_set_default_ref_deltas(int8_t *ref_deltas);
void av1_set_default_mode_deltas(int8_t *mode_deltas);
void av1_setup_frame_contexts(struct AV1Common *cm);
void av1_setup_past_independence(struct AV1Common *cm);

// Returns (int)ceil(log2(n)).
// NOTE: This implementation only works for n <= 2^30.
static INLINE int av1_ceil_log2(int n) {
  if (n < 2) return 0;
  int i = 1, p = 2;
  while (p < n) {
    i++;
    p = p << 1;
  }
  return i;
}

// Returns the context for palette color index at row 'r' and column 'c',
// along with the 'color_order' of neighbors and the 'color_idx'.
// The 'color_map' is a 2D array with the given 'stride'.
int av1_get_palette_color_index_context(const uint8_t *color_map, int stride,
                                        int r, int c, int palette_size,
                                        uint8_t *color_order, int *color_idx);

#if CONFIG_INTRA_ENTROPY
#define SETUP_SPARSE_FEATURE_POINTERS(model, idx)     \
  fc->model.input_layer.sparse_weights[idx] =         \
      fc->model##_input_layer_sparse_##idx##_weights; \
  fc->model.input_layer.dw_sparse[idx] =              \
      fc->model##_input_layer_dw_sparse_##idx;

#define SETUP_MODEL_POINTERS(model)                                            \
  fc->model.input_layer.dense_weights = fc->model##_input_layer_dense_weights; \
  fc->model.input_layer.bias = fc->model##_input_layer_bias;                   \
  fc->model.input_layer.output = fc->model##_input_layer_output;               \
  fc->model.input_layer.dy = fc->model##_input_layer_dy;                       \
  fc->model.input_layer.db = fc->model##_input_layer_db;                       \
  fc->model.input_layer.dw_dense = fc->model##_input_layer_dw_dense;           \
  fc->model.sparse_features = fc->model##_sparse_features;                     \
  fc->model.dense_features = fc->model##_dense_features;                       \
  fc->model.output = fc->model##_output;

static INLINE void av1_config_entropy_models(FRAME_CONTEXT *const fc) {
  SETUP_SPARSE_FEATURE_POINTERS(intra_y_mode, 0);
  SETUP_SPARSE_FEATURE_POINTERS(intra_y_mode, 1);
  SETUP_MODEL_POINTERS(intra_y_mode);

  SETUP_SPARSE_FEATURE_POINTERS(intra_uv_mode, 0);
  SETUP_SPARSE_FEATURE_POINTERS(intra_uv_mode, 1);
  SETUP_MODEL_POINTERS(intra_uv_mode);
}
#endif  // CONFIG_INTRA_ENTROPY

#ifdef __cplusplus
}  // extern "C"
#endif

#endif  // AOM_AV1_COMMON_ENTROPYMODE_H_
