decodemv.c 71.8 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_DAALA_EC
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
60
61
62
63
64
65
#if CONFIG_EC_MULTISYMBOL
static PREDICTION_MODE read_intra_mode_cdf(aom_reader *r, aom_cdf_prob *cdf) {
  return (PREDICTION_MODE)
      av1_intra_mode_inv[aom_read_symbol(r, cdf, INTRA_MODES, ACCT_STR)];
}
#endif
Jingning Han's avatar
Jingning Han committed
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
97
98
99
100
101
102
#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
103
104
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
105
  const PREDICTION_MODE y_mode =
106
107
#if CONFIG_EC_MULTISYMBOL
      read_intra_mode_cdf(r, cm->fc->y_mode_cdf[size_group]);
108
#else
Jingning Han's avatar
Jingning Han committed
109
      read_intra_mode(r, cm->fc->y_mode_prob[size_group]);
110
#endif
Jingning Han's avatar
Jingning Han committed
111
  FRAME_COUNTS *counts = xd->counts;
112
  if (counts) ++counts->y_mode[size_group][y_mode];
Jingning Han's avatar
Jingning Han committed
113
114
115
  return y_mode;
}

Yaowu Xu's avatar
Yaowu Xu committed
116
117
static PREDICTION_MODE read_intra_mode_uv(AV1_COMMON *cm, MACROBLOCKD *xd,
                                          aom_reader *r,
Jingning Han's avatar
Jingning Han committed
118
                                          PREDICTION_MODE y_mode) {
119
  const PREDICTION_MODE uv_mode =
120
121
122
#if CONFIG_DAALA_EC
      read_intra_mode(r, cm->fc->uv_mode_cdf[y_mode]);
#else
123
      read_intra_mode(r, cm->fc->uv_mode_prob[y_mode]);
124
#endif
Jingning Han's avatar
Jingning Han committed
125
  FRAME_COUNTS *counts = xd->counts;
126
  if (counts) ++counts->uv_mode[y_mode][uv_mode];
Jingning Han's avatar
Jingning Han committed
127
128
129
  return uv_mode;
}

130
#if CONFIG_EXT_INTER
Yaowu Xu's avatar
Yaowu Xu committed
131
132
133
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
134
135
      r, av1_interintra_mode_tree, cm->fc->interintra_mode_prob[size_group],
      ACCT_STR);
136
  FRAME_COUNTS *counts = xd->counts;
137
  if (counts) ++counts->interintra_mode[size_group][ii_mode];
138
139
140
141
  return ii_mode;
}
#endif  // CONFIG_EXT_INTER

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

Michael Bebenita's avatar
Michael Bebenita committed
152
  if (aom_read(r, mode_prob, ACCT_STR) == 0) {
153
    if (counts) ++counts->newmv_mode[mode_ctx][0];
Yue Chen's avatar
Yue Chen committed
154
155
156
157

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

174
  if (ctx & (1 << ALL_ZERO_FLAG_OFFSET)) return ZEROMV;
175

176
  mode_ctx = (ctx >> ZEROMV_OFFSET) & ZEROMV_CTX_MASK;
177
178

  mode_prob = cm->fc->zeromv_prob[mode_ctx];
Michael Bebenita's avatar
Michael Bebenita committed
179
  if (aom_read(r, mode_prob, ACCT_STR) == 0) {
180
    if (counts) ++counts->zeromv_mode[mode_ctx][0];
181
182
    return ZEROMV;
  }
183
  if (counts) ++counts->zeromv_mode[mode_ctx][1];
184

185
  mode_ctx = (ctx >> REFMV_OFFSET) & REFMV_CTX_MASK;
186

187
188
189
  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;
190

191
  mode_prob = cm->fc->refmv_prob[mode_ctx];
192

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

196
197
    return NEARESTMV;
  } else {
198
    if (counts) ++counts->refmv_mode[mode_ctx][1];
199
200
201
202
203
    return NEARMV;
  }

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

  return NEARESTMV + mode;
216
#endif
Jingning Han's avatar
Jingning Han committed
217
218
}

219
#if CONFIG_REF_MV
Yaowu Xu's avatar
Yaowu Xu committed
220
221
222
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);
223
224
  mbmi->ref_mv_idx = 0;

225
226
227
228
  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
229
230
        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
231
        if (!aom_read(r, drl_prob, ACCT_STR)) {
232
          mbmi->ref_mv_idx = idx;
233
          if (xd->counts) ++xd->counts->drl_mode[drl_ctx][0];
234
235
236
          return;
        }
        mbmi->ref_mv_idx = idx + 1;
