detokenize.c 15.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
#include "./aom_config.h"
13
#if !CONFIG_PVQ
Yaowu Xu's avatar
Yaowu Xu committed
14
#include "aom_mem/aom_mem.h"
15
#include "aom_ports/mem.h"
16
17
#endif  // !CONFIG_PVQ

18
#include "av1/common/blockd.h"
19

20
21
#define ACCT_STR __func__

22
#if !CONFIG_PVQ || CONFIG_VAR_TX
23
24
25
26
#include "av1/common/common.h"
#include "av1/common/entropy.h"
#include "av1/common/idct.h"
#include "av1/decoder/detokenize.h"
Jingning Han's avatar
Jingning Han committed
27

28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#define EOB_CONTEXT_NODE 0
#define ZERO_CONTEXT_NODE 1
#define ONE_CONTEXT_NODE 2
#define LOW_VAL_CONTEXT_NODE 0
#define TWO_CONTEXT_NODE 1
#define THREE_CONTEXT_NODE 2
#define HIGH_LOW_CONTEXT_NODE 3
#define CAT_ONE_CONTEXT_NODE 4
#define CAT_THREEFOUR_CONTEXT_NODE 5
#define CAT_THREE_CONTEXT_NODE 6
#define CAT_FIVE_CONTEXT_NODE 7

#define INCREMENT_COUNT(token)                   \
  do {                                           \
    if (counts) ++coef_counts[band][ctx][token]; \
Jingning Han's avatar
Jingning Han committed
43
44
  } while (0)

Yaowu Xu's avatar
Yaowu Xu committed
45
static INLINE int read_coeff(const aom_prob *probs, int n, aom_reader *r) {
Jingning Han's avatar
Jingning Han committed
46
  int i, val = 0;
Michael Bebenita's avatar
Michael Bebenita committed
47
  for (i = 0; i < n; ++i) val = (val << 1) | aom_read(r, probs[i], ACCT_STR);
Jingning Han's avatar
Jingning Han committed
48
49
50
  return val;
}

