Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 1 | /* |
Adrian Grange | a872b06 | 2016-03-24 11:38:32 -0700 | [diff] [blame] | 2 | * Copyright (c) 2016, Alliance for Open Media. All rights reserved |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 3 | * |
Adrian Grange | a872b06 | 2016-03-24 11:38:32 -0700 | [diff] [blame] | 4 | * This source code is subject to the terms of the BSD 2 Clause License and |
| 5 | * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License |
| 6 | * was not distributed with this source code in the LICENSE file, you can |
| 7 | * obtain it at www.aomedia.org/license/software. If the Alliance for Open |
| 8 | * Media Patent License 1.0 was not distributed with this source code in the |
| 9 | * PATENTS file, you can obtain it at www.aomedia.org/license/patent. |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 10 | */ |
| 11 | |
Yushin Cho | 09705fe | 2016-11-04 16:36:56 -0700 | [diff] [blame^] | 12 | #if !CONFIG_PVQ |
Adrian Grange | cebe6f0 | 2016-03-25 12:11:05 -0700 | [diff] [blame] | 13 | #include "aom_mem/aom_mem.h" |
Yaowu Xu | bf4202e | 2016-03-21 15:15:19 -0700 | [diff] [blame] | 14 | #include "aom_ports/mem.h" |
Yushin Cho | 09705fe | 2016-11-04 16:36:56 -0700 | [diff] [blame^] | 15 | #endif |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 16 | |
Yushin Cho | 09705fe | 2016-11-04 16:36:56 -0700 | [diff] [blame^] | 17 | #if !CONFIG_PVQ |
Yaowu Xu | cfea7dd | 2016-03-22 09:52:13 -0700 | [diff] [blame] | 18 | #include "av1/common/blockd.h" |
| 19 | #include "av1/common/common.h" |
| 20 | #include "av1/common/entropy.h" |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 21 | #if CONFIG_COEFFICIENT_RANGE_CHECKING |
Yaowu Xu | cfea7dd | 2016-03-22 09:52:13 -0700 | [diff] [blame] | 22 | #include "av1/common/idct.h" |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 23 | #endif |
| 24 | |
Yaowu Xu | cfea7dd | 2016-03-22 09:52:13 -0700 | [diff] [blame] | 25 | #include "av1/decoder/detokenize.h" |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 26 | |
Michael Bebenita | e6b1294 | 2016-08-25 14:40:54 -0700 | [diff] [blame] | 27 | #define ACCT_STR __func__ |
| 28 | |
clang-format | 99e28b8 | 2016-01-27 12:42:45 -0800 | [diff] [blame] | 29 | #define EOB_CONTEXT_NODE 0 |
| 30 | #define ZERO_CONTEXT_NODE 1 |
| 31 | #define ONE_CONTEXT_NODE 2 |
| 32 | #define LOW_VAL_CONTEXT_NODE 0 |
| 33 | #define TWO_CONTEXT_NODE 1 |
| 34 | #define THREE_CONTEXT_NODE 2 |
| 35 | #define HIGH_LOW_CONTEXT_NODE 3 |
| 36 | #define CAT_ONE_CONTEXT_NODE 4 |
| 37 | #define CAT_THREEFOUR_CONTEXT_NODE 5 |
| 38 | #define CAT_THREE_CONTEXT_NODE 6 |
| 39 | #define CAT_FIVE_CONTEXT_NODE 7 |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 40 | |
clang-format | 99e28b8 | 2016-01-27 12:42:45 -0800 | [diff] [blame] | 41 | #define INCREMENT_COUNT(token) \ |
| 42 | do { \ |
| 43 | if (counts) ++coef_counts[band][ctx][token]; \ |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 44 | } while (0) |
| 45 | |
Adrian Grange | cebe6f0 | 2016-03-25 12:11:05 -0700 | [diff] [blame] | 46 | static INLINE int read_coeff(const aom_prob *probs, int n, aom_reader *r) { |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 47 | int i, val = 0; |
Michael Bebenita | e6b1294 | 2016-08-25 14:40:54 -0700 | [diff] [blame] | 48 | for (i = 0; i < n; ++i) val = (val << 1) | aom_read(r, probs[i], ACCT_STR); |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 49 | return val; |
| 50 | } |
| 51 | |
Thomas | 1c122c2 | 2016-02-19 09:06:12 +0000 | [diff] [blame] | 52 | #if CONFIG_AOM_QM |
Thomas | b0112df | 2016-09-23 18:04:17 +0100 | [diff] [blame] | 53 | static int decode_coefs(MACROBLOCKD *xd, PLANE_TYPE type, tran_low_t *dqcoeff, |
| 54 | TX_SIZE tx_size, const int16_t *dq, int ctx, |
| 55 | const int16_t *scan, const int16_t *nb, aom_reader *r, |
| 56 | const qm_val_t *iqm[2][TX_SIZES]) |
Thomas | 1c122c2 | 2016-02-19 09:06:12 +0000 | [diff] [blame] | 57 | #else |
Thomas | b0112df | 2016-09-23 18:04:17 +0100 | [diff] [blame] | 58 | static int decode_coefs(MACROBLOCKD *xd, PLANE_TYPE type, tran_low_t *dqcoeff, |
| 59 | TX_SIZE tx_size, const int16_t *dq, int ctx, |
| 60 | const int16_t *scan, const int16_t *nb, aom_reader *r) |
Thomas | 1c122c2 | 2016-02-19 09:06:12 +0000 | [diff] [blame] | 61 | #endif |
| 62 | { |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 63 | FRAME_COUNTS *counts = xd->counts; |
Jingning Han | 9662fde | 2016-09-01 12:09:20 -0700 | [diff] [blame] | 64 | const int max_eob = 1 << (tx_size_1d_log2[tx_size] * 2); |
Thomas | b0112df | 2016-09-23 18:04:17 +0100 | [diff] [blame] | 65 | FRAME_CONTEXT *const fc = xd->fc; |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 66 | const int ref = is_inter_block(&xd->mi[0]->mbmi); |
Thomas | 1c122c2 | 2016-02-19 09:06:12 +0000 | [diff] [blame] | 67 | #if CONFIG_AOM_QM |
| 68 | const qm_val_t *iqmatrix = iqm[!ref][tx_size]; |
| 69 | #endif |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 70 | int band, c = 0; |
Thomas | b0112df | 2016-09-23 18:04:17 +0100 | [diff] [blame] | 71 | aom_prob(*coef_probs)[COEFF_CONTEXTS][UNCONSTRAINED_NODES] = |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 72 | fc->coef_probs[tx_size][type][ref]; |
Adrian Grange | cebe6f0 | 2016-03-25 12:11:05 -0700 | [diff] [blame] | 73 | const aom_prob *prob; |
Alex Converse | f2753c3 | 2016-10-10 11:08:10 -0700 | [diff] [blame] | 74 | #if CONFIG_EC_MULTISYMBOL |
Thomas | b0112df | 2016-09-23 18:04:17 +0100 | [diff] [blame] | 75 | aom_cdf_prob(*coef_cdfs)[COEFF_CONTEXTS][ENTROPY_TOKENS] = |
Alex Converse | 362888b | 2016-06-23 15:31:42 -0700 | [diff] [blame] | 76 | fc->coef_cdfs[tx_size][type][ref]; |
Thomas | b0112df | 2016-09-23 18:04:17 +0100 | [diff] [blame] | 77 | aom_cdf_prob(*cdf)[ENTROPY_TOKENS]; |
Alex Converse | f2753c3 | 2016-10-10 11:08:10 -0700 | [diff] [blame] | 78 | #endif // CONFIG_EC_MULTISYMBOL |
clang-format | 99e28b8 | 2016-01-27 12:42:45 -0800 | [diff] [blame] | 79 | unsigned int(*coef_counts)[COEFF_CONTEXTS][UNCONSTRAINED_NODES + 1]; |
| 80 | unsigned int(*eob_branch_count)[COEFF_CONTEXTS]; |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 81 | uint8_t token_cache[32 * 32]; |
| 82 | const uint8_t *band_translate = get_band_translate(tx_size); |
| 83 | const int dq_shift = (tx_size == TX_32X32); |
| 84 | int v, token; |
| 85 | int16_t dqv = dq[0]; |
| 86 | const uint8_t *cat1_prob; |
| 87 | const uint8_t *cat2_prob; |
| 88 | const uint8_t *cat3_prob; |
| 89 | const uint8_t *cat4_prob; |
| 90 | const uint8_t *cat5_prob; |
| 91 | const uint8_t *cat6_prob; |
| 92 | |
| 93 | if (counts) { |
| 94 | coef_counts = counts->coef[tx_size][type][ref]; |
| 95 | eob_branch_count = counts->eob_branch[tx_size][type][ref]; |
| 96 | } |
| 97 | |
Yaowu Xu | 01dee0b | 2016-03-25 12:43:01 -0700 | [diff] [blame] | 98 | #if CONFIG_AOM_HIGHBITDEPTH |
Adrian Grange | ff00fc0 | 2016-03-25 12:57:08 -0700 | [diff] [blame] | 99 | if (xd->bd > AOM_BITS_8) { |
| 100 | if (xd->bd == AOM_BITS_10) { |
Yaowu Xu | 01dee0b | 2016-03-25 12:43:01 -0700 | [diff] [blame] | 101 | cat1_prob = av1_cat1_prob_high10; |
| 102 | cat2_prob = av1_cat2_prob_high10; |
| 103 | cat3_prob = av1_cat3_prob_high10; |
| 104 | cat4_prob = av1_cat4_prob_high10; |
| 105 | cat5_prob = av1_cat5_prob_high10; |
| 106 | cat6_prob = av1_cat6_prob_high10; |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 107 | } else { |
Yaowu Xu | 01dee0b | 2016-03-25 12:43:01 -0700 | [diff] [blame] | 108 | cat1_prob = av1_cat1_prob_high12; |
| 109 | cat2_prob = av1_cat2_prob_high12; |
| 110 | cat3_prob = av1_cat3_prob_high12; |
| 111 | cat4_prob = av1_cat4_prob_high12; |
| 112 | cat5_prob = av1_cat5_prob_high12; |
| 113 | cat6_prob = av1_cat6_prob_high12; |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 114 | } |
| 115 | } else { |
Yaowu Xu | 01dee0b | 2016-03-25 12:43:01 -0700 | [diff] [blame] | 116 | cat1_prob = av1_cat1_prob; |
| 117 | cat2_prob = av1_cat2_prob; |
| 118 | cat3_prob = av1_cat3_prob; |
| 119 | cat4_prob = av1_cat4_prob; |
| 120 | cat5_prob = av1_cat5_prob; |
| 121 | cat6_prob = av1_cat6_prob; |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 122 | } |
| 123 | #else |
Yaowu Xu | 01dee0b | 2016-03-25 12:43:01 -0700 | [diff] [blame] | 124 | cat1_prob = av1_cat1_prob; |
| 125 | cat2_prob = av1_cat2_prob; |
| 126 | cat3_prob = av1_cat3_prob; |
| 127 | cat4_prob = av1_cat4_prob; |
| 128 | cat5_prob = av1_cat5_prob; |
| 129 | cat6_prob = av1_cat6_prob; |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 130 | #endif |
| 131 | |
| 132 | while (c < max_eob) { |
| 133 | int val = -1; |
| 134 | band = *band_translate++; |
| 135 | prob = coef_probs[band][ctx]; |
clang-format | 99e28b8 | 2016-01-27 12:42:45 -0800 | [diff] [blame] | 136 | if (counts) ++eob_branch_count[band][ctx]; |
Michael Bebenita | e6b1294 | 2016-08-25 14:40:54 -0700 | [diff] [blame] | 137 | if (!aom_read(r, prob[EOB_CONTEXT_NODE], ACCT_STR)) { |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 138 | INCREMENT_COUNT(EOB_MODEL_TOKEN); |
| 139 | break; |
| 140 | } |
| 141 | |
Michael Bebenita | e6b1294 | 2016-08-25 14:40:54 -0700 | [diff] [blame] | 142 | while (!aom_read(r, prob[ZERO_CONTEXT_NODE], ACCT_STR)) { |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 143 | INCREMENT_COUNT(ZERO_TOKEN); |
| 144 | dqv = dq[1]; |
| 145 | token_cache[scan[c]] = 0; |
| 146 | ++c; |
clang-format | 99e28b8 | 2016-01-27 12:42:45 -0800 | [diff] [blame] | 147 | if (c >= max_eob) return c; // zero tokens at the end (no eob token) |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 148 | ctx = get_coef_context(nb, token_cache, c); |
| 149 | band = *band_translate++; |
| 150 | prob = coef_probs[band][ctx]; |
| 151 | } |
| 152 | |
Alex Converse | f2753c3 | 2016-10-10 11:08:10 -0700 | [diff] [blame] | 153 | #if CONFIG_EC_MULTISYMBOL |
Alex Converse | 362888b | 2016-06-23 15:31:42 -0700 | [diff] [blame] | 154 | cdf = &coef_cdfs[band][ctx]; |
Michael Bebenita | e6b1294 | 2016-08-25 14:40:54 -0700 | [diff] [blame] | 155 | token = ONE_TOKEN + |
| 156 | aom_read_symbol(r, *cdf, CATEGORY6_TOKEN - ONE_TOKEN + 1, ACCT_STR); |
Alex Converse | 362888b | 2016-06-23 15:31:42 -0700 | [diff] [blame] | 157 | INCREMENT_COUNT(ONE_TOKEN + (token > ONE_TOKEN)); |
| 158 | switch (token) { |
| 159 | case ONE_TOKEN: |
| 160 | case TWO_TOKEN: |
| 161 | case THREE_TOKEN: |
| 162 | case FOUR_TOKEN: val = token; break; |
| 163 | case CATEGORY1_TOKEN: |
| 164 | val = CAT1_MIN_VAL + read_coeff(cat1_prob, 1, r); |
| 165 | break; |
| 166 | case CATEGORY2_TOKEN: |
| 167 | val = CAT2_MIN_VAL + read_coeff(cat2_prob, 2, r); |
| 168 | break; |
| 169 | case CATEGORY3_TOKEN: |
| 170 | val = CAT3_MIN_VAL + read_coeff(cat3_prob, 3, r); |
| 171 | break; |
| 172 | case CATEGORY4_TOKEN: |
| 173 | val = CAT4_MIN_VAL + read_coeff(cat4_prob, 4, r); |
| 174 | break; |
| 175 | case CATEGORY5_TOKEN: |
| 176 | val = CAT5_MIN_VAL + read_coeff(cat5_prob, 5, r); |
| 177 | break; |
| 178 | case CATEGORY6_TOKEN: { |
Alex Converse | 362888b | 2016-06-23 15:31:42 -0700 | [diff] [blame] | 179 | const int skip_bits = TX_SIZES - 1 - tx_size; |
Alex Converse | 362888b | 2016-06-23 15:31:42 -0700 | [diff] [blame] | 180 | const uint8_t *cat6p = cat6_prob + skip_bits; |
| 181 | #if CONFIG_AOM_HIGHBITDEPTH |
| 182 | switch (xd->bd) { |
| 183 | case AOM_BITS_8: |
| 184 | val = CAT6_MIN_VAL + read_coeff(cat6p, 14 - skip_bits, r); |
| 185 | break; |
| 186 | case AOM_BITS_10: |
| 187 | val = CAT6_MIN_VAL + read_coeff(cat6p, 16 - skip_bits, r); |
| 188 | break; |
| 189 | case AOM_BITS_12: |
| 190 | val = CAT6_MIN_VAL + read_coeff(cat6p, 18 - skip_bits, r); |
| 191 | break; |
| 192 | default: assert(0); return -1; |
| 193 | } |
| 194 | #else |
| 195 | val = CAT6_MIN_VAL + read_coeff(cat6p, 14 - skip_bits, r); |
| 196 | #endif |
| 197 | break; |
| 198 | } |
| 199 | } |
Alex Converse | f2753c3 | 2016-10-10 11:08:10 -0700 | [diff] [blame] | 200 | #else // CONFIG_EC_MULTISYMBOL |
Michael Bebenita | e6b1294 | 2016-08-25 14:40:54 -0700 | [diff] [blame] | 201 | if (!aom_read(r, prob[ONE_CONTEXT_NODE], ACCT_STR)) { |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 202 | INCREMENT_COUNT(ONE_TOKEN); |
| 203 | token = ONE_TOKEN; |
| 204 | val = 1; |
| 205 | } else { |
| 206 | INCREMENT_COUNT(TWO_TOKEN); |
Yaowu Xu | 01dee0b | 2016-03-25 12:43:01 -0700 | [diff] [blame] | 207 | token = aom_read_tree(r, av1_coef_con_tree, |
Michael Bebenita | e6b1294 | 2016-08-25 14:40:54 -0700 | [diff] [blame] | 208 | av1_pareto8_full[prob[PIVOT_NODE] - 1], ACCT_STR); |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 209 | switch (token) { |
| 210 | case TWO_TOKEN: |
| 211 | case THREE_TOKEN: |
clang-format | 99e28b8 | 2016-01-27 12:42:45 -0800 | [diff] [blame] | 212 | case FOUR_TOKEN: val = token; break; |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 213 | case CATEGORY1_TOKEN: |
| 214 | val = CAT1_MIN_VAL + read_coeff(cat1_prob, 1, r); |
| 215 | break; |
| 216 | case CATEGORY2_TOKEN: |
| 217 | val = CAT2_MIN_VAL + read_coeff(cat2_prob, 2, r); |
| 218 | break; |
| 219 | case CATEGORY3_TOKEN: |
| 220 | val = CAT3_MIN_VAL + read_coeff(cat3_prob, 3, r); |
| 221 | break; |
| 222 | case CATEGORY4_TOKEN: |
| 223 | val = CAT4_MIN_VAL + read_coeff(cat4_prob, 4, r); |
| 224 | break; |
| 225 | case CATEGORY5_TOKEN: |
| 226 | val = CAT5_MIN_VAL + read_coeff(cat5_prob, 5, r); |
| 227 | break; |
Ronald S. Bultje | 3461e8c | 2015-09-30 21:37:20 -0400 | [diff] [blame] | 228 | case CATEGORY6_TOKEN: { |
Ronald S. Bultje | 3461e8c | 2015-09-30 21:37:20 -0400 | [diff] [blame] | 229 | const int skip_bits = TX_SIZES - 1 - tx_size; |
Ronald S. Bultje | 3461e8c | 2015-09-30 21:37:20 -0400 | [diff] [blame] | 230 | const uint8_t *cat6p = cat6_prob + skip_bits; |
Yaowu Xu | 01dee0b | 2016-03-25 12:43:01 -0700 | [diff] [blame] | 231 | #if CONFIG_AOM_HIGHBITDEPTH |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 232 | switch (xd->bd) { |
Adrian Grange | ff00fc0 | 2016-03-25 12:57:08 -0700 | [diff] [blame] | 233 | case AOM_BITS_8: |
Ronald S. Bultje | 3461e8c | 2015-09-30 21:37:20 -0400 | [diff] [blame] | 234 | val = CAT6_MIN_VAL + read_coeff(cat6p, 14 - skip_bits, r); |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 235 | break; |
Adrian Grange | ff00fc0 | 2016-03-25 12:57:08 -0700 | [diff] [blame] | 236 | case AOM_BITS_10: |
Ronald S. Bultje | 3461e8c | 2015-09-30 21:37:20 -0400 | [diff] [blame] | 237 | val = CAT6_MIN_VAL + read_coeff(cat6p, 16 - skip_bits, r); |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 238 | break; |
Adrian Grange | ff00fc0 | 2016-03-25 12:57:08 -0700 | [diff] [blame] | 239 | case AOM_BITS_12: |
Ronald S. Bultje | 3461e8c | 2015-09-30 21:37:20 -0400 | [diff] [blame] | 240 | val = CAT6_MIN_VAL + read_coeff(cat6p, 18 - skip_bits, r); |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 241 | break; |
clang-format | 99e28b8 | 2016-01-27 12:42:45 -0800 | [diff] [blame] | 242 | default: assert(0); return -1; |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 243 | } |
| 244 | #else |
Ronald S. Bultje | 3461e8c | 2015-09-30 21:37:20 -0400 | [diff] [blame] | 245 | val = CAT6_MIN_VAL + read_coeff(cat6p, 14 - skip_bits, r); |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 246 | #endif |
| 247 | break; |
Ronald S. Bultje | 3461e8c | 2015-09-30 21:37:20 -0400 | [diff] [blame] | 248 | } |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 249 | } |
| 250 | } |
Alex Converse | f2753c3 | 2016-10-10 11:08:10 -0700 | [diff] [blame] | 251 | #endif // CONFIG_EC_MULTISYMBOL |
Thomas | 1c122c2 | 2016-02-19 09:06:12 +0000 | [diff] [blame] | 252 | #if CONFIG_AOM_QM |
| 253 | dqv = ((iqmatrix[scan[c]] * (int)dqv) + (1 << (AOM_QM_BITS - 1))) >> |
| 254 | AOM_QM_BITS; |
| 255 | #endif |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 256 | v = (val * dqv) >> dq_shift; |
| 257 | #if CONFIG_COEFFICIENT_RANGE_CHECKING |
Yaowu Xu | 01dee0b | 2016-03-25 12:43:01 -0700 | [diff] [blame] | 258 | #if CONFIG_AOM_HIGHBITDEPTH |
Michael Bebenita | e6b1294 | 2016-08-25 14:40:54 -0700 | [diff] [blame] | 259 | dqcoeff[scan[c]] = |
| 260 | highbd_check_range((aom_read_bit(r, ACCT_STR) ? -v : v), xd->bd); |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 261 | #else |
Michael Bebenita | e6b1294 | 2016-08-25 14:40:54 -0700 | [diff] [blame] | 262 | dqcoeff[scan[c]] = check_range(aom_read_bit(r, ACCT_STR) ? -v : v); |
Yaowu Xu | 01dee0b | 2016-03-25 12:43:01 -0700 | [diff] [blame] | 263 | #endif // CONFIG_AOM_HIGHBITDEPTH |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 264 | #else |
Michael Bebenita | e6b1294 | 2016-08-25 14:40:54 -0700 | [diff] [blame] | 265 | dqcoeff[scan[c]] = aom_read_bit(r, ACCT_STR) ? -v : v; |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 266 | #endif // CONFIG_COEFFICIENT_RANGE_CHECKING |
Yaowu Xu | 01dee0b | 2016-03-25 12:43:01 -0700 | [diff] [blame] | 267 | token_cache[scan[c]] = av1_pt_energy_class[token]; |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 268 | ++c; |
| 269 | ctx = get_coef_context(nb, token_cache, c); |
| 270 | dqv = dq[1]; |
| 271 | } |
| 272 | |
| 273 | return c; |
| 274 | } |
| 275 | |
Urvang Joshi | 764d126 | 2016-08-24 15:52:38 -0700 | [diff] [blame] | 276 | #if CONFIG_PALETTE |
| 277 | void av1_decode_palette_tokens(MACROBLOCKD *const xd, int plane, |
| 278 | aom_reader *r) { |
Urvang Joshi | b1c3bb5 | 2016-09-07 14:57:49 -0700 | [diff] [blame] | 279 | const MODE_INFO *const mi = xd->mi[0]; |
| 280 | const MB_MODE_INFO *const mbmi = &mi->mbmi; |
Urvang Joshi | 764d126 | 2016-08-24 15:52:38 -0700 | [diff] [blame] | 281 | const BLOCK_SIZE bsize = mbmi->sb_type; |
| 282 | const int rows = (4 * num_4x4_blocks_high_lookup[bsize]) >> |
| 283 | (xd->plane[plane != 0].subsampling_y); |
| 284 | const int cols = (4 * num_4x4_blocks_wide_lookup[bsize]) >> |
| 285 | (xd->plane[plane != 0].subsampling_x); |
Urvang Joshi | b1c3bb5 | 2016-09-07 14:57:49 -0700 | [diff] [blame] | 286 | uint8_t color_order[PALETTE_MAX_SIZE]; |
| 287 | const int n = mbmi->palette_mode_info.palette_size[plane != 0]; |
Urvang Joshi | 764d126 | 2016-08-24 15:52:38 -0700 | [diff] [blame] | 288 | int i, j; |
| 289 | uint8_t *color_map = xd->plane[plane != 0].color_index_map; |
clang-format | f9562ae | 2016-09-17 11:45:12 -0700 | [diff] [blame] | 290 | const aom_prob(*const prob)[PALETTE_COLOR_CONTEXTS][PALETTE_COLORS - 1] = |
Urvang Joshi | 764d126 | 2016-08-24 15:52:38 -0700 | [diff] [blame] | 291 | plane ? av1_default_palette_uv_color_prob |
| 292 | : av1_default_palette_y_color_prob; |
| 293 | |
| 294 | for (i = 0; i < rows; ++i) { |
| 295 | for (j = (i == 0 ? 1 : 0); j < cols; ++j) { |
Urvang Joshi | b1c3bb5 | 2016-09-07 14:57:49 -0700 | [diff] [blame] | 296 | const int color_ctx = av1_get_palette_color_context(color_map, cols, i, j, |
| 297 | n, color_order, NULL); |
| 298 | const int color_idx = aom_read_tree(r, av1_palette_color_tree[n - 2], |
| 299 | prob[n - 2][color_ctx], ACCT_STR); |
Urvang Joshi | 764d126 | 2016-08-24 15:52:38 -0700 | [diff] [blame] | 300 | assert(color_idx >= 0 && color_idx < n); |
| 301 | color_map[i * cols + j] = color_order[color_idx]; |
| 302 | } |
| 303 | } |
| 304 | } |
| 305 | #endif // CONFIG_PALETTE |
| 306 | |
Urvang Joshi | 30abc08 | 2016-07-20 15:17:19 -0700 | [diff] [blame] | 307 | int av1_decode_block_tokens(MACROBLOCKD *xd, int plane, const SCAN_ORDER *sc, |
clang-format | a2dc61c | 2016-05-09 23:23:47 -0700 | [diff] [blame] | 308 | int x, int y, TX_SIZE tx_size, aom_reader *r, |
| 309 | int seg_id) { |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 310 | struct macroblockd_plane *const pd = &xd->plane[plane]; |
| 311 | const int16_t *const dequant = pd->seg_dequant[seg_id]; |
clang-format | 99e28b8 | 2016-01-27 12:42:45 -0800 | [diff] [blame] | 312 | const int ctx = |
| 313 | get_entropy_context(tx_size, pd->above_context + x, pd->left_context + y); |
Thomas | 1c122c2 | 2016-02-19 09:06:12 +0000 | [diff] [blame] | 314 | #if CONFIG_AOM_QM |
| 315 | const int eob = |
| 316 | decode_coefs(xd, pd->plane_type, pd->dqcoeff, tx_size, dequant, ctx, |
| 317 | sc->scan, sc->neighbors, r, pd->seg_iqmatrix[seg_id]); |
| 318 | #else |
clang-format | 99e28b8 | 2016-01-27 12:42:45 -0800 | [diff] [blame] | 319 | const int eob = decode_coefs(xd, pd->plane_type, pd->dqcoeff, tx_size, |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 320 | dequant, ctx, sc->scan, sc->neighbors, r); |
Thomas | 1c122c2 | 2016-02-19 09:06:12 +0000 | [diff] [blame] | 321 | #endif |
Jingning Han | b92bd69 | 2016-07-15 08:50:14 -0700 | [diff] [blame] | 322 | av1_set_contexts(xd, pd, tx_size, eob > 0, x, y); |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 323 | return eob; |
| 324 | } |
Yushin Cho | 09705fe | 2016-11-04 16:36:56 -0700 | [diff] [blame^] | 325 | #endif |