237
        if (xd->counts) ++xd->counts->drl_mode[drl_ctx][1];
238
239
240
241
      }
    }
  }

242
243
244
245
246
247
248
  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
249
250
        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
251
        if (!aom_read(r, drl_prob, ACCT_STR)) {
252
          mbmi->ref_mv_idx = idx - 1;
253
          if (xd->counts) ++xd->counts->drl_mode[drl_ctx][0];
254
255
          return;
        }
256
        mbmi->ref_mv_idx = idx;
257
        if (xd->counts) ++xd->counts->drl_mode[drl_ctx][1];
258
259
260
261
262
263
      }
    }
  }
}
#endif

Yaowu Xu's avatar
Yaowu Xu committed
264
265
266
#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
267
268
269
  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
270

Yue Chen's avatar
Yue Chen committed
271
272
273
274
275
276
277
278
  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
279
280
281
282
283
    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
284
#if CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION
Yaowu Xu's avatar
Yaowu Xu committed
285
  }
Yue Chen's avatar
Yue Chen committed
286
#endif  // CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION
Yaowu Xu's avatar
Yaowu Xu committed
287
288
289
}
#endif  // CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION

290
#if CONFIG_EXT_INTER
Yaowu Xu's avatar
Yaowu Xu committed
291
292
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
293
294
295
  const int mode =
      aom_read_tree(r, av1_inter_compound_mode_tree,
                    cm->fc->inter_compound_mode_probs[ctx], ACCT_STR);
296
297
  FRAME_COUNTS *counts = xd->counts;

298
  if (counts) ++counts->inter_compound_mode[ctx][mode];
299
300
301
302
303
304

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

305
static int read_segment_id(aom_reader *r, struct segmentation_probs *segp) {
306
#if CONFIG_EC_MULTISYMBOL
Michael Bebenita's avatar
Michael Bebenita committed
307
  return aom_read_symbol(r, segp->tree_cdf, MAX_SEGMENTS, ACCT_STR);
308
#else
Michael Bebenita's avatar
Michael Bebenita committed
309
  return aom_read_tree(r, av1_segment_tree, segp->tree_probs, ACCT_STR);
310
#endif
Jingning Han's avatar
Jingning Han committed
311
312
}

313
#if CONFIG_VAR_TX
Yaowu Xu's avatar
Yaowu Xu committed
314
static void read_tx_size_vartx(AV1_COMMON *cm, MACROBLOCKD *xd,
315
                               MB_MODE_INFO *mbmi, FRAME_COUNTS *counts,
316
317
                               TX_SIZE tx_size, int depth, int blk_row,
                               int blk_col, aom_reader *r) {
318
  int is_split = 0;
319
320
  const int tx_row = blk_row >> 1;
  const int tx_col = blk_col >> 1;
321
322
  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);
323
  int ctx = txfm_partition_context(xd->above_txfm_context + tx_col,
324
325
                                   xd->left_txfm_context + tx_row,
                                   mbmi->sb_type, tx_size);
clang-format's avatar
clang-format committed
326
  TX_SIZE(*const inter_tx_size)
327
328
329
  [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;
330

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

Michael Bebenita's avatar
Michael Bebenita committed
345
  is_split = aom_read(r, cm->fc->txfm_partition_prob[ctx], ACCT_STR);
346
347

  if (is_split) {
348
349
    const TX_SIZE sub_txs = sub_tx_size_map[tx_size];
    const int bsl = tx_size_wide_unit[sub_txs];
350
    int i;
351

352
    if (counts) ++counts->txfm_partition[ctx][1];
353

354
    if (tx_size == TX_8X8) {
355
356
      inter_tx_size[0][0] = TX_4X4;
      mbmi->tx_size = TX_4X4;
357
      mbmi->min_tx_size = get_min_tx_size(mbmi->tx_size);
358
359
      txfm_partition_update(xd->above_txfm_context + tx_col,
                            xd->left_txfm_context + tx_row, TX_4X4);
360
361
362
363
364
      return;
    }

    assert(bsl > 0);
    for (i = 0; i < 4; ++i) {
365
366
367
      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,
368
                         offsetc, r);
369
370
    }
  } else {
371
    int idx, idy;
372
    inter_tx_size[0][0] = tx_size;
373
374
    for (idy = 0; idy < tx_size_high_unit[tx_size] / 2; ++idy)
      for (idx = 0; idx < tx_size_wide_unit[tx_size] / 2; ++idx)
375
376
        inter_tx_size[idy][idx] = tx_size;
    mbmi->tx_size = tx_size;
377
    mbmi->min_tx_size = AOMMIN(mbmi->min_tx_size, get_min_tx_size(tx_size));
378
    if (counts) ++counts->txfm_partition[ctx][0];
379
380
    txfm_partition_update(xd->above_txfm_context + tx_col,
                          xd->left_txfm_context + tx_row, tx_size);
381
382
383
384
  }
}
#endif

