decodemv.c 71.9 KB
Newer Older
Jingning Han's avatar
Jingning Han committed
1
/*
Yaowu Xu's avatar
Yaowu Xu committed
2
 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
Jingning Han's avatar
Jingning Han committed
3
 *
Yaowu Xu's avatar
Yaowu Xu committed
4
5
6
7
8
9
 * This source code is subject to the terms of the BSD 2 Clause License and
 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
 * was not distributed with this source code in the LICENSE file, you can
 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
 * Media Patent License 1.0 was not distributed with this source code in the
 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
Jingning Han's avatar
Jingning Han committed
10
11
12
13
 */

#include <assert.h>

14
15
16
17
18
19
20
#include "av1/common/common.h"
#include "av1/common/entropy.h"
#include "av1/common/entropymode.h"
#include "av1/common/entropymv.h"
#include "av1/common/mvref_common.h"
#include "av1/common/pred_common.h"
#include "av1/common/reconinter.h"
hui su's avatar
hui su committed
21
22
23
#if CONFIG_EXT_INTRA
#include "av1/common/reconintra.h"
#endif  // CONFIG_EXT_INTRA
24
#include "av1/common/seg_common.h"
Yue Chen's avatar
Yue Chen committed
25
26
27
#if CONFIG_WARPED_MOTION
#include "av1/common/warped_motion.h"
#endif  // CONFIG_WARPED_MOTION
28
29

#include "av1/decoder/decodeframe.h"
Jingning Han's avatar
Jingning Han committed
30
#include "av1/decoder/decodemv.h"
31

Yaowu Xu's avatar
Yaowu Xu committed
32
#include "aom_dsp/aom_dsp_common.h"
33

Michael Bebenita's avatar
Michael Bebenita committed
34
#define ACCT_STR __func__
35
#if CONFIG_EXT_INTRA || CONFIG_FILTER_INTRA || CONFIG_PALETTE
Yaowu Xu's avatar
Yaowu Xu committed
36
static INLINE int read_uniform(aom_reader *r, int n) {
hui su's avatar
hui su committed
37
38
  int l = get_unsigned_bits(n);
  int m = (1 << l) - n;
Michael Bebenita's avatar
Michael Bebenita committed
39
  int v = aom_read_literal(r, l - 1, ACCT_STR);
hui su's avatar
hui su committed
40
41
42
43
44
45

  assert(l != 0);

  if (v < m)
    return v;
  else
Michael Bebenita's avatar
Michael Bebenita committed
46
    return (v << 1) - m + aom_read_literal(r, 1, ACCT_STR);
hui su's avatar
hui su committed
47
}
48
#endif  // CONFIG_EXT_INTRA || CONFIG_FILTER_INTRA || CONFIG_PALETTE
hui su's avatar
hui su committed
49

50
#if CONFIG_EC_MULTISYMBOL
51
static PREDICTION_MODE read_intra_mode(aom_reader *r, aom_cdf_prob *cdf) {
52
53
54
  return (PREDICTION_MODE)
      av1_intra_mode_inv[aom_read_symbol(r, cdf, INTRA_MODES, ACCT_STR)];
}
55
#else
Yaowu Xu's avatar
Yaowu Xu committed
56
static PREDICTION_MODE read_intra_mode(aom_reader *r, const aom_prob *p) {
Michael Bebenita's avatar
Michael Bebenita committed
57
  return (PREDICTION_MODE)aom_read_tree(r, av1_intra_mode_tree, p, ACCT_STR);
Jingning Han's avatar
Jingning Han committed
58
}
59
#endif
Jingning Han's avatar
Jingning Han committed
60

61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#if CONFIG_DELTA_Q
static int read_delta_qindex(AV1_COMMON *cm, MACROBLOCKD *xd, aom_reader *r,
                             MB_MODE_INFO *const mbmi, int mi_col, int mi_row) {
  FRAME_COUNTS *counts = xd->counts;
  int sign, abs, reduced_delta_qindex = 0;
  BLOCK_SIZE bsize = mbmi->sb_type;
  const int b_col = mi_col & MAX_MIB_MASK;
  const int b_row = mi_row & MAX_MIB_MASK;
  const int read_delta_q_flag = (b_col == 0 && b_row == 0);
  int rem_bits, thr, bit = 1;

  if ((bsize != BLOCK_64X64 || mbmi->skip == 0) && read_delta_q_flag) {
    abs = 0;
    while (abs < DELTA_Q_SMALL && bit) {
      bit = aom_read(r, cm->fc->delta_q_prob[abs], ACCT_STR);
      if (counts) counts->delta_q[abs][bit]++;
      abs += bit;
    }
    if (abs == DELTA_Q_SMALL) {
      rem_bits = aom_read_literal(r, 3, ACCT_STR);
      thr = (1 << rem_bits) + 1;
      abs = aom_read_literal(r, rem_bits, ACCT_STR) + thr;
    }

    if (abs) {
      sign = aom_read_bit(r, ACCT_STR);
    } else {
      sign = 1;
    }

    reduced_delta_qindex = sign ? -abs : abs;
  }
  return reduced_delta_qindex;
}
#endif

Yaowu Xu's avatar
Yaowu Xu committed
97
98
static PREDICTION_MODE read_intra_mode_y(AV1_COMMON *cm, MACROBLOCKD *xd,
                                         aom_reader *r, int size_group) {
Jingning Han's avatar
Jingning Han committed
99
  const PREDICTION_MODE y_mode =
100
#if CONFIG_EC_MULTISYMBOL
101
      read_intra_mode(r, cm->fc->y_mode_cdf[size_group]);
102
#else
Jingning Han's avatar
Jingning Han committed
103
      read_intra_mode(r, cm->fc->y_mode_prob[size_group]);
104
#endif
Jingning Han's avatar
Jingning Han committed
105
  FRAME_COUNTS *counts = xd->counts;
106
  if (counts) ++counts->y_mode[size_group][y_mode];
Jingning Han's avatar
Jingning Han committed
107
108
109
  return y_mode;
}

Yaowu Xu's avatar
Yaowu Xu committed
110
111
static PREDICTION_MODE read_intra_mode_uv(AV1_COMMON *cm, MACROBLOCKD *xd,
                                          aom_reader *r,
Jingning Han's avatar
Jingning Han committed
112
                                          PREDICTION_MODE y_mode) {
113
  const PREDICTION_MODE uv_mode =
114
#if CONFIG_EC_MULTISYMBOL
115
116
      read_intra_mode(r, cm->fc->uv_mode_cdf[y_mode]);
#else
117
      read_intra_mode(r, cm->fc->uv_mode_prob[y_mode]);
118
#endif
Jingning Han's avatar
Jingning Han committed
119
  FRAME_COUNTS *counts = xd->counts;
120
  if (counts) ++counts->uv_mode[y_mode][uv_mode];
Jingning Han's avatar
Jingning Han committed
121
122
123
  return uv_mode;
}

