/*
 * 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/.
 */

#ifndef AOM_AV1_COMMON_AV1_COMMON_INT_H_
#define AOM_AV1_COMMON_AV1_COMMON_INT_H_

#include "config/aom_config.h"
#include "config/av1_rtcd.h"

#include "aom/internal/aom_codec_internal.h"
#include "aom_util/aom_thread.h"
#include "av1/common/alloccommon.h"
#include "av1/common/av1_loopfilter.h"
#if CONFIG_PEF
#include "av1/common/pef.h"
#endif  // CONFIG_PEF
#include "av1/common/blockd.h"
#include "av1/common/entropy.h"
#include "av1/common/entropymode.h"
#include "av1/common/entropymv.h"
#include "av1/common/enums.h"
#include "av1/common/frame_buffers.h"
#include "av1/common/mv.h"
#include "av1/common/quant_common.h"
#include "av1/common/restoration.h"
#include "av1/common/tile_common.h"
#include "av1/common/timing.h"
#include "av1/common/odintrin.h"
#include "av1/common/warped_motion.h"
#include "av1/encoder/hash_motion.h"
#include "aom_dsp/grain_synthesis.h"
#include "aom_dsp/grain_table.h"
#ifdef __cplusplus
extern "C" {
#endif

#if defined(__clang__) && defined(__has_warning)
#if __has_feature(cxx_attributes) && __has_warning("-Wimplicit-fallthrough")
#define AOM_FALLTHROUGH_INTENDED [[clang::fallthrough]]  // NOLINT
#endif
#elif defined(__GNUC__) && __GNUC__ >= 7
#define AOM_FALLTHROUGH_INTENDED __attribute__((fallthrough))  // NOLINT
#endif

#ifndef AOM_FALLTHROUGH_INTENDED
#define AOM_FALLTHROUGH_INTENDED \
  do {                           \
  } while (0)
#endif

#define CDEF_MAX_STRENGTHS 16
/* Constant value specifying size of subgop stats*/
#define MAX_SUBGOP_STATS_SIZE 32

/* Constant values while waiting for the sequence header */
#define FRAME_ID_LENGTH 15
#define DELTA_FRAME_ID_LENGTH 14

#define DELTA_DCQUANT_BITS 5
#define DELTA_DCQUANT_MAX (1 << (DELTA_DCQUANT_BITS - 2))
#define DELTA_DCQUANT_MIN (DELTA_DCQUANT_MAX - (1 << DELTA_DCQUANT_BITS) + 1)

#define DEBUG_EXTQUANT 0

#define FRAME_CONTEXTS (FRAME_BUFFERS + 1)
// Extra frame context which is always kept at default values
#define FRAME_CONTEXT_DEFAULTS (FRAME_CONTEXTS - 1)
#define PRIMARY_REF_BITS 3
#define PRIMARY_REF_NONE 7

#define NUM_PING_PONG_BUFFERS 2

#define MAX_NUM_TEMPORAL_LAYERS 8
#define MAX_NUM_SPATIAL_LAYERS 4
/* clang-format off */
// clang-format seems to think this is a pointer dereference and not a
// multiplication.
#define MAX_NUM_OPERATING_POINTS \
  (MAX_NUM_TEMPORAL_LAYERS * MAX_NUM_SPATIAL_LAYERS)
/* clang-format on */

// TODO(jingning): Turning this on to set up transform coefficient
// processing timer.
#define TXCOEFF_TIMER 0
#define TXCOEFF_COST_TIMER 0

#if CONFIG_TIP
// Some arrays (e.g. x->pred_sse and yv12_mb) are defined such that their
// indices 0-8 correspond to inter ref0, ref1,... ref6, intra ref, and TIP ref.
// This macros maps the ref_frame indices to corresponding array indices, where
// intra ref_frame index, INTRA_FRAME (28) is mapped to INTRA_FRAME_INDEX (7).
// and tip ref_frame index, TIP_FRAME (29) is mapped to TIP_FRAME_INDEX (8)
#define COMPACT_INDEX0_NRS(r)               \
  (((r) == INTRA_FRAME) ? INTRA_FRAME_INDEX \
                        : (((r) == TIP_FRAME) ? TIP_FRAME_INDEX : (r)))
#else
// Some arrays (e.g. x->pred_sse and yv12_mb) are defined such that their
// indices 0-7 correspond to inter ref0, ref1,... ref6, and intra ref. This
// macros maps the ref_frame indices to corresponding array indices, where
// intra ref_frame index, INTRA_FRAME (28) is mapped to INTRA_FRAME_INDEX (7).
#define COMPACT_INDEX0_NRS(r) (((r) == INTRA_FRAME) ? INTRA_FRAME_INDEX : (r))
#endif  // CONFIG_TIP

// This macro is similar to the previous one, but also maps INVALID_IDX
// (ref_frame[1] for the single reference case) to 7, which typically
// corresponds to an unused slot allocated for convenience.
#define COMPACT_INDEX1_NRS(r) \
  (!is_inter_ref_frame((r)) ? INTRA_FRAME_INDEX : (r))

#if CONFIG_TIP || CONFIG_PEF
// MI unit is 4x4, TMVP unit is 8x8, so there is 1 shift
// between TMVP unit and MI unit
#define TMVP_SHIFT_BITS 1
// TMVP unit size
#define TMVP_MI_SZ_LOG2 (MI_SIZE_LOG2 + TMVP_SHIFT_BITS)
#define TMVP_MI_SIZE (1 << TMVP_MI_SZ_LOG2)
// TIP MV search range constraint in TMVP unit
#define TIP_MV_SEARCH_RANGE 4
#endif  // CONFIG_TIP || CONFIG_PEF

#if CONFIG_EXTENDED_WARP_PREDICTION
#define MIN_BSIZE_WARP_DELTA 8

// Using the WARP_DELTA motion mode, we can use a nearby block's warp model as
// a prediction and then modify it with an explicitly coded delta.
//
// If this flag is set to 0, then any spatial reference block (ie, a DRL entry
// which came from a block in the current frame) can provide a warp model which
// we can use as a prediction.
//
// If this flag is set to 1, then only directly adjacent blocks can be used
// as references (similar to WARP_EXTEND), meaning that we only need to store
// one above row and one left column of warp models. This can be enabled if
// the above behaviour causes concerns for hardware implementations.
//
// Interaction with different modes:
//
// For GLOBALMV, WARP_DELTA can always be used, and uses the global warp model
// (if any) as a base. If no global warp model was given, we use a translational
// model as a base.
//
// For NEARMV, WARP_DELTA can only be used if the reference block selected from
// the DRL can provide a warp model under the logic mentioned above.
//
// For NEWMV, WARP_DELTA can always be used. If the reference block can provide
// a warp model, then this is used as a base; otherwise the global warp model
// (or a translational model) is used.
#define WARP_DELTA_REQUIRES_NEIGHBOR 1
#endif  // CONFIG_EXTENDED_WARP_PREDICTION

/*!\cond */

enum {
  SINGLE_REFERENCE = 0,
  COMPOUND_REFERENCE = 1,
  REFERENCE_MODE_SELECT = 2,
  REFERENCE_MODES = 3,
} UENUM1BYTE(REFERENCE_MODE);

enum {
  /**
   * Frame context updates are disabled
   */
  REFRESH_FRAME_CONTEXT_DISABLED,
  /**
   * Update frame context to values resulting from backward probability
   * updates based on entropy/counts in the decoded frame
   */
  REFRESH_FRAME_CONTEXT_BACKWARD,
} UENUM1BYTE(REFRESH_FRAME_CONTEXT_MODE);

#if CONFIG_TIP
enum {
  /**
   * TIP frame generation is disabled
   */
  TIP_FRAME_DISABLED = 0,
  /**
   * TIP frame is used as a reference frame
   */
  TIP_FRAME_AS_REF,
  /**
   * TIP frame is directly output for displaying
   */
  TIP_FRAME_AS_OUTPUT,
  /**
   * TIP frame maximum mode
   */
  TIP_FRAME_MODES,
} UENUM1BYTE(TIP_FRAME_MODE);
#endif  // CONFIG_TIP

typedef struct {
  int_mv mfmv0;
  uint8_t ref_frame_offset;
} TPL_MV_REF;

#if CONFIG_TIP
typedef struct {
  int_mv mv[2];
  MV_REFERENCE_FRAME ref_frame[2];
} MV_REF;
#else
typedef struct {
  int_mv mv;
  MV_REFERENCE_FRAME ref_frame;
} MV_REF;
#endif  // CONFIG_TIP

typedef struct PlaneHash {
  uint8_t md5[16];
} PlaneHash;

typedef struct FrameHash {
  uint8_t unused : 2;
  uint8_t has_grain : 1;
  uint8_t per_plane : 1;
  uint8_t hash_type : 4;
  PlaneHash plane[3];
  int is_present;
} FrameHash;

typedef struct RefCntBuffer {
  // For a RefCntBuffer, the following are reference-holding variables:
  // - cm->ref_frame_map[]
  // - cm->cur_frame
  // - cm->scaled_ref_buf[] (encoder only)
  // - pbi->output_frame_index[] (decoder only)
  // With that definition, 'ref_count' is the number of reference-holding
  // variables that are currently referencing this buffer.
  // For example:
  // - suppose this buffer is at index 'k' in the buffer pool, and
  // - Total 'n' of the variables / array elements above have value 'k' (that
  // is, they are pointing to buffer at index 'k').
  // Then, pool->frame_bufs[k].ref_count = n.
  int ref_count;

  unsigned int order_hint;
  int ref_order_hints[INTER_REFS_PER_FRAME];
  int ref_display_order_hint[INTER_REFS_PER_FRAME];

  // These variables are used only in encoder and compare the absolute
  // display order hint to compute the relative distance and overcome
  // the limitation of get_relative_dist() which returns incorrect
  // distance when a very old frame is used as a reference.
  unsigned int display_order_hint;
  unsigned int absolute_poc;
  // Frame's level within the hierarchical structure
  unsigned int pyramid_level;

#if CONFIG_IMPROVED_GLOBAL_MOTION
  // How many ref frames did this frame use?
  // This is set to 0 for intra frames
  int num_ref_frames;
#endif  // CONFIG_IMPROVED_GLOBAL_MOTION

  MV_REF *mvs;
  uint8_t *seg_map;
  struct segmentation seg;
  int mi_rows;
  int mi_cols;
  // Width and height give the size of the buffer (before any upscaling, unlike
  // the sizes that can be derived from the buf structure)
  int width;
  int height;
  WarpedMotionParams global_motion[INTER_REFS_PER_FRAME];
  int showable_frame;  // frame can be used as show existing frame in future
  uint8_t film_grain_params_present;
  aom_film_grain_t film_grain_params;
  aom_codec_frame_buffer_t raw_frame_buffer;
  YV12_BUFFER_CONFIG buf;
  FRAME_TYPE frame_type;

  // This is only used in the encoder but needs to be indexed per ref frame
  // so it's extremely convenient to keep it here.
  int interp_filter_selected[SWITCHABLE];

  // Inter frame reference frame delta for loop filter
  int8_t ref_deltas[SINGLE_REF_FRAMES];

  // 0 = ZERO_MV, MV
  int8_t mode_deltas[MAX_MODE_LF_DELTAS];

  FRAME_CONTEXT frame_context;
  int base_qindex;

  FrameHash raw_frame_hash;
  FrameHash grain_frame_hash;
} RefCntBuffer;

typedef struct BufferPool {
// Protect BufferPool from being accessed by several FrameWorkers at
// the same time during frame parallel decode.
// TODO(hkuang): Try to use atomic variable instead of locking the whole pool.
// TODO(wtc): Remove this. See
// https://chromium-review.googlesource.com/c/webm/libvpx/+/560630.
#if CONFIG_MULTITHREAD
  pthread_mutex_t pool_mutex;
#endif

  // Private data associated with the frame buffer callbacks.
  void *cb_priv;

  aom_get_frame_buffer_cb_fn_t get_fb_cb;
  aom_release_frame_buffer_cb_fn_t release_fb_cb;

  RefCntBuffer frame_bufs[FRAME_BUFFERS];

  // Frame buffers allocated internally by the codec.
  InternalFrameBufferList int_frame_buffers;
} BufferPool;

/*!\endcond */

/*!\brief Parameters related to CDEF */
typedef struct {
  int cdef_damping;                       /*!< CDEF damping factor */
  int nb_cdef_strengths;                  /*!< Number of CDEF strength values */
  int cdef_strengths[CDEF_MAX_STRENGTHS]; /*!< CDEF strength values for luma */
  int cdef_uv_strengths[CDEF_MAX_STRENGTHS]; /*!< CDEF strength values for
                                                chroma */
  int cdef_bits; /*!< Number of CDEF strength values in bits */
#if CONFIG_FIX_CDEF_SYNTAX
  int cdef_frame_enable; /*!< CDEF on/off for current frame */
#endif                   // CONFIG_FIX_CDEF_SYNTAX
} CdefInfo;

#if CONFIG_OPTFLOW_REFINEMENT
enum {
  /*!
   * MV refinement disabled for the current frame.
   */
  REFINE_NONE = 0,
  /*!
   * MV refinement is switchable per block for the current frame.
   */
  REFINE_SWITCHABLE = 1,
  /*!
   * MV refinement applied to all compound blocks for the current frame.
   */
  REFINE_ALL = 2,
} UENUM1BYTE(OPTFLOW_REFINE_TYPE);
#endif  // CONFIG_OPTFLOW_REFINEMENT

#if CONFIG_CCSO
/** ccso info */
typedef struct {
  /** ccso enable */
  bool ccso_enable[CCSO_NUM_COMPONENTS];
  /** ccso filter offset */
  int8_t filter_offset[CCSO_NUM_COMPONENTS][CCSO_BAND_NUM * 16];
#if CONFIG_CCSO_EXT
  /** ccso log2 of max bands */
  int max_band_log2[CCSO_NUM_COMPONENTS];
#endif
  /** quant index */
  uint8_t quant_idx[CCSO_NUM_COMPONENTS];
  /** extended filter support */
  uint8_t ext_filter_support[CCSO_NUM_COMPONENTS];
} CcsoInfo;
#endif

/*!\cond */

typedef struct {
  int delta_q_present_flag;
  // Resolution of delta quant
  int delta_q_res;
  int delta_lf_present_flag;
  // Resolution of delta lf level
  int delta_lf_res;
  // This is a flag for number of deltas of loop filter level
  // 0: use 1 delta, for y_vertical, y_horizontal, u, and v
  // 1: use separate deltas for each filter level
  int delta_lf_multi;
} DeltaQInfo;

typedef struct {
  int enable_order_hint;        // 0 - disable order hint, and related tools
  int order_hint_bits_minus_1;  // dist_wtd_comp, ref_frame_mvs,
                                // frame_sign_bias
                                // if 0, enable_dist_wtd_comp and
                                // enable_ref_frame_mvs must be set as 0.
  int enable_ref_frame_mvs;     // 0 - disable ref frame mvs
                                // 1 - enable it
} OrderHintInfo;

// Sequence header structure.
// Note: All syntax elements of sequence_header_obu that need to be
// bit-identical across multiple sequence headers must be part of this struct,
// so that consistency is checked by are_seq_headers_consistent() function.
// One exception is the last member 'op_params' that is ignored by
// are_seq_headers_consistent() function.
typedef struct SequenceHeader {
  int num_bits_width;
  int num_bits_height;
  int max_frame_width;
  int max_frame_height;
  // Whether current and reference frame IDs are signaled in the bitstream.
  // Frame id numbers are additional information that do not affect the
  // decoding process, but provide decoders with a way of detecting missing
  // reference frames so that appropriate action can be taken.
  uint8_t frame_id_numbers_present_flag;
  int frame_id_length;
  int delta_frame_id_length;
  BLOCK_SIZE sb_size;          // Size of the superblock used for this frame
  int mib_size;                // Size of the superblock in units of MI blocks
  int mib_size_log2;           // Log 2 of above.
  int explicit_ref_frame_map;  // Explicitly signal the reference frame mapping
#if CONFIG_OUTPUT_FRAME_BASED_ON_ORDER_HINT
  int enable_frame_output_order;  // Enable frame output order derivation based
                                  // on order hint value
#endif                            // CONFIG_OUTPUT_FRAME_BASED_ON_ORDER_HINT
  int max_reference_frames;       // Number of reference frames allowed
#if CONFIG_ALLOW_SAME_REF_COMPOUND
  int num_same_ref_compound;  // Number of the allowed same reference frames for
                              // the compound mode
#endif                        // CONFIG_ALLOW_SAME_REF_COMPOUND

  OrderHintInfo order_hint_info;

  uint8_t force_screen_content_tools;  // 0 - force off
                                       // 1 - force on
                                       // 2 - adaptive
  uint8_t still_picture;               // Video is a single frame still picture
  uint8_t reduced_still_picture_hdr;   // Use reduced header for still picture
  uint8_t force_integer_mv;            // 0 - Don't force. MV can use subpel
                                       // 1 - force to integer
                                       // 2 - adaptive
  uint8_t enable_sdp;   // enables/disables semi-decoupled partitioning
  uint8_t enable_mrls;  // enables/disables multiple reference line selection
#if CONFIG_TIP
  uint8_t enable_tip;  // enables/disables temporal interpolated prediction
  uint8_t enable_tip_hole_fill;  // enables/disables hole fill for TIP
#endif                           // CONFIG_TIP
#if CONFIG_BAWP
  uint8_t enable_bawp;  // enables/disables block adaptive weighted prediction
#endif                  // CONFIG_BAWP
#if CONFIG_CWP
  uint8_t enable_cwp;  // enables/disables compound weighted prediction
#endif                 // CONFIG_CWP
#if CONFIG_D071_IMP_MSK_BLD
  uint8_t enable_imp_msk_bld;        // enable implicit maksed blending
#endif                               // CONFIG_D071_IMP_MSK_BLD
  uint8_t enable_fsc;                // enables/disables forward skip coding
  uint8_t enable_filter_intra;       // enables/disables filterintra
  uint8_t enable_intra_edge_filter;  // enables/disables edge upsampling

#if CONFIG_ORIP
  uint8_t enable_orip;  // To turn on/off sub-block based ORIP
#endif
#if CONFIG_IDIF
  uint8_t
      enable_idif;  // enables/disables Intra Directional Interpolation Filter
#endif              // CONFIG_IDIF
  uint8_t enable_ist;  // enables/disables intra secondary transform
#if CONFIG_CROSS_CHROMA_TX
  uint8_t enable_cctx;  // enables/disables cross-chroma component transform
#endif                  // CONFIG_CROSS_CHROMA_TX
  uint8_t enable_ibp;   // enables/disables intra bi-prediction(IBP)
#if CONFIG_ADAPTIVE_MVD
  uint8_t enable_adaptive_mvd;  // enables/disables adaptive MVD resolution
#endif                          // CONFIG_ADAPTIVE_MVD
#if CONFIG_FLEX_MVRES
  uint8_t enable_flex_mvres;  // enables/disables flexible MV resolution
#endif                        // CONFIG_FLEX_MVRES

#if CONFIG_ADAPTIVE_DS_FILTER
  uint8_t enable_cfl_ds_filter;  // enable/disables adaptive downsampling filter
#endif                           // CONFIG_ADAPTIVE_DS_FILTER

#if CONFIG_JOINT_MVD
  uint8_t enable_joint_mvd;  // enables/disables joint MVD coding
#endif                       // CONFIG_JOINT_MVD

#if CONFIG_REFINEMV
  uint8_t enable_refinemv;  // enables/disables refineMV mode
#endif                      // CONFIG_REFINEMV

#if CONFIG_EXTENDED_WARP_PREDICTION
  int seq_enabled_motion_modes;  // Bit mask of enabled motion modes for
                                 // sequence
#endif

#if !CONFIG_EXTENDED_WARP_PREDICTION
  uint8_t enable_interintra_compound;  // enables/disables interintra_compound
#endif
  uint8_t enable_masked_compound;  // enables/disables masked compound
#if CONFIG_OPTFLOW_REFINEMENT
  aom_opfl_refine_type enable_opfl_refine;  // optical flow refinement type for
                                            // this frame
#endif  // 1 - enable vert/horz filter selection
#if !CONFIG_EXTENDED_WARP_PREDICTION
  uint8_t enable_warped_motion;  // 0 - disable warp for the sequence
                                 // 1 - enable warp for the sequence
#endif
  uint8_t enable_superres;  // 0 - Disable superres for the sequence
                            //     and no frame level superres flag
                            // 1 - Enable superres for the sequence
                            //     enable per-frame superres flag
  uint8_t enable_cdef;      // To turn on/off CDEF

  uint8_t enable_restoration;  // To turn on/off loop restoration
#if CONFIG_CCSO
  uint8_t enable_ccso;  // To turn on/off CCSO
#endif
#if CONFIG_PEF
  uint8_t enable_pef;  // To turn on/off prediction enhancement filter
#endif                 // CONFIG_PEF
#if CONFIG_REF_MV_BANK
  uint8_t enable_refmvbank;  // To turn on/off Ref MV Bank
#endif                       // CONFIG_REF_MV_BANK
#if CONFIG_LR_FLEX_SYNTAX
  uint8_t lr_tools_disable_mask[2];  // mask of lr tool(s) to disable.
                                     // To disable tool i in RestorationType
                                     // enum where:
                                     // 1 <= i <= RESTORE_SWITCHABLE_TYPES, set
                                     // the ith bit in least to most significant
                                     // order to 1.
#endif                               // CONFIG_LR_FLEX_SYNTAX
#if CONFIG_PAR_HIDING
  uint8_t enable_parity_hiding;  // To turn on/off PAR_HIDING
#endif                           // CONFIG_PAR_HIDING
#if CONFIG_EXT_RECUR_PARTITIONS
  uint8_t enable_ext_partitions;  // enable extended partitions
#endif                            // CONFIG_EXT_RECUR_PARTITIONS
#if CONFIG_IMPROVED_GLOBAL_MOTION
  bool enable_global_motion;
#endif  // CONFIG_IMPROVED_GLOBAL_MOTION
  BITSTREAM_PROFILE profile;

  // Color config.
  aom_bit_depth_t bit_depth;  // AOM_BITS_8 in profile 0 or 1,
                              // AOM_BITS_10 or AOM_BITS_12 in profile 2 or 3.
  uint8_t monochrome;         // Monochorme video
  aom_color_primaries_t color_primaries;
  aom_transfer_characteristics_t transfer_characteristics;
  aom_matrix_coefficients_t matrix_coefficients;
  int color_range;
  int subsampling_x;  // Chroma subsampling for x
  int subsampling_y;  // Chroma subsampling for y
  aom_chroma_sample_position_t chroma_sample_position;
  uint8_t separate_uv_delta_q;
  int8_t base_y_dc_delta_q;
  int8_t base_uv_dc_delta_q;
  uint8_t film_grain_params_present;

  // Operating point info.
  int operating_points_cnt_minus_1;
  int operating_point_idc[MAX_NUM_OPERATING_POINTS];
  int timing_info_present;
  aom_timing_info_t timing_info;
  uint8_t decoder_model_info_present_flag;
  aom_dec_model_info_t decoder_model_info;
  uint8_t display_model_info_present_flag;
  AV1_LEVEL seq_level_idx[MAX_NUM_OPERATING_POINTS];
  uint8_t tier[MAX_NUM_OPERATING_POINTS];  // seq_tier in spec. One bit: 0 or 1.

  // IMPORTANT: the op_params member must be at the end of the struct so that
  // are_seq_headers_consistent() can be implemented with a memcmp() call.
  // TODO(urvang): We probably don't need the +1 here.
  aom_dec_model_op_parameters_t op_params[MAX_NUM_OPERATING_POINTS + 1];
} SequenceHeader;

typedef struct {
  int skip_mode_allowed;
  int skip_mode_flag;
  int ref_frame_idx_0;
  int ref_frame_idx_1;
} SkipModeInfo;

typedef struct {
  FRAME_TYPE frame_type;
  REFERENCE_MODE reference_mode;

  unsigned int order_hint;
  unsigned int display_order_hint;
  // Frame's level within the hierarchical structure
  unsigned int pyramid_level;
  unsigned int absolute_poc;
  unsigned int key_frame_number;
  unsigned int frame_number;
  SkipModeInfo skip_mode_info;
  int refresh_frame_flags;  // Which ref frames are overwritten by this frame
} CurrentFrame;

/*!\endcond */

/*!
 * \brief Frame level features.
 */
typedef struct {
  /*!
   * If true, CDF update in the symbol encoding/decoding process is disabled.
   */
  bool disable_cdf_update;
#if CONFIG_FLEX_MVRES
  /*!
   * The maximum allowable mv precision of the current frame.
   */
  MvSubpelPrecision fr_mv_precision;
  /*!
   * The most probable mv precision of the current frame.
   */
  MvSubpelPrecision most_probable_fr_mv_precision;
#else
  /*!
   * If true, motion vectors are specified to eighth pel precision; and
   * if false, motion vectors are specified to quarter pel precision.
   */
  bool allow_high_precision_mv;
#endif

  /*!
   * If true, force integer motion vectors; if false, use the default.
   */
  bool cur_frame_force_integer_mv;
#if CONFIG_FLEX_MVRES
  /*!
   * If true, allow the mv precision to be changed at the prediction block
   * level.
   */
  bool use_pb_mv_precision;
#endif  // CONFIG_FLEX_MVRES

  /*!
   * If true, palette tool and/or intra block copy tools may be used.
   */
  bool allow_screen_content_tools;
  bool allow_intrabc; /*!< If true, intra block copy tool may be used. */
#if CONFIG_IBC_SR_EXT
  bool allow_global_intrabc; /*!< If true, intra block copy tool may use the
                               global search range. */
  bool allow_local_intrabc;  /*!< If true, intra block copy tool may use the
                              local  search range. */
#endif                       // CONFIG_IBC_SR_EXT
#if !CONFIG_EXTENDED_WARP_PREDICTION
  bool allow_warped_motion; /*!< If true, frame may use warped motion mode. */
#endif
#if CONFIG_CWG_D067_IMPROVED_WARP
  bool allow_warpmv_mode; /*!< If true, frame may use WARPMV mode. */
#endif                    // CONFIG_CWG_D067_IMPROVED_WARP
  /*!
   * If true, using previous frames' motion vectors for prediction is allowed.
   */
  bool allow_ref_frame_mvs;
  /*!
   * If true, frame is fully lossless at coded resolution.
   * */
  bool coded_lossless;
  /*!
   * If true, frame is fully lossless at upscaled resolution.
   */
  bool all_lossless;
  /*!
   * If true, the frame is restricted to a reduced subset of the full set of
   * transform types.
   */
  bool reduced_tx_set_used;
  /*!
   * If true, error resilient mode is enabled.
   * Note: Error resilient mode allows the syntax of a frame to be parsed
   * independently of previously decoded frames.
   */
  bool error_resilient_mode;
#if !CONFIG_EXTENDED_WARP_PREDICTION
  /*!
   * If false, only MOTION_MODE that may be used is SIMPLE_TRANSLATION;
   * if true, all MOTION_MODES may be used.
   */
  bool switchable_motion_mode;
#endif
  TX_MODE tx_mode;            /*!< Transform mode at frame level. */
  InterpFilter interp_filter; /*!< Interpolation filter at frame level. */
  /*!
   * The reference frame that contains the CDF values and other state that
   * should be loaded at the start of the frame.
   */
  int primary_ref_frame;
  /*!
   * Byte alignment of the planes in the reference buffers.
   */
  int byte_alignment;
  /*!
   * Flag signaling how frame contexts should be updated at the end of
   * a frame decode.
   */
  REFRESH_FRAME_CONTEXT_MODE refresh_frame_context;
  /*!
   * Max_drl_bits. Note number of ref MVs allowed is max_drl_bits + 1
   */
  int max_drl_bits;
#if CONFIG_OPTFLOW_REFINEMENT
  /*!
   * Ternary symbol for optical flow refinement type. 0: do not refine,
   * 1: always refine, 2: switchable at block level.
   */
  OPTFLOW_REFINE_TYPE opfl_refine_type;
#endif  // CONFIG_OPTFLOW_REFINEMENT
#if CONFIG_TIP
  /*!
   * TIP mode.
   */
  TIP_FRAME_MODE tip_frame_mode;
#if CONFIG_OPTFLOW_ON_TIP
  /*!
   * Whether optflow refinement is used for TIP frames
   */
  int use_optflow_tip;
#endif  // CONFIG_OPTFLOW_ON_TIP
  /*!
   * Enables/disables hole fill for TIP
   */
  bool allow_tip_hole_fill;
#endif  // CONFIG_TIP
#if CONFIG_PEF
  /*!
   * Enables/disables prediction enhancement filter
   */
  bool allow_pef;
#endif  // CONFIG_PEF
#if CONFIG_PAR_HIDING
  /*!
   * Enables/disables parity hiding.
   */
  bool allow_parity_hiding;
#endif  // CONFIG_PAR_HIDING
#if CONFIG_BAWP
  /*!
   * Enables/disables block adaptive weighted prediction
   */
  bool enable_bawp;
#endif  // CONFIG_BAWP
#if CONFIG_CWP
  /*!
   * Enables/disables compound weighted prediction
   */
  bool enable_cwp;
#endif  // CONFIG_CWP
#if CONFIG_D071_IMP_MSK_BLD
  /*!
   * Enables/disables implicit masked blending.
   */
  bool enable_imp_msk_bld;
#endif  // CONFIG_D071_IMP_MSK_BLD
#if CONFIG_EXTENDED_WARP_PREDICTION
  /*!
   * Bit mask of enabled motion modes for this frame
   */
  int enabled_motion_modes;
#endif  // CONFIG_EXTENDED_WARP_PREDICTION
#if CONFIG_LR_FLEX_SYNTAX
  /*!
   * mask of lr tool(s) to disable. To disable tool i in RestorationType enum
   * where: * 1 <= i <= RESTORE_SWITCHABLE_TYPES, set the ith bit in least to
   * most ignificant order to 1.
   */
  uint8_t lr_tools_disable_mask[MAX_MB_PLANE];
  /*!
   * Number of lr tools enabled
   */
  int lr_tools_count[MAX_MB_PLANE];
  /*!
   * Number of lr options in switchable mode
   */
  int lr_switchable_tools_count[MAX_MB_PLANE];
  /*!
   * Number of lr modes available at frame level
   */
  int lr_frame_tools_count[MAX_MB_PLANE];
  /*!
   * index of last bit transmitted for convenience. Beyond this index
   * there is exactly one allowed option, and therefore there is no need
   * to signal anything.
   */
  int lr_last_switchable_ndx[MAX_MB_PLANE];
  /*!
   * Restoration Type if last bit transmitted is 0 for convenience. If the
   * last bit (lr_last_switchable_ndx) transmitted is 0, the
   * restoration type is lr_last_switchable_ndx_0_type.
   */
  int lr_last_switchable_ndx_0_type[MAX_MB_PLANE];
#endif  // CONFIG_LR_FLEX_SYNTAX
} FeatureFlags;

/*!
 * \brief Params related to tiles.
 */
typedef struct CommonTileParams {
  int cols;          /*!< number of tile columns that frame is divided into */
  int rows;          /*!< number of tile rows that frame is divided into */
  int max_width_sb;  /*!< maximum tile width in superblock units. */
  int max_height_sb; /*!< maximum tile height in superblock units. */

  /*!
   * Min width of non-rightmost tile in MI units. Only valid if cols > 1.
   */
  int min_inner_width;

  /*!
   * If true, tiles are uniformly spaced with power-of-two number of rows and
   * columns.
   * If false, tiles have explicitly configured widths and heights.
   */
  int uniform_spacing;

  /**
   * \name Members only valid when uniform_spacing == 1
   */
  /**@{*/
  int log2_cols; /*!< log2 of 'cols'. */
  int log2_rows; /*!< log2 of 'rows'. */
  int width;     /*!< tile width in MI units */
  int height;    /*!< tile height in MI units */
  /**@}*/

  /*!
   * Min num of tile columns possible based on 'max_width_sb' and frame width.
   */
  int min_log2_cols;
  /*!
   * Min num of tile rows possible based on 'max_height_sb' and frame height.
   */
  int min_log2_rows;
  /*!
   * Min num of tile columns possible based on frame width.
   */
  int max_log2_cols;
  /*!
   * Max num of tile columns possible based on frame width.
   */
  int max_log2_rows;
  /*!
   * log2 of min number of tiles (same as min_log2_cols + min_log2_rows).
   */
  int min_log2;
  /*!
   * col_start_sb[i] is the start position of tile column i in superblock units.
   * valid for 0 <= i <= cols
   */
  int col_start_sb[MAX_TILE_COLS + 1];
  /*!
   * row_start_sb[i] is the start position of tile row i in superblock units.
   * valid for 0 <= i <= rows
   */
  int row_start_sb[MAX_TILE_ROWS + 1];
  /*!
   * If true, we are using large scale tile mode.
   */
  unsigned int large_scale;
  /*!
   * Only relevant when large_scale == 1.
   * If true, the independent decoding of a single tile or a section of a frame
   * is allowed.
   */
  unsigned int single_tile_decoding;
} CommonTileParams;

typedef struct CommonModeInfoParams CommonModeInfoParams;
/*!
 * \brief Params related to MB_MODE_INFO arrays and related info.
 */
struct CommonModeInfoParams {
  /*!
   * Number of rows in the frame in 16 pixel units.
   * This is computed from frame height aligned to a multiple of 8.
   */
  int mb_rows;
  /*!
   * Number of cols in the frame in 16 pixel units.
   * This is computed from frame width aligned to a multiple of 8.
   */
  int mb_cols;

  /*!
   * Total MBs = mb_rows * mb_cols.
   */
  int MBs;

  /*!
   * Number of rows in the frame in 4 pixel (MB_MODE_INFO) units.
   * This is computed from frame height aligned to a multiple of 8.
   */
  int mi_rows;
  /*!
   * Number of cols in the frame in 4 pixel (MB_MODE_INFO) units.
   * This is computed from frame width aligned to a multiple of 8.
   */
  int mi_cols;

  /*!
   * An array of MB_MODE_INFO structs for every 'mi_alloc_bsize' sized block
   * in the frame.
   * Note: This array should be treated like a scratch memory, and should NOT be
   * accessed directly, in most cases. Please use 'mi_grid_base' array instead.
   */
  MB_MODE_INFO *mi_alloc;
#if CONFIG_C071_SUBBLK_WARPMV
  /*!
   * An array of SUBMB_INFO structs for every 'mi_alloc_bsize' sized block
   * in the frame.
   */
  SUBMB_INFO *mi_alloc_sub;
#endif  // CONFIG_C071_SUBBLK_WARPMV
  /*!
   * Number of allocated elements in 'mi_alloc'.
   */
  int mi_alloc_size;
  /*!
   * Stride for 'mi_alloc' array.
   */
  int mi_alloc_stride;
  /*!
   * The minimum block size that each element in 'mi_alloc' can correspond to.
   * For decoder, this is always BLOCK_4X4.
   * For encoder, this is currently set to BLOCK_4X4 for resolution < 4k,
   * and BLOCK_8X8 for resolution >= 4k.
   */
  BLOCK_SIZE mi_alloc_bsize;

  /*!
   * Grid of pointers to 4x4 MB_MODE_INFO structs allocated in 'mi_alloc'.
   * It's possible that:
   * - Multiple pointers in the grid point to the same element in 'mi_alloc'
   * (for example, for all 4x4 blocks that belong to the same partition block).
   * - Some pointers can be NULL (for example, for blocks outside visible area).
   */
  MB_MODE_INFO **mi_grid_base;
#if CONFIG_C071_SUBBLK_WARPMV
  /*!
   * Grid of pointers to 4x4 SUBMB_INFO structs allocated in 'mi_alloc_sub'.
   */
  SUBMB_INFO **submi_grid_base;
#endif  // CONFIG_C071_SUBBLK_WARPMV
  /*!
   * Number of allocated elements in 'mi_grid_base' (and 'tx_type_map' also).
   */
  int mi_grid_size;
  /*!
   * Stride for 'mi_grid_base' (and 'tx_type_map' also).
   */
  int mi_stride;

  /*!
   * An array of tx types for each 4x4 block in the frame.
   * Number of allocated elements is same as 'mi_grid_size', and stride is
   * same as 'mi_grid_size'. So, indexing into 'tx_type_map' is same as that of
   * 'mi_grid_base'.
   * 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;
#if CONFIG_PC_WIENER
  /*!
   * indicate if a transform block has any non-zero coefficients or not.
   * the buffer is allocated for each 4x4 block
   */
  uint8_t *tx_skip[MAX_MB_PLANE];
  /*!
   * tx_skip buffer allocated for each 4x4 block
   */
  uint32_t tx_skip_buf_size[MAX_MB_PLANE];
  /*!
   * tx_skip stride
   */
  uint32_t tx_skip_stride[MAX_MB_PLANE];
  /*!
   * Buffer that stores pc-wiener classification information.
   */
  uint8_t *wiener_class_id[MAX_MB_PLANE];
  /*!
   * wiener_class_id stride
   */
  uint32_t wiener_class_id_stride[MAX_MB_PLANE];
#endif  // CONFIG_PC_WIENER
#if CONFIG_CROSS_CHROMA_TX
  /*!
   * An array of cctx types for each 4x4 block in the frame.
   * Number of allocated elements is same as 'mi_grid_size', and stride is
   * same as 'mi_grid_size'. So, indexing into 'tx_type_map' is same as that of
   * 'mi_grid_base'.
   */
  CctxType *cctx_type_map;
#endif  // CONFIG_CROSS_CHROMA_TX

#if CONFIG_2D_SR_SET_TX_SKIP_ZERO
  uint8_t superres_scale_denominator;
  int frm_width, frm_height;
#endif

  /**
   * \name Function pointers to allow separate logic for encoder and decoder.
   */
  /**@{*/
  /*!
   * Free the memory allocated to arrays in 'mi_params'.
   * \param[in,out]   mi_params   object containing common mode info parameters
   */
  void (*free_mi)(struct CommonModeInfoParams *mi_params);
  /*!
   * Initialize / reset appropriate arrays in 'mi_params'.
   * \param[in,out]   mi_params   object containing common mode info parameters
   */
  void (*setup_mi)(struct CommonModeInfoParams *mi_params);
  /*!
   * Allocate required memory for arrays in 'mi_params'.
   * \param[in,out]   mi_params   object containing common mode info parameters
   * \param           width       frame width
   * \param           height      frame height
   */
  void (*set_mb_mi)(struct CommonModeInfoParams *mi_params, int width,
                    int height);
  /**@}*/
};

/*!
 * \brief Params related to SB_INFO arrays and related info.
 */
typedef struct CommonSBInfoParams {
  /*!
   * Grid of pointers to SB_INFO structs.
   */
  SB_INFO *sbi_grid_base;
  /*!
   * Stride for 'sbi_grid_base'.
   */
  int sbi_stride;
  /*!
   * Number of superblocks in the vertical direction.
   */
  int sb_rows;
  /*!
   * Number of superblocks in the horizontal direction.
   */
  int sb_cols;
  /*!
   * Number of SB_INFO structs that are currently allocated.
   */
  int sbi_alloc_size;
} CommonSBInfoParams;

typedef struct CommonQuantParams CommonQuantParams;
/*!
 * \brief Parameters related to quantization at the frame level.
 */
struct CommonQuantParams {
  /*!
   * Base qindex of the frame in the range 0 to 255.
   */
  int base_qindex;

  /*!
   * Delta of qindex (from base_qindex) for Y plane DC coefficient.
   * Note: y_ac_delta_q is implicitly 0.
   */
  int y_dc_delta_q;

  /*!
   * Delta of qindex (from base_qindex) for U plane DC coefficients.
   */
  int u_dc_delta_q;
  /*!
   * Delta of qindex (from base_qindex) for U plane AC coefficients.
   */
  int v_dc_delta_q;

  /*!
   * Delta of qindex (from base_qindex) for V plane DC coefficients.
   * Same as those for U plane if cm->seq_params.separate_uv_delta_q == 0.
   */
  int u_ac_delta_q;
  /*!
   * Delta of qindex (from base_qindex) for V plane AC coefficients.
   * Same as those for U plane if cm->seq_params.separate_uv_delta_q == 0.
   */
  int v_ac_delta_q;

  /*
   * Note: The qindex per superblock may have a delta from the qindex obtained
   * at frame level from parameters above, based on 'cm->delta_q_info'.
   */

  /**
   * \name True dequantizers.
   * The dequantizers below are true dequantizers used only in the
   * dequantization process.  They have the same coefficient
   * shift/scale as TX.
   */
  /**@{*/
  int32_t y_dequant_QTX[MAX_SEGMENTS][2]; /*!< Dequant for Y plane */
  int32_t u_dequant_QTX[MAX_SEGMENTS][2]; /*!< Dequant for U plane */
  int32_t v_dequant_QTX[MAX_SEGMENTS][2]; /*!< Dequant for V plane */
  /**@}*/

  /**
   * \name Global quantization matrix tables.
   */
  /**@{*/
  /*!
   * Global dquantization matrix table.
   */
  const qm_val_t *giqmatrix[NUM_QM_LEVELS][3][TX_SIZES_ALL];
  /*!
   * Global quantization matrix table.
   */
  const qm_val_t *gqmatrix[NUM_QM_LEVELS][3][TX_SIZES_ALL];
  /**@}*/

  /**
   * \name Local dequantization matrix tables for each frame.
   */
  /**@{*/
  /*!
   * Local dequant matrix for Y plane.
   */
  const qm_val_t *y_iqmatrix[MAX_SEGMENTS][TX_SIZES_ALL];
  /*!
   * Local dequant matrix for U plane.
   */
  const qm_val_t *u_iqmatrix[MAX_SEGMENTS][TX_SIZES_ALL];
  /*!
   * Local dequant matrix for V plane.
   */
  const qm_val_t *v_iqmatrix[MAX_SEGMENTS][TX_SIZES_ALL];
  /**@}*/

  /*!
   * Flag indicating whether quantization matrices are being used:
   *  - If true, qm_level_y, qm_level_u and qm_level_v indicate the level
   *    indices to be used to access appropriate global quant matrix tables.
   *  - If false, we implicitly use level index 'NUM_QM_LEVELS - 1'.
   */
  bool using_qmatrix;
  /**
   * \name Valid only when using_qmatrix == true
   * Indicate the level indices to be used to access appropriate global quant
   * matrix tables.
   */
  /**@{*/
  int qmatrix_level_y; /*!< Level index for Y plane */
  int qmatrix_level_u; /*!< Level index for U plane */
  int qmatrix_level_v; /*!< Level index for V plane */
  /**@}*/
};

typedef struct CommonContexts CommonContexts;
/*!
 * \brief Contexts used for transmitting various symbols in the bitstream.
 */
struct CommonContexts {
  /*!
   * Context used by 'FRAME_CONTEXT.partition_cdf' to transmit partition type.
   * partition[i][j] is the context for ith tile row, jth mi_col.
   */
  PARTITION_CONTEXT **partition[MAX_MB_PLANE];

  /*!
   * Context used to derive context for multiple symbols:
   * - 'TXB_CTX.txb_skip_ctx' used by 'FRAME_CONTEXT.txb_skip_cdf' to transmit
   * to transmit skip_txfm flag.
   * - 'TXB_CTX.dc_sign_ctx' used by 'FRAME_CONTEXT.dc_sign_cdf' to transmit
   * sign.
   * entropy[i][j][k] is the context for ith plane, jth tile row, kth mi_col.
   */
  ENTROPY_CONTEXT **entropy[MAX_MB_PLANE];

  /*!
   * Context used to derive context for 'FRAME_CONTEXT.txfm_partition_cdf' to
   * transmit 'is_split' flag to indicate if this transform block should be
   * split into smaller sub-blocks.
   * txfm[i][j] is the context for ith tile row, jth mi_col.
   */
  TXFM_CONTEXT **txfm;

  /*!
   * Dimensions that were used to allocate the arrays above.
   * If these dimensions change, the arrays may have to be re-allocated.
   */
  int num_planes;    /*!< Corresponds to av1_num_planes(cm) */
  int num_tile_rows; /*!< Corresponds to cm->tiles.row */
  int num_mi_cols;   /*!< Corresponds to cm->mi_params.mi_cols */
};

#if CONFIG_THROUGHPUT_ANALYSIS
struct total_sym_stats {
  /** Frame number (decoding order)*/
  int frame_dec_order;
  /** Total number of bits*/
  int64_t tot_bits;
  /** total ctx coded symbols. */
  int64_t tot_ctx_syms;
  /** total bypass coded symbols. */
  int64_t tot_bypass_syms;
  /** peak ctx coded symbols. */
  int peak_ctx_syms;
  /** peak bypass coded symbols. */
  int peak_bypass_syms;
  /** peak bits. */
  int peak_bits;
};
#endif  // CONFIG_THROUGHPUT_ANALYSIS

/*!
 * \brief Structure to contain information about the reference frame mapping
 * scheme.
 */
typedef struct {
  /*!
   * Distance of ref frame from current frame. Negative value indicates
   * reference in the future, and positive value indicates reference in
   * the past from the current frame
   */
  int ref_frame_distance[INTER_REFS_PER_FRAME];
  /*!
   * Total number of reference buffers available to the current frame.
   */
  int num_total_refs;
  /*!
   * Contains the indices of the frames in ref_frame_map that are future
   * references.
   */
  int future_refs[INTER_REFS_PER_FRAME];
  /*!
   * Number of future references.
   */
  int num_future_refs;
  /*!
   * Contains the indices of the frames in ref_frame_map that are past
   * references.
   */
  int past_refs[INTER_REFS_PER_FRAME];
  /*!
   * Number of past references.
   */
  int num_past_refs;
  /*!
   * Contains the indices of the frames in ref_frame_map with same order hint
   * as current frame. -1 if unset.
   */
  int cur_refs[INTER_REFS_PER_FRAME];
  /*!
   * Number of references with the same order hint.
   */
  int num_cur_refs;
#if CONFIG_ALLOW_SAME_REF_COMPOUND
  /*!
   * Number of references for the compound mode with the same slot.
   */
  int num_same_ref_compound;
#endif  // CONFIG_ALLOW_SAME_REF_COMPOUND
} RefFramesInfo;

#if CONFIG_TIP
/*!
 * \brief Structure used for storing tip reconstruct and prediction
 */
typedef struct {
  /** dst buffer */
  struct buf_2d dst;
  /** pred buffer */
  struct buf_2d pred[2];
} TIP_PLANE;

/*!
 * \brief Structure used for tip
 */
typedef struct TIP_Buffer {
  /*!
   * Buffer into which the interpolated tip frame will be stored and other
   * related info.
   */
  RefCntBuffer *tip_frame;
  /*!
   * Info specific to each plane.
   */
  TIP_PLANE tip_plane[MAX_MB_PLANE];
  /*!
   * Offset of TIP frame to its reference frame.
   */
  int ref_offset[2];
  /*!
   * Order hint of TIP's reference frames.
   */
  int ref_order_hint[2];
  /*!
   * Reference frame type of TIP's reference frames.
   */
  MV_REFERENCE_FRAME ref_frame[2];
  /*!
   * Buffer where TIP's reference frame is stored.
   */
  RefCntBuffer *ref_frame_buffer[2];
  /*!
   * Temporal scaling factor of the frame offset between current frame to one of
   * TIP's reference frame with respect to the frame offset between TIP's two
   * reference frames.
   */
  int ref_frames_offset_sf[2];
  /*!
   * Frame offset between TIP's two reference frames.
   */
  int ref_frames_offset;
  /*!
   * Scale factors of the reference frame with respect to the current frame.
   * This is required for generating inter prediction and will be non-identity
   * for a reference frame, if it has different dimensions than the coded
   * dimensions of the current frame.
   */
  const struct scale_factors *ref_scale_factor[2];
  /*!
   * Scale factors of tip frame.
   */
  struct scale_factors scale_factor;
  /*!
   * Buffer into which the scaled interpolated tip frame will be stored and
   * other related info. This is required for generating inter prediction and
   * will be non-identity for a reference frame, if it has different dimensions
   * than the coded dimensions of the current frame.
   */
  RefCntBuffer *scaled_tip_frame;
#if CONFIG_ALLOW_TIP_DIRECT_WITH_SUPERRES
  /*!
   * Buffer into which the upscaled interpolated tip frame will be stored and
   * other related info. This is required for generating and upscaled version
   * of the tip_ref frame for use in the case when super-res is used.
   */
  YV12_BUFFER_CONFIG upscaled_tip_frame_buf;
#endif  // CONFIG_ALLOW_TIP_DIRECT_WITH_SUPERRES
  /*!
   * Check a block is already interpolated
   */
  int *available_flag;
  /*!
   * Check the motion field of TIP block is within the frame
   */
  int *mf_need_clamp;
} TIP;
#endif  // CONFIG_TIP

/*!
 * \brief Top level common structure used by both encoder and decoder.
 */
typedef struct AV1Common {
#if CONFIG_THROUGHPUT_ANALYSIS
  /*!
   * Symbol stats.
   */
  struct total_sym_stats sym_stats;
#endif  // CONFIG_THROUGHPUT_ANALYSIS
  /*!
   * Bitmask indicating which reference buffers may be referenced by this frame.
   */
  int ref_frame_flags;

  /*!
   * Information about the current frame that is being coded.
   */
  CurrentFrame current_frame;
  /*!
   * Code and details about current error status.
   */
  struct aom_internal_error_info error;

  /*!
   * AV1 allows two types of frame scaling operations:
   * 1. Frame super-resolution: that allows coding a frame at lower resolution
   * and after decoding the frame, normatively uscales and restores the frame --
   * inside the coding loop.
   * 2. Frame resize: that allows coding frame at lower/higher resolution, and
   * then non-normatively upscale the frame at the time of rendering -- outside
   * the coding loop.
   * Hence, the need for 3 types of dimensions.
   */

  /**
   * \name Coded frame dimensions.
   */
  /**@{*/
  int width;  /*!< Coded frame width */
  int height; /*!< Coded frame height */
  /**@}*/

  /**
   * \name Rendered frame dimensions.
   * Dimensions after applying both super-resolution and resize to the coded
   * frame. Different from coded dimensions if super-resolution and/or resize
   * are being used for this frame.
   */
  /**@{*/
  int render_width;  /*!< Rendered frame width */
  int render_height; /*!< Rendered frame height */
  /**@}*/

  /**
   * \name Super-resolved frame dimensions.
   * Frame dimensions after applying super-resolution to the coded frame (if
   * present), but before applying resize.
   * Larger than the coded dimensions if super-resolution is being used for
   * this frame.
   * Different from rendered dimensions if resize is being used for this frame.
   */
  /**@{*/
  int superres_upscaled_width;  /*!< Super-resolved frame width */
  int superres_upscaled_height; /*!< Super-resolved frame height */
  /**@}*/

#if CONFIG_2D_SR
  /**
   * \name Super-resolution scaling factor information.
   * The index, numerator, and denominator of the superres scale used by this
   * frame.
   */
  /**@{*/
  uint8_t superres_scale_index;       /*!< Superres scaling index */
  uint8_t superres_scale_numerator;   /*!< Superres scaling numerator */
  uint8_t superres_scale_denominator; /*!< Superres scaling denominator */
  /**@}*/
#else   // CONFIG_2D_SR
  /*!
   * The denominator of the superres scale used by this frame.
   * Note: The numerator is fixed to be SCALE_NUMERATOR.
   */
  uint8_t superres_scale_denominator;
#endif  // CONFIG_2D_SR

  /*!
   * If true, buffer removal times are present.
   */
  bool buffer_removal_time_present;
  /*!
   * buffer_removal_times[op_num] specifies the frame removal time in units of
   * DecCT clock ticks counted from the removal time of the last random access
   * point for operating point op_num.
   * TODO(urvang): We probably don't need the +1 here.
   */
  uint32_t buffer_removal_times[MAX_NUM_OPERATING_POINTS + 1];
  /*!
   * Presentation time of the frame in clock ticks DispCT counted from the
   * removal time of the last random access point for the operating point that
   * is being decoded.
   */
  uint32_t frame_presentation_time;

  /*!
   * Buffer where previous frame is stored.
   */
  RefCntBuffer *prev_frame;

  /*!
   * Buffer into which the current frame will be stored and other related info.
   * TODO(hkuang): Combine this with cur_buf in macroblockd.
   */
  RefCntBuffer *cur_frame;

  /*!
   * An alternative to remapped_ref_idx (above) which contains a mapping to
   * ref_frame_map[] according to a "usefulness" score. It also contains all
   * other relevant data to aid the reference mapping and signaling.
   */
  RefFramesInfo ref_frames_info;
  /*!
   * For encoder, we have a two-level mapping from reference frame type to the
   * corresponding buffer in the buffer pool:
   * * 'remapped_ref_idx[i - 1]' maps reference type 'i' (range: 0 ...
   * INTER_REFS_PER_FRAME - 1) to a remapped index 'j' in the same range.
   * * Later, 'cm->ref_frame_map[j]' maps the remapped index 'j' to a pointer to
   * the reference counted buffer structure RefCntBuffer, taken from the buffer
   * pool cm->buffer_pool->frame_bufs.
   *
   *      0,               ...,            INTER_REFS_PER_FRAME - 1
   *      |                                           |
   *      v                                           v
   * remapped_ref_idx[0],  ...,     remapped_ref_idx[INTER_REFS_PER_FRAME- 1]
   *      |                                           |
   *      v                                           v
   * ref_frame_map[],      ...,                ref_frame_map[]
   *
   * Note: INTRA_FRAME always refers to the current frame, so there's no need to
   * have a remapped index for the same.
   */
  int remapped_ref_idx[REF_FRAMES];

  /*!
   * Scale of the current frame with respect to itself.
   * This is currently used for intra block copy, which behaves like an inter
   * prediction mode, where the reference frame is the current frame itself.
   */
  struct scale_factors sf_identity;

  /*!
   * Scale factors of the reference frame with respect to the current frame.
   * This is required for generating inter prediction and will be non-identity
   * for a reference frame, if it has different dimensions than the coded
   * dimensions of the current frame.
   */
  struct scale_factors ref_scale_factors[REF_FRAMES];

  /*!
   * For decoder, ref_frame_map[i] maps reference type 'i' to a pointer to
   * the buffer in the buffer pool 'cm->buffer_pool.frame_bufs'.
   * For encoder, ref_frame_map[j] (where j = remapped_ref_idx[i]) maps
   * remapped reference index 'j' (that is, original reference type 'i') to
   * a pointer to the buffer in the buffer pool 'cm->buffer_pool.frame_bufs'.
   */
  RefCntBuffer *ref_frame_map[REF_FRAMES];

  /*!
   * If true, this frame is actually shown after decoding.
   * If false, this frame is coded in the bitstream, but not shown. It is only
   * used as a reference for other frames coded later.
   */
  int show_frame;

  /*!
   * If true, this frame can be used as a show-existing frame for other frames
   * coded later.
   * When 'show_frame' is true, this is always true for all non-keyframes.
   * When 'show_frame' is false, this value is transmitted in the bitstream.
   */
  int showable_frame;

  /*!
   * If true, show an existing frame coded before, instead of actually coding a
   * frame. The existing frame comes from one of the existing reference buffers,
   * as signaled in the bitstream.
   */
  int show_existing_frame;

  /*!
   * Whether some features are allowed or not.
   */
  FeatureFlags features;

  /*!
   * Params related to MB_MODE_INFO arrays and related info.
   */
  CommonModeInfoParams mi_params;

  /*!
   * Params related to SB_INFO arrays and related info.
   */
  CommonSBInfoParams sbi_params;

#if CONFIG_ENTROPY_STATS
  /*!
   * Context type used by token CDFs, in the range 0 .. (TOKEN_CDF_Q_CTXS - 1).
   */
  int coef_cdf_category;
#endif  // CONFIG_ENTROPY_STATS

  /*!
   * Quantization params.
   */
  CommonQuantParams quant_params;

  /*!
   * Segmentation info for current frame.
   */
  struct segmentation seg;

  /*!
   * Segmentation map for previous frame.
   */
  uint8_t *last_frame_seg_map;

  /**
   * \name Deblocking filter parameters.
   */
  /**@{*/
  loop_filter_info_n lf_info; /*!< Loop filter info */
  struct loopfilter lf;       /*!< Loop filter parameters */
  /**@}*/

#if CONFIG_PEF
  /**
   * \name Prediction enhancement filter parameters.
   */
  /**@{*/
  PefInfo pef_info;     /*!< Prediction enhancement filter info*/
  PefParams pef_params; /*!< Prediction enhancement filter parameters*/
  /**@}*/
#endif  // CONFIG_PEF

  /**
   * \name Loop Restoration filter parameters.
   */
  /**@{*/
  RestorationInfo rst_info[MAX_MB_PLANE]; /*!< Loop Restoration filter info */
  int32_t *rst_tmpbuf; /*!< Scratch buffer for self-guided restoration */
  RestorationLineBuffers *rlbs; /*!< Line buffers needed by loop restoration */
  YV12_BUFFER_CONFIG rst_frame; /*!< Stores the output of loop restoration */
#if CONFIG_HIGH_PASS_CROSS_WIENER_FILTER
  YV12_BUFFER_CONFIG pre_rst_frame; /*!< Stores the reconstructed frame before
                                       loop restoration, only used by encoder,
                                       to be moved to encoder buffer */
#endif                              // CONFIG_HIGH_PASS_CROSS_WIENER_FILTER
  /**@}*/

  /*!
   * CDEF (Constrained Directional Enhancement Filter) parameters.
   */
  CdefInfo cdef_info;

#if CONFIG_CCSO
  /*!
   * CCSO (Cross Component Sample Offset) parameters.
   */
  CcsoInfo ccso_info;
#endif

  /*!
   * Parameters for film grain synthesis.
   */
  aom_film_grain_t film_grain_params;

  /*!
   * Parameters for delta quantization and delta loop filter level.
   */
  DeltaQInfo delta_q_info;

#if CONFIG_IMPROVED_GLOBAL_MOTION
  /*!
   * Base model used for delta-coding global motion parameters
   */
  WarpedMotionParams base_global_motion_model;

  /*!
   * Temporal length of `base_global_motion_model`
   */
  int base_global_motion_distance;
#endif  // CONFIG_IMPROVED_GLOBAL_MOTION

  /*!
   * Global motion parameters for each reference frame.
   */
  WarpedMotionParams global_motion[INTER_REFS_PER_FRAME];

  /*!
   * Elements part of the sequence header, that are applicable for all the
   * frames in the video.
   */
  SequenceHeader seq_params;

  /*!
   * Current CDFs of all the symbols for the current frame.
   */
  FRAME_CONTEXT *fc;
  /*!
   * Default CDFs used when features.primary_ref_frame = PRIMARY_REF_NONE
   * (e.g. for a keyframe). These default CDFs are defined by the bitstream and
   * copied from default CDF tables for each symbol.
   */
  FRAME_CONTEXT *default_frame_context;

  /*!
   * Parameters related to tiling.
   */
  CommonTileParams tiles;

  /*!
   * External BufferPool passed from outside.
   */
  BufferPool *buffer_pool;

  /*!
   * Above context buffers and their sizes.
   * Note: above contexts are allocated in this struct, as their size is
   * dependent on frame width, while left contexts are declared and allocated in
   * MACROBLOCKD struct, as they have a fixed size.
   */
  CommonContexts above_contexts;

  /**
   * \name Signaled when cm->seq_params.frame_id_numbers_present_flag == 1
   */
  /**@{*/
  int current_frame_id;         /*!< frame ID for the current frame. */
  int ref_frame_id[REF_FRAMES]; /*!< frame IDs for the reference frames. */
  /**@}*/

  /*!
   * Motion vectors provided by motion field estimation.
   * tpl_mvs[row * stride + col] stores MV for block at [mi_row, mi_col] where:
   * mi_row = 2 * row,
   * mi_col = 2 * col, and
   * stride = cm->mi_params.mi_stride / 2
   */
  TPL_MV_REF *tpl_mvs;
  /*!
   * Allocated size of 'tpl_mvs' array. Refer to 'ensure_mv_buffer()' function.
   */
  int tpl_mvs_mem_size;
  /*!
   * ref_frame_sign_bias[k] is 1 if relative distance between reference 'k' and
   * current frame is positive; and 0 otherwise.
   */
  int ref_frame_sign_bias[INTER_REFS_PER_FRAME];
  /*!
   * ref_frame_side[k] is 1 if relative distance between reference 'k' and
   * current frame is positive, -1 if relative distance is 0; and 0 otherwise.
   * TODO(jingning): This can be combined with sign_bias later.
   */
  int8_t ref_frame_side[INTER_REFS_PER_FRAME];
#if CONFIG_MVP_IMPROVEMENT || CONFIG_JOINT_MVD
  /*!
   * relative distance between reference 'k' and current frame.
   */
  int ref_frame_relative_dist[REF_FRAMES];
#endif  // CONFIG_MVP_IMPROVEMENT || CONFIG_JOINT_MVD
  /*!
   * Number of temporal layers: may be > 1 for SVC (scalable vector coding).
   */
  unsigned int number_temporal_layers;
  /*!
   * Temporal layer ID of this frame
   * (in the range 0 ... (number_temporal_layers - 1)).
   */
  int temporal_layer_id;

  /*!
   * Number of spatial layers: may be > 1 for SVC (scalable vector coding).
   */
  unsigned int number_spatial_layers;
  /*!
   * Spatial layer ID of this frame
   * (in the range 0 ... (number_spatial_layers - 1)).
   */
  int spatial_layer_id;

  /*!
   * Weights for IBP of directional modes.
   */
  uint8_t *ibp_directional_weights[TX_SIZES_ALL][DIR_MODES_0_90];

#if TXCOEFF_TIMER
  int64_t cum_txcoeff_timer;
  int64_t txcoeff_timer;
  int txb_count;
#endif  // TXCOEFF_TIMER

#if TXCOEFF_COST_TIMER
  int64_t cum_txcoeff_cost_timer;
  int64_t txcoeff_cost_timer;
  int64_t txcoeff_cost_count;
#endif  // TXCOEFF_COST_TIMER

#if CONFIG_LPF_MASK
  int is_decoding;
#endif  // CONFIG_LPF_MASK

#if DEBUG_EXTQUANT
  FILE *fEncCoeffLog;
  FILE *fDecCoeffLog;
#endif

#if CONFIG_TIP
  /*!
   * Flag to indicate if current frame has backward ref frame
   */
  int has_bwd_ref;
  /*!
   * TIP reference frame
   */
  TIP tip_ref;

#if CONFIG_OPTFLOW_ON_TIP
  /*!
   * Blk buffer of the first reference for tip optflow
   */
  uint16_t *dst0_16_tip;
  /*!
   * Blk buffer of the second reference for tip optflow
   */
  uint16_t *dst1_16_tip;
  /*!
   * Buffer of horizontal gradient in buffer 0
   */
  int16_t *gx0;
  /*!
   * Buffer of vertical gradient in buffer 0
   */
  int16_t *gy0;
  /*!
   * Buffer of horizontal gradient in buffer 1
   */
  int16_t *gx1;
  /*!
   * Buffer of vertical gradient in buffer 1
   */
  int16_t *gy1;
#endif  // CONFIG_OPTFLOW_ON_TIP
#endif  // CONFIG_TIP

#if CONFIG_INSPECTION
  YV12_BUFFER_CONFIG predicted_pixels;
  YV12_BUFFER_CONFIG prefiltered_pixels;
#endif  // CONFIG_INSPECTION
} AV1_COMMON;

/*!\cond */

#if CONFIG_PC_WIENER
#define ILLEGAL_TXK_SKIP_VALUE 255
void av1_alloc_txk_skip_array(CommonModeInfoParams *mi_params, AV1_COMMON *cm);
void av1_dealloc_txk_skip_array(CommonModeInfoParams *mi_params);
void av1_reset_txk_skip_array(AV1_COMMON *cm);
void av1_reset_txk_skip_array_using_mi_params(CommonModeInfoParams *mi_params);
void av1_init_txk_skip_array(const AV1_COMMON *cm, int mi_row, int mi_col,
                             BLOCK_SIZE bsize, uint8_t value,
                             TREE_TYPE tree_type,
                             const CHROMA_REF_INFO *chroma_ref_info,
                             int plane_start, int plane_end);
void av1_update_txk_skip_array(const AV1_COMMON *cm, int mi_row, int mi_col,
                               TREE_TYPE tree_type,
                               const CHROMA_REF_INFO *chroma_ref_info,
                               int plane, int blk_row, int blk_col,
                               TX_SIZE tx_size);
uint8_t av1_get_txk_skip(const AV1_COMMON *cm, int mi_row, int mi_col,
                         int plane, int blk_row, int blk_col);
void av1_alloc_class_id_array(CommonModeInfoParams *mi_params, AV1_COMMON *cm);
void av1_dealloc_class_id_array(CommonModeInfoParams *mi_params);
#endif  // CONFIG_PC_WIENER

// TODO(hkuang): Don't need to lock the whole pool after implementing atomic
// frame reference count.
static void lock_buffer_pool(BufferPool *const pool) {
#if CONFIG_MULTITHREAD
  pthread_mutex_lock(&pool->pool_mutex);
#else
  (void)pool;
#endif
}

static void unlock_buffer_pool(BufferPool *const pool) {
#if CONFIG_MULTITHREAD
  pthread_mutex_unlock(&pool->pool_mutex);
#else
  (void)pool;
#endif
}

static INLINE YV12_BUFFER_CONFIG *get_ref_frame(AV1_COMMON *cm, int index) {
#if CONFIG_TIP
  if (is_tip_ref_frame(index)) return &cm->tip_ref.tip_frame->buf;
#endif  // CONFIG_TIP
  if (index < 0 || index >= REF_FRAMES) return NULL;
  if (cm->ref_frame_map[index] == NULL) return NULL;
  return &cm->ref_frame_map[index]->buf;
}

static INLINE int get_free_fb(AV1_COMMON *cm) {
  RefCntBuffer *const frame_bufs = cm->buffer_pool->frame_bufs;
  int i;

  lock_buffer_pool(cm->buffer_pool);
  for (i = 0; i < FRAME_BUFFERS; ++i)
    if (frame_bufs[i].ref_count == 0) break;

  if (i != FRAME_BUFFERS) {
    if (frame_bufs[i].buf.use_external_reference_buffers) {
      // If this frame buffer's y_buffer, u_buffer, and v_buffer point to the
      // external reference buffers. Restore the buffer pointers to point to the
      // internally allocated memory.
      YV12_BUFFER_CONFIG *ybf = &frame_bufs[i].buf;
      ybf->y_buffer = ybf->store_buf_adr[0];
      ybf->u_buffer = ybf->store_buf_adr[1];
      ybf->v_buffer = ybf->store_buf_adr[2];
      ybf->use_external_reference_buffers = 0;
    }

    frame_bufs[i].ref_count = 1;
  } else {
    // We should never run out of free buffers. If this assertion fails, there
    // is a reference leak.
    assert(0 && "Ran out of free frame buffers. Likely a reference leak.");
    // Reset i to be INVALID_IDX to indicate no free buffer found.
    i = INVALID_IDX;
  }

  unlock_buffer_pool(cm->buffer_pool);
  return i;
}

static INLINE RefCntBuffer *assign_cur_frame_new_fb(AV1_COMMON *const cm) {
  // Release the previously-used frame-buffer
  if (cm->cur_frame != NULL) {
    --cm->cur_frame->ref_count;
    cm->cur_frame = NULL;
  }

  // Assign a new framebuffer
  const int new_fb_idx = get_free_fb(cm);
  if (new_fb_idx == INVALID_IDX) return NULL;

  cm->cur_frame = &cm->buffer_pool->frame_bufs[new_fb_idx];
  cm->cur_frame->buf.buf_8bit_valid = 0;
  av1_zero(cm->cur_frame->interp_filter_selected);
  av1_zero(cm->cur_frame->raw_frame_hash);
  av1_zero(cm->cur_frame->grain_frame_hash);
  return cm->cur_frame;
}

// Modify 'lhs_ptr' to reference the buffer at 'rhs_ptr', and update the ref
// counts accordingly.
static INLINE void assign_frame_buffer_p(RefCntBuffer **lhs_ptr,
                                         RefCntBuffer *rhs_ptr) {
  RefCntBuffer *const old_ptr = *lhs_ptr;
  if (old_ptr != NULL) {
    assert(old_ptr->ref_count > 0);
    // One less reference to the buffer at 'old_ptr', so decrease ref count.
    --old_ptr->ref_count;
  }

  *lhs_ptr = rhs_ptr;
  // One more reference to the buffer at 'rhs_ptr', so increase ref count.
  ++rhs_ptr->ref_count;
}

static INLINE int frame_is_intra_only(const AV1_COMMON *const cm) {
  return cm->current_frame.frame_type == KEY_FRAME ||
         cm->current_frame.frame_type == INTRA_ONLY_FRAME;
}

static INLINE int frame_is_sframe(const AV1_COMMON *cm) {
  return cm->current_frame.frame_type == S_FRAME;
}

static INLINE int get_ref_frame_map_idx(const AV1_COMMON *const cm,
                                        const int ref_frame) {
  return (ref_frame >= 0 && ref_frame < REF_FRAMES)
             ? cm->remapped_ref_idx[ref_frame]
             : INVALID_IDX;
}

static INLINE RefCntBuffer *get_ref_frame_buf(
    const AV1_COMMON *const cm, const MV_REFERENCE_FRAME ref_frame) {
#if CONFIG_TIP
  if (is_tip_ref_frame(ref_frame)) {
    return cm->tip_ref.tip_frame;
  }
#endif  // CONFIG_TIP
  const int map_idx = get_ref_frame_map_idx(cm, ref_frame);
  return (map_idx != INVALID_IDX) ? cm->ref_frame_map[map_idx] : NULL;
}

// Both const and non-const versions of this function are provided so that it
// can be used with a const AV1_COMMON if needed.
static INLINE const struct scale_factors *get_ref_scale_factors_const(
    const AV1_COMMON *const cm, const MV_REFERENCE_FRAME ref_frame) {
#if CONFIG_TIP
  if (is_tip_ref_frame(ref_frame)) {
    return &cm->tip_ref.scale_factor;
  }
#endif  // CONFIG_TIP
  const int map_idx = get_ref_frame_map_idx(cm, ref_frame);
  return (map_idx != INVALID_IDX) ? &cm->ref_scale_factors[map_idx] : NULL;
}

static INLINE struct scale_factors *get_ref_scale_factors(
    AV1_COMMON *const cm, const MV_REFERENCE_FRAME ref_frame) {
#if CONFIG_TIP
  if (is_tip_ref_frame(ref_frame)) {
    return &cm->tip_ref.scale_factor;
  }
#endif  // CONFIG_TIP
  const int map_idx = get_ref_frame_map_idx(cm, ref_frame);
  return (map_idx != INVALID_IDX) ? &cm->ref_scale_factors[map_idx] : NULL;
}

static INLINE RefCntBuffer *get_primary_ref_frame_buf(
    const AV1_COMMON *const cm) {
  const int primary_ref_frame = cm->features.primary_ref_frame;
  if (primary_ref_frame == PRIMARY_REF_NONE) return NULL;
#if CONFIG_TIP
  if (is_tip_ref_frame(primary_ref_frame)) {
    return cm->tip_ref.tip_frame;
  }
#endif  // CONFIG_TIP
  const int map_idx = get_ref_frame_map_idx(cm, primary_ref_frame);
  return (map_idx != INVALID_IDX) ? cm->ref_frame_map[map_idx] : NULL;
}

// Returns 1 if this frame might allow mvs from some reference frame.
static INLINE int frame_might_allow_ref_frame_mvs(const AV1_COMMON *cm) {
  return !cm->features.error_resilient_mode &&
         cm->seq_params.order_hint_info.enable_ref_frame_mvs &&
         cm->seq_params.order_hint_info.enable_order_hint &&
         !frame_is_intra_only(cm);
}

#if !CONFIG_EXTENDED_WARP_PREDICTION
// Returns 1 if this frame might use warped_motion
static INLINE int frame_might_allow_warped_motion(const AV1_COMMON *cm) {
  return !cm->features.error_resilient_mode && !frame_is_intra_only(cm) &&
         cm->seq_params.enable_warped_motion;
}
#endif  // !CONFIG_EXTENDED_WARP_PREDICTION

static INLINE void ensure_mv_buffer(RefCntBuffer *buf, AV1_COMMON *cm) {
  const int buf_rows = buf->mi_rows;
  const int buf_cols = buf->mi_cols;
  const CommonModeInfoParams *const mi_params = &cm->mi_params;

#if CONFIG_TIP
  const int tpl_rows = ROUND_POWER_OF_TWO(mi_params->mi_rows, TMVP_SHIFT_BITS);
  const int tpl_cols = ROUND_POWER_OF_TWO(mi_params->mi_cols, TMVP_SHIFT_BITS);
  const int mem_size = tpl_rows * tpl_cols;
#endif  // CONFIG_TIP

  if (buf->mvs == NULL || buf_rows != mi_params->mi_rows ||
      buf_cols != mi_params->mi_cols) {
    aom_free(buf->mvs);
    buf->mi_rows = mi_params->mi_rows;
    buf->mi_cols = mi_params->mi_cols;
#if CONFIG_TIP
    CHECK_MEM_ERROR(cm, buf->mvs,
                    (MV_REF *)aom_calloc(mem_size, sizeof(*buf->mvs)));
#else
    CHECK_MEM_ERROR(cm, buf->mvs,
                    (MV_REF *)aom_calloc(((mi_params->mi_rows + 1) >> 1) *
                                             ((mi_params->mi_cols + 1) >> 1),
                                         sizeof(*buf->mvs)));
#endif  // CONFIG_TIP
    aom_free(buf->seg_map);
    CHECK_MEM_ERROR(
        cm, buf->seg_map,
        (uint8_t *)aom_calloc(mi_params->mi_rows * mi_params->mi_cols,
                              sizeof(*buf->seg_map)));
  }

#if !CONFIG_TIP
  const int mem_size =
      ((mi_params->mi_rows + MAX_MIB_SIZE) >> 1) * (mi_params->mi_stride >> 1);
#endif  // !CONFIG_TIP
  const int is_tpl_mvs_mem_size_too_small = (cm->tpl_mvs_mem_size < mem_size);
  int realloc = cm->tpl_mvs == NULL || is_tpl_mvs_mem_size_too_small;
  if (realloc) {
    aom_free(cm->tpl_mvs);
    CHECK_MEM_ERROR(cm, cm->tpl_mvs,
                    (TPL_MV_REF *)aom_calloc(mem_size, sizeof(*cm->tpl_mvs)));
    cm->tpl_mvs_mem_size = mem_size;
  }

#if CONFIG_TIP
  realloc = cm->tip_ref.available_flag == NULL || is_tpl_mvs_mem_size_too_small;
  if (realloc) {
    aom_free(cm->tip_ref.available_flag);
    CHECK_MEM_ERROR(
        cm, cm->tip_ref.available_flag,
        (int *)aom_calloc(mem_size, sizeof(*cm->tip_ref.available_flag)));
  }

  realloc = cm->tip_ref.mf_need_clamp == NULL || is_tpl_mvs_mem_size_too_small;
  if (realloc) {
    aom_free(cm->tip_ref.mf_need_clamp);
    CHECK_MEM_ERROR(
        cm, cm->tip_ref.mf_need_clamp,
        (int *)aom_calloc(mem_size, sizeof(*cm->tip_ref.mf_need_clamp)));
  }
#endif  // CONFIG_TIP
}

void cfl_init(CFL_CTX *cfl, const SequenceHeader *seq_params);

static INLINE int av1_num_planes(const AV1_COMMON *cm) {
  return cm->seq_params.monochrome ? 1 : MAX_MB_PLANE;
}

static INLINE void av1_init_above_context(CommonContexts *above_contexts,
                                          int num_planes, int tile_row,
                                          MACROBLOCKD *xd) {
  for (int i = 0; i < num_planes; ++i) {
    xd->above_entropy_context[i] = above_contexts->entropy[i][tile_row];
    xd->above_partition_context[i] = above_contexts->partition[i][tile_row];
  }
  xd->above_txfm_context = above_contexts->txfm[tile_row];
}

static INLINE void av1_init_macroblockd(AV1_COMMON *cm, MACROBLOCKD *xd) {
  const int num_planes = av1_num_planes(cm);
  const CommonQuantParams *const quant_params = &cm->quant_params;

  for (int i = 0; i < num_planes; ++i) {
    if (xd->plane[i].plane_type == PLANE_TYPE_Y) {
      memcpy(xd->plane[i].seg_dequant_QTX, quant_params->y_dequant_QTX,
             sizeof(quant_params->y_dequant_QTX));
      memcpy(xd->plane[i].seg_iqmatrix, quant_params->y_iqmatrix,
             sizeof(quant_params->y_iqmatrix));

    } else {
      if (i == AOM_PLANE_U) {
        memcpy(xd->plane[i].seg_dequant_QTX, quant_params->u_dequant_QTX,
               sizeof(quant_params->u_dequant_QTX));
        memcpy(xd->plane[i].seg_iqmatrix, quant_params->u_iqmatrix,
               sizeof(quant_params->u_iqmatrix));
      } else {
        memcpy(xd->plane[i].seg_dequant_QTX, quant_params->v_dequant_QTX,
               sizeof(quant_params->v_dequant_QTX));
        memcpy(xd->plane[i].seg_iqmatrix, quant_params->v_iqmatrix,
               sizeof(quant_params->v_iqmatrix));
      }
    }
  }
  xd->mi_stride = cm->mi_params.mi_stride;
  xd->error_info = &cm->error;
  cfl_init(&xd->cfl, &cm->seq_params);
}

static INLINE void set_entropy_context(MACROBLOCKD *xd, int mi_row, int mi_col,
                                       const int num_planes,
                                       const CHROMA_REF_INFO *chroma_ref_info) {
  for (int i = (xd->tree_type == CHROMA_PART); i < num_planes; ++i) {
    struct macroblockd_plane *const pd = &xd->plane[i];
    // Offset the buffer pointer
    const int row_offset =
        i && chroma_ref_info ? chroma_ref_info->mi_row_chroma_base : mi_row;
    const int col_offset =
        i && chroma_ref_info ? chroma_ref_info->mi_col_chroma_base : mi_col;
    assert(row_offset >= 0);
    assert(col_offset >= 0);
    const int above_idx = col_offset;
    const int left_idx = row_offset & MAX_MIB_MASK;
    pd->above_entropy_context =
        &xd->above_entropy_context[i][above_idx >> pd->subsampling_x];
    pd->left_entropy_context =
        &xd->left_entropy_context[i][left_idx >> pd->subsampling_y];
  }
}

static INLINE int calc_mi_size(int len) {
  // len is in mi units. Align to a multiple of SBs.
  return ALIGN_POWER_OF_TWO(len, MAX_MIB_SIZE_LOG2);
}

static INLINE void set_plane_n4(MACROBLOCKD *const xd, int bw, int bh,
                                const int num_planes,
                                const CHROMA_REF_INFO *chroma_ref_info) {
  int i;
  for (i = (xd->tree_type == CHROMA_PART); i < num_planes; i++) {
    if (chroma_ref_info && i > 0) {
      const BLOCK_SIZE plane_bsize = chroma_ref_info->bsize_base;
      assert(plane_bsize < BLOCK_SIZES_ALL);

      xd->plane[i].width =
          block_size_wide[plane_bsize] >> xd->plane[i].subsampling_x;
      xd->plane[i].height =
          block_size_high[plane_bsize] >> xd->plane[i].subsampling_y;
    } else {
      xd->plane[i].width = (bw * MI_SIZE) >> xd->plane[i].subsampling_x;
      xd->plane[i].height = (bh * MI_SIZE) >> xd->plane[i].subsampling_y;
    }

    xd->plane[i].width = AOMMAX(xd->plane[i].width, 4);
    xd->plane[i].height = AOMMAX(xd->plane[i].height, 4);
  }
}

static INLINE void fetch_spatial_neighbors(MACROBLOCKD *xd) {
  // Scan from bottom left->above right->left->above
  for (int i = 0; i < MAX_NUM_NEIGHBORS; ++i) {
    xd->neighbors[i] = NULL;
  }

  int index = 0;
#if CONFIG_NEW_CONTEXT_MODELING
  if (xd->bottom_left_mbmi) {
    xd->neighbors[index++] = xd->bottom_left_mbmi;
    if (index >= MAX_NUM_NEIGHBORS) return;
  }

  if (xd->above_right_mbmi) {
    xd->neighbors[index++] = xd->above_right_mbmi;
    if (index >= MAX_NUM_NEIGHBORS) return;
  }
#endif  // CONFIG_NEW_CONTEXT_MODELING

  if (xd->left_mbmi) {
    xd->neighbors[index++] = xd->left_mbmi;
    if (index >= MAX_NUM_NEIGHBORS) return;
  }

  if (xd->above_mbmi) {
    xd->neighbors[index++] = xd->above_mbmi;
    if (index >= MAX_NUM_NEIGHBORS) return;
  }
}

static INLINE void set_mi_row_col(MACROBLOCKD *xd, const TileInfo *const tile,
                                  int mi_row, int bh, int mi_col, int bw,
                                  int mi_rows, int mi_cols,
                                  const CHROMA_REF_INFO *chroma_ref_info) {
  xd->mb_to_top_edge = -GET_MV_SUBPEL(mi_row * MI_SIZE);
  xd->mb_to_bottom_edge = GET_MV_SUBPEL((mi_rows - bh - mi_row) * MI_SIZE);
  xd->mb_to_left_edge = -GET_MV_SUBPEL((mi_col * MI_SIZE));
  xd->mb_to_right_edge = GET_MV_SUBPEL((mi_cols - bw - mi_col) * MI_SIZE);

  xd->mi_row = mi_row;
  xd->mi_col = mi_col;
  xd->mi[0]->mi_row_start = mi_row;
  xd->mi[0]->mi_col_start = mi_col;
#if CONFIG_EXT_RECUR_PARTITIONS
  xd->mi[0]->chroma_mi_row_start = mi_row;
  xd->mi[0]->chroma_mi_col_start = mi_col;
#endif  // CONFIG_EXT_RECUR_PARTITIONS

#if CONFIG_EXTENDED_WARP_PREDICTION
  xd->tile.mi_col_start = tile->mi_col_start;
  xd->tile.mi_col_end = tile->mi_col_end;
  xd->tile.mi_row_start = tile->mi_row_start;
  xd->tile.mi_row_end = tile->mi_row_end;
#endif

  // Are edges available for intra prediction?
  xd->up_available = (mi_row > tile->mi_row_start);
  xd->left_available = (mi_col > tile->mi_col_start);
  xd->chroma_up_available = xd->up_available;
  xd->chroma_left_available = xd->left_available;
  if (xd->up_available) {
    xd->above_mbmi = xd->mi[-xd->mi_stride];
  } else {
    xd->above_mbmi = NULL;
  }

  if (xd->left_available) {
    xd->left_mbmi = xd->mi[-1];
  } else {
    xd->left_mbmi = NULL;
  }

#if CONFIG_AIMC || CONFIG_NEW_CONTEXT_MODELING
  if (xd->up_available) {
    xd->above_right_mbmi = xd->mi[-xd->mi_stride + bw - 1];
  } else {
    xd->above_right_mbmi = NULL;
  }
  if (xd->left_available) {
    xd->bottom_left_mbmi = xd->mi[-1 + xd->mi_stride * (bh - 1)];
  } else {
    xd->bottom_left_mbmi = NULL;
  }
#endif  // CONFIG_AIMC || CONFIG_NEW_CONTEXT_MODELING

  fetch_spatial_neighbors(xd);

  if (chroma_ref_info) {
    xd->is_chroma_ref = chroma_ref_info->is_chroma_ref;
    xd->chroma_left_available =
        chroma_ref_info->mi_col_chroma_base > tile->mi_col_start;
    xd->chroma_up_available =
        chroma_ref_info->mi_row_chroma_base > tile->mi_row_start;
    if (xd->is_chroma_ref) {
      // To help calculate the "above" and "left" chroma blocks, note that the
      // current block may cover multiple luma blocks (eg, if partitioned into
      // 4x4 luma blocks).
      // First, find the top-left-most luma block covered by this chroma block
      const int ss_x = xd->plane[1].subsampling_x;
      const int ss_y = xd->plane[1].subsampling_y;
      const int mi_row_offset = mi_row - chroma_ref_info->mi_row_chroma_base;
      const int mi_col_offset = mi_col - chroma_ref_info->mi_col_chroma_base;
      MB_MODE_INFO **base_mi =
          &xd->mi[-mi_row_offset * xd->mi_stride - mi_col_offset];

      // Then, we consider the luma region covered by the left or above 4x4
      // chroma prediction. We want to point to the chroma reference block in
      // that region, which is the bottom-right-most mi unit. This leads to the
      // following offsets:
      MB_MODE_INFO *chroma_above_mi =
          xd->chroma_up_available ? base_mi[-xd->mi_stride + ss_x] : NULL;
      xd->chroma_above_mbmi = chroma_above_mi;

      MB_MODE_INFO *chroma_left_mi =
          xd->chroma_left_available ? base_mi[ss_y * xd->mi_stride - 1] : NULL;
      xd->chroma_left_mbmi = chroma_left_mi;
    }
  } else {
    xd->is_chroma_ref = 1;
  }

  xd->height = bh;
  xd->width = bw;

#if !CONFIG_EXT_RECUR_PARTITIONS
  xd->is_last_vertical_rect = 0;
  if (xd->width < xd->height) {
    if (!((mi_col + xd->width) & (xd->height - 1))) {
      xd->is_last_vertical_rect = 1;
    }
  }

  xd->is_first_horizontal_rect = 0;
  if (xd->width > xd->height)
    if (!(mi_row & (xd->width - 1))) xd->is_first_horizontal_rect = 1;

#if CONFIG_MVP_IMPROVEMENT
  xd->is_last_horizontal_rect = 0;
  if (xd->width > xd->height) {
    if (!((mi_row + xd->height) & (xd->width - 1))) {
      xd->is_last_horizontal_rect = 1;
    }
  }

  xd->is_first_vertical_rect = 0;
  if (xd->width < xd->height)
    if (!(mi_col & (xd->height - 1))) xd->is_first_vertical_rect = 1;
#endif  // CONFIG_MVP_IMPROVEMENT
#endif  // !CONFIG_EXT_RECUR_PARTITIONS
}

#if CONFIG_ATC_DCTX_ALIGNED
// Return the inter TX context based on last position value.
static INLINE int get_lp2tx_ctx(TX_SIZE tx_size, int bwl, int eob) {
  assert(eob != 0);
  const int lim = 2;
  const int eoby = (eob - 1) >> bwl;
  const int eobx = (eob - 1) - (eoby << bwl);
  const int diag = eobx + eoby;
  const int max_diag = tx_size_wide[tx_size] + tx_size_high[tx_size] - 2;
  int ctx_idx = 0;
  if (diag < lim) {
    ctx_idx = 1;
  } else if (diag > (max_diag - lim)) {
    ctx_idx = 2;
  }
  return ctx_idx;
}
#endif  // CONFIG_ATC_DCTX_ALIGNED

static INLINE int get_fsc_mode_ctx(const MACROBLOCKD *xd, const int is_key) {
  int ctx = 0;
  if (is_key) {
    for (int i = 0; i < MAX_NUM_NEIGHBORS; ++i) {
      const MB_MODE_INFO *const neighbor = xd->neighbors[i];
      if (neighbor != NULL) {
        ctx += neighbor->fsc_mode[PLANE_TYPE_Y];
      }
    }
  } else {
    ctx = 3;
  }

  return ctx;
}

static INLINE aom_cdf_prob *get_fsc_mode_cdf(const MACROBLOCKD *xd,
                                             const BLOCK_SIZE bsize,
                                             const int is_key) {
  FRAME_CONTEXT *tile_ctx = xd->tile_ctx;
  const uint8_t fsc_size_group = fsc_bsize_groups[bsize];
  assert(fsc_size_group < FSC_BSIZE_CONTEXTS);
  const int ctx = get_fsc_mode_ctx(xd, is_key);
  return tile_ctx->fsc_mode_cdf[ctx][fsc_size_group];
}

#if !CONFIG_AIMC
static INLINE int get_y_mode_ctx(const MB_MODE_INFO *neighbor) {
  const PREDICTION_MODE neighbor_mode = av1_get_block_mode(neighbor);
  return intra_mode_context[neighbor_mode];
}

static INLINE aom_cdf_prob *get_y_mode_cdf(FRAME_CONTEXT *tile_ctx,
                                           const MB_MODE_INFO *neighbor0,
                                           const MB_MODE_INFO *neighbor1) {
  const int neighbor0_ctx = get_y_mode_ctx(neighbor0);
  const int neighbor1_ctx = get_y_mode_ctx(neighbor1);
  return tile_ctx->kf_y_cdf[neighbor0_ctx][neighbor1_ctx];
}
#endif  // !CONFIG_AIMC

#if CONFIG_EXT_DIR
static INLINE int get_mrl_index_ctx(const MB_MODE_INFO *neighbor0,
                                    const MB_MODE_INFO *neighbor1) {
  int ctx0 = neighbor0 && !is_inter_block(neighbor0, SHARED_PART) &&
             !is_intrabc_block(neighbor0, SHARED_PART) &&
             neighbor0->mrl_index != 0;
  int ctx1 = neighbor1 && !is_inter_block(neighbor1, SHARED_PART) &&
             !is_intrabc_block(neighbor1, SHARED_PART) &&
             neighbor1->mrl_index != 0;
  return ctx0 + ctx1;
}
#endif  // CONFIG_EXT_DIR

static INLINE void update_partition_context(MACROBLOCKD *xd, int mi_row,
                                            int mi_col, BLOCK_SIZE subsize,
                                            BLOCK_SIZE bsize) {
  const int plane = xd->tree_type == CHROMA_PART;
  PARTITION_CONTEXT *const above_ctx =
      xd->above_partition_context[plane] + mi_col;
  PARTITION_CONTEXT *const left_ctx =
      xd->left_partition_context[plane] + (mi_row & MAX_MIB_MASK);
  assert(bsize < BLOCK_SIZES_ALL);

  const int bw = mi_size_wide[bsize];
  const int bh = mi_size_high[bsize];
  memset(above_ctx, partition_context_lookup[subsize].above, bw);
  memset(left_ctx, partition_context_lookup[subsize].left, bh);
}

static INLINE int is_chroma_reference(int mi_row, int mi_col, BLOCK_SIZE bsize,
                                      int subsampling_x, int subsampling_y) {
  assert(bsize < BLOCK_SIZES_ALL);
  const int bw = mi_size_wide[bsize];
  const int bh = mi_size_high[bsize];
  int ref_pos = ((mi_row & 0x01) || !(bh & 0x01) || !subsampling_y) &&
                ((mi_col & 0x01) || !(bw & 0x01) || !subsampling_x);
  return ref_pos;
}

static INLINE aom_cdf_prob cdf_element_prob(const aom_cdf_prob *cdf,
                                            size_t element) {
  assert(cdf != NULL);
  return (element > 0 ? cdf[element - 1] : CDF_PROB_TOP) - cdf[element];
}

#if !CONFIG_EXT_RECUR_PARTITIONS
static INLINE void partition_gather_horz_alike(aom_cdf_prob *out,
                                               const aom_cdf_prob *const in,
                                               BLOCK_SIZE bsize) {
  (void)bsize;
  out[0] = CDF_PROB_TOP;
  out[0] -= cdf_element_prob(in, PARTITION_HORZ);
  out[0] -= cdf_element_prob(in, PARTITION_SPLIT);
  out[0] -= cdf_element_prob(in, PARTITION_HORZ_A);
  out[0] -= cdf_element_prob(in, PARTITION_HORZ_B);
  out[0] -= cdf_element_prob(in, PARTITION_VERT_A);
  if (bsize != BLOCK_128X128) out[0] -= cdf_element_prob(in, PARTITION_HORZ_4);
  out[0] = AOM_ICDF(out[0]);
  out[1] = AOM_ICDF(CDF_PROB_TOP);
}

static INLINE void partition_gather_vert_alike(aom_cdf_prob *out,
                                               const aom_cdf_prob *const in,
                                               BLOCK_SIZE bsize) {
  (void)bsize;
  out[0] = CDF_PROB_TOP;
  out[0] -= cdf_element_prob(in, PARTITION_VERT);
  out[0] -= cdf_element_prob(in, PARTITION_SPLIT);
  out[0] -= cdf_element_prob(in, PARTITION_HORZ_A);
  out[0] -= cdf_element_prob(in, PARTITION_VERT_A);
  out[0] -= cdf_element_prob(in, PARTITION_VERT_B);
  if (bsize != BLOCK_128X128) out[0] -= cdf_element_prob(in, PARTITION_VERT_4);
  out[0] = AOM_ICDF(out[0]);
  out[1] = AOM_ICDF(CDF_PROB_TOP);
}
#endif  // !CONFIG_EXT_RECUR_PARTITIONS

static INLINE void update_ext_partition_context(MACROBLOCKD *xd, int mi_row,
                                                int mi_col, BLOCK_SIZE subsize,
                                                BLOCK_SIZE bsize,
                                                PARTITION_TYPE partition) {
#if CONFIG_EXT_RECUR_PARTITIONS
  if (partition == PARTITION_NONE) {
    assert(bsize == subsize);
    update_partition_context(xd, mi_row, mi_col, subsize, bsize);
  }
#else
  if (is_partition_point(bsize)) {
    const int hbs = mi_size_wide[bsize] / 2;
    const BLOCK_SIZE bsize2 = get_partition_subsize(bsize, PARTITION_SPLIT);
    switch (partition) {
      case PARTITION_SPLIT:
        if (bsize != BLOCK_8X8) break;
        AOM_FALLTHROUGH_INTENDED;
      case PARTITION_NONE:
      case PARTITION_HORZ:
      case PARTITION_VERT:
        update_partition_context(xd, mi_row, mi_col, subsize, bsize);
        break;
      case PARTITION_HORZ_A:
        update_partition_context(xd, mi_row, mi_col, bsize2, subsize);
        update_partition_context(xd, mi_row + hbs, mi_col, subsize, subsize);
        break;
      case PARTITION_HORZ_B:
        update_partition_context(xd, mi_row, mi_col, subsize, subsize);
        update_partition_context(xd, mi_row + hbs, mi_col, bsize2, subsize);
        break;
      case PARTITION_VERT_A:
        update_partition_context(xd, mi_row, mi_col, bsize2, subsize);
        update_partition_context(xd, mi_row, mi_col + hbs, subsize, subsize);
        break;
      case PARTITION_VERT_B:
        update_partition_context(xd, mi_row, mi_col, subsize, subsize);
        update_partition_context(xd, mi_row, mi_col + hbs, bsize2, subsize);
        break;
      case PARTITION_HORZ_4:
      case PARTITION_VERT_4:
        update_partition_context(xd, mi_row, mi_col, subsize, bsize);
        break;
      default: assert(0 && "Invalid partition type");
    }
  }
#endif  // CONFIG_EXT_RECUR_PARTITIONS
}

static INLINE int partition_plane_context(const MACROBLOCKD *xd, int mi_row,
                                          int mi_col, BLOCK_SIZE bsize) {
  const int plane = xd->tree_type == CHROMA_PART;
  const PARTITION_CONTEXT *above_ctx =
      xd->above_partition_context[plane] + mi_col;
  const PARTITION_CONTEXT *left_ctx =
      xd->left_partition_context[plane] + (mi_row & MAX_MIB_MASK);
#if CONFIG_EXT_RECUR_PARTITIONS
  assert(bsize < BLOCK_SIZES);
  const int bsl_w = mi_size_wide_log2[bsize];
  const int bsl_h = mi_size_high_log2[bsize];

  const int above = (*above_ctx >> AOMMAX(bsl_w - 1, 0)) & 1;
  const int left = (*left_ctx >> AOMMAX(bsl_h - 1, 0)) & 1;

  return (left * 2 + above) + bsize * PARTITION_PLOFFSET;
#else
  // Minimum partition point is 8x8. Offset the bsl accordingly.
  const int bsl = mi_size_wide_log2[bsize] - mi_size_wide_log2[BLOCK_8X8];
  int above = (*above_ctx >> bsl) & 1, left = (*left_ctx >> bsl) & 1;

  assert(mi_size_wide_log2[bsize] == mi_size_high_log2[bsize]);
  assert(bsl >= 0);

  return (left * 2 + above) + bsl * PARTITION_PLOFFSET;
#endif  // CONFIG_EXT_RECUR_PARTITIONS
}

#if !CONFIG_EXT_RECUR_PARTITIONS
// Return the number of elements in the partition CDF when
// partitioning the (square) block with luma block size of bsize.
static INLINE int partition_cdf_length(BLOCK_SIZE bsize) {
  if (bsize <= BLOCK_8X8)
    return PARTITION_TYPES;
  else if (bsize == BLOCK_128X128)
    return EXT_PARTITION_TYPES - 2;
  else
    return EXT_PARTITION_TYPES;
}
#endif  // !CONFIG_EXT_RECUR_PARTITIONS

static INLINE void av1_zero_above_context(AV1_COMMON *const cm,
                                          const MACROBLOCKD *xd,
                                          int mi_col_start, int mi_col_end,
                                          const int tile_row) {
  const SequenceHeader *const seq_params = &cm->seq_params;
  const int num_planes = av1_num_planes(cm);
  const int width = mi_col_end - mi_col_start;
  const int aligned_width =
      ALIGN_POWER_OF_TWO(width, seq_params->mib_size_log2);
  const int offset_y = mi_col_start;
  const int width_y = aligned_width;
  const int offset_uv = offset_y >> seq_params->subsampling_x;
  const int width_uv = width_y >> seq_params->subsampling_x;
  CommonContexts *const above_contexts = &cm->above_contexts;

  av1_zero_array(above_contexts->entropy[0][tile_row] + offset_y, width_y);
  if (num_planes > 1) {
    if (above_contexts->entropy[1][tile_row] &&
        above_contexts->entropy[2][tile_row]) {
      av1_zero_array(above_contexts->entropy[1][tile_row] + offset_uv,
                     width_uv);
      av1_zero_array(above_contexts->entropy[2][tile_row] + offset_uv,
                     width_uv);
    } else {
      aom_internal_error(xd->error_info, AOM_CODEC_CORRUPT_FRAME,
                         "Invalid value of planes");
    }
  }
  av1_zero_array(above_contexts->partition[0][tile_row] + mi_col_start,
                 aligned_width);
  if (num_planes > 1) {
    if (above_contexts->partition[1][tile_row] &&
        above_contexts->partition[2][tile_row]) {
      av1_zero_array(above_contexts->partition[1][tile_row] + mi_col_start,
                     aligned_width);
      av1_zero_array(above_contexts->partition[2][tile_row] + mi_col_start,
                     aligned_width);
    } else {
      aom_internal_error(xd->error_info, AOM_CODEC_CORRUPT_FRAME,
                         "Invalid value of planes");
    }
  }

  memset(above_contexts->txfm[tile_row] + mi_col_start,
         tx_size_wide[TX_SIZES_LARGEST], aligned_width * sizeof(TXFM_CONTEXT));
}

static INLINE void av1_zero_left_context(MACROBLOCKD *const xd) {
  av1_zero(xd->left_entropy_context);
  av1_zero(xd->left_partition_context);

  memset(xd->left_txfm_context_buffer, tx_size_high[TX_SIZES_LARGEST],
         sizeof(xd->left_txfm_context_buffer));
}

// Disable array-bounds checks as the TX_SIZE enum contains values larger than
// TX_SIZES_ALL (TX_INVALID) which make extending the array as a workaround
// infeasible. The assert is enough for static analysis and this or other tools
// asan, valgrind would catch oob access at runtime.
#if defined(__GNUC__) && __GNUC__ >= 4
#pragma GCC diagnostic ignored "-Warray-bounds"
#endif

#if defined(__GNUC__) && __GNUC__ >= 4
#pragma GCC diagnostic warning "-Warray-bounds"
#endif

static INLINE void set_txfm_ctx(TXFM_CONTEXT *txfm_ctx, uint8_t txs, int len) {
  int i;
  for (i = 0; i < len; ++i) txfm_ctx[i] = txs;
}

static INLINE void set_txfm_ctxs(TX_SIZE tx_size, int n4_w, int n4_h, int skip,
                                 const MACROBLOCKD *xd) {
  uint8_t bw = tx_size_wide[tx_size];
  uint8_t bh = tx_size_high[tx_size];

  if (skip) {
    bw = n4_w * MI_SIZE;
    bh = n4_h * MI_SIZE;
  }

  set_txfm_ctx(xd->above_txfm_context, bw, n4_w);
  set_txfm_ctx(xd->left_txfm_context, bh, n4_h);
}

static INLINE int get_mi_grid_idx(const CommonModeInfoParams *const mi_params,
                                  int mi_row, int mi_col) {
  return mi_row * mi_params->mi_stride + mi_col;
}

static INLINE int get_alloc_mi_idx(const CommonModeInfoParams *const mi_params,
                                   int mi_row, int mi_col) {
  const int mi_alloc_size_1d = mi_size_wide[mi_params->mi_alloc_bsize];
  const int mi_alloc_row = mi_row / mi_alloc_size_1d;
  const int mi_alloc_col = mi_col / mi_alloc_size_1d;

  return mi_alloc_row * mi_params->mi_alloc_stride + mi_alloc_col;
}

// For this partition block, set pointers in mi_params->mi_grid_base and xd->mi.
static INLINE void set_mi_offsets(const CommonModeInfoParams *const mi_params,
                                  MACROBLOCKD *const xd, int mi_row, int mi_col
#if CONFIG_C071_SUBBLK_WARPMV
                                  ,
                                  int x_inside_boundary, int y_inside_boundary
#endif  // CONFIG_C071_SUBBLK_WARPMV
) {
  // 'mi_grid_base' should point to appropriate memory in 'mi'.
  const int mi_grid_idx = get_mi_grid_idx(mi_params, mi_row, mi_col);
  const int mi_alloc_idx = get_alloc_mi_idx(mi_params, mi_row, mi_col);
  mi_params->mi_grid_base[mi_grid_idx] = &mi_params->mi_alloc[mi_alloc_idx];
  // 'xd->mi' should point to an offset in 'mi_grid_base';
  xd->mi = mi_params->mi_grid_base + mi_grid_idx;
#if CONFIG_C071_SUBBLK_WARPMV
  mi_params->submi_grid_base[mi_grid_idx] =
      &mi_params->mi_alloc_sub[mi_alloc_idx];
  xd->submi = mi_params->submi_grid_base + mi_grid_idx;
  for (int y = 0; y < y_inside_boundary; y++) {
    for (int x = 0; x < x_inside_boundary; x++) {
      if (x == 0 && y == 0) continue;
      const int mi_alloc_sub_idx =
          get_alloc_mi_idx(mi_params, mi_row + y, mi_col + x);
      xd->submi[y * mi_params->mi_stride + x] =
          &mi_params->mi_alloc_sub[mi_alloc_sub_idx];
    }
  }
#endif  // CONFIG_C071_SUBBLK_WARPMV
  // 'xd->tx_type_map' should point to an offset in 'mi_params->tx_type_map'.
  if (xd->tree_type != CHROMA_PART) {
    xd->tx_type_map = mi_params->tx_type_map + mi_grid_idx;
  }
  xd->tx_type_map_stride = mi_params->mi_stride;
#if CONFIG_CROSS_CHROMA_TX
  if (xd->tree_type != LUMA_PART) {
    xd->cctx_type_map = mi_params->cctx_type_map + mi_grid_idx;
  }
  xd->cctx_type_map_stride = mi_params->mi_stride;
#endif  // CONFIG_CROSS_CHROMA_TX
}

// For this partition block, set pointers in mi_params->mi_grid_base and xd->mi.
static INLINE void set_blk_offsets(const CommonModeInfoParams *const mi_params,
                                   MACROBLOCKD *const xd, int mi_row,
                                   int mi_col, int blk_row, int blk_col) {
  // 'mi_grid_base' should point to appropriate memory in 'mi'.
  const int mi_grid_idx =
      get_mi_grid_idx(mi_params, mi_row + blk_row, mi_col + blk_col);
  const int mi_alloc_idx =
      get_alloc_mi_idx(mi_params, mi_row + blk_row, mi_col + blk_col);
  mi_params->mi_grid_base[mi_grid_idx] = &mi_params->mi_alloc[mi_alloc_idx];
  // 'xd->mi' should point to an offset in 'mi_grid_base';
  xd->mi[mi_params->mi_stride * blk_row + blk_col] =
      mi_params->mi_grid_base[mi_grid_idx];
  xd->tx_type_map = mi_params->tx_type_map + mi_grid_idx;
  xd->tx_type_map_stride = mi_params->mi_stride;
#if CONFIG_CROSS_CHROMA_TX
  xd->cctx_type_map = mi_params->cctx_type_map + mi_grid_idx;
  xd->cctx_type_map_stride = mi_params->mi_stride;
#endif  // CONFIG_CROSS_CHROMA_TX
}

#if CONFIG_EXT_RECUR_PARTITIONS
// The blocksize above which chroma and luma partitions will stayed coupled.
// Currently this is set to BLOCK_128X128 (e.g. chroma always follows luma at
// BLOCK_128X128, but can be de-coupled later).
static AOM_INLINE bool is_bsize_above_decoupled_thresh(BLOCK_SIZE bsize) {
  return bsize == BLOCK_128X128;
}

// Whether the partition tree contains a block size that is strictly smaller
// than width x height.
static AOM_INLINE bool tree_has_bsize_smaller_than(const PARTITION_TREE *ptree,
                                                   int width, int height) {
  if (!ptree || ptree->partition == PARTITION_INVALID) {
    return false;
  }
  const BLOCK_SIZE bsize = ptree->bsize;
  if (ptree->partition == PARTITION_NONE) {
    return block_size_wide[bsize] < width && block_size_high[bsize] < height;
  }
  for (int idx = 0; idx < 4; idx++) {
    if (tree_has_bsize_smaller_than(ptree->sub_tree[idx], width, height)) {
      return true;
    }
  }
  return false;
}

static AOM_INLINE bool is_luma_chroma_share_same_partition(
    TREE_TYPE tree_type, const PARTITION_TREE *ptree_luma, BLOCK_SIZE bsize) {
  if (tree_type != CHROMA_PART || !ptree_luma ||
      !is_bsize_above_decoupled_thresh(bsize)) {
    return false;
  }
  if (ptree_luma->partition == PARTITION_NONE) {
    return false;
  }
  // For now, follow the logic in baseline SDP. i.e. we will force the current
  // chroma partition to follow the luma split iff all the luma subblocks
  // split further into blocks that's strictly smaller than half of the current
  // bsize.
  const int width_threshold = block_size_wide[bsize] / 2,
            height_threshold = block_size_high[bsize] / 2;
  for (int idx = 0; idx < 4; idx++) {
    const PARTITION_TREE *sub_tree = ptree_luma->sub_tree[idx];
    if (sub_tree && sub_tree->partition != PARTITION_INVALID) {
      if (!tree_has_bsize_smaller_than(sub_tree, width_threshold,
                                       height_threshold)) {
        return false;
      }
    }
  }
  return true;
}

static INLINE int check_is_chroma_size_valid(
    TREE_TYPE tree_type, PARTITION_TYPE partition, BLOCK_SIZE bsize, int mi_row,
    int mi_col, int ss_x, int ss_y,
    const CHROMA_REF_INFO *parent_chroma_ref_info) {
  if (tree_type == LUMA_PART) {
    // If we handling luma tree and the current luma tree is decoupled from
    // chroma tree, we don't need to concern with chroma bsize. But if they are
    // still coupled, then we need to make sure the corresponding chroma bsize
    // is valid.
    if (is_bsize_above_decoupled_thresh(bsize)) {
      const BLOCK_SIZE subsize = get_partition_subsize(bsize, partition);
      if (subsize == BLOCK_INVALID) {
        return false;
      }
      return get_plane_block_size(subsize, ss_x, ss_y) != BLOCK_INVALID;
    }

    return true;
  }
  const BLOCK_SIZE subsize = get_partition_subsize(bsize, partition);
  int is_valid = 0;
  if (subsize < BLOCK_SIZES_ALL) {
    CHROMA_REF_INFO tmp_chroma_ref_info = { 1,      0,       mi_row,
                                            mi_col, subsize, subsize };
    set_chroma_ref_info(tree_type, mi_row, mi_col, 0, subsize,
                        &tmp_chroma_ref_info, parent_chroma_ref_info, bsize,
                        partition, ss_x, ss_y);
    is_valid = get_plane_block_size(tmp_chroma_ref_info.bsize_base, ss_x,
                                    ss_y) != BLOCK_INVALID;
  }
  return is_valid;
}

// Returns true if partition is implied for blocks near bottom/right
// border, and not signaled in the bistream. And when it returns true, it also
// sets `implied_partition` appropriately.
// Note: `implied_partition` can be passed NULL.
static AOM_INLINE bool is_partition_implied_at_boundary(
    const CommonModeInfoParams *const mi_params, TREE_TYPE tree_type, bool ss_x,
    bool ss_y, int mi_row, int mi_col, BLOCK_SIZE bsize,
    const CHROMA_REF_INFO *chroma_ref_info, PARTITION_TYPE *implied_partition) {
  if (bsize >= BLOCK_SIZES_ALL) return false;
  bool is_implied = false;
  PARTITION_TYPE tmp_implied_partition = PARTITION_INVALID;
  if (implied_partition) *implied_partition = PARTITION_INVALID;

  const int hbs_w = mi_size_wide[bsize] / 2;
  const int hbs_h = mi_size_high[bsize] / 2;
  const int has_rows = (mi_row + hbs_h) < mi_params->mi_rows;
  const int has_cols = (mi_col + hbs_w) < mi_params->mi_cols;

  if (has_rows && has_cols) return false;  // Not at boundary.
  assert(!has_rows || !has_cols);

  if (is_square_block(bsize)) {
    is_implied = true;
    if (has_rows && !has_cols) {
      tmp_implied_partition = PARTITION_VERT;
    } else {
      tmp_implied_partition = PARTITION_HORZ;
    }
  } else if (is_tall_block(bsize)) {
    // Force PARTITION_HORZ if
    //  * We are missing rows, OR
    //  * We are missing cols and PARTITION_VERT will produce 1:4 block that is
    //    still missing cols.
    if (!has_rows) {
      is_implied = true;
      tmp_implied_partition = PARTITION_HORZ;
    } else {
      assert(!has_cols);
      const bool sub_has_cols =
          (mi_col + mi_size_wide[bsize] / 4) < mi_params->mi_cols;
      if (mi_size_wide[bsize] >= 4 && !sub_has_cols) {
        is_implied = true;
        tmp_implied_partition = PARTITION_HORZ;
      }
    }
  } else {
    assert(is_wide_block(bsize));
    // Force PARTITION_VERT if
    //  * We are missing cols, OR
    //  * We are missing rows and PARTITION_HORZ will produce 1:4 block that is
    //    still missing rows.
    if (!has_cols) {
      is_implied = true;
      tmp_implied_partition = PARTITION_VERT;
    } else {
      assert(!has_rows);
      const bool sub_has_rows =
          (mi_row + mi_size_high[bsize] / 4) < mi_params->mi_rows;
      if (mi_size_high[bsize] >= 4 && !sub_has_rows) {
        is_implied = true;
        tmp_implied_partition = PARTITION_VERT;
      }
    }
  }
  if (is_implied) {
    assert(tmp_implied_partition == PARTITION_HORZ ||
           tmp_implied_partition == PARTITION_VERT);
    if (!check_is_chroma_size_valid(tree_type, tmp_implied_partition, bsize,
                                    mi_row, mi_col, ss_x, ss_y,
                                    chroma_ref_info)) {
      is_implied = false;
      tmp_implied_partition = PARTITION_INVALID;
    }
  }
  assert(IMPLIES(is_implied && implied_partition,
                 tmp_implied_partition == PARTITION_HORZ ||
                     tmp_implied_partition == PARTITION_VERT));
  if (implied_partition) {
    *implied_partition = tmp_implied_partition;
  }
  return is_implied;
}

#else
// Return the number of sub-blocks whose width and height are
// less than half of the parent block.
static INLINE int get_luma_split_flag(
    BLOCK_SIZE bsize, const CommonModeInfoParams *const mi_params, int mi_row,
    int mi_col) {
  int luma_split_flag = 0;
  int width_unit = mi_size_wide[bsize];
  int height_unit = mi_size_high[bsize];
  int parent_block_width = block_size_wide[bsize];
  const int x_inside_boundary = AOMMIN(width_unit, mi_params->mi_cols - mi_col);
  const int y_inside_boundary =
      AOMMIN(height_unit, mi_params->mi_rows - mi_row);
  int x_mis_half = x_inside_boundary >> 1;
  int y_mis_half = y_inside_boundary >> 1;
  int half_parent_width = parent_block_width >> 1;
  for (int y_district = 0; y_district < 2; y_district++) {
    for (int x_district = 0; x_district < 2; x_district++) {
      int find_small_block = 0;
      for (int y = 0; y < y_mis_half; ++y) {
        for (int x = 0; x < x_mis_half; ++x) {
          int y_pos = y_district * y_mis_half + y;
          int x_pos = x_district * x_mis_half + x;
          MB_MODE_INFO *temp_mi = &mi_params->mi_alloc[get_alloc_mi_idx(
              mi_params, mi_row + y_pos, mi_col + x_pos)];
          BLOCK_SIZE temp_size = temp_mi->sb_type[PLANE_TYPE_Y];
          if (block_size_wide[temp_size] < half_parent_width &&
              block_size_high[temp_size] < half_parent_width) {
            find_small_block++;
          }
        }
      }
      if (find_small_block > 0) luma_split_flag++;
    }
  }
  return luma_split_flag;
}
#endif  // CONFIG_EXT_RECUR_PARTITIONS

static INLINE void txfm_partition_update(TXFM_CONTEXT *above_ctx,
                                         TXFM_CONTEXT *left_ctx,
                                         TX_SIZE tx_size, TX_SIZE txb_size) {
  BLOCK_SIZE bsize = txsize_to_bsize[txb_size];
  int bh = mi_size_high[bsize];
  int bw = mi_size_wide[bsize];
  uint8_t txw = tx_size_wide[tx_size];
  uint8_t txh = tx_size_high[tx_size];
  int i;
  for (i = 0; i < bh; ++i) left_ctx[i] = txh;
  for (i = 0; i < bw; ++i) above_ctx[i] = txw;
}

static INLINE TX_SIZE get_sqr_tx_size(int tx_dim) {
  switch (tx_dim) {
    case 128:
    case 64: return TX_64X64; break;
    case 32: return TX_32X32; break;
    case 16: return TX_16X16; break;
    case 8: return TX_8X8; break;
    default: return TX_4X4;
  }
}

static INLINE TX_SIZE get_tx_size(int width, int height) {
  if (width == height) {
    return get_sqr_tx_size(width);
  }
  if (width < height) {
    if (width + width == height) {
      switch (width) {
        case 4: return (height == 8) ? TX_4X8 : TX_INVALID;
        case 8: return (height == 16) ? TX_8X16 : TX_INVALID;
        case 16: return (height == 32) ? TX_16X32 : TX_INVALID;
        case 32: return (height == 64) ? TX_32X64 : TX_INVALID;
      }
    } else {
      switch (width) {
        case 4: return (height == 16) ? TX_4X16 : TX_INVALID;
        case 8: return (height == 32) ? TX_8X32 : TX_INVALID;
        case 16: return (height == 64) ? TX_16X64 : TX_INVALID;
      }
    }
  } else {
    if (height + height == width) {
      switch (height) {
        case 4: return (width == 8) ? TX_8X4 : TX_INVALID;
        case 8: return (width == 16) ? TX_16X8 : TX_INVALID;
        case 16: return (width == 32) ? TX_32X16 : TX_INVALID;
        case 32: return (width == 64) ? TX_64X32 : TX_INVALID;
      }
    } else {
      switch (height) {
        case 4: return (width == 16) ? TX_16X4 : TX_INVALID;
        case 8: return (width == 32) ? TX_32X8 : TX_INVALID;
        case 16: return (width == 64) ? TX_64X16 : TX_INVALID;
      }
    }
  }
  return TX_INVALID;
}

#if CONFIG_NEW_TX_PARTITION
#define MAX_TX_PARTITIONS 4
typedef struct {
  int rows[MAX_TX_PARTITIONS];
  int cols[MAX_TX_PARTITIONS];
  int n_partitions;
} TX_PARTITION_BIT_SHIFT;

// Defines the number of bits to use to divide a block's dimensions
// to create the tx sizes in each partition.
// Keep square and rectangular separate for now, but we can potentially
// merge them in the future.
static const TX_PARTITION_BIT_SHIFT
    partition_shift_bits[2][TX_PARTITION_TYPES] = {
      // Square
      {
          { { 0 }, { 0 }, 1 },                    // TX_PARTITION_NONE
          { { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, 4 },  // TX_PARTITION_SPLIT
          { { 1, 1 }, { 0, 0 }, 2 },              // TX_PARTITION_HORZ
          { { 0, 0 }, { 1, 1 }, 2 },              // TX_PARTITION_VERT
      },
      // Rectangular
      {
          { { 0 }, { 0 }, 1 },                    // TX_PARTITION_NONE
          { { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, 4 },  // TX_PARTITION_SPLIT
          { { 1, 1 }, { 0, 0 }, 2 },              // TX_PARTITION_HORZ
          { { 0, 0 }, { 1, 1 }, 2 },              // TX_PARTITION_VERT
      },
    };

static INLINE int get_tx_partition_sizes(TX_PARTITION_TYPE partition,
                                         TX_SIZE max_tx_size,
                                         TX_SIZE sub_txs[MAX_TX_PARTITIONS]) {
  const int txw = tx_size_wide[max_tx_size];
  const int txh = tx_size_high[max_tx_size];
  int sub_txw = 0, sub_txh = 0;
  const TX_PARTITION_BIT_SHIFT subtx_shift =
      partition_shift_bits[is_rect_tx(max_tx_size)][partition];
  const int n_partitions = subtx_shift.n_partitions;
  for (int i = 0; i < n_partitions; i++) {
    sub_txw = txw >> subtx_shift.cols[i];
    sub_txh = txh >> subtx_shift.rows[i];
    sub_txs[i] = get_tx_size(sub_txw, sub_txh);
    assert(sub_txs[i] != TX_INVALID);
  }
  return n_partitions;
}

/*
Gets the type to signal for the 4 way split tree in the tx partition
type signaling.
*/
static INLINE int get_split4_partition(TX_PARTITION_TYPE partition) {
  switch (partition) {
    case TX_PARTITION_NONE:
    case TX_PARTITION_SPLIT:
    case TX_PARTITION_VERT:
    case TX_PARTITION_HORZ: return partition;
    default: assert(0);
  }
  assert(0);
  return 0;
}

static INLINE int allow_tx_horz_split(TX_SIZE max_tx_size) {
  const int sub_txw = tx_size_wide[max_tx_size];
  const int sub_txh = tx_size_high[max_tx_size] >> 1;
  const TX_SIZE sub_tx_size = get_tx_size(sub_txw, sub_txh);
  return sub_tx_size != TX_INVALID;
}

static INLINE int allow_tx_vert_split(TX_SIZE max_tx_size) {
  const int sub_txw = tx_size_wide[max_tx_size] >> 1;
  const int sub_txh = tx_size_high[max_tx_size];
  const TX_SIZE sub_tx_size = get_tx_size(sub_txw, sub_txh);
  return sub_tx_size != TX_INVALID;
}

static INLINE int allow_tx_horz4_split(TX_SIZE max_tx_size) {
  const int sub_txw = tx_size_wide[max_tx_size];
  const int sub_txh = tx_size_high[max_tx_size] >> 2;
  const TX_SIZE sub_tx_size = get_tx_size(sub_txw, sub_txh);
  return sub_tx_size != TX_INVALID;
}

static INLINE int allow_tx_vert4_split(TX_SIZE max_tx_size) {
  const int sub_txw = tx_size_wide[max_tx_size] >> 2;
  const int sub_txh = tx_size_high[max_tx_size];
  const TX_SIZE sub_tx_size = get_tx_size(sub_txw, sub_txh);
  return sub_tx_size != TX_INVALID;
}

static INLINE int use_tx_partition(TX_PARTITION_TYPE partition,
                                   TX_SIZE max_tx_size) {
  const int allow_horz = allow_tx_horz_split(max_tx_size);
  const int allow_vert = allow_tx_vert_split(max_tx_size);
  switch (partition) {
    case TX_PARTITION_NONE: return 1;
    case TX_PARTITION_SPLIT: return (allow_horz && allow_vert);
    case TX_PARTITION_HORZ: return allow_horz;
    case TX_PARTITION_VERT: return allow_vert;
    default: assert(0);
  }
  assert(0);
  return 0;
}

static INLINE int txfm_partition_split4_inter_context(
    const TXFM_CONTEXT *const above_ctx, const TXFM_CONTEXT *const left_ctx,
    BLOCK_SIZE bsize, TX_SIZE tx_size) {
  const uint8_t txw = tx_size_wide[tx_size];
  const uint8_t txh = tx_size_high[tx_size];
  const int above = *above_ctx < txw;
  const int left = *left_ctx < txh;
  int category = TXFM_PARTITION_INTER_CONTEXTS;

  // dummy return, not used by others.
  if (tx_size <= TX_4X4) return 0;

  TX_SIZE max_tx_size =
      get_sqr_tx_size(AOMMAX(block_size_wide[bsize], block_size_high[bsize]));

  if (max_tx_size >= TX_8X8) {
    category =
        (txsize_sqr_up_map[tx_size] != max_tx_size && max_tx_size > TX_8X8) +
        (TX_SIZES - 1 - max_tx_size) * 2;
  }
  assert(category != TXFM_PARTITION_INTER_CONTEXTS);
  return category * 3 + above + left;
}

#else
static INLINE int txfm_partition_context(const TXFM_CONTEXT *const above_ctx,
                                         const TXFM_CONTEXT *const left_ctx,
                                         BLOCK_SIZE bsize, TX_SIZE tx_size) {
  const uint8_t txw = tx_size_wide[tx_size];
  const uint8_t txh = tx_size_high[tx_size];
  const int above = *above_ctx < txw;
  const int left = *left_ctx < txh;
  int category = TXFM_PARTITION_CONTEXTS;

  // dummy return, not used by others.
  if (tx_size <= TX_4X4) return 0;

  TX_SIZE max_tx_size =
      get_sqr_tx_size(AOMMAX(block_size_wide[bsize], block_size_high[bsize]));

  if (max_tx_size >= TX_8X8) {
    category =
        (txsize_sqr_up_map[tx_size] != max_tx_size && max_tx_size > TX_8X8) +
        (TX_SIZES - 1 - max_tx_size) * 2;
  }
  assert(category != TXFM_PARTITION_CONTEXTS);
  return category * 3 + above + left;
}
#endif  // CONFIG_NEW_TX_PARTITION

// Compute the next partition in the direction of the sb_type stored in the mi
// array, starting with bsize.
static INLINE PARTITION_TYPE get_partition(const AV1_COMMON *const cm,
                                           const int plane_type, int mi_row,
                                           int mi_col, BLOCK_SIZE bsize) {
  const CommonModeInfoParams *const mi_params = &cm->mi_params;
  if (mi_row >= mi_params->mi_rows || mi_col >= mi_params->mi_cols)
    return PARTITION_INVALID;

  const int offset = mi_row * mi_params->mi_stride + mi_col;
  MB_MODE_INFO **mi = mi_params->mi_grid_base + offset;
  const BLOCK_SIZE subsize = mi[0]->sb_type[plane_type];

  assert(bsize < BLOCK_SIZES_ALL);

  if (subsize == bsize) return PARTITION_NONE;

  const int bhigh = mi_size_high[bsize];
  const int bwide = mi_size_wide[bsize];
  const int sshigh = mi_size_high[subsize];
  const int sswide = mi_size_wide[subsize];

  if (bsize > BLOCK_8X8 && mi_row + bwide / 2 < mi_params->mi_rows &&
      mi_col + bhigh / 2 < mi_params->mi_cols) {
    // In this case, the block might be using an extended partition
    // type.
    const MB_MODE_INFO *const mbmi_right = mi[bwide / 2];
    const MB_MODE_INFO *const mbmi_below = mi[bhigh / 2 * mi_params->mi_stride];

    if (sswide == bwide) {
      // Smaller height but same width. Is PARTITION_HORZ_4, PARTITION_HORZ or
      // PARTITION_HORZ_B. To distinguish the latter two, check if the lower
      // half was split.
      if (sshigh * 4 == bhigh) {
#if CONFIG_UNEVEN_4WAY
        return PARTITION_HORZ_4A;
#elif CONFIG_EXT_RECUR_PARTITIONS
        return PARTITION_HORZ_3;
#else   // !CONFIG_UNEVEN_4WAY && !CONFIG_EXT_RECUR_PARTITIONS
        return PARTITION_HORZ_4;
#endif  // CONFIG_UNEVEN_4WAY
      }
#if !CONFIG_EXT_RECUR_PARTITIONS
      assert(sshigh * 2 == bhigh);
#endif  // !CONFIG_EXT_RECUR_PARTITIONS
      if (mbmi_below->sb_type[plane_type] == subsize) return PARTITION_HORZ;
#if !CONFIG_EXT_RECUR_PARTITIONS
      else
        return PARTITION_HORZ_B;
#endif  // !CONFIG_EXT_RECUR_PARTITIONS
    } else if (sshigh == bhigh) {
      // Smaller width but same height. Is PARTITION_VERT_4, PARTITION_VERT or
      // PARTITION_VERT_B. To distinguish the latter two, check if the right
      // half was split.
      if (sswide * 4 == bwide) {
#if CONFIG_UNEVEN_4WAY
        return PARTITION_VERT_4A;
#elif CONFIG_EXT_RECUR_PARTITIONS
        return PARTITION_VERT_3;
#else   // !CONFIG_UNEVEN_4WAY && !CONFIG_EXT_RECUR_PARTITIONS
        return PARTITION_VERT_4;
#endif  // CONFIG_UNEVEN_4WAY
      }
#if !CONFIG_EXT_RECUR_PARTITIONS
      assert(sswide * 2 == bhigh);
#endif  // !CONFIG_EXT_RECUR_PARTITIONS
      if (mbmi_right->sb_type[plane_type] == subsize) return PARTITION_VERT;

#if !CONFIG_EXT_RECUR_PARTITIONS
      else
        return PARTITION_VERT_B;
#endif  // !CONFIG_EXT_RECUR_PARTITIONS
    } else {
      // Smaller width and smaller height. Might be PARTITION_SPLIT or could be
      // PARTITION_HORZ_A or PARTITION_VERT_A. If subsize isn't halved in both
      // dimensions, we immediately know this is a split (which will recurse to
      // get to subsize). Otherwise look down and to the right. With
      // PARTITION_VERT_A, the right block will have height bhigh; with
      // PARTITION_HORZ_A, the lower block with have width bwide. Otherwise
      // it's PARTITION_SPLIT.
#if CONFIG_EXT_RECUR_PARTITIONS
      if (sswide * 2 != bwide || sshigh * 2 != bhigh) {
        if (mi_size_wide[mbmi_below->sb_type[plane_type]] < bwide &&
            mi_size_high[mbmi_right->sb_type[plane_type]] < bhigh)
          return PARTITION_SPLIT;
      }
#else   // CONFIG_EXT_RECUR_PARTITIONS
      if (sswide * 2 != bwide || sshigh * 2 != bhigh) return PARTITION_SPLIT;
      if (mi_size_wide[mbmi_below->sb_type[plane_type]] == bwide)
        return PARTITION_HORZ_A;
      if (mi_size_high[mbmi_right->sb_type[plane_type]] == bhigh)
        return PARTITION_VERT_A;
#endif  // CONFIG_EXT_RECUR_PARTITIONS
      return PARTITION_SPLIT;
    }
  }
  const int vert_split = sswide < bwide;
  const int horz_split = sshigh < bhigh;
  const int split_idx = (vert_split << 1) | horz_split;
  assert(split_idx != 0);

  static const PARTITION_TYPE base_partitions[4] = {
    PARTITION_INVALID, PARTITION_HORZ, PARTITION_VERT, PARTITION_SPLIT
  };

  return base_partitions[split_idx];
}

static INLINE void set_sb_size(SequenceHeader *const seq_params,
                               BLOCK_SIZE sb_size) {
  seq_params->sb_size = sb_size;
  seq_params->mib_size = mi_size_wide[seq_params->sb_size];
  seq_params->mib_size_log2 = mi_size_wide_log2[seq_params->sb_size];
}

#if CONFIG_LR_FLEX_SYNTAX
// Sets the frame's lr specific fields in feature params depending on
// which tools are enabled for the frame for the given plane.
static INLINE void av1_set_lr_tools(uint8_t lr_tools_disable_mask, int plane,
                                    FeatureFlags *const fea_params) {
  fea_params->lr_tools_disable_mask[plane] = lr_tools_disable_mask;
  int tools_count = 0;
  for (int i = 1; i < RESTORE_SWITCHABLE_TYPES; ++i)
    tools_count += !((fea_params->lr_tools_disable_mask[plane] >> i) & 1);
  fea_params->lr_tools_count[plane] = tools_count;
  fea_params->lr_switchable_tools_count[plane] = tools_count + 1;

  // If total tools is < 2, there is no need to have switchable
  if (tools_count < 2)
    fea_params->lr_tools_disable_mask[plane] |= (1 << RESTORE_SWITCHABLE);
  else
    tools_count++;
  fea_params->lr_frame_tools_count[plane] = tools_count + 1;

  // If switchable is allowed get last index for transmitted bit, and the
  // type if that bit is 0.
  if (!((fea_params->lr_tools_disable_mask[plane] >> RESTORE_SWITCHABLE) & 1)) {
    for (int t = 0, i = RESTORE_SWITCHABLE_TYPES - 1; i >= 0; --i) {
      if (!((fea_params->lr_tools_disable_mask[plane] >> i) & 1)) {
        t++;
        if (t == 1) {
          fea_params->lr_last_switchable_ndx_0_type[plane] = i;
        } else if (t == 2) {
          fea_params->lr_last_switchable_ndx[plane] = i;
          break;
        }
      }
    }
  }
}
#endif  // CONFIG_LR_FLEX_SYNTAX

static INLINE SB_INFO *av1_get_sb_info(const AV1_COMMON *cm, int mi_row,
                                       int mi_col) {
  const int sb_row = mi_row >> cm->seq_params.mib_size_log2;
  const int sb_col = mi_col >> cm->seq_params.mib_size_log2;
  return cm->sbi_params.sbi_grid_base + sb_row * cm->sbi_params.sbi_stride +
         sb_col;
}

static INLINE void av1_set_sb_info(AV1_COMMON *cm, MACROBLOCKD *xd, int mi_row,
                                   int mi_col) {
  SB_INFO *sbi = xd->sbi = av1_get_sb_info(cm, mi_row, mi_col);

  sbi->mi_row = mi_row;
  sbi->mi_col = mi_col;

#if CONFIG_FLEX_MVRES
  sbi->sb_mv_precision = cm->features.fr_mv_precision;
#endif  // CONFIG_FLEX_MVRES
}

// Returns true if the frame is fully lossless at the coded resolution.
// Note: If super-resolution is used, such a frame will still NOT be lossless at
// the upscaled resolution.
static INLINE int is_coded_lossless(const AV1_COMMON *cm,
                                    const MACROBLOCKD *xd) {
  int coded_lossless = 1;
  if (cm->seg.enabled) {
    for (int i = 0; i < MAX_SEGMENTS; ++i) {
      if (!xd->lossless[i]) {
        coded_lossless = 0;
        break;
      }
    }
  } else {
    coded_lossless = xd->lossless[0];
  }
  return coded_lossless;
}

static INLINE int is_valid_seq_level_idx(AV1_LEVEL seq_level_idx) {
  return seq_level_idx == SEQ_LEVEL_MAX ||
         (seq_level_idx < SEQ_LEVELS &&
          // The following levels are currently undefined.
          seq_level_idx != SEQ_LEVEL_2_2 && seq_level_idx != SEQ_LEVEL_2_3 &&
          seq_level_idx != SEQ_LEVEL_3_2 && seq_level_idx != SEQ_LEVEL_3_3 &&
          seq_level_idx != SEQ_LEVEL_4_2 && seq_level_idx != SEQ_LEVEL_4_3 &&
          seq_level_idx != SEQ_LEVEL_7_0 && seq_level_idx != SEQ_LEVEL_7_1 &&
          seq_level_idx != SEQ_LEVEL_7_2 && seq_level_idx != SEQ_LEVEL_7_3);
}

// Intra derivative for directional predictions.
// second_dr_intra_derivative[x] = 64*64/dr_intra_derivative[x]
#if CONFIG_EXT_DIR
static const int16_t dr_intra_derivative[90] = {
  // Angle in degrees.
  // Starred (*) values are unused.
  0,    4096, 2048,            //    *,  0.9,  1.8,
  1365, 1024, 819,             //  2.7,  3.6,  4.5,
  682,  585,  512,             //  5.4,  6.2,  7.1,
  455,  409,  409,  409, 372,  //  8.0,  8.9, *, *,  9.8,
  341,  292,  273,             // 10.6, 12.4, 13.2,
  256,  227,  215,             // 14.0, 15.7, 16.6,
  204,  186,  178,             // 17.4, 19.0, 19.8,
  170,  157,  151,             // 20.6, 22.2, 23.0,
  146,  136,  132,             // 23.7, 25.2, 25.9,
  128,  117,  110,             // 26.6, 28.7, 30.2,
  107,  99,   97,   97,        // 30.9, 32.9,    *, 33.4,
  93,   87,   83,              // 34.5, 36.3, 37.6,
  81,   77,   74,              // 38.3, 39.7, 40.9,
  73,   69,   66,              // 41.2, 42.8, 44.1,
  64,   62,   59,              // 45.0, 45.9, 47.3,
  56,   55,   53,              // 48.8, 49.3, 50.4,
  50,   49,   47,              // 52.0, 52.6, 53.7,
  44,   42,   42,   41,        // 55.5, 56.7,    *, 57.4,
  38,   37,   35,              // 59.3, 60.0, 61.3,
  32,   31,   30,              // 63.4, 64.2, 64.9,
  28,   27,   26,              // 66.4, 67.1, 67.9,
  24,   23,   22,              // 69.4, 70.2, 71.0,
  20,   19,   18,              // 72.6, 73.5, 74.3,
  16,   15,   14,              // 76.0, 76.8, 77.7,
  12,   11,   10,   10,  10,   // 79.4, 80.2, *, *, 81.1,
  9,    8,    7,               // 82.0, 82.9, 83.8,
  6,    5,    4,               // 84.6, 85.5, 86.4,
  3,    2,    1,               // 87.3, 88.2, 89.1,
};
#elif CONFIG_IMPROVED_ANGULAR_INTRA
static const int16_t second_dr_intra_derivative[90] = {
  0,    0, 0,        //
  2,    0, 0,        // 3, ...
  4,    0, 0,        // 6, ...
  8,    0, 0, 0, 0,  // 9, ...
  12,   0, 0,        // 14, ...
  16,   0, 0,        // 17, ...
  20,   0, 0,        // 20, ...
  24,   0, 0,        // 23, ... (113 & 203 are base angles)
  28,   0, 0,        // 26, ...
  32,   0, 0,        // 29, ...
  38,   0, 0, 0,     // 32, ...
  44,   0, 0,        // 36, ...
  50,   0, 0,        // 39, ...
  56,   0, 0,        // 42, ...
  64,   0, 0,        // 45, ... (45 & 135 are base angles)
  72,   0, 0,        // 48, ...
  82,   0, 0,        // 51, ...
  92,   0, 0, 0,     // 54, ...
  106,  0, 0,        // 58, ...
  128,  0, 0,        // 61, ...
  146,  0, 0,        // 64, ...
  170,  0, 0,        // 67, ... (67 & 157 are base angles)
  204,  0, 0,        // 70, ...
  256,  0, 0,        // 73, ...
  340,  0, 0, 0, 0,  // 76, ...
  512,  0, 0,        // 81, ...
  1024, 0, 0,        // 84, ...
  2048, 0, 0,        // 87, ...
};
#else
static const int16_t second_dr_intra_derivative[90] = {
  0,    0, 0,        //
  4,    0, 0,        // 3, ...
  7,    0, 0,        // 6, ...
  11,   0, 0, 0, 0,  // 9, ...
  15,   0, 0,        // 14, ...
  19,   0, 0,        // 17, ...
  23,   0, 0,        // 20, ...
  27,   0, 0,        // 23, ... (113 & 203 are base angles)
  31,   0, 0,        // 26, ...
  35,   0, 0,        // 29, ...
  40,   0, 0, 0,     // 32, ...
  46,   0, 0,        // 36, ...
  51,   0, 0,        // 39, ...
  58,   0, 0,        // 42, ...
  64,   0, 0,        // 45, ... (45 & 135 are base angles)
  72,   0, 0,        // 48, ...
  80,   0, 0,        // 51, ...
  91,   0, 0, 0,     // 54, ...
  102,  0, 0,        // 58, ...
  117,  0, 0,        // 61, ...
  132,  0, 0,        // 64, ...
  152,  0, 0,        // 67, ... (67 & 157 are base angles)
  178,  0, 0,        // 70, ...
  216,  0, 0,        // 73, ...
  273,  0, 0, 0, 0,  // 76, ...
  372,  0, 0,        // 81, ...
  585,  0, 0,        // 84, ...
  1365, 0, 0,        // 87, ...
};
#endif  // CONFIG_EXT_DIR

// Generate the weights per pixel position for IBP
static void av1_dr_prediction_z1_info(uint8_t *weights, int bw, int bh,
                                      int txw_log2, int txh_log2, int dy,
                                      int mode) {
  int32_t r, c, y;

  int len0 = -1;
  int len1 = -1;
  int f0 = 1024;
  int f1 = 1024;
  int f2 = 1024;
  int d0 = 0;
  int d1 = 0;
  int d2 = 0;
  if (mode == D67_PRED) {
    f0 = ((bw <= 8) && (bh <= 8)) ? 512 : 1024;
    f1 = ((bw <= 8) && (bh <= 8)) ? 256 : 512;
    f2 = ((bw <= 8) && (bh <= 8)) ? 128 : 256;
    d0 = ROUND_POWER_OF_TWO(f0 - f1, (txh_log2 - 1));
    d1 = ROUND_POWER_OF_TWO(f1 - f2, (txw_log2 - 1));
    d2 = ROUND_POWER_OF_TWO(f2, (txw_log2 - 1));
  }
  if (mode == V_PRED) {
    f0 = ((bw <= 8) && (bh <= 8)) ? 256 : 512;
    f1 = ((bw <= 8) && (bh <= 8)) ? 128 : 256;
    f2 = ((bw <= 8) && (bh <= 8)) ? 64 : 128;
    d0 = ROUND_POWER_OF_TWO(f0 - f1, (txh_log2 - 2));
    d1 = ROUND_POWER_OF_TWO(f1 - f2, (txw_log2 - 1));
    d2 = ROUND_POWER_OF_TWO(f2, (txw_log2 - 1));
  }

  for (r = 0; r < bh; ++r) {
    if (mode == D67_PRED) {
      len0 = (bh - r) >> 1;
      len1 = ((bh - r) >> 1) + (bw >> 1);
    }
    if (mode == V_PRED) {
      len0 = (bh - r) >> 2;
      len1 = ((bh - r) >> 2) + (bw >> 1);
    }
    y = dy;
    for (c = 0; c < bw; ++c, y += dy) {
      uint32_t dist = ((r + 1) << 6) + y;
      int16_t shift = 0;
      int16_t div = resolve_divisor_32(dist, &shift);
      shift -= DIV_LUT_BITS;
      int32_t weight0 = ROUND_POWER_OF_TWO(y * div, shift);
      if ((len0 > -1) && (len1 > -1)) {
        int weight1 = IBP_WEIGHT_MAX - weight0;
        if (c <= len0) {
          int fac = ((len0 - c) * d0 + f1);
          weight1 = (fac > f0) ? weight1 * f0 : weight1 * fac;
        } else if (c <= len1) {
          int fac = ((len1 - c) * d1 + f2);
          weight1 = (fac > f1) ? weight1 * f1 : weight1 * fac;
        } else {
          int fac = (f2 - (c - len1) * d2);
          weight1 = (fac < 0) ? 0 : weight1 * fac;
        }
        weight1 = ROUND_POWER_OF_TWO(weight1, 10);
        weight0 = IBP_WEIGHT_MAX - weight1;
      }
      weights[c] = weight0;
    }
    weights += bw;
  }
}

static const uint8_t angle_to_mode_index[90] = {
  0, 0, 0,  0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 0,  0, 0, 0,  0, 0, 0,  0, 0, 0,
  0, 0, 0,  0, 0, 0,  0, 0, 0,  0, 0, 0, 0, 16, 0, 0, 15, 0, 0, 14, 0, 0, 13,
  0, 0, 12, 0, 0, 11, 0, 0, 10, 0, 0, 0, 9, 0,  0, 8, 0,  0, 7, 0,  0, 6, 0,
  0, 5, 0,  0, 4, 0,  0, 3, 0,  0, 0, 0, 2, 0,  0, 1, 0,  0, 0, 0,  0
};

// Generate weights for IBP of one directional mode
static INLINE void init_ibp_info_per_mode(
    uint8_t *weights[TX_SIZES_ALL][DIR_MODES_0_90], int block_idx, int mode,
    int delta, int txw, int txh, int txw_log2, int txh_log2) {
  const int angle = mode_to_angle_map[mode] + delta * 3;
  const int mode_idx = angle_to_mode_index[angle];
#if CONFIG_EXT_DIR
  const int dy = dr_intra_derivative[90 - angle];
#else
  const int dy = second_dr_intra_derivative[angle];
#endif  // CONFIG_EXT_DIR
  weights[block_idx][mode_idx] =
      (uint8_t *)(aom_calloc(txw * txh, sizeof(uint8_t)));
  av1_dr_prediction_z1_info(weights[block_idx][mode_idx], txw, txh, txw_log2,
                            txh_log2, dy, mode);
  return;
}

// Generate weights for IBP of directional modes
static INLINE void init_ibp_info(
    uint8_t *weights[TX_SIZES_ALL][DIR_MODES_0_90]) {
  assert(weights != NULL);
  for (TX_SIZE iblock = TX_4X4; iblock < TX_SIZES_ALL; iblock++) {
    const int txw = tx_size_wide[iblock];
    const int txh = tx_size_high[iblock];
    const int txw_log2 = tx_size_wide_log2[iblock];
    const int txh_log2 = tx_size_high_log2[iblock];
#if CONFIG_IMPROVED_ANGULAR_INTRA
    for (int delta = -2; delta < 0; delta += 2) {
#else
    for (int delta = -3; delta < 0; delta++) {
#endif  // CONFIG_IMPROVED_ANGULAR_INTRA
      init_ibp_info_per_mode(weights, iblock, V_PRED, delta, txw, txh, txw_log2,
                             txh_log2);
      init_ibp_info_per_mode(weights, iblock, D67_PRED, delta, txw, txh,
                             txw_log2, txh_log2);
      init_ibp_info_per_mode(weights, iblock, D45_PRED, delta, txw, txh,
                             txw_log2, txh_log2);
    }
#if CONFIG_IMPROVED_ANGULAR_INTRA
    for (int delta = 0; delta <= 2; delta += 2) {
#else
    for (int delta = 0; delta <= 3; delta++) {
#endif  // CONFIG_IMPROVED_ANGULAR_INTRA
      init_ibp_info_per_mode(weights, iblock, D67_PRED, delta, txw, txh,
                             txw_log2, txh_log2);
      init_ibp_info_per_mode(weights, iblock, D45_PRED, delta, txw, txh,
                             txw_log2, txh_log2);
    }
  }
}

static INLINE void free_ibp_info(
    uint8_t *weights[TX_SIZES_ALL][DIR_MODES_0_90]) {
  for (int i = 0; i < TX_SIZES_ALL; i++) {
    for (int j = 0; j < DIR_MODES_0_90; j++) {
      aom_free(weights[i][j]);
    }
  }
}

static INLINE int is_global_intrabc_allowed(const AV1_COMMON *const cm) {
#if CONFIG_IBC_SR_EXT
  return frame_is_intra_only(cm) && cm->features.allow_intrabc &&
         cm->features.allow_global_intrabc;
#else
  return cm->features.allow_intrabc;
#endif
}
/*!\endcond */

#if CONFIG_FLEX_MVRES
static inline int is_this_mv_precision_compliant(
    const MV this_mv, MvSubpelPrecision pb_mv_precision) {
  bool check_row = this_mv.row &
                   ((1 << (MV_PRECISION_ONE_EIGHTH_PEL - pb_mv_precision)) - 1);
  bool check_col = this_mv.col &
                   ((1 << (MV_PRECISION_ONE_EIGHTH_PEL - pb_mv_precision)) - 1);
  return (check_row || check_col) ? 0 : 1;
}
#endif  // CONFIG_FLEX_MVRES

static INLINE bool is_warp_mode(MOTION_MODE motion_mode) {
#if CONFIG_EXTENDED_WARP_PREDICTION
  return (motion_mode >= WARPED_CAUSAL);
#else
  return (motion_mode == WARPED_CAUSAL);
#endif  // CONFIG_EXTENDED_WARP_PREDICTION
}

#if CONFIG_EXTENDED_WARP_PREDICTION
/* Evaluate which motion modes are allowed for the current block
 * Returns a bit field, where motion mode `i` is allowed if and only if
 * the i'th bit is set.
 *
 * That is, to check if a given motion mode is allowed, do the following:
 *   int allowed_motion_modes = motion_mode_allowed([...]);
 *   if (allowed_motion_modes & (1 << i)) {
 *     [...]
 *   }
 */

// Returns true WARP_EXTEND is allowed by checking the top and left neighboring
// blocks.
// this function is used for two cases (a) to decide if WARP_EXTEND mode is
// allowed or not (b) to derive the CDFs for WARPMV mode
int allow_extend_nb(const AV1_COMMON *cm, const MACROBLOCKD *xd,
                    const MB_MODE_INFO *mbmi
#if CONFIG_WARPMV
                    ,
                    int *p_num_of_warp_neighbors
#endif  // CONFIG_WARPMV

);

static INLINE int motion_mode_allowed(const AV1_COMMON *cm,
                                      const MACROBLOCKD *xd,
                                      const CANDIDATE_MV *ref_mv_stack,
                                      const MB_MODE_INFO *mbmi) {
  (void)ref_mv_stack;
  const BLOCK_SIZE bsize = mbmi->sb_type[PLANE_TYPE_Y];
  int enabled_motion_modes = cm->features.enabled_motion_modes;

#if CONFIG_WARPMV
  // only WARP_DELTA and WARPED_CAUSAL are supported for WARPMV mode
  if (mbmi->mode == WARPMV) {
    int allowed_motion_mode_warpmv = (1 << WARP_DELTA);
    int frame_warp_causal_allowed =
        cm->features.enabled_motion_modes & (1 << WARPED_CAUSAL);
    if (frame_warp_causal_allowed && mbmi->num_proj_ref >= 1) {
      allowed_motion_mode_warpmv |= (1 << WARPED_CAUSAL);
    }
    return (allowed_motion_mode_warpmv & enabled_motion_modes);
  }
#endif  // CONFIG_WARPMV

  if (mbmi->skip_mode || mbmi->ref_frame[0] == INTRA_FRAME) {
    return (1 << SIMPLE_TRANSLATION);
  }

#if CONFIG_BAWP
  if (mbmi->bawp_flag == 1) {
    return (1 << SIMPLE_TRANSLATION);
  }
#endif  // CONFIG_BAWP

  int allowed_motion_modes = (1 << SIMPLE_TRANSLATION);

  bool interintra_allowed =
      cm->current_frame.reference_mode != COMPOUND_REFERENCE &&
      is_interintra_allowed(mbmi);

  if (interintra_allowed) {
    allowed_motion_modes |= (1 << INTERINTRA);
  }

#if CONFIG_TIP
  if (is_tip_ref_frame(mbmi->ref_frame[0])) {
//    printf("Warp enabled for TIP? %d", (allowed_motion_modes & enabled_motion_modes));
    return (allowed_motion_modes & enabled_motion_modes);
  }
#endif  // CONFIG_TIP

#if CONFIG_ALLOW_SAME_REF_COMPOUND
  if (mbmi->ref_frame[0] == mbmi->ref_frame[1]) {
//    printf("Warp enabled for same ref? %d", (allowed_motion_modes & enabled_motion_modes));
    return (allowed_motion_modes & enabled_motion_modes);
  }
#endif  // CONFIG_ALLOW_SAME_REF_COMPOUND

  if (xd->cur_frame_force_integer_mv == 0) {
    const TransformationType gm_type =
        cm->global_motion[mbmi->ref_frame[0]].wmtype;
    if (is_global_mv_block(mbmi, gm_type)) {
//      printf("Warp enabled for globa? %d", (allowed_motion_modes & enabled_motion_modes));
      return (allowed_motion_modes & enabled_motion_modes);
    }
  }

  bool motion_variation_allowed =
      is_motion_variation_allowed_bsize(bsize, xd->mi_row, xd->mi_col) &&
      is_inter_mode(mbmi->mode) && is_motion_variation_allowed_compound(mbmi);

  bool obmc_allowed =
      motion_variation_allowed && check_num_overlappable_neighbors(mbmi);

  if (obmc_allowed) {
    allowed_motion_modes |= (1 << OBMC_CAUSAL);
  }

  // From here on, all modes are warped, so have some common criteria:
  const int allow_warped_motion =
      motion_variation_allowed &&
      !xd->cur_frame_force_integer_mv;

  if (obmc_allowed && allow_warped_motion && mbmi->num_proj_ref >= 1
#if CONFIG_WARPMV
      && mbmi->mode != NEARMV
#endif  // CONFIG_WARPMV
  ) {
    allowed_motion_modes |= (1 << WARPED_CAUSAL);
  }

  bool warp_extend_allowed = false;
  PREDICTION_MODE mode = mbmi->mode;

  if (allow_warped_motion && (
#if !CONFIG_WARPMV
                                 mode == NEARMV ||
#endif  // !CONFIG_WARPMV
                                 mode == NEWMV)) {
    warp_extend_allowed = allow_extend_nb(cm, xd, mbmi
#if CONFIG_WARPMV
                                          ,
                                          NULL
#endif  // CONFIG_WARPMV

    );
  }

  if (warp_extend_allowed) {
    allowed_motion_modes |= (1 << WARP_EXTEND);
  }

  bool warp_delta_allowed =
      allow_warped_motion &&
      AOMMIN(block_size_wide[bsize], block_size_high[bsize]) >=
          MIN_BSIZE_WARP_DELTA;

  if (warp_delta_allowed && mode == NEARMV) {
    warp_delta_allowed = false;
  }

  if (warp_delta_allowed) {
    allowed_motion_modes |= (1 << WARP_DELTA);
  }
// printf("Warp enabled? %d", (allowed_motion_modes & enabled_motion_modes));

  return (allowed_motion_modes & enabled_motion_modes);
}
#else
static INLINE MOTION_MODE motion_mode_allowed(const AV1_COMMON *cm,
                                              const MACROBLOCKD *xd,
                                              const MB_MODE_INFO *mbmi) {
  if (!cm->features.switchable_motion_mode) {
    return SIMPLE_TRANSLATION;
  }
#if CONFIG_BAWP
  if (mbmi->bawp_flag == 1) return SIMPLE_TRANSLATION;
#endif  // CONFIG_BAWP

#if CONFIG_TIP
  if (is_tip_ref_frame(mbmi->ref_frame[0])) return SIMPLE_TRANSLATION;
#endif  // CONFIG_TIP

#if CONFIG_ALLOW_SAME_REF_COMPOUND
  if (mbmi->ref_frame[0] == mbmi->ref_frame[1]) return SIMPLE_TRANSLATION;
#endif  // CONFIG_ALLOW_SAME_REF_COMPOUND

  if (xd->cur_frame_force_integer_mv == 0) {
    const TransformationType gm_type =
        cm->global_motion[mbmi->ref_frame[0]].wmtype;
    if (is_global_mv_block(mbmi, gm_type)) return SIMPLE_TRANSLATION;
  }

  if (is_motion_variation_allowed_bsize(mbmi->sb_type[PLANE_TYPE_Y], xd->mi_row,
                                        xd->mi_col) &&
      is_inter_mode(mbmi->mode) && mbmi->ref_frame[1] != INTRA_FRAME &&
      is_motion_variation_allowed_compound(mbmi)) {
    if (!check_num_overlappable_neighbors(mbmi)) return SIMPLE_TRANSLATION;
    assert(!has_second_ref(mbmi));
    const int allow_warped_motion = cm->features.allow_warped_motion;
    if (mbmi->num_proj_ref >= 1 &&
#if CONFIG_2D_SR_SUBSAMPLE_FOR_WARP
        (allow_warped_motion) {
#else
        (allow_warped_motion &&
         !av1_is_scaled(xd->block_ref_scale_factors[0]))) {
#endif
      if (xd->cur_frame_force_integer_mv) {
        return OBMC_CAUSAL;
      }
      return WARPED_CAUSAL;
    }
    return OBMC_CAUSAL;
  } else {
    return SIMPLE_TRANSLATION;
  }
}
#endif
#ifdef __cplusplus
}  // extern "C"
#endif

#endif  // AOM_AV1_COMMON_AV1_COMMON_INT_H_