Yaowu Xu's avatar
Yaowu Xu committed
385
386
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
387
388
  FRAME_COUNTS *counts = xd->counts;
  const int ctx = get_tx_size_context(xd);
389
390
391
  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);
392
  if (counts) ++counts->tx_size[tx_size_cat][ctx][depth];
393
  return tx_size;
Jingning Han's avatar
Jingning Han committed
394
395
}

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

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

Yaowu Xu's avatar
Yaowu Xu committed
446
static int dec_get_segment_id(const AV1_COMMON *cm, const uint8_t *segment_ids,
Jingning Han's avatar
Jingning Han committed
447
448
449
450
451
                              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++)
452
      segment_id =
Yaowu Xu's avatar
Yaowu Xu committed
453
          AOMMIN(segment_id, segment_ids[mi_offset + y * cm->mi_cols + x]);
Jingning Han's avatar
Jingning Han committed
454
455
456
457
458

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

Yaowu Xu's avatar
Yaowu Xu committed
459
static void set_segment_id(AV1_COMMON *cm, int mi_offset, int x_mis, int y_mis,
460
                           int segment_id) {
Jingning Han's avatar
Jingning Han committed
461
462
463
464
465
466
467
468
469
  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
470
static int read_intra_segment_id(AV1_COMMON *const cm, MACROBLOCKD *const xd,
471
                                 int mi_offset, int x_mis, int y_mis,
Yaowu Xu's avatar
Yaowu Xu committed
472
                                 aom_reader *r) {
Jingning Han's avatar
Jingning Han committed
473
  struct segmentation *const seg = &cm->seg;
474
475
  FRAME_COUNTS *counts = xd->counts;
  struct segmentation_probs *const segp = &cm->fc->seg;
Jingning Han's avatar
Jingning Han committed
476
477
  int segment_id;

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

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

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

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

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

Yaowu Xu's avatar
Yaowu Xu committed
501
502
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
503
  struct segmentation *const seg = &cm->seg;
504
505
  FRAME_COUNTS *counts = xd->counts;
  struct segmentation_probs *const segp = &cm->fc->seg;
Jingning Han's avatar
Jingning Han committed
506
507
508
  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;
509
510
  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
511
512

  // TODO(slavarnway): move x_mis, y_mis into xd ?????
Yaowu Xu's avatar
Yaowu Xu committed
513
514
  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
515

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

518
519
520
521
  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
522
523
524
525
526
527
528
529

  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
530
531
    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
532
    mbmi->seg_id_predicted = aom_read(r, pred_prob, ACCT_STR);
533
    if (counts) ++counts->seg.pred[ctx][mbmi->seg_id_predicted];
534
535
536
537
    if (mbmi->seg_id_predicted) {
      segment_id = predicted_segment_id;
    } else {
      segment_id = read_segment_id(r, segp);
538
      if (counts) ++counts->seg.tree_mispred[segment_id];
539
    }
Jingning Han's avatar
Jingning Han committed
540
  } else {
541
    segment_id = read_segment_id(r, segp);
542
    if (counts) ++counts->seg.tree_total[segment_id];
Jingning Han's avatar
Jingning Han committed
543
544
545
546
547
  }
  set_segment_id(cm, mi_offset, x_mis, y_mis, segment_id);
  return segment_id;
}

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