124
#if CONFIG_EXT_INTER
Yaowu Xu's avatar
Yaowu Xu committed
125
126
127
static INTERINTRA_MODE read_interintra_mode(AV1_COMMON *cm, MACROBLOCKD *xd,
                                            aom_reader *r, int size_group) {
  const INTERINTRA_MODE ii_mode = (INTERINTRA_MODE)aom_read_tree(
Michael Bebenita's avatar
Michael Bebenita committed
128
129
      r, av1_interintra_mode_tree, cm->fc->interintra_mode_prob[size_group],
      ACCT_STR);
130
  FRAME_COUNTS *counts = xd->counts;
131
  if (counts) ++counts->interintra_mode[size_group][ii_mode];
132
133
134
135
  return ii_mode;
}
#endif  // CONFIG_EXT_INTER

Yaowu Xu's avatar
Yaowu Xu committed
136
static PREDICTION_MODE read_inter_mode(AV1_COMMON *cm, MACROBLOCKD *xd,
Yue Chen's avatar
Yue Chen committed
137
138
139
#if CONFIG_REF_MV && CONFIG_EXT_INTER
                                       MB_MODE_INFO *mbmi,
#endif
Yaowu Xu's avatar
Yaowu Xu committed
140
                                       aom_reader *r, int16_t ctx) {
141
142
#if CONFIG_REF_MV
  FRAME_COUNTS *counts = xd->counts;
143
  int16_t mode_ctx = ctx & NEWMV_CTX_MASK;
Yaowu Xu's avatar
Yaowu Xu committed
144
  aom_prob mode_prob = cm->fc->newmv_prob[mode_ctx];
145

Michael Bebenita's avatar
Michael Bebenita committed
146
  if (aom_read(r, mode_prob, ACCT_STR) == 0) {
147
    if (counts) ++counts->newmv_mode[mode_ctx][0];
Yue Chen's avatar
Yue Chen committed
148
149
150
151

#if CONFIG_EXT_INTER
    if (has_second_ref(mbmi)) {
#endif  // CONFIG_EXT_INTER
152
      return NEWMV;
Yue Chen's avatar
Yue Chen committed
153
154
155
#if CONFIG_EXT_INTER
    } else {
      mode_prob = cm->fc->new2mv_prob;
Michael Bebenita's avatar
Michael Bebenita committed
156
      if (aom_read(r, mode_prob, ACCT_STR) == 0) {
157
        if (counts) ++counts->new2mv_mode[0];
Yue Chen's avatar
Yue Chen committed
158
159
        return NEWMV;
      } else {
160
        if (counts) ++counts->new2mv_mode[1];
Yue Chen's avatar
Yue Chen committed
161
162
163
164
        return NEWFROMNEARMV;
      }
    }
#endif  // CONFIG_EXT_INTER
165
  }
166
  if (counts) ++counts->newmv_mode[mode_ctx][1];
167

168
  if (ctx & (1 << ALL_ZERO_FLAG_OFFSET)) return ZEROMV;
169

170
  mode_ctx = (ctx >> ZEROMV_OFFSET) & ZEROMV_CTX_MASK;
171
172

  mode_prob = cm->fc->zeromv_prob[mode_ctx];
Michael Bebenita's avatar
Michael Bebenita committed
173
  if (aom_read(r, mode_prob, ACCT_STR) == 0) {
174
    if (counts) ++counts->zeromv_mode[mode_ctx][0];
175
176
    return ZEROMV;
  }
177
  if (counts) ++counts->zeromv_mode[mode_ctx][1];
178

179
  mode_ctx = (ctx >> REFMV_OFFSET) & REFMV_CTX_MASK;
180

181
182
183
  if (ctx & (1 << SKIP_NEARESTMV_OFFSET)) mode_ctx = 6;
  if (ctx & (1 << SKIP_NEARMV_OFFSET)) mode_ctx = 7;
  if (ctx & (1 << SKIP_NEARESTMV_SUB8X8_OFFSET)) mode_ctx = 8;
184

185
  mode_prob = cm->fc->refmv_prob[mode_ctx];
186

Michael Bebenita's avatar
Michael Bebenita committed
187
  if (aom_read(r, mode_prob, ACCT_STR) == 0) {
188
    if (counts) ++counts->refmv_mode[mode_ctx][0];
189

190
191
    return NEARESTMV;
  } else {
192
    if (counts) ++counts->refmv_mode[mode_ctx][1];
193
194
195
196
197
    return NEARMV;
  }

  // Invalid prediction mode.
  assert(0);
198
#else
199
#if CONFIG_EC_MULTISYMBOL
200
201
  const int mode = av1_inter_mode_inv[aom_read_symbol(
      r, cm->fc->inter_mode_cdf[ctx], INTER_MODES, ACCT_STR)];
202
#else
Michael Bebenita's avatar
Michael Bebenita committed
203
204
  const int mode = aom_read_tree(r, av1_inter_mode_tree,
                                 cm->fc->inter_mode_probs[ctx], ACCT_STR);
205
#endif
Jingning Han's avatar
Jingning Han committed
206
  FRAME_COUNTS *counts = xd->counts;
207
  if (counts) ++counts->inter_mode[ctx][mode];
Jingning Han's avatar
Jingning Han committed
208
209

  return NEARESTMV + mode;
210
#endif
Jingning Han's avatar
Jingning Han committed
211
212
}

