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

Alex Converse's avatar
Alex Converse committed
17 18 19
#if CONFIG_ANS
#include "aom_dsp/ans.h"
#endif  // CONFIG_ANS
20
#include "av1/common/blockd.h"
21

22 23
#define ACCT_STR __func__

24
#if !CONFIG_PVQ || CONFIG_VAR_TX
25 26 27 28
#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
29

30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
#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
45 46
  } while (0)

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

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

  if (counts) {
117 118
    coef_counts = counts->coef[tx_size_ctx][type][ref];
    eob_branch_count = counts->eob_branch[tx_size_ctx][type][ref];
119
#if CONFIG_NEW_TOKENSET && !CONFIG_EC_ADAPT
120 121
    blockz_count = counts->blockz_count[tx_size_ctx][type][ref][ctx];
#endif
Jingning Han's avatar
Jingning Han committed
122 123
  }

124
  dq_shift = get_tx_scale(tx_size);
125

126
#if CONFIG_NEW_TOKENSET
127 128
  band = *band_translate++;

Jingning Han's avatar
Jingning Han committed
129
  while (c < max_eob) {
130 131
    int more_data;
    int comb_token;
132
    int last_pos = (c + 1 == max_eob);
133
    int first_pos = (c == 0);
Jingning Han's avatar
Jingning Han committed
134

135 136 137 138
#if CONFIG_NEW_QUANT
    dqv_val = &dq_val[band][0];
#endif  // CONFIG_NEW_QUANT

139 140
    cdf_head = &coef_head_cdfs[band][ctx];
    cdf_tail = &coef_tail_cdfs[band][ctx];
141 142 143 144 145
    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) {
146
#if !CONFIG_EC_ADAPT
147
      if (counts) ++blockz_count[comb_token != 0];
148
#endif
149 150 151
      if (comb_token == 0) return 0;
    }
    token = comb_token >> 1;
152 153 154 155 156 157 158 159 160 161
    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];
      }
    }
162

163
    if (token > ONE_TOKEN)
164
      token += aom_read_symbol(r, *cdf_tail, TAIL_TOKENS, ACCT_STR);
165
#if CONFIG_NEW_QUANT
166
    dqv_val = &dq_val[band][0];
167
#endif  // CONFIG_NEW_QUANT
168 169 170

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

171
    token_cache[scan[c]] = av1_pt_energy_class[token];
172

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

#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;
230 231
    more_data &= (c < max_eob);
    if (!more_data) break;
232 233
    dqv = dq[1];
    ctx = get_coef_context(nb, token_cache, c);
234
    band = *band_translate++;
235

236
#else  // CONFIG_NEW_TOKENSET
237 238 239 240 241 242 243 244 245 246 247 248 249
  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
250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266

    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]);

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

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

  return c;
}
377
#endif  // !CONFIG_PVQ
Jingning Han's avatar
Jingning Han committed
378

379
#if CONFIG_PALETTE
Fangwen Fu's avatar
Fangwen Fu committed
380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396
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
397 398 399 400
#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
401
      const int color_ctx = av1_get_palette_color_index_context(
Fangwen Fu's avatar
Fangwen Fu committed
402
          color_map, plane_block_width, (i - j), j, n, color_order, NULL);
Fangwen Fu's avatar
Fangwen Fu committed
403 404 405 406
      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
407
      color_map[(i - j) * plane_block_width + j] = color_order[color_idx];
Fangwen Fu's avatar
Fangwen Fu committed
408 409 410
    }
  }
  // Copy last column to extra columns.
Fangwen Fu's avatar
Fangwen Fu committed
411 412 413 414 415
  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
416 417 418
    }
  }
#else
hui su's avatar
hui su committed
419 420
  for (i = 0; i < rows; ++i) {
    for (j = (i == 0 ? 1 : 0); j < cols; ++j) {
421
      const int color_ctx = av1_get_palette_color_index_context(
422
          color_map, plane_block_width, i, j, n, color_order, NULL);
423
      const int color_idx =
424 425
          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
426
      assert(color_idx >= 0 && color_idx < n);
427
      color_map[i * plane_block_width + j] = color_order[color_idx];
hui su's avatar
hui su committed
428
    }
429 430 431 432
    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
433
#endif  // CONFIG_PALETTE_THROUGHPUT
434 435 436 437
  // 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
438 439
  }
}
440
#endif  // CONFIG_PALETTE
hui su's avatar
hui su committed
441

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

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