51
52
static int decode_coefs(MACROBLOCKD *xd, PLANE_TYPE type, tran_low_t *dqcoeff,
                        TX_SIZE tx_size, TX_TYPE tx_type, const int16_t *dq,
53
54
55
#if CONFIG_NEW_QUANT
                        dequant_val_type_nuq *dq_val,
#endif  // CONFIG_NEW_QUANT
56
57
#if CONFIG_AOM_QM
                        const qm_val_t *iqm[2][TX_SIZES],
58
#endif  // CONFIG_AOM_QM
59
60
                        int ctx, const int16_t *scan, const int16_t *nb,
                        int16_t *max_scan_line, aom_reader *r) {
Jingning Han's avatar
Jingning Han committed
61
  FRAME_COUNTS *counts = xd->counts;
62
63
64
65
66
#if CONFIG_EC_ADAPT
  FRAME_CONTEXT *ec_ctx = xd->tile_ctx;
#else
  FRAME_CONTEXT *const ec_ctx = xd->fc;
#endif
67
  const int max_eob = tx_size_2d[tx_size];
Jingning Han's avatar
Jingning Han committed
68
  const int ref = is_inter_block(&xd->mi[0]->mbmi);
69
70
#if CONFIG_AOM_QM
  const qm_val_t *iqmatrix = iqm[!ref][tx_size];
71
#endif  // CONFIG_AOM_QM
Jingning Han's avatar
Jingning Han committed
72
  int band, c = 0;
73
  const int tx_size_ctx = txsize_sqr_map[tx_size];
74
#if CONFIG_NEW_TOKENSET
75
  aom_cdf_prob(*coef_head_cdfs)[COEFF_CONTEXTS][CDF_SIZE(ENTROPY_TOKENS)] =
76
      ec_ctx->coef_head_cdfs[tx_size_ctx][type][ref];
77
  aom_cdf_prob(*coef_tail_cdfs)[COEFF_CONTEXTS][CDF_SIZE(ENTROPY_TOKENS)] =
78
      ec_ctx->coef_tail_cdfs[tx_size_ctx][type][ref];
79
80
  aom_cdf_prob(*cdf_head)[CDF_SIZE(ENTROPY_TOKENS)];
  aom_cdf_prob(*cdf_tail)[CDF_SIZE(ENTROPY_TOKENS)];
81
  int val = 0;
82
#if !CONFIG_EC_ADAPT
83
  unsigned int *blockz_count;
84
#endif
85
86
87
88
#else
  aom_prob(*coef_probs)[COEFF_CONTEXTS][UNCONSTRAINED_NODES] =
      ec_ctx->coef_probs[tx_size_ctx][type][ref];
  const aom_prob *prob;
89
#if CONFIG_EC_MULTISYMBOL
90
  aom_cdf_prob(*coef_cdfs)[COEFF_CONTEXTS][CDF_SIZE(ENTROPY_TOKENS)] =
91
      ec_ctx->coef_cdfs[tx_size_ctx][type][ref];
92
  aom_cdf_prob(*cdf)[CDF_SIZE(ENTROPY_TOKENS)];
93
#endif  // CONFIG_EC_MULTISYMBOL
94
#endif  // CONFIG_NEW_TOKENSET
Thomas Davies's avatar
Thomas Davies committed
95
  unsigned int(*coef_counts)[COEFF_CONTEXTS][UNCONSTRAINED_NODES + 1] = NULL;
96
  unsigned int(*eob_branch_count)[COEFF_CONTEXTS] = NULL;
97
  uint8_t token_cache[MAX_TX_SQUARE];
Jingning Han's avatar
Jingning Han committed
98
  const uint8_t *band_translate = get_band_translate(tx_size);
99
  int dq_shift;
Jingning Han's avatar
Jingning Han committed
100
101
  int v, token;
  int16_t dqv = dq[0];
102
103
104
#if CONFIG_NEW_QUANT
  const tran_low_t *dqv_val = &dq_val[0][0];
#endif  // CONFIG_NEW_QUANT
105
  (void)tx_type;
106
107
108
#if CONFIG_AOM_QM
  (void)iqmatrix;
#endif  // CONFIG_AOM_QM
Jingning Han's avatar
Jingning Han committed
109
110

  if (counts) {
111
112
    coef_counts = counts->coef[tx_size_ctx][type][ref];
    eob_branch_count = counts->eob_branch[tx_size_ctx][type][ref];
113
#if CONFIG_NEW_TOKENSET && !CONFIG_EC_ADAPT
114
115
    blockz_count = counts->blockz_count[tx_size_ctx][type][ref][ctx];
#endif
Jingning Han's avatar
Jingning Han committed
116
117
  }

118
  dq_shift = get_tx_scale(tx_size);
119

120
#if CONFIG_NEW_TOKENSET
121
122
  band = *band_translate++;

Jingning Han's avatar
Jingning Han committed
123
  while (c < max_eob) {
124
125
    int more_data;
    int comb_token;
126
    int last_pos = (c + 1 == max_eob);
127
    int first_pos = (c == 0);
Jingning Han's avatar
Jingning Han committed
128

129
130
131
132
#if CONFIG_NEW_QUANT
    dqv_val = &dq_val[band][0];
#endif  // CONFIG_NEW_QUANT

133
134
    cdf_head = &coef_head_cdfs[band][ctx];
    cdf_tail = &coef_tail_cdfs[band][ctx];
135
136
137
138
139
    comb_token = last_pos ? 2 * aom_read_bit(r, ACCT_STR) + 2
                          : aom_read_symbol(r, *cdf_head,
                                            HEAD_TOKENS + first_pos, ACCT_STR) +
                                !first_pos;
    if (first_pos) {
140
#if !CONFIG_EC_ADAPT
141
      if (counts) ++blockz_count[comb_token != 0];
142
#endif
143
144
145
      if (comb_token == 0) return 0;
    }
    token = comb_token >> 1;
146
147
148
149
150
151
152
153
154
155
    more_data = comb_token & 1;
    if (counts && !last_pos) {
#if !CONFIG_EC_ADAPT
      ++coef_counts[band][ctx][token];
#endif
      if (token) {
        ++eob_branch_count[band][ctx];
        if (!more_data) ++coef_counts[band][ctx][EOB_MODEL_TOKEN];
      }
    }
156

157
    if (token > ONE_TOKEN)
158
      token += aom_read_symbol(r, *cdf_tail, TAIL_TOKENS, ACCT_STR);
159
#if CONFIG_NEW_QUANT
160
    dqv_val = &dq_val[band][0];
161
#endif  // CONFIG_NEW_QUANT
162
163
164

    *max_scan_line = AOMMAX(*max_scan_line, scan[c]);

165
    token_cache[scan[c]] = av1_pt_energy_class[token];
166

Alex Converse's avatar
Alex Converse committed
167
    switch (token) {
168
      case ZERO_TOKEN:
Alex Converse's avatar
Alex Converse committed
169
170
171
172
173
      case ONE_TOKEN:
      case TWO_TOKEN:
      case THREE_TOKEN:
      case FOUR_TOKEN: val = token; break;
      case CATEGORY1_TOKEN:
174
        val = CAT1_MIN_VAL + read_coeff(av1_cat1_prob, 1, r);
Alex Converse's avatar
Alex Converse committed
175
176
        break;
      case CATEGORY2_TOKEN:
177
        val = CAT2_MIN_VAL + read_coeff(av1_cat2_prob, 2, r);
Alex Converse's avatar
Alex Converse committed
178
179
        break;
      case CATEGORY3_TOKEN:
180
        val = CAT3_MIN_VAL + read_coeff(av1_cat3_prob, 3, r);
Alex Converse's avatar
Alex Converse committed
181
182
        break;
      case CATEGORY4_TOKEN:
183
        val = CAT4_MIN_VAL + read_coeff(av1_cat4_prob, 4, r);
Alex Converse's avatar
Alex Converse committed
184
185
        break;
      case CATEGORY5_TOKEN:
186
        val = CAT5_MIN_VAL + read_coeff(av1_cat5_prob, 5, r);
Alex Converse's avatar
Alex Converse committed
187
188
189
        break;
      case CATEGORY6_TOKEN: {
#if CONFIG_AOM_HIGHBITDEPTH
190
191
        const int skip_bits = (int)sizeof(av1_cat6_prob) -
                              av1_get_cat6_extrabits_size(tx_size, xd->bd);
Alex Converse's avatar
Alex Converse committed
192
#else
193
194
        const int skip_bits = (int)sizeof(av1_cat6_prob) -
                              av1_get_cat6_extrabits_size(tx_size, 8);
Alex Converse's avatar
Alex Converse committed
195
#endif
196
197
        val = CAT6_MIN_VAL +
              read_coeff(av1_cat6_prob + skip_bits, 18 - skip_bits, r);
Alex Converse's avatar
Alex Converse committed
198
199
      } break;
    }
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223

#if CONFIG_NEW_QUANT
    v = av1_dequant_abscoeff_nuq(val, dqv, dqv_val);
    v = dq_shift ? ROUND_POWER_OF_TWO(v, dq_shift) : v;
#else
#if CONFIG_AOM_QM
    dqv = ((iqmatrix[scan[c]] * (int)dqv) + (1 << (AOM_QM_BITS - 1))) >>
          AOM_QM_BITS;
#endif
    v = (val * dqv) >> dq_shift;
#endif
#if CONFIG_COEFFICIENT_RANGE_CHECKING
#if CONFIG_AOM_HIGHBITDEPTH
    if (v)
      dqcoeff[scan[c]] =
          highbd_check_range((aom_read_bit(r, ACCT_STR) ? -v : v), xd->bd);
#else
    if (v) dqcoeff[scan[c]] = check_range(aom_read_bit(r, ACCT_STR) ? -v : v);
#endif  // CONFIG_AOM_HIGHBITDEPTH
#else
    if (v) dqcoeff[scan[c]] = aom_read_bit(r, ACCT_STR) ? -v : v;
#endif  // CONFIG_COEFFICIENT_RANGE_CHECKING

    ++c;
224
225
    more_data &= (c < max_eob);
    if (!more_data) break;
226
227
    dqv = dq[1];
    ctx = get_coef_context(nb, token_cache, c);
228
    band = *band_translate++;
229

230
#else  // CONFIG_NEW_TOKENSET
231
232
233
234
235
236
237
238
239
240
241
242
243
  while (c < max_eob) {
    int val = -1;
    band = *band_translate++;
    prob = coef_probs[band][ctx];
    if (counts) ++eob_branch_count[band][ctx];
    if (!aom_read(r, prob[EOB_CONTEXT_NODE], ACCT_STR)) {
      INCREMENT_COUNT(EOB_MODEL_TOKEN);
      break;
    }

#if CONFIG_NEW_QUANT
    dqv_val = &dq_val[band][0];
#endif  // CONFIG_NEW_QUANT
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260

    while (!aom_read(r, prob[ZERO_CONTEXT_NODE], ACCT_STR)) {
      INCREMENT_COUNT(ZERO_TOKEN);
      dqv = dq[1];
      token_cache[scan[c]] = 0;
      ++c;
      if (c >= max_eob) return c;  // zero tokens at the end (no eob token)
      ctx = get_coef_context(nb, token_cache, c);
      band = *band_translate++;
      prob = coef_probs[band][ctx];
#if CONFIG_NEW_QUANT
      dqv_val = &dq_val[band][0];
#endif  // CONFIG_NEW_QUANT
    }

    *max_scan_line = AOMMAX(*max_scan_line, scan[c]);

261
262
263
264
265
266
267
268
269
270
271
#if CONFIG_EC_MULTISYMBOL
    cdf = &coef_cdfs[band][ctx];
    token = ONE_TOKEN +
            aom_read_symbol(r, *cdf, CATEGORY6_TOKEN - ONE_TOKEN + 1, ACCT_STR);
    INCREMENT_COUNT(ONE_TOKEN + (token > ONE_TOKEN));
    switch (token) {
      case ONE_TOKEN:
      case TWO_TOKEN:
      case THREE_TOKEN:
      case FOUR_TOKEN: val = token; break;
      case CATEGORY1_TOKEN:
272
        val = CAT1_MIN_VAL + read_coeff(av1_cat1_prob, 1, r);
273
274
        break;
      case CATEGORY2_TOKEN:
275
        val = CAT2_MIN_VAL + read_coeff(av1_cat2_prob, 2, r);
276
277
        break;
      case CATEGORY3_TOKEN:
278
        val = CAT3_MIN_VAL + read_coeff(av1_cat3_prob, 3, r);
279
280
        break;
      case CATEGORY4_TOKEN:
281
        val = CAT4_MIN_VAL + read_coeff(av1_cat4_prob, 4, r);
282
283
        break;
      case CATEGORY5_TOKEN:
284
        val = CAT5_MIN_VAL + read_coeff(av1_cat5_prob, 5, r);
285
286
287
        break;
      case CATEGORY6_TOKEN: {
#if CONFIG_AOM_HIGHBITDEPTH
288
289
        const int skip_bits = (int)sizeof(av1_cat6_prob) -
                              av1_get_cat6_extrabits_size(tx_size, xd->bd);
290
#else
291
292
        const int skip_bits = (int)sizeof(av1_cat6_prob) -
                              av1_get_cat6_extrabits_size(tx_size, 8);
293
#endif
294
295
        val = CAT6_MIN_VAL +
              read_coeff(av1_cat6_prob + skip_bits, 18 - skip_bits, r);
296
297
298
      } break;
    }
#else  // CONFIG_EC_MULTISYMBOL
Michael Bebenita's avatar
Michael Bebenita committed
299
    if (!aom_read(r, prob[ONE_CONTEXT_NODE], ACCT_STR)) {
Jingning Han's avatar
Jingning Han committed
300
301
302
303
304
      INCREMENT_COUNT(ONE_TOKEN);
      token = ONE_TOKEN;
      val = 1;
    } else {
      INCREMENT_COUNT(TWO_TOKEN);
Yaowu Xu's avatar
Yaowu Xu committed
305
      token = aom_read_tree(r, av1_coef_con_tree,
Michael Bebenita's avatar
Michael Bebenita committed
306
                            av1_pareto8_full[prob[PIVOT_NODE] - 1], ACCT_STR);
Jingning Han's avatar
Jingning Han committed
307
308
309
      switch (token) {
        case TWO_TOKEN:
        case THREE_TOKEN:
310
        case FOUR_TOKEN: val = token; break;
Jingning Han's avatar
Jingning Han committed
311
        case CATEGORY1_TOKEN:
312
          val = CAT1_MIN_VAL + read_coeff(av1_cat1_prob, 1, r);
Jingning Han's avatar
Jingning Han committed
313
314
          break;
        case CATEGORY2_TOKEN:
315
          val = CAT2_MIN_VAL + read_coeff(av1_cat2_prob, 2, r);
Jingning Han's avatar
Jingning Han committed
316
317
          break;
        case CATEGORY3_TOKEN:
318
          val = CAT3_MIN_VAL + read_coeff(av1_cat3_prob, 3, r);
Jingning Han's avatar
Jingning Han committed
319
320
          break;
        case CATEGORY4_TOKEN:
321
          val = CAT4_MIN_VAL + read_coeff(av1_cat4_prob, 4, r);
Jingning Han's avatar
Jingning Han committed
322
323
          break;
        case CATEGORY5_TOKEN:
324
          val = CAT5_MIN_VAL + read_coeff(av1_cat5_prob, 5, r);
Jingning Han's avatar
Jingning Han committed
325
          break;
326
        case CATEGORY6_TOKEN: {
Yaowu Xu's avatar
Yaowu Xu committed
327
#if CONFIG_AOM_HIGHBITDEPTH
328
329
          const int skip_bits = (int)sizeof(av1_cat6_prob) -
                                av1_get_cat6_extrabits_size(tx_size, xd->bd);
Jingning Han's avatar
Jingning Han committed
330
#else
331
332
          const int skip_bits = (int)sizeof(av1_cat6_prob) -
                                av1_get_cat6_extrabits_size(tx_size, 8);
Jingning Han's avatar
Jingning Han committed
333
#endif
334
335
          val = CAT6_MIN_VAL +
                read_coeff(av1_cat6_prob + skip_bits, 18 - skip_bits, r);
Jingning Han's avatar
Jingning Han committed
336
          break;
337
        }
Jingning Han's avatar
Jingning Han committed
338
339
      }
    }
340
#endif  // CONFIG_EC_MULTISYMBOL
341
#if CONFIG_NEW_QUANT
Yaowu Xu's avatar
Yaowu Xu committed
342
    v = av1_dequant_abscoeff_nuq(val, dqv, dqv_val);
343
344
    v = dq_shift ? ROUND_POWER_OF_TWO(v, dq_shift) : v;
#else
345
346
347
348
#if CONFIG_AOM_QM
    dqv = ((iqmatrix[scan[c]] * (int)dqv) + (1 << (AOM_QM_BITS - 1))) >>
          AOM_QM_BITS;
#endif
Jingning Han's avatar
Jingning Han committed
349
    v = (val * dqv) >> dq_shift;
350
351
#endif  // CONFIG_NEW_QUANT

Jingning Han's avatar
Jingning Han committed
352
#if CONFIG_COEFFICIENT_RANGE_CHECKING
Yaowu Xu's avatar
Yaowu Xu committed
353
#if CONFIG_AOM_HIGHBITDEPTH
Michael Bebenita's avatar
Michael Bebenita committed
354
355
    dqcoeff[scan[c]] =
        highbd_check_range((aom_read_bit(r, ACCT_STR) ? -v : v), xd->bd);
Jingning Han's avatar
Jingning Han committed
356
#else
Michael Bebenita's avatar
Michael Bebenita committed
357
    dqcoeff[scan[c]] = check_range(aom_read_bit(r, ACCT_STR) ? -v : v);
Yaowu Xu's avatar
Yaowu Xu committed
358
#endif  // CONFIG_AOM_HIGHBITDEPTH
Jingning Han's avatar
Jingning Han committed
359
#else
Michael Bebenita's avatar
Michael Bebenita committed
360
    dqcoeff[scan[c]] = aom_read_bit(r, ACCT_STR) ? -v : v;
Jingning Han's avatar
Jingning Han committed
361
#endif  // CONFIG_COEFFICIENT_RANGE_CHECKING
Yaowu Xu's avatar
Yaowu Xu committed
362
    token_cache[scan[c]] = av1_pt_energy_class[token];
Jingning Han's avatar
Jingning Han committed
363
364
365
    ++c;
    ctx = get_coef_context(nb, token_cache, c);
    dqv = dq[1];
366
#endif  // CONFIG_NEW_TOKENSET
Jingning Han's avatar
Jingning Han committed
367
368
369
370
  }

  return c;
}
371
#endif  // !CONFIG_PVQ
Jingning Han's avatar
Jingning Han committed
372

373
#if CONFIG_PALETTE
Fangwen Fu's avatar
Fangwen Fu committed
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
void av1_decode_palette_tokens(MACROBLOCKD *const xd, int plane,
                               aom_reader *r) {
  const MODE_INFO *const mi = xd->mi[0];
  const MB_MODE_INFO *const mbmi = &mi->mbmi;
  uint8_t color_order[PALETTE_MAX_SIZE];
  const int n = mbmi->palette_mode_info.palette_size[plane];
  int i, j;
  uint8_t *const color_map = xd->plane[plane].color_index_map;
  const aom_prob(
      *const prob)[PALETTE_COLOR_INDEX_CONTEXTS][PALETTE_COLORS - 1] =
      plane ? av1_default_palette_uv_color_index_prob
            : av1_default_palette_y_color_index_prob;
  int plane_block_width, plane_block_height, rows, cols;
  av1_get_block_dimensions(mbmi->sb_type, plane, xd, &plane_block_width,
                           &plane_block_height, &rows, &cols);
  assert(plane == 0 || plane == 1);

Fangwen Fu's avatar
Fangwen Fu committed
391
392
393
394
#if CONFIG_PALETTE_THROUGHPUT
  // Run wavefront on the palette map index decoding.
  for (i = 1; i < rows + cols - 1; ++i) {
    for (j = AOMMIN(i, cols - 1); j >= AOMMAX(0, i - rows + 1); --j) {
Fangwen Fu's avatar
Fangwen Fu committed
395
      const int color_ctx = av1_get_palette_color_index_context(
Fangwen Fu's avatar
Fangwen Fu committed
396
          color_map, plane_block_width, (i - j), j, n, color_order, NULL);
Fangwen Fu's avatar
Fangwen Fu committed
397
398
399
400
      const int color_idx =
          aom_read_tree(r, av1_palette_color_index_tree[n - 2],
                        prob[n - 2][color_ctx], ACCT_STR);
      assert(color_idx >= 0 && color_idx < n);
Fangwen Fu's avatar
Fangwen Fu committed
401
      color_map[(i - j) * plane_block_width + j] = color_order[color_idx];
Fangwen Fu's avatar
Fangwen Fu committed
402
403
404
    }
  }
  // Copy last column to extra columns.
Fangwen Fu's avatar
Fangwen Fu committed
405
406
407
408
409
  if (cols < plane_block_width) {
    for (i = 0; i < plane_block_height; ++i) {
      memset(color_map + i * plane_block_width + cols,
             color_map[i * plane_block_width + cols - 1],
             (plane_block_width - cols));
Fangwen Fu's avatar
Fangwen Fu committed
410
411
412
    }
  }
#else
hui su's avatar
hui su committed
413
414
  for (i = 0; i < rows; ++i) {
    for (j = (i == 0 ? 1 : 0); j < cols; ++j) {
415
      const int color_ctx = av1_get_palette_color_index_context(
416
          color_map, plane_block_width, i, j, n, color_order, NULL);
417
      const int color_idx =
418
419
          aom_read_tree(r, av1_palette_color_index_tree[n - PALETTE_MIN_SIZE],
                        prob[n - PALETTE_MIN_SIZE][color_ctx], ACCT_STR);
hui su's avatar
hui su committed
420
      assert(color_idx >= 0 && color_idx < n);
421
      color_map[i * plane_block_width + j] = color_order[color_idx];
hui su's avatar
hui su committed
422
    }
423
424
425
426
    memset(color_map + i * plane_block_width + cols,
           color_map[i * plane_block_width + cols - 1],
           (plane_block_width - cols));  // Copy last column to extra columns.
  }
Fangwen Fu's avatar
Fangwen Fu committed
427
#endif  // CONFIG_PALETTE_THROUGHPUT
428
429
430
431
  // Copy last row to extra rows.
  for (i = rows; i < plane_block_height; ++i) {
    memcpy(color_map + i * plane_block_width,
           color_map + (rows - 1) * plane_block_width, plane_block_width);
hui su's avatar
hui su committed
432
433
  }
}
434
#endif  // CONFIG_PALETTE
hui su's avatar
hui su committed
435

436
#if !CONFIG_PVQ || CONFIG_VAR_TX
437
int av1_decode_block_tokens(AV1_COMMON *cm, MACROBLOCKD *const xd, int plane,
438
                            const SCAN_ORDER *sc, int x, int y, TX_SIZE tx_size,
439
                            TX_TYPE tx_type, int16_t *max_scan_line,
440
                            aom_reader *r, int seg_id) {
Jingning Han's avatar
Jingning Han committed
441
442
  struct macroblockd_plane *const pd = &xd->plane[plane];
  const int16_t *const dequant = pd->seg_dequant[seg_id];
443
444
  const int ctx =
      get_entropy_context(tx_size, pd->above_context + x, pd->left_context + y);
445
#if CONFIG_NEW_QUANT
446
  const int ref = is_inter_block(&xd->mi[0]->mbmi);
447
448
  int dq =
      get_dq_profile_from_ctx(xd->qindex[seg_id], ctx, ref, pd->plane_type);
449
450
#endif  //  CONFIG_NEW_QUANT

451
452
  const int eob =
      decode_coefs(xd, pd->plane_type, pd->dqcoeff, tx_size, tx_type, dequant,
453
#if CONFIG_NEW_QUANT
454
                   pd->seg_dequant_nuq[seg_id][dq],
455
#endif  // CONFIG_NEW_QUANT
456
457
#if CONFIG_AOM_QM
                   pd->seg_iqmatrix[seg_id],
458
#endif  // CONFIG_AOM_QM
459
                   ctx, sc->scan, sc->neighbors, max_scan_line, r);
460
  av1_set_contexts(xd, pd, plane, tx_size, eob > 0, x, y);
461
462
463
464
#if CONFIG_ADAPT_SCAN
  if (xd->counts)
    av1_update_scan_count_facade(cm, xd->counts, tx_size, tx_type, pd->dqcoeff,
                                 eob);
465
466
#else
  (void)cm;
467
#endif
Jingning Han's avatar
Jingning Han committed
468
469
  return eob;
}
470
#endif  // !CONFIG_PVQ