213
#if CONFIG_REF_MV
Yaowu Xu's avatar
Yaowu Xu committed
214
215
216
static void read_drl_idx(const AV1_COMMON *cm, MACROBLOCKD *xd,
                         MB_MODE_INFO *mbmi, aom_reader *r) {
  uint8_t ref_frame_type = av1_ref_frame_type(mbmi->ref_frame);
217
218
  mbmi->ref_mv_idx = 0;

219
220
221
222
  if (mbmi->mode == NEWMV) {
    int idx;
    for (idx = 0; idx < 2; ++idx) {
      if (xd->ref_mv_count[ref_frame_type] > idx + 1) {
Yaowu Xu's avatar
Yaowu Xu committed
223
224
        uint8_t drl_ctx = av1_drl_ctx(xd->ref_mv_stack[ref_frame_type], idx);
        aom_prob drl_prob = cm->fc->drl_prob[drl_ctx];
Michael Bebenita's avatar
Michael Bebenita committed
225
        if (!aom_read(r, drl_prob, ACCT_STR)) {
226
          mbmi->ref_mv_idx = idx;
227
          if (xd->counts) ++xd->counts->drl_mode[drl_ctx][0];
228
229
230
          return;
        }
        mbmi->ref_mv_idx = idx + 1;
231
        if (xd->counts) ++xd->counts->drl_mode[drl_ctx][1];
232
233
234
235
      }
    }
  }

236
237
238
239
240
241
242
  if (mbmi->mode == NEARMV) {
    int idx;
    // Offset the NEARESTMV mode.
    // TODO(jingning): Unify the two syntax decoding loops after the NEARESTMV
    // mode is factored in.
    for (idx = 1; idx < 3; ++idx) {
      if (xd->ref_mv_count[ref_frame_type] > idx + 1) {
Yaowu Xu's avatar
Yaowu Xu committed
243
244
        uint8_t drl_ctx = av1_drl_ctx(xd->ref_mv_stack[ref_frame_type], idx);
        aom_prob drl_prob = cm->fc->drl_prob[drl_ctx];
Michael Bebenita's avatar
Michael Bebenita committed
245
        if (!aom_read(r, drl_prob, ACCT_STR)) {
246
          mbmi->ref_mv_idx = idx - 1;
247
          if (xd->counts) ++xd->counts->drl_mode[drl_ctx][0];
248
249
          return;
        }
250
        mbmi->ref_mv_idx = idx;
251
        if (xd->counts) ++xd->counts->drl_mode[drl_ctx][1];
252
253
254
255
256
257
      }
    }
  }
}
#endif

Yaowu Xu's avatar
Yaowu Xu committed
258
259
260
#if CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION
static MOTION_MODE read_motion_mode(AV1_COMMON *cm, MACROBLOCKD *xd,
                                    MB_MODE_INFO *mbmi, aom_reader *r) {
Yue Chen's avatar
Yue Chen committed
261
262
263
  MOTION_MODE last_motion_mode_allowed = motion_mode_allowed(mbmi);
  int motion_mode;
  FRAME_COUNTS *counts = xd->counts;
Yaowu Xu's avatar
Yaowu Xu committed
264

Yue Chen's avatar
Yue Chen committed
265
266
267
268
269
270
271
272
  if (last_motion_mode_allowed == SIMPLE_TRANSLATION) return SIMPLE_TRANSLATION;
#if CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION
  if (last_motion_mode_allowed == OBMC_CAUSAL) {
    motion_mode = aom_read(r, cm->fc->obmc_prob[mbmi->sb_type], ACCT_STR);
    if (counts) ++counts->obmc[mbmi->sb_type][motion_mode];
    return (MOTION_MODE)(SIMPLE_TRANSLATION + motion_mode);
  } else {
#endif  // CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION
Yaowu Xu's avatar
Yaowu Xu committed
273
274
275
276
277
    motion_mode =
        aom_read_tree(r, av1_motion_mode_tree,
                      cm->fc->motion_mode_prob[mbmi->sb_type], ACCT_STR);
    if (counts) ++counts->motion_mode[mbmi->sb_type][motion_mode];
    return (MOTION_MODE)(SIMPLE_TRANSLATION + motion_mode);
Yue Chen's avatar
Yue Chen committed
278
#if CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION
Yaowu Xu's avatar
Yaowu Xu committed
279
  }
Yue Chen's avatar
Yue Chen committed
280
#endif  // CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION
Yaowu Xu's avatar
Yaowu Xu committed
281
282
283
}
#endif  // CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION

284
#if CONFIG_EXT_INTER
Yaowu Xu's avatar
Yaowu Xu committed
285
286
static PREDICTION_MODE read_inter_compound_mode(AV1_COMMON *cm, MACROBLOCKD *xd,
                                                aom_reader *r, int16_t ctx) {
Michael Bebenita's avatar
Michael Bebenita committed
287
288
289
  const int mode =
      aom_read_tree(r, av1_inter_compound_mode_tree,
                    cm->fc->inter_compound_mode_probs[ctx], ACCT_STR);
290
291
  FRAME_COUNTS *counts = xd->counts;

292
  if (counts) ++counts->inter_compound_mode[ctx][mode];
293
294
295
296
297
298

  assert(is_inter_compound_mode(NEAREST_NEARESTMV + mode));
  return NEAREST_NEARESTMV + mode;
}
#endif  // CONFIG_EXT_INTER

299
static int read_segment_id(aom_reader *r, struct segmentation_probs *segp) {
300
#if CONFIG_EC_MULTISYMBOL
Michael Bebenita's avatar
Michael Bebenita committed
301
  return aom_read_symbol(r, segp->tree_cdf, MAX_SEGMENTS, ACCT_STR);
302
#else
Michael Bebenita's avatar
Michael Bebenita committed
303
  return aom_read_tree(r, av1_segment_tree, segp->tree_probs, ACCT_STR);
304
#endif
Jingning Han's avatar
Jingning Han committed
305
306
}

