| /* | 
 |  * 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/. | 
 |  */ | 
 |  | 
 | /*! \file | 
 |  * Declares various structs used to encode the current partition block. | 
 |  */ | 
 | #ifndef AOM_AV1_ENCODER_BLOCK_H_ | 
 | #define AOM_AV1_ENCODER_BLOCK_H_ | 
 |  | 
 | #include "av1/common/entropymv.h" | 
 | #include "av1/common/entropy.h" | 
 | #include "av1/common/enums.h" | 
 | #include "av1/common/mvref_common.h" | 
 |  | 
 | #include "av1/encoder/enc_enums.h" | 
 | #include "av1/encoder/partition_cnn_weights.h" | 
 |  | 
 | #include "av1/encoder/hash.h" | 
 |  | 
 | #ifdef __cplusplus | 
 | extern "C" { | 
 | #endif | 
 |  | 
 | //! Minimum linear dimension of a tpl block | 
 | #define MIN_TPL_BSIZE_1D 16 | 
 | //! Maximum number of tpl block in a super block | 
 | #define MAX_TPL_BLK_IN_SB (MAX_SB_SIZE / MIN_TPL_BSIZE_1D) | 
 | //! Number of intra winner modes kept | 
 | #define MAX_WINNER_MODE_COUNT_INTRA 3 | 
 | //! Number of inter winner modes kept | 
 | #define MAX_WINNER_MODE_COUNT_INTER 1 | 
 | //! Number of txfm hash records kept for the partition block. | 
 | #define RD_RECORD_BUFFER_LEN 8 | 
 | //! Number of txfm hash records kept for the txfm block. | 
 | #define TX_SIZE_RD_RECORD_BUFFER_LEN 256 | 
 |  | 
 | /*! \brief Transform coded coefficient info. | 
 |  * | 
 |  * This structure stores various parameters related transform coded | 
 |  * coefficients. | 
 |  */ | 
 | typedef struct { | 
 |   //! Value of quantized coefficient. | 
 |   tran_low_t qc; | 
 |   //! Value of inverse quantized coefficient. | 
 |   tran_low_t dqc; | 
 |   //! Cost change between coding the coefficient at a higher level and lower | 
 |   //! level. | 
 |   int64_t delta_cost; | 
 |   //! Rate change between coding the coefficient at a higher level and lower | 
 |   //! level. | 
 |   int delta_rate; | 
 |   //! Flag to indicate the coefficient is quantized at a higher level. | 
 |   bool upround; | 
 |   //! Flag to indicate the coefficient is within tunable range. | 
 |   bool tunable; | 
 | } coeff_info; | 
 |  | 
 | /*! \brief Superblock level encoder info | 
 |  * | 
 |  * SuperblockEnc stores superblock level information used by the encoder for | 
 |  * more efficient encoding. Currently this is mostly used to store TPL data | 
 |  * for the current superblock. | 
 |  */ | 
 | typedef struct { | 
 |   //! Maximum partition size for the sb. | 
 |   BLOCK_SIZE min_partition_size; | 
 |   //! Minimum partition size for the sb. | 
 |   BLOCK_SIZE max_partition_size; | 
 |  | 
 |   /***************************************************************************** | 
 |    * \name TPL Info | 
 |    * | 
 |    * Information gathered from tpl_model at tpl block precision for the | 
 |    * superblock to speed up the encoding process.. | 
 |    ****************************************************************************/ | 
 |   /**@{*/ | 
 |   //! Number of TPL blocks in this superblock. | 
 |   int tpl_data_count; | 
 |   //! TPL's estimate of inter cost for each tpl block. | 
 |   int64_t tpl_inter_cost[MAX_TPL_BLK_IN_SB * MAX_TPL_BLK_IN_SB]; | 
 |   //! TPL's estimate of tpl cost for each tpl block. | 
 |   int64_t tpl_intra_cost[MAX_TPL_BLK_IN_SB * MAX_TPL_BLK_IN_SB]; | 
 |   //! Motion vectors found by TPL model for each tpl block. | 
 |   int_mv tpl_mv[MAX_TPL_BLK_IN_SB * MAX_TPL_BLK_IN_SB][INTER_REFS_PER_FRAME]; | 
 |   //! TPL's stride for the arrays in this struct. | 
 |   int tpl_stride; | 
 |   /**@}*/ | 
 | } SuperBlockEnc; | 
 |  | 
 | /*! \brief Stores the best performing modes. | 
 |  */ | 
 | typedef struct { | 
 |   //! The mbmi used to reconstruct the winner mode. | 
 |   MB_MODE_INFO mbmi; | 
 |   //! Rdstats of the winner mode. | 
 |   RD_STATS rd_cost; | 
 |   //! Rdcost of the winner mode | 
 |   int64_t rd; | 
 |   //! Luma rate of the winner mode. | 
 |   int rate_y; | 
 |   //! Chroma rate of the winner mode. | 
 |   int rate_uv; | 
 |   //! The color map needed to reconstruct palette mode. | 
 |   uint8_t color_index_map[MAX_SB_SQUARE]; | 
 |   //! The current winner mode. | 
 |   REFERENCE_MODE mode; | 
 |   //! Reference frame(s) for winner mode. | 
 |   int refs[2]; | 
 | } WinnerModeStats; | 
 |  | 
 | /*! \brief Each source plane of the current macroblock | 
 |  * | 
 |  * This struct also stores the txfm buffers and quantizer settings. | 
 |  */ | 
 | typedef struct macroblock_plane { | 
 |   //! Stores source - pred so the txfm can be computed later | 
 |   DECLARE_ALIGNED(32, int16_t, src_diff[MAX_SB_SQUARE]); | 
 |   //! Temporary buffer for primary transform coeffs | 
 |   DECLARE_ALIGNED(32, int32_t, temp_coeff[4096]); | 
 |   //! Dequantized coefficients | 
 |   tran_low_t *dqcoeff; | 
 |   //! Quantized coefficients | 
 |   tran_low_t *qcoeff; | 
 |   //! Transformed coefficients | 
 |   tran_low_t *coeff; | 
 |   //! Location of the end of qcoeff (end of block). | 
 |   uint16_t *eobs; | 
 |   //! Location of the beginning of qcoeff (beginning of block). | 
 |   uint16_t *bobs; | 
 |   //! Contexts used to code the transform coefficients. | 
 |   uint8_t *txb_entropy_ctx; | 
 |   //! A buffer containing the source frame. | 
 |   struct buf_2d src; | 
 |  | 
 |   /*! \name Quantizer Settings | 
 |    * | 
 |    * \attention These are used/accessed only in the quantization process. | 
 |    * RDO does not and *must not* depend on any of these values. | 
 |    * All values below share the coefficient scale/shift used in TX. | 
 |    */ | 
 |   /**@{*/ | 
 |   //! Quantization step size used by AV1_XFORM_QUANT_FP. | 
 |  | 
 |   const int32_t *quant_fp_QTX; | 
 |   //! Offset used for rounding in the quantizer process by AV1_XFORM_QUANT_FP. | 
 |   const int32_t *round_fp_QTX; | 
 |   //! Quantization step size used by AV1_XFORM_QUANT_B. | 
 |   const int32_t *quant_QTX; | 
 |   //! Offset used for rounding in the quantizer process by AV1_XFORM_QUANT_B. | 
 |   const int32_t *round_QTX; | 
 |   //! Scale factor to shift coefficients toward zero. Only used by QUANT_B. | 
 |   const int32_t *quant_shift_QTX; | 
 |   //! Size of the quantization bin around 0. Only Used by QUANT_B | 
 |   const int32_t *zbin_QTX; | 
 |   //! Dequantizer | 
 |   const int32_t *dequant_QTX; | 
 |   /**@}*/ | 
 | } MACROBLOCK_PLANE; | 
 |  | 
 | /*! \brief Costs for encoding the coefficients within a level. | 
 |  * | 
 |  * Covers everything including txb_skip, eob, dc_sign, | 
 |  */ | 
 | typedef struct { | 
 |   //! Cost to skip txfm for the current txfm block. | 
 | #if CONFIG_TX_SKIP_FLAG_MODE_DEP_CTX | 
 |   int txb_skip_cost[2][TXB_SKIP_CONTEXTS][2]; | 
 | #else | 
 |   int txb_skip_cost[TXB_SKIP_CONTEXTS][2]; | 
 | #endif  // CONFIG_TX_SKIP_FLAG_MODE_DEP_CTX | 
 | #if CONFIG_CONTEXT_DERIVATION | 
 |   //! Cost to skip txfm for the current AOM_PLANE_V txfm block. | 
 |   int v_txb_skip_cost[V_TXB_SKIP_CONTEXTS][2]; | 
 | #endif  // CONFIG_CONTEXT_DERIVATION | 
 |  | 
 | #if CONFIG_CHROMA_CODING | 
 |   //! Cost for encoding the base_eob level of a low-frequency chroma coefficient | 
 |   int base_lf_eob_cost_uv[SIG_COEF_CONTEXTS_EOB][LF_BASE_SYMBOLS - 1]; | 
 |   //! Cost for encoding the base level of a low-frequency chroma coefficient | 
 |   int base_lf_cost_uv[LF_SIG_COEF_CONTEXTS_UV][LF_BASE_SYMBOLS * 2]; | 
 |   //! Cost for encoding an increment to the low-frequency chroma coefficient | 
 |   int lps_lf_cost_uv[LF_LEVEL_CONTEXTS_UV] | 
 |                     [COEFF_BASE_RANGE + 1 + COEFF_BASE_RANGE + 1]; | 
 |   /*! \brief Cost for encoding the base_eob of a chroma level. | 
 |    * | 
 |    * Decoder uses base_eob to derive the base_level as base_eob := base_eob+1. | 
 |    */ | 
 |   int base_eob_cost_uv[SIG_COEF_CONTEXTS_EOB][3]; | 
 |   /*! \brief Cost for encoding the base level of a chroma coefficient. | 
 |    * | 
 |    * Decoder derives coeff_base as coeff_base := base_eob + 1. | 
 |    */ | 
 |   int base_cost_uv[SIG_COEF_CONTEXTS_UV][8]; | 
 |   //! Cost for encoding an increment to the chroma coefficient | 
 |   int lps_cost_uv[LEVEL_CONTEXTS_UV] | 
 |                  [COEFF_BASE_RANGE + 1 + COEFF_BASE_RANGE + 1]; | 
 | #endif  // CONFIG_CHROMA_CODING | 
 |   /*! \brief Cost for encoding the base_eob of a level in the low frequency | 
 |    * region. | 
 |    * | 
 |    * Decoder uses base_eob to derive the base_level as base_eob := base_eob+1. | 
 |    */ | 
 |   int base_lf_eob_cost[SIG_COEF_CONTEXTS_EOB][LF_BASE_SYMBOLS - 1]; | 
 |   //! Cost for encoding the base level of a low-frequency coefficient | 
 |   int base_lf_cost[LF_SIG_COEF_CONTEXTS][LF_BASE_SYMBOLS * 2]; | 
 |   //! Cost for encoding an increment to the low-frequency coefficient | 
 |   int lps_lf_cost[LF_LEVEL_CONTEXTS] | 
 |                  [COEFF_BASE_RANGE + 1 + COEFF_BASE_RANGE + 1]; | 
 |   //! Cost for encoding the base level of a parity-hidden coefficient | 
 |   int base_ph_cost[COEFF_BASE_PH_CONTEXTS][4]; | 
 |   //! Cost for encoding an increment to the parity-hidden coefficient | 
 |   int lps_ph_cost[COEFF_BR_PH_CONTEXTS] | 
 |                  [COEFF_BASE_RANGE + 1 + COEFF_BASE_RANGE + 1]; | 
 |   /*! \brief Cost for encoding the base_eob of a level. | 
 |    * | 
 |    * Decoder uses base_eob to derive the base_level as base_eob := base_eob+1. | 
 |    */ | 
 |   int base_eob_cost[SIG_COEF_CONTEXTS_EOB][3]; | 
 |   /*! \brief Cost for encoding the base level of a coefficient. | 
 |    * | 
 |    * Decoder derives coeff_base as coeff_base := base_eob + 1. | 
 |    */ | 
 |   int base_cost[SIG_COEF_CONTEXTS][8]; | 
 |   /*! \brief Cost for encoding the last non-zero coefficient. | 
 |    * | 
 |    * Eob is derived from eob_extra at the decoder as eob := eob_extra + 1 | 
 |    */ | 
 |   int eob_extra_cost[EOB_COEF_CONTEXTS][2]; | 
 |   //! Cost for encoding the dc_sign | 
 | #if CONFIG_IMPROVEIDTX | 
 |   int dc_sign_cost[DC_SIGN_GROUPS][DC_SIGN_CONTEXTS][2]; | 
 | #else | 
 |   int dc_sign_cost[DC_SIGN_CONTEXTS][2]; | 
 | #endif  // CONFIG_IMPROVEIDTX | 
 | #if CONFIG_CONTEXT_DERIVATION | 
 |   //! Cost for encoding the AOM_PLANE_V txfm coefficient dc_sign | 
 |   int v_dc_sign_cost[CROSS_COMPONENT_CONTEXTS][DC_SIGN_CONTEXTS][2]; | 
 |   //! Cost for encoding the AOM_PLANE_V txfm coefficient ac_sign | 
 |   int v_ac_sign_cost[CROSS_COMPONENT_CONTEXTS][2]; | 
 | #endif  // CONFIG_CONTEXT_DERIVATION | 
 |   //! Cost for encoding an increment to the coefficient | 
 |   int lps_cost[LEVEL_CONTEXTS][COEFF_BASE_RANGE + 1 + COEFF_BASE_RANGE + 1]; | 
 |   //! Cost for encoding the base level of a coefficient for IDTX blocks | 
 |   int idtx_base_cost[IDTX_SIG_COEF_CONTEXTS][8]; | 
 |   //! Cost for encoding the sign of a coefficient for IDTX blocks | 
 |   int idtx_sign_cost[IDTX_SIGN_CONTEXTS][2]; | 
 |   //! Cost for encoding an increment to the coefficient for IDTX blocks | 
 |   int lps_cost_skip[IDTX_LEVEL_CONTEXTS] | 
 |                    [COEFF_BASE_RANGE + 1 + COEFF_BASE_RANGE + 1]; | 
 |   /*! \brief Cost for encoding the base_bob of a level for IDTX blocks. | 
 |    * | 
 |    * Decoder uses base_bob to derive the base_level as base_bob := base_bob+1. | 
 |    */ | 
 |   int base_bob_cost[SIG_COEF_CONTEXTS_BOB][3]; | 
 | } LV_MAP_COEFF_COST; | 
 |  | 
 | /*! \brief Costs for encoding the eob. | 
 |  */ | 
 | typedef struct { | 
 |   //! eob_cost. | 
 | #if CONFIG_EOB_POS_LUMA | 
 |   int eob_cost[2][16]; | 
 | #else | 
 |   int eob_cost[EOB_MAX_SYMS]; | 
 | #endif  // CONFIG_EOB_POS_LUMA | 
 | } LV_MAP_EOB_COST; | 
 |  | 
 | /*! \brief Stores the transforms coefficients for the whole superblock. | 
 |  */ | 
 | typedef struct { | 
 |   //! The transformed coefficients. | 
 |   tran_low_t tcoeff[MAX_MB_PLANE][MAX_SB_SQUARE]; | 
 |   //! Where the transformed coefficients end. | 
 |   uint16_t eobs[MAX_MB_PLANE][MAX_SB_SQUARE / (TX_SIZE_W_MIN * TX_SIZE_H_MIN)]; | 
 |   //! Where the transformed coefficients begin. | 
 |   uint16_t bobs[MAX_MB_PLANE][MAX_SB_SQUARE / (TX_SIZE_W_MIN * TX_SIZE_H_MIN)]; | 
 |   /*! \brief Transform block entropy contexts. | 
 |    * | 
 |    * Each element is used as a bit field. | 
 |    * - Bits 0~3: txb_skip_ctx | 
 |    * - Bits 4~5: dc_sign_ctx. | 
 |    */ | 
 |   uint8_t entropy_ctx[MAX_MB_PLANE] | 
 |                      [MAX_SB_SQUARE / (TX_SIZE_W_MIN * TX_SIZE_H_MIN)]; | 
 | } CB_COEFF_BUFFER; | 
 |  | 
 | /*! \brief Extended mode info derived from mbmi. | 
 |  */ | 
 | typedef struct { | 
 |   // TODO(angiebird): Reduce the buffer size according to sb_type | 
 |   //! The reference mv list for the current block. | 
 |   CANDIDATE_MV ref_mv_stack[MODE_CTX_REF_FRAMES][USABLE_REF_MV_STACK_SIZE]; | 
 |   //! The weights used to compute the ref mvs. | 
 |   uint16_t weight[MODE_CTX_REF_FRAMES][USABLE_REF_MV_STACK_SIZE]; | 
 |   //! Number of ref mvs in the drl. | 
 |   uint8_t ref_mv_count[MODE_CTX_REF_FRAMES]; | 
 |   //! Global mvs | 
 |   int_mv global_mvs[INTER_REFS_PER_FRAME]; | 
 |   //! skip_mvp_candidate_list is the MVP list for skip mode. | 
 | #if CONFIG_SKIP_MODE_ENHANCEMENT | 
 |   SKIP_MODE_MVP_LIST skip_mvp_candidate_list; | 
 | #endif | 
 |  | 
 |   //! Context used to encode the current mode. | 
 |   int16_t mode_context[MODE_CTX_REF_FRAMES]; | 
 |  | 
 |   /*! | 
 |    * warp_param_stack is the warp candidate list. | 
 |    */ | 
 |   WARP_CANDIDATE warp_param_stack[INTER_REFS_PER_FRAME] | 
 |                                  [MAX_WARP_REF_CANDIDATES]; | 
 |  | 
 | } MB_MODE_INFO_EXT; | 
 |  | 
 | /*! \brief Stores best extended mode information at frame level. | 
 |  * | 
 |  * The frame level in here is used in bitstream preparation stage. The | 
 |  * information in \ref MB_MODE_INFO_EXT are copied to this struct to save | 
 |  * memory. | 
 |  */ | 
 | typedef struct { | 
 | #if CONFIG_SEP_COMP_DRL | 
 |   //! \copydoc MB_MODE_INFO_EXT::ref_mv_stack | 
 |   CANDIDATE_MV ref_mv_stack[2][USABLE_REF_MV_STACK_SIZE]; | 
 |   //! \copydoc MB_MODE_INFO_EXT::weight | 
 |   uint16_t weight[2][USABLE_REF_MV_STACK_SIZE]; | 
 |   //! \copydoc MB_MODE_INFO_EXT::ref_mv_count | 
 |   uint8_t ref_mv_count[2]; | 
 | #else | 
 |   //! \copydoc MB_MODE_INFO_EXT::ref_mv_stack | 
 |   CANDIDATE_MV ref_mv_stack[USABLE_REF_MV_STACK_SIZE]; | 
 |   //! \copydoc MB_MODE_INFO_EXT::weight | 
 |   uint16_t weight[USABLE_REF_MV_STACK_SIZE]; | 
 |   //! \copydoc MB_MODE_INFO_EXT::ref_mv_count | 
 |   uint8_t ref_mv_count; | 
 | #endif  // CONFIG_SEP_COMP_DRL | 
 |   //! skip_mvp_candidate_list is the MVP list for skip mode. | 
 | #if CONFIG_SKIP_MODE_ENHANCEMENT | 
 |   SKIP_MODE_MVP_LIST skip_mvp_candidate_list; | 
 | #endif | 
 |   // TODO(Ravi/Remya): Reduce the buffer size of global_mvs | 
 |   //! \copydoc MB_MODE_INFO_EXT::global_mvs | 
 |   int_mv global_mvs[INTER_REFS_PER_FRAME]; | 
 |   //! \copydoc MB_MODE_INFO_EXT::mode_context | 
 |   int16_t mode_context; | 
 |   //! Offset of current coding block's coeff buffer relative to the sb. | 
 |   int cb_offset[MAX_MB_PLANE]; | 
 |  | 
 |   //! warp_param_stack is the warp candidate list. | 
 |   WARP_CANDIDATE warp_param_stack[MAX_WARP_REF_CANDIDATES]; | 
 |  | 
 | } MB_MODE_INFO_EXT_FRAME; | 
 |  | 
 | /*! \brief Txfm search results for a partition | 
 |  */ | 
 | typedef struct { | 
 |   //! Txfm size used if the current mode is intra mode. | 
 |   TX_SIZE tx_size; | 
 |   //! Txfm sizes used if the current mode is inter mode. | 
 |   TX_SIZE inter_tx_size[INTER_TX_SIZE_BUF_LEN]; | 
 | #if CONFIG_NEW_TX_PARTITION | 
 |   //! Txfm partitions used if the current mode is inter mode. | 
 |   TX_PARTITION_TYPE tx_partition_type[INTER_TX_SIZE_BUF_LEN]; | 
 | #endif  // CONFIG_NEW_TX_PARTITION | 
 |   //! Map showing which txfm block skips the txfm process. | 
 |   uint8_t blk_skip[MAX_MIB_SIZE * MAX_MIB_SIZE]; | 
 |   //! Map showing the txfm types for each blcok. | 
 |   TX_TYPE tx_type_map[MAX_MIB_SIZE * MAX_MIB_SIZE]; | 
 |   //! Map showing the cctx types for each block. | 
 |   CctxType cctx_type_map[MAX_MIB_SIZE * MAX_MIB_SIZE]; | 
 |   //! Rd_stats for the whole partition block. | 
 |   RD_STATS rd_stats; | 
 |   //! Hash value of the current record. | 
 |   uint32_t hash_value; | 
 | } MB_RD_INFO; | 
 |  | 
 | /*! \brief Hash records of txfm search results for the partition block. | 
 |  */ | 
 | typedef struct { | 
 |   //! Circular buffer that stores the txfm search results. | 
 |   MB_RD_INFO tx_rd_info[RD_RECORD_BUFFER_LEN];  // Circular buffer. | 
 |   //! Index to insert the newest \ref TXB_RD_INFO. | 
 |   int index_start; | 
 |   //! Number of info stored in this record. | 
 |   int num; | 
 |   //! Hash function | 
 |   CRC32C crc_calculator; | 
 | } MB_RD_RECORD; | 
 |  | 
 | /*! \brief Txfm search results for a tx block. | 
 |  */ | 
 | typedef struct { | 
 |   //! Distortion after the txfm process | 
 |   int64_t dist; | 
 |   //! SSE of the prediction before the txfm process | 
 |   int64_t sse; | 
 |   //! Rate used to encode the txfm. | 
 |   int rate; | 
 |   //! Location of the end of non-zero entries. | 
 |   uint16_t eob; | 
 |   //! Location of the first of non-zero entries. | 
 |   uint16_t bob; | 
 |   //! Transform type used on the current block. | 
 |   TX_TYPE tx_type; | 
 |   //! Unknown usage | 
 |   uint16_t entropy_context; | 
 |   //! Context used to code the coefficients. | 
 |   uint8_t txb_entropy_ctx; | 
 |   //! Whether the current info block contains  valid info | 
 |   uint8_t valid; | 
 |   //! Unused | 
 |   uint8_t fast; | 
 |   //! Whether trellis optimization is done. | 
 |   uint8_t perform_block_coeff_opt; | 
 | } TXB_RD_INFO; | 
 |  | 
 | /*! \brief Hash records of txfm search result for each tx block. | 
 |  */ | 
 | typedef struct { | 
 |   //! The hash values. | 
 |   uint32_t hash_vals[TX_SIZE_RD_RECORD_BUFFER_LEN]; | 
 |   //! The txfm search results | 
 |   TXB_RD_INFO tx_rd_info[TX_SIZE_RD_RECORD_BUFFER_LEN]; | 
 |   //! Index to insert the newest \ref TXB_RD_INFO. | 
 |   int index_start; | 
 |   //! Number of info stored in this record. | 
 |   int num; | 
 | } TXB_RD_RECORD; | 
 |  | 
 | //! Number of compound rd stats | 
 | #define MAX_COMP_RD_STATS 64 | 
 | /*! \brief Rdcost stats in compound mode. | 
 |  */ | 
 | typedef struct { | 
 |   //! Rate of the compound modes. | 
 |   int32_t rate[COMPOUND_TYPES]; | 
 |   //! Distortion of the compound modes. | 
 |   int64_t dist[COMPOUND_TYPES]; | 
 |   //! Estimated rate of the compound modes. | 
 |   int32_t model_rate[COMPOUND_TYPES]; | 
 |   //! Estimated distortion of the compound modes. | 
 |   int64_t model_dist[COMPOUND_TYPES]; | 
 |   //! Rate need to send the mask type. | 
 |   int comp_rs2[COMPOUND_TYPES]; | 
 |   //! Motion vector for each predictor. | 
 |   int_mv mv[2]; | 
 |   //! Ref frame for each predictor. | 
 |   MV_REFERENCE_FRAME ref_frames[2]; | 
 |   //! Current prediction mode. | 
 |   PREDICTION_MODE mode; | 
 |   //! Current interpolation filter. | 
 |   InterpFilter interp_fltr; | 
 |   //! Refmv index in the drl. | 
 | #if CONFIG_SEP_COMP_DRL | 
 |   int ref_mv_idx[2]; | 
 | #else | 
 |   int ref_mv_idx; | 
 | #endif  // CONFIG_SEP_COMP_DRL | 
 |   //! Whether the predictors are GLOBALMV. | 
 |   int is_global[2]; | 
 |   //! Current parameters for interinter mode. | 
 |   INTERINTER_COMPOUND_DATA interinter_comp; | 
 |   //! Index for compound weighted prediction parameters. | 
 |   int cwp_idx; | 
 | } COMP_RD_STATS; | 
 |  | 
 | /*! \brief Contains buffers used to speed up rdopt for obmc. | 
 |  * | 
 |  * See the comments for calc_target_weighted_pred for details. | 
 |  */ | 
 | typedef struct { | 
 |   /*! \brief A new source weighted with the above and left predictors. | 
 |    * | 
 |    * Used to efficiently construct multiple obmc predictors during rdopt. | 
 |    */ | 
 |   int32_t *wsrc; | 
 |   /*! \brief A new mask constructed from the original horz/vert mask. | 
 |    * | 
 |    * \copydetails wsrc | 
 |    */ | 
 |   int32_t *mask; | 
 |   /*! \brief Prediction from the up predictor. | 
 |    * | 
 |    * Used to build the obmc predictor. | 
 |    */ | 
 |   uint16_t *above_pred; | 
 |   /*! \brief Prediction from the up predictor. | 
 |    * | 
 |    * \copydetails above_pred | 
 |    */ | 
 |   uint16_t *left_pred; | 
 | } OBMCBuffer; | 
 |  | 
 | /*! \brief Contains color maps used in palette mode. | 
 |  */ | 
 | typedef struct { | 
 |   //! The best color map found. | 
 |   uint8_t best_palette_color_map[MAX_PALETTE_SQUARE]; | 
 |   //! A temporary buffer used for k-means clustering. | 
 |   int kmeans_data_buf[2 * MAX_PALETTE_SQUARE]; | 
 | } PALETTE_BUFFER; | 
 |  | 
 | /*! \brief Contains buffers used by av1_compound_type_rd() | 
 |  * | 
 |  * For sizes and alignment of these arrays, refer to | 
 |  * alloc_compound_type_rd_buffers() function. | 
 |  */ | 
 | typedef struct { | 
 |   //! First prediction. | 
 |   uint16_t *pred0; | 
 |   //! Second prediction. | 
 |   uint16_t *pred1; | 
 |   //! Source - first prediction. | 
 |   int16_t *residual1; | 
 |   //! Second prediction - first prediction. | 
 |   int16_t *diff10; | 
 |   //! Backup of the best segmentation mask. | 
 |   uint8_t *tmp_best_mask_buf; | 
 | } CompoundTypeRdBuffers; | 
 |  | 
 | /*!\cond */ | 
 | /*! \brief MV cost types | 
 |  */ | 
 | enum { | 
 |   MV_COST_ENTROPY,    // Use the entropy rate of the mv as the cost | 
 |   MV_COST_L1_LOWRES,  // Use the l1 norm of the mv as the cost (<480p) | 
 |   MV_COST_L1_MIDRES,  // Use the l1 norm of the mv as the cost (>=480p) | 
 |   MV_COST_L1_HDRES,   // Use the l1 norm of the mv as the cost (>=720p) | 
 |   MV_COST_NONE        // Use 0 as as cost irrespective of the current mv | 
 | } UENUM1BYTE(MV_COST_TYPE); | 
 | /*!\endcond */ | 
 |  | 
 | #if CONFIG_EXT_RECUR_PARTITIONS | 
 | /*! \brief max length of start Mv list | 
 |  */ | 
 | #define kSMSMaxStartMVs 1 | 
 |  | 
 | /*! \brief Contains data for simple motion | 
 |  */ | 
 | typedef struct SimpleMotionData { | 
 |   MV mv_ref;                               /*!< mv reference */ | 
 |   MV fullmv;                               /*!< mv full */ | 
 |   MV submv;                                /*!< mv subpel */ | 
 |   unsigned int sse;                        /*!< sse */ | 
 |   unsigned int var;                        /*!< variance */ | 
 |   int64_t dist;                            /*!< distortion */ | 
 |   int rate;                                /*!< rate */ | 
 |   int64_t rdcost;                          /*!< rdcost */ | 
 |   int valid;                               /*!< whether valid */ | 
 |   BLOCK_SIZE bsize;                        /*!< blocksize */ | 
 |   int mi_row;                              /*!< row position in mi units */ | 
 |   int mi_col;                              /*!< col position in mi units */ | 
 |   MV_COST_TYPE mv_cost_type;               /*!< mv cost type */ | 
 |   int sadpb;                               /*!< sad per bit */ | 
 |   int errorperbit;                         /*!< error per bit */ | 
 |   MV start_mv_list[kSMSMaxStartMVs];       /*!< start mv list */ | 
 |   int num_start_mvs;                       /*!< number of start mvs */ | 
 |   int has_prev_partition;                  /*!< has previous partition */ | 
 |   PARTITION_TYPE prev_partition;           /*!< previous partition */ | 
 |   struct PICK_MODE_CONTEXT *mode_cache[1]; /*!< mode cache */ | 
 |   struct SIMPLE_MOTION_DATA_TREE *old_sms; /*!< old sms */ | 
 |  | 
 |   int ref_frame; /*!< ref frame used */ | 
 |   int rdmult;    /*!< rd_mult for the block */ | 
 | } SimpleMotionData; | 
 |  | 
 | /*!\cond */ | 
 | #define BLOCK_256_COUNT 1 | 
 | #define BLOCK_128_COUNT 3 | 
 | #define BLOCK_64_COUNT 7 | 
 | #define BLOCK_32_COUNT 31 | 
 | #define BLOCK_16_COUNT 63 | 
 | #define BLOCK_8_COUNT 64 | 
 | #define BLOCK_4_COUNT 64 | 
 |  | 
 | #define MAKE_SM_DATA_BUF(width, height) \ | 
 |   SimpleMotionData                      \ | 
 |       b_##width##x##height[BLOCK_##width##_COUNT * BLOCK_##height##_COUNT] | 
 | /*!\endcond */ | 
 |  | 
 | /*! \brief Simple motion data buffers | 
 |  */ | 
 | typedef struct SimpleMotionDataBufs { | 
 |   /*!\cond */ | 
 |   // Square blocks | 
 |   MAKE_SM_DATA_BUF(256, 256); | 
 |   MAKE_SM_DATA_BUF(128, 128); | 
 |   MAKE_SM_DATA_BUF(64, 64); | 
 |   MAKE_SM_DATA_BUF(32, 32); | 
 |   MAKE_SM_DATA_BUF(16, 16); | 
 |   MAKE_SM_DATA_BUF(8, 8); | 
 |   MAKE_SM_DATA_BUF(4, 4); | 
 |  | 
 |   // 1:2 blocks | 
 |   MAKE_SM_DATA_BUF(128, 256); | 
 |   MAKE_SM_DATA_BUF(64, 128); | 
 |   MAKE_SM_DATA_BUF(32, 64); | 
 |   MAKE_SM_DATA_BUF(16, 32); | 
 |   MAKE_SM_DATA_BUF(8, 16); | 
 |   MAKE_SM_DATA_BUF(4, 8); | 
 |  | 
 |   // 2:1 blocks | 
 |   MAKE_SM_DATA_BUF(256, 128); | 
 |   MAKE_SM_DATA_BUF(128, 64); | 
 |   MAKE_SM_DATA_BUF(64, 32); | 
 |   MAKE_SM_DATA_BUF(32, 16); | 
 |   MAKE_SM_DATA_BUF(16, 8); | 
 |   MAKE_SM_DATA_BUF(8, 4); | 
 |  | 
 |   // 1:4 blocks | 
 |   MAKE_SM_DATA_BUF(16, 64); | 
 |   MAKE_SM_DATA_BUF(8, 32); | 
 |   MAKE_SM_DATA_BUF(4, 16); | 
 |  | 
 |   // 4:1 blocks | 
 |   MAKE_SM_DATA_BUF(64, 16); | 
 |   MAKE_SM_DATA_BUF(32, 8); | 
 |   MAKE_SM_DATA_BUF(16, 4); | 
 |  | 
 |   // 1:8 blocks | 
 |   MAKE_SM_DATA_BUF(8, 64); | 
 |   MAKE_SM_DATA_BUF(4, 32); | 
 |  | 
 |   // 8:1 blocks | 
 |   MAKE_SM_DATA_BUF(64, 8); | 
 |   MAKE_SM_DATA_BUF(32, 4); | 
 |  | 
 |   // 1:16 blocks | 
 |   MAKE_SM_DATA_BUF(4, 64); | 
 |  | 
 |   // 16:1 blocks | 
 |   MAKE_SM_DATA_BUF(64, 4); | 
 |   /*!\endcond */ | 
 | } SimpleMotionDataBufs; | 
 |  | 
 | #undef MAKE_SM_DATA_BUF | 
 | #endif  // CONFIG_EXT_RECUR_PARTITIONS | 
 |  | 
 | /*! \brief Holds some parameters related to partitioning schemes in AV1. | 
 |  */ | 
 | // TODO(chiyotsai@google.com): Consolidate this with SIMPLE_MOTION_DATA_TREE | 
 | typedef struct { | 
 |   // The following 4 parameters are used for cnn-based partitioning on intra | 
 |   // frame. | 
 |   /*! \brief Current index on the partition block quad tree. | 
 |    * | 
 |    * Used to index into the cnn buffer for partition decision. | 
 |    */ | 
 |   int quad_tree_idx; | 
 |   //! Whether the CNN buffer contains valid output. | 
 |   int cnn_output_valid; | 
 |   //! A buffer used by our segmentation CNN for intra-frame partitioning. | 
 |   float cnn_buffer[CNN_OUT_BUF_SIZE]; | 
 |   //! log of the quantization parameter of the ancestor BLOCK_64X64. | 
 |   float log_q; | 
 |  | 
 |   /*! \brief Variance of the subblocks in the superblock. | 
 |    * | 
 |    * This is used by rt mode for variance based partitioning. | 
 |    * The indices corresponds to the following block sizes: | 
 |    * -   0    - 128x128 | 
 |    * -  1-2   - 128x64 | 
 |    * -  3-4   -  64x128 | 
 |    * -  5-8   -  64x64 | 
 |    * -  9-16  -  64x32 | 
 |    * - 17-24  -  32x64 | 
 |    * - 25-40  -  32x32 | 
 |    * - 41-104 -  16x16 | 
 |    */ | 
 |   uint8_t variance_low[105]; | 
 | } PartitionSearchInfo; | 
 |  | 
 | /*! \brief Defines the parameters used to perform txfm search. | 
 |  * | 
 |  * For the most part, this determines how various speed features are used. | 
 |  */ | 
 | typedef struct { | 
 |   /*! \brief Whether to limit the intra txfm search type to the default txfm. | 
 |    * | 
 |    * This could either be a result of either sequence parameter or speed | 
 |    * features. | 
 |    */ | 
 |   int use_default_intra_tx_type; | 
 |   /*! \brief Whether to limit the inter txfm search type to the default txfm. | 
 |    * | 
 |    * \copydetails use_default_intra_tx_type | 
 |    */ | 
 |   int use_default_inter_tx_type; | 
 |  | 
 |   //! Whether to prune 2d transforms based on 1d transform results. | 
 |   int prune_2d_txfm_mode; | 
 |  | 
 |   /*! \brief Variable from \ref WinnerModeParams based on current eval mode. | 
 |    * | 
 |    * See the documentation for \ref WinnerModeParams for more detail. | 
 |    */ | 
 |   unsigned int coeff_opt_dist_threshold; | 
 |   //! \copydoc coeff_opt_dist_threshold | 
 |   unsigned int coeff_opt_satd_threshold; | 
 |   //! \copydoc coeff_opt_dist_threshold | 
 |   unsigned int tx_domain_dist_threshold; | 
 |   //! \copydoc coeff_opt_dist_threshold | 
 |   TX_SIZE_SEARCH_METHOD tx_size_search_method; | 
 |   //! \copydoc coeff_opt_dist_threshold | 
 |   unsigned int use_transform_domain_distortion; | 
 |   //! \copydoc coeff_opt_dist_threshold | 
 |   unsigned int skip_txfm_level; | 
 |  | 
 |   /*! \brief How to search for the optimal tx_size | 
 |    * | 
 |    * If ONLY_4X4, use TX_4X4; if TX_MODE_LARGEST, use the largest tx_size for | 
 |    * the current partition block; if TX_MODE_SELECT, search through the whole | 
 |    * tree. | 
 |    * | 
 |    * \attention | 
 |    * Although this looks suspicious similar to a bitstream element, this | 
 |    * tx_mode_search_type is only used internally by the encoder, and is *not* | 
 |    * written to the bitstream. It determines what kind of tx_mode would be | 
 |    * searched. For example, we might set it to TX_MODE_LARGEST to find a good | 
 |    * candidate, then code it as TX_MODE_SELECT. | 
 |    */ | 
 |   TX_MODE tx_mode_search_type; | 
 |  | 
 |   /*! | 
 |    * Flag to enable/disable DC block prediction. | 
 |    */ | 
 |   unsigned int predict_dc_level; | 
 | } TxfmSearchParams; | 
 |  | 
 | /*!\cond */ | 
 | #define MAX_NUM_8X8_TXBS ((MAX_MIB_SIZE >> 1) * (MAX_MIB_SIZE >> 1)) | 
 | #define MAX_NUM_16X16_TXBS ((MAX_MIB_SIZE >> 2) * (MAX_MIB_SIZE >> 2)) | 
 | #define MAX_NUM_32X32_TXBS ((MAX_MIB_SIZE >> 3) * (MAX_MIB_SIZE >> 3)) | 
 | #define MAX_NUM_64X64_TXBS ((MAX_MIB_SIZE >> 4) * (MAX_MIB_SIZE >> 4)) | 
 | /*!\endcond */ | 
 |  | 
 | /*! \brief Stores various encoding/search decisions related to txfm search. | 
 |  * | 
 |  * This struct contains a cache of previous txfm results, and some buffers for | 
 |  * the current txfm decision. | 
 |  */ | 
 | typedef struct { | 
 |   //! Whether to skip transform and quantization on a partition block level. | 
 |   int skip_txfm; | 
 |  | 
 |   /*! \brief Whether to skip transform and quantization on a txfm block level. | 
 |    * | 
 |    * Skips transform and quantization on a transform block level inside the | 
 |    * current partition block. For each plane, when we are skipping transform and | 
 |    * quantization, the last bit will be set to 1. | 
 |    */ | 
 |   uint8_t blk_skip[MAX_MB_PLANE][MAX_MIB_SIZE * MAX_MIB_SIZE]; | 
 |  | 
 |   /*! \brief Transform types inside the partition block | 
 |    * | 
 |    * Keeps a record of what kind of transform to use for each of the transform | 
 |    * block inside the partition block. | 
 |    * \attention The buffer here is *never* directly used. Instead, this just | 
 |    * allocates the memory for MACROBLOCKD::tx_type_map during rdopt on the | 
 |    * partition block. So if we need to save memory, we could move the allocation | 
 |    * to pick_sb_mode instead. | 
 |    * If secondary transform in enabled (IST) each element of the array | 
 |    * stores both primary and secondary transform types as shown below: Bits 4~5 | 
 |    * of each element stores secondary tx_type Bits 0~3 of each element stores | 
 |    * primary tx_type | 
 |    */ | 
 |   TX_TYPE tx_type_map_[MAX_MIB_SIZE * MAX_MIB_SIZE]; | 
 |   //! \brief CCTX types inside the partition block. | 
 |   CctxType cctx_type_map_[MAX_MIB_SIZE * MAX_MIB_SIZE]; | 
 |  | 
 |   /** \name Txfm hash records | 
 |    * Hash records of the transform search results based on the residue. There | 
 |    * are two main types here: | 
 |    * - MB_RD_RECORD: records a whole *partition block*'s inter-mode txfm result. | 
 |    *   Since this operates on the partition block level, this can give us a | 
 |    *   whole txfm partition tree. | 
 |    * - TXB_RD_RECORD: records a txfm search result within a transform blcok | 
 |    *   itself. This operates on txb level only and onlyt appplies to square | 
 |    *   txfms. | 
 |    */ | 
 |   /**@{*/ | 
 |   //! Txfm hash record for the whole coding block. | 
 |   MB_RD_RECORD mb_rd_record; | 
 |  | 
 |   //! Inter mode txfm hash record for TX_8X8 blocks. | 
 |   TXB_RD_RECORD txb_rd_record_8X8[MAX_NUM_8X8_TXBS]; | 
 |   //! Inter mode txfm hash record for TX_16X16 blocks. | 
 |   TXB_RD_RECORD txb_rd_record_16X16[MAX_NUM_16X16_TXBS]; | 
 |   //! Inter mode txfm hash record for TX_32X32 blocks. | 
 |   TXB_RD_RECORD txb_rd_record_32X32[MAX_NUM_32X32_TXBS]; | 
 |   //! Inter mode txfm hash record for TX_64X64 blocks. | 
 |   TXB_RD_RECORD txb_rd_record_64X64[MAX_NUM_64X64_TXBS]; | 
 |   //! Intra mode txfm hash record for square tx blocks. | 
 |   TXB_RD_RECORD txb_rd_record_intra; | 
 |   /**@}*/ | 
 |  | 
 |   /*! \brief Number of txb splits. | 
 |    * | 
 |    * Keep track of how many times we've used split tx partition for transform | 
 |    * blocks. Somewhat misleadingly, this parameter doesn't actually keep track | 
 |    * of the count of the current block. Instead, it's a cumulative count across | 
 |    * of the whole frame. The main usage is that if txb_split_count is zero, then | 
 |    * we can signal TX_MODE_LARGEST at frame level. | 
 |    */ | 
 |   // TODO(chiyotsai@google.com): Move this to a more appropriate location such | 
 |   // as ThreadData. | 
 |   unsigned int txb_split_count; | 
 | #if CONFIG_SPEED_STATS | 
 |   //! For debugging. Used to check how many txfm searches we are doing. | 
 |   unsigned int tx_search_count; | 
 | #endif  // CONFIG_SPEED_STATS | 
 | } TxfmSearchInfo; | 
 | #undef MAX_NUM_8X8_TXBS | 
 | #undef MAX_NUM_16X16_TXBS | 
 | #undef MAX_NUM_32X32_TXBS | 
 | #undef MAX_NUM_64X64_TXBS | 
 |  | 
 | /*! \brief Holds the entropy costs for various modes sent to the bitstream. | 
 |  * | 
 |  * \attention This does not include the costs for mv and transformed | 
 |  * coefficients. | 
 |  */ | 
 | typedef struct { | 
 |   /***************************************************************************** | 
 |    * \name Partition Costs | 
 |    ****************************************************************************/ | 
 |   /**@{*/ | 
 | #if CONFIG_EXTENDED_SDP | 
 |   //! Cost for coding the region type. | 
 |   int region_type_cost[INTER_SDP_BSIZE_GROUP][REGION_TYPES]; | 
 | #endif  // CONFIG_EXTENDED_SDP | 
 | #if CONFIG_EXT_RECUR_PARTITIONS | 
 |   /*! Cost for sending split token. */ | 
 |   int do_split_cost[PARTITION_STRUCTURE_NUM][PARTITION_CONTEXTS][2]; | 
 |   /*! Cost for sending square split token. */ | 
 |   int do_square_split_cost[PARTITION_STRUCTURE_NUM][SQUARE_SPLIT_CONTEXTS][2]; | 
 |   /*! Cost for sending rectangular type token. */ | 
 |   int rect_type_cost[PARTITION_STRUCTURE_NUM][PARTITION_CONTEXTS][2]; | 
 |   /*! Cost for sending do_ext_partition token. */ | 
 |   int do_ext_partition_cost[PARTITION_STRUCTURE_NUM][NUM_RECT_PARTS] | 
 |                            [PARTITION_CONTEXTS][2]; | 
 |   /*! Cost for sending do_uneven_4way_partition token. */ | 
 |   int do_uneven_4way_partition_cost[PARTITION_STRUCTURE_NUM][NUM_RECT_PARTS] | 
 |                                    [PARTITION_CONTEXTS][2]; | 
 |   /*! Cost for sending uneven_4way_partition_type token. */ | 
 |   int uneven_4way_partition_type_cost[PARTITION_STRUCTURE_NUM][NUM_RECT_PARTS] | 
 |                                      [PARTITION_CONTEXTS] | 
 |                                      [NUM_UNEVEN_4WAY_PARTS]; | 
 |   //! Cost for coding the partition. | 
 |   int partition_cost[PARTITION_STRUCTURE_NUM][PARTITION_CONTEXTS] | 
 |                     [ALL_PARTITION_TYPES]; | 
 | #else | 
 |   //! Cost for coding the partition. | 
 |   int partition_cost[PARTITION_STRUCTURE_NUM][PARTITION_CONTEXTS] | 
 |                     [EXT_PARTITION_TYPES]; | 
 | #endif  // CONFIG_EXT_RECUR_PARTITIONS | 
 |   /**@}*/ | 
 |  | 
 |   /***************************************************************************** | 
 |    * \name Intra Costs: General | 
 |    ****************************************************************************/ | 
 |   /**@{*/ | 
 |   //! Luma mode cost for inter frame. | 
 |   int mbmode_cost[BLOCK_SIZE_GROUPS][INTRA_MODES]; | 
 |   //! Luma mode cost for intra frame. | 
 |   int y_mode_costs[INTRA_MODES][INTRA_MODES][INTRA_MODES]; | 
 | #if !CONFIG_AIMC | 
 |   //! Chroma mode cost | 
 |   int intra_uv_mode_cost[CFL_ALLOWED_TYPES][INTRA_MODES][UV_INTRA_MODES]; | 
 | #endif  // !CONFIG_AIMC | 
 |   //! filter_intra_cost | 
 | #if CONFIG_D149_CTX_MODELING_OPT | 
 |   int filter_intra_cost[2]; | 
 | #else | 
 |   int filter_intra_cost[BLOCK_SIZES_ALL][2]; | 
 | #endif  // CONFIG_D149_CTX_MODELING_OPT | 
 |   //! filter_intra_mode_cost | 
 |   int filter_intra_mode_cost[FILTER_INTRA_MODES]; | 
 |   //! angle_delta_cost | 
 |   int angle_delta_cost[PARTITION_STRUCTURE_NUM][DIRECTIONAL_MODES] | 
 |                       [2 * MAX_ANGLE_DELTA + 1]; | 
 |  | 
 |   //! mrl_index_cost | 
 | #if CONFIG_IMPROVED_INTRA_DIR_PRED | 
 |   int mrl_index_cost[MRL_INDEX_CONTEXTS][MRL_LINE_NUMBER]; | 
 | #else | 
 |   int mrl_index_cost[MRL_LINE_NUMBER]; | 
 | #endif  // CONFIG_IMPROVED_INTRA_DIR_PRED | 
 |   //! Cost of signaling the forward skip coding mode | 
 |   int fsc_cost[FSC_MODE_CONTEXTS][FSC_BSIZE_CONTEXTS][FSC_MODES]; | 
 | #if CONFIG_ENABLE_MHCCP | 
 |   //! Cost of signaling the cfl mode | 
 |   int cfl_index_cost[CFL_TYPE_COUNT - 1]; | 
 | #else | 
 |   int cfl_index_cost[CFL_TYPE_COUNT]; | 
 | #endif  // CONFIG_ENABLE_MHCCP | 
 | #if CONFIG_ENABLE_MHCCP | 
 |   //! cost of signaling filter direction | 
 |   int filter_dir_cost[MHCCP_CONTEXT_GROUP_SIZE][MHCCP_MODE_NUM]; | 
 | #endif  // CONFIG_ENABLE_MHCCP | 
 |  | 
 | #if CONFIG_AIMC | 
 |   //! y primary flag cost | 
 |   int y_primary_flag_cost[INTRA_MODE_SETS]; | 
 |   //! y first mode cost | 
 |   int y_first_mode_costs[Y_MODE_CONTEXTS][FIRST_MODE_COUNT]; | 
 |   //! y second mode cost | 
 |   int y_second_mode_costs[Y_MODE_CONTEXTS][SECOND_MODE_COUNT]; | 
 |   //! uv mode cost | 
 |   int intra_uv_mode_cost[UV_MODE_CONTEXTS][UV_INTRA_MODES - 1]; | 
 |   //! CFL mode cost | 
 |   int cfl_mode_cost[CFL_CONTEXTS][2]; | 
 | #endif  // CONFIG_AIMC | 
 |  | 
 |   //! Cost of signaling secondary transform index | 
 |   int stx_flag_cost[2][TX_SIZES][STX_TYPES]; | 
 | #if CONFIG_IST_SET_FLAG | 
 |   //! Cost of signaling secondary transform set index | 
 | #if CONFIG_INTRA_TX_IST_PARSE | 
 |   int most_probable_stx_set_flag_cost[IST_DIR_SIZE]; | 
 | #else | 
 |   int stx_set_flag_cost[IST_DIR_SIZE][IST_DIR_SIZE]; | 
 | #endif  // CONFIG_INTRA_TX_IST_PARSE | 
 | #if CONFIG_IST_INTER_MULTISET | 
 |   int inter_stx_set_flag_cost[2]; | 
 | #endif | 
 | #endif  // CONFIG_IST_SET_FLAG | 
 |  | 
 |   //! Rate rate associated with each alpha codeword | 
 |   int cfl_cost[CFL_JOINT_SIGNS][CFL_PRED_PLANES][CFL_ALPHABET_SIZE]; | 
 |   /**@}*/ | 
 |  | 
 |   /***************************************************************************** | 
 |    * \name Intra Costs: Screen Contents | 
 |    ****************************************************************************/ | 
 |   /**@{*/ | 
 |   //! intrabc_cost | 
 | #if CONFIG_NEW_CONTEXT_MODELING | 
 |   int intrabc_cost[INTRABC_CONTEXTS][2]; | 
 | #else | 
 |   int intrabc_cost[2]; | 
 | #endif  // CONFIG_NEW_CONTEXT_MODELING | 
 | #if CONFIG_IBC_BV_IMPROVEMENT | 
 |   //! intrabc_mode_cost | 
 |   int intrabc_mode_cost[2]; | 
 |   //! intrabc_drl_idx_cost | 
 |   int intrabc_drl_idx_cost[MAX_REF_BV_STACK_SIZE - 1][2]; | 
 | #endif  // CONFIG_IBC_BV_IMPROVEMENT | 
 | #if CONFIG_MORPH_PRED | 
 |   //! cost for the new prediction mode | 
 |   int morph_pred_cost[3][2]; | 
 | #endif  // CONFIG_MORPH_PRED | 
 |  | 
 |   //! palette_y_size_cost | 
 |   int palette_y_size_cost[PALATTE_BSIZE_CTXS][PALETTE_SIZES]; | 
 |   //! palette_uv_size_cost | 
 |   int palette_uv_size_cost[PALATTE_BSIZE_CTXS][PALETTE_SIZES]; | 
 |   //! palette_y_color_cost | 
 |   int palette_y_color_cost[PALETTE_SIZES][PALETTE_COLOR_INDEX_CONTEXTS] | 
 |                           [PALETTE_COLORS]; | 
 |   //! palette_uv_color_cost | 
 |   int palette_uv_color_cost[PALETTE_SIZES][PALETTE_COLOR_INDEX_CONTEXTS] | 
 |                            [PALETTE_COLORS]; | 
 |   //! palette_y_mode_cost | 
 |   int palette_y_mode_cost[PALATTE_BSIZE_CTXS][PALETTE_Y_MODE_CONTEXTS][2]; | 
 |   //! palette_uv_mode_cost | 
 |   int palette_uv_mode_cost[PALETTE_UV_MODE_CONTEXTS][2]; | 
 | #if CONFIG_PALETTE_IMPROVEMENTS | 
 | #if CONFIG_PALETTE_LINE_COPY | 
 |   //! palette_direction_cost | 
 |   int palette_direction_cost[2]; | 
 |   //! palette_y_row_flag_cost | 
 |   int palette_y_row_flag_cost[PALETTE_ROW_FLAG_CONTEXTS][3]; | 
 |   //! palette_uv_row_flag_cost | 
 |   int palette_uv_row_flag_cost[PALETTE_ROW_FLAG_CONTEXTS][3]; | 
 | #else | 
 |   //! palette_y_row_flag_cost | 
 |   int palette_y_row_flag_cost[PALETTE_ROW_FLAG_CONTEXTS][2]; | 
 |   //! palette_uv_row_flag_cost | 
 |   int palette_uv_row_flag_cost[PALETTE_ROW_FLAG_CONTEXTS][2]; | 
 | #endif  // CONFIG_PALETTE_LINE_COPY | 
 | #endif  // CONFIG_PALETTE_IMPROVEMENTS | 
 |   /**@}*/ | 
 |  | 
 |   /***************************************************************************** | 
 |    * \name Inter Costs: MV Modes | 
 |    ****************************************************************************/ | 
 |   /**@{*/ | 
 |   //! skip_mode_cost | 
 |   int skip_mode_cost[SKIP_MODE_CONTEXTS][2]; | 
 |   //! inter single mode cost | 
 |   int inter_single_mode_cost[INTER_SINGLE_MODE_CONTEXTS][INTER_SINGLE_MODES]; | 
 |  | 
 |   //! inter warpmv mode cost | 
 |   int inter_warp_mode_cost[WARPMV_MODE_CONTEXT][2]; | 
 |  | 
 |   //! drl_mode_cost | 
 |   int drl_mode_cost[3][DRL_MODE_CONTEXTS][2]; | 
 |   /*! Costs for coding the most probable mv resolution. */ | 
 |   int pb_block_mv_mpp_flag_costs[NUM_MV_PREC_MPP_CONTEXT][2]; | 
 |  | 
 |   /*! Costs for coding the mv resolution. */ | 
 |   int pb_block_mv_precision_costs[MV_PREC_DOWN_CONTEXTS][FLEX_MV_COSTS_SIZE] | 
 |                                  [NUM_MV_PRECISIONS]; | 
 | #if CONFIG_SKIP_MODE_ENHANCEMENT || CONFIG_OPTIMIZE_CTX_TIP_WARP | 
 |   //! skip_drl_mode_cost | 
 |   int skip_drl_mode_cost[3][2]; | 
 | #endif  // CONFIG_SKIP_MODE_ENHANCEMENT || CONFIG_OPTIMIZE_CTX_TIP_WARP | 
 |   /**@}*/ | 
 |  | 
 |   /***************************************************************************** | 
 |    * \name Inter Costs: Ref Frame Types | 
 |    ****************************************************************************/ | 
 |   /**@{*/ | 
 |   //! single_ref_cost | 
 |   int single_ref_cost[REF_CONTEXTS][INTER_REFS_PER_FRAME - 1][2]; | 
 | #if CONFIG_SAME_REF_COMPOUND | 
 |   //! comp_ref0_cost | 
 |   int comp_ref0_cost[REF_CONTEXTS][INTER_REFS_PER_FRAME][2]; | 
 |   //! comp_ref1_cost | 
 |   int comp_ref1_cost[REF_CONTEXTS][COMPREF_BIT_TYPES][INTER_REFS_PER_FRAME][2]; | 
 | #else | 
 |   //! comp_ref0_cost | 
 |   int comp_ref0_cost[REF_CONTEXTS][INTER_REFS_PER_FRAME - 2][2]; | 
 |   //! comp_ref1_cost | 
 |   int comp_ref1_cost[REF_CONTEXTS][COMPREF_BIT_TYPES][INTER_REFS_PER_FRAME - 2] | 
 |                     [2]; | 
 | #endif  // CONFIG_SAME_REF_COMPOUND | 
 |   //! comp_inter_cost | 
 |   int comp_inter_cost[COMP_INTER_CONTEXTS][2]; | 
 |   //! tip_cost | 
 |   int tip_cost[TIP_CONTEXTS][2]; | 
 | #if CONFIG_OPTIMIZE_CTX_TIP_WARP | 
 |   //! tip_mode_cost | 
 |   int tip_mode_cost[TIP_PRED_MODES]; | 
 | #endif  // CONFIG_OPTIMIZE_CTX_TIP_WARP | 
 |   /**@}*/ | 
 |  | 
 |   /***************************************************************************** | 
 |    * \name Inter Costs: Compound Types | 
 |    ****************************************************************************/ | 
 |   /**@{*/ | 
 |   //! intra_inter_cost | 
 | #if CONFIG_CONTEXT_DERIVATION && !CONFIG_SKIP_TXFM_OPT | 
 |   int intra_inter_cost[INTRA_INTER_SKIP_TXFM_CONTEXTS][INTRA_INTER_CONTEXTS][2]; | 
 | #else | 
 |   int intra_inter_cost[INTRA_INTER_CONTEXTS][2]; | 
 | #endif  // CONFIG_CONTEXT_DERIVATION && !CONFIG_SKIP_TXFM_OPT | 
 |  | 
 |   /*! use_optflow_cost */ | 
 |   int use_optflow_cost[INTER_COMPOUND_MODE_CONTEXTS][2]; | 
 |   /*! inter_compound_mode_cost */ | 
 |   int inter_compound_mode_cost[INTER_COMPOUND_MODE_CONTEXTS] | 
 |                               [INTER_COMPOUND_REF_TYPES]; | 
 |  | 
 |   //! cwp_idx_cost for compound weighted prediction | 
 |   int cwp_idx_cost[MAX_CWP_CONTEXTS][MAX_CWP_NUM - 1][2]; | 
 |   //! jmvd_scale_mode_cost for JOINT_NEWMV | 
 |   int jmvd_scale_mode_cost[JOINT_NEWMV_SCALE_FACTOR_CNT]; | 
 |   //! jmvd_scale_mode_cost for JOINT_AMVDNEWMV | 
 |   int jmvd_amvd_scale_mode_cost[JOINT_AMVD_SCALE_FACTOR_CNT]; | 
 |   //! compound_type_cost | 
 | #if CONFIG_D149_CTX_MODELING_OPT | 
 |   int compound_type_cost[MASKED_COMPOUND_TYPES]; | 
 | #else | 
 |   int compound_type_cost[BLOCK_SIZES_ALL][MASKED_COMPOUND_TYPES]; | 
 | #endif  // CONFIG_D149_CTX_MODELING_OPT | 
 |   //! wedge_idx_cost | 
 | #if CONFIG_WEDGE_MOD_EXT | 
 | #if CONFIG_D149_CTX_MODELING_OPT | 
 |   //! wedge_angle_dir_cost | 
 |   int wedge_angle_dir_cost[2]; | 
 |   //! wedge_angle_0_cost | 
 |   int wedge_angle_0_cost[H_WEDGE_ANGLES]; | 
 |   //! wedge_angle_1_cost | 
 |   int wedge_angle_1_cost[H_WEDGE_ANGLES]; | 
 |   //! wedge_dist_cost | 
 |   int wedge_dist_cost[NUM_WEDGE_DIST]; | 
 |   //! wedge_dist_cost2 | 
 |   int wedge_dist_cost2[NUM_WEDGE_DIST - 1]; | 
 | #else | 
 |   //! wedge_angle_dir_cost | 
 |   int wedge_angle_dir_cost[BLOCK_SIZES_ALL][2]; | 
 |   //! wedge_angle_0_cost | 
 |   int wedge_angle_0_cost[BLOCK_SIZES_ALL][H_WEDGE_ANGLES]; | 
 |   //! wedge_angle_1_cost | 
 |   int wedge_angle_1_cost[BLOCK_SIZES_ALL][H_WEDGE_ANGLES]; | 
 |   //! wedge_dist_cost | 
 |   int wedge_dist_cost[BLOCK_SIZES_ALL][NUM_WEDGE_DIST]; | 
 |   //! wedge_dist_cost2 | 
 |   int wedge_dist_cost2[BLOCK_SIZES_ALL][NUM_WEDGE_DIST - 1]; | 
 | #endif  // CONFIG_D149_CTX_MODELING_OPT | 
 | #else | 
 |   int wedge_idx_cost[BLOCK_SIZES_ALL][16]; | 
 | #endif  // CONFIG_WEDGE_MOD_EXT | 
 |   //! interintra_cost | 
 |   int interintra_cost[BLOCK_SIZE_GROUPS][2]; | 
 |   //! wedge_interintra_cost | 
 | #if CONFIG_D149_CTX_MODELING_OPT | 
 |   int wedge_interintra_cost[2]; | 
 | #else | 
 |   int wedge_interintra_cost[BLOCK_SIZES_ALL][2]; | 
 | #endif  // CONFIG_D149_CTX_MODELING_OPT | 
 |   //! interintra_mode_cost | 
 |   int interintra_mode_cost[BLOCK_SIZE_GROUPS][INTERINTRA_MODES]; | 
 |   /**@}*/ | 
 |  | 
 |   /***************************************************************************** | 
 |    * \name Inter Costs: Compound Masks | 
 |    ****************************************************************************/ | 
 |   /**@{*/ | 
 |   //! comp_group_idx_cost | 
 |   int comp_group_idx_cost[COMP_GROUP_IDX_CONTEXTS][2]; | 
 |   /**@}*/ | 
 |  | 
 |   /***************************************************************************** | 
 |    * \name Inter Costs: Motion Modes/Filters | 
 |    ****************************************************************************/ | 
 |   /**@{*/ | 
 |   //! obmc_cost | 
 | #if CONFIG_D149_CTX_MODELING_OPT | 
 |   int obmc_cost[2]; | 
 | #else | 
 |   int obmc_cost[BLOCK_SIZES_ALL][2]; | 
 | #endif  // CONFIG_D149_CTX_MODELING_OPT | 
 |  | 
 |   //! warped_causal_cost | 
 | #if CONFIG_D149_CTX_MODELING_OPT && !NO_D149_FOR_WARPED_CAUSAL | 
 |   int warped_causal_cost[2]; | 
 | #else | 
 |   int warped_causal_cost[BLOCK_SIZES_ALL][2]; | 
 | #endif  // CONFIG_D149_CTX_MODELING_OPT && !NO_D149_FOR_WARPED_CAUSAL | 
 |   //! warp_delta_cost | 
 | #if CONFIG_D149_CTX_MODELING_OPT | 
 |   int warp_delta_cost[2]; | 
 | #else | 
 |   int warp_delta_cost[BLOCK_SIZES_ALL][2]; | 
 | #endif  // CONFIG_D149_CTX_MODELING_OPT | 
 |  | 
 |   //! warped_causal_warpmv_cost | 
 | #if CONFIG_D149_CTX_MODELING_OPT | 
 |   int warped_causal_warpmv_cost[2]; | 
 | #else | 
 |   int warped_causal_warpmv_cost[BLOCK_SIZES_ALL][2]; | 
 | #endif  // CONFIG_D149_CTX_MODELING_OPT | 
 |  | 
 |   //! warp_delta_param_cost | 
 |   int warp_delta_param_cost[2][WARP_DELTA_NUM_SYMBOLS]; | 
 |   //! warp_ref_idx_cost | 
 |   int warp_ref_idx_cost[3][WARP_REF_CONTEXTS][2]; | 
 |   //! warpmv_with_mvd_flag_cost | 
 | #if CONFIG_D149_CTX_MODELING_OPT | 
 |   int warpmv_with_mvd_flag_cost[2]; | 
 | #else | 
 |   int warpmv_with_mvd_flag_cost[BLOCK_SIZES_ALL][2]; | 
 | #endif  // CONFIG_D149_CTX_MODELING_OPT | 
 |   //! warp_extend_cost | 
 | #if CONFIG_OPTIMIZE_CTX_TIP_WARP | 
 |   int warp_extend_cost[WARP_EXTEND_CTX][2]; | 
 | #else | 
 |   int warp_extend_cost[WARP_EXTEND_CTXS1][WARP_EXTEND_CTXS2][2]; | 
 | #endif  // CONFIG_OPTIMIZE_CTX_TIP_WARP | 
 |  | 
 | #if CONFIG_REFINEMV | 
 |   //! refinemv_flag_cost | 
 |   int refinemv_flag_cost[NUM_REFINEMV_CTX][REFINEMV_NUM_MODES]; | 
 | #endif  // CONFIG_REFINEMV | 
 | #if CONFIG_BAWP | 
 |   //! bawp flag cost | 
 | #if CONFIG_BAWP_CHROMA | 
 |   int bawp_flg_cost[2][2]; | 
 | #else | 
 |   int bawp_flg_cost[2]; | 
 | #endif  // CONFIG_BAWP_CHROMA | 
 | #if CONFIG_EXPLICIT_BAWP | 
 |   //! Bawp type flag cost | 
 |   int explict_bawp_cost[BAWP_SCALES_CTX_COUNT][2]; | 
 |   //! Explicit bawp scaling factor cost | 
 |   int explict_bawp_scale_cost[EXPLICIT_BAWP_SCALE_CNT]; | 
 | #endif  // CONFIG_EXPLICIT_BAWP | 
 | #endif | 
 |   //! switchable_interp_costs | 
 |   int switchable_interp_costs[SWITCHABLE_FILTER_CONTEXTS][SWITCHABLE_FILTERS]; | 
 |   /**@}*/ | 
 |  | 
 |   /***************************************************************************** | 
 |    * \name Txfm Mode Costs | 
 |    ****************************************************************************/ | 
 |   /**@{*/ | 
 |   //! skip_txfm_cost | 
 |   int skip_txfm_cost[SKIP_CONTEXTS][2]; | 
 | #if CONFIG_NEW_TX_PARTITION | 
 | #if CONFIG_TX_PARTITION_CTX | 
 | #if CONFIG_IMPROVEIDTX | 
 |   //! txfm_do_partition_cost | 
 |   int txfm_do_partition_cost[FSC_MODES][2][TXFM_SPLIT_GROUP][2]; | 
 |   //! txfm_4way_partition_type_cost | 
 |   int txfm_4way_partition_type_cost[FSC_MODES][2][TXFM_PARTITION_GROUP - 1] | 
 |                                    [TX_PARTITION_TYPE_NUM]; | 
 | #else | 
 |   //! txfm_do_partition_cost | 
 |   int txfm_do_partition_cost[2][TXFM_SPLIT_GROUP][2]; | 
 |   //! txfm_4way_partition_type_cost | 
 |   int txfm_4way_partition_type_cost[2][TXFM_PARTITION_GROUP - 1] | 
 |                                    [TX_PARTITION_TYPE_NUM]; | 
 | #endif  // CONFIG_IMPROVEIDTX | 
 | #else | 
 |   //! intra_4way_txfm_partition_cost | 
 |   int intra_4way_txfm_partition_cost[2][TX_SIZE_CONTEXTS][4]; | 
 |   //! intra_2way_txfm_partition_cost | 
 |   int intra_2way_txfm_partition_cost[2]; | 
 |   //! intra_2way_rect_txfm_partition_cost | 
 |   int intra_2way_rect_txfm_partition_cost[2]; | 
 |   //! inter_4way_txfm_partition_cost | 
 |   int inter_4way_txfm_partition_cost[2][TXFM_PARTITION_INTER_CONTEXTS][4]; | 
 |   //! inter_2way_txfm_partition_cost | 
 |   int inter_2way_txfm_partition_cost[2]; | 
 |   //! inter_2way_rect_txfm_partition_cost | 
 |   int inter_2way_rect_txfm_partition_cost[2]; | 
 | #endif  // CONFIG_TX_PARTITION_CTX | 
 | #else   // CONFIG_NEW_TX_PARTITION | 
 |   //! tx_size_cost | 
 |   int tx_size_cost[TX_SIZES - 1][TX_SIZE_CONTEXTS][TX_SIZES]; | 
 |   //! txfm_partition_cost | 
 |   int txfm_partition_cost[TXFM_PARTITION_CONTEXTS][2]; | 
 | #endif  // CONFIG_NEW_TX_PARTITION | 
 |   //! inter_tx_type_costs | 
 |   int inter_tx_type_costs[EXT_TX_SETS_INTER][EOB_TX_CTXS][EXT_TX_SIZES] | 
 |                          [TX_TYPES]; | 
 |   //! intra_tx_type_costs | 
 | #if CONFIG_INTRA_TX_IST_PARSE | 
 |   int intra_tx_type_costs[EXT_TX_SETS_INTRA][EXT_TX_SIZES][TX_TYPES]; | 
 | #else | 
 |   int intra_tx_type_costs[EXT_TX_SETS_INTRA][EXT_TX_SIZES][INTRA_MODES] | 
 |                          [TX_TYPES]; | 
 | #endif  // CONFIG_INTRA_TX_IST_PARSE | 
 | #if CONFIG_TX_TYPE_FLEX_IMPROVE | 
 |   //! tx_type_cost_for_length32_side | 
 |   int tx_ext_32_costs[2][2]; | 
 |   //! intra_tx_type_cost_of_short_side_for_large_txfm_blocks | 
 |   int intra_ext_tx_short_side_costs[EXT_TX_SIZES][4]; | 
 |   //! inter_tx_type_cost_of_short_side_for_large_txfm_blocks | 
 |   int inter_ext_tx_short_side_costs[EOB_TX_CTXS][EXT_TX_SIZES][4]; | 
 | #endif  // CONFIG_TX_TYPE_FLEX_IMPROVE | 
 |   //! cctx_type_cost | 
 |   int cctx_type_cost[EXT_TX_SIZES][CCTX_CONTEXTS][CCTX_TYPES]; | 
 |   /**@}*/ | 
 |  | 
 |   /***************************************************************************** | 
 |    * \name Restoration Mode Costs | 
 |    ****************************************************************************/ | 
 |   /**@{*/ | 
 |   //! switchable_flex_restore_cost | 
 |   int switchable_flex_restore_cost[MAX_LR_FLEX_SWITCHABLE_BITS][MAX_MB_PLANE] | 
 |                                   [2]; | 
 |   //! wiener_restore_cost | 
 |   int wiener_restore_cost[2]; | 
 |   //! sgrproj_restore_cost | 
 |   int sgrproj_restore_cost[2]; | 
 |   /*! | 
 |    * merged_param_cost | 
 |    */ | 
 |   int merged_param_cost[2]; | 
 |   /*! | 
 |    * wienerns_restore_cost | 
 |    */ | 
 |   int wienerns_restore_cost[2]; | 
 |   /*! | 
 |    * wienerns_length_cost | 
 |    */ | 
 |   int wienerns_length_cost[2][2]; | 
 |   /*! | 
 |    * wienerns_uv_sym_cost | 
 |    */ | 
 |   int wienerns_uv_sym_cost[2]; | 
 |   /*! | 
 |    * wienerns_4part_cost | 
 |    */ | 
 |   int wienerns_4part_cost[WIENERNS_4PART_CTX_MAX][4]; | 
 |   /*! | 
 |    * pc_wiener_restore_cost | 
 |    */ | 
 |   int pc_wiener_restore_cost[2]; | 
 | /**@}*/ | 
 | #if CONFIG_LOSSLESS_DPCM | 
 |   /***************************************************************************** | 
 |    * \name DPCM Mode Costs | 
 |    ****************************************************************************/ | 
 |   /**@{*/ | 
 |   /*! | 
 |    * dpcm_cost | 
 |    */ | 
 |   int dpcm_cost[2]; | 
 |   /*! | 
 |    * dpcm_vert_horz_cost | 
 |    */ | 
 |   int dpcm_vert_horz_cost[2]; | 
 |   /*! | 
 |    * dpcm_uv_cost | 
 |    */ | 
 |   int dpcm_uv_cost[2]; | 
 |   /*! | 
 |    * dpcm_uv_vert_horz_cost | 
 |    */ | 
 |   int dpcm_uv_vert_horz_cost[2]; | 
 |   /**@}*/ | 
 | #endif  // CONFIG_LOSSLESS_DPCM | 
 | } ModeCosts; | 
 |  | 
 | /*! \brief Holds mv costs for encoding and motion search. | 
 |  */ | 
 | typedef struct { | 
 |   /***************************************************************************** | 
 |    * \name Rate to Distortion Multipliers | 
 |    ****************************************************************************/ | 
 |   /**@{*/ | 
 |   //! A multiplier that converts mv cost to l2 error. | 
 |   int errorperbit; | 
 |   //! A multiplier that converts mv cost to l1 error. | 
 |   int sadperbit; | 
 |   /**@}*/ | 
 |  | 
 | #if CONFIG_VQ_MVD_CODING | 
 | /***************************************************************************** | 
 |  * \name Encoding Costs | 
 |  * Here are the entropy costs needed to encode a given mv. | 
 |  ****************************************************************************/ | 
 | #else | 
 | /***************************************************************************** | 
 |  * \name Encoding Costs | 
 |  * Here are the entropy costs needed to encode a given mv. | 
 |  * \ref nmv_costs_alloc is an array that holds the memory for mv cost. Since | 
 |  * the motion vectors can be negative, we save a pointer to the middle of the | 
 |  * array in \ref nmv_costs for easier referencing. | 
 |  ****************************************************************************/ | 
 | #endif  // CONFIG_VQ_MVD_CODING | 
 |  | 
 |   /**@{*/ | 
 | #if CONFIG_VQ_MVD_CODING | 
 |   /*! costs to code mvd shell index. */ | 
 |   int nmv_joint_shell_cost[NUM_MV_PRECISIONS][(2 * MV_MAX) + 1]; | 
 |  | 
 |   /*! costs to code col_mv_greter_flags. */ | 
 |   int col_mv_greater_flags_costs[NUM_MV_PRECISIONS] | 
 |                                 [MAX_COL_TRUNCATED_UNARY_VAL + 1] | 
 |                                 [MAX_COL_TRUNCATED_UNARY_VAL + 1]; | 
 |  | 
 |   /*! costs to code col_mv_index. */ | 
 |   int col_mv_index_cost[NUM_MV_PRECISIONS][NUM_CTX_COL_MV_INDEX][2]; | 
 |   /*! costs to code amvd mvd magnitude. */ | 
 |   int amvd_index_mag_cost[MAX_AMVD_INDEX + 1][MAX_AMVD_INDEX + 1]; | 
 |   /*! costs to code amvd mvd sign. */ | 
 |   int amvd_index_sign_cost[2][2]; | 
 | #else | 
 |   /*! Costs for coding the zero components. */ | 
 |   int nmv_joint_cost[MV_JOINTS]; | 
 |  | 
 |   /*! Allocates memory for motion vector costs. */ | 
 |   int nmv_costs_alloc[NUM_MV_PRECISIONS][2][MV_VALS]; | 
 |   /*! Points to the middle of \ref nmv_costs_alloc. */ | 
 |   int *nmv_costs[NUM_MV_PRECISIONS][2]; | 
 |  | 
 | #endif  // CONFIG_VQ_MVD_CODING | 
 |  | 
 | #if CONFIG_DERIVED_MVD_SIGN || CONFIG_VQ_MVD_CODING | 
 |   /*! Costs for coding the sign components. */ | 
 |   int nmv_sign_cost[2][2]; | 
 | #endif  // CONFIG_DERIVED_MVD_SIGN || CONFIG_VQ_MVD_CODING | 
 |  | 
 | #if !CONFIG_VQ_MVD_CODING | 
 |   //! Costs for coding the zero components when adaptive MVD resolution is | 
 |   //! applied | 
 |   int amvd_nmv_joint_cost[MV_JOINTS]; | 
 |  | 
 |   //! Allocates memory for 1/4-pel motion vector costs when adaptive MVD | 
 |   //! resolution is applied | 
 |   int amvd_nmv_cost_alloc[2][MV_VALS]; | 
 |  | 
 |   //! Points to the middle of \ref amvd_nmv_cost_alloc | 
 |   int *amvd_nmv_cost[2]; | 
 | #endif  // !CONFIG_VQ_MVD_CODING | 
 |  | 
 | #if CONFIG_DERIVED_MVD_SIGN && !CONFIG_VQ_MVD_CODING | 
 |   /*! Costs for coding the sign components. */ | 
 |   int amvd_nmv_sign_cost[2][2]; | 
 | #endif  // CONFIG_DERIVED_MVD_SIGN && !CONFIG_VQ_MVD_CODING | 
 |  | 
 | #if CONFIG_VQ_MVD_CODING | 
 |   /*! Costs for coding the shell cost of dv cost. */ | 
 |   int *dv_joint_shell_cost; | 
 |  | 
 |   /*! Costs for coding the col mv greater flags  of dv cost. */ | 
 |   int dv_col_mv_greater_flags_costs[MAX_COL_TRUNCATED_UNARY_VAL + 1] | 
 |                                    [MAX_COL_TRUNCATED_UNARY_VAL + 1]; | 
 |  | 
 |   /*! Costs for coding the col mv index  of dv cost. */ | 
 |   int dv_col_mv_index_cost[NUM_CTX_COL_MV_INDEX][2]; | 
 |  | 
 |   /*! Costs for coding the sign of each component. */ | 
 |   int dv_sign_cost[2][2]; | 
 | #else | 
 |  | 
 | #if CONFIG_IBC_BV_IMPROVEMENT | 
 |   /*! Costs for coding the zero components of dv cost. */ | 
 |   int *dv_joint_cost; | 
 |  | 
 |   /*! Points to the middle of dvcost. */ | 
 |   int *dv_nmv_cost[2]; | 
 | #endif | 
 | #endif  // CONFIG_VQ_MVD_CODING | 
 |   /**@}*/ | 
 | } MvCosts; | 
 |  | 
 | /*! \brief Holds mv costs for intrabc. | 
 |  */ | 
 | typedef struct { | 
 | #if CONFIG_VQ_MVD_CODING | 
 |   /*! Costs for coding the joint shell. */ | 
 |   int dv_joint_shell_cost[(2 * MV_MAX) + 1]; | 
 |  | 
 |   /*! Costs for coding the jgreater flags. */ | 
 |   int dv_col_mv_greater_flags_costs[MAX_COL_TRUNCATED_UNARY_VAL + 1] | 
 |                                    [MAX_COL_TRUNCATED_UNARY_VAL + 1]; | 
 |   /*! Costs for coding the column index. */ | 
 |   int dv_col_mv_index_cost[NUM_CTX_COL_MV_INDEX][2]; | 
 | #else | 
 |   /*! Costs for coding the joint mv. */ | 
 |   // TODO(huisu@google.com): we can update dv_joint_cost per SB. | 
 |   int joint_mv[MV_JOINTS]; | 
 |  | 
 |   /*! \brief Cost of transmitting the actual motion vector. | 
 |    *  mv_costs_alloc[0][i] is the cost of motion vector with horizontal | 
 |    * component (mv_row) equal to i - MV_MAX. mv_costs_alloc[1][i] is the cost of | 
 |    * motion vector with vertical component (mv_col) equal to i - MV_MAX. | 
 |    */ | 
 |   int dv_costs_alloc[2][MV_VALS]; | 
 |  | 
 |   /*! Points to the middle of \ref dv_costs_alloc. */ | 
 |   int *dv_costs[2]; | 
 | #endif  // CONFIG_VQ_MVD_CODING | 
 | #if CONFIG_DERIVED_MVD_SIGN || CONFIG_VQ_MVD_CODING | 
 |   /*! Costs for coding the sign components. */ | 
 |   int dv_sign_cost[2][2]; | 
 | #endif  // CONFIG_DERIVED_MVD_SIGN || CONFIG_VQ_MVD_CODING | 
 |  | 
 | } IntraBCMvCosts; | 
 |  | 
 | /*! \brief Holds the costs needed to encode the coefficients | 
 |  */ | 
 | typedef struct { | 
 |   //! Costs for coding the coefficients. | 
 |   LV_MAP_COEFF_COST coeff_costs[TX_SIZES][PLANE_TYPES]; | 
 |   //! Costs for coding the eobs. | 
 |   LV_MAP_EOB_COST eob_costs[7][2]; | 
 | } CoeffCosts; | 
 |  | 
 | /*!\cond */ | 
 | #define SINGLE_REF_MODES ((REF_FRAMES - 1) * 4) | 
 | /*!\endcond */ | 
 | struct inter_modes_info; | 
 |  | 
 | /*! \brief Encoder's parameters related to the current coding block. | 
 |  * | 
 |  * This struct contains most of the information the encoder needs to encode the | 
 |  * current coding block. This includes the src and pred buffer, a copy of the | 
 |  * decoder's view of the current block, the txfm coefficients. This struct also | 
 |  * contains various buffers and data used to speed up the encoding process. | 
 |  */ | 
 | typedef struct macroblock { | 
 |   /***************************************************************************** | 
 |    * \name Source, Buffers and Decoder | 
 |    ****************************************************************************/ | 
 |   /**@{*/ | 
 |   /*! \brief Each of the encoding plane. | 
 |    * | 
 |    * An array holding the src buffer for each of plane of the current block. It | 
 |    * also contains the txfm and quantized txfm coefficients. | 
 |    */ | 
 |   struct macroblock_plane plane[MAX_MB_PLANE]; | 
 |  | 
 |   /*! \brief Decoder's view of current coding block. | 
 |    * | 
 |    * Contains the encoder's copy of what the decoder sees in the current block. | 
 |    * Most importantly, this struct contains pointers to mbmi that is used in | 
 |    * final bitstream packing. | 
 |    */ | 
 |   MACROBLOCKD e_mbd; | 
 |  | 
 |   /*! \brief Derived coding information. | 
 |    * | 
 |    * Contains extra information not transmitted in the bitstream but are | 
 |    * derived. For example, this contains the stack of ref_mvs. | 
 |    */ | 
 |   MB_MODE_INFO_EXT *mbmi_ext; | 
 |  | 
 |   /*! \brief Finalized mbmi_ext for the whole frame. | 
 |    * | 
 |    * Contains the finalized info in mbmi_ext that gets used at the frame level | 
 |    * for bitstream packing. | 
 |    */ | 
 |   MB_MODE_INFO_EXT_FRAME *mbmi_ext_frame; | 
 |  | 
 |   //! Entropy context for the current row. | 
 |   FRAME_CONTEXT *row_ctx; | 
 |   /*! \brief Entropy context for the current tile. | 
 |    * | 
 |    * This context will be used to update color_map_cdf pointer which would be | 
 |    * used during pack bitstream. For single thread and tile-multithreading case | 
 |    * this pointer will be same as xd->tile_ctx, but for the case of row-mt: | 
 |    * xd->tile_ctx will point to a temporary context while tile_pb_ctx will point | 
 |    * to the accurate tile context. | 
 |    */ | 
 |   FRAME_CONTEXT *tile_pb_ctx; | 
 |  | 
 |   /*! \brief Buffer of transformed coefficients | 
 |    * | 
 |    * Points to cb_coef_buff in the AV1_COMP struct, which contains the finalized | 
 |    * coefficients. This is here to conveniently copy the best coefficients to | 
 |    * frame level for bitstream packing. Since CB_COEFF_BUFFER is allocated on a | 
 |    * superblock level, we need to combine it with cb_offset to get the proper | 
 |    * position for the current coding block. | 
 |    */ | 
 |   CB_COEFF_BUFFER *cb_coef_buff; | 
 |   //! Offset of current coding block's coeff buffer relative to the sb. | 
 |   int cb_offset[MAX_MB_PLANE]; | 
 |  | 
 |   //! Modified source and masks used for fast OBMC search. | 
 |   OBMCBuffer obmc_buffer; | 
 |   //! Buffer to store the best palette map. | 
 |   PALETTE_BUFFER *palette_buffer; | 
 |   //! Buffer used for compound_type_rd(). | 
 |   CompoundTypeRdBuffers comp_rd_buffer; | 
 |   //! Buffer to store convolution during averaging process in compound mode. | 
 |   CONV_BUF_TYPE *tmp_conv_dst; | 
 |  | 
 |   //! Temporary buffers used to store the OPFL MV offsets. | 
 |   int *opfl_vxy_bufs; | 
 |   //! Temporary buffers used to store the OPFL gradient information. | 
 |   int16_t *opfl_gxy_bufs; | 
 |   //! Temporary buffers used to store intermediate prediction data calculated | 
 |   //! during the OPFL/DMVR. | 
 |   uint16_t *opfl_dst_bufs; | 
 |   /*! \brief Temporary buffer to hold prediction. | 
 |    * | 
 |    * Points to a buffer that is used to hold temporary prediction results. This | 
 |    * is used in two ways: | 
 |    * - This is a temporary buffer used to pingpong the prediction in | 
 |    *   handle_inter_mode. | 
 |    * - xd->tmp_obmc_bufs also points to this buffer, and is used in ombc | 
 |    *   prediction. | 
 |    */ | 
 |   uint16_t *tmp_pred_bufs[2]; | 
 |  | 
 |   /*! | 
 |    *  Buffer used for upsampled prediction. | 
 |    */ | 
 |   uint16_t *upsample_pred; | 
 |   /**@}*/ | 
 |  | 
 |   /***************************************************************************** | 
 |    * \name Rdopt Costs | 
 |    ****************************************************************************/ | 
 |   /**@{*/ | 
 |   /*! \brief Quantization index for the current partition block. | 
 |    * | 
 |    * This is used to as the index to find quantization parameter for luma and | 
 |    * chroma transformed coefficients. | 
 |    */ | 
 |   int qindex; | 
 |  | 
 |   /*! \brief Difference between frame-level qindex and current qindex. | 
 |    * | 
 |    *  This is used to track whether a non-zero delta for qindex is used at least | 
 |    *  once in the current frame. | 
 |    */ | 
 |   int delta_qindex; | 
 |  | 
 |   /*! \brief Rate-distortion multiplier. | 
 |    * | 
 |    * The rd multiplier used to determine the rate-distortion trade-off. This is | 
 |    * roughly proportional to the inverse of q-index for a given frame, but this | 
 |    * can be manipulated for better rate-control. For example, in tune_ssim | 
 |    * mode, this is scaled by a factor related to the variance of the current | 
 |    * block. | 
 |    */ | 
 |   int rdmult; | 
 |  | 
 |   //! Energy in the current source coding block. Used to calculate \ref rdmult | 
 |   int mb_energy; | 
 |   //! Energy in the current source superblock. Used to calculate \ref rdmult | 
 |   int sb_energy_level; | 
 |  | 
 |   //! The rate needed to signal a mode to the bitstream. | 
 |   ModeCosts mode_costs; | 
 |  | 
 |   //! The rate needed to encode a new motion vector to the bitstream and some | 
 |   //! multipliers for motion search. | 
 |   MvCosts mv_costs; | 
 |  | 
 |   //! The rate needed to encode a new block vector to the bitstream and some | 
 |   //! multipliers for motion search. | 
 |  | 
 |   IntraBCMvCosts dv_costs; | 
 |   //! The rate needed to signal the txfm coefficients to the bitstream. | 
 |   CoeffCosts coeff_costs; | 
 |   /**@}*/ | 
 |  | 
 |   /****************************************************************************** | 
 |    * \name Segmentation | 
 |    *****************************************************************************/ | 
 |   /**@{*/ | 
 |   /*! \brief Skip mode for the segment | 
 |    * | 
 |    * A syntax element of the segmentation mode. In skip_block mode, all mvs are | 
 |    * set 0 and all txfms are skipped. | 
 |    */ | 
 |   int seg_skip_block; | 
 |   /**@}*/ | 
 |  | 
 |   /***************************************************************************** | 
 |    * \name Superblock | 
 |    ****************************************************************************/ | 
 |   /**@{*/ | 
 |   //! Information on a whole superblock level. | 
 |   // TODO(chiyotsai@google.com): Refactor this out of macroblock | 
 |   SuperBlockEnc sb_enc; | 
 |   /**@}*/ | 
 |  | 
 |   /***************************************************************************** | 
 |    * \name Reference Frame Searc | 
 |    ****************************************************************************/ | 
 |   /**@{*/ | 
 |   /*! \brief Sum absolute distortion of the predicted mv for each ref frame. | 
 |    * | 
 |    * This is used to measure how viable a reference frame is. | 
 |    */ | 
 |   int pred_mv_sad[SINGLE_REF_FRAMES]; | 
 |  | 
 |   //! The minimum of \ref pred_mv_sad. | 
 |   int best_pred_mv_sad; | 
 |  | 
 |   /*! \brief Disables certain ref frame pruning based on tpl. | 
 |    * | 
 |    * Determines whether a given ref frame is "good" based on data from the TPL | 
 |    * model. If so, this stops selective_ref frame from pruning the given ref | 
 |    * frame at block level. | 
 |    */ | 
 |   uint8_t tpl_keep_ref_frame[REF_FRAMES]; | 
 |  | 
 |   /*! \brief Reference frames picked by the square subblocks in a superblock. | 
 |    * | 
 |    * Keeps track of ref frames that are selected by square partition blocks | 
 |    * within a superblock, in MI resolution. They can be used to prune ref frames | 
 |    * for rectangular blocks. | 
 |    */ | 
 | #if CONFIG_SAME_REF_COMPOUND | 
 |   uint64_t picked_ref_frames_mask[MAX_MIB_SIZE * MAX_MIB_SIZE]; | 
 | #else | 
 |   int picked_ref_frames_mask[MAX_MIB_SIZE * MAX_MIB_SIZE]; | 
 | #endif  // CONFIG_SAME_REF_COMPOUND | 
 |  | 
 |   /**@}*/ | 
 |  | 
 |   /***************************************************************************** | 
 |    * \name Partition Search | 
 |    ****************************************************************************/ | 
 |   /**@{*/ | 
 |   //! Stores some partition-search related buffers. | 
 |   PartitionSearchInfo part_search_info; | 
 |  | 
 |   /*! \brief Whether to disable some features to force a mode in current block. | 
 |    * | 
 |    * In some cases, our speed features can be overly aggressive and remove all | 
 |    * modes search in the superblock. When this happens, we set | 
 |    * must_find_valid_partition to 1 to reduce the number of speed features, and | 
 |    * recode the superblock again. | 
 |    */ | 
 |   int must_find_valid_partition; | 
 |   /**@}*/ | 
 |  | 
 |   /***************************************************************************** | 
 |    * \name Prediction Mode Search | 
 |    ****************************************************************************/ | 
 |   /**@{*/ | 
 |   /*! \brief Inter skip mode. | 
 |    * | 
 |    * Skip mode tries to use the closest forward and backward references for | 
 |    * inter prediction. Skip here means to skip transmitting the reference | 
 |    * frames, not to be confused with skip_txfm. | 
 |    */ | 
 |   int skip_mode; | 
 |  | 
 |   /*! \brief Factors used for rd-thresholding. | 
 |    * | 
 |    * Determines a rd threshold to determine whether to continue searching the | 
 |    * current mode. If the current best rd is already <= threshold, then we skip | 
 |    * the current mode. | 
 |    */ | 
 |   int thresh_freq_fact[BLOCK_SIZES_ALL][MB_MODE_COUNT]; | 
 |  | 
 |   /*! \brief Tracks the winner modes in the current coding block. | 
 |    * | 
 |    * Winner mode is a two-pass strategy to find the best prediction mode. In the | 
 |    * first pass, we search the prediction modes with a limited set of txfm | 
 |    * options, and keep the top modes. These modes are called the winner modes. | 
 |    * In the second pass, we retry the winner modes with more thorough txfm | 
 |    * options. | 
 |    */ | 
 |   WinnerModeStats winner_mode_stats[AOMMAX(MAX_WINNER_MODE_COUNT_INTRA, | 
 |                                            MAX_WINNER_MODE_COUNT_INTER)]; | 
 |   //! Tracks how many winner modes there are. | 
 |   int winner_mode_count; | 
 |  | 
 |   /*! \brief The model used for rd-estimation to avoid txfm | 
 |    * | 
 |    * These are for inter_mode_rd_model_estimation, which is another two pass | 
 |    * approach. In this speed feature, we collect data in the first couple frames | 
 |    * to build an rd model to estimate the rdcost of a prediction model based on | 
 |    * the residue error. Once enough data is collected, this speed feature uses | 
 |    * the estimated rdcost to find the most performant prediction mode. Then we | 
 |    * follow up with a second pass find the best transform for the mode. | 
 |    * Determines if one would go with reduced complexity transform block | 
 |    * search model to select prediction modes, or full complexity model | 
 |    * to select transform kernel. | 
 |    */ | 
 |   TXFM_RD_MODEL rd_model; | 
 |  | 
 |   /*! \brief Stores the inter mode information needed to build an rd model. | 
 |    * | 
 |    * These are for inter_mode_rd_model_estimation, which is another two pass | 
 |    * approach. In this speed feature, we collect data in the first couple frames | 
 |    * to build an rd model to estimate the rdcost of a prediction model based on | 
 |    * the residue error. Once enough data is collected, this speed feature uses | 
 |    * the estimated rdcost to find the most performant prediction mode. Then we | 
 |    * follow up with a second pass find the best transform for the mode. | 
 |    */ | 
 |   // TODO(any): try to consolidate this speed feature with winner mode | 
 |   // processing. | 
 |   struct inter_modes_info *inter_modes_info; | 
 |  | 
 |   //! A caches of results of compound type search so they can be reused later. | 
 |   COMP_RD_STATS comp_rd_stats[MAX_COMP_RD_STATS]; | 
 |   //! The idx for the latest compound mode in the cache \ref comp_rd_stats. | 
 |   int comp_rd_stats_idx; | 
 |  | 
 |   /*! \brief Whether to recompute the luma prediction. | 
 |    * | 
 |    * In interpolation search, we can usually skip recalculating the luma | 
 |    * prediction because it is already calculated by a previous predictor. This | 
 |    * flag signifies that some modes might have been skipped, so we need to | 
 |    * rebuild the prediction. | 
 |    */ | 
 |   int recalc_luma_mc_data; | 
 |  | 
 |   /*! \brief Data structure to speed up intrabc search. | 
 |    * | 
 |    * Contains the hash table, hash function, and buffer used for intrabc. | 
 |    */ | 
 |   IntraBCHashInfo intrabc_hash_info; | 
 |   /**@}*/ | 
 |  | 
 |   /***************************************************************************** | 
 |    * \name MV Search | 
 |    ****************************************************************************/ | 
 |   /**@{*/ | 
 |   /*! \brief Context used to determine the initial step size in motion search. | 
 |    * | 
 |    * This context is defined as the \f$l_\inf\f$ norm of the best ref_mvs for | 
 |    * each frame. | 
 |    */ | 
 |   unsigned int max_mv_context[SINGLE_REF_FRAMES]; | 
 |  | 
 |   /*! \brief Limit for the range of motion vectors. | 
 |    * | 
 |    * These define limits to motion vector components to prevent them from | 
 |    * extending outside the UMV borders | 
 |    */ | 
 |   FullMvLimits mv_limits; | 
 |   /**@}*/ | 
 |  | 
 |   /***************************************************************************** | 
 |    * \name Txfm Search | 
 |    ****************************************************************************/ | 
 |   /**@{*/ | 
 |   /*! \brief Parameters that control how motion search is done. | 
 |    * | 
 |    * Stores various txfm search related parameters such as txfm_type, txfm_size, | 
 |    * trellis eob search, etc. | 
 |    */ | 
 |   TxfmSearchParams txfm_search_params; | 
 |  | 
 |   /*! \brief Results of the txfm searches that have been done. | 
 |    * | 
 |    * Caches old txfm search results and keeps the current txfm decisions to | 
 |    * facilitate rdopt. | 
 |    */ | 
 |   TxfmSearchInfo txfm_search_info; | 
 |   /**@}*/ | 
 |   /***************************************************************************** | 
 |    * \name Misc | 
 |    ****************************************************************************/ | 
 |   /**@{*/ | 
 |   //! Variance of the source frame. | 
 |   unsigned int source_variance; | 
 |   //! SSE of the current predictor. | 
 |   unsigned int pred_sse[SINGLE_REF_FRAMES]; | 
 | #if CONFIG_EXT_RECUR_PARTITIONS | 
 |   /*! Simple motion search buffers. */ | 
 |   SimpleMotionDataBufs *sms_bufs; | 
 |   /*! \brief Determines what encoding decision should be reused. */ | 
 |   int reuse_inter_mode_cache_type; | 
 |   /*! \brief The mode to reuse during \ref av1_rd_pick_inter_mode_sb. */ | 
 |   MB_MODE_INFO *inter_mode_cache; | 
 |   /*! \brief Whether the whole superblock is inside the frame boudnary */ | 
 |   bool is_whole_sb; | 
 | #endif  // CONFIG_EXT_RECUR_PARTITIONS | 
 |   /**@}*/ | 
 |  | 
 |   /*! \brief Quantization state of a transform coefficient. | 
 |    * | 
 |    * This structure includes the quantized value, its dequantized equivalent, | 
 |    * the changes in cost and rate due to quantization, and flags indicating | 
 |    * if the coefficient was quantized up and if it can be further adjusted. | 
 |    */ | 
 |   coeff_info *coef_info; | 
 | #if CONFIG_SCC_DETERMINATION | 
 |   /*!\brief Number of pixels in current thread that choose palette mode in the | 
 |    * fast encoding stage for screen content tool detemination. | 
 |    */ | 
 |   int palette_pixels; | 
 | #endif  // CONFIG_SCC_DETERMINATION | 
 | } MACROBLOCK; | 
 | #undef SINGLE_REF_MODES | 
 |  | 
 | /*!\cond */ | 
 | static INLINE int is_rect_tx_allowed_bsize(BLOCK_SIZE bsize) { | 
 |   static const char LUT[BLOCK_SIZES_ALL] = { | 
 | #if CONFIG_NEW_TX_PARTITION | 
 |     0,  // BLOCK_4X4 | 
 |     1,  // BLOCK_4X8 | 
 |     1,  // BLOCK_8X4 | 
 |     1,  // BLOCK_8X8 | 
 |     1,  // BLOCK_8X16 | 
 |     1,  // BLOCK_16X8 | 
 |     1,  // BLOCK_16X16 | 
 |     1,  // BLOCK_16X32 | 
 |     1,  // BLOCK_32X16 | 
 |     1,  // BLOCK_32X32 | 
 |     1,  // BLOCK_32X64 | 
 |     1,  // BLOCK_64X32 | 
 |     1,  // BLOCK_64X64 | 
 |     1,  // BLOCK_64X128 | 
 |     1,  // BLOCK_128X64 | 
 |     1,  // BLOCK_128X128 | 
 | #if CONFIG_EXT_RECUR_PARTITIONS | 
 |     1,  // BLOCK_128X256 | 
 |     1,  // BLOCK_256X128 | 
 |     1,  // BLOCK_256X256 | 
 | #endif  // CONFIG_EXT_RECUR_PARTITIONS | 
 |     1,  // BLOCK_4X16 | 
 |     1,  // BLOCK_16X4 | 
 |     1,  // BLOCK_8X32 | 
 |     1,  // BLOCK_32X8 | 
 |     1,  // BLOCK_16X64 | 
 |     1,  // BLOCK_64X16 | 
 | #else | 
 |     0,  // BLOCK_4X4 | 
 |     1,  // BLOCK_4X8 | 
 |     1,  // BLOCK_8X4 | 
 |     0,  // BLOCK_8X8 | 
 |     1,  // BLOCK_8X16 | 
 |     1,  // BLOCK_16X8 | 
 |     0,  // BLOCK_16X16 | 
 |     1,  // BLOCK_16X32 | 
 |     1,  // BLOCK_32X16 | 
 |     0,  // BLOCK_32X32 | 
 |     1,  // BLOCK_32X64 | 
 |     1,  // BLOCK_64X32 | 
 |     0,  // BLOCK_64X64 | 
 |     0,  // BLOCK_64X128 | 
 |     0,  // BLOCK_128X64 | 
 |     0,  // BLOCK_128X128 | 
 | #if CONFIG_EXT_RECUR_PARTITIONS | 
 |     0,  // BLOCK_128X256 | 
 |     0,  // BLOCK_256X128 | 
 |     0,  // BLOCK_256X256 | 
 | #endif  // CONFIG_EXT_RECUR_PARTITIONS | 
 |     1,  // BLOCK_4X16 | 
 |     1,  // BLOCK_16X4 | 
 |     1,  // BLOCK_8X32 | 
 |     1,  // BLOCK_32X8 | 
 |     1,  // BLOCK_16X64 | 
 |     1,  // BLOCK_64X16 | 
 | #endif  // CONFIG_NEW_TX_PARTITION | 
 | #if CONFIG_EXT_RECUR_PARTITIONS | 
 |     1,  // BLOCK_4X32 | 
 |     1,  // BLOCK_32X4 | 
 |     1,  // BLOCK_8X64 | 
 |     1,  // BLOCK_64X8 | 
 |     1,  // BLOCK_4X64 | 
 |     1,  // BLOCK_64X4 | 
 | #endif  // CONFIG_EXT_RECUR_PARTITIONS | 
 |   }; | 
 |  | 
 |   return LUT[bsize]; | 
 | } | 
 |  | 
 | static INLINE int is_rect_tx_allowed(const MACROBLOCKD *xd, | 
 |                                      const MB_MODE_INFO *mbmi) { | 
 |   return is_rect_tx_allowed_bsize( | 
 |              mbmi->sb_type[xd->tree_type == CHROMA_PART]) && | 
 |          !xd->lossless[mbmi->segment_id]; | 
 | } | 
 |  | 
 | static INLINE void set_blk_skip(uint8_t txb_skip[], int blk_idx, int skip) { | 
 |   if (skip) | 
 |     txb_skip[blk_idx] |= 1UL; | 
 |   else | 
 |     txb_skip[blk_idx] &= ~(1UL); | 
 | #ifndef NDEBUG | 
 |   // Mark this block as initialized (0). | 
 |   txb_skip[blk_idx] &= ~(1UL << 4); | 
 | #endif | 
 | } | 
 |  | 
 | static INLINE int is_blk_skip(uint8_t *txb_skip, int blk_idx) { | 
 | #ifndef NDEBUG | 
 |   // Ensure that this block is initialized. | 
 |   assert((txb_skip[blk_idx] & (1U << 4)) == 0); | 
 |   // These were initialized to fixed pattern 0x11 in `av1_rd_pick_partition`. | 
 |   // Ensure other bits are 0 to make sure there is no garbage data. | 
 |   assert((txb_skip[blk_idx] & 0xEE) == 0); | 
 | #endif | 
 |   return txb_skip[blk_idx] & 1; | 
 | } | 
 |  | 
 | #if CONFIG_EXT_RECUR_PARTITIONS | 
 | static INLINE int should_reuse_mode(const MACROBLOCK *x, int mode_flag) { | 
 |   return x->reuse_inter_mode_cache_type & mode_flag; | 
 | } | 
 | #endif  // CONFIG_EXT_RECUR_PARTITIONS | 
 | /*!\endcond */ | 
 |  | 
 | #ifdef __cplusplus | 
 | }  // extern "C" | 
 | #endif | 
 |  | 
 | #endif  // AOM_AV1_ENCODER_BLOCK_H_ |