blob: edcb0aa349625ab7333d969e7766601cded2bb5e [file] [log] [blame]
Angie Chiangcea11f22017-02-24 12:30:40 -08001/*
2 * Copyright (c) 2017, Alliance for Open Media. All rights reserved
3 *
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.
10 */
11
12#include "av1/common/scan.h"
Angie Chiang133733c2017-03-17 12:50:20 -070013#include "av1/common/idct.h"
Angie Chiangcea11f22017-02-24 12:30:40 -080014#include "av1/common/txb_common.h"
Angie Chiangde58e492017-04-13 17:10:14 -070015#include "av1/decoder/decodemv.h"
Angie Chiangcea11f22017-02-24 12:30:40 -080016#include "av1/decoder/decodetxb.h"
Angie Chiang800df032017-03-22 11:14:12 -070017#include "av1/decoder/dsubexp.h"
Angie Chiang85e3b962017-10-01 16:04:43 -070018#include "av1/decoder/symbolrate.h"
Angie Chiangcea11f22017-02-24 12:30:40 -080019
20#define ACCT_STR __func__
21
Angie Chiang85e3b962017-10-01 16:04:43 -070022static int read_golomb(MACROBLOCKD *xd, aom_reader *r, FRAME_COUNTS *counts) {
23#if !CONFIG_SYMBOLRATE
24 (void)counts;
25#endif
Angie Chiangcea11f22017-02-24 12:30:40 -080026 int x = 1;
27 int length = 0;
28 int i = 0;
29
30 while (!i) {
Angie Chiang85e3b962017-10-01 16:04:43 -070031 i = av1_read_record_bit(counts, r, ACCT_STR);
Angie Chiangcea11f22017-02-24 12:30:40 -080032 ++length;
Angie Chiangf1880e12017-04-12 15:40:44 -070033 if (length >= 32) {
34 aom_internal_error(xd->error_info, AOM_CODEC_CORRUPT_FRAME,
35 "Invalid length in read_golomb");
36 break;
37 }
Angie Chiangcea11f22017-02-24 12:30:40 -080038 }
39
40 for (i = 0; i < length - 1; ++i) {
41 x <<= 1;
Angie Chiang85e3b962017-10-01 16:04:43 -070042 x += av1_read_record_bit(counts, r, ACCT_STR);
Angie Chiangcea11f22017-02-24 12:30:40 -080043 }
44
45 return x - 1;
46}
47
Dake Hea47cd6c2017-10-13 18:09:58 -070048static INLINE int rec_eob_pos(int16_t eob_token, int16_t extra) {
49 int eob = k_eob_group_start[eob_token];
50 if (eob > 2) {
51 eob += extra;
52 }
53 return eob;
54}
Dake Hea47cd6c2017-10-13 18:09:58 -070055
Angie Chiangcea11f22017-02-24 12:30:40 -080056uint8_t av1_read_coeffs_txb(const AV1_COMMON *const cm, MACROBLOCKD *xd,
Jingning Han7eab9ff2017-07-06 10:12:54 -070057 aom_reader *r, int blk_row, int blk_col, int block,
58 int plane, tran_low_t *tcoeffs, TXB_CTX *txb_ctx,
Jingning Hanaba246d2017-06-14 12:00:16 -070059 TX_SIZE tx_size, int16_t *max_scan_line, int *eob) {
Jingning Han41c7f442017-09-05 14:54:00 -070060 FRAME_CONTEXT *ec_ctx = xd->tile_ctx;
Angie Chiangcea11f22017-02-24 12:30:40 -080061 FRAME_COUNTS *counts = xd->counts;
Jingning Han48be0e12017-06-13 12:12:01 -070062 TX_SIZE txs_ctx = get_txsize_context(tx_size);
Angie Chiangcea11f22017-02-24 12:30:40 -080063 PLANE_TYPE plane_type = get_plane_type(plane);
Angie Chiangcea11f22017-02-24 12:30:40 -080064 MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi;
Jingning Han7e25fe62017-04-03 17:02:48 -070065 const int seg_eob = tx_size_2d[tx_size];
Angie Chiangcea11f22017-02-24 12:30:40 -080066 int c = 0;
Angie Chiang29b0fad2017-03-20 16:18:45 -070067 int update_eob = -1;
Monty Montgomery125c0fc2017-10-26 00:44:35 -040068 const int16_t *const dequant =
69 xd->plane[plane].seg_dequant_QTX[mbmi->segment_id];
Jingning Hanff705452017-04-27 11:32:15 -070070 const int shift = av1_get_tx_scale(tx_size);
Angie Chiangcea11f22017-02-24 12:30:40 -080071 const int bwl = b_width_log2_lookup[txsize_to_bsize[tx_size]] + 2;
Linfeng Zhang679d81e2017-10-31 15:27:42 -070072 const int width = tx_size_wide[tx_size];
Jingning Han341d79e2017-06-13 15:57:59 -070073 const int height = tx_size_high[tx_size];
Angie Chiangcea11f22017-02-24 12:30:40 -080074 int cul_level = 0;
Linfeng Zhang679d81e2017-10-31 15:27:42 -070075 uint8_t levels_buf[TX_PAD_2D];
76 uint8_t *const levels = set_levels(levels_buf, width);
Linfeng Zhang97fc4742017-11-07 12:57:25 -080077 uint8_t level_counts[MAX_TX_SQUARE];
Linfeng Zhang1015a342017-10-24 16:20:41 -070078 int8_t signs[MAX_TX_SQUARE];
Linfeng Zhangce065ca2017-10-17 16:49:30 -070079
Angie Chiangcea11f22017-02-24 12:30:40 -080080 memset(tcoeffs, 0, sizeof(*tcoeffs) * seg_eob);
81
Jingning Han94cea4a2017-09-30 14:13:23 -070082 int all_zero = av1_read_record_bin(
Angie Chiang85e3b962017-10-01 16:04:43 -070083 counts, r, ec_ctx->txb_skip_cdf[txs_ctx][txb_ctx->txb_skip_ctx], 2,
84 ACCT_STR);
Ola Hugosson13892102017-11-06 08:01:44 +010085 // printf("txb_skip: %d %2d\n", txs_ctx, txb_ctx->txb_skip_ctx);
Angie Chiang133733c2017-03-17 12:50:20 -070086 if (xd->counts)
Jingning Han48be0e12017-06-13 12:12:01 -070087 ++xd->counts->txb_skip[txs_ctx][txb_ctx->txb_skip_ctx][all_zero];
Angie Chiang29b0fad2017-03-20 16:18:45 -070088 *eob = 0;
Angie Chiang133733c2017-03-17 12:50:20 -070089 if (all_zero) {
90 *max_scan_line = 0;
Jingning Han19b5c8f2017-07-06 15:10:12 -070091#if CONFIG_TXK_SEL
92 if (plane == 0) mbmi->txk_type[(blk_row << 4) + blk_col] = DCT_DCT;
93#endif
Angie Chiang133733c2017-03-17 12:50:20 -070094 return 0;
95 }
96
Linfeng Zhang679d81e2017-10-31 15:27:42 -070097 memset(levels_buf, 0,
Linfeng Zhang1122d7d2017-10-31 15:30:28 -070098 sizeof(*levels_buf) *
99 ((width + TX_PAD_HOR) * (height + TX_PAD_VER) + TX_PAD_END));
Linfeng Zhang679d81e2017-10-31 15:27:42 -0700100 memset(signs, 0, sizeof(*signs) * seg_eob);
Linfeng Zhangce065ca2017-10-17 16:49:30 -0700101
Jingning Han7eab9ff2017-07-06 10:12:54 -0700102 (void)blk_row;
103 (void)blk_col;
Angie Chiangcd9b03f2017-04-16 13:37:13 -0700104#if CONFIG_TXK_SEL
Jingning Han19b5c8f2017-07-06 15:10:12 -0700105 av1_read_tx_type(cm, xd, blk_row, blk_col, block, plane,
106 get_min_tx_size(tx_size), r);
Angie Chiangcd9b03f2017-04-16 13:37:13 -0700107#endif
Jingning Han19b5c8f2017-07-06 15:10:12 -0700108 const TX_TYPE tx_type =
109 av1_get_tx_type(plane_type, xd, blk_row, blk_col, block, tx_size);
Angie Chiangbd99b382017-06-20 15:11:16 -0700110 const SCAN_ORDER *const scan_order = get_scan(cm, tx_size, tx_type, mbmi);
Angie Chiangde58e492017-04-13 17:10:14 -0700111 const int16_t *scan = scan_order->scan;
Angie Chiang133733c2017-03-17 12:50:20 -0700112
Dake Hea47cd6c2017-10-13 18:09:58 -0700113 unsigned int(*nz_map_count)[SIG_COEF_CONTEXTS][2] =
114 (counts) ? &counts->nz_map[txs_ctx][plane_type] : NULL;
115 int16_t dummy;
116 int16_t max_eob_pt = get_eob_pos_token(seg_eob, &dummy);
117
118 int16_t eob_extra = 0;
119 int16_t eob_pt = 0;
120 int is_equal = 0;
121
122 for (int i = 1; i < max_eob_pt; i++) {
Jingning Han35deaa72017-10-26 15:36:30 -0700123 int eob_pos_ctx = av1_get_eob_pos_ctx(tx_type, i);
Dake Hea47cd6c2017-10-13 18:09:58 -0700124 is_equal = av1_read_record_bin(
125 counts, r, ec_ctx->eob_flag_cdf[txs_ctx][plane_type][eob_pos_ctx], 2,
126 ACCT_STR);
Ola Hugosson13892102017-11-06 08:01:44 +0100127 // printf("eob_flag_cdf: %d %d %2d\n", txs_ctx, plane_type, eob_pos_ctx);
Dake Hea47cd6c2017-10-13 18:09:58 -0700128 // aom_read_symbol(r,
129 // ec_ctx->eob_flag_cdf[AOMMIN(txs_ctx,3)][plane_type][eob_pos_ctx], 2,
130 // ACCT_STR);
131 if (counts) ++counts->eob_flag[txs_ctx][plane_type][eob_pos_ctx][is_equal];
132
133 if (is_equal) {
134 eob_pt = i;
135 break;
136 }
137 }
138 if (is_equal == 0) {
139 eob_pt = max_eob_pt;
140 }
141
142 // printf("Dec: ");
143 if (k_eob_offset_bits[eob_pt] > 0) {
Angie Chiang7ab884e2017-10-18 15:57:12 -0700144 int eob_shift = k_eob_offset_bits[eob_pt] - 1;
145 int bit = av1_read_record_bin(
146 counts, r, ec_ctx->eob_extra_cdf[txs_ctx][plane_type][eob_pt], 2,
147 ACCT_STR);
Ola Hugosson13892102017-11-06 08:01:44 +0100148 // printf("eob_extra_cdf: %d %d %2d\n", txs_ctx, plane_type, eob_pt);
Angie Chiang0d04f572017-10-22 18:19:51 -0700149 if (counts) ++counts->eob_extra[txs_ctx][plane_type][eob_pt][bit];
Angie Chiang7ab884e2017-10-18 15:57:12 -0700150 if (bit) {
151 eob_extra += (1 << eob_shift);
152 }
153
154 for (int i = 1; i < k_eob_offset_bits[eob_pt]; i++) {
155 eob_shift = k_eob_offset_bits[eob_pt] - 1 - i;
156 bit = av1_read_record_bit(counts, r, ACCT_STR);
Ola Hugosson13892102017-11-06 08:01:44 +0100157 // printf("eob_bit:\n");
Dake Hea47cd6c2017-10-13 18:09:58 -0700158 if (bit) {
159 eob_extra += (1 << eob_shift);
160 }
161 // printf("%d ", bit);
162 }
163 }
164 *eob = rec_eob_pos(eob_pt, eob_extra);
165 // printf("=>[%d, %d], (%d, %d)\n", seg_eob, *eob, eob_pt, eob_extra);
166
167 for (int i = 0; i < *eob; ++i) {
168 c = *eob - 1 - i;
Ola Hugosson13892102017-11-06 08:01:44 +0100169#if CONFIG_LV_MAP_MULTI
170 (void)nz_map_count;
171 int coeff_ctx =
172 get_nz_map_ctx(levels, c, scan, bwl, height, tx_type, c == *eob - 1);
173 int level = av1_read_record_symbol4(
174 counts, r, ec_ctx->coeff_base_cdf[txs_ctx][plane_type][coeff_ctx], 4,
175 ACCT_STR);
176 levels[get_paded_idx(scan[c], bwl)] = level;
177 // printf("base_cdf: %d %d %2d\n", txs_ctx, plane_type, coeff_ctx);
178 // printf("base_cdf: %d %d %2d : %3d %3d %3d\n", txs_ctx, plane_type,
179 // coeff_ctx,
180 // ec_ctx->coeff_base_cdf[txs_ctx][plane_type][coeff_ctx][0]>>7,
181 // ec_ctx->coeff_base_cdf[txs_ctx][plane_type][coeff_ctx][1]>>7,
182 // ec_ctx->coeff_base_cdf[txs_ctx][plane_type][coeff_ctx][2]>>7);
183 if (level < 3) cul_level += level;
184#else
Dake Hea47cd6c2017-10-13 18:09:58 -0700185 int is_nz;
Linfeng Zhangb6957c22017-10-25 13:17:28 -0700186 int coeff_ctx = get_nz_map_ctx(levels, c, scan, bwl, height, tx_type);
Dake Hea47cd6c2017-10-13 18:09:58 -0700187
188 if (c < *eob - 1) {
Dake Hea47cd6c2017-10-13 18:09:58 -0700189 is_nz = av1_read_record_bin(
190 counts, r, ec_ctx->nz_map_cdf[txs_ctx][plane_type][coeff_ctx], 2,
191 ACCT_STR);
Dake Hea47cd6c2017-10-13 18:09:58 -0700192 } else {
193 is_nz = 1;
194 }
195
196 // set non-zero coefficient map.
Linfeng Zhang1122d7d2017-10-31 15:30:28 -0700197 levels[get_paded_idx(scan[c], bwl)] = is_nz;
Dake Hea47cd6c2017-10-13 18:09:58 -0700198
199 if (counts) ++(*nz_map_count)[coeff_ctx][is_nz];
Dake He03a32922017-10-31 08:06:45 -0700200
201#if USE_CAUSAL_BASE_CTX
202 if (is_nz) {
203 int k;
204 for (k = 0; k < NUM_BASE_LEVELS; ++k) {
205 int ctx = coeff_ctx;
Dake He03a32922017-10-31 08:06:45 -0700206 int is_k = av1_read_record_bin(
207 counts, r, ec_ctx->coeff_base_cdf[txs_ctx][plane_type][k][ctx], 2,
208 ACCT_STR);
209 if (counts) ++counts->coeff_base[txs_ctx][plane_type][k][ctx][is_k];
210
Dake Hebd47bfa2017-11-02 13:44:47 -0700211 // semantic: is_k = 1 if level > (k+1)
Dake He03a32922017-10-31 08:06:45 -0700212 if (is_k == 0) {
213 cul_level += k + 1;
214 break;
215 }
216 }
Linfeng Zhang1122d7d2017-10-31 15:30:28 -0700217 levels[get_paded_idx(scan[c], bwl)] = k + 1;
Dake He03a32922017-10-31 08:06:45 -0700218 }
219#endif
Ola Hugosson13892102017-11-06 08:01:44 +0100220#endif
Dake Hea47cd6c2017-10-13 18:09:58 -0700221 }
Dake Hea47cd6c2017-10-13 18:09:58 -0700222
Angie Chiang29b0fad2017-03-20 16:18:45 -0700223 *max_scan_line = *eob;
Angie Chiangcea11f22017-02-24 12:30:40 -0800224
Dake He03a32922017-10-31 08:06:45 -0700225#if USE_CAUSAL_BASE_CTX
226 update_eob = *eob - 1;
227#else
Angie Chiangcea11f22017-02-24 12:30:40 -0800228 int i;
229 for (i = 0; i < NUM_BASE_LEVELS; ++i) {
Linfeng Zhangf72e1382017-11-01 13:59:41 -0700230 av1_get_base_level_counts(levels, i, width, height, level_counts);
Angie Chiang29b0fad2017-03-20 16:18:45 -0700231 for (c = *eob - 1; c >= 0; --c) {
Linfeng Zhang1122d7d2017-10-31 15:30:28 -0700232 uint8_t *const level = &levels[get_paded_idx(scan[c], bwl)];
Angie Chiangcea11f22017-02-24 12:30:40 -0800233 int ctx;
234
Linfeng Zhangce065ca2017-10-17 16:49:30 -0700235 if (*level <= i) continue;
Angie Chiangcea11f22017-02-24 12:30:40 -0800236
Linfeng Zhangf72e1382017-11-01 13:59:41 -0700237 ctx = get_base_ctx(levels, scan[c], bwl, i, level_counts[scan[c]]);
Angie Chiangcea11f22017-02-24 12:30:40 -0800238
Jingning Han94cea4a2017-09-30 14:13:23 -0700239 if (av1_read_record_bin(
Angie Chiang85e3b962017-10-01 16:04:43 -0700240 counts, r, ec_ctx->coeff_base_cdf[txs_ctx][plane_type][i][ctx], 2,
Jingning Han00803a72017-10-25 16:04:34 -0700241 ACCT_STR)) {
Linfeng Zhangce065ca2017-10-17 16:49:30 -0700242 assert(*level == i + 1);
Angie Chiangcea11f22017-02-24 12:30:40 -0800243 cul_level += i + 1;
244
Jingning Han48be0e12017-06-13 12:12:01 -0700245 if (counts) ++counts->coeff_base[txs_ctx][plane_type][i][ctx][1];
Angie Chiangcea11f22017-02-24 12:30:40 -0800246
Angie Chiangcea11f22017-02-24 12:30:40 -0800247 continue;
248 }
Linfeng Zhangce065ca2017-10-17 16:49:30 -0700249 *level = i + 2;
Jingning Han48be0e12017-06-13 12:12:01 -0700250 if (counts) ++counts->coeff_base[txs_ctx][plane_type][i][ctx][0];
Angie Chiangcea11f22017-02-24 12:30:40 -0800251
252 // update the eob flag for coefficients with magnitude above 1.
253 update_eob = AOMMAX(update_eob, c);
254 }
255 }
Dake He03a32922017-10-31 08:06:45 -0700256#endif
Angie Chiangcea11f22017-02-24 12:30:40 -0800257
Dake He43edb762017-10-26 10:29:46 -0700258 // Loop to decode all signs in the transform block,
259 // starting with the sign of the DC (if applicable)
260 for (c = 0; c < *eob; ++c) {
Linfeng Zhangce065ca2017-10-17 16:49:30 -0700261 int8_t *const sign = &signs[scan[c]];
Linfeng Zhang1122d7d2017-10-31 15:30:28 -0700262 if (levels[get_paded_idx(scan[c], bwl)] == 0) continue;
Angie Chiangcea11f22017-02-24 12:30:40 -0800263 if (c == 0) {
264 int dc_sign_ctx = txb_ctx->dc_sign_ctx;
Dake He43edb762017-10-26 10:29:46 -0700265#if LV_MAP_PROB
Linfeng Zhangce065ca2017-10-17 16:49:30 -0700266 *sign = av1_read_record_bin(
Angie Chiang85e3b962017-10-01 16:04:43 -0700267 counts, r, ec_ctx->dc_sign_cdf[plane_type][dc_sign_ctx], 2, ACCT_STR);
Ola Hugosson13892102017-11-06 08:01:44 +0100268// printf("dc_sign: %d %d\n", plane_type, dc_sign_ctx);
Dake He43edb762017-10-26 10:29:46 -0700269#else
270 *sign = aom_read(r, ec_ctx->dc_sign[plane_type][dc_sign_ctx], ACCT_STR);
271#endif
Linfeng Zhangce065ca2017-10-17 16:49:30 -0700272 if (counts) ++counts->dc_sign[plane_type][dc_sign_ctx][*sign];
Angie Chiangcea11f22017-02-24 12:30:40 -0800273 } else {
Linfeng Zhangce065ca2017-10-17 16:49:30 -0700274 *sign = av1_read_record_bit(counts, r, ACCT_STR);
Angie Chiangcea11f22017-02-24 12:30:40 -0800275 }
Dake He43edb762017-10-26 10:29:46 -0700276 }
277
Linfeng Zhang97fc4742017-11-07 12:57:25 -0800278 if (update_eob >= 0) {
279 av1_get_br_level_counts(levels, width, height, level_counts);
280 for (c = update_eob; c >= 0; --c) {
281 uint8_t *const level = &levels[get_paded_idx(scan[c], bwl)];
282 int idx;
283 int ctx;
Dake He43edb762017-10-26 10:29:46 -0700284
Linfeng Zhang97fc4742017-11-07 12:57:25 -0800285 if (*level <= NUM_BASE_LEVELS) continue;
Angie Chiangcea11f22017-02-24 12:30:40 -0800286
Linfeng Zhang97fc4742017-11-07 12:57:25 -0800287 ctx = get_br_ctx(levels, scan[c], bwl, level_counts[scan[c]]);
Angie Chiangcea11f22017-02-24 12:30:40 -0800288
Ola Hugossone72a2092017-11-12 09:11:53 +0100289#if CONFIG_LV_MAP_MULTI
290 for (idx = 0; idx < COEFF_BASE_RANGE / (BR_CDF_SIZE - 1); ++idx) {
291 int k = av1_read_record_symbol4(
292 counts, r, ec_ctx->coeff_br_cdf[txs_ctx][plane_type][ctx],
293 BR_CDF_SIZE, ACCT_STR);
294 *level += k;
295 if (k < BR_CDF_SIZE - 1) break;
296 }
297 if (*level <= NUM_BASE_LEVELS + COEFF_BASE_RANGE) {
298 cul_level += *level;
299 continue;
300 }
301#else
Linfeng Zhang97fc4742017-11-07 12:57:25 -0800302 for (idx = 0; idx < BASE_RANGE_SETS; ++idx) {
Ola Hugosson13892102017-11-06 08:01:44 +0100303 // printf("br: %d %d %d %d\n", txs_ctx, plane_type, idx, ctx);
Linfeng Zhang97fc4742017-11-07 12:57:25 -0800304 if (av1_read_record_bin(
305 counts, r, ec_ctx->coeff_br_cdf[txs_ctx][plane_type][idx][ctx],
306 2, ACCT_STR)) {
307 int extra_bits = (1 << br_extra_bits[idx]) - 1;
308 // int br_offset = aom_read_literal(r, extra_bits, ACCT_STR);
309 int br_offset = 0;
310 int tok;
311 if (counts) ++counts->coeff_br[txs_ctx][plane_type][idx][ctx][1];
312 for (tok = 0; tok < extra_bits; ++tok) {
313 if (av1_read_record_bin(
314 counts, r, ec_ctx->coeff_lps_cdf[txs_ctx][plane_type][ctx],
315 2, ACCT_STR)) {
316 br_offset = tok;
317 if (counts) ++counts->coeff_lps[txs_ctx][plane_type][ctx][1];
318 break;
319 }
320 if (counts) ++counts->coeff_lps[txs_ctx][plane_type][ctx][0];
Jingning Han87b01b52017-08-31 12:07:20 -0700321 }
Linfeng Zhang97fc4742017-11-07 12:57:25 -0800322 if (tok == extra_bits) br_offset = extra_bits;
323
324 int br_base = br_index_to_coeff[idx];
325
326 *level = NUM_BASE_LEVELS + 1 + br_base + br_offset;
327 cul_level += *level;
328 break;
Jingning Han87b01b52017-08-31 12:07:20 -0700329 }
Linfeng Zhang97fc4742017-11-07 12:57:25 -0800330 if (counts) ++counts->coeff_br[txs_ctx][plane_type][idx][ctx][0];
Jingning Han87b01b52017-08-31 12:07:20 -0700331 }
Linfeng Zhang97fc4742017-11-07 12:57:25 -0800332
333 if (idx < BASE_RANGE_SETS) continue;
Ola Hugossone72a2092017-11-12 09:11:53 +0100334#endif
Linfeng Zhang97fc4742017-11-07 12:57:25 -0800335 // decode 0-th order Golomb code
336 *level = COEFF_BASE_RANGE + 1 + NUM_BASE_LEVELS;
337 // Save golomb in tcoeffs because adding it to level may incur overflow
338 tcoeffs[scan[c]] = read_golomb(xd, r, counts);
339 cul_level += *level + tcoeffs[scan[c]];
Jingning Han87b01b52017-08-31 12:07:20 -0700340 }
Angie Chiangcea11f22017-02-24 12:30:40 -0800341 }
342
Angie Chiang29b0fad2017-03-20 16:18:45 -0700343 for (c = 0; c < *eob; ++c) {
Linfeng Zhangce065ca2017-10-17 16:49:30 -0700344 const int16_t dqv = (c == 0) ? dequant[0] : dequant[1];
Linfeng Zhang1122d7d2017-10-31 15:30:28 -0700345 const int level = levels[get_paded_idx(scan[c], bwl)];
Ola Hugosson13892102017-11-06 08:01:44 +0100346 // printf("level: %3d\n", level);
347 // printf("activity: %d %d %2d %3d\n", txs_ctx, plane_type, base_cul_level,
348 // level);
Jonathan Matthews14195f42017-10-25 14:05:23 +0100349 const tran_low_t t = ((level + tcoeffs[scan[c]]) * dqv) >> shift;
Angie Chiang2c1785c2017-10-01 16:32:27 -0700350#if CONFIG_SYMBOLRATE
Linfeng Zhangce065ca2017-10-17 16:49:30 -0700351 av1_record_coeff(counts, level);
Angie Chiang2c1785c2017-10-01 16:32:27 -0700352#endif
Linfeng Zhangce065ca2017-10-17 16:49:30 -0700353 tcoeffs[scan[c]] = signs[scan[c]] ? -t : t;
Angie Chiangcea11f22017-02-24 12:30:40 -0800354 }
355
356 cul_level = AOMMIN(63, cul_level);
357
358 // DC value
359 set_dc_sign(&cul_level, tcoeffs[0]);
360
361 return cul_level;
362}
Angie Chiang133733c2017-03-17 12:50:20 -0700363
Angie Chiang5c0568a2017-03-21 16:00:39 -0700364uint8_t av1_read_coeffs_txb_facade(AV1_COMMON *cm, MACROBLOCKD *xd,
Angie Chiang133733c2017-03-17 12:50:20 -0700365 aom_reader *r, int row, int col, int block,
366 int plane, tran_low_t *tcoeffs,
Jingning Hanaba246d2017-06-14 12:00:16 -0700367 TX_SIZE tx_size, int16_t *max_scan_line,
368 int *eob) {
Angie Chiang133733c2017-03-17 12:50:20 -0700369 MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi;
Angie Chiang29b0fad2017-03-20 16:18:45 -0700370 struct macroblockd_plane *pd = &xd->plane[plane];
Angie Chiang133733c2017-03-17 12:50:20 -0700371
372 const BLOCK_SIZE bsize = mbmi->sb_type;
Angie Chiang133733c2017-03-17 12:50:20 -0700373 const BLOCK_SIZE plane_bsize =
374 AOMMAX(BLOCK_4X4, get_plane_block_size(bsize, pd));
Angie Chiang133733c2017-03-17 12:50:20 -0700375
Angie Chiang133733c2017-03-17 12:50:20 -0700376 TXB_CTX txb_ctx;
377 get_txb_ctx(plane_bsize, tx_size, plane, pd->above_context + col,
378 pd->left_context + row, &txb_ctx);
Jingning Han7eab9ff2017-07-06 10:12:54 -0700379 uint8_t cul_level =
380 av1_read_coeffs_txb(cm, xd, r, row, col, block, plane, tcoeffs, &txb_ctx,
381 tx_size, max_scan_line, eob);
Angie Chiang5c0568a2017-03-21 16:00:39 -0700382#if CONFIG_ADAPT_SCAN
383 PLANE_TYPE plane_type = get_plane_type(plane);
Angie Chiang57127c52017-07-24 13:27:07 -0700384 TX_TYPE tx_type = av1_get_tx_type(plane_type, xd, row, col, block, tx_size);
Angie Chiang5c0568a2017-03-21 16:00:39 -0700385 if (xd->counts && *eob > 0)
386 av1_update_scan_count_facade(cm, xd->counts, tx_size, tx_type, pd->dqcoeff,
387 *eob);
388#endif
Angie Chiang29b0fad2017-03-20 16:18:45 -0700389 av1_set_contexts(xd, pd, plane, tx_size, cul_level, col, row);
390 return cul_level;
Angie Chiang133733c2017-03-17 12:50:20 -0700391}