307
#if CONFIG_VAR_TX
Yaowu Xu's avatar
Yaowu Xu committed
308
static void read_tx_size_vartx(AV1_COMMON *cm, MACROBLOCKD *xd,
309
                               MB_MODE_INFO *mbmi, FRAME_COUNTS *counts,
310
311
                               TX_SIZE tx_size, int depth, int blk_row,
                               int blk_col, aom_reader *r) {
312
  int is_split = 0;
313
314
  const int tx_row = blk_row >> 1;
  const int tx_col = blk_col >> 1;
315
316
  const int max_blocks_high = max_block_high(xd, mbmi->sb_type, 0);
  const int max_blocks_wide = max_block_wide(xd, mbmi->sb_type, 0);
317
  int ctx = txfm_partition_context(xd->above_txfm_context + tx_col,
318
319
                                   xd->left_txfm_context + tx_row,
                                   mbmi->sb_type, tx_size);
clang-format's avatar
clang-format committed
320
  TX_SIZE(*const inter_tx_size)
321
322
323
  [MAX_MIB_SIZE] =
      (TX_SIZE(*)[MAX_MIB_SIZE]) & mbmi->inter_tx_size[tx_row][tx_col];
  if (blk_row >= max_blocks_high || blk_col >= max_blocks_wide) return;
324

Jingning Han's avatar
Jingning Han committed
325
  if (depth == MAX_VARTX_DEPTH) {
326
327
    int idx, idy;
    inter_tx_size[0][0] = tx_size;
328
329
    for (idy = 0; idy < tx_size_high_unit[tx_size] / 2; ++idy)
      for (idx = 0; idx < tx_size_wide_unit[tx_size] / 2; ++idx)
330
331
        inter_tx_size[idy][idx] = tx_size;
    mbmi->tx_size = tx_size;
332
    mbmi->min_tx_size = AOMMIN(mbmi->min_tx_size, get_min_tx_size(tx_size));
333
334
    if (counts) ++counts->txfm_partition[ctx][0];
    txfm_partition_update(xd->above_txfm_context + tx_col,
335
                          xd->left_txfm_context + tx_row, tx_size, tx_size);
336
337
338
    return;
  }

Michael Bebenita's avatar
Michael Bebenita committed
339
  is_split = aom_read(r, cm->fc->txfm_partition_prob[ctx], ACCT_STR);
340
341

  if (is_split) {
342
343
    const TX_SIZE sub_txs = sub_tx_size_map[tx_size];
    const int bsl = tx_size_wide_unit[sub_txs];
344
    int i;
345

346
    if (counts) ++counts->txfm_partition[ctx][1];
347

348
    if (tx_size == TX_8X8) {
349
      int idx, idy;
350
      inter_tx_size[0][0] = TX_4X4;
351
352
      for (idy = 0; idy < tx_size_high_unit[tx_size] / 2; ++idy)
        for (idx = 0; idx < tx_size_wide_unit[tx_size] / 2; ++idx)
353
          inter_tx_size[idy][idx] = inter_tx_size[0][0];
354
      mbmi->tx_size = TX_4X4;
355
      mbmi->min_tx_size = get_min_tx_size(mbmi->tx_size);
356
      txfm_partition_update(xd->above_txfm_context + tx_col,
357
                            xd->left_txfm_context + tx_row, TX_4X4, tx_size);
358
359
360
361
362
      return;
    }

    assert(bsl > 0);
    for (i = 0; i < 4; ++i) {
363
364
365
      int offsetr = blk_row + (i >> 1) * bsl;
      int offsetc = blk_col + (i & 0x01) * bsl;
      read_tx_size_vartx(cm, xd, mbmi, counts, sub_txs, depth + 1, offsetr,
366
                         offsetc, r);
367
368
    }
  } else {
369
    int idx, idy;
370
    inter_tx_size[0][0] = tx_size;
371
372
    for (idy = 0; idy < tx_size_high_unit[tx_size] / 2; ++idy)
      for (idx = 0; idx < tx_size_wide_unit[tx_size] / 2; ++idx)
373
374
        inter_tx_size[idy][idx] = tx_size;
    mbmi->tx_size = tx_size;
375
    mbmi->min_tx_size = AOMMIN(mbmi->min_tx_size, get_min_tx_size(tx_size));
376
    if (counts) ++counts->txfm_partition[ctx][0];
377
    txfm_partition_update(xd->above_txfm_context + tx_col,
378
                          xd->left_txfm_context + tx_row, tx_size, tx_size);
379
380
381
382
  }
}
#endif

Yaowu Xu's avatar
Yaowu Xu committed
383
384
static TX_SIZE read_selected_tx_size(AV1_COMMON *cm, MACROBLOCKD *xd,
                                     int tx_size_cat, aom_reader *r) {
Jingning Han's avatar
Jingning Han committed
385
386
  FRAME_COUNTS *counts = xd->counts;
  const int ctx = get_tx_size_context(xd);
387
388
389
  int depth = aom_read_tree(r, av1_tx_size_tree[tx_size_cat],
                            cm->fc->tx_size_probs[tx_size_cat][ctx], ACCT_STR);
  TX_SIZE tx_size = depth_to_tx_size(depth);
390
  if (counts) ++counts->tx_size[tx_size_cat][ctx][depth];
391
  return tx_size;
Jingning Han's avatar
Jingning Han committed
392
393
}

Yaowu Xu's avatar
Yaowu Xu committed
394
395
static TX_SIZE read_tx_size_intra(AV1_COMMON *cm, MACROBLOCKD *xd,
                                  aom_reader *r) {
Jingning Han's avatar
Jingning Han committed
396
397
  TX_MODE tx_mode = cm->tx_mode;
  BLOCK_SIZE bsize = xd->mi[0]->mbmi.sb_type;
398
  if (xd->lossless[xd->mi[0]->mbmi.segment_id]) return TX_4X4;
399
400
  if (bsize >= BLOCK_8X8) {
    if (tx_mode == TX_MODE_SELECT) {
401
402
403
404
      const TX_SIZE tx_size =
          read_selected_tx_size(cm, xd, intra_tx_size_cat_lookup[bsize], r);
      assert(tx_size <= max_txsize_lookup[bsize]);
      return tx_size;
405
    } else {
406
      return tx_size_from_tx_mode(bsize, cm->tx_mode, 0);
407
408
409
410
411
412
    }
  } else {
    return TX_4X4;
  }
}

