tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

blockd.h (56791B)


      1 /*
      2 * Copyright (c) 2016, Alliance for Open Media. All rights reserved.
      3 *
      4 * This source code is subject to the terms of the BSD 2 Clause License and
      5 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
      6 * was not distributed with this source code in the LICENSE file, you can
      7 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
      8 * Media Patent License 1.0 was not distributed with this source code in the
      9 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
     10 */
     11 
     12 #ifndef AOM_AV1_COMMON_BLOCKD_H_
     13 #define AOM_AV1_COMMON_BLOCKD_H_
     14 
     15 #include "config/aom_config.h"
     16 
     17 #include "aom_dsp/aom_dsp_common.h"
     18 #include "aom_ports/mem.h"
     19 #include "aom_scale/yv12config.h"
     20 
     21 #include "av1/common/common_data.h"
     22 #include "av1/common/quant_common.h"
     23 #include "av1/common/entropy.h"
     24 #include "av1/common/entropymode.h"
     25 #include "av1/common/mv.h"
     26 #include "av1/common/scale.h"
     27 #include "av1/common/seg_common.h"
     28 #include "av1/common/tile_common.h"
     29 
     30 #ifdef __cplusplus
     31 extern "C" {
     32 #endif
     33 
     34 #define USE_B_QUANT_NO_TRELLIS 1
     35 
     36 #define MAX_MB_PLANE 3
     37 
     38 #define MAX_DIFFWTD_MASK_BITS 1
     39 
     40 #define INTERINTRA_WEDGE_SIGN 0
     41 
     42 #define DEFAULT_INTER_TX_TYPE DCT_DCT
     43 
     44 #define MAX_PALETTE_BLOCK_WIDTH 64
     45 
     46 #define MAX_PALETTE_BLOCK_HEIGHT 64
     47 
     48 /*!\cond */
     49 
     50 // DIFFWTD_MASK_TYPES should not surpass 1 << MAX_DIFFWTD_MASK_BITS
     51 enum {
     52  DIFFWTD_38 = 0,
     53  DIFFWTD_38_INV,
     54  DIFFWTD_MASK_TYPES,
     55 } UENUM1BYTE(DIFFWTD_MASK_TYPE);
     56 
     57 enum {
     58  KEY_FRAME = 0,
     59  INTER_FRAME = 1,
     60  INTRA_ONLY_FRAME = 2,  // replaces intra-only
     61  S_FRAME = 3,
     62  FRAME_TYPES,
     63 } UENUM1BYTE(FRAME_TYPE);
     64 
     65 static inline int is_comp_ref_allowed(BLOCK_SIZE bsize) {
     66  return AOMMIN(block_size_wide[bsize], block_size_high[bsize]) >= 8;
     67 }
     68 
     69 static inline int is_inter_mode(PREDICTION_MODE mode) {
     70  return mode >= INTER_MODE_START && mode < INTER_MODE_END;
     71 }
     72 
     73 typedef struct {
     74  uint8_t *plane[MAX_MB_PLANE];
     75  int stride[MAX_MB_PLANE];
     76 } BUFFER_SET;
     77 
     78 static inline int is_inter_singleref_mode(PREDICTION_MODE mode) {
     79  return mode >= SINGLE_INTER_MODE_START && mode < SINGLE_INTER_MODE_END;
     80 }
     81 static inline int is_inter_compound_mode(PREDICTION_MODE mode) {
     82  return mode >= COMP_INTER_MODE_START && mode < COMP_INTER_MODE_END;
     83 }
     84 
     85 static inline PREDICTION_MODE compound_ref0_mode(PREDICTION_MODE mode) {
     86  static const PREDICTION_MODE lut[] = {
     87    DC_PRED,        // DC_PRED
     88    V_PRED,         // V_PRED
     89    H_PRED,         // H_PRED
     90    D45_PRED,       // D45_PRED
     91    D135_PRED,      // D135_PRED
     92    D113_PRED,      // D113_PRED
     93    D157_PRED,      // D157_PRED
     94    D203_PRED,      // D203_PRED
     95    D67_PRED,       // D67_PRED
     96    SMOOTH_PRED,    // SMOOTH_PRED
     97    SMOOTH_V_PRED,  // SMOOTH_V_PRED
     98    SMOOTH_H_PRED,  // SMOOTH_H_PRED
     99    PAETH_PRED,     // PAETH_PRED
    100    NEARESTMV,      // NEARESTMV
    101    NEARMV,         // NEARMV
    102    GLOBALMV,       // GLOBALMV
    103    NEWMV,          // NEWMV
    104    NEARESTMV,      // NEAREST_NEARESTMV
    105    NEARMV,         // NEAR_NEARMV
    106    NEARESTMV,      // NEAREST_NEWMV
    107    NEWMV,          // NEW_NEARESTMV
    108    NEARMV,         // NEAR_NEWMV
    109    NEWMV,          // NEW_NEARMV
    110    GLOBALMV,       // GLOBAL_GLOBALMV
    111    NEWMV,          // NEW_NEWMV
    112  };
    113  assert(NELEMENTS(lut) == MB_MODE_COUNT);
    114  assert(is_inter_compound_mode(mode) || is_inter_singleref_mode(mode));
    115  return lut[mode];
    116 }
    117 
    118 static inline PREDICTION_MODE compound_ref1_mode(PREDICTION_MODE mode) {
    119  static const PREDICTION_MODE lut[] = {
    120    MB_MODE_COUNT,  // DC_PRED
    121    MB_MODE_COUNT,  // V_PRED
    122    MB_MODE_COUNT,  // H_PRED
    123    MB_MODE_COUNT,  // D45_PRED
    124    MB_MODE_COUNT,  // D135_PRED
    125    MB_MODE_COUNT,  // D113_PRED
    126    MB_MODE_COUNT,  // D157_PRED
    127    MB_MODE_COUNT,  // D203_PRED
    128    MB_MODE_COUNT,  // D67_PRED
    129    MB_MODE_COUNT,  // SMOOTH_PRED
    130    MB_MODE_COUNT,  // SMOOTH_V_PRED
    131    MB_MODE_COUNT,  // SMOOTH_H_PRED
    132    MB_MODE_COUNT,  // PAETH_PRED
    133    MB_MODE_COUNT,  // NEARESTMV
    134    MB_MODE_COUNT,  // NEARMV
    135    MB_MODE_COUNT,  // GLOBALMV
    136    MB_MODE_COUNT,  // NEWMV
    137    NEARESTMV,      // NEAREST_NEARESTMV
    138    NEARMV,         // NEAR_NEARMV
    139    NEWMV,          // NEAREST_NEWMV
    140    NEARESTMV,      // NEW_NEARESTMV
    141    NEWMV,          // NEAR_NEWMV
    142    NEARMV,         // NEW_NEARMV
    143    GLOBALMV,       // GLOBAL_GLOBALMV
    144    NEWMV,          // NEW_NEWMV
    145  };
    146  assert(NELEMENTS(lut) == MB_MODE_COUNT);
    147  assert(is_inter_compound_mode(mode));
    148  return lut[mode];
    149 }
    150 
    151 static inline int have_nearmv_in_inter_mode(PREDICTION_MODE mode) {
    152  return (mode == NEARMV || mode == NEAR_NEARMV || mode == NEAR_NEWMV ||
    153          mode == NEW_NEARMV);
    154 }
    155 
    156 static inline int have_newmv_in_inter_mode(PREDICTION_MODE mode) {
    157  return (mode == NEWMV || mode == NEW_NEWMV || mode == NEAREST_NEWMV ||
    158          mode == NEW_NEARESTMV || mode == NEAR_NEWMV || mode == NEW_NEARMV);
    159 }
    160 
    161 static inline int is_masked_compound_type(COMPOUND_TYPE type) {
    162  return (type == COMPOUND_WEDGE || type == COMPOUND_DIFFWTD);
    163 }
    164 
    165 /* For keyframes, intra block modes are predicted by the (already decoded)
    166   modes for the Y blocks to the left and above us; for interframes, there
    167   is a single probability table. */
    168 
    169 typedef struct {
    170  // Value of base colors for Y, U, and V
    171  uint16_t palette_colors[3 * PALETTE_MAX_SIZE];
    172  // Number of base colors for Y (0) and UV (1)
    173  uint8_t palette_size[2];
    174 } PALETTE_MODE_INFO;
    175 
    176 typedef struct {
    177  FILTER_INTRA_MODE filter_intra_mode;
    178  uint8_t use_filter_intra;
    179 } FILTER_INTRA_MODE_INFO;
    180 
    181 static const PREDICTION_MODE fimode_to_intradir[FILTER_INTRA_MODES] = {
    182  DC_PRED, V_PRED, H_PRED, D157_PRED, DC_PRED
    183 };
    184 
    185 #if CONFIG_RD_DEBUG
    186 #define TXB_COEFF_COST_MAP_SIZE (MAX_MIB_SIZE)
    187 #endif
    188 
    189 typedef struct RD_STATS {
    190  int rate;
    191  int zero_rate;
    192  int64_t dist;
    193  // Please be careful of using rdcost, it's not guaranteed to be set all the
    194  // time.
    195  // TODO(angiebird): Create a set of functions to manipulate the RD_STATS. In
    196  // these functions, make sure rdcost is always up-to-date according to
    197  // rate/dist.
    198  int64_t rdcost;
    199  int64_t sse;
    200  uint8_t skip_txfm;  // sse should equal to dist when skip_txfm == 1
    201 #if CONFIG_RD_DEBUG
    202  int txb_coeff_cost[MAX_MB_PLANE];
    203 #endif  // CONFIG_RD_DEBUG
    204 } RD_STATS;
    205 
    206 // This struct is used to group function args that are commonly
    207 // sent together in functions related to interinter compound modes
    208 typedef struct {
    209  uint8_t *seg_mask;
    210  int8_t wedge_index;
    211  int8_t wedge_sign;
    212  DIFFWTD_MASK_TYPE mask_type;
    213  COMPOUND_TYPE type;
    214 } INTERINTER_COMPOUND_DATA;
    215 
    216 #define INTER_TX_SIZE_BUF_LEN 16
    217 #define TXK_TYPE_BUF_LEN 64
    218 /*!\endcond */
    219 
    220 /*! \brief Stores the prediction/txfm mode of the current coding block
    221 */
    222 typedef struct MB_MODE_INFO {
    223  /*****************************************************************************
    224   * \name General Info of the Coding Block
    225   ****************************************************************************/
    226  /**@{*/
    227  /*! \brief The block size of the current coding block */
    228  BLOCK_SIZE bsize;
    229  /*! \brief The partition type of the current coding block. */
    230  PARTITION_TYPE partition;
    231  /*! \brief The prediction mode used */
    232  PREDICTION_MODE mode;
    233  /*! \brief The UV mode when intra is used */
    234  UV_PREDICTION_MODE uv_mode;
    235  /*! \brief The q index for the current coding block. */
    236  int current_qindex;
    237  /**@}*/
    238 
    239  /*****************************************************************************
    240   * \name Inter Mode Info
    241   ****************************************************************************/
    242  /**@{*/
    243  /*! \brief The motion vectors used by the current inter mode */
    244  int_mv mv[2];
    245  /*! \brief The reference frames for the MV */
    246  MV_REFERENCE_FRAME ref_frame[2];
    247  /*! \brief Filter used in subpel interpolation. */
    248  int_interpfilters interp_filters;
    249  /*! \brief The motion mode used by the inter prediction. */
    250  MOTION_MODE motion_mode;
    251  /*! \brief Number of samples used by warp causal */
    252  uint8_t num_proj_ref;
    253  /*! \brief The number of overlapped neighbors above/left for obmc/warp motion
    254   * mode. */
    255  uint8_t overlappable_neighbors;
    256  /*! \brief The parameters used in warp motion mode. */
    257  WarpedMotionParams wm_params;
    258  /*! \brief The type of intra mode used by inter-intra */
    259  INTERINTRA_MODE interintra_mode;
    260  /*! \brief The type of wedge used in interintra mode. */
    261  int8_t interintra_wedge_index;
    262  /*! \brief Struct that stores the data used in interinter compound mode. */
    263  INTERINTER_COMPOUND_DATA interinter_comp;
    264  /**@}*/
    265 
    266  /*****************************************************************************
    267   * \name Intra Mode Info
    268   ****************************************************************************/
    269  /**@{*/
    270  /*! \brief Directional mode delta: the angle is base angle + (angle_delta *
    271   * step). */
    272  int8_t angle_delta[PLANE_TYPES];
    273  /*! \brief The type of filter intra mode used (if applicable). */
    274  FILTER_INTRA_MODE_INFO filter_intra_mode_info;
    275  /*! \brief Chroma from Luma: Joint sign of alpha Cb and alpha Cr */
    276  int8_t cfl_alpha_signs;
    277  /*! \brief Chroma from Luma: Index of the alpha Cb and alpha Cr combination */
    278  uint8_t cfl_alpha_idx;
    279  /*! \brief Stores the size and colors of palette mode */
    280  PALETTE_MODE_INFO palette_mode_info;
    281  /**@}*/
    282 
    283  /*****************************************************************************
    284   * \name Transform Info
    285   ****************************************************************************/
    286  /**@{*/
    287  /*! \brief Whether to skip transforming and sending. */
    288  uint8_t skip_txfm;
    289  /*! \brief Transform size when fixed size txfm is used (e.g. intra modes). */
    290  TX_SIZE tx_size;
    291  /*! \brief Transform size when recursive txfm tree is on. */
    292  TX_SIZE inter_tx_size[INTER_TX_SIZE_BUF_LEN];
    293  /**@}*/
    294 
    295  /*****************************************************************************
    296   * \name Loop Filter Info
    297   ****************************************************************************/
    298  /**@{*/
    299  /*! \copydoc MACROBLOCKD::delta_lf_from_base */
    300  int8_t delta_lf_from_base;
    301  /*! \copydoc MACROBLOCKD::delta_lf */
    302  int8_t delta_lf[FRAME_LF_COUNT];
    303  /**@}*/
    304 
    305  /*****************************************************************************
    306   * \name Bitfield for Memory Reduction
    307   ****************************************************************************/
    308  /**@{*/
    309  /*! \brief The segment id */
    310  uint8_t segment_id : 3;
    311  /*! \brief Only valid when temporal update if off. */
    312  uint8_t seg_id_predicted : 1;
    313  /*! \brief Which ref_mv to use */
    314  uint8_t ref_mv_idx : 2;
    315  /*! \brief Inter skip mode */
    316  uint8_t skip_mode : 1;
    317  /*! \brief Whether intrabc is used. */
    318  uint8_t use_intrabc : 1;
    319  /*! \brief Indicates if masked compound is used(1) or not (0). */
    320  uint8_t comp_group_idx : 1;
    321  /*! \brief Indicates whether dist_wtd_comp(0) is used or not (0). */
    322  uint8_t compound_idx : 1;
    323  /*! \brief Whether to use interintra wedge */
    324  uint8_t use_wedge_interintra : 1;
    325  /*! \brief CDEF strength per BLOCK_64X64 */
    326  int8_t cdef_strength : 4;
    327  /**@}*/
    328 
    329 #if CONFIG_RD_DEBUG
    330  /*! \brief RD info used for debugging */
    331  RD_STATS rd_stats;
    332  /*! \brief The current row in unit of 4x4 blocks for debugging */
    333  int mi_row;
    334  /*! \brief The current col in unit of 4x4 blocks for debugging */
    335  int mi_col;
    336 #endif
    337 #if CONFIG_INSPECTION
    338  /*! \brief Whether we are skipping the current rows or columns. */
    339  int16_t tx_skip[TXK_TYPE_BUF_LEN];
    340 #endif
    341 } MB_MODE_INFO;
    342 
    343 /*!\cond */
    344 
    345 static inline int is_intrabc_block(const MB_MODE_INFO *mbmi) {
    346  return mbmi->use_intrabc;
    347 }
    348 
    349 static inline PREDICTION_MODE get_uv_mode(UV_PREDICTION_MODE mode) {
    350  assert(mode < UV_INTRA_MODES);
    351  static const PREDICTION_MODE uv2y[] = {
    352    DC_PRED,        // UV_DC_PRED
    353    V_PRED,         // UV_V_PRED
    354    H_PRED,         // UV_H_PRED
    355    D45_PRED,       // UV_D45_PRED
    356    D135_PRED,      // UV_D135_PRED
    357    D113_PRED,      // UV_D113_PRED
    358    D157_PRED,      // UV_D157_PRED
    359    D203_PRED,      // UV_D203_PRED
    360    D67_PRED,       // UV_D67_PRED
    361    SMOOTH_PRED,    // UV_SMOOTH_PRED
    362    SMOOTH_V_PRED,  // UV_SMOOTH_V_PRED
    363    SMOOTH_H_PRED,  // UV_SMOOTH_H_PRED
    364    PAETH_PRED,     // UV_PAETH_PRED
    365    DC_PRED,        // UV_CFL_PRED
    366    INTRA_INVALID,  // UV_INTRA_MODES
    367    INTRA_INVALID,  // UV_MODE_INVALID
    368  };
    369  return uv2y[mode];
    370 }
    371 
    372 static inline int is_inter_block(const MB_MODE_INFO *mbmi) {
    373  return is_intrabc_block(mbmi) || mbmi->ref_frame[0] > INTRA_FRAME;
    374 }
    375 
    376 static inline int has_second_ref(const MB_MODE_INFO *mbmi) {
    377  return mbmi->ref_frame[1] > INTRA_FRAME;
    378 }
    379 
    380 static inline int has_uni_comp_refs(const MB_MODE_INFO *mbmi) {
    381  return has_second_ref(mbmi) && (!((mbmi->ref_frame[0] >= BWDREF_FRAME) ^
    382                                    (mbmi->ref_frame[1] >= BWDREF_FRAME)));
    383 }
    384 
    385 static inline MV_REFERENCE_FRAME comp_ref0(int ref_idx) {
    386  static const MV_REFERENCE_FRAME lut[] = {
    387    LAST_FRAME,     // LAST_LAST2_FRAMES,
    388    LAST_FRAME,     // LAST_LAST3_FRAMES,
    389    LAST_FRAME,     // LAST_GOLDEN_FRAMES,
    390    BWDREF_FRAME,   // BWDREF_ALTREF_FRAMES,
    391    LAST2_FRAME,    // LAST2_LAST3_FRAMES
    392    LAST2_FRAME,    // LAST2_GOLDEN_FRAMES,
    393    LAST3_FRAME,    // LAST3_GOLDEN_FRAMES,
    394    BWDREF_FRAME,   // BWDREF_ALTREF2_FRAMES,
    395    ALTREF2_FRAME,  // ALTREF2_ALTREF_FRAMES,
    396  };
    397  assert(NELEMENTS(lut) == TOTAL_UNIDIR_COMP_REFS);
    398  return lut[ref_idx];
    399 }
    400 
    401 static inline MV_REFERENCE_FRAME comp_ref1(int ref_idx) {
    402  static const MV_REFERENCE_FRAME lut[] = {
    403    LAST2_FRAME,    // LAST_LAST2_FRAMES,
    404    LAST3_FRAME,    // LAST_LAST3_FRAMES,
    405    GOLDEN_FRAME,   // LAST_GOLDEN_FRAMES,
    406    ALTREF_FRAME,   // BWDREF_ALTREF_FRAMES,
    407    LAST3_FRAME,    // LAST2_LAST3_FRAMES
    408    GOLDEN_FRAME,   // LAST2_GOLDEN_FRAMES,
    409    GOLDEN_FRAME,   // LAST3_GOLDEN_FRAMES,
    410    ALTREF2_FRAME,  // BWDREF_ALTREF2_FRAMES,
    411    ALTREF_FRAME,   // ALTREF2_ALTREF_FRAMES,
    412  };
    413  assert(NELEMENTS(lut) == TOTAL_UNIDIR_COMP_REFS);
    414  return lut[ref_idx];
    415 }
    416 
    417 PREDICTION_MODE av1_left_block_mode(const MB_MODE_INFO *left_mi);
    418 
    419 PREDICTION_MODE av1_above_block_mode(const MB_MODE_INFO *above_mi);
    420 
    421 static inline int is_global_mv_block(const MB_MODE_INFO *const mbmi,
    422                                     TransformationType type) {
    423  const PREDICTION_MODE mode = mbmi->mode;
    424  const BLOCK_SIZE bsize = mbmi->bsize;
    425  const int block_size_allowed =
    426      AOMMIN(block_size_wide[bsize], block_size_high[bsize]) >= 8;
    427  return (mode == GLOBALMV || mode == GLOBAL_GLOBALMV) && type > TRANSLATION &&
    428         block_size_allowed;
    429 }
    430 
    431 #if CONFIG_MISMATCH_DEBUG
    432 static inline void mi_to_pixel_loc(int *pixel_c, int *pixel_r, int mi_col,
    433                                   int mi_row, int tx_blk_col, int tx_blk_row,
    434                                   int subsampling_x, int subsampling_y) {
    435  *pixel_c = ((mi_col >> subsampling_x) << MI_SIZE_LOG2) +
    436             (tx_blk_col << MI_SIZE_LOG2);
    437  *pixel_r = ((mi_row >> subsampling_y) << MI_SIZE_LOG2) +
    438             (tx_blk_row << MI_SIZE_LOG2);
    439 }
    440 #endif
    441 
    442 enum { MV_PRECISION_Q3, MV_PRECISION_Q4 } UENUM1BYTE(mv_precision);
    443 
    444 struct buf_2d {
    445  uint8_t *buf;
    446  uint8_t *buf0;
    447  int width;
    448  int height;
    449  int stride;
    450 };
    451 
    452 typedef struct eob_info {
    453  uint16_t eob;
    454  uint16_t max_scan_line;
    455 } eob_info;
    456 
    457 typedef struct {
    458  DECLARE_ALIGNED(32, tran_low_t, dqcoeff[MAX_MB_PLANE][MAX_SB_SQUARE]);
    459  eob_info eob_data[MAX_MB_PLANE]
    460                   [MAX_SB_SQUARE / (TX_SIZE_W_MIN * TX_SIZE_H_MIN)];
    461  DECLARE_ALIGNED(16, uint8_t, color_index_map[2][MAX_SB_SQUARE]);
    462 } CB_BUFFER;
    463 
    464 typedef struct macroblockd_plane {
    465  PLANE_TYPE plane_type;
    466  int subsampling_x;
    467  int subsampling_y;
    468  struct buf_2d dst;
    469  struct buf_2d pre[2];
    470  ENTROPY_CONTEXT *above_entropy_context;
    471  ENTROPY_CONTEXT *left_entropy_context;
    472 
    473  // The dequantizers below are true dequantizers used only in the
    474  // dequantization process.  They have the same coefficient
    475  // shift/scale as TX.
    476  int16_t seg_dequant_QTX[MAX_SEGMENTS][2];
    477  // Pointer to color index map of:
    478  // - Current coding block, on encoder side.
    479  // - Current superblock, on decoder side.
    480  uint8_t *color_index_map;
    481 
    482  // block size in pixels
    483  uint8_t width, height;
    484 
    485  qm_val_t *seg_iqmatrix[MAX_SEGMENTS][TX_SIZES_ALL];
    486  qm_val_t *seg_qmatrix[MAX_SEGMENTS][TX_SIZES_ALL];
    487 } MACROBLOCKD_PLANE;
    488 
    489 #define BLOCK_OFFSET(i) ((i) << 4)
    490 
    491 /*!\endcond */
    492 
    493 /*!\brief Parameters related to Wiener Filter */
    494 typedef struct {
    495  /*!
    496   * Vertical filter kernel.
    497   */
    498  DECLARE_ALIGNED(16, InterpKernel, vfilter);
    499 
    500  /*!
    501   * Horizontal filter kernel.
    502   */
    503  DECLARE_ALIGNED(16, InterpKernel, hfilter);
    504 } WienerInfo;
    505 
    506 /*!\brief Parameters related to Sgrproj Filter */
    507 typedef struct {
    508  /*!
    509   * Parameter index.
    510   */
    511  int ep;
    512 
    513  /*!
    514   * Weights for linear combination of filtered versions
    515   */
    516  int xqd[2];
    517 } SgrprojInfo;
    518 
    519 /*!\cond */
    520 
    521 #define CFL_MAX_BLOCK_SIZE (BLOCK_32X32)
    522 #define CFL_BUF_LINE (32)
    523 #define CFL_BUF_LINE_I128 (CFL_BUF_LINE >> 3)
    524 #define CFL_BUF_LINE_I256 (CFL_BUF_LINE >> 4)
    525 #define CFL_BUF_SQUARE (CFL_BUF_LINE * CFL_BUF_LINE)
    526 typedef struct cfl_ctx {
    527  // Q3 reconstructed luma pixels (only Q2 is required, but Q3 is used to avoid
    528  // shifts)
    529  uint16_t recon_buf_q3[CFL_BUF_SQUARE];
    530  // Q3 AC contributions (reconstructed luma pixels - tx block avg)
    531  int16_t ac_buf_q3[CFL_BUF_SQUARE];
    532 
    533  // Cache the DC_PRED when performing RDO, so it does not have to be recomputed
    534  // for every scaling parameter
    535  bool dc_pred_is_cached[CFL_PRED_PLANES];
    536  // Whether the DC_PRED cache is enabled. The DC_PRED cache is disabled when
    537  // decoding.
    538  bool use_dc_pred_cache;
    539  // Only cache the first row of the DC_PRED
    540  int16_t dc_pred_cache[CFL_PRED_PLANES][CFL_BUF_LINE];
    541 
    542  // Height and width currently used in the CfL prediction buffer.
    543  int buf_height, buf_width;
    544 
    545  int are_parameters_computed;
    546 
    547  // Chroma subsampling
    548  int subsampling_x, subsampling_y;
    549 
    550  // Whether the reconstructed luma pixels need to be stored
    551  int store_y;
    552 } CFL_CTX;
    553 
    554 typedef struct dist_wtd_comp_params {
    555  int use_dist_wtd_comp_avg;
    556  int fwd_offset;
    557  int bck_offset;
    558 } DIST_WTD_COMP_PARAMS;
    559 
    560 struct scale_factors;
    561 
    562 /*!\endcond */
    563 
    564 /*! \brief Variables related to current coding block.
    565 *
    566 * This is a common set of variables used by both encoder and decoder.
    567 * Most/all of the pointers are mere pointers to actual arrays are allocated
    568 * elsewhere. This is mostly for coding convenience.
    569 */
    570 typedef struct macroblockd {
    571  /**
    572   * \name Position of current macroblock in mi units
    573   */
    574  /**@{*/
    575  int mi_row; /*!< Row position in mi units. */
    576  int mi_col; /*!< Column position in mi units. */
    577  /**@}*/
    578 
    579  /*!
    580   * Same as cm->mi_params.mi_stride, copied here for convenience.
    581   */
    582  int mi_stride;
    583 
    584  /*!
    585   * True if current block transmits chroma information.
    586   * More detail:
    587   * Smallest supported block size for both luma and chroma plane is 4x4. Hence,
    588   * in case of subsampled chroma plane (YUV 4:2:0 or YUV 4:2:2), multiple luma
    589   * blocks smaller than 8x8 maybe combined into one chroma block.
    590   * For example, for YUV 4:2:0, let's say an 8x8 area is split into four 4x4
    591   * luma blocks. Then, a single chroma block of size 4x4 will cover the area of
    592   * these four luma blocks. This is implemented in bitstream as follows:
    593   * - There are four MB_MODE_INFO structs for the four luma blocks.
    594   * - First 3 MB_MODE_INFO have is_chroma_ref = false, and so do not transmit
    595   * any information for chroma planes.
    596   * - Last block will have is_chroma_ref = true and transmits chroma
    597   * information for the 4x4 chroma block that covers whole 8x8 area covered by
    598   * four luma blocks.
    599   * Similar logic applies for chroma blocks that cover 2 or 3 luma blocks.
    600   */
    601  bool is_chroma_ref;
    602 
    603  /*!
    604   * Info specific to each plane.
    605   */
    606  struct macroblockd_plane plane[MAX_MB_PLANE];
    607 
    608  /*!
    609   * Tile related info.
    610   */
    611  TileInfo tile;
    612 
    613  /*!
    614   * Appropriate offset inside cm->mi_params.mi_grid_base based on current
    615   * mi_row and mi_col.
    616   */
    617  MB_MODE_INFO **mi;
    618 
    619  /*!
    620   * True if 4x4 block above the current block is available.
    621   */
    622  bool up_available;
    623  /*!
    624   * True if 4x4 block to the left of the current block is available.
    625   */
    626  bool left_available;
    627  /*!
    628   * True if the above chrome reference block is available.
    629   */
    630  bool chroma_up_available;
    631  /*!
    632   * True if the left chrome reference block is available.
    633   */
    634  bool chroma_left_available;
    635 
    636  /*!
    637   * MB_MODE_INFO for 4x4 block to the left of the current block, if
    638   * left_available == true; otherwise NULL.
    639   */
    640  MB_MODE_INFO *left_mbmi;
    641  /*!
    642   * MB_MODE_INFO for 4x4 block above the current block, if
    643   * up_available == true; otherwise NULL.
    644   */
    645  MB_MODE_INFO *above_mbmi;
    646  /*!
    647   * Above chroma reference block if is_chroma_ref == true for the current block
    648   * and chroma_up_available == true; otherwise NULL.
    649   * See also: the special case logic when current chroma block covers more than
    650   * one luma blocks in set_mi_row_col().
    651   */
    652  MB_MODE_INFO *chroma_left_mbmi;
    653  /*!
    654   * Left chroma reference block if is_chroma_ref == true for the current block
    655   * and chroma_left_available == true; otherwise NULL.
    656   * See also: the special case logic when current chroma block covers more than
    657   * one luma blocks in set_mi_row_col().
    658   */
    659  MB_MODE_INFO *chroma_above_mbmi;
    660 
    661  /*!
    662   * Appropriate offset based on current 'mi_row' and 'mi_col', inside
    663   * 'tx_type_map' in one of 'CommonModeInfoParams', 'PICK_MODE_CONTEXT' or
    664   * 'MACROBLOCK' structs.
    665   */
    666  uint8_t *tx_type_map;
    667  /*!
    668   * Stride for 'tx_type_map'. Note that this may / may not be same as
    669   * 'mi_stride', depending on which actual array 'tx_type_map' points to.
    670   */
    671  int tx_type_map_stride;
    672 
    673  /**
    674   * \name Distance of this macroblock from frame edges in 1/8th pixel units.
    675   */
    676  /**@{*/
    677  int mb_to_left_edge;   /*!< Distance from left edge */
    678  int mb_to_right_edge;  /*!< Distance from right edge */
    679  int mb_to_top_edge;    /*!< Distance from top edge */
    680  int mb_to_bottom_edge; /*!< Distance from bottom edge */
    681  /**@}*/
    682 
    683  /*!
    684   * Scale factors for reference frames of the current block.
    685   * These are pointers into 'cm->ref_scale_factors'.
    686   */
    687  const struct scale_factors *block_ref_scale_factors[2];
    688 
    689  /*!
    690   * - On encoder side: points to cpi->source, which is the buffer containing
    691   * the current *source* frame (maybe filtered).
    692   * - On decoder side: points to cm->cur_frame->buf, which is the buffer into
    693   * which current frame is being *decoded*.
    694   */
    695  const YV12_BUFFER_CONFIG *cur_buf;
    696 
    697  /*!
    698   * Entropy contexts for the above blocks.
    699   * above_entropy_context[i][j] corresponds to above entropy context for ith
    700   * plane and jth mi column of this *frame*, wrt current 'mi_row'.
    701   * These are pointers into 'cm->above_contexts.entropy'.
    702   */
    703  ENTROPY_CONTEXT *above_entropy_context[MAX_MB_PLANE];
    704  /*!
    705   * Entropy contexts for the left blocks.
    706   * left_entropy_context[i][j] corresponds to left entropy context for ith
    707   * plane and jth mi row of this *superblock*, wrt current 'mi_col'.
    708   * Note: These contain actual data, NOT pointers.
    709   */
    710  ENTROPY_CONTEXT left_entropy_context[MAX_MB_PLANE][MAX_MIB_SIZE];
    711 
    712  /*!
    713   * Partition contexts for the above blocks.
    714   * above_partition_context[i] corresponds to above partition context for ith
    715   * mi column of this *frame*, wrt current 'mi_row'.
    716   * This is a pointer into 'cm->above_contexts.partition'.
    717   */
    718  PARTITION_CONTEXT *above_partition_context;
    719  /*!
    720   * Partition contexts for the left blocks.
    721   * left_partition_context[i] corresponds to left partition context for ith
    722   * mi row of this *superblock*, wrt current 'mi_col'.
    723   * Note: These contain actual data, NOT pointers.
    724   */
    725  PARTITION_CONTEXT left_partition_context[MAX_MIB_SIZE];
    726 
    727  /*!
    728   * Transform contexts for the above blocks.
    729   * above_txfm_context[i] corresponds to above transform context for ith mi col
    730   * from the current position (mi row and mi column) for this *frame*.
    731   * This is a pointer into 'cm->above_contexts.txfm'.
    732   */
    733  TXFM_CONTEXT *above_txfm_context;
    734  /*!
    735   * Transform contexts for the left blocks.
    736   * left_txfm_context[i] corresponds to left transform context for ith mi row
    737   * from the current position (mi_row and mi_col) for this *superblock*.
    738   * This is a pointer into 'left_txfm_context_buffer'.
    739   */
    740  TXFM_CONTEXT *left_txfm_context;
    741  /*!
    742   * left_txfm_context_buffer[i] is the left transform context for ith mi_row
    743   * in this *superblock*.
    744   * Behaves like an internal actual buffer which 'left_txt_context' points to,
    745   * and never accessed directly except to fill in initial default values.
    746   */
    747  TXFM_CONTEXT left_txfm_context_buffer[MAX_MIB_SIZE];
    748 
    749  /**
    750   * \name Default values for the two restoration filters for each plane.
    751   * Default values for the two restoration filters for each plane.
    752   * These values are used as reference values when writing the bitstream. That
    753   * is, we transmit the delta between the actual values in
    754   * cm->rst_info[plane].unit_info[unit_idx] and these reference values.
    755   */
    756  /**@{*/
    757  WienerInfo wiener_info[MAX_MB_PLANE];   /*!< Defaults for Wiener filter*/
    758  SgrprojInfo sgrproj_info[MAX_MB_PLANE]; /*!< Defaults for SGR filter */
    759  /**@}*/
    760 
    761  /**
    762   * \name Block dimensions in MB_MODE_INFO units.
    763   */
    764  /**@{*/
    765  uint8_t width;  /*!< Block width in MB_MODE_INFO units */
    766  uint8_t height; /*!< Block height in MB_MODE_INFO units */
    767  /**@}*/
    768 
    769  /*!
    770   * Contains the motion vector candidates found during motion vector prediction
    771   * process. ref_mv_stack[i] contains the candidates for ith type of
    772   * reference frame (single/compound). The actual number of candidates found in
    773   * ref_mv_stack[i] is stored in either dcb->ref_mv_count[i] (decoder side)
    774   * or mbmi_ext->ref_mv_count[i] (encoder side).
    775   */
    776  CANDIDATE_MV ref_mv_stack[MODE_CTX_REF_FRAMES][MAX_REF_MV_STACK_SIZE];
    777  /*!
    778   * weight[i][j] is the weight for ref_mv_stack[i][j] and used to compute the
    779   * DRL (dynamic reference list) mode contexts.
    780   */
    781  uint16_t weight[MODE_CTX_REF_FRAMES][MAX_REF_MV_STACK_SIZE];
    782 
    783  /*!
    784   * True if this is the last vertical rectangular block in a VERTICAL or
    785   * VERTICAL_4 partition.
    786   */
    787  bool is_last_vertical_rect;
    788  /*!
    789   * True if this is the 1st horizontal rectangular block in a HORIZONTAL or
    790   * HORIZONTAL_4 partition.
    791   */
    792  bool is_first_horizontal_rect;
    793 
    794  /*!
    795   * Counts of each reference frame in the above and left neighboring blocks.
    796   * NOTE: Take into account both single and comp references.
    797   */
    798  uint8_t neighbors_ref_counts[REF_FRAMES];
    799 
    800  /*!
    801   * Current CDFs of all the symbols for the current tile.
    802   */
    803  FRAME_CONTEXT *tile_ctx;
    804 
    805  /*!
    806   * Bit depth: copied from cm->seq_params->bit_depth for convenience.
    807   */
    808  int bd;
    809 
    810  /*!
    811   * Quantizer index for each segment (base qindex + delta for each segment).
    812   */
    813  int qindex[MAX_SEGMENTS];
    814  /*!
    815   * lossless[s] is true if segment 's' is coded losslessly.
    816   */
    817  int lossless[MAX_SEGMENTS];
    818  /*!
    819   * Q index for the coding blocks in this superblock will be stored in
    820   * mbmi->current_qindex. Now, when cm->delta_q_info.delta_q_present_flag is
    821   * true, mbmi->current_qindex is computed by taking 'current_base_qindex' as
    822   * the base, and adding any transmitted delta qindex on top of it.
    823   * Precisely, this is the latest qindex used by the first coding block of a
    824   * non-skip superblock in the current tile; OR
    825   * same as cm->quant_params.base_qindex (if not explicitly set yet).
    826   * Note: This is 'CurrentQIndex' in the AV1 spec.
    827   */
    828  int current_base_qindex;
    829 
    830  /*!
    831   * Same as cm->features.cur_frame_force_integer_mv.
    832   */
    833  int cur_frame_force_integer_mv;
    834 
    835  /*!
    836   * Pointer to cm->error.
    837   */
    838  struct aom_internal_error_info *error_info;
    839 
    840  /*!
    841   * Same as cm->global_motion.
    842   */
    843  const WarpedMotionParams *global_motion;
    844 
    845  /*!
    846   * Since actual frame level loop filtering level value is not available
    847   * at the beginning of the tile (only available during actual filtering)
    848   * at encoder side.we record the delta_lf (against the frame level loop
    849   * filtering level) and code the delta between previous superblock's delta
    850   * lf and current delta lf. It is equivalent to the delta between previous
    851   * superblock's actual lf and current lf.
    852   */
    853  int8_t delta_lf_from_base;
    854  /*!
    855   * We have four frame filter levels for different plane and direction. So, to
    856   * support the per superblock update, we need to add a few more params:
    857   * 0. delta loop filter level for y plane vertical
    858   * 1. delta loop filter level for y plane horizontal
    859   * 2. delta loop filter level for u plane
    860   * 3. delta loop filter level for v plane
    861   * To make it consistent with the reference to each filter level in segment,
    862   * we need to -1, since
    863   * - SEG_LVL_ALT_LF_Y_V = 1;
    864   * - SEG_LVL_ALT_LF_Y_H = 2;
    865   * - SEG_LVL_ALT_LF_U   = 3;
    866   * - SEG_LVL_ALT_LF_V   = 4;
    867   */
    868  int8_t delta_lf[FRAME_LF_COUNT];
    869  /*!
    870   * cdef_transmitted[i] is true if CDEF strength for ith CDEF unit in the
    871   * current superblock has already been read from (decoder) / written to
    872   * (encoder) the bitstream; and false otherwise.
    873   * More detail:
    874   * 1. CDEF strength is transmitted only once per CDEF unit, in the 1st
    875   * non-skip coding block. So, we need this array to keep track of whether CDEF
    876   * strengths for the given CDEF units have been transmitted yet or not.
    877   * 2. Superblock size can be either 128x128 or 64x64, but CDEF unit size is
    878   * fixed to be 64x64. So, there may be 4 CDEF units within a superblock (if
    879   * superblock size is 128x128). Hence the array size is 4.
    880   * 3. In the current implementation, CDEF strength for this CDEF unit is
    881   * stored in the MB_MODE_INFO of the 1st block in this CDEF unit (inside
    882   * cm->mi_params.mi_grid_base).
    883   */
    884  bool cdef_transmitted[4];
    885 
    886  /*!
    887   * Mask for this block used for compound prediction.
    888   */
    889  uint8_t *seg_mask;
    890 
    891  /*!
    892   * CFL (chroma from luma) related parameters.
    893   */
    894  CFL_CTX cfl;
    895 
    896  /*!
    897   * Offset to plane[p].color_index_map.
    898   * Currently:
    899   * - On encoder side, this is always 0 as 'color_index_map' is allocated per
    900   * *coding block* there.
    901   * - On decoder side, this may be non-zero, as 'color_index_map' is a (static)
    902   * memory pointing to the base of a *superblock* there, and we need an offset
    903   * to it to get the color index map for current coding block.
    904   */
    905  uint16_t color_index_map_offset[2];
    906 
    907  /*!
    908   * Temporary buffer used for convolution in case of compound reference only
    909   * for (weighted or uniform) averaging operation.
    910   * There are pointers to actual buffers allocated elsewhere: e.g.
    911   * - In decoder, 'pbi->td.tmp_conv_dst' or
    912   * 'pbi->thread_data[t].td->xd.tmp_conv_dst' and
    913   * - In encoder, 'x->tmp_conv_dst' or
    914   * 'cpi->tile_thr_data[t].td->mb.tmp_conv_dst'.
    915   */
    916  CONV_BUF_TYPE *tmp_conv_dst;
    917  /*!
    918   * Temporary buffers used to build OBMC prediction by above (index 0) and left
    919   * (index 1) predictors respectively.
    920   * tmp_obmc_bufs[i][p * MAX_SB_SQUARE] is the buffer used for plane 'p'.
    921   * There are pointers to actual buffers allocated elsewhere: e.g.
    922   * - In decoder, 'pbi->td.tmp_obmc_bufs' or
    923   * 'pbi->thread_data[t].td->xd.tmp_conv_dst' and
    924   * -In encoder, 'x->tmp_pred_bufs' or
    925   * 'cpi->tile_thr_data[t].td->mb.tmp_pred_bufs'.
    926   */
    927  uint8_t *tmp_obmc_bufs[2];
    928 } MACROBLOCKD;
    929 
    930 /*!\cond */
    931 
    932 static inline int is_cur_buf_hbd(const MACROBLOCKD *xd) {
    933 #if CONFIG_AV1_HIGHBITDEPTH
    934  return xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH ? 1 : 0;
    935 #else
    936  (void)xd;
    937  return 0;
    938 #endif
    939 }
    940 
    941 static inline uint8_t *get_buf_by_bd(const MACROBLOCKD *xd, uint8_t *buf16) {
    942 #if CONFIG_AV1_HIGHBITDEPTH
    943  return (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH)
    944             ? CONVERT_TO_BYTEPTR(buf16)
    945             : buf16;
    946 #else
    947  (void)xd;
    948  return buf16;
    949 #endif
    950 }
    951 
    952 typedef struct BitDepthInfo {
    953  int bit_depth;
    954  /*! Is the image buffer high bit depth?
    955   * Low bit depth buffer uses uint8_t.
    956   * High bit depth buffer uses uint16_t.
    957   * Equivalent to cm->seq_params->use_highbitdepth
    958   */
    959  int use_highbitdepth_buf;
    960 } BitDepthInfo;
    961 
    962 static inline BitDepthInfo get_bit_depth_info(const MACROBLOCKD *xd) {
    963  BitDepthInfo bit_depth_info;
    964  bit_depth_info.bit_depth = xd->bd;
    965  bit_depth_info.use_highbitdepth_buf = is_cur_buf_hbd(xd);
    966  assert(IMPLIES(!bit_depth_info.use_highbitdepth_buf,
    967                 bit_depth_info.bit_depth == 8));
    968  return bit_depth_info;
    969 }
    970 
    971 static inline int get_sqr_bsize_idx(BLOCK_SIZE bsize) {
    972  switch (bsize) {
    973    case BLOCK_4X4: return 0;
    974    case BLOCK_8X8: return 1;
    975    case BLOCK_16X16: return 2;
    976    case BLOCK_32X32: return 3;
    977    case BLOCK_64X64: return 4;
    978    case BLOCK_128X128: return 5;
    979    default: return SQR_BLOCK_SIZES;
    980  }
    981 }
    982 
    983 // For a square block size 'bsize', returns the size of the sub-blocks used by
    984 // the given partition type. If the partition produces sub-blocks of different
    985 // sizes, then the function returns the largest sub-block size.
    986 // Implements the Partition_Subsize lookup table in the spec (Section 9.3.
    987 // Conversion tables).
    988 // Note: the input block size should be square.
    989 // Otherwise it's considered invalid.
    990 static inline BLOCK_SIZE get_partition_subsize(BLOCK_SIZE bsize,
    991                                               PARTITION_TYPE partition) {
    992  if (partition == PARTITION_INVALID) {
    993    return BLOCK_INVALID;
    994  } else {
    995    const int sqr_bsize_idx = get_sqr_bsize_idx(bsize);
    996    return sqr_bsize_idx >= SQR_BLOCK_SIZES
    997               ? BLOCK_INVALID
    998               : subsize_lookup[partition][sqr_bsize_idx];
    999  }
   1000 }
   1001 
   1002 static TX_TYPE intra_mode_to_tx_type(const MB_MODE_INFO *mbmi,
   1003                                     PLANE_TYPE plane_type) {
   1004  static const TX_TYPE _intra_mode_to_tx_type[INTRA_MODES] = {
   1005    DCT_DCT,    // DC_PRED
   1006    ADST_DCT,   // V_PRED
   1007    DCT_ADST,   // H_PRED
   1008    DCT_DCT,    // D45_PRED
   1009    ADST_ADST,  // D135_PRED
   1010    ADST_DCT,   // D113_PRED
   1011    DCT_ADST,   // D157_PRED
   1012    DCT_ADST,   // D203_PRED
   1013    ADST_DCT,   // D67_PRED
   1014    ADST_ADST,  // SMOOTH_PRED
   1015    ADST_DCT,   // SMOOTH_V_PRED
   1016    DCT_ADST,   // SMOOTH_H_PRED
   1017    ADST_ADST,  // PAETH_PRED
   1018  };
   1019  const PREDICTION_MODE mode =
   1020      (plane_type == PLANE_TYPE_Y) ? mbmi->mode : get_uv_mode(mbmi->uv_mode);
   1021  assert(mode < INTRA_MODES);
   1022  return _intra_mode_to_tx_type[mode];
   1023 }
   1024 
   1025 static inline int is_rect_tx(TX_SIZE tx_size) { return tx_size >= TX_SIZES; }
   1026 
   1027 static inline int block_signals_txsize(BLOCK_SIZE bsize) {
   1028  return bsize > BLOCK_4X4;
   1029 }
   1030 
   1031 // Number of transform types in each set type
   1032 static const int av1_num_ext_tx_set[EXT_TX_SET_TYPES] = {
   1033  1, 2, 5, 7, 12, 16,
   1034 };
   1035 
   1036 static const int av1_ext_tx_used[EXT_TX_SET_TYPES][TX_TYPES] = {
   1037  { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
   1038  { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
   1039  { 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
   1040  { 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0 },
   1041  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 },
   1042  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
   1043 };
   1044 
   1045 // The bitmask corresponds to the transform types as defined in
   1046 // enums.h TX_TYPE enumeration type. Setting the bit 0 means to disable
   1047 // the use of the corresponding transform type in that table.
   1048 // The av1_derived_intra_tx_used_flag table is used when
   1049 // use_reduced_intra_txset is set to 2, where one only searches
   1050 // the transform types derived from residual statistics.
   1051 static const uint16_t av1_derived_intra_tx_used_flag[INTRA_MODES] = {
   1052  0x0209,  // DC_PRED:       0000 0010 0000 1001
   1053  0x0403,  // V_PRED:        0000 0100 0000 0011
   1054  0x0805,  // H_PRED:        0000 1000 0000 0101
   1055  0x020F,  // D45_PRED:      0000 0010 0000 1111
   1056  0x0009,  // D135_PRED:     0000 0000 0000 1001
   1057  0x0009,  // D113_PRED:     0000 0000 0000 1001
   1058  0x0009,  // D157_PRED:     0000 0000 0000 1001
   1059  0x0805,  // D203_PRED:     0000 1000 0000 0101
   1060  0x0403,  // D67_PRED:      0000 0100 0000 0011
   1061  0x0205,  // SMOOTH_PRED:   0000 0010 0000 1001
   1062  0x0403,  // SMOOTH_V_PRED: 0000 0100 0000 0011
   1063  0x0805,  // SMOOTH_H_PRED: 0000 1000 0000 0101
   1064  0x0209,  // PAETH_PRED:    0000 0010 0000 1001
   1065 };
   1066 
   1067 static const uint16_t av1_reduced_intra_tx_used_flag[INTRA_MODES] = {
   1068  0x080F,  // DC_PRED:       0000 1000 0000 1111
   1069  0x040F,  // V_PRED:        0000 0100 0000 1111
   1070  0x080F,  // H_PRED:        0000 1000 0000 1111
   1071  0x020F,  // D45_PRED:      0000 0010 0000 1111
   1072  0x080F,  // D135_PRED:     0000 1000 0000 1111
   1073  0x040F,  // D113_PRED:     0000 0100 0000 1111
   1074  0x080F,  // D157_PRED:     0000 1000 0000 1111
   1075  0x080F,  // D203_PRED:     0000 1000 0000 1111
   1076  0x040F,  // D67_PRED:      0000 0100 0000 1111
   1077  0x080F,  // SMOOTH_PRED:   0000 1000 0000 1111
   1078  0x040F,  // SMOOTH_V_PRED: 0000 0100 0000 1111
   1079  0x080F,  // SMOOTH_H_PRED: 0000 1000 0000 1111
   1080  0x0C0E,  // PAETH_PRED:    0000 1100 0000 1110
   1081 };
   1082 
   1083 static const uint16_t av1_ext_tx_used_flag[EXT_TX_SET_TYPES] = {
   1084  0x0001,  // 0000 0000 0000 0001
   1085  0x0201,  // 0000 0010 0000 0001
   1086  0x020F,  // 0000 0010 0000 1111
   1087  0x0E0F,  // 0000 1110 0000 1111
   1088  0x0FFF,  // 0000 1111 1111 1111
   1089  0xFFFF,  // 1111 1111 1111 1111
   1090 };
   1091 
   1092 static const TxSetType av1_ext_tx_set_lookup[2][2] = {
   1093  { EXT_TX_SET_DTT4_IDTX_1DDCT, EXT_TX_SET_DTT4_IDTX },
   1094  { EXT_TX_SET_ALL16, EXT_TX_SET_DTT9_IDTX_1DDCT },
   1095 };
   1096 
   1097 static inline TxSetType av1_get_ext_tx_set_type(TX_SIZE tx_size, int is_inter,
   1098                                                int use_reduced_set) {
   1099  const TX_SIZE tx_size_sqr_up = txsize_sqr_up_map[tx_size];
   1100  if (tx_size_sqr_up > TX_32X32) return EXT_TX_SET_DCTONLY;
   1101  if (tx_size_sqr_up == TX_32X32)
   1102    return is_inter ? EXT_TX_SET_DCT_IDTX : EXT_TX_SET_DCTONLY;
   1103  if (use_reduced_set)
   1104    return is_inter ? EXT_TX_SET_DCT_IDTX : EXT_TX_SET_DTT4_IDTX;
   1105  const TX_SIZE tx_size_sqr = txsize_sqr_map[tx_size];
   1106  return av1_ext_tx_set_lookup[is_inter][tx_size_sqr == TX_16X16];
   1107 }
   1108 
   1109 // Maps tx set types to the indices.
   1110 static const int ext_tx_set_index[2][EXT_TX_SET_TYPES] = {
   1111  { // Intra
   1112    0, -1, 2, 1, -1, -1 },
   1113  { // Inter
   1114    0, 3, -1, -1, 2, 1 },
   1115 };
   1116 
   1117 static inline int get_ext_tx_set(TX_SIZE tx_size, int is_inter,
   1118                                 int use_reduced_set) {
   1119  const TxSetType set_type =
   1120      av1_get_ext_tx_set_type(tx_size, is_inter, use_reduced_set);
   1121  return ext_tx_set_index[is_inter][set_type];
   1122 }
   1123 
   1124 static inline int get_ext_tx_types(TX_SIZE tx_size, int is_inter,
   1125                                   int use_reduced_set) {
   1126  const int set_type =
   1127      av1_get_ext_tx_set_type(tx_size, is_inter, use_reduced_set);
   1128  return av1_num_ext_tx_set[set_type];
   1129 }
   1130 
   1131 #define TXSIZEMAX(t1, t2) (tx_size_2d[(t1)] >= tx_size_2d[(t2)] ? (t1) : (t2))
   1132 #define TXSIZEMIN(t1, t2) (tx_size_2d[(t1)] <= tx_size_2d[(t2)] ? (t1) : (t2))
   1133 
   1134 static inline TX_SIZE tx_size_from_tx_mode(BLOCK_SIZE bsize, TX_MODE tx_mode) {
   1135  const TX_SIZE largest_tx_size = tx_mode_to_biggest_tx_size[tx_mode];
   1136  const TX_SIZE max_rect_tx_size = max_txsize_rect_lookup[bsize];
   1137  if (bsize == BLOCK_4X4)
   1138    return AOMMIN(max_txsize_lookup[bsize], largest_tx_size);
   1139  if (txsize_sqr_map[max_rect_tx_size] <= largest_tx_size)
   1140    return max_rect_tx_size;
   1141  else
   1142    return largest_tx_size;
   1143 }
   1144 
   1145 static const uint8_t mode_to_angle_map[INTRA_MODES] = {
   1146  0, 90, 180, 45, 135, 113, 157, 203, 67, 0, 0, 0, 0,
   1147 };
   1148 
   1149 // Converts block_index for given transform size to index of the block in raster
   1150 // order.
   1151 static inline int av1_block_index_to_raster_order(TX_SIZE tx_size,
   1152                                                  int block_idx) {
   1153  // For transform size 4x8, the possible block_idx values are 0 & 2, because
   1154  // block_idx values are incremented in steps of size 'tx_width_unit x
   1155  // tx_height_unit'. But, for this transform size, block_idx = 2 corresponds to
   1156  // block number 1 in raster order, inside an 8x8 MI block.
   1157  // For any other transform size, the two indices are equivalent.
   1158  return (tx_size == TX_4X8 && block_idx == 2) ? 1 : block_idx;
   1159 }
   1160 
   1161 // Inverse of above function.
   1162 // Note: only implemented for transform sizes 4x4, 4x8 and 8x4 right now.
   1163 static inline int av1_raster_order_to_block_index(TX_SIZE tx_size,
   1164                                                  int raster_order) {
   1165  assert(tx_size == TX_4X4 || tx_size == TX_4X8 || tx_size == TX_8X4);
   1166  // We ensure that block indices are 0 & 2 if tx size is 4x8 or 8x4.
   1167  return (tx_size == TX_4X4) ? raster_order : (raster_order > 0) ? 2 : 0;
   1168 }
   1169 
   1170 static inline TX_TYPE get_default_tx_type(PLANE_TYPE plane_type,
   1171                                          const MACROBLOCKD *xd,
   1172                                          TX_SIZE tx_size,
   1173                                          int use_screen_content_tools) {
   1174  const MB_MODE_INFO *const mbmi = xd->mi[0];
   1175 
   1176  if (is_inter_block(mbmi) || plane_type != PLANE_TYPE_Y ||
   1177      xd->lossless[mbmi->segment_id] || tx_size >= TX_32X32 ||
   1178      use_screen_content_tools)
   1179    return DEFAULT_INTER_TX_TYPE;
   1180 
   1181  return intra_mode_to_tx_type(mbmi, plane_type);
   1182 }
   1183 
   1184 // Implements the get_plane_residual_size() function in the spec (Section
   1185 // 5.11.38. Get plane residual size function).
   1186 static inline BLOCK_SIZE get_plane_block_size(BLOCK_SIZE bsize,
   1187                                              int subsampling_x,
   1188                                              int subsampling_y) {
   1189  assert(bsize < BLOCK_SIZES_ALL);
   1190  assert(subsampling_x >= 0 && subsampling_x < 2);
   1191  assert(subsampling_y >= 0 && subsampling_y < 2);
   1192  return av1_ss_size_lookup[bsize][subsampling_x][subsampling_y];
   1193 }
   1194 
   1195 /*
   1196 * Logic to generate the lookup tables:
   1197 *
   1198 * TX_SIZE txs = max_txsize_rect_lookup[bsize];
   1199 * for (int level = 0; level < MAX_VARTX_DEPTH - 1; ++level)
   1200 *   txs = sub_tx_size_map[txs];
   1201 * const int tx_w_log2 = tx_size_wide_log2[txs] - MI_SIZE_LOG2;
   1202 * const int tx_h_log2 = tx_size_high_log2[txs] - MI_SIZE_LOG2;
   1203 * const int bw_uint_log2 = mi_size_wide_log2[bsize];
   1204 * const int stride_log2 = bw_uint_log2 - tx_w_log2;
   1205 */
   1206 static inline int av1_get_txb_size_index(BLOCK_SIZE bsize, int blk_row,
   1207                                         int blk_col) {
   1208  static const uint8_t tw_w_log2_table[BLOCK_SIZES_ALL] = {
   1209    0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 0, 1, 1, 2, 2, 3,
   1210  };
   1211  static const uint8_t tw_h_log2_table[BLOCK_SIZES_ALL] = {
   1212    0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 1, 0, 2, 1, 3, 2,
   1213  };
   1214  static const uint8_t stride_log2_table[BLOCK_SIZES_ALL] = {
   1215    0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 2, 2, 0, 1, 0, 1, 0, 1,
   1216  };
   1217  const int index =
   1218      ((blk_row >> tw_h_log2_table[bsize]) << stride_log2_table[bsize]) +
   1219      (blk_col >> tw_w_log2_table[bsize]);
   1220  assert(index < INTER_TX_SIZE_BUF_LEN);
   1221  return index;
   1222 }
   1223 
   1224 #if CONFIG_INSPECTION
   1225 /*
   1226 * Here is the logic to generate the lookup tables:
   1227 *
   1228 * TX_SIZE txs = max_txsize_rect_lookup[bsize];
   1229 * for (int level = 0; level < MAX_VARTX_DEPTH; ++level)
   1230 *   txs = sub_tx_size_map[txs];
   1231 * const int tx_w_log2 = tx_size_wide_log2[txs] - MI_SIZE_LOG2;
   1232 * const int tx_h_log2 = tx_size_high_log2[txs] - MI_SIZE_LOG2;
   1233 * const int bw_uint_log2 = mi_size_wide_log2[bsize];
   1234 * const int stride_log2 = bw_uint_log2 - tx_w_log2;
   1235 */
   1236 static inline int av1_get_txk_type_index(BLOCK_SIZE bsize, int blk_row,
   1237                                         int blk_col) {
   1238  static const uint8_t tw_w_log2_table[BLOCK_SIZES_ALL] = {
   1239    0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 0, 0, 1, 1, 2, 2,
   1240  };
   1241  static const uint8_t tw_h_log2_table[BLOCK_SIZES_ALL] = {
   1242    0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 0, 0, 1, 1, 2, 2,
   1243  };
   1244  static const uint8_t stride_log2_table[BLOCK_SIZES_ALL] = {
   1245    0, 0, 1, 1, 1, 2, 2, 1, 2, 2, 1, 2, 2, 2, 3, 3, 0, 2, 0, 2, 0, 2,
   1246  };
   1247  const int index =
   1248      ((blk_row >> tw_h_log2_table[bsize]) << stride_log2_table[bsize]) +
   1249      (blk_col >> tw_w_log2_table[bsize]);
   1250  assert(index < TXK_TYPE_BUF_LEN);
   1251  return index;
   1252 }
   1253 #endif  // CONFIG_INSPECTION
   1254 
   1255 static inline void update_txk_array(MACROBLOCKD *const xd, int blk_row,
   1256                                    int blk_col, TX_SIZE tx_size,
   1257                                    TX_TYPE tx_type) {
   1258  const int stride = xd->tx_type_map_stride;
   1259  xd->tx_type_map[blk_row * stride + blk_col] = tx_type;
   1260 
   1261  const int txw = tx_size_wide_unit[tx_size];
   1262  const int txh = tx_size_high_unit[tx_size];
   1263  // The 16x16 unit is due to the constraint from tx_64x64 which sets the
   1264  // maximum tx size for chroma as 32x32. Coupled with 4x1 transform block
   1265  // size, the constraint takes effect in 32x16 / 16x32 size too. To solve
   1266  // the intricacy, cover all the 16x16 units inside a 64 level transform.
   1267  if (txw == tx_size_wide_unit[TX_64X64] ||
   1268      txh == tx_size_high_unit[TX_64X64]) {
   1269    const int tx_unit = tx_size_wide_unit[TX_16X16];
   1270    for (int idy = 0; idy < txh; idy += tx_unit) {
   1271      for (int idx = 0; idx < txw; idx += tx_unit) {
   1272        xd->tx_type_map[(blk_row + idy) * stride + blk_col + idx] = tx_type;
   1273      }
   1274    }
   1275  }
   1276 }
   1277 
   1278 static inline TX_TYPE av1_get_tx_type(const MACROBLOCKD *xd,
   1279                                      PLANE_TYPE plane_type, int blk_row,
   1280                                      int blk_col, TX_SIZE tx_size,
   1281                                      int reduced_tx_set) {
   1282  const MB_MODE_INFO *const mbmi = xd->mi[0];
   1283  if (xd->lossless[mbmi->segment_id] || txsize_sqr_up_map[tx_size] > TX_32X32) {
   1284    return DCT_DCT;
   1285  }
   1286 
   1287  TX_TYPE tx_type;
   1288  if (plane_type == PLANE_TYPE_Y) {
   1289    tx_type = xd->tx_type_map[blk_row * xd->tx_type_map_stride + blk_col];
   1290  } else {
   1291    if (is_inter_block(mbmi)) {
   1292      // scale back to y plane's coordinate
   1293      const struct macroblockd_plane *const pd = &xd->plane[plane_type];
   1294      blk_row <<= pd->subsampling_y;
   1295      blk_col <<= pd->subsampling_x;
   1296      tx_type = xd->tx_type_map[blk_row * xd->tx_type_map_stride + blk_col];
   1297    } else {
   1298      // In intra mode, uv planes don't share the same prediction mode as y
   1299      // plane, so the tx_type should not be shared
   1300      tx_type = intra_mode_to_tx_type(mbmi, PLANE_TYPE_UV);
   1301    }
   1302    const TxSetType tx_set_type =
   1303        av1_get_ext_tx_set_type(tx_size, is_inter_block(mbmi), reduced_tx_set);
   1304    if (!av1_ext_tx_used[tx_set_type][tx_type]) tx_type = DCT_DCT;
   1305  }
   1306  assert(tx_type < TX_TYPES);
   1307  assert(av1_ext_tx_used[av1_get_ext_tx_set_type(tx_size, is_inter_block(mbmi),
   1308                                                 reduced_tx_set)][tx_type]);
   1309  return tx_type;
   1310 }
   1311 
   1312 void av1_setup_block_planes(MACROBLOCKD *xd, int ss_x, int ss_y,
   1313                            const int num_planes);
   1314 
   1315 /*
   1316 * Logic to generate the lookup table:
   1317 *
   1318 * TX_SIZE tx_size = max_txsize_rect_lookup[bsize];
   1319 * int depth = 0;
   1320 * while (depth < MAX_TX_DEPTH && tx_size != TX_4X4) {
   1321 *   depth++;
   1322 *   tx_size = sub_tx_size_map[tx_size];
   1323 * }
   1324 */
   1325 static inline int bsize_to_max_depth(BLOCK_SIZE bsize) {
   1326  static const uint8_t bsize_to_max_depth_table[BLOCK_SIZES_ALL] = {
   1327    0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
   1328  };
   1329  return bsize_to_max_depth_table[bsize];
   1330 }
   1331 
   1332 /*
   1333 * Logic to generate the lookup table:
   1334 *
   1335 * TX_SIZE tx_size = max_txsize_rect_lookup[bsize];
   1336 * assert(tx_size != TX_4X4);
   1337 * int depth = 0;
   1338 * while (tx_size != TX_4X4) {
   1339 *   depth++;
   1340 *   tx_size = sub_tx_size_map[tx_size];
   1341 * }
   1342 * assert(depth < 10);
   1343 */
   1344 static inline int bsize_to_tx_size_cat(BLOCK_SIZE bsize) {
   1345  assert(bsize < BLOCK_SIZES_ALL);
   1346  static const uint8_t bsize_to_tx_size_depth_table[BLOCK_SIZES_ALL] = {
   1347    0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 2, 2, 3, 3, 4, 4,
   1348  };
   1349  const int depth = bsize_to_tx_size_depth_table[bsize];
   1350  assert(depth <= MAX_TX_CATS);
   1351  return depth - 1;
   1352 }
   1353 
   1354 static inline TX_SIZE depth_to_tx_size(int depth, BLOCK_SIZE bsize) {
   1355  TX_SIZE max_tx_size = max_txsize_rect_lookup[bsize];
   1356  TX_SIZE tx_size = max_tx_size;
   1357  for (int d = 0; d < depth; ++d) tx_size = sub_tx_size_map[tx_size];
   1358  return tx_size;
   1359 }
   1360 
   1361 static inline TX_SIZE av1_get_adjusted_tx_size(TX_SIZE tx_size) {
   1362  switch (tx_size) {
   1363    case TX_64X64:
   1364    case TX_64X32:
   1365    case TX_32X64: return TX_32X32;
   1366    case TX_64X16: return TX_32X16;
   1367    case TX_16X64: return TX_16X32;
   1368    default: return tx_size;
   1369  }
   1370 }
   1371 
   1372 static inline TX_SIZE av1_get_max_uv_txsize(BLOCK_SIZE bsize, int subsampling_x,
   1373                                            int subsampling_y) {
   1374  const BLOCK_SIZE plane_bsize =
   1375      get_plane_block_size(bsize, subsampling_x, subsampling_y);
   1376  assert(plane_bsize < BLOCK_SIZES_ALL);
   1377  const TX_SIZE uv_tx = max_txsize_rect_lookup[plane_bsize];
   1378  return av1_get_adjusted_tx_size(uv_tx);
   1379 }
   1380 
   1381 static inline TX_SIZE av1_get_tx_size(int plane, const MACROBLOCKD *xd) {
   1382  const MB_MODE_INFO *mbmi = xd->mi[0];
   1383  if (xd->lossless[mbmi->segment_id]) return TX_4X4;
   1384  if (plane == 0) return mbmi->tx_size;
   1385  const MACROBLOCKD_PLANE *pd = &xd->plane[plane];
   1386  return av1_get_max_uv_txsize(mbmi->bsize, pd->subsampling_x,
   1387                               pd->subsampling_y);
   1388 }
   1389 
   1390 void av1_reset_entropy_context(MACROBLOCKD *xd, BLOCK_SIZE bsize,
   1391                               const int num_planes);
   1392 
   1393 void av1_reset_loop_filter_delta(MACROBLOCKD *xd, int num_planes);
   1394 
   1395 void av1_reset_loop_restoration(MACROBLOCKD *xd, const int num_planes);
   1396 
   1397 typedef void (*foreach_transformed_block_visitor)(int plane, int block,
   1398                                                  int blk_row, int blk_col,
   1399                                                  BLOCK_SIZE plane_bsize,
   1400                                                  TX_SIZE tx_size, void *arg);
   1401 
   1402 void av1_set_entropy_contexts(const MACROBLOCKD *xd,
   1403                              struct macroblockd_plane *pd, int plane,
   1404                              BLOCK_SIZE plane_bsize, TX_SIZE tx_size,
   1405                              int has_eob, int aoff, int loff);
   1406 
   1407 #define MAX_INTERINTRA_SB_SQUARE 32 * 32
   1408 static inline int is_interintra_mode(const MB_MODE_INFO *mbmi) {
   1409  return (mbmi->ref_frame[0] > INTRA_FRAME &&
   1410          mbmi->ref_frame[1] == INTRA_FRAME);
   1411 }
   1412 
   1413 static inline int is_interintra_allowed_bsize(const BLOCK_SIZE bsize) {
   1414  return (bsize >= BLOCK_8X8) && (bsize <= BLOCK_32X32);
   1415 }
   1416 
   1417 static inline int is_interintra_allowed_mode(const PREDICTION_MODE mode) {
   1418  return (mode >= SINGLE_INTER_MODE_START) && (mode < SINGLE_INTER_MODE_END);
   1419 }
   1420 
   1421 static inline int is_interintra_allowed_ref(const MV_REFERENCE_FRAME rf[2]) {
   1422  return (rf[0] > INTRA_FRAME) && (rf[1] <= INTRA_FRAME);
   1423 }
   1424 
   1425 static inline int is_interintra_allowed(const MB_MODE_INFO *mbmi) {
   1426  return is_interintra_allowed_bsize(mbmi->bsize) &&
   1427         is_interintra_allowed_mode(mbmi->mode) &&
   1428         is_interintra_allowed_ref(mbmi->ref_frame);
   1429 }
   1430 
   1431 static inline int is_interintra_allowed_bsize_group(int group) {
   1432  int i;
   1433  for (i = 0; i < BLOCK_SIZES_ALL; i++) {
   1434    if (size_group_lookup[i] == group &&
   1435        is_interintra_allowed_bsize((BLOCK_SIZE)i)) {
   1436      return 1;
   1437    }
   1438  }
   1439  return 0;
   1440 }
   1441 
   1442 static inline int is_interintra_pred(const MB_MODE_INFO *mbmi) {
   1443  return mbmi->ref_frame[0] > INTRA_FRAME &&
   1444         mbmi->ref_frame[1] == INTRA_FRAME && is_interintra_allowed(mbmi);
   1445 }
   1446 
   1447 static inline int get_vartx_max_txsize(const MACROBLOCKD *xd, BLOCK_SIZE bsize,
   1448                                       int plane) {
   1449  if (xd->lossless[xd->mi[0]->segment_id]) return TX_4X4;
   1450  const TX_SIZE max_txsize = max_txsize_rect_lookup[bsize];
   1451  if (plane == 0) return max_txsize;            // luma
   1452  return av1_get_adjusted_tx_size(max_txsize);  // chroma
   1453 }
   1454 
   1455 static inline int is_motion_variation_allowed_bsize(BLOCK_SIZE bsize) {
   1456  assert(bsize < BLOCK_SIZES_ALL);
   1457  return AOMMIN(block_size_wide[bsize], block_size_high[bsize]) >= 8;
   1458 }
   1459 
   1460 static inline int is_motion_variation_allowed_compound(
   1461    const MB_MODE_INFO *mbmi) {
   1462  return !has_second_ref(mbmi);
   1463 }
   1464 
   1465 // input: log2 of length, 0(4), 1(8), ...
   1466 static const int max_neighbor_obmc[6] = { 0, 1, 2, 3, 4, 4 };
   1467 
   1468 static inline int check_num_overlappable_neighbors(const MB_MODE_INFO *mbmi) {
   1469  return mbmi->overlappable_neighbors != 0;
   1470 }
   1471 
   1472 static inline MOTION_MODE motion_mode_allowed(
   1473    const WarpedMotionParams *gm_params, const MACROBLOCKD *xd,
   1474    const MB_MODE_INFO *mbmi, int allow_warped_motion) {
   1475  if (!check_num_overlappable_neighbors(mbmi)) return SIMPLE_TRANSLATION;
   1476  if (xd->cur_frame_force_integer_mv == 0) {
   1477    const TransformationType gm_type = gm_params[mbmi->ref_frame[0]].wmtype;
   1478    if (is_global_mv_block(mbmi, gm_type)) return SIMPLE_TRANSLATION;
   1479  }
   1480  if (is_motion_variation_allowed_bsize(mbmi->bsize) &&
   1481      is_inter_mode(mbmi->mode) && mbmi->ref_frame[1] != INTRA_FRAME &&
   1482      is_motion_variation_allowed_compound(mbmi)) {
   1483    assert(!has_second_ref(mbmi));
   1484    if (mbmi->num_proj_ref >= 1 && allow_warped_motion &&
   1485        !xd->cur_frame_force_integer_mv &&
   1486        !av1_is_scaled(xd->block_ref_scale_factors[0])) {
   1487      return WARPED_CAUSAL;
   1488    }
   1489    return OBMC_CAUSAL;
   1490  }
   1491  return SIMPLE_TRANSLATION;
   1492 }
   1493 
   1494 static inline int is_neighbor_overlappable(const MB_MODE_INFO *mbmi) {
   1495  return (is_inter_block(mbmi));
   1496 }
   1497 
   1498 static inline int av1_allow_palette(int allow_screen_content_tools,
   1499                                    BLOCK_SIZE sb_type) {
   1500  assert(sb_type < BLOCK_SIZES_ALL);
   1501  return allow_screen_content_tools &&
   1502         block_size_wide[sb_type] <= MAX_PALETTE_BLOCK_WIDTH &&
   1503         block_size_high[sb_type] <= MAX_PALETTE_BLOCK_HEIGHT &&
   1504         sb_type >= BLOCK_8X8;
   1505 }
   1506 
   1507 // Returns sub-sampled dimensions of the given block.
   1508 // The output values for 'rows_within_bounds' and 'cols_within_bounds' will
   1509 // differ from 'height' and 'width' when part of the block is outside the
   1510 // right
   1511 // and/or bottom image boundary.
   1512 static inline void av1_get_block_dimensions(BLOCK_SIZE bsize, int plane,
   1513                                            const MACROBLOCKD *xd, int *width,
   1514                                            int *height,
   1515                                            int *rows_within_bounds,
   1516                                            int *cols_within_bounds) {
   1517  const int block_height = block_size_high[bsize];
   1518  const int block_width = block_size_wide[bsize];
   1519  const int block_rows = (xd->mb_to_bottom_edge >= 0)
   1520                             ? block_height
   1521                             : (xd->mb_to_bottom_edge >> 3) + block_height;
   1522  const int block_cols = (xd->mb_to_right_edge >= 0)
   1523                             ? block_width
   1524                             : (xd->mb_to_right_edge >> 3) + block_width;
   1525  const struct macroblockd_plane *const pd = &xd->plane[plane];
   1526  assert(IMPLIES(plane == PLANE_TYPE_Y, pd->subsampling_x == 0));
   1527  assert(IMPLIES(plane == PLANE_TYPE_Y, pd->subsampling_y == 0));
   1528  assert(block_width >= block_cols);
   1529  assert(block_height >= block_rows);
   1530  const int plane_block_width = block_width >> pd->subsampling_x;
   1531  const int plane_block_height = block_height >> pd->subsampling_y;
   1532  // Special handling for chroma sub8x8.
   1533  const int is_chroma_sub8_x = plane > 0 && plane_block_width < 4;
   1534  const int is_chroma_sub8_y = plane > 0 && plane_block_height < 4;
   1535  if (width) {
   1536    *width = plane_block_width + 2 * is_chroma_sub8_x;
   1537    assert(*width >= 0);
   1538  }
   1539  if (height) {
   1540    *height = plane_block_height + 2 * is_chroma_sub8_y;
   1541    assert(*height >= 0);
   1542  }
   1543  if (rows_within_bounds) {
   1544    *rows_within_bounds =
   1545        (block_rows >> pd->subsampling_y) + 2 * is_chroma_sub8_y;
   1546    assert(*rows_within_bounds >= 0);
   1547  }
   1548  if (cols_within_bounds) {
   1549    *cols_within_bounds =
   1550        (block_cols >> pd->subsampling_x) + 2 * is_chroma_sub8_x;
   1551    assert(*cols_within_bounds >= 0);
   1552  }
   1553 }
   1554 
   1555 /* clang-format off */
   1556 // Pointer to a three-dimensional array whose first dimension is PALETTE_SIZES.
   1557 typedef aom_cdf_prob (*MapCdf)[PALETTE_COLOR_INDEX_CONTEXTS]
   1558                              [CDF_SIZE(PALETTE_COLORS)];
   1559 // Pointer to a const three-dimensional array whose first dimension is
   1560 // PALETTE_SIZES.
   1561 typedef const int (*ColorCost)[PALETTE_COLOR_INDEX_CONTEXTS][PALETTE_COLORS];
   1562 /* clang-format on */
   1563 
   1564 typedef struct {
   1565  int rows;
   1566  int cols;
   1567  int n_colors;
   1568  int plane_width;
   1569  int plane_height;
   1570  uint8_t *color_map;
   1571  MapCdf map_cdf;
   1572  ColorCost color_cost;
   1573 } Av1ColorMapParam;
   1574 
   1575 static inline int is_nontrans_global_motion(const MACROBLOCKD *xd,
   1576                                            const MB_MODE_INFO *mbmi) {
   1577  int ref;
   1578 
   1579  // First check if all modes are GLOBALMV
   1580  if (mbmi->mode != GLOBALMV && mbmi->mode != GLOBAL_GLOBALMV) return 0;
   1581 
   1582  if (AOMMIN(mi_size_wide[mbmi->bsize], mi_size_high[mbmi->bsize]) < 2)
   1583    return 0;
   1584 
   1585  // Now check if all global motion is non translational
   1586  for (ref = 0; ref < 1 + has_second_ref(mbmi); ++ref) {
   1587    if (xd->global_motion[mbmi->ref_frame[ref]].wmtype == TRANSLATION) return 0;
   1588  }
   1589  return 1;
   1590 }
   1591 
   1592 static inline PLANE_TYPE get_plane_type(int plane) {
   1593  return (plane == 0) ? PLANE_TYPE_Y : PLANE_TYPE_UV;
   1594 }
   1595 
   1596 static inline int av1_get_max_eob(TX_SIZE tx_size) {
   1597  if (tx_size == TX_64X64 || tx_size == TX_64X32 || tx_size == TX_32X64) {
   1598    return 1024;
   1599  }
   1600  if (tx_size == TX_16X64 || tx_size == TX_64X16) {
   1601    return 512;
   1602  }
   1603  return tx_size_2d[tx_size];
   1604 }
   1605 
   1606 /*!\endcond */
   1607 
   1608 #ifdef __cplusplus
   1609 }  // extern "C"
   1610 #endif
   1611 
   1612 #endif  // AOM_AV1_COMMON_BLOCKD_H_