561
#if CONFIG_PALETTE
Yaowu Xu's avatar
Yaowu Xu committed
562
563
static void read_palette_mode_info(AV1_COMMON *const cm, MACROBLOCKD *const xd,
                                   aom_reader *r) {
hui su's avatar
hui su committed
564
565
  MODE_INFO *const mi = xd->mi[0];
  MB_MODE_INFO *const mbmi = &mi->mbmi;
566
  const MODE_INFO *const above_mi = xd->above_mi;
567
  const MODE_INFO *const left_mi = xd->left_mi;
hui su's avatar
hui su committed
568
  const BLOCK_SIZE bsize = mbmi->sb_type;
569
570
571
572
573
574
575
576
  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
577
578
579
    if (aom_read(
            r, av1_default_palette_y_mode_prob[bsize - BLOCK_8X8][palette_ctx],
            ACCT_STR)) {
580
      pmi->palette_size[0] =
Yaowu Xu's avatar
Yaowu Xu committed
581
          aom_read_tree(r, av1_palette_size_tree,
Michael Bebenita's avatar
Michael Bebenita committed
582
583
                        av1_default_palette_y_size_prob[bsize - BLOCK_8X8],
                        ACCT_STR) +
584
          2;
585
586
      n = pmi->palette_size[0];
      for (i = 0; i < n; ++i)
Michael Bebenita's avatar
Michael Bebenita committed
587
        pmi->palette_colors[i] = aom_read_literal(r, cm->bit_depth, ACCT_STR);
hui su's avatar
hui su committed
588

589
590
591
592
      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
593

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

616
617
618
#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
619
620
621
  MODE_INFO *const mi = xd->mi[0];
  MB_MODE_INFO *const mbmi = &mi->mbmi;
  FRAME_COUNTS *counts = xd->counts;
622
623
  FILTER_INTRA_MODE_INFO *filter_intra_mode_info =
      &mbmi->filter_intra_mode_info;
hui su's avatar
hui su committed
624

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

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

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

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

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

Jingning Han's avatar
Jingning Han committed
698
699
700
701
702
703
704
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);
705
706
707
#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
708
  const TX_SIZE tx_size = mbmi->tx_size;
709
#endif
Jingning Han's avatar
Jingning Han committed
710
711
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
  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) {
751
#if CONFIG_EC_MULTISYMBOL
Jingning Han's avatar
Jingning Han committed
752
753
754
755
756
757
758
759
760
        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];
761
#if CONFIG_EC_MULTISYMBOL
Jingning Han's avatar
Jingning Han committed
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
        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
779
static void read_intra_frame_mode_info(AV1_COMMON *const cm,
780
                                       MACROBLOCKD *const xd, int mi_row,
Yaowu Xu's avatar
Yaowu Xu committed
781
                                       int mi_col, aom_reader *r) {
Jingning Han's avatar
Jingning Han committed
782
783
784
  MODE_INFO *const mi = xd->mi[0];
  MB_MODE_INFO *const mbmi = &mi->mbmi;
  const MODE_INFO *above_mi = xd->above_mi;
785
  const MODE_INFO *left_mi = xd->left_mi;
Jingning Han's avatar
Jingning Han committed
786
787
788
  const BLOCK_SIZE bsize = mbmi->sb_type;
  int i;
  const int mi_offset = mi_row * cm->mi_cols + mi_col;
789
790
  const int bw = mi_size_wide[bsize];
  const int bh = mi_size_high[bsize];
Jingning Han's avatar
Jingning Han committed
791
792

  // TODO(slavarnway): move x_mis, y_mis into xd ?????
Yaowu Xu's avatar
Yaowu Xu committed
793
794
  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
795

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

#if CONFIG_DELTA_Q
  if (cm->delta_q_present_flag) {
801
802
803
804
    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;
805
806
807
  }
#endif

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

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

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

Jingning Han's avatar
Jingning Han committed
886
887
888
  read_tx_type(cm, xd, mbmi,
#if CONFIG_SUPERTX
               0,
889
#endif
Jingning Han's avatar
Jingning Han committed
890
               r);
Jingning Han's avatar
Jingning Han committed
891
892
}

893
static int read_mv_component(aom_reader *r, nmv_component *mvcomp, int usehp) {
Jingning Han's avatar
Jingning Han committed
894
  int mag, d, fr, hp;
Michael Bebenita's avatar
Michael Bebenita committed
895
896
  const int sign = aom_read(r, mvcomp->sign, ACCT_STR);
  const int mv_class =
897
#if CONFIG_EC_MULTISYMBOL
898
899
      aom_read_symbol(r, mvcomp->class_cdf, MV_CLASSES, ACCT_STR);
#else
Michael Bebenita's avatar
Michael Bebenita committed
900
      aom_read_tree(r, av1_mv_class_tree, mvcomp->classes, ACCT_STR);
901
#endif
Jingning Han's avatar
Jingning Han committed
902
903
904
905
  const int class0 = mv_class == MV_CLASS_0;

  // Integer part
  if (class0) {
906
    d = aom_read(r, mvcomp->class0[0], ACCT_STR);