Yaowu Xu's avatar
Yaowu Xu committed
413
414
static TX_SIZE read_tx_size_inter(AV1_COMMON *cm, MACROBLOCKD *xd,
                                  int allow_select, aom_reader *r) {
415
416
  TX_MODE tx_mode = cm->tx_mode;
  BLOCK_SIZE bsize = xd->mi[0]->mbmi.sb_type;
417
  if (xd->lossless[xd->mi[0]->mbmi.segment_id]) return TX_4X4;
418
419
420
#if CONFIG_CB4X4 && CONFIG_VAR_TX
  if (bsize > BLOCK_4X4) {
#else
421
  if (bsize >= BLOCK_8X8) {
422
#endif
423
    if (allow_select && tx_mode == TX_MODE_SELECT) {
424
425
      const TX_SIZE coded_tx_size =
          read_selected_tx_size(cm, xd, inter_tx_size_cat_lookup[bsize], r);
426
#if CONFIG_EXT_TX && CONFIG_RECT_TX
427
428
429
430
      if (coded_tx_size > max_txsize_lookup[bsize]) {
        assert(coded_tx_size == max_txsize_lookup[bsize] + 1);
        return max_txsize_rect_lookup[bsize];
      }
431
432
433
#else
      assert(coded_tx_size <= max_txsize_lookup[bsize]);
#endif  // CONFIG_EXT_TX && CONFIG_RECT_TX
434
      return coded_tx_size;
435
    } else {
436
      return tx_size_from_tx_mode(bsize, cm->tx_mode, 1);
437
438
    }
  } else {
439
#if CONFIG_EXT_TX && CONFIG_RECT_TX
Debargha Mukherjee's avatar
Debargha Mukherjee committed
440
    assert(IMPLIES(tx_mode == ONLY_4X4, bsize == BLOCK_4X4));
441
442
443
    return max_txsize_rect_lookup[bsize];
#else
    return TX_4X4;
444
#endif
445
  }
Jingning Han's avatar
Jingning Han committed
446
447
}

Yaowu Xu's avatar
Yaowu Xu committed
448
static int dec_get_segment_id(const AV1_COMMON *cm, const uint8_t *segment_ids,
Jingning Han's avatar
Jingning Han committed
449
450
451
452
453
                              int mi_offset, int x_mis, int y_mis) {
  int x, y, segment_id = INT_MAX;

  for (y = 0; y < y_mis; y++)
    for (x = 0; x < x_mis; x++)
454
      segment_id =
Yaowu Xu's avatar
Yaowu Xu committed
455
          AOMMIN(segment_id, segment_ids[mi_offset + y * cm->mi_cols + x]);
Jingning Han's avatar
Jingning Han committed
456
457
458
459
460

  assert(segment_id >= 0 && segment_id < MAX_SEGMENTS);
  return segment_id;
}

Yaowu Xu's avatar
Yaowu Xu committed
461
static void set_segment_id(AV1_COMMON *cm, int mi_offset, int x_mis, int y_mis,
462
                           int segment_id) {
Jingning Han's avatar
Jingning Han committed
463
464
465
466
467
468
469
470
471
  int x, y;

  assert(segment_id >= 0 && segment_id < MAX_SEGMENTS);

  for (y = 0; y < y_mis; y++)
    for (x = 0; x < x_mis; x++)
      cm->current_frame_seg_map[mi_offset + y * cm->mi_cols + x] = segment_id;
}

Yaowu Xu's avatar
Yaowu Xu committed
472
static int read_intra_segment_id(AV1_COMMON *const cm, MACROBLOCKD *const xd,
473
                                 int mi_offset, int x_mis, int y_mis,
Yaowu Xu's avatar
Yaowu Xu committed
474
                                 aom_reader *r) {
Jingning Han's avatar
Jingning Han committed
475
  struct segmentation *const seg = &cm->seg;
476
477
  FRAME_COUNTS *counts = xd->counts;
  struct segmentation_probs *const segp = &cm->fc->seg;
Jingning Han's avatar
Jingning Han committed
478
479
  int segment_id;

480
  if (!seg->enabled) return 0;  // Default for disabled segmentation
Jingning Han's avatar
Jingning Han committed
481

482
  assert(seg->update_map && !seg->temporal_update);
Jingning Han's avatar
Jingning Han committed
483

484
  segment_id = read_segment_id(r, segp);
485
  if (counts) ++counts->seg.tree_total[segment_id];
Jingning Han's avatar
Jingning Han committed
486
487
488
489
  set_segment_id(cm, mi_offset, x_mis, y_mis, segment_id);
  return segment_id;
}

Yaowu Xu's avatar
Yaowu Xu committed
490
static void copy_segment_id(const AV1_COMMON *cm,
491
492
493
                            const uint8_t *last_segment_ids,
                            uint8_t *current_segment_ids, int mi_offset,
                            int x_mis, int y_mis) {
494
495
496
497
  int x, y;

  for (y = 0; y < y_mis; y++)
    for (x = 0; x < x_mis; x++)
498
499
500
      current_segment_ids[mi_offset + y * cm->mi_cols + x] =
          last_segment_ids ? last_segment_ids[mi_offset + y * cm->mi_cols + x]
                           : 0;
501
502
}

Yaowu Xu's avatar
Yaowu Xu committed
503
504
static int read_inter_segment_id(AV1_COMMON *const cm, MACROBLOCKD *const xd,
                                 int mi_row, int mi_col, aom_reader *r) {
Jingning Han's avatar
Jingning Han committed
505
  struct segmentation *const seg = &cm->seg;
506
507
  FRAME_COUNTS *counts = xd->counts;
  struct segmentation_probs *const segp = &cm->fc->seg;
Jingning Han's avatar
Jingning Han committed
508
509
510
  MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
  int predicted_segment_id, segment_id;
  const int mi_offset = mi_row * cm->mi_cols + mi_col;
511
512
  const int bw = mi_size_wide[mbmi->sb_type];
  const int bh = mi_size_high[mbmi->sb_type];
Jingning Han's avatar
Jingning Han committed
513
514

  // TODO(slavarnway): move x_mis, y_mis into xd ?????
Yaowu Xu's avatar
Yaowu Xu committed
515
516
  const int x_mis = AOMMIN(cm->mi_cols - mi_col, bw);
  const int y_mis = AOMMIN(cm->mi_rows - mi_row, bh);
Jingning Han's avatar
Jingning Han committed
517

518
  if (!seg->enabled) return 0;  // Default for disabled segmentation
Jingning Han's avatar
Jingning Han committed
519

520
521
522
523
  predicted_segment_id = cm->last_frame_seg_map
                             ? dec_get_segment_id(cm, cm->last_frame_seg_map,
                                                  mi_offset, x_mis, y_mis)
                             : 0;
Jingning Han's avatar
Jingning Han committed
524
525
526
527
528
529
530
531

  if (!seg->update_map) {
    copy_segment_id(cm, cm->last_frame_seg_map, cm->current_frame_seg_map,
                    mi_offset, x_mis, y_mis);
    return predicted_segment_id;
  }

  if (seg->temporal_update) {
Yaowu Xu's avatar
Yaowu Xu committed
532
533
    const int ctx = av1_get_pred_context_seg_id(xd);
    const aom_prob pred_prob = segp->pred_probs[ctx];
Michael Bebenita's avatar
Michael Bebenita committed
534
    mbmi->seg_id_predicted = aom_read(r, pred_prob, ACCT_STR);
535
    if (counts) ++counts->seg.pred[ctx][mbmi->seg_id_predicted];
536
537
538
539
    if (mbmi->seg_id_predicted) {
      segment_id = predicted_segment_id;
    } else {
      segment_id = read_segment_id(r, segp);
540
      if (counts) ++counts->seg.tree_mispred[segment_id];
541
    }
Jingning Han's avatar
Jingning Han committed
542
  } else {
543
    segment_id = read_segment_id(r, segp);
544
    if (counts) ++counts->seg.tree_total[segment_id];
Jingning Han's avatar
Jingning Han committed
545
546
547
548
549
  }
  set_segment_id(cm, mi_offset, x_mis, y_mis, segment_id);
  return segment_id;
}

Yaowu Xu's avatar
Yaowu Xu committed
550
551
static int read_skip(AV1_COMMON *cm, const MACROBLOCKD *xd, int segment_id,
                     aom_reader *r) {
Jingning Han's avatar
Jingning Han committed
552
553
554
  if (segfeature_active(&cm->seg, segment_id, SEG_LVL_SKIP)) {
    return 1;
  } else {
Yaowu Xu's avatar
Yaowu Xu committed
555
    const int ctx = av1_get_skip_context(xd);
Michael Bebenita's avatar
Michael Bebenita committed
556
    const int skip = aom_read(r, cm->fc->skip_probs[ctx], ACCT_STR);
Jingning Han's avatar
Jingning Han committed
557
    FRAME_COUNTS *counts = xd->counts;
558
    if (counts) ++counts->skip[ctx][skip];
Jingning Han's avatar
Jingning Han committed
559
560
561
562
    return skip;
  }
}

563
#if CONFIG_PALETTE
Yaowu Xu's avatar
Yaowu Xu committed
564
565
static void read_palette_mode_info(AV1_COMMON *const cm, MACROBLOCKD *const xd,
                                   aom_reader *r) {
hui su's avatar
hui su committed
566
567
  MODE_INFO *const mi = xd->mi[0];
  MB_MODE_INFO *const mbmi = &mi->mbmi;
568
  const MODE_INFO *const above_mi = xd->above_mi;
569
  const MODE_INFO *const left_mi = xd->left_mi;
hui su's avatar
hui su committed
570
  const BLOCK_SIZE bsize = mbmi->sb_type;
571
572
573
574
575
576
577
578
  int i, n, palette_ctx = 0;
  PALETTE_MODE_INFO *const pmi = &mbmi->palette_mode_info;

  if (mbmi->mode == DC_PRED) {
    if (above_mi)
      palette_ctx += (above_mi->mbmi.palette_mode_info.palette_size[0] > 0);
    if (left_mi)
      palette_ctx += (left_mi->mbmi.palette_mode_info.palette_size[0] > 0);
Michael Bebenita's avatar
Michael Bebenita committed
579
580
581
    if (aom_read(
            r, av1_default_palette_y_mode_prob[bsize - BLOCK_8X8][palette_ctx],
            ACCT_STR)) {
582
      pmi->palette_size[0] =
Yaowu Xu's avatar
Yaowu Xu committed
583
          aom_read_tree(r, av1_palette_size_tree,
Michael Bebenita's avatar
Michael Bebenita committed
584
585
                        av1_default_palette_y_size_prob[bsize - BLOCK_8X8],
                        ACCT_STR) +
586
          2;
587
588
      n = pmi->palette_size[0];
      for (i = 0; i < n; ++i)
Michael Bebenita's avatar
Michael Bebenita committed
589
        pmi->palette_colors[i] = aom_read_literal(r, cm->bit_depth, ACCT_STR);
hui su's avatar
hui su committed
590

591
592
593
594
      xd->plane[0].color_index_map[0] = read_uniform(r, n);
      assert(xd->plane[0].color_index_map[0] < n);
    }
  }
hui su's avatar
hui su committed
595

596
  if (mbmi->uv_mode == DC_PRED) {
Michael Bebenita's avatar
Michael Bebenita committed
597
598
    if (aom_read(r, av1_default_palette_uv_mode_prob[pmi->palette_size[0] > 0],
                 ACCT_STR)) {
599
      pmi->palette_size[1] =
Yaowu Xu's avatar
Yaowu Xu committed
600
          aom_read_tree(r, av1_palette_size_tree,
Michael Bebenita's avatar
Michael Bebenita committed
601
602
                        av1_default_palette_uv_size_prob[bsize - BLOCK_8X8],
                        ACCT_STR) +
603
          2;
604
605
606
      n = pmi->palette_size[1];
      for (i = 0; i < n; ++i) {
        pmi->palette_colors[PALETTE_MAX_SIZE + i] =
Michael Bebenita's avatar
Michael Bebenita committed
607
            aom_read_literal(r, cm->bit_depth, ACCT_STR);
608
        pmi->palette_colors[2 * PALETTE_MAX_SIZE + i] =
Michael Bebenita's avatar
Michael Bebenita committed
609
            aom_read_literal(r, cm->bit_depth, ACCT_STR);
610
611
612
613
      }
      xd->plane[1].color_index_map[0] = read_uniform(r, n);
      assert(xd->plane[1].color_index_map[0] < n);
    }
hui su's avatar
hui su committed
614
615
  }
}
616
#endif  // CONFIG_PALETTE
hui su's avatar
hui su committed
617

618
619
620
#if CONFIG_FILTER_INTRA
static void read_filter_intra_mode_info(AV1_COMMON *const cm,
                                        MACROBLOCKD *const xd, aom_reader *r) {
hui su's avatar
hui su committed
621
622
623
  MODE_INFO *const mi = xd->mi[0];
  MB_MODE_INFO *const mbmi = &mi->mbmi;
  FRAME_COUNTS *counts = xd->counts;
624
625
  FILTER_INTRA_MODE_INFO *filter_intra_mode_info =
      &mbmi->filter_intra_mode_info;
hui su's avatar
hui su committed
626

627
628
629
630
631
  if (mbmi->mode == DC_PRED
#if CONFIG_PALETTE
      && mbmi->palette_mode_info.palette_size[0] == 0
#endif  // CONFIG_PALETTE
      ) {
632
633
634
635
    filter_intra_mode_info->use_filter_intra_mode[0] =
        aom_read(r, cm->fc->filter_intra_probs[0], ACCT_STR);
    if (filter_intra_mode_info->use_filter_intra_mode[0]) {
      filter_intra_mode_info->filter_intra_mode[0] =
hui su's avatar
hui su committed
636
          read_uniform(r, FILTER_INTRA_MODES);
hui su's avatar
hui su committed
637
    }
638
639
640
641
    if (counts) {
      ++counts->filter_intra[0]
                            [filter_intra_mode_info->use_filter_intra_mode[0]];
    }
hui su's avatar
hui su committed
642
  }
643
644
645
646
647
  if (mbmi->uv_mode == DC_PRED
#if CONFIG_PALETTE
      && mbmi->palette_mode_info.palette_size[1] == 0
#endif  // CONFIG_PALETTE
      ) {
648
649
650
651
    filter_intra_mode_info->use_filter_intra_mode[1] =
        aom_read(r, cm->fc->filter_intra_probs[1], ACCT_STR);
    if (filter_intra_mode_info->use_filter_intra_mode[1]) {
      filter_intra_mode_info->filter_intra_mode[1] =
hui su's avatar
hui su committed
652
          read_uniform(r, FILTER_INTRA_MODES);
hui su's avatar
hui su committed
653
    }
654
655
656
657
    if (counts) {
      ++counts->filter_intra[1]
                            [filter_intra_mode_info->use_filter_intra_mode[1]];
    }
hui su's avatar
hui su committed
658
659
  }
}
660
#endif  // CONFIG_FILTER_INTRA
661

662
#if CONFIG_EXT_INTRA
Yaowu Xu's avatar
Yaowu Xu committed
663
664
static void read_intra_angle_info(AV1_COMMON *const cm, MACROBLOCKD *const xd,
                                  aom_reader *r) {
665
666
  MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
  const BLOCK_SIZE bsize = mbmi->sb_type;
hui su's avatar
hui su committed
667
#if CONFIG_INTRA_INTERP
Yaowu Xu's avatar
Yaowu Xu committed
668
  const int ctx = av1_get_pred_context_intra_interp(xd);
669
  int p_angle;
hui su's avatar
hui su committed
670
#endif  // CONFIG_INTRA_INTERP
671

hui su's avatar
hui su committed
672
  (void)cm;
673
  if (bsize < BLOCK_8X8) return;
674

hui su's avatar
hui su committed
675
676
  if (av1_is_directional_mode(mbmi->mode, bsize)) {
    const int max_angle_delta = av1_get_max_angle_delta(mbmi->sb_type, 0);
677
    mbmi->angle_delta[0] =
hui su's avatar
hui su committed
678
        read_uniform(r, 2 * max_angle_delta + 1) - max_angle_delta;
hui su's avatar
hui su committed
679
#if CONFIG_INTRA_INTERP
hui su's avatar
hui su committed
680
681
    p_angle = mode_to_angle_map[mbmi->mode] +
              mbmi->angle_delta[0] * av1_get_angle_step(mbmi->sb_type, 0);
Yaowu Xu's avatar
Yaowu Xu committed
682
    if (av1_is_intra_filter_switchable(p_angle)) {
683
      FRAME_COUNTS *counts = xd->counts;
Michael Bebenita's avatar
Michael Bebenita committed
684
685
      mbmi->intra_filter = aom_read_tree(
          r, av1_intra_filter_tree, cm->fc->intra_filter_probs[ctx], ACCT_STR);
686
      if (counts) ++counts->intra_filter[ctx][mbmi->intra_filter];
687
688
689
    } else {
      mbmi->intra_filter = INTRA_FILTER_LINEAR;
    }
hui su's avatar
hui su committed
690
#endif  // CONFIG_INTRA_INTERP
691
692
  }

hui su's avatar
hui su committed
693
  if (av1_is_directional_mode(mbmi->uv_mode, bsize)) {
694
    mbmi->angle_delta[1] =
hui su's avatar
hui su committed
695
        read_uniform(r, 2 * MAX_ANGLE_DELTA_UV + 1) - MAX_ANGLE_DELTA_UV;
696
697
  }
}
hui su's avatar
hui su committed
698
699
#endif  // CONFIG_EXT_INTRA

Jingning Han's avatar
Jingning Han committed
700
701
702
703
704
705
706
static void read_tx_type(const AV1_COMMON *const cm, MACROBLOCKD *xd,
                         MB_MODE_INFO *mbmi,
#if CONFIG_SUPERTX
                         int supertx_enabled,
#endif
                         aom_reader *r) {
  const int inter_block = is_inter_block(mbmi);
707
708
709
#if CONFIG_VAR_TX
  const TX_SIZE tx_size = inter_block ? mbmi->min_tx_size : mbmi->tx_size;
#else
Jingning Han's avatar
Jingning Han committed
710
  const TX_SIZE tx_size = mbmi->tx_size;
711
#endif
Jingning Han's avatar
Jingning Han committed
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
  if (!FIXED_TX_TYPE) {
#if CONFIG_EXT_TX
    if (get_ext_tx_types(tx_size, mbmi->sb_type, inter_block) > 1 &&
        cm->base_qindex > 0 && !mbmi->skip &&
#if CONFIG_SUPERTX
        !supertx_enabled &&
#endif  // CONFIG_SUPERTX
        !segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP)) {
      int eset = get_ext_tx_set(tx_size, mbmi->sb_type, inter_block);
      FRAME_COUNTS *counts = xd->counts;

      if (inter_block) {
        if (eset > 0) {
          mbmi->tx_type = aom_read_tree(
              r, av1_ext_tx_inter_tree[eset],
              cm->fc->inter_ext_tx_prob[eset][txsize_sqr_map[tx_size]],
              ACCT_STR);
          if (counts)
            ++counts->inter_ext_tx[eset][txsize_sqr_map[tx_size]]
                                  [mbmi->tx_type];
        }
      } else if (ALLOW_INTRA_EXT_TX) {
        if (eset > 0) {
          mbmi->tx_type = aom_read_tree(
              r, av1_ext_tx_intra_tree[eset],
              cm->fc->intra_ext_tx_prob[eset][tx_size][mbmi->mode], ACCT_STR);
          if (counts)
            ++counts->intra_ext_tx[eset][tx_size][mbmi->mode][mbmi->tx_type];
        }
      }
    } else {
      mbmi->tx_type = DCT_DCT;
    }
#else
    if (tx_size < TX_32X32 && cm->base_qindex > 0 && !mbmi->skip &&
#if CONFIG_SUPERTX
        !supertx_enabled &&
#endif  // CONFIG_SUPERTX
        !segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP)) {
      FRAME_COUNTS *counts = xd->counts;
      if (inter_block) {
753
#if CONFIG_EC_MULTISYMBOL
Jingning Han's avatar
Jingning Han committed
754
755
756
757
758
759
760
761
762
        mbmi->tx_type = av1_ext_tx_inv[aom_read_symbol(
            r, cm->fc->inter_ext_tx_cdf[tx_size], TX_TYPES, ACCT_STR)];
#else
        mbmi->tx_type = aom_read_tree(
            r, av1_ext_tx_tree, cm->fc->inter_ext_tx_prob[tx_size], ACCT_STR);
#endif
        if (counts) ++counts->inter_ext_tx[tx_size][mbmi->tx_type];
      } else {
        const TX_TYPE tx_type_nom = intra_mode_to_tx_type_context[mbmi->mode];
763
#if CONFIG_EC_MULTISYMBOL
Jingning Han's avatar
Jingning Han committed
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
        mbmi->tx_type = av1_ext_tx_inv[aom_read_symbol(
            r, cm->fc->intra_ext_tx_cdf[tx_size][tx_type_nom], TX_TYPES,
            ACCT_STR)];
#else
        mbmi->tx_type = aom_read_tree(
            r, av1_ext_tx_tree, cm->fc->intra_ext_tx_prob[tx_size][tx_type_nom],
            ACCT_STR);
#endif
        if (counts) ++counts->intra_ext_tx[tx_size][tx_type_nom][mbmi->tx_type];
      }
    } else {
      mbmi->tx_type = DCT_DCT;
    }
#endif  // CONFIG_EXT_TX
  }
}

