LCOV - code coverage report
Current view: top level - third_party/aom/av1/decoder - decodemv.c (source / functions) Hit Total Coverage
Test: output.info Lines: 0 944 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 38 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       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             : #include <assert.h>
      13             : 
      14             : #include "av1/common/common.h"
      15             : #include "av1/common/entropy.h"
      16             : #include "av1/common/entropymode.h"
      17             : #include "av1/common/entropymv.h"
      18             : #include "av1/common/mvref_common.h"
      19             : #include "av1/common/pred_common.h"
      20             : #include "av1/common/reconinter.h"
      21             : #if CONFIG_EXT_INTRA
      22             : #include "av1/common/reconintra.h"
      23             : #endif  // CONFIG_EXT_INTRA
      24             : #include "av1/common/seg_common.h"
      25             : #if CONFIG_WARPED_MOTION
      26             : #include "av1/common/warped_motion.h"
      27             : #endif  // CONFIG_WARPED_MOTION
      28             : 
      29             : #include "av1/decoder/decodeframe.h"
      30             : #include "av1/decoder/decodemv.h"
      31             : 
      32             : #include "aom_dsp/aom_dsp_common.h"
      33             : 
      34             : #define ACCT_STR __func__
      35             : #if CONFIG_EXT_INTRA || CONFIG_FILTER_INTRA || CONFIG_PALETTE
      36           0 : static INLINE int read_uniform(aom_reader *r, int n) {
      37           0 :   const int l = get_unsigned_bits(n);
      38           0 :   const int m = (1 << l) - n;
      39           0 :   const int v = aom_read_literal(r, l - 1, ACCT_STR);
      40           0 :   assert(l != 0);
      41           0 :   if (v < m)
      42           0 :     return v;
      43             :   else
      44           0 :     return (v << 1) - m + aom_read_literal(r, 1, ACCT_STR);
      45             : }
      46             : #endif  // CONFIG_EXT_INTRA || CONFIG_FILTER_INTRA || CONFIG_PALETTE
      47             : 
      48           0 : static PREDICTION_MODE read_intra_mode(aom_reader *r, aom_cdf_prob *cdf) {
      49           0 :   return (PREDICTION_MODE)
      50           0 :       av1_intra_mode_inv[aom_read_symbol(r, cdf, INTRA_MODES, ACCT_STR)];
      51             : }
      52             : 
      53             : #if CONFIG_DELTA_Q
      54           0 : static int read_delta_qindex(AV1_COMMON *cm, MACROBLOCKD *xd, aom_reader *r,
      55             :                              MB_MODE_INFO *const mbmi, int mi_col, int mi_row) {
      56           0 :   FRAME_COUNTS *counts = xd->counts;
      57           0 :   int sign, abs, reduced_delta_qindex = 0;
      58           0 :   BLOCK_SIZE bsize = mbmi->sb_type;
      59           0 :   const int b_col = mi_col & MAX_MIB_MASK;
      60           0 :   const int b_row = mi_row & MAX_MIB_MASK;
      61           0 :   const int read_delta_q_flag = (b_col == 0 && b_row == 0);
      62             :   int rem_bits, thr;
      63             :   int i, smallval;
      64             : #if CONFIG_EC_ADAPT
      65           0 :   FRAME_CONTEXT *ec_ctx = xd->tile_ctx;
      66             :   (void)cm;
      67             : #else
      68             :   FRAME_CONTEXT *ec_ctx = cm->fc;
      69             : #endif
      70             : 
      71           0 :   if ((bsize != BLOCK_LARGEST || mbmi->skip == 0) && read_delta_q_flag) {
      72           0 :     abs = aom_read_symbol(r, ec_ctx->delta_q_cdf, DELTA_Q_PROBS + 1, ACCT_STR);
      73           0 :     smallval = (abs < DELTA_Q_SMALL);
      74           0 :     if (counts) {
      75           0 :       for (i = 0; i < abs; ++i) counts->delta_q[i][1]++;
      76           0 :       if (smallval) counts->delta_q[abs][0]++;
      77             :     }
      78             : 
      79           0 :     if (!smallval) {
      80           0 :       rem_bits = aom_read_literal(r, 3, ACCT_STR);
      81           0 :       thr = (1 << rem_bits) + 1;
      82           0 :       abs = aom_read_literal(r, rem_bits, ACCT_STR) + thr;
      83             :     }
      84             : 
      85           0 :     if (abs) {
      86           0 :       sign = aom_read_bit(r, ACCT_STR);
      87             :     } else {
      88           0 :       sign = 1;
      89             :     }
      90             : 
      91           0 :     reduced_delta_qindex = sign ? -abs : abs;
      92             :   }
      93           0 :   return reduced_delta_qindex;
      94             : }
      95             : #if CONFIG_EXT_DELTA_Q
      96           0 : static int read_delta_lflevel(AV1_COMMON *cm, MACROBLOCKD *xd, aom_reader *r,
      97             :                               MB_MODE_INFO *const mbmi, int mi_col,
      98             :                               int mi_row) {
      99           0 :   FRAME_COUNTS *counts = xd->counts;
     100           0 :   int sign, abs, reduced_delta_lflevel = 0;
     101           0 :   BLOCK_SIZE bsize = mbmi->sb_type;
     102           0 :   const int b_col = mi_col & MAX_MIB_MASK;
     103           0 :   const int b_row = mi_row & MAX_MIB_MASK;
     104           0 :   const int read_delta_lf_flag = (b_col == 0 && b_row == 0);
     105             :   int rem_bits, thr;
     106             :   int i, smallval;
     107             : #if CONFIG_EC_ADAPT
     108           0 :   FRAME_CONTEXT *ec_ctx = xd->tile_ctx;
     109             :   (void)cm;
     110             : #else
     111             :   FRAME_CONTEXT *ec_ctx = cm->fc;
     112             : #endif
     113             : 
     114           0 :   if ((bsize != BLOCK_64X64 || mbmi->skip == 0) && read_delta_lf_flag) {
     115           0 :     abs =
     116           0 :         aom_read_symbol(r, ec_ctx->delta_lf_cdf, DELTA_LF_PROBS + 1, ACCT_STR);
     117           0 :     smallval = (abs < DELTA_LF_SMALL);
     118           0 :     if (counts) {
     119           0 :       for (i = 0; i < abs; ++i) counts->delta_lf[i][1]++;
     120           0 :       if (smallval) counts->delta_lf[abs][0]++;
     121             :     }
     122           0 :     if (!smallval) {
     123           0 :       rem_bits = aom_read_literal(r, 3, ACCT_STR);
     124           0 :       thr = (1 << rem_bits) + 1;
     125           0 :       abs = aom_read_literal(r, rem_bits, ACCT_STR) + thr;
     126             :     }
     127             : 
     128           0 :     if (abs) {
     129           0 :       sign = aom_read_bit(r, ACCT_STR);
     130             :     } else {
     131           0 :       sign = 1;
     132             :     }
     133             : 
     134           0 :     reduced_delta_lflevel = sign ? -abs : abs;
     135             :   }
     136           0 :   return reduced_delta_lflevel;
     137             : }
     138             : #endif
     139             : #endif
     140             : 
     141           0 : static PREDICTION_MODE read_intra_mode_y(FRAME_CONTEXT *ec_ctx, MACROBLOCKD *xd,
     142             :                                          aom_reader *r, int size_group) {
     143           0 :   const PREDICTION_MODE y_mode =
     144           0 :       read_intra_mode(r, ec_ctx->y_mode_cdf[size_group]);
     145           0 :   FRAME_COUNTS *counts = xd->counts;
     146           0 :   if (counts) ++counts->y_mode[size_group][y_mode];
     147           0 :   return y_mode;
     148             : }
     149             : 
     150           0 : static PREDICTION_MODE read_intra_mode_uv(FRAME_CONTEXT *ec_ctx,
     151             :                                           MACROBLOCKD *xd, aom_reader *r,
     152             :                                           PREDICTION_MODE y_mode) {
     153           0 :   const PREDICTION_MODE uv_mode =
     154           0 :       read_intra_mode(r, ec_ctx->uv_mode_cdf[y_mode]);
     155           0 :   FRAME_COUNTS *counts = xd->counts;
     156           0 :   if (counts) ++counts->uv_mode[y_mode][uv_mode];
     157           0 :   return uv_mode;
     158             : }
     159             : 
     160             : #if CONFIG_CFL
     161             : static int read_cfl_alphas(FRAME_CONTEXT *const ec_ctx, aom_reader *r, int skip,
     162             :                            CFL_SIGN_TYPE signs_out[CFL_PRED_PLANES]) {
     163             :   if (skip) {
     164             :     signs_out[CFL_PRED_U] = CFL_SIGN_POS;
     165             :     signs_out[CFL_PRED_V] = CFL_SIGN_POS;
     166             :     return 0;
     167             :   } else {
     168             :     const int ind = aom_read_symbol(r, ec_ctx->cfl_alpha_cdf, CFL_ALPHABET_SIZE,
     169             :                                     "cfl:alpha");
     170             :     // Signs are only coded for nonzero values
     171             :     // sign == 0 implies negative alpha
     172             :     // sign == 1 implies positive alpha
     173             :     signs_out[CFL_PRED_U] = cfl_alpha_codes[ind][CFL_PRED_U]
     174             :                                 ? aom_read_bit(r, "cfl:sign")
     175             :                                 : CFL_SIGN_POS;
     176             :     signs_out[CFL_PRED_V] = cfl_alpha_codes[ind][CFL_PRED_V]
     177             :                                 ? aom_read_bit(r, "cfl:sign")
     178             :                                 : CFL_SIGN_POS;
     179             : 
     180             :     return ind;
     181             :   }
     182             : }
     183             : #endif
     184             : 
     185             : #if CONFIG_EXT_INTER && CONFIG_INTERINTRA
     186           0 : static INTERINTRA_MODE read_interintra_mode(AV1_COMMON *cm, MACROBLOCKD *xd,
     187             :                                             aom_reader *r, int size_group) {
     188           0 :   const INTERINTRA_MODE ii_mode = (INTERINTRA_MODE)aom_read_tree(
     189             :       r, av1_interintra_mode_tree, cm->fc->interintra_mode_prob[size_group],
     190             :       ACCT_STR);
     191           0 :   FRAME_COUNTS *counts = xd->counts;
     192           0 :   if (counts) ++counts->interintra_mode[size_group][ii_mode];
     193           0 :   return ii_mode;
     194             : }
     195             : #endif  // CONFIG_EXT_INTER && CONFIG_INTERINTRA
     196             : 
     197           0 : static PREDICTION_MODE read_inter_mode(FRAME_CONTEXT *ec_ctx, MACROBLOCKD *xd,
     198             :                                        aom_reader *r, int16_t ctx) {
     199           0 :   FRAME_COUNTS *counts = xd->counts;
     200           0 :   int16_t mode_ctx = ctx & NEWMV_CTX_MASK;
     201           0 :   aom_prob mode_prob = ec_ctx->newmv_prob[mode_ctx];
     202             : 
     203           0 :   if (aom_read(r, mode_prob, ACCT_STR) == 0) {
     204           0 :     if (counts) ++counts->newmv_mode[mode_ctx][0];
     205           0 :     return NEWMV;
     206             :   }
     207           0 :   if (counts) ++counts->newmv_mode[mode_ctx][1];
     208             : 
     209           0 :   if (ctx & (1 << ALL_ZERO_FLAG_OFFSET)) return ZEROMV;
     210             : 
     211           0 :   mode_ctx = (ctx >> ZEROMV_OFFSET) & ZEROMV_CTX_MASK;
     212             : 
     213           0 :   mode_prob = ec_ctx->zeromv_prob[mode_ctx];
     214           0 :   if (aom_read(r, mode_prob, ACCT_STR) == 0) {
     215           0 :     if (counts) ++counts->zeromv_mode[mode_ctx][0];
     216           0 :     return ZEROMV;
     217             :   }
     218           0 :   if (counts) ++counts->zeromv_mode[mode_ctx][1];
     219             : 
     220           0 :   mode_ctx = (ctx >> REFMV_OFFSET) & REFMV_CTX_MASK;
     221             : 
     222           0 :   if (ctx & (1 << SKIP_NEARESTMV_OFFSET)) mode_ctx = 6;
     223           0 :   if (ctx & (1 << SKIP_NEARMV_OFFSET)) mode_ctx = 7;
     224           0 :   if (ctx & (1 << SKIP_NEARESTMV_SUB8X8_OFFSET)) mode_ctx = 8;
     225             : 
     226           0 :   mode_prob = ec_ctx->refmv_prob[mode_ctx];
     227             : 
     228           0 :   if (aom_read(r, mode_prob, ACCT_STR) == 0) {
     229           0 :     if (counts) ++counts->refmv_mode[mode_ctx][0];
     230             : 
     231           0 :     return NEARESTMV;
     232             :   } else {
     233           0 :     if (counts) ++counts->refmv_mode[mode_ctx][1];
     234           0 :     return NEARMV;
     235             :   }
     236             : 
     237             :   // Invalid prediction mode.
     238             :   assert(0);
     239             : }
     240             : 
     241           0 : static void read_drl_idx(const AV1_COMMON *cm, MACROBLOCKD *xd,
     242             :                          MB_MODE_INFO *mbmi, aom_reader *r) {
     243           0 :   uint8_t ref_frame_type = av1_ref_frame_type(mbmi->ref_frame);
     244           0 :   mbmi->ref_mv_idx = 0;
     245             : 
     246             : #if CONFIG_EXT_INTER
     247           0 :   if (mbmi->mode == NEWMV || mbmi->mode == NEW_NEWMV) {
     248             : #else
     249             :   if (mbmi->mode == NEWMV) {
     250             : #endif
     251             :     int idx;
     252           0 :     for (idx = 0; idx < 2; ++idx) {
     253           0 :       if (xd->ref_mv_count[ref_frame_type] > idx + 1) {
     254           0 :         uint8_t drl_ctx = av1_drl_ctx(xd->ref_mv_stack[ref_frame_type], idx);
     255           0 :         aom_prob drl_prob = cm->fc->drl_prob[drl_ctx];
     256           0 :         if (!aom_read(r, drl_prob, ACCT_STR)) {
     257           0 :           mbmi->ref_mv_idx = idx;
     258           0 :           if (xd->counts) ++xd->counts->drl_mode[drl_ctx][0];
     259           0 :           return;
     260             :         }
     261           0 :         mbmi->ref_mv_idx = idx + 1;
     262           0 :         if (xd->counts) ++xd->counts->drl_mode[drl_ctx][1];
     263             :       }
     264             :     }
     265             :   }
     266             : 
     267           0 :   if (have_nearmv_in_inter_mode(mbmi->mode)) {
     268             :     int idx;
     269             :     // Offset the NEARESTMV mode.
     270             :     // TODO(jingning): Unify the two syntax decoding loops after the NEARESTMV
     271             :     // mode is factored in.
     272           0 :     for (idx = 1; idx < 3; ++idx) {
     273           0 :       if (xd->ref_mv_count[ref_frame_type] > idx + 1) {
     274           0 :         uint8_t drl_ctx = av1_drl_ctx(xd->ref_mv_stack[ref_frame_type], idx);
     275           0 :         aom_prob drl_prob = cm->fc->drl_prob[drl_ctx];
     276           0 :         if (!aom_read(r, drl_prob, ACCT_STR)) {
     277           0 :           mbmi->ref_mv_idx = idx - 1;
     278           0 :           if (xd->counts) ++xd->counts->drl_mode[drl_ctx][0];
     279           0 :           return;
     280             :         }
     281           0 :         mbmi->ref_mv_idx = idx;
     282           0 :         if (xd->counts) ++xd->counts->drl_mode[drl_ctx][1];
     283             :       }
     284             :     }
     285             :   }
     286             : }
     287             : 
     288             : #if CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION
     289           0 : static MOTION_MODE read_motion_mode(AV1_COMMON *cm, MACROBLOCKD *xd,
     290             :                                     MODE_INFO *mi, aom_reader *r) {
     291           0 :   MB_MODE_INFO *mbmi = &mi->mbmi;
     292           0 :   const MOTION_MODE last_motion_mode_allowed = motion_mode_allowed(
     293             : #if CONFIG_GLOBAL_MOTION && SEPARATE_GLOBAL_MOTION
     294           0 :       0, xd->global_motion,
     295             : #endif  // CONFIG_GLOBAL_MOTION && SEPARATE_GLOBAL_MOTION
     296             :       mi);
     297             :   int motion_mode;
     298           0 :   FRAME_COUNTS *counts = xd->counts;
     299             : 
     300           0 :   if (last_motion_mode_allowed == SIMPLE_TRANSLATION) return SIMPLE_TRANSLATION;
     301             : #if CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION
     302           0 :   if (last_motion_mode_allowed == OBMC_CAUSAL) {
     303           0 :     motion_mode = aom_read(r, cm->fc->obmc_prob[mbmi->sb_type], ACCT_STR);
     304           0 :     if (counts) ++counts->obmc[mbmi->sb_type][motion_mode];
     305           0 :     return (MOTION_MODE)(SIMPLE_TRANSLATION + motion_mode);
     306             :   } else {
     307             : #endif  // CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION
     308           0 :     motion_mode =
     309           0 :         aom_read_tree(r, av1_motion_mode_tree,
     310             :                       cm->fc->motion_mode_prob[mbmi->sb_type], ACCT_STR);
     311           0 :     if (counts) ++counts->motion_mode[mbmi->sb_type][motion_mode];
     312           0 :     return (MOTION_MODE)(SIMPLE_TRANSLATION + motion_mode);
     313             : #if CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION
     314             :   }
     315             : #endif  // CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION
     316             : }
     317             : #endif  // CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION
     318             : 
     319             : #if CONFIG_EXT_INTER
     320           0 : static PREDICTION_MODE read_inter_compound_mode(AV1_COMMON *cm, MACROBLOCKD *xd,
     321             :                                                 aom_reader *r, int16_t ctx) {
     322           0 :   const int mode =
     323           0 :       aom_read_tree(r, av1_inter_compound_mode_tree,
     324             :                     cm->fc->inter_compound_mode_probs[ctx], ACCT_STR);
     325           0 :   FRAME_COUNTS *counts = xd->counts;
     326             : 
     327           0 :   if (counts) ++counts->inter_compound_mode[ctx][mode];
     328             : 
     329           0 :   assert(is_inter_compound_mode(NEAREST_NEARESTMV + mode));
     330           0 :   return NEAREST_NEARESTMV + mode;
     331             : }
     332             : #endif  // CONFIG_EXT_INTER
     333             : 
     334           0 : static int read_segment_id(aom_reader *r, struct segmentation_probs *segp) {
     335           0 :   return aom_read_symbol(r, segp->tree_cdf, MAX_SEGMENTS, ACCT_STR);
     336             : }
     337             : 
     338             : #if CONFIG_VAR_TX
     339           0 : static void read_tx_size_vartx(AV1_COMMON *cm, MACROBLOCKD *xd,
     340             :                                MB_MODE_INFO *mbmi, FRAME_COUNTS *counts,
     341             :                                TX_SIZE tx_size, int depth, int blk_row,
     342             :                                int blk_col, aom_reader *r) {
     343           0 :   int is_split = 0;
     344           0 :   const int tx_row = blk_row >> 1;
     345           0 :   const int tx_col = blk_col >> 1;
     346           0 :   const int max_blocks_high = max_block_high(xd, mbmi->sb_type, 0);
     347           0 :   const int max_blocks_wide = max_block_wide(xd, mbmi->sb_type, 0);
     348           0 :   int ctx = txfm_partition_context(xd->above_txfm_context + blk_col,
     349           0 :                                    xd->left_txfm_context + blk_row,
     350           0 :                                    mbmi->sb_type, tx_size);
     351           0 :   TX_SIZE(*const inter_tx_size)
     352             :   [MAX_MIB_SIZE] =
     353             :       (TX_SIZE(*)[MAX_MIB_SIZE]) & mbmi->inter_tx_size[tx_row][tx_col];
     354           0 :   if (blk_row >= max_blocks_high || blk_col >= max_blocks_wide) return;
     355             : 
     356           0 :   if (depth == MAX_VARTX_DEPTH) {
     357             :     int idx, idy;
     358           0 :     inter_tx_size[0][0] = tx_size;
     359           0 :     for (idy = 0; idy < tx_size_high_unit[tx_size] / 2; ++idy)
     360           0 :       for (idx = 0; idx < tx_size_wide_unit[tx_size] / 2; ++idx)
     361           0 :         inter_tx_size[idy][idx] = tx_size;
     362           0 :     mbmi->tx_size = tx_size;
     363           0 :     mbmi->min_tx_size = AOMMIN(mbmi->min_tx_size, get_min_tx_size(tx_size));
     364           0 :     if (counts) ++counts->txfm_partition[ctx][0];
     365           0 :     txfm_partition_update(xd->above_txfm_context + blk_col,
     366           0 :                           xd->left_txfm_context + blk_row, tx_size, tx_size);
     367           0 :     return;
     368             :   }
     369             : 
     370           0 :   is_split = aom_read(r, cm->fc->txfm_partition_prob[ctx], ACCT_STR);
     371             : 
     372           0 :   if (is_split) {
     373           0 :     const TX_SIZE sub_txs = sub_tx_size_map[tx_size];
     374           0 :     const int bsl = tx_size_wide_unit[sub_txs];
     375             :     int i;
     376             : 
     377           0 :     if (counts) ++counts->txfm_partition[ctx][1];
     378             : 
     379           0 :     if (tx_size == TX_8X8) {
     380             :       int idx, idy;
     381           0 :       inter_tx_size[0][0] = sub_txs;
     382           0 :       for (idy = 0; idy < tx_size_high_unit[tx_size] / 2; ++idy)
     383           0 :         for (idx = 0; idx < tx_size_wide_unit[tx_size] / 2; ++idx)
     384           0 :           inter_tx_size[idy][idx] = inter_tx_size[0][0];
     385           0 :       mbmi->tx_size = sub_txs;
     386           0 :       mbmi->min_tx_size = get_min_tx_size(mbmi->tx_size);
     387           0 :       txfm_partition_update(xd->above_txfm_context + blk_col,
     388           0 :                             xd->left_txfm_context + blk_row, sub_txs, tx_size);
     389           0 :       return;
     390             :     }
     391             : 
     392           0 :     assert(bsl > 0);
     393           0 :     for (i = 0; i < 4; ++i) {
     394           0 :       int offsetr = blk_row + (i >> 1) * bsl;
     395           0 :       int offsetc = blk_col + (i & 0x01) * bsl;
     396           0 :       read_tx_size_vartx(cm, xd, mbmi, counts, sub_txs, depth + 1, offsetr,
     397             :                          offsetc, r);
     398             :     }
     399             :   } else {
     400             :     int idx, idy;
     401           0 :     inter_tx_size[0][0] = tx_size;
     402           0 :     for (idy = 0; idy < tx_size_high_unit[tx_size] / 2; ++idy)
     403           0 :       for (idx = 0; idx < tx_size_wide_unit[tx_size] / 2; ++idx)
     404           0 :         inter_tx_size[idy][idx] = tx_size;
     405           0 :     mbmi->tx_size = tx_size;
     406           0 :     mbmi->min_tx_size = AOMMIN(mbmi->min_tx_size, get_min_tx_size(tx_size));
     407           0 :     if (counts) ++counts->txfm_partition[ctx][0];
     408           0 :     txfm_partition_update(xd->above_txfm_context + blk_col,
     409           0 :                           xd->left_txfm_context + blk_row, tx_size, tx_size);
     410             :   }
     411             : }
     412             : #endif
     413             : 
     414           0 : static TX_SIZE read_selected_tx_size(AV1_COMMON *cm, MACROBLOCKD *xd,
     415             :                                      int tx_size_cat, aom_reader *r) {
     416           0 :   FRAME_COUNTS *counts = xd->counts;
     417           0 :   const int ctx = get_tx_size_context(xd);
     418             : #if CONFIG_EC_ADAPT
     419           0 :   FRAME_CONTEXT *ec_ctx = xd->tile_ctx;
     420             :   (void)cm;
     421             : #else
     422             :   FRAME_CONTEXT *ec_ctx = cm->fc;
     423             : #endif
     424             : 
     425           0 :   const int depth = aom_read_symbol(r, ec_ctx->tx_size_cdf[tx_size_cat][ctx],
     426             :                                     tx_size_cat + 2, ACCT_STR);
     427           0 :   const TX_SIZE tx_size = depth_to_tx_size(depth);
     428             : #if CONFIG_RECT_TX
     429           0 :   assert(!is_rect_tx(tx_size));
     430             : #endif  // CONFIG_RECT_TX
     431           0 :   if (counts) ++counts->tx_size[tx_size_cat][ctx][depth];
     432           0 :   return tx_size;
     433             : }
     434             : 
     435           0 : static TX_SIZE read_tx_size(AV1_COMMON *cm, MACROBLOCKD *xd, int is_inter,
     436             :                             int allow_select_inter, aom_reader *r) {
     437           0 :   const TX_MODE tx_mode = cm->tx_mode;
     438           0 :   const BLOCK_SIZE bsize = xd->mi[0]->mbmi.sb_type;
     439           0 :   if (xd->lossless[xd->mi[0]->mbmi.segment_id]) return TX_4X4;
     440             : #if CONFIG_CB4X4 && (CONFIG_VAR_TX || CONFIG_EXT_TX) && CONFIG_RECT_TX
     441           0 :   if (bsize > BLOCK_4X4) {
     442             : #else
     443             :   if (bsize >= BLOCK_8X8) {
     444             : #endif  // CONFIG_CB4X4 && CONFIG_VAR_TX
     445           0 :     if ((!is_inter || allow_select_inter) && tx_mode == TX_MODE_SELECT) {
     446           0 :       const int32_t tx_size_cat = is_inter ? inter_tx_size_cat_lookup[bsize]
     447           0 :                                            : intra_tx_size_cat_lookup[bsize];
     448           0 :       const TX_SIZE coded_tx_size =
     449             :           read_selected_tx_size(cm, xd, tx_size_cat, r);
     450             : #if CONFIG_RECT_TX && (CONFIG_EXT_TX || CONFIG_VAR_TX)
     451           0 :       if (coded_tx_size > max_txsize_lookup[bsize]) {
     452           0 :         assert(coded_tx_size == max_txsize_lookup[bsize] + 1);
     453             : #if CONFIG_EXT_TX && CONFIG_RECT_TX_EXT
     454             :         if (is_quarter_tx_allowed(xd, &xd->mi[0]->mbmi, is_inter)) {
     455             :           int quarter_tx = aom_read(r, cm->fc->quarter_tx_size_prob, ACCT_STR);
     456             :           FRAME_COUNTS *counts = xd->counts;
     457             : 
     458             :           if (counts) ++counts->quarter_tx_size[quarter_tx];
     459             :           return quarter_tx ? quarter_txsize_lookup[bsize]
     460             :                             : max_txsize_rect_lookup[bsize];
     461             :         }
     462             : #endif  // CONFIG_EXT_TX && CONFIG_RECT_TX_EXT
     463             : 
     464           0 :         return max_txsize_rect_lookup[bsize];
     465             :       }
     466             : #else
     467             :       assert(coded_tx_size <= max_txsize_lookup[bsize]);
     468             : #endif  // CONFIG_RECT_TX && (CONFIG_EXT_TX || CONFIG_VAR_TX)
     469           0 :       return coded_tx_size;
     470             :     } else {
     471           0 :       return tx_size_from_tx_mode(bsize, tx_mode, is_inter);
     472             :     }
     473             :   } else {
     474             : #if CONFIG_EXT_TX && CONFIG_RECT_TX
     475           0 :     assert(IMPLIES(tx_mode == ONLY_4X4, bsize == BLOCK_4X4));
     476           0 :     return max_txsize_rect_lookup[bsize];
     477             : #else
     478             :     return TX_4X4;
     479             : #endif  // CONFIG_EXT_TX && CONFIG_RECT_TX
     480             :   }
     481             : }
     482             : 
     483           0 : static int dec_get_segment_id(const AV1_COMMON *cm, const uint8_t *segment_ids,
     484             :                               int mi_offset, int x_mis, int y_mis) {
     485           0 :   int x, y, segment_id = INT_MAX;
     486             : 
     487           0 :   for (y = 0; y < y_mis; y++)
     488           0 :     for (x = 0; x < x_mis; x++)
     489           0 :       segment_id =
     490           0 :           AOMMIN(segment_id, segment_ids[mi_offset + y * cm->mi_cols + x]);
     491             : 
     492           0 :   assert(segment_id >= 0 && segment_id < MAX_SEGMENTS);
     493           0 :   return segment_id;
     494             : }
     495             : 
     496           0 : static void set_segment_id(AV1_COMMON *cm, int mi_offset, int x_mis, int y_mis,
     497             :                            int segment_id) {
     498             :   int x, y;
     499             : 
     500           0 :   assert(segment_id >= 0 && segment_id < MAX_SEGMENTS);
     501             : 
     502           0 :   for (y = 0; y < y_mis; y++)
     503           0 :     for (x = 0; x < x_mis; x++)
     504           0 :       cm->current_frame_seg_map[mi_offset + y * cm->mi_cols + x] = segment_id;
     505           0 : }
     506             : 
     507           0 : static int read_intra_segment_id(AV1_COMMON *const cm, MACROBLOCKD *const xd,
     508             :                                  int mi_offset, int x_mis, int y_mis,
     509             :                                  aom_reader *r) {
     510           0 :   struct segmentation *const seg = &cm->seg;
     511           0 :   FRAME_COUNTS *counts = xd->counts;
     512           0 :   struct segmentation_probs *const segp = &cm->fc->seg;
     513             :   int segment_id;
     514             : 
     515           0 :   if (!seg->enabled) return 0;  // Default for disabled segmentation
     516             : 
     517           0 :   assert(seg->update_map && !seg->temporal_update);
     518             : 
     519           0 :   segment_id = read_segment_id(r, segp);
     520           0 :   if (counts) ++counts->seg.tree_total[segment_id];
     521           0 :   set_segment_id(cm, mi_offset, x_mis, y_mis, segment_id);
     522           0 :   return segment_id;
     523             : }
     524             : 
     525           0 : static void copy_segment_id(const AV1_COMMON *cm,
     526             :                             const uint8_t *last_segment_ids,
     527             :                             uint8_t *current_segment_ids, int mi_offset,
     528             :                             int x_mis, int y_mis) {
     529             :   int x, y;
     530             : 
     531           0 :   for (y = 0; y < y_mis; y++)
     532           0 :     for (x = 0; x < x_mis; x++)
     533           0 :       current_segment_ids[mi_offset + y * cm->mi_cols + x] =
     534           0 :           last_segment_ids ? last_segment_ids[mi_offset + y * cm->mi_cols + x]
     535             :                            : 0;
     536           0 : }
     537             : 
     538           0 : static int read_inter_segment_id(AV1_COMMON *const cm, MACROBLOCKD *const xd,
     539             :                                  int mi_row, int mi_col, aom_reader *r) {
     540           0 :   struct segmentation *const seg = &cm->seg;
     541           0 :   FRAME_COUNTS *counts = xd->counts;
     542           0 :   struct segmentation_probs *const segp = &cm->fc->seg;
     543           0 :   MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
     544             :   int predicted_segment_id, segment_id;
     545           0 :   const int mi_offset = mi_row * cm->mi_cols + mi_col;
     546           0 :   const int bw = mi_size_wide[mbmi->sb_type];
     547           0 :   const int bh = mi_size_high[mbmi->sb_type];
     548             : 
     549             :   // TODO(slavarnway): move x_mis, y_mis into xd ?????
     550           0 :   const int x_mis = AOMMIN(cm->mi_cols - mi_col, bw);
     551           0 :   const int y_mis = AOMMIN(cm->mi_rows - mi_row, bh);
     552             : 
     553           0 :   if (!seg->enabled) return 0;  // Default for disabled segmentation
     554             : 
     555           0 :   predicted_segment_id = cm->last_frame_seg_map
     556           0 :                              ? dec_get_segment_id(cm, cm->last_frame_seg_map,
     557             :                                                   mi_offset, x_mis, y_mis)
     558           0 :                              : 0;
     559             : 
     560           0 :   if (!seg->update_map) {
     561           0 :     copy_segment_id(cm, cm->last_frame_seg_map, cm->current_frame_seg_map,
     562             :                     mi_offset, x_mis, y_mis);
     563           0 :     return predicted_segment_id;
     564             :   }
     565             : 
     566           0 :   if (seg->temporal_update) {
     567           0 :     const int ctx = av1_get_pred_context_seg_id(xd);
     568           0 :     const aom_prob pred_prob = segp->pred_probs[ctx];
     569           0 :     mbmi->seg_id_predicted = aom_read(r, pred_prob, ACCT_STR);
     570           0 :     if (counts) ++counts->seg.pred[ctx][mbmi->seg_id_predicted];
     571           0 :     if (mbmi->seg_id_predicted) {
     572           0 :       segment_id = predicted_segment_id;
     573             :     } else {
     574           0 :       segment_id = read_segment_id(r, segp);
     575           0 :       if (counts) ++counts->seg.tree_mispred[segment_id];
     576             :     }
     577             :   } else {
     578           0 :     segment_id = read_segment_id(r, segp);
     579           0 :     if (counts) ++counts->seg.tree_total[segment_id];
     580             :   }
     581           0 :   set_segment_id(cm, mi_offset, x_mis, y_mis, segment_id);
     582           0 :   return segment_id;
     583             : }
     584             : 
     585           0 : static int read_skip(AV1_COMMON *cm, const MACROBLOCKD *xd, int segment_id,
     586             :                      aom_reader *r) {
     587           0 :   if (segfeature_active(&cm->seg, segment_id, SEG_LVL_SKIP)) {
     588           0 :     return 1;
     589             :   } else {
     590           0 :     const int ctx = av1_get_skip_context(xd);
     591           0 :     const int skip = aom_read(r, cm->fc->skip_probs[ctx], ACCT_STR);
     592           0 :     FRAME_COUNTS *counts = xd->counts;
     593           0 :     if (counts) ++counts->skip[ctx][skip];
     594           0 :     return skip;
     595             :   }
     596             : }
     597             : 
     598             : #if CONFIG_PALETTE
     599             : #if CONFIG_PALETTE_DELTA_ENCODING
     600             : static int uint16_compare(const void *a, const void *b) {
     601             :   const uint16_t va = *(const uint16_t *)a;
     602             :   const uint16_t vb = *(const uint16_t *)b;
     603             :   return va - vb;
     604             : }
     605             : 
     606             : static void read_palette_colors_y(MACROBLOCKD *const xd, int bit_depth,
     607             :                                   PALETTE_MODE_INFO *const pmi, aom_reader *r) {
     608             :   uint16_t color_cache[2 * PALETTE_MAX_SIZE];
     609             :   const MODE_INFO *const above_mi = xd->above_mi;
     610             :   const MODE_INFO *const left_mi = xd->left_mi;
     611             :   const int n_cache = av1_get_palette_cache(above_mi, left_mi, 0, color_cache);
     612             :   const int n = pmi->palette_size[0];
     613             :   int idx = 0;
     614             :   for (int i = 0; i < n_cache && idx < n; ++i)
     615             :     if (aom_read_bit(r, ACCT_STR)) pmi->palette_colors[idx++] = color_cache[i];
     616             :   if (idx < n) {
     617             :     pmi->palette_colors[idx++] = aom_read_literal(r, bit_depth, ACCT_STR);
     618             :     if (idx < n) {
     619             :       const int min_bits = bit_depth - 3;
     620             :       int bits = min_bits + aom_read_literal(r, 2, ACCT_STR);
     621             :       int range = (1 << bit_depth) - pmi->palette_colors[idx - 1] - 1;
     622             :       for (; idx < n; ++idx) {
     623             :         const int delta = aom_read_literal(r, bits, ACCT_STR) + 1;
     624             :         pmi->palette_colors[idx] = pmi->palette_colors[idx - 1] + delta;
     625             :         range -= delta;
     626             :         bits = AOMMIN(bits, av1_ceil_log2(range));
     627             :       }
     628             :     }
     629             :   }
     630             :   qsort(pmi->palette_colors, n, sizeof(pmi->palette_colors[0]), uint16_compare);
     631             : }
     632             : 
     633             : static void read_palette_colors_uv(MACROBLOCKD *const xd, int bit_depth,
     634             :                                    PALETTE_MODE_INFO *const pmi,
     635             :                                    aom_reader *r) {
     636             :   const int n = pmi->palette_size[1];
     637             :   // U channel colors.
     638             :   uint16_t color_cache[2 * PALETTE_MAX_SIZE];
     639             :   const MODE_INFO *const above_mi = xd->above_mi;
     640             :   const MODE_INFO *const left_mi = xd->left_mi;
     641             :   const int n_cache = av1_get_palette_cache(above_mi, left_mi, 1, color_cache);
     642             :   int idx = PALETTE_MAX_SIZE;
     643             :   for (int i = 0; i < n_cache && idx < PALETTE_MAX_SIZE + n; ++i)
     644             :     if (aom_read_bit(r, ACCT_STR)) pmi->palette_colors[idx++] = color_cache[i];
     645             :   if (idx < PALETTE_MAX_SIZE + n) {
     646             :     pmi->palette_colors[idx++] = aom_read_literal(r, bit_depth, ACCT_STR);
     647             :     if (idx < PALETTE_MAX_SIZE + n) {
     648             :       const int min_bits = bit_depth - 3;
     649             :       int bits = min_bits + aom_read_literal(r, 2, ACCT_STR);
     650             :       int range = (1 << bit_depth) - pmi->palette_colors[idx - 1];
     651             :       for (; idx < PALETTE_MAX_SIZE + n; ++idx) {
     652             :         const int delta = aom_read_literal(r, bits, ACCT_STR);
     653             :         pmi->palette_colors[idx] = pmi->palette_colors[idx - 1] + delta;
     654             :         range -= delta;
     655             :         bits = AOMMIN(bits, av1_ceil_log2(range));
     656             :       }
     657             :     }
     658             :   }
     659             :   qsort(pmi->palette_colors + PALETTE_MAX_SIZE, n,
     660             :         sizeof(pmi->palette_colors[0]), uint16_compare);
     661             : 
     662             :   // V channel colors.
     663             :   if (aom_read_bit(r, ACCT_STR)) {  // Delta encoding.
     664             :     const int min_bits_v = bit_depth - 4;
     665             :     const int max_val = 1 << bit_depth;
     666             :     int bits = min_bits_v + aom_read_literal(r, 2, ACCT_STR);
     667             :     pmi->palette_colors[2 * PALETTE_MAX_SIZE] =
     668             :         aom_read_literal(r, bit_depth, ACCT_STR);
     669             :     for (int i = 1; i < n; ++i) {
     670             :       int delta = aom_read_literal(r, bits, ACCT_STR);
     671             :       if (delta && aom_read_bit(r, ACCT_STR)) delta = -delta;
     672             :       int val = (int)pmi->palette_colors[2 * PALETTE_MAX_SIZE + i - 1] + delta;
     673             :       if (val < 0) val += max_val;
     674             :       if (val >= max_val) val -= max_val;
     675             :       pmi->palette_colors[2 * PALETTE_MAX_SIZE + i] = val;
     676             :     }
     677             :   } else {
     678             :     for (int i = 0; i < n; ++i) {
     679             :       pmi->palette_colors[2 * PALETTE_MAX_SIZE + i] =
     680             :           aom_read_literal(r, bit_depth, ACCT_STR);
     681             :     }
     682             :   }
     683             : }
     684             : #endif  // CONFIG_PALETTE_DELTA_ENCODING
     685             : 
     686           0 : static void read_palette_mode_info(AV1_COMMON *const cm, MACROBLOCKD *const xd,
     687             :                                    aom_reader *r) {
     688           0 :   MODE_INFO *const mi = xd->mi[0];
     689           0 :   MB_MODE_INFO *const mbmi = &mi->mbmi;
     690           0 :   const MODE_INFO *const above_mi = xd->above_mi;
     691           0 :   const MODE_INFO *const left_mi = xd->left_mi;
     692           0 :   const BLOCK_SIZE bsize = mbmi->sb_type;
     693             :   int n;
     694           0 :   PALETTE_MODE_INFO *const pmi = &mbmi->palette_mode_info;
     695             : 
     696           0 :   if (mbmi->mode == DC_PRED) {
     697           0 :     int palette_y_mode_ctx = 0;
     698           0 :     if (above_mi)
     699           0 :       palette_y_mode_ctx +=
     700           0 :           (above_mi->mbmi.palette_mode_info.palette_size[0] > 0);
     701           0 :     if (left_mi)
     702           0 :       palette_y_mode_ctx +=
     703           0 :           (left_mi->mbmi.palette_mode_info.palette_size[0] > 0);
     704           0 :     if (aom_read(r, av1_default_palette_y_mode_prob[bsize - BLOCK_8X8]
     705             :                                                    [palette_y_mode_ctx],
     706             :                  ACCT_STR)) {
     707           0 :       pmi->palette_size[0] =
     708           0 :           aom_read_tree(r, av1_palette_size_tree,
     709             :                         av1_default_palette_y_size_prob[bsize - BLOCK_8X8],
     710           0 :                         ACCT_STR) +
     711             :           2;
     712           0 :       n = pmi->palette_size[0];
     713             : #if CONFIG_PALETTE_DELTA_ENCODING
     714             :       read_palette_colors_y(xd, cm->bit_depth, pmi, r);
     715             : #else
     716             :       int i;
     717           0 :       for (i = 0; i < n; ++i)
     718           0 :         pmi->palette_colors[i] = aom_read_literal(r, cm->bit_depth, ACCT_STR);
     719             : #endif  // CONFIG_PALETTE_DELTA_ENCODING
     720           0 :       xd->plane[0].color_index_map[0] = read_uniform(r, n);
     721           0 :       assert(xd->plane[0].color_index_map[0] < n);
     722             :     }
     723             :   }
     724             : 
     725           0 :   if (mbmi->uv_mode == DC_PRED) {
     726           0 :     const int palette_uv_mode_ctx = (pmi->palette_size[0] > 0);
     727           0 :     if (aom_read(r, av1_default_palette_uv_mode_prob[palette_uv_mode_ctx],
     728             :                  ACCT_STR)) {
     729           0 :       pmi->palette_size[1] =
     730           0 :           aom_read_tree(r, av1_palette_size_tree,
     731             :                         av1_default_palette_uv_size_prob[bsize - BLOCK_8X8],
     732           0 :                         ACCT_STR) +
     733             :           2;
     734           0 :       n = pmi->palette_size[1];
     735             : #if CONFIG_PALETTE_DELTA_ENCODING
     736             :       read_palette_colors_uv(xd, cm->bit_depth, pmi, r);
     737             : #else
     738             :       int i;
     739           0 :       for (i = 0; i < n; ++i) {
     740           0 :         pmi->palette_colors[PALETTE_MAX_SIZE + i] =
     741           0 :             aom_read_literal(r, cm->bit_depth, ACCT_STR);
     742           0 :         pmi->palette_colors[2 * PALETTE_MAX_SIZE + i] =
     743           0 :             aom_read_literal(r, cm->bit_depth, ACCT_STR);
     744             :       }
     745             : #endif  // CONFIG_PALETTE_DELTA_ENCODING
     746           0 :       xd->plane[1].color_index_map[0] = read_uniform(r, n);
     747           0 :       assert(xd->plane[1].color_index_map[0] < n);
     748             :     }
     749             :   }
     750           0 : }
     751             : #endif  // CONFIG_PALETTE
     752             : 
     753             : #if CONFIG_FILTER_INTRA
     754             : static void read_filter_intra_mode_info(AV1_COMMON *const cm,
     755             :                                         MACROBLOCKD *const xd, int mi_row,
     756             :                                         int mi_col, aom_reader *r) {
     757             :   MODE_INFO *const mi = xd->mi[0];
     758             :   MB_MODE_INFO *const mbmi = &mi->mbmi;
     759             :   FRAME_COUNTS *counts = xd->counts;
     760             :   FILTER_INTRA_MODE_INFO *filter_intra_mode_info =
     761             :       &mbmi->filter_intra_mode_info;
     762             : 
     763             :   if (mbmi->mode == DC_PRED
     764             : #if CONFIG_PALETTE
     765             :       && mbmi->palette_mode_info.palette_size[0] == 0
     766             : #endif  // CONFIG_PALETTE
     767             :       ) {
     768             :     filter_intra_mode_info->use_filter_intra_mode[0] =
     769             :         aom_read(r, cm->fc->filter_intra_probs[0], ACCT_STR);
     770             :     if (filter_intra_mode_info->use_filter_intra_mode[0]) {
     771             :       filter_intra_mode_info->filter_intra_mode[0] =
     772             :           read_uniform(r, FILTER_INTRA_MODES);
     773             :     }
     774             :     if (counts) {
     775             :       ++counts
     776             :             ->filter_intra[0][filter_intra_mode_info->use_filter_intra_mode[0]];
     777             :     }
     778             :   }
     779             : 
     780             : #if CONFIG_CB4X4
     781             :   if (!is_chroma_reference(mi_row, mi_col, mbmi->sb_type,
     782             :                            xd->plane[1].subsampling_x,
     783             :                            xd->plane[1].subsampling_y))
     784             :     return;
     785             : #else
     786             :   (void)mi_row;
     787             :   (void)mi_col;
     788             : #endif  // CONFIG_CB4X4
     789             : 
     790             :   if (mbmi->uv_mode == DC_PRED
     791             : #if CONFIG_PALETTE
     792             :       && mbmi->palette_mode_info.palette_size[1] == 0
     793             : #endif  // CONFIG_PALETTE
     794             :       ) {
     795             :     filter_intra_mode_info->use_filter_intra_mode[1] =
     796             :         aom_read(r, cm->fc->filter_intra_probs[1], ACCT_STR);
     797             :     if (filter_intra_mode_info->use_filter_intra_mode[1]) {
     798             :       filter_intra_mode_info->filter_intra_mode[1] =
     799             :           read_uniform(r, FILTER_INTRA_MODES);
     800             :     }
     801             :     if (counts) {
     802             :       ++counts
     803             :             ->filter_intra[1][filter_intra_mode_info->use_filter_intra_mode[1]];
     804             :     }
     805             :   }
     806             : }
     807             : #endif  // CONFIG_FILTER_INTRA
     808             : 
     809             : #if CONFIG_EXT_INTRA
     810           0 : static void read_intra_angle_info(AV1_COMMON *const cm, MACROBLOCKD *const xd,
     811             :                                   aom_reader *r) {
     812           0 :   MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
     813           0 :   const BLOCK_SIZE bsize = mbmi->sb_type;
     814             : #if CONFIG_INTRA_INTERP
     815             : #if CONFIG_EC_ADAPT
     816             :   FRAME_CONTEXT *const ec_ctx = xd->tile_ctx;
     817             : #else
     818             :   FRAME_CONTEXT *const ec_ctx = cm->fc;
     819             : #endif  // CONFIG_EC_ADAPT
     820             :   const int ctx = av1_get_pred_context_intra_interp(xd);
     821             :   int p_angle;
     822             : #endif  // CONFIG_INTRA_INTERP
     823             : 
     824             :   (void)cm;
     825           0 :   if (bsize < BLOCK_8X8) return;
     826             : 
     827           0 :   if (av1_is_directional_mode(mbmi->mode, bsize)) {
     828           0 :     mbmi->angle_delta[0] =
     829           0 :         read_uniform(r, 2 * MAX_ANGLE_DELTA + 1) - MAX_ANGLE_DELTA;
     830             : #if CONFIG_INTRA_INTERP
     831             :     p_angle = mode_to_angle_map[mbmi->mode] + mbmi->angle_delta[0] * ANGLE_STEP;
     832             :     if (av1_is_intra_filter_switchable(p_angle)) {
     833             :       FRAME_COUNTS *counts = xd->counts;
     834             :       mbmi->intra_filter = aom_read_symbol(r, ec_ctx->intra_filter_cdf[ctx],
     835             :                                            INTRA_FILTERS, ACCT_STR);
     836             :       if (counts) ++counts->intra_filter[ctx][mbmi->intra_filter];
     837             :     } else {
     838             :       mbmi->intra_filter = INTRA_FILTER_LINEAR;
     839             :     }
     840             : #endif  // CONFIG_INTRA_INTERP
     841             :   }
     842             : 
     843           0 :   if (av1_is_directional_mode(mbmi->uv_mode, bsize)) {
     844           0 :     mbmi->angle_delta[1] =
     845           0 :         read_uniform(r, 2 * MAX_ANGLE_DELTA + 1) - MAX_ANGLE_DELTA;
     846             :   }
     847             : }
     848             : #endif  // CONFIG_EXT_INTRA
     849             : 
     850           0 : void av1_read_tx_type(const AV1_COMMON *const cm, MACROBLOCKD *xd,
     851             : #if CONFIG_SUPERTX
     852             :                       int supertx_enabled,
     853             : #endif
     854             : #if CONFIG_TXK_SEL
     855             :                       int block, int plane,
     856             : #endif
     857             :                       aom_reader *r) {
     858           0 :   MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi;
     859           0 :   const int inter_block = is_inter_block(mbmi);
     860             : #if CONFIG_VAR_TX
     861           0 :   const TX_SIZE tx_size = inter_block ? mbmi->min_tx_size : mbmi->tx_size;
     862             : #else
     863             :   const TX_SIZE tx_size = mbmi->tx_size;
     864             : #endif
     865             : #if CONFIG_EC_ADAPT
     866           0 :   FRAME_CONTEXT *ec_ctx = xd->tile_ctx;
     867             : #else
     868             :   FRAME_CONTEXT *ec_ctx = cm->fc;
     869             : #endif
     870             : 
     871             : #if !CONFIG_TXK_SEL
     872           0 :   TX_TYPE *tx_type = &mbmi->tx_type;
     873             : #else
     874             :   // only y plane's tx_type is transmitted
     875             :   if (plane > 0) return;
     876             :   TX_TYPE *tx_type = &mbmi->txk_type[block];
     877             : #endif
     878             : 
     879             :   if (!FIXED_TX_TYPE) {
     880             : #if CONFIG_EXT_TX
     881           0 :     const TX_SIZE square_tx_size = txsize_sqr_map[tx_size];
     882           0 :     if (get_ext_tx_types(tx_size, mbmi->sb_type, inter_block,
     883           0 :                          cm->reduced_tx_set_used) > 1 &&
     884           0 :         ((!cm->seg.enabled && cm->base_qindex > 0) ||
     885           0 :          (cm->seg.enabled && xd->qindex[mbmi->segment_id] > 0)) &&
     886           0 :         !mbmi->skip &&
     887             : #if CONFIG_SUPERTX
     888             :         !supertx_enabled &&
     889             : #endif  // CONFIG_SUPERTX
     890           0 :         !segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP)) {
     891           0 :       const int eset = get_ext_tx_set(tx_size, mbmi->sb_type, inter_block,
     892             :                                       cm->reduced_tx_set_used);
     893           0 :       FRAME_COUNTS *counts = xd->counts;
     894             : 
     895           0 :       if (inter_block) {
     896           0 :         if (eset > 0) {
     897           0 :           *tx_type = av1_ext_tx_inter_inv[eset][aom_read_symbol(
     898             :               r, ec_ctx->inter_ext_tx_cdf[eset][square_tx_size],
     899             :               ext_tx_cnt_inter[eset], ACCT_STR)];
     900           0 :           if (counts) ++counts->inter_ext_tx[eset][square_tx_size][*tx_type];
     901             :         }
     902             :       } else if (ALLOW_INTRA_EXT_TX) {
     903           0 :         if (eset > 0) {
     904           0 :           *tx_type = av1_ext_tx_intra_inv[eset][aom_read_symbol(
     905             :               r, ec_ctx->intra_ext_tx_cdf[eset][square_tx_size][mbmi->mode],
     906             :               ext_tx_cnt_intra[eset], ACCT_STR)];
     907           0 :           if (counts)
     908           0 :             ++counts->intra_ext_tx[eset][square_tx_size][mbmi->mode][*tx_type];
     909             :         }
     910             :       }
     911             :     } else {
     912           0 :       *tx_type = DCT_DCT;
     913             :     }
     914             : #else
     915             : 
     916             :     if (tx_size < TX_32X32 &&
     917             :         ((!cm->seg.enabled && cm->base_qindex > 0) ||
     918             :          (cm->seg.enabled && xd->qindex[mbmi->segment_id] > 0)) &&
     919             :         !mbmi->skip &&
     920             : #if CONFIG_SUPERTX
     921             :         !supertx_enabled &&
     922             : #endif  // CONFIG_SUPERTX
     923             :         !segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP)) {
     924             :       FRAME_COUNTS *counts = xd->counts;
     925             : 
     926             :       if (inter_block) {
     927             :         *tx_type = av1_ext_tx_inv[aom_read_symbol(
     928             :             r, ec_ctx->inter_ext_tx_cdf[tx_size], TX_TYPES, ACCT_STR)];
     929             :         if (counts) ++counts->inter_ext_tx[tx_size][*tx_type];
     930             :       } else {
     931             :         const TX_TYPE tx_type_nom = intra_mode_to_tx_type_context[mbmi->mode];
     932             :         *tx_type = av1_ext_tx_inv[aom_read_symbol(
     933             :             r, ec_ctx->intra_ext_tx_cdf[tx_size][tx_type_nom], TX_TYPES,
     934             :             ACCT_STR)];
     935             :         if (counts) ++counts->intra_ext_tx[tx_size][tx_type_nom][*tx_type];
     936             :       }
     937             :     } else {
     938             :       *tx_type = DCT_DCT;
     939             :     }
     940             : #endif  // CONFIG_EXT_TX
     941             :   }
     942           0 : }
     943             : 
     944             : #if CONFIG_INTRABC
     945             : static INLINE void read_mv(aom_reader *r, MV *mv, const MV *ref,
     946             :                            nmv_context *ctx, nmv_context_counts *counts,
     947             :                            int allow_hp);
     948             : 
     949             : static INLINE int is_mv_valid(const MV *mv);
     950             : 
     951             : static INLINE int assign_dv(AV1_COMMON *cm, MACROBLOCKD *xd, int_mv *mv,
     952             :                             const int_mv *ref_mv, int mi_row, int mi_col,
     953             :                             BLOCK_SIZE bsize, aom_reader *r) {
     954             : #if CONFIG_EC_ADAPT
     955             :   FRAME_CONTEXT *ec_ctx = xd->tile_ctx;
     956             :   (void)cm;
     957             : #else
     958             :   FRAME_CONTEXT *ec_ctx = cm->fc;
     959             : #endif
     960             :   FRAME_COUNTS *counts = xd->counts;
     961             :   nmv_context_counts *const dv_counts = counts ? &counts->dv : NULL;
     962             :   read_mv(r, &mv->as_mv, &ref_mv->as_mv, &ec_ctx->ndvc, dv_counts, 0);
     963             :   int valid = is_mv_valid(&mv->as_mv) &&
     964             :               is_dv_valid(mv->as_mv, &xd->tile, mi_row, mi_col, bsize);
     965             :   return valid;
     966             : }
     967             : #endif  // CONFIG_INTRABC
     968             : 
     969           0 : static void read_intra_frame_mode_info(AV1_COMMON *const cm,
     970             :                                        MACROBLOCKD *const xd, int mi_row,
     971             :                                        int mi_col, aom_reader *r) {
     972           0 :   MODE_INFO *const mi = xd->mi[0];
     973           0 :   MB_MODE_INFO *const mbmi = &mi->mbmi;
     974           0 :   const MODE_INFO *above_mi = xd->above_mi;
     975           0 :   const MODE_INFO *left_mi = xd->left_mi;
     976           0 :   const BLOCK_SIZE bsize = mbmi->sb_type;
     977             :   int i;
     978           0 :   const int mi_offset = mi_row * cm->mi_cols + mi_col;
     979           0 :   const int bw = mi_size_wide[bsize];
     980           0 :   const int bh = mi_size_high[bsize];
     981             : 
     982             :   // TODO(slavarnway): move x_mis, y_mis into xd ?????
     983           0 :   const int x_mis = AOMMIN(cm->mi_cols - mi_col, bw);
     984           0 :   const int y_mis = AOMMIN(cm->mi_rows - mi_row, bh);
     985             : #if CONFIG_EC_ADAPT
     986           0 :   FRAME_CONTEXT *ec_ctx = xd->tile_ctx;
     987             : #else
     988             :   FRAME_CONTEXT *ec_ctx = cm->fc;
     989             : #endif
     990             : 
     991           0 :   mbmi->segment_id = read_intra_segment_id(cm, xd, mi_offset, x_mis, y_mis, r);
     992           0 :   mbmi->skip = read_skip(cm, xd, mbmi->segment_id, r);
     993             : 
     994             : #if CONFIG_DELTA_Q
     995           0 :   if (cm->delta_q_present_flag) {
     996           0 :     xd->current_qindex =
     997           0 :         xd->prev_qindex +
     998           0 :         read_delta_qindex(cm, xd, r, mbmi, mi_col, mi_row) * cm->delta_q_res;
     999             :     /* Normative: Clamp to [1,MAXQ] to not interfere with lossless mode */
    1000           0 :     xd->current_qindex = clamp(xd->current_qindex, 1, MAXQ);
    1001           0 :     xd->prev_qindex = xd->current_qindex;
    1002             : #if CONFIG_EXT_DELTA_Q
    1003           0 :     if (cm->delta_lf_present_flag) {
    1004           0 :       mbmi->current_delta_lf_from_base = xd->current_delta_lf_from_base =
    1005           0 :           xd->prev_delta_lf_from_base +
    1006           0 :           read_delta_lflevel(cm, xd, r, mbmi, mi_col, mi_row) *
    1007           0 :               cm->delta_lf_res;
    1008           0 :       xd->prev_delta_lf_from_base = xd->current_delta_lf_from_base;
    1009             :     }
    1010             : #endif
    1011             :   }
    1012             : #endif
    1013             : 
    1014           0 :   mbmi->ref_frame[0] = INTRA_FRAME;
    1015           0 :   mbmi->ref_frame[1] = NONE_FRAME;
    1016           0 :   mbmi->tx_size = read_tx_size(cm, xd, 0, 1, r);
    1017             : 
    1018             : #if CONFIG_INTRABC
    1019             :   if (bsize >= BLOCK_8X8 && cm->allow_screen_content_tools) {
    1020             :     mbmi->use_intrabc = aom_read(r, ec_ctx->intrabc_prob, ACCT_STR);
    1021             :     if (mbmi->use_intrabc) {
    1022             :       mbmi->mode = mbmi->uv_mode = DC_PRED;
    1023             : #if CONFIG_DUAL_FILTER
    1024             :       for (int idx = 0; idx < 4; ++idx) mbmi->interp_filter[idx] = BILINEAR;
    1025             : #else
    1026             :       mbmi->interp_filter = BILINEAR;
    1027             : #endif
    1028             : 
    1029             :       int16_t inter_mode_ctx[MODE_CTX_REF_FRAMES];
    1030             :       int_mv ref_mvs[MAX_MV_REF_CANDIDATES] = {};
    1031             : 
    1032             :       av1_find_mv_refs(cm, xd, mi, INTRA_FRAME, &xd->ref_mv_count[INTRA_FRAME],
    1033             :                        xd->ref_mv_stack[INTRA_FRAME],
    1034             : #if CONFIG_EXT_INTER
    1035             :                        NULL,
    1036             : #endif  // CONFIG_EXT_INTER
    1037             :                        ref_mvs, mi_row, mi_col, NULL, NULL, inter_mode_ctx);
    1038             : 
    1039             :       int_mv nearestmv, nearmv;
    1040             :       av1_find_best_ref_mvs(0, ref_mvs, &nearestmv, &nearmv);
    1041             : 
    1042             :       int_mv dv_ref = nearestmv.as_int == 0 ? nearmv : nearestmv;
    1043             :       if (dv_ref.as_int == 0) av1_find_ref_dv(&dv_ref, mi_row, mi_col);
    1044             : 
    1045             :       xd->corrupted |=
    1046             :           !assign_dv(cm, xd, &mbmi->mv[0], &dv_ref, mi_row, mi_col, bsize, r);
    1047             : #if CONFIG_VAR_TX
    1048             :       // TODO(aconverse@google.com): Evaluate allowing VAR TX on intrabc blocks
    1049             :       const int width = block_size_wide[bsize] >> tx_size_wide_log2[0];
    1050             :       const int height = block_size_high[bsize] >> tx_size_high_log2[0];
    1051             :       int idx, idy;
    1052             :       for (idy = 0; idy < height; ++idy)
    1053             :         for (idx = 0; idx < width; ++idx)
    1054             :           mbmi->inter_tx_size[idy >> 1][idx >> 1] = mbmi->tx_size;
    1055             :       mbmi->min_tx_size = get_min_tx_size(mbmi->tx_size);
    1056             : #endif  // CONFIG_VAR_TX
    1057             : #if CONFIG_EXT_TX && !CONFIG_TXK_SEL
    1058             :       av1_read_tx_type(cm, xd,
    1059             : #if CONFIG_SUPERTX
    1060             :                        0,
    1061             : #endif
    1062             :                        r);
    1063             : #endif  // CONFIG_EXT_TX && !CONFIG_TXK_SEL
    1064             :       return;
    1065             :     }
    1066             :   }
    1067             : #endif  // CONFIG_INTRABC
    1068             : 
    1069             : #if CONFIG_CB4X4
    1070             :   (void)i;
    1071           0 :   mbmi->mode =
    1072           0 :       read_intra_mode(r, get_y_mode_cdf(ec_ctx, mi, above_mi, left_mi, 0));
    1073             : #else
    1074             :   switch (bsize) {
    1075             :     case BLOCK_4X4:
    1076             :       for (i = 0; i < 4; ++i)
    1077             :         mi->bmi[i].as_mode = read_intra_mode(
    1078             :             r, get_y_mode_cdf(ec_ctx, mi, above_mi, left_mi, i));
    1079             :       mbmi->mode = mi->bmi[3].as_mode;
    1080             :       break;
    1081             :     case BLOCK_4X8:
    1082             :       mi->bmi[0].as_mode = mi->bmi[2].as_mode =
    1083             :           read_intra_mode(r, get_y_mode_cdf(ec_ctx, mi, above_mi, left_mi, 0));
    1084             :       mi->bmi[1].as_mode = mi->bmi[3].as_mode = mbmi->mode =
    1085             :           read_intra_mode(r, get_y_mode_cdf(ec_ctx, mi, above_mi, left_mi, 1));
    1086             :       break;
    1087             :     case BLOCK_8X4:
    1088             :       mi->bmi[0].as_mode = mi->bmi[1].as_mode =
    1089             :           read_intra_mode(r, get_y_mode_cdf(ec_ctx, mi, above_mi, left_mi, 0));
    1090             :       mi->bmi[2].as_mode = mi->bmi[3].as_mode = mbmi->mode =
    1091             :           read_intra_mode(r, get_y_mode_cdf(ec_ctx, mi, above_mi, left_mi, 2));
    1092             :       break;
    1093             :     default:
    1094             :       mbmi->mode =
    1095             :           read_intra_mode(r, get_y_mode_cdf(ec_ctx, mi, above_mi, left_mi, 0));
    1096             :   }
    1097             : #endif
    1098             : 
    1099             : #if CONFIG_CB4X4
    1100           0 :   if (is_chroma_reference(mi_row, mi_col, bsize, xd->plane[1].subsampling_x,
    1101             :                           xd->plane[1].subsampling_y)) {
    1102           0 :     mbmi->uv_mode = read_intra_mode_uv(ec_ctx, xd, r, mbmi->mode);
    1103             : #else
    1104             :   mbmi->uv_mode = read_intra_mode_uv(ec_ctx, xd, r, mbmi->mode);
    1105             : #endif
    1106             : 
    1107             : #if CONFIG_CFL
    1108             :     // TODO(ltrudeau) support PALETTE
    1109             :     if (mbmi->uv_mode == DC_PRED) {
    1110             :       mbmi->cfl_alpha_idx =
    1111             :           read_cfl_alphas(ec_ctx, r, mbmi->skip, mbmi->cfl_alpha_signs);
    1112             :     }
    1113             : #endif  // CONFIG_CFL
    1114             : 
    1115             : #if CONFIG_CB4X4
    1116             :   }
    1117             : #endif
    1118             : 
    1119             : #if CONFIG_EXT_INTRA
    1120           0 :   read_intra_angle_info(cm, xd, r);
    1121             : #endif  // CONFIG_EXT_INTRA
    1122             : #if CONFIG_PALETTE
    1123           0 :   mbmi->palette_mode_info.palette_size[0] = 0;
    1124           0 :   mbmi->palette_mode_info.palette_size[1] = 0;
    1125           0 :   if (bsize >= BLOCK_8X8 && cm->allow_screen_content_tools)
    1126           0 :     read_palette_mode_info(cm, xd, r);
    1127             : #endif  // CONFIG_PALETTE
    1128             : #if CONFIG_FILTER_INTRA
    1129             :   mbmi->filter_intra_mode_info.use_filter_intra_mode[0] = 0;
    1130             :   mbmi->filter_intra_mode_info.use_filter_intra_mode[1] = 0;
    1131             :   if (bsize >= BLOCK_8X8 || CONFIG_CB4X4)
    1132             :     read_filter_intra_mode_info(cm, xd, mi_row, mi_col, r);
    1133             : #endif  // CONFIG_FILTER_INTRA
    1134             : 
    1135             : #if !CONFIG_TXK_SEL
    1136           0 :   av1_read_tx_type(cm, xd,
    1137             : #if CONFIG_SUPERTX
    1138             :                    0,
    1139             : #endif
    1140             :                    r);
    1141             : #endif  // !CONFIG_TXK_SEL
    1142           0 : }
    1143             : 
    1144           0 : static int read_mv_component(aom_reader *r, nmv_component *mvcomp, int usehp) {
    1145             :   int mag, d, fr, hp;
    1146           0 :   const int sign = aom_read(r, mvcomp->sign, ACCT_STR);
    1147           0 :   const int mv_class =
    1148           0 :       aom_read_symbol(r, mvcomp->class_cdf, MV_CLASSES, ACCT_STR);
    1149           0 :   const int class0 = mv_class == MV_CLASS_0;
    1150             : 
    1151             :   // Integer part
    1152           0 :   if (class0) {
    1153           0 :     d = aom_read(r, mvcomp->class0[0], ACCT_STR);
    1154           0 :     mag = 0;
    1155             :   } else {
    1156             :     int i;
    1157           0 :     const int n = mv_class + CLASS0_BITS - 1;  // number of bits
    1158             : 
    1159           0 :     d = 0;
    1160           0 :     for (i = 0; i < n; ++i) d |= aom_read(r, mvcomp->bits[i], ACCT_STR) << i;
    1161           0 :     mag = CLASS0_SIZE << (mv_class + 2);
    1162             :   }
    1163             : 
    1164             :   // Fractional part
    1165           0 :   fr = aom_read_symbol(r, class0 ? mvcomp->class0_fp_cdf[d] : mvcomp->fp_cdf,
    1166             :                        MV_FP_SIZE, ACCT_STR);
    1167             : 
    1168             :   // High precision part (if hp is not used, the default value of the hp is 1)
    1169           0 :   hp = usehp ? aom_read(r, class0 ? mvcomp->class0_hp : mvcomp->hp, ACCT_STR)
    1170           0 :              : 1;
    1171             : 
    1172             :   // Result
    1173           0 :   mag += ((d << 3) | (fr << 1) | hp) + 1;
    1174           0 :   return sign ? -mag : mag;
    1175             : }
    1176             : 
    1177           0 : static INLINE void read_mv(aom_reader *r, MV *mv, const MV *ref,
    1178             :                            nmv_context *ctx, nmv_context_counts *counts,
    1179             :                            int allow_hp) {
    1180             :   MV_JOINT_TYPE joint_type;
    1181           0 :   MV diff = { 0, 0 };
    1182           0 :   joint_type =
    1183           0 :       (MV_JOINT_TYPE)aom_read_symbol(r, ctx->joint_cdf, MV_JOINTS, ACCT_STR);
    1184             : 
    1185           0 :   if (mv_joint_vertical(joint_type))
    1186           0 :     diff.row = read_mv_component(r, &ctx->comps[0], allow_hp);
    1187             : 
    1188           0 :   if (mv_joint_horizontal(joint_type))
    1189           0 :     diff.col = read_mv_component(r, &ctx->comps[1], allow_hp);
    1190             : 
    1191           0 :   av1_inc_mv(&diff, counts, allow_hp);
    1192             : 
    1193           0 :   mv->row = ref->row + diff.row;
    1194           0 :   mv->col = ref->col + diff.col;
    1195           0 : }
    1196             : 
    1197           0 : static REFERENCE_MODE read_block_reference_mode(AV1_COMMON *cm,
    1198             :                                                 const MACROBLOCKD *xd,
    1199             :                                                 aom_reader *r) {
    1200             : #if !SUB8X8_COMP_REF
    1201           0 :   if (xd->mi[0]->mbmi.sb_type == BLOCK_4X4) return SINGLE_REFERENCE;
    1202             : #endif
    1203           0 :   if (cm->reference_mode == REFERENCE_MODE_SELECT) {
    1204           0 :     const int ctx = av1_get_reference_mode_context(cm, xd);
    1205           0 :     const REFERENCE_MODE mode =
    1206           0 :         (REFERENCE_MODE)aom_read(r, cm->fc->comp_inter_prob[ctx], ACCT_STR);
    1207           0 :     FRAME_COUNTS *counts = xd->counts;
    1208           0 :     if (counts) ++counts->comp_inter[ctx][mode];
    1209           0 :     return mode;  // SINGLE_REFERENCE or COMPOUND_REFERENCE
    1210             :   } else {
    1211           0 :     return cm->reference_mode;
    1212             :   }
    1213             : }
    1214             : 
    1215             : // Read the referncence frame
    1216           0 : static void read_ref_frames(AV1_COMMON *const cm, MACROBLOCKD *const xd,
    1217             :                             aom_reader *r, int segment_id,
    1218             :                             MV_REFERENCE_FRAME ref_frame[2]) {
    1219           0 :   FRAME_CONTEXT *const fc = cm->fc;
    1220           0 :   FRAME_COUNTS *counts = xd->counts;
    1221             : 
    1222           0 :   if (segfeature_active(&cm->seg, segment_id, SEG_LVL_REF_FRAME)) {
    1223           0 :     ref_frame[0] = (MV_REFERENCE_FRAME)get_segdata(&cm->seg, segment_id,
    1224             :                                                    SEG_LVL_REF_FRAME);
    1225           0 :     ref_frame[1] = NONE_FRAME;
    1226             :   } else {
    1227           0 :     const REFERENCE_MODE mode = read_block_reference_mode(cm, xd, r);
    1228             :     // FIXME(rbultje) I'm pretty sure this breaks segmentation ref frame coding
    1229           0 :     if (mode == COMPOUND_REFERENCE) {
    1230             : #if CONFIG_ONE_SIDED_COMPOUND  // Normative in decoder (for low delay)
    1231           0 :       const int idx = 1;
    1232             : #else
    1233             : #if CONFIG_EXT_REFS
    1234             :       const int idx = cm->ref_frame_sign_bias[cm->comp_bwd_ref[0]];
    1235             : #else
    1236             :       const int idx = cm->ref_frame_sign_bias[cm->comp_fixed_ref];
    1237             : #endif  // CONFIG_EXT_REFS
    1238             : #endif
    1239           0 :       const int ctx = av1_get_pred_context_comp_ref_p(cm, xd);
    1240             : 
    1241           0 :       const int bit = aom_read(r, fc->comp_ref_prob[ctx][0], ACCT_STR);
    1242           0 :       if (counts) ++counts->comp_ref[ctx][0][bit];
    1243             : 
    1244             : #if CONFIG_EXT_REFS
    1245             :       // Decode forward references.
    1246           0 :       if (!bit) {
    1247           0 :         const int ctx1 = av1_get_pred_context_comp_ref_p1(cm, xd);
    1248           0 :         const int bit1 = aom_read(r, fc->comp_ref_prob[ctx1][1], ACCT_STR);
    1249           0 :         if (counts) ++counts->comp_ref[ctx1][1][bit1];
    1250           0 :         ref_frame[!idx] = cm->comp_fwd_ref[bit1 ? 0 : 1];
    1251             :       } else {
    1252           0 :         const int ctx2 = av1_get_pred_context_comp_ref_p2(cm, xd);
    1253           0 :         const int bit2 = aom_read(r, fc->comp_ref_prob[ctx2][2], ACCT_STR);
    1254           0 :         if (counts) ++counts->comp_ref[ctx2][2][bit2];
    1255           0 :         ref_frame[!idx] = cm->comp_fwd_ref[bit2 ? 3 : 2];
    1256             :       }
    1257             : 
    1258             :       // Decode backward references.
    1259             :       {
    1260           0 :         const int ctx_bwd = av1_get_pred_context_comp_bwdref_p(cm, xd);
    1261           0 :         const int bit_bwd =
    1262           0 :             aom_read(r, fc->comp_bwdref_prob[ctx_bwd][0], ACCT_STR);
    1263           0 :         if (counts) ++counts->comp_bwdref[ctx_bwd][0][bit_bwd];
    1264           0 :         ref_frame[idx] = cm->comp_bwd_ref[bit_bwd];
    1265             :       }
    1266             : #else
    1267             :       ref_frame[!idx] = cm->comp_var_ref[bit];
    1268             :       ref_frame[idx] = cm->comp_fixed_ref;
    1269             : #endif  // CONFIG_EXT_REFS
    1270           0 :     } else if (mode == SINGLE_REFERENCE) {
    1271             : #if CONFIG_EXT_REFS
    1272           0 :       const int ctx0 = av1_get_pred_context_single_ref_p1(xd);
    1273           0 :       const int bit0 = aom_read(r, fc->single_ref_prob[ctx0][0], ACCT_STR);
    1274           0 :       if (counts) ++counts->single_ref[ctx0][0][bit0];
    1275             : 
    1276           0 :       if (bit0) {
    1277           0 :         const int ctx1 = av1_get_pred_context_single_ref_p2(xd);
    1278           0 :         const int bit1 = aom_read(r, fc->single_ref_prob[ctx1][1], ACCT_STR);
    1279           0 :         if (counts) ++counts->single_ref[ctx1][1][bit1];
    1280           0 :         ref_frame[0] = bit1 ? ALTREF_FRAME : BWDREF_FRAME;
    1281             :       } else {
    1282           0 :         const int ctx2 = av1_get_pred_context_single_ref_p3(xd);
    1283           0 :         const int bit2 = aom_read(r, fc->single_ref_prob[ctx2][2], ACCT_STR);
    1284           0 :         if (counts) ++counts->single_ref[ctx2][2][bit2];
    1285           0 :         if (bit2) {
    1286           0 :           const int ctx4 = av1_get_pred_context_single_ref_p5(xd);
    1287           0 :           const int bit4 = aom_read(r, fc->single_ref_prob[ctx4][4], ACCT_STR);
    1288           0 :           if (counts) ++counts->single_ref[ctx4][4][bit4];
    1289           0 :           ref_frame[0] = bit4 ? GOLDEN_FRAME : LAST3_FRAME;
    1290             :         } else {
    1291           0 :           const int ctx3 = av1_get_pred_context_single_ref_p4(xd);
    1292           0 :           const int bit3 = aom_read(r, fc->single_ref_prob[ctx3][3], ACCT_STR);
    1293           0 :           if (counts) ++counts->single_ref[ctx3][3][bit3];
    1294           0 :           ref_frame[0] = bit3 ? LAST2_FRAME : LAST_FRAME;
    1295             :         }
    1296             :       }
    1297             : #else
    1298             :       const int ctx0 = av1_get_pred_context_single_ref_p1(xd);
    1299             :       const int bit0 = aom_read(r, fc->single_ref_prob[ctx0][0], ACCT_STR);
    1300             :       if (counts) ++counts->single_ref[ctx0][0][bit0];
    1301             : 
    1302             :       if (bit0) {
    1303             :         const int ctx1 = av1_get_pred_context_single_ref_p2(xd);
    1304             :         const int bit1 = aom_read(r, fc->single_ref_prob[ctx1][1], ACCT_STR);
    1305             :         if (counts) ++counts->single_ref[ctx1][1][bit1];
    1306             :         ref_frame[0] = bit1 ? ALTREF_FRAME : GOLDEN_FRAME;
    1307             :       } else {
    1308             :         ref_frame[0] = LAST_FRAME;
    1309             :       }
    1310             : #endif  // CONFIG_EXT_REFS
    1311             : 
    1312           0 :       ref_frame[1] = NONE_FRAME;
    1313             :     } else {
    1314           0 :       assert(0 && "Invalid prediction mode.");
    1315             :     }
    1316             :   }
    1317           0 : }
    1318             : 
    1319           0 : static INLINE void read_mb_interp_filter(AV1_COMMON *const cm,
    1320             :                                          MACROBLOCKD *const xd,
    1321             :                                          MB_MODE_INFO *const mbmi,
    1322             :                                          aom_reader *r) {
    1323           0 :   FRAME_COUNTS *counts = xd->counts;
    1324             : #if CONFIG_EC_ADAPT
    1325           0 :   FRAME_CONTEXT *ec_ctx = xd->tile_ctx;
    1326             : #else
    1327             :   FRAME_CONTEXT *ec_ctx = cm->fc;
    1328             : #endif
    1329             : 
    1330           0 :   if (!av1_is_interp_needed(xd)) {
    1331           0 :     set_default_interp_filters(mbmi, cm->interp_filter);
    1332           0 :     return;
    1333             :   }
    1334             : 
    1335             : #if CONFIG_DUAL_FILTER
    1336           0 :   if (cm->interp_filter != SWITCHABLE) {
    1337             :     int dir;
    1338             : 
    1339           0 :     for (dir = 0; dir < 4; ++dir) mbmi->interp_filter[dir] = cm->interp_filter;
    1340             :   } else {
    1341             :     int dir;
    1342             : 
    1343           0 :     for (dir = 0; dir < 2; ++dir) {
    1344           0 :       const int ctx = av1_get_pred_context_switchable_interp(xd, dir);
    1345           0 :       mbmi->interp_filter[dir] = EIGHTTAP_REGULAR;
    1346             : 
    1347           0 :       if (has_subpel_mv_component(xd->mi[0], xd, dir) ||
    1348           0 :           (mbmi->ref_frame[1] > INTRA_FRAME &&
    1349           0 :            has_subpel_mv_component(xd->mi[0], xd, dir + 2))) {
    1350           0 :         mbmi->interp_filter[dir] =
    1351           0 :             (InterpFilter)av1_switchable_interp_inv[aom_read_symbol(
    1352             :                 r, ec_ctx->switchable_interp_cdf[ctx], SWITCHABLE_FILTERS,
    1353             :                 ACCT_STR)];
    1354           0 :         if (counts) ++counts->switchable_interp[ctx][mbmi->interp_filter[dir]];
    1355             :       }
    1356             :     }
    1357             :     // The index system works as:
    1358             :     // (0, 1) -> (vertical, horizontal) filter types for the first ref frame.
    1359             :     // (2, 3) -> (vertical, horizontal) filter types for the second ref frame.
    1360           0 :     mbmi->interp_filter[2] = mbmi->interp_filter[0];
    1361           0 :     mbmi->interp_filter[3] = mbmi->interp_filter[1];
    1362             :   }
    1363             : #else   // CONFIG_DUAL_FILTER
    1364             :   if (cm->interp_filter != SWITCHABLE) {
    1365             :     mbmi->interp_filter = cm->interp_filter;
    1366             :   } else {
    1367             :     const int ctx = av1_get_pred_context_switchable_interp(xd);
    1368             :     mbmi->interp_filter =
    1369             :         (InterpFilter)av1_switchable_interp_inv[aom_read_symbol(
    1370             :             r, ec_ctx->switchable_interp_cdf[ctx], SWITCHABLE_FILTERS,
    1371             :             ACCT_STR)];
    1372             :     if (counts) ++counts->switchable_interp[ctx][mbmi->interp_filter];
    1373             :   }
    1374             : #endif  // CONFIG_DUAL_FILTER
    1375             : }
    1376             : 
    1377           0 : static void read_intra_block_mode_info(AV1_COMMON *const cm, const int mi_row,
    1378             :                                        const int mi_col, MACROBLOCKD *const xd,
    1379             :                                        MODE_INFO *mi, aom_reader *r) {
    1380           0 :   MB_MODE_INFO *const mbmi = &mi->mbmi;
    1381           0 :   const BLOCK_SIZE bsize = mi->mbmi.sb_type;
    1382             :   int i;
    1383             : 
    1384           0 :   mbmi->ref_frame[0] = INTRA_FRAME;
    1385           0 :   mbmi->ref_frame[1] = NONE_FRAME;
    1386             : 
    1387             : #if CONFIG_EC_ADAPT
    1388           0 :   FRAME_CONTEXT *ec_ctx = xd->tile_ctx;
    1389             : #else
    1390             :   FRAME_CONTEXT *ec_ctx = cm->fc;
    1391             : #endif
    1392             : 
    1393             : #if CONFIG_CB4X4
    1394             :   (void)i;
    1395           0 :   mbmi->mode = read_intra_mode_y(ec_ctx, xd, r, size_group_lookup[bsize]);
    1396             : #else
    1397             :   switch (bsize) {
    1398             :     case BLOCK_4X4:
    1399             :       for (i = 0; i < 4; ++i)
    1400             :         mi->bmi[i].as_mode = read_intra_mode_y(ec_ctx, xd, r, 0);
    1401             :       mbmi->mode = mi->bmi[3].as_mode;
    1402             :       break;
    1403             :     case BLOCK_4X8:
    1404             :       mi->bmi[0].as_mode = mi->bmi[2].as_mode =
    1405             :           read_intra_mode_y(ec_ctx, xd, r, 0);
    1406             :       mi->bmi[1].as_mode = mi->bmi[3].as_mode = mbmi->mode =
    1407             :           read_intra_mode_y(ec_ctx, xd, r, 0);
    1408             :       break;
    1409             :     case BLOCK_8X4:
    1410             :       mi->bmi[0].as_mode = mi->bmi[1].as_mode =
    1411             :           read_intra_mode_y(ec_ctx, xd, r, 0);
    1412             :       mi->bmi[2].as_mode = mi->bmi[3].as_mode = mbmi->mode =
    1413             :           read_intra_mode_y(ec_ctx, xd, r, 0);
    1414             :       break;
    1415             :     default:
    1416             :       mbmi->mode = read_intra_mode_y(ec_ctx, xd, r, size_group_lookup[bsize]);
    1417             :   }
    1418             : #endif
    1419             : 
    1420             : #if CONFIG_CB4X4
    1421           0 :   if (is_chroma_reference(mi_row, mi_col, bsize, xd->plane[1].subsampling_x,
    1422             :                           xd->plane[1].subsampling_y)) {
    1423           0 :     mbmi->uv_mode = read_intra_mode_uv(ec_ctx, xd, r, mbmi->mode);
    1424             : #else
    1425             :   mbmi->uv_mode = read_intra_mode_uv(ec_ctx, xd, r, mbmi->mode);
    1426             :   (void)mi_row;
    1427             :   (void)mi_col;
    1428             : #endif
    1429             : 
    1430             : #if CONFIG_CFL
    1431             :     // TODO(ltrudeau) support PALETTE
    1432             :     if (mbmi->uv_mode == DC_PRED) {
    1433             :       mbmi->cfl_alpha_idx = read_cfl_alphas(
    1434             : #if CONFIG_EC_ADAPT
    1435             :           xd->tile_ctx,
    1436             : #else
    1437             :           cm->fc,
    1438             : #endif  // CONFIG_EC_ADAPT
    1439             :           r, mbmi->skip, mbmi->cfl_alpha_signs);
    1440             :     }
    1441             : #endif  // CONFIG_CFL
    1442             : 
    1443             : #if CONFIG_CB4X4
    1444             :   }
    1445             : #endif
    1446             : 
    1447             : #if CONFIG_EXT_INTRA
    1448           0 :   read_intra_angle_info(cm, xd, r);
    1449             : #endif  // CONFIG_EXT_INTRA
    1450             : #if CONFIG_PALETTE
    1451           0 :   mbmi->palette_mode_info.palette_size[0] = 0;
    1452           0 :   mbmi->palette_mode_info.palette_size[1] = 0;
    1453           0 :   if (bsize >= BLOCK_8X8 && cm->allow_screen_content_tools)
    1454           0 :     read_palette_mode_info(cm, xd, r);
    1455             : #endif  // CONFIG_PALETTE
    1456             : #if CONFIG_FILTER_INTRA
    1457             :   mbmi->filter_intra_mode_info.use_filter_intra_mode[0] = 0;
    1458             :   mbmi->filter_intra_mode_info.use_filter_intra_mode[1] = 0;
    1459             :   if (bsize >= BLOCK_8X8 || CONFIG_CB4X4)
    1460             :     read_filter_intra_mode_info(cm, xd, mi_row, mi_col, r);
    1461             : #endif  // CONFIG_FILTER_INTRA
    1462           0 : }
    1463             : 
    1464           0 : static INLINE int is_mv_valid(const MV *mv) {
    1465           0 :   return mv->row > MV_LOW && mv->row < MV_UPP && mv->col > MV_LOW &&
    1466           0 :          mv->col < MV_UPP;
    1467             : }
    1468             : 
    1469           0 : static INLINE int assign_mv(AV1_COMMON *cm, MACROBLOCKD *xd,
    1470             :                             PREDICTION_MODE mode,
    1471             :                             MV_REFERENCE_FRAME ref_frame[2], int block,
    1472             :                             int_mv mv[2], int_mv ref_mv[2],
    1473             :                             int_mv nearest_mv[2], int_mv near_mv[2], int mi_row,
    1474             :                             int mi_col, int is_compound, int allow_hp,
    1475             :                             aom_reader *r) {
    1476             :   int i;
    1477           0 :   int ret = 1;
    1478             : #if CONFIG_EC_ADAPT
    1479           0 :   FRAME_CONTEXT *ec_ctx = xd->tile_ctx;
    1480             : #else
    1481             :   FRAME_CONTEXT *ec_ctx = cm->fc;
    1482             : #endif
    1483           0 :   BLOCK_SIZE bsize = xd->mi[0]->mbmi.sb_type;
    1484           0 :   MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi;
    1485             : #if CONFIG_CB4X4
    1486           0 :   int_mv *pred_mv = mbmi->pred_mv;
    1487             :   (void)block;
    1488             : #else
    1489             :   int_mv *pred_mv =
    1490             :       (bsize >= BLOCK_8X8) ? mbmi->pred_mv : xd->mi[0]->bmi[block].pred_mv;
    1491             : #endif  // CONFIG_CB4X4
    1492             :   (void)ref_frame;
    1493             :   (void)cm;
    1494             :   (void)mi_row;
    1495             :   (void)mi_col;
    1496             :   (void)bsize;
    1497             : 
    1498           0 :   switch (mode) {
    1499             :     case NEWMV: {
    1500           0 :       FRAME_COUNTS *counts = xd->counts;
    1501           0 :       for (i = 0; i < 1 + is_compound; ++i) {
    1502           0 :         int8_t rf_type = av1_ref_frame_type(mbmi->ref_frame);
    1503           0 :         int nmv_ctx =
    1504           0 :             av1_nmv_ctx(xd->ref_mv_count[rf_type], xd->ref_mv_stack[rf_type], i,
    1505           0 :                         mbmi->ref_mv_idx);
    1506           0 :         nmv_context *const nmvc = &ec_ctx->nmvc[nmv_ctx];
    1507           0 :         nmv_context_counts *const mv_counts =
    1508           0 :             counts ? &counts->mv[nmv_ctx] : NULL;
    1509           0 :         read_mv(r, &mv[i].as_mv, &ref_mv[i].as_mv, nmvc, mv_counts, allow_hp);
    1510           0 :         ret = ret && is_mv_valid(&mv[i].as_mv);
    1511             : 
    1512           0 :         pred_mv[i].as_int = ref_mv[i].as_int;
    1513             :       }
    1514           0 :       break;
    1515             :     }
    1516             :     case NEARESTMV: {
    1517           0 :       mv[0].as_int = nearest_mv[0].as_int;
    1518           0 :       if (is_compound) mv[1].as_int = nearest_mv[1].as_int;
    1519             : 
    1520           0 :       pred_mv[0].as_int = nearest_mv[0].as_int;
    1521           0 :       if (is_compound) pred_mv[1].as_int = nearest_mv[1].as_int;
    1522           0 :       break;
    1523             :     }
    1524             :     case NEARMV: {
    1525           0 :       mv[0].as_int = near_mv[0].as_int;
    1526           0 :       if (is_compound) mv[1].as_int = near_mv[1].as_int;
    1527             : 
    1528           0 :       pred_mv[0].as_int = near_mv[0].as_int;
    1529           0 :       if (is_compound) pred_mv[1].as_int = near_mv[1].as_int;
    1530           0 :       break;
    1531             :     }
    1532             :     case ZEROMV: {
    1533             : #if CONFIG_GLOBAL_MOTION
    1534           0 :       mv[0].as_int = gm_get_motion_vector(&cm->global_motion[ref_frame[0]],
    1535             :                                           cm->allow_high_precision_mv, bsize,
    1536             :                                           mi_col, mi_row, block)
    1537           0 :                          .as_int;
    1538           0 :       if (is_compound)
    1539           0 :         mv[1].as_int = gm_get_motion_vector(&cm->global_motion[ref_frame[1]],
    1540             :                                             cm->allow_high_precision_mv, bsize,
    1541             :                                             mi_col, mi_row, block)
    1542           0 :                            .as_int;
    1543             : #else
    1544             :       mv[0].as_int = 0;
    1545             :       if (is_compound) mv[1].as_int = 0;
    1546             : #endif  // CONFIG_GLOBAL_MOTION
    1547             : 
    1548           0 :       pred_mv[0].as_int = mv[0].as_int;
    1549           0 :       if (is_compound) pred_mv[1].as_int = mv[1].as_int;
    1550           0 :       break;
    1551             :     }
    1552             : #if CONFIG_EXT_INTER
    1553             :     case NEW_NEWMV: {
    1554           0 :       FRAME_COUNTS *counts = xd->counts;
    1555           0 :       assert(is_compound);
    1556           0 :       for (i = 0; i < 2; ++i) {
    1557           0 :         int8_t rf_type = av1_ref_frame_type(mbmi->ref_frame);
    1558           0 :         int nmv_ctx =
    1559           0 :             av1_nmv_ctx(xd->ref_mv_count[rf_type], xd->ref_mv_stack[rf_type], i,
    1560           0 :                         mbmi->ref_mv_idx);
    1561           0 :         nmv_context *const nmvc = &ec_ctx->nmvc[nmv_ctx];
    1562           0 :         nmv_context_counts *const mv_counts =
    1563           0 :             counts ? &counts->mv[nmv_ctx] : NULL;
    1564           0 :         read_mv(r, &mv[i].as_mv, &ref_mv[i].as_mv, nmvc, mv_counts, allow_hp);
    1565           0 :         ret = ret && is_mv_valid(&mv[i].as_mv);
    1566             :       }
    1567           0 :       break;
    1568             :     }
    1569             :     case NEAREST_NEARESTMV: {
    1570           0 :       assert(is_compound);
    1571           0 :       mv[0].as_int = nearest_mv[0].as_int;
    1572           0 :       mv[1].as_int = nearest_mv[1].as_int;
    1573           0 :       break;
    1574             :     }
    1575             :     case NEAR_NEARMV: {
    1576           0 :       assert(is_compound);
    1577           0 :       mv[0].as_int = near_mv[0].as_int;
    1578           0 :       mv[1].as_int = near_mv[1].as_int;
    1579           0 :       break;
    1580             :     }
    1581             :     case NEW_NEARESTMV: {
    1582           0 :       FRAME_COUNTS *counts = xd->counts;
    1583           0 :       int8_t rf_type = av1_ref_frame_type(mbmi->ref_frame);
    1584           0 :       int nmv_ctx = av1_nmv_ctx(xd->ref_mv_count[rf_type],
    1585           0 :                                 xd->ref_mv_stack[rf_type], 0, mbmi->ref_mv_idx);
    1586           0 :       nmv_context *const nmvc = &ec_ctx->nmvc[nmv_ctx];
    1587           0 :       nmv_context_counts *const mv_counts =
    1588           0 :           counts ? &counts->mv[nmv_ctx] : NULL;
    1589           0 :       read_mv(r, &mv[0].as_mv, &ref_mv[0].as_mv, nmvc, mv_counts, allow_hp);
    1590           0 :       assert(is_compound);
    1591           0 :       ret = ret && is_mv_valid(&mv[0].as_mv);
    1592           0 :       mv[1].as_int = nearest_mv[1].as_int;
    1593           0 :       break;
    1594             :     }
    1595             :     case NEAREST_NEWMV: {
    1596           0 :       FRAME_COUNTS *counts = xd->counts;
    1597           0 :       int8_t rf_type = av1_ref_frame_type(mbmi->ref_frame);
    1598           0 :       int nmv_ctx = av1_nmv_ctx(xd->ref_mv_count[rf_type],
    1599           0 :                                 xd->ref_mv_stack[rf_type], 1, mbmi->ref_mv_idx);
    1600           0 :       nmv_context_counts *const mv_counts =
    1601           0 :           counts ? &counts->mv[nmv_ctx] : NULL;
    1602           0 :       nmv_context *const nmvc = &ec_ctx->nmvc[nmv_ctx];
    1603           0 :       mv[0].as_int = nearest_mv[0].as_int;
    1604           0 :       read_mv(r, &mv[1].as_mv, &ref_mv[1].as_mv, nmvc, mv_counts, allow_hp);
    1605           0 :       assert(is_compound);
    1606           0 :       ret = ret && is_mv_valid(&mv[1].as_mv);
    1607           0 :       break;
    1608             :     }
    1609             :     case NEAR_NEWMV: {
    1610           0 :       FRAME_COUNTS *counts = xd->counts;
    1611           0 :       int8_t rf_type = av1_ref_frame_type(mbmi->ref_frame);
    1612           0 :       int nmv_ctx = av1_nmv_ctx(xd->ref_mv_count[rf_type],
    1613           0 :                                 xd->ref_mv_stack[rf_type], 1, mbmi->ref_mv_idx);
    1614           0 :       nmv_context *const nmvc = &ec_ctx->nmvc[nmv_ctx];
    1615           0 :       nmv_context_counts *const mv_counts =
    1616           0 :           counts ? &counts->mv[nmv_ctx] : NULL;
    1617           0 :       mv[0].as_int = near_mv[0].as_int;
    1618           0 :       read_mv(r, &mv[1].as_mv, &ref_mv[1].as_mv, nmvc, mv_counts, allow_hp);
    1619           0 :       assert(is_compound);
    1620             : 
    1621           0 :       ret = ret && is_mv_valid(&mv[1].as_mv);
    1622           0 :       break;
    1623             :     }
    1624             :     case NEW_NEARMV: {
    1625           0 :       FRAME_COUNTS *counts = xd->counts;
    1626           0 :       int8_t rf_type = av1_ref_frame_type(mbmi->ref_frame);
    1627           0 :       int nmv_ctx = av1_nmv_ctx(xd->ref_mv_count[rf_type],
    1628           0 :                                 xd->ref_mv_stack[rf_type], 0, mbmi->ref_mv_idx);
    1629           0 :       nmv_context *const nmvc = &ec_ctx->nmvc[nmv_ctx];
    1630           0 :       nmv_context_counts *const mv_counts =
    1631           0 :           counts ? &counts->mv[nmv_ctx] : NULL;
    1632           0 :       read_mv(r, &mv[0].as_mv, &ref_mv[0].as_mv, nmvc, mv_counts, allow_hp);
    1633           0 :       assert(is_compound);
    1634           0 :       ret = ret && is_mv_valid(&mv[0].as_mv);
    1635           0 :       mv[1].as_int = near_mv[1].as_int;
    1636           0 :       break;
    1637             :     }
    1638             :     case ZERO_ZEROMV: {
    1639           0 :       assert(is_compound);
    1640             : #if CONFIG_GLOBAL_MOTION
    1641           0 :       mv[0].as_int = gm_get_motion_vector(&cm->global_motion[ref_frame[0]],
    1642             :                                           cm->allow_high_precision_mv, bsize,
    1643             :                                           mi_col, mi_row, block)
    1644           0 :                          .as_int;
    1645           0 :       mv[1].as_int = gm_get_motion_vector(&cm->global_motion[ref_frame[1]],
    1646             :                                           cm->allow_high_precision_mv, bsize,
    1647             :                                           mi_col, mi_row, block)
    1648           0 :                          .as_int;
    1649             : #else
    1650             :       mv[0].as_int = 0;
    1651             :       mv[1].as_int = 0;
    1652             : #endif  // CONFIG_GLOBAL_MOTION
    1653           0 :       break;
    1654             :     }
    1655             : #endif  // CONFIG_EXT_INTER
    1656           0 :     default: { return 0; }
    1657             :   }
    1658           0 :   return ret;
    1659             : }
    1660             : 
    1661           0 : static int read_is_inter_block(AV1_COMMON *const cm, MACROBLOCKD *const xd,
    1662             :                                int segment_id, aom_reader *r) {
    1663           0 :   if (segfeature_active(&cm->seg, segment_id, SEG_LVL_REF_FRAME)) {
    1664           0 :     return get_segdata(&cm->seg, segment_id, SEG_LVL_REF_FRAME) != INTRA_FRAME;
    1665             :   } else {
    1666           0 :     const int ctx = av1_get_intra_inter_context(xd);
    1667           0 :     const int is_inter = aom_read(r, cm->fc->intra_inter_prob[ctx], ACCT_STR);
    1668           0 :     FRAME_COUNTS *counts = xd->counts;
    1669           0 :     if (counts) ++counts->intra_inter[ctx][is_inter];
    1670           0 :     return is_inter;
    1671             :   }
    1672             : }
    1673             : 
    1674           0 : static void fpm_sync(void *const data, int mi_row) {
    1675           0 :   AV1Decoder *const pbi = (AV1Decoder *)data;
    1676           0 :   av1_frameworker_wait(pbi->frame_worker_owner, pbi->common.prev_frame,
    1677           0 :                        mi_row << pbi->common.mib_size_log2);
    1678           0 : }
    1679             : 
    1680           0 : static void read_inter_block_mode_info(AV1Decoder *const pbi,
    1681             :                                        MACROBLOCKD *const xd,
    1682             :                                        MODE_INFO *const mi,
    1683             : #if (CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION || CONFIG_EXT_INTER) && \
    1684             :     CONFIG_SUPERTX
    1685             :                                        int mi_row, int mi_col, aom_reader *r,
    1686             :                                        int supertx_enabled) {
    1687             : #else
    1688             :                                        int mi_row, int mi_col, aom_reader *r) {
    1689             : #endif  // CONFIG_MOTION_VAR && CONFIG_SUPERTX
    1690           0 :   AV1_COMMON *const cm = &pbi->common;
    1691           0 :   MB_MODE_INFO *const mbmi = &mi->mbmi;
    1692           0 :   const BLOCK_SIZE bsize = mbmi->sb_type;
    1693           0 :   const int allow_hp = cm->allow_high_precision_mv;
    1694           0 :   const int unify_bsize = CONFIG_CB4X4;
    1695             :   int_mv nearestmv[2], nearmv[2];
    1696             :   int_mv ref_mvs[MODE_CTX_REF_FRAMES][MAX_MV_REF_CANDIDATES];
    1697             :   int ref, is_compound;
    1698             :   int16_t inter_mode_ctx[MODE_CTX_REF_FRAMES];
    1699             : #if CONFIG_EXT_INTER
    1700             :   int16_t compound_inter_mode_ctx[MODE_CTX_REF_FRAMES];
    1701             : #endif  // CONFIG_EXT_INTER
    1702           0 :   int16_t mode_ctx = 0;
    1703             : #if CONFIG_WARPED_MOTION
    1704             :   int pts[SAMPLES_ARRAY_SIZE], pts_inref[SAMPLES_ARRAY_SIZE];
    1705             : #endif  // CONFIG_WARPED_MOTION
    1706             : #if CONFIG_EC_ADAPT
    1707           0 :   FRAME_CONTEXT *ec_ctx = xd->tile_ctx;
    1708             : #else
    1709             :   FRAME_CONTEXT *ec_ctx = cm->fc;
    1710             : #endif
    1711             : 
    1712             :   assert(NELEMENTS(mode_2_counter) == MB_MODE_COUNT);
    1713             : 
    1714             : #if CONFIG_PALETTE
    1715           0 :   mbmi->palette_mode_info.palette_size[0] = 0;
    1716           0 :   mbmi->palette_mode_info.palette_size[1] = 0;
    1717             : #endif  // CONFIG_PALETTE
    1718             : 
    1719           0 :   memset(ref_mvs, 0, sizeof(ref_mvs));
    1720             : 
    1721           0 :   read_ref_frames(cm, xd, r, mbmi->segment_id, mbmi->ref_frame);
    1722           0 :   is_compound = has_second_ref(mbmi);
    1723             : 
    1724           0 :   for (ref = 0; ref < 1 + is_compound; ++ref) {
    1725           0 :     MV_REFERENCE_FRAME frame = mbmi->ref_frame[ref];
    1726             : 
    1727           0 :     av1_find_mv_refs(
    1728           0 :         cm, xd, mi, frame, &xd->ref_mv_count[frame], xd->ref_mv_stack[frame],
    1729             : #if CONFIG_EXT_INTER
    1730             :         compound_inter_mode_ctx,
    1731             : #endif  // CONFIG_EXT_INTER
    1732           0 :         ref_mvs[frame], mi_row, mi_col, fpm_sync, (void *)pbi, inter_mode_ctx);
    1733             :   }
    1734             : 
    1735           0 :   if (is_compound) {
    1736           0 :     MV_REFERENCE_FRAME ref_frame = av1_ref_frame_type(mbmi->ref_frame);
    1737           0 :     av1_find_mv_refs(cm, xd, mi, ref_frame, &xd->ref_mv_count[ref_frame],
    1738           0 :                      xd->ref_mv_stack[ref_frame],
    1739             : #if CONFIG_EXT_INTER
    1740             :                      compound_inter_mode_ctx,
    1741             : #endif  // CONFIG_EXT_INTER
    1742           0 :                      ref_mvs[ref_frame], mi_row, mi_col, fpm_sync, (void *)pbi,
    1743             :                      inter_mode_ctx);
    1744             : 
    1745           0 :     if (xd->ref_mv_count[ref_frame] < 2) {
    1746             :       MV_REFERENCE_FRAME rf[2];
    1747             :       int_mv zeromv[2];
    1748           0 :       av1_set_ref_frame(rf, ref_frame);
    1749             : #if CONFIG_GLOBAL_MOTION
    1750           0 :       zeromv[0].as_int = gm_get_motion_vector(&cm->global_motion[rf[0]],
    1751             :                                               cm->allow_high_precision_mv,
    1752             :                                               bsize, mi_col, mi_row, 0)
    1753           0 :                              .as_int;
    1754           0 :       zeromv[1].as_int = (rf[1] != NONE_FRAME)
    1755           0 :                              ? gm_get_motion_vector(&cm->global_motion[rf[1]],
    1756             :                                                     cm->allow_high_precision_mv,
    1757             :                                                     bsize, mi_col, mi_row, 0)
    1758             :                                    .as_int
    1759           0 :                              : 0;
    1760             : #else
    1761             :       zeromv[0].as_int = zeromv[1].as_int = 0;
    1762             : #endif
    1763           0 :       for (ref = 0; ref < 2; ++ref) {
    1764           0 :         if (rf[ref] == NONE_FRAME) continue;
    1765           0 :         lower_mv_precision(&ref_mvs[rf[ref]][0].as_mv, allow_hp);
    1766           0 :         lower_mv_precision(&ref_mvs[rf[ref]][1].as_mv, allow_hp);
    1767           0 :         if (ref_mvs[rf[ref]][0].as_int != zeromv[ref].as_int ||
    1768           0 :             ref_mvs[rf[ref]][1].as_int != zeromv[ref].as_int)
    1769           0 :           inter_mode_ctx[ref_frame] &= ~(1 << ALL_ZERO_FLAG_OFFSET);
    1770             :       }
    1771             :     }
    1772             :   }
    1773             : 
    1774             : #if CONFIG_EXT_INTER
    1775           0 :   if (is_compound)
    1776           0 :     mode_ctx = compound_inter_mode_ctx[mbmi->ref_frame[0]];
    1777             :   else
    1778             : #endif  // CONFIG_EXT_INTER
    1779           0 :     mode_ctx =
    1780           0 :         av1_mode_context_analyzer(inter_mode_ctx, mbmi->ref_frame, bsize, -1);
    1781           0 :   mbmi->ref_mv_idx = 0;
    1782             : 
    1783           0 :   if (segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP)) {
    1784           0 :     mbmi->mode = ZEROMV;
    1785           0 :     if (bsize < BLOCK_8X8 && !unify_bsize) {
    1786           0 :       aom_internal_error(xd->error_info, AOM_CODEC_UNSUP_BITSTREAM,
    1787             :                          "Invalid usage of segement feature on small blocks");
    1788           0 :       return;
    1789             :     }
    1790             :   } else {
    1791           0 :     if (bsize >= BLOCK_8X8 || unify_bsize) {
    1792             : #if CONFIG_EXT_INTER
    1793           0 :       if (is_compound)
    1794           0 :         mbmi->mode = read_inter_compound_mode(cm, xd, r, mode_ctx);
    1795             :       else
    1796             : #endif  // CONFIG_EXT_INTER
    1797           0 :         mbmi->mode = read_inter_mode(ec_ctx, xd, r, mode_ctx);
    1798             : #if CONFIG_EXT_INTER
    1799           0 :       if (mbmi->mode == NEWMV || mbmi->mode == NEW_NEWMV ||
    1800           0 :           have_nearmv_in_inter_mode(mbmi->mode))
    1801             : #else
    1802             :       if (mbmi->mode == NEARMV || mbmi->mode == NEWMV)
    1803             : #endif
    1804           0 :         read_drl_idx(cm, xd, mbmi, r);
    1805             :     }
    1806             :   }
    1807             : 
    1808             : #if CONFIG_EXT_INTER
    1809           0 :   if ((bsize < BLOCK_8X8 && unify_bsize) ||
    1810           0 :       (mbmi->mode != ZEROMV && mbmi->mode != ZERO_ZEROMV)) {
    1811             : #else
    1812             :   if ((bsize < BLOCK_8X8 && !unify_bsize) || mbmi->mode != ZEROMV) {
    1813             : #endif  // CONFIG_EXT_INTER
    1814           0 :     for (ref = 0; ref < 1 + is_compound; ++ref) {
    1815           0 :       av1_find_best_ref_mvs(allow_hp, ref_mvs[mbmi->ref_frame[ref]],
    1816             :                             &nearestmv[ref], &nearmv[ref]);
    1817             :     }
    1818             :   }
    1819             : 
    1820           0 :   if (mbmi->ref_mv_idx > 0) {
    1821           0 :     int_mv cur_mv =
    1822           0 :         xd->ref_mv_stack[mbmi->ref_frame[0]][1 + mbmi->ref_mv_idx].this_mv;
    1823           0 :     nearmv[0] = cur_mv;
    1824             :   }
    1825             : 
    1826             : #if CONFIG_EXT_INTER
    1827           0 :   if (is_compound && (bsize >= BLOCK_8X8 || unify_bsize) &&
    1828           0 :       mbmi->mode != ZERO_ZEROMV) {
    1829             : #else
    1830             :   if (is_compound && (bsize >= BLOCK_8X8 || unify_bsize) &&
    1831             :       mbmi->mode != NEWMV && mbmi->mode != ZEROMV) {
    1832             : #endif  // CONFIG_EXT_INTER
    1833           0 :     uint8_t ref_frame_type = av1_ref_frame_type(mbmi->ref_frame);
    1834             : 
    1835             : #if CONFIG_EXT_INTER
    1836           0 :     if (xd->ref_mv_count[ref_frame_type] > 0) {
    1837             : #else
    1838             :     if (xd->ref_mv_count[ref_frame_type] == 1 && mbmi->mode == NEARESTMV) {
    1839             : #endif  // CONFIG_EXT_INTER
    1840             : #if CONFIG_EXT_INTER
    1841           0 :       if (mbmi->mode == NEAREST_NEARESTMV) {
    1842             : #endif  // CONFIG_EXT_INTER
    1843           0 :         nearestmv[0] = xd->ref_mv_stack[ref_frame_type][0].this_mv;
    1844           0 :         nearestmv[1] = xd->ref_mv_stack[ref_frame_type][0].comp_mv;
    1845           0 :         lower_mv_precision(&nearestmv[0].as_mv, allow_hp);
    1846           0 :         lower_mv_precision(&nearestmv[1].as_mv, allow_hp);
    1847             : #if CONFIG_EXT_INTER
    1848           0 :       } else if (mbmi->mode == NEAREST_NEWMV) {
    1849           0 :         nearestmv[0] = xd->ref_mv_stack[ref_frame_type][0].this_mv;
    1850           0 :         lower_mv_precision(&nearestmv[0].as_mv, allow_hp);
    1851           0 :       } else if (mbmi->mode == NEW_NEARESTMV) {
    1852           0 :         nearestmv[1] = xd->ref_mv_stack[ref_frame_type][0].comp_mv;
    1853           0 :         lower_mv_precision(&nearestmv[1].as_mv, allow_hp);
    1854             :       }
    1855             : #endif  // CONFIG_EXT_INTER
    1856             :     }
    1857             : 
    1858             : #if CONFIG_EXT_INTER
    1859           0 :     if (xd->ref_mv_count[ref_frame_type] > 1) {
    1860           0 :       int ref_mv_idx = 1 + mbmi->ref_mv_idx;
    1861           0 :       if (compound_ref0_mode(mbmi->mode) == NEARMV) {
    1862           0 :         nearmv[0] = xd->ref_mv_stack[ref_frame_type][ref_mv_idx].this_mv;
    1863           0 :         lower_mv_precision(&nearmv[0].as_mv, allow_hp);
    1864             :       }
    1865             : 
    1866           0 :       if (compound_ref1_mode(mbmi->mode) == NEARMV) {
    1867           0 :         nearmv[1] = xd->ref_mv_stack[ref_frame_type][ref_mv_idx].comp_mv;
    1868           0 :         lower_mv_precision(&nearmv[1].as_mv, allow_hp);
    1869             :       }
    1870             :     }
    1871             : #else
    1872             :     if (xd->ref_mv_count[ref_frame_type] > 1) {
    1873             :       int ref_mv_idx = 1 + mbmi->ref_mv_idx;
    1874             :       nearestmv[0] = xd->ref_mv_stack[ref_frame_type][0].this_mv;
    1875             :       nearestmv[1] = xd->ref_mv_stack[ref_frame_type][0].comp_mv;
    1876             :       nearmv[0] = xd->ref_mv_stack[ref_frame_type][ref_mv_idx].this_mv;
    1877             :       nearmv[1] = xd->ref_mv_stack[ref_frame_type][ref_mv_idx].comp_mv;
    1878             :     }
    1879             : #endif  // CONFIG_EXT_INTER
    1880             :   }
    1881             : 
    1882             : #if !CONFIG_DUAL_FILTER && !CONFIG_WARPED_MOTION && !CONFIG_GLOBAL_MOTION
    1883             :   read_mb_interp_filter(cm, xd, mbmi, r);
    1884             : #endif  // !CONFIG_DUAL_FILTER && !CONFIG_WARPED_MOTION
    1885             : 
    1886           0 :   if (bsize < BLOCK_8X8 && !unify_bsize) {
    1887           0 :     const int num_4x4_w = 1 << xd->bmode_blocks_wl;
    1888           0 :     const int num_4x4_h = 1 << xd->bmode_blocks_hl;
    1889             :     int idx, idy;
    1890             :     PREDICTION_MODE b_mode;
    1891             :     int_mv nearest_sub8x8[2], near_sub8x8[2];
    1892             : #if CONFIG_EXT_INTER
    1893             :     int_mv ref_mv[2][2];
    1894             : #endif  // CONFIG_EXT_INTER
    1895           0 :     for (idy = 0; idy < 2; idy += num_4x4_h) {
    1896           0 :       for (idx = 0; idx < 2; idx += num_4x4_w) {
    1897             :         int_mv block[2];
    1898           0 :         const int j = idy * 2 + idx;
    1899             :         int_mv ref_mv_s8[2];
    1900             : #if CONFIG_EXT_INTER
    1901           0 :         if (!is_compound)
    1902             : #endif  // CONFIG_EXT_INTER
    1903           0 :           mode_ctx = av1_mode_context_analyzer(inter_mode_ctx, mbmi->ref_frame,
    1904             :                                                bsize, j);
    1905             : #if CONFIG_EXT_INTER
    1906           0 :         if (is_compound)
    1907           0 :           b_mode = read_inter_compound_mode(cm, xd, r, mode_ctx);
    1908             :         else
    1909             : #endif  // CONFIG_EXT_INTER
    1910           0 :           b_mode = read_inter_mode(ec_ctx, xd, r, mode_ctx);
    1911             : 
    1912             : #if CONFIG_EXT_INTER
    1913           0 :         if (b_mode != ZEROMV && b_mode != ZERO_ZEROMV) {
    1914             : #else
    1915             :         if (b_mode != ZEROMV) {
    1916             : #endif  // CONFIG_EXT_INTER
    1917             :           CANDIDATE_MV ref_mv_stack[2][MAX_REF_MV_STACK_SIZE];
    1918             :           uint8_t ref_mv_count[2];
    1919           0 :           for (ref = 0; ref < 1 + is_compound; ++ref)
    1920             : #if CONFIG_EXT_INTER
    1921             :           {
    1922             :             int_mv mv_ref_list[MAX_MV_REF_CANDIDATES];
    1923           0 :             av1_update_mv_context(cm, xd, mi, mbmi->ref_frame[ref], mv_ref_list,
    1924             :                                   j, mi_row, mi_col, NULL);
    1925             : #endif  // CONFIG_EXT_INTER
    1926           0 :             av1_append_sub8x8_mvs_for_idx(cm, xd, j, ref, mi_row, mi_col,
    1927           0 :                                           ref_mv_stack[ref], &ref_mv_count[ref],
    1928             : #if CONFIG_EXT_INTER
    1929             :                                           mv_ref_list,
    1930             : #endif  // CONFIG_EXT_INTER
    1931             :                                           &nearest_sub8x8[ref],
    1932             :                                           &near_sub8x8[ref]);
    1933             : #if CONFIG_EXT_INTER
    1934           0 :             if (have_newmv_in_inter_mode(b_mode)) {
    1935           0 :               mv_ref_list[0].as_int = nearest_sub8x8[ref].as_int;
    1936           0 :               mv_ref_list[1].as_int = near_sub8x8[ref].as_int;
    1937           0 :               av1_find_best_ref_mvs(allow_hp, mv_ref_list, &ref_mv[0][ref],
    1938             :                                     &ref_mv[1][ref]);
    1939             :             }
    1940             :           }
    1941             : #endif  // CONFIG_EXT_INTER
    1942             :         }
    1943             : 
    1944           0 :         for (ref = 0; ref < 1 + is_compound && b_mode != ZEROMV; ++ref) {
    1945           0 :           ref_mv_s8[ref] = nearest_sub8x8[ref];
    1946           0 :           lower_mv_precision(&ref_mv_s8[ref].as_mv, allow_hp);
    1947             :         }
    1948             : #if CONFIG_EXT_INTER
    1949             :         (void)ref_mv_s8;
    1950             : #endif
    1951             : 
    1952           0 :         if (!assign_mv(cm, xd, b_mode, mbmi->ref_frame, j, block,
    1953             : #if CONFIG_EXT_INTER
    1954             :                        ref_mv[0],
    1955             : #else   // !CONFIG_EXT_INTER
    1956             :                        ref_mv_s8,
    1957             : #endif  // CONFIG_EXT_INTER
    1958             :                        nearest_sub8x8, near_sub8x8, mi_row, mi_col, is_compound,
    1959             :                        allow_hp, r)) {
    1960           0 :           aom_merge_corrupted_flag(&xd->corrupted, 1);
    1961           0 :           break;
    1962             :         };
    1963             : 
    1964           0 :         mi->bmi[j].as_mv[0].as_int = block[0].as_int;
    1965           0 :         mi->bmi[j].as_mode = b_mode;
    1966           0 :         if (is_compound) mi->bmi[j].as_mv[1].as_int = block[1].as_int;
    1967             : 
    1968           0 :         if (num_4x4_h == 2) mi->bmi[j + 2] = mi->bmi[j];
    1969           0 :         if (num_4x4_w == 2) mi->bmi[j + 1] = mi->bmi[j];
    1970             :       }
    1971             :     }
    1972             : 
    1973           0 :     mbmi->pred_mv[0].as_int = mi->bmi[3].pred_mv[0].as_int;
    1974           0 :     mbmi->pred_mv[1].as_int = mi->bmi[3].pred_mv[1].as_int;
    1975           0 :     mi->mbmi.mode = b_mode;
    1976             : 
    1977           0 :     mbmi->mv[0].as_int = mi->bmi[3].as_mv[0].as_int;
    1978           0 :     mbmi->mv[1].as_int = mi->bmi[3].as_mv[1].as_int;
    1979             :   } else {
    1980             :     int_mv ref_mv[2];
    1981           0 :     ref_mv[0] = nearestmv[0];
    1982           0 :     ref_mv[1] = nearestmv[1];
    1983             : 
    1984             : #if CONFIG_EXT_INTER
    1985           0 :     if (is_compound) {
    1986           0 :       int ref_mv_idx = mbmi->ref_mv_idx;
    1987             :       // Special case: NEAR_NEWMV and NEW_NEARMV modes use
    1988             :       // 1 + mbmi->ref_mv_idx (like NEARMV) instead of
    1989             :       // mbmi->ref_mv_idx (like NEWMV)
    1990           0 :       if (mbmi->mode == NEAR_NEWMV || mbmi->mode == NEW_NEARMV)
    1991           0 :         ref_mv_idx = 1 + mbmi->ref_mv_idx;
    1992             : 
    1993           0 :       if (compound_ref0_mode(mbmi->mode) == NEWMV) {
    1994           0 :         uint8_t ref_frame_type = av1_ref_frame_type(mbmi->ref_frame);
    1995           0 :         if (xd->ref_mv_count[ref_frame_type] > 1) {
    1996           0 :           ref_mv[0] = xd->ref_mv_stack[ref_frame_type][ref_mv_idx].this_mv;
    1997           0 :           clamp_mv_ref(&ref_mv[0].as_mv, xd->n8_w << MI_SIZE_LOG2,
    1998           0 :                        xd->n8_h << MI_SIZE_LOG2, xd);
    1999             :         }
    2000           0 :         nearestmv[0] = ref_mv[0];
    2001             :       }
    2002           0 :       if (compound_ref1_mode(mbmi->mode) == NEWMV) {
    2003           0 :         uint8_t ref_frame_type = av1_ref_frame_type(mbmi->ref_frame);
    2004           0 :         if (xd->ref_mv_count[ref_frame_type] > 1) {
    2005           0 :           ref_mv[1] = xd->ref_mv_stack[ref_frame_type][ref_mv_idx].comp_mv;
    2006           0 :           clamp_mv_ref(&ref_mv[1].as_mv, xd->n8_w << MI_SIZE_LOG2,
    2007           0 :                        xd->n8_h << MI_SIZE_LOG2, xd);
    2008             :         }
    2009           0 :         nearestmv[1] = ref_mv[1];
    2010             :       }
    2011             :     } else {
    2012             : #endif  // CONFIG_EXT_INTER
    2013           0 :       if (mbmi->mode == NEWMV) {
    2014           0 :         for (ref = 0; ref < 1 + is_compound; ++ref) {
    2015           0 :           uint8_t ref_frame_type = av1_ref_frame_type(mbmi->ref_frame);
    2016           0 :           if (xd->ref_mv_count[ref_frame_type] > 1) {
    2017           0 :             ref_mv[ref] =
    2018             :                 (ref == 0)
    2019           0 :                     ? xd->ref_mv_stack[ref_frame_type][mbmi->ref_mv_idx].this_mv
    2020           0 :                     : xd->ref_mv_stack[ref_frame_type][mbmi->ref_mv_idx]
    2021           0 :                           .comp_mv;
    2022           0 :             clamp_mv_ref(&ref_mv[ref].as_mv, xd->n8_w << MI_SIZE_LOG2,
    2023           0 :                          xd->n8_h << MI_SIZE_LOG2, xd);
    2024             :           }
    2025           0 :           nearestmv[ref] = ref_mv[ref];
    2026             :         }
    2027             :       }
    2028             : #if CONFIG_EXT_INTER
    2029             :     }
    2030             : #endif  // CONFIG_EXT_INTER
    2031             : 
    2032           0 :     int mv_corrupted_flag =
    2033           0 :         !assign_mv(cm, xd, mbmi->mode, mbmi->ref_frame, 0, mbmi->mv, ref_mv,
    2034             :                    nearestmv, nearmv, mi_row, mi_col, is_compound, allow_hp, r);
    2035           0 :     aom_merge_corrupted_flag(&xd->corrupted, mv_corrupted_flag);
    2036             :   }
    2037             : 
    2038             : #if CONFIG_EXT_INTER && CONFIG_INTERINTRA
    2039           0 :   mbmi->use_wedge_interintra = 0;
    2040           0 :   if (cm->reference_mode != COMPOUND_REFERENCE &&
    2041             : #if CONFIG_SUPERTX
    2042             :       !supertx_enabled &&
    2043             : #endif
    2044           0 :       cm->allow_interintra_compound && is_interintra_allowed(mbmi)) {
    2045           0 :     const int bsize_group = size_group_lookup[bsize];
    2046           0 :     const int interintra =
    2047           0 :         aom_read(r, cm->fc->interintra_prob[bsize_group], ACCT_STR);
    2048           0 :     if (xd->counts) xd->counts->interintra[bsize_group][interintra]++;
    2049           0 :     assert(mbmi->ref_frame[1] == NONE_FRAME);
    2050           0 :     if (interintra) {
    2051           0 :       const INTERINTRA_MODE interintra_mode =
    2052             :           read_interintra_mode(cm, xd, r, bsize_group);
    2053           0 :       mbmi->ref_frame[1] = INTRA_FRAME;
    2054           0 :       mbmi->interintra_mode = interintra_mode;
    2055             : #if CONFIG_EXT_INTRA
    2056           0 :       mbmi->angle_delta[0] = 0;
    2057           0 :       mbmi->angle_delta[1] = 0;
    2058             : #if CONFIG_INTRA_INTERP
    2059             :       mbmi->intra_filter = INTRA_FILTER_LINEAR;
    2060             : #endif  // CONFIG_INTRA_INTERP
    2061             : #endif  // CONFIG_EXT_INTRA
    2062             : #if CONFIG_FILTER_INTRA
    2063             :       mbmi->filter_intra_mode_info.use_filter_intra_mode[0] = 0;
    2064             :       mbmi->filter_intra_mode_info.use_filter_intra_mode[1] = 0;
    2065             : #endif  // CONFIG_FILTER_INTRA
    2066           0 :       if (is_interintra_wedge_used(bsize)) {
    2067           0 :         mbmi->use_wedge_interintra =
    2068           0 :             aom_read(r, cm->fc->wedge_interintra_prob[bsize], ACCT_STR);
    2069           0 :         if (xd->counts)
    2070           0 :           xd->counts->wedge_interintra[bsize][mbmi->use_wedge_interintra]++;
    2071           0 :         if (mbmi->use_wedge_interintra) {
    2072           0 :           mbmi->interintra_wedge_index =
    2073           0 :               aom_read_literal(r, get_wedge_bits_lookup(bsize), ACCT_STR);
    2074           0 :           mbmi->interintra_wedge_sign = 0;
    2075             :         }
    2076             :       }
    2077             :     }
    2078             :   }
    2079             : #endif  // CONFIG_EXT_INTER && CONFIG_INTERINTRA
    2080             : 
    2081             : #if CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION
    2082           0 :   mbmi->motion_mode = SIMPLE_TRANSLATION;
    2083             : #if CONFIG_WARPED_MOTION
    2084           0 :   if (mbmi->sb_type >= BLOCK_8X8 && !has_second_ref(mbmi))
    2085           0 :     mbmi->num_proj_ref[0] = findSamples(cm, xd, mi_row, mi_col, pts, pts_inref);
    2086             : #endif  // CONFIG_WARPED_MOTION
    2087             : #if CONFIG_MOTION_VAR
    2088           0 :   av1_count_overlappable_neighbors(cm, xd, mi_row, mi_col);
    2089             : #endif
    2090             : 
    2091             : #if CONFIG_SUPERTX
    2092             :   if (!supertx_enabled) {
    2093             : #endif  // CONFIG_SUPERTX
    2094             : #if CONFIG_EXT_INTER
    2095           0 :     if (mbmi->ref_frame[1] != INTRA_FRAME)
    2096             : #endif  // CONFIG_EXT_INTER
    2097           0 :       mbmi->motion_mode = read_motion_mode(cm, xd, mi, r);
    2098             : #if CONFIG_WARPED_MOTION
    2099           0 :     if (mbmi->motion_mode == WARPED_CAUSAL) {
    2100           0 :       mbmi->wm_params[0].wmtype = DEFAULT_WMTYPE;
    2101           0 :       if (find_projection(mbmi->num_proj_ref[0], pts, pts_inref, bsize,
    2102           0 :                           mbmi->mv[0].as_mv.row, mbmi->mv[0].as_mv.col,
    2103             :                           &mbmi->wm_params[0], mi_row, mi_col)) {
    2104           0 :         assert(0 && "Invalid Warped Model.");
    2105             :       }
    2106             :     }
    2107             : #endif  // CONFIG_WARPED_MOTION
    2108             : #if CONFIG_SUPERTX
    2109             :   }
    2110             : #endif  // CONFIG_SUPERTX
    2111             : #endif  // CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION
    2112             : 
    2113             : #if CONFIG_EXT_INTER
    2114           0 :   mbmi->interinter_compound_type = COMPOUND_AVERAGE;
    2115           0 :   if (cm->reference_mode != SINGLE_REFERENCE &&
    2116           0 :       is_inter_compound_mode(mbmi->mode)
    2117             : #if CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION
    2118           0 :       && mbmi->motion_mode == SIMPLE_TRANSLATION
    2119             : #endif  // CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION
    2120             :       ) {
    2121           0 :     if (is_any_masked_compound_used(bsize)) {
    2122             : #if CONFIG_COMPOUND_SEGMENT || CONFIG_WEDGE
    2123           0 :       if (cm->allow_masked_compound) {
    2124           0 :         mbmi->interinter_compound_type =
    2125           0 :             aom_read_tree(r, av1_compound_type_tree,
    2126             :                           cm->fc->compound_type_prob[bsize], ACCT_STR);
    2127             : #if CONFIG_WEDGE
    2128           0 :         if (mbmi->interinter_compound_type == COMPOUND_WEDGE) {
    2129           0 :           mbmi->wedge_index =
    2130           0 :               aom_read_literal(r, get_wedge_bits_lookup(bsize), ACCT_STR);
    2131           0 :           mbmi->wedge_sign = aom_read_bit(r, ACCT_STR);
    2132             :         }
    2133             : #endif  // CONFIG_WEDGE
    2134             : #if CONFIG_COMPOUND_SEGMENT
    2135           0 :         if (mbmi->interinter_compound_type == COMPOUND_SEG) {
    2136           0 :           mbmi->mask_type = aom_read_literal(r, MAX_SEG_MASK_BITS, ACCT_STR);
    2137             :         }
    2138             : #endif  // CONFIG_COMPOUND_SEGMENT
    2139             :       }
    2140             : #endif  // CONFIG_COMPOUND_SEGMENT || CONFIG_WEDGE
    2141             :     } else {
    2142           0 :       mbmi->interinter_compound_type = COMPOUND_AVERAGE;
    2143             :     }
    2144           0 :     if (xd->counts)
    2145           0 :       xd->counts->compound_interinter[bsize][mbmi->interinter_compound_type]++;
    2146             :   }
    2147             : #endif  // CONFIG_EXT_INTER
    2148             : 
    2149             : #if CONFIG_DUAL_FILTER || CONFIG_WARPED_MOTION || CONFIG_GLOBAL_MOTION
    2150           0 :   read_mb_interp_filter(cm, xd, mbmi, r);
    2151             : #endif  // CONFIG_DUAL_FILTER || CONFIG_WARPED_MOTION
    2152             : }
    2153             : 
    2154           0 : static void read_inter_frame_mode_info(AV1Decoder *const pbi,
    2155             :                                        MACROBLOCKD *const xd,
    2156             : #if CONFIG_SUPERTX
    2157             :                                        int supertx_enabled,
    2158             : #endif  // CONFIG_SUPERTX
    2159             :                                        int mi_row, int mi_col, aom_reader *r) {
    2160           0 :   AV1_COMMON *const cm = &pbi->common;
    2161           0 :   MODE_INFO *const mi = xd->mi[0];
    2162           0 :   MB_MODE_INFO *const mbmi = &mi->mbmi;
    2163           0 :   int inter_block = 1;
    2164             : #if CONFIG_VAR_TX
    2165           0 :   BLOCK_SIZE bsize = mbmi->sb_type;
    2166             : #endif  // CONFIG_VAR_TX
    2167             : 
    2168           0 :   mbmi->mv[0].as_int = 0;
    2169           0 :   mbmi->mv[1].as_int = 0;
    2170           0 :   mbmi->segment_id = read_inter_segment_id(cm, xd, mi_row, mi_col, r);
    2171             : #if CONFIG_SUPERTX
    2172             :   if (!supertx_enabled)
    2173             : #endif  // CONFIG_SUPERTX
    2174           0 :     mbmi->skip = read_skip(cm, xd, mbmi->segment_id, r);
    2175             : 
    2176             : #if CONFIG_DELTA_Q
    2177           0 :   if (cm->delta_q_present_flag) {
    2178           0 :     xd->current_qindex =
    2179           0 :         xd->prev_qindex +
    2180           0 :         read_delta_qindex(cm, xd, r, mbmi, mi_col, mi_row) * cm->delta_q_res;
    2181             :     /* Normative: Clamp to [1,MAXQ] to not interfere with lossless mode */
    2182           0 :     xd->current_qindex = clamp(xd->current_qindex, 1, MAXQ);
    2183           0 :     xd->prev_qindex = xd->current_qindex;
    2184             : #if CONFIG_EXT_DELTA_Q
    2185           0 :     if (cm->delta_lf_present_flag) {
    2186           0 :       mbmi->current_delta_lf_from_base = xd->current_delta_lf_from_base =
    2187           0 :           xd->prev_delta_lf_from_base +
    2188           0 :           read_delta_lflevel(cm, xd, r, mbmi, mi_col, mi_row) *
    2189           0 :               cm->delta_lf_res;
    2190           0 :       xd->prev_delta_lf_from_base = xd->current_delta_lf_from_base;
    2191             :     }
    2192             : #endif
    2193             :   }
    2194             : #endif
    2195             : 
    2196             : #if CONFIG_SUPERTX
    2197             :   if (!supertx_enabled) {
    2198             : #endif  // CONFIG_SUPERTX
    2199           0 :     inter_block = read_is_inter_block(cm, xd, mbmi->segment_id, r);
    2200             : 
    2201             : #if CONFIG_VAR_TX
    2202           0 :     xd->above_txfm_context =
    2203           0 :         cm->above_txfm_context + (mi_col << TX_UNIT_WIDE_LOG2);
    2204           0 :     xd->left_txfm_context = xd->left_txfm_context_buffer +
    2205           0 :                             ((mi_row & MAX_MIB_MASK) << TX_UNIT_HIGH_LOG2);
    2206             : 
    2207           0 :     if (cm->tx_mode == TX_MODE_SELECT &&
    2208             : #if CONFIG_CB4X4
    2209           0 :         bsize > BLOCK_4X4 &&
    2210             : #else
    2211             :         bsize >= BLOCK_8X8 &&
    2212             : #endif
    2213           0 :         !mbmi->skip && inter_block) {
    2214           0 :       const TX_SIZE max_tx_size = max_txsize_rect_lookup[bsize];
    2215           0 :       const int bh = tx_size_high_unit[max_tx_size];
    2216           0 :       const int bw = tx_size_wide_unit[max_tx_size];
    2217           0 :       const int width = block_size_wide[bsize] >> tx_size_wide_log2[0];
    2218           0 :       const int height = block_size_high[bsize] >> tx_size_wide_log2[0];
    2219             :       int idx, idy;
    2220             : 
    2221           0 :       mbmi->min_tx_size = TX_SIZES_ALL;
    2222           0 :       for (idy = 0; idy < height; idy += bh)
    2223           0 :         for (idx = 0; idx < width; idx += bw)
    2224           0 :           read_tx_size_vartx(cm, xd, mbmi, xd->counts, max_tx_size,
    2225             :                              height != width, idy, idx, r);
    2226             :     } else {
    2227           0 :       mbmi->tx_size = read_tx_size(cm, xd, inter_block, !mbmi->skip, r);
    2228             : 
    2229           0 :       if (inter_block) {
    2230           0 :         const int width = block_size_wide[bsize] >> tx_size_wide_log2[0];
    2231           0 :         const int height = block_size_high[bsize] >> tx_size_high_log2[0];
    2232             :         int idx, idy;
    2233           0 :         for (idy = 0; idy < height; ++idy)
    2234           0 :           for (idx = 0; idx < width; ++idx)
    2235           0 :             mbmi->inter_tx_size[idy >> 1][idx >> 1] = mbmi->tx_size;
    2236             :       }
    2237           0 :       mbmi->min_tx_size = get_min_tx_size(mbmi->tx_size);
    2238           0 :       set_txfm_ctxs(mbmi->tx_size, xd->n8_w, xd->n8_h, mbmi->skip, xd);
    2239             :     }
    2240             : #else
    2241             :   mbmi->tx_size = read_tx_size(cm, xd, inter_block, !mbmi->skip, r);
    2242             : #endif  // CONFIG_VAR_TX
    2243             : #if CONFIG_SUPERTX
    2244             :   }
    2245             : #if CONFIG_VAR_TX
    2246             :   else if (inter_block) {
    2247             :     const int width = num_4x4_blocks_wide_lookup[bsize];
    2248             :     const int height = num_4x4_blocks_high_lookup[bsize];
    2249             :     int idx, idy;
    2250             :     xd->mi[0]->mbmi.tx_size = xd->supertx_size;
    2251             :     for (idy = 0; idy < height; ++idy)
    2252             :       for (idx = 0; idx < width; ++idx)
    2253             :         xd->mi[0]->mbmi.inter_tx_size[idy >> 1][idx >> 1] = xd->supertx_size;
    2254             :   }
    2255             : #endif  // CONFIG_VAR_TX
    2256             : #endif  // CONFIG_SUPERTX
    2257             : 
    2258           0 :   if (inter_block)
    2259           0 :     read_inter_block_mode_info(pbi, xd,
    2260             : #if (CONFIG_MOTION_VAR || CONFIG_EXT_INTER || CONFIG_WARPED_MOTION) && \
    2261             :     CONFIG_SUPERTX
    2262             : 
    2263             :                                mi, mi_row, mi_col, r, supertx_enabled);
    2264             : #else
    2265             :                                mi, mi_row, mi_col, r);
    2266             : #endif  // CONFIG_MOTION_VAR && CONFIG_SUPERTX
    2267             :   else
    2268           0 :     read_intra_block_mode_info(cm, mi_row, mi_col, xd, mi, r);
    2269             : 
    2270             : #if !CONFIG_TXK_SEL
    2271           0 :   av1_read_tx_type(cm, xd,
    2272             : #if CONFIG_SUPERTX
    2273             :                    supertx_enabled,
    2274             : #endif
    2275             :                    r);
    2276             : #endif  // !CONFIG_TXK_SEL
    2277           0 : }
    2278             : 
    2279           0 : void av1_read_mode_info(AV1Decoder *const pbi, MACROBLOCKD *xd,
    2280             : #if CONFIG_SUPERTX
    2281             :                         int supertx_enabled,
    2282             : #endif  // CONFIG_SUPERTX
    2283             :                         int mi_row, int mi_col, aom_reader *r, int x_mis,
    2284             :                         int y_mis) {
    2285           0 :   AV1_COMMON *const cm = &pbi->common;
    2286           0 :   MODE_INFO *const mi = xd->mi[0];
    2287           0 :   MV_REF *frame_mvs = cm->cur_frame->mvs + mi_row * cm->mi_cols + mi_col;
    2288             :   int w, h;
    2289             : 
    2290             : #if CONFIG_INTRABC
    2291             :   mi->mbmi.use_intrabc = 0;
    2292             : #endif  // CONFIG_INTRABC
    2293             : 
    2294           0 :   if (frame_is_intra_only(cm)) {
    2295           0 :     read_intra_frame_mode_info(cm, xd, mi_row, mi_col, r);
    2296           0 :     for (h = 0; h < y_mis; ++h) {
    2297           0 :       MV_REF *const frame_mv = frame_mvs + h * cm->mi_cols;
    2298           0 :       for (w = 0; w < x_mis; ++w) {
    2299           0 :         MV_REF *const mv = frame_mv + w;
    2300           0 :         mv->ref_frame[0] = NONE_FRAME;
    2301           0 :         mv->ref_frame[1] = NONE_FRAME;
    2302             :       }
    2303             :     }
    2304             :   } else {
    2305           0 :     read_inter_frame_mode_info(pbi, xd,
    2306             : #if CONFIG_SUPERTX
    2307             :                                supertx_enabled,
    2308             : #endif  // CONFIG_SUPERTX
    2309             :                                mi_row, mi_col, r);
    2310           0 :     for (h = 0; h < y_mis; ++h) {
    2311           0 :       MV_REF *const frame_mv = frame_mvs + h * cm->mi_cols;
    2312           0 :       for (w = 0; w < x_mis; ++w) {
    2313           0 :         MV_REF *const mv = frame_mv + w;
    2314           0 :         mv->ref_frame[0] = mi->mbmi.ref_frame[0];
    2315           0 :         mv->ref_frame[1] = mi->mbmi.ref_frame[1];
    2316           0 :         mv->mv[0].as_int = mi->mbmi.mv[0].as_int;
    2317           0 :         mv->mv[1].as_int = mi->mbmi.mv[1].as_int;
    2318           0 :         mv->pred_mv[0].as_int = mi->mbmi.pred_mv[0].as_int;
    2319           0 :         mv->pred_mv[1].as_int = mi->mbmi.pred_mv[1].as_int;
    2320             :       }
    2321             :     }
    2322             :   }
    2323           0 : }

Generated by: LCOV version 1.13