Yaowu Xu's avatar
Yaowu Xu committed
781
static void read_intra_frame_mode_info(AV1_COMMON *const cm,
782
                                       MACROBLOCKD *const xd, int mi_row,
Yaowu Xu's avatar
Yaowu Xu committed
783
                                       int mi_col, aom_reader *r) {
Jingning Han's avatar
Jingning Han committed
784
785
786
  MODE_INFO *const mi = xd->mi[0];
  MB_MODE_INFO *const mbmi = &mi->mbmi;
  const MODE_INFO *above_mi = xd->above_mi;
787
  const MODE_INFO *left_mi = xd->left_mi;
Jingning Han's avatar
Jingning Han committed
788
789
790
  const BLOCK_SIZE bsize = mbmi->sb_type;
  int i;
  const int mi_offset = mi_row * cm->mi_cols + mi_col;
791
792
  const int bw = mi_size_wide[bsize];
  const int bh = mi_size_high[bsize];
Jingning Han's avatar
Jingning Han committed
793
794

  // TODO(slavarnway): move x_mis, y_mis into xd ?????
Yaowu Xu's avatar
Yaowu Xu committed
795
796
  const int x_mis = AOMMIN(cm->mi_cols - mi_col, bw);
  const int y_mis = AOMMIN(cm->mi_rows - mi_row, bh);
Jingning Han's avatar
Jingning Han committed
797

798
  mbmi->segment_id = read_intra_segment_id(cm, xd, mi_offset, x_mis, y_mis, r);
Jingning Han's avatar
Jingning Han committed
799
  mbmi->skip = read_skip(cm, xd, mbmi->segment_id, r);
800
801
802

#if CONFIG_DELTA_Q
  if (cm->delta_q_present_flag) {
803
804
805
806
    xd->current_qindex =
        xd->prev_qindex +
        read_delta_qindex(cm, xd, r, mbmi, mi_col, mi_row) * cm->delta_q_res;
    xd->prev_qindex = xd->current_qindex;
807
808
809
  }
#endif

810
  mbmi->tx_size = read_tx_size_intra(cm, xd, r);
Jingning Han's avatar
Jingning Han committed
811
812
813
  mbmi->ref_frame[0] = INTRA_FRAME;
  mbmi->ref_frame[1] = NONE;

814
815
816
#if CONFIG_CB4X4
  (void)i;
  mbmi->mode =
817
#if CONFIG_EC_MULTISYMBOL
818
      read_intra_mode(r, get_y_mode_cdf(cm, mi, above_mi, left_mi, 0));
819
820
#else
      read_intra_mode(r, get_y_mode_probs(cm, mi, above_mi, left_mi, 0));
821
#endif
822
#else
Jingning Han's avatar
Jingning Han committed
823
824
825
826
  switch (bsize) {
    case BLOCK_4X4:
      for (i = 0; i < 4; ++i)
        mi->bmi[i].as_mode =
827
#if CONFIG_EC_MULTISYMBOL
828
            read_intra_mode(r, get_y_mode_cdf(cm, mi, above_mi, left_mi, i));
829
#else
830
            read_intra_mode(r, get_y_mode_probs(cm, mi, above_mi, left_mi, i));
831
#endif
Jingning Han's avatar
Jingning Han committed
832
833
834
835
      mbmi->mode = mi->bmi[3].as_mode;
      break;
    case BLOCK_4X8:
      mi->bmi[0].as_mode = mi->bmi[2].as_mode =
836
#if CONFIG_EC_MULTISYMBOL
837
          read_intra_mode(r, get_y_mode_cdf(cm, mi, above_mi, left_mi, 0));
838
#else
839
          read_intra_mode(r, get_y_mode_probs(cm, mi, above_mi, left_mi, 0));
840
#endif
Jingning Han's avatar
Jingning Han committed
841
      mi->bmi[1].as_mode = mi->bmi[3].as_mode = mbmi->mode =
842
#if CONFIG_EC_MULTISYMBOL
843
          read_intra_mode(r, get_y_mode_cdf(cm, mi, above_mi, left_mi, 1));
844
#else
845
          read_intra_mode(r, get_y_mode_probs(cm, mi, above_mi, left_mi, 1));
846
#endif
Jingning Han's avatar
Jingning Han committed
847
848
849
      break;
    case BLOCK_8X4:
      mi->bmi[0].as_mode = mi->bmi[1].as_mode =
850
#if CONFIG_EC_MULTISYMBOL
851
          read_intra_mode(r, get_y_mode_cdf(cm, mi, above_mi, left_mi, 0));
852
#else
853
          read_intra_mode(r, get_y_mode_probs(cm, mi, above_mi, left_mi, 0));
854
#endif
Jingning Han's avatar
Jingning Han committed
855
      mi->bmi[2].as_mode = mi->bmi[3].as_mode = mbmi->mode =
856
#if CONFIG_EC_MULTISYMBOL
857
          read_intra_mode(r, get_y_mode_cdf(cm, mi, above_mi, left_mi, 2));
858
#else
859
          read_intra_mode(r, get_y_mode_probs(cm, mi, above_mi, left_mi, 2));
860
#endif
Jingning Han's avatar
Jingning Han committed
861
862
      break;
    default:
863
      mbmi->mode =
864
#if CONFIG_EC_MULTISYMBOL
865
          read_intra_mode(r, get_y_mode_cdf(cm, mi, above_mi, left_mi, 0));
866
#else
867
          read_intra_mode(r, get_y_mode_probs(cm, mi, above_mi, left_mi, 0));
868
#endif
Jingning Han's avatar
Jingning Han committed
869
  }
870
#endif
Jingning Han's avatar
Jingning Han committed
871

872
  mbmi->uv_mode = read_intra_mode_uv(cm, xd, r, mbmi->mode);
hui su's avatar
hui su committed
873
#if CONFIG_EXT_INTRA
874
875
  read_intra_angle_info(cm, xd, r);
#endif  // CONFIG_EXT_INTRA
876
#if CONFIG_PALETTE
hui su's avatar
hui su committed
877
878
  mbmi->palette_mode_info.palette_size[0] = 0;
  mbmi->palette_mode_info.palette_size[1] = 0;
879
  if (bsize >= BLOCK_8X8 && cm->allow_screen_content_tools)
hui su's avatar
hui su committed
880
    read_palette_mode_info(cm, xd, r);
881
#endif  // CONFIG_PALETTE
882
883
884
885
886
#if CONFIG_FILTER_INTRA
  mbmi->filter_intra_mode_info.use_filter_intra_mode[0] = 0;
  mbmi->filter_intra_mode_info.use_filter_intra_mode[1] = 0;
  if (bsize >= BLOCK_8X8) read_filter_intra_mode_info(cm, xd, r);
#endif  // CONFIG_FILTER_INTRA
hui su's avatar
hui su committed