blob: 5c4dc669a3192deb3e5abc175db01bc3ceee453d [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
Linfeng Zhangae7b2f32017-11-08 15:46:57 -080012#include "aom_ports/mem.h"
Angie Chiangcea11f22017-02-24 12:30:40 -080013#include "av1/common/scan.h"
Angie Chiang133733c2017-03-17 12:50:20 -070014#include "av1/common/idct.h"
Angie Chiangcea11f22017-02-24 12:30:40 -080015#include "av1/common/txb_common.h"
Angie Chiangde58e492017-04-13 17:10:14 -070016#include "av1/decoder/decodemv.h"
Angie Chiangcea11f22017-02-24 12:30:40 -080017#include "av1/decoder/decodetxb.h"
Angie Chiang800df032017-03-22 11:14:12 -070018#include "av1/decoder/dsubexp.h"
Angie Chiang85e3b962017-10-01 16:04:43 -070019#include "av1/decoder/symbolrate.h"
Angie Chiangcea11f22017-02-24 12:30:40 -080020
21#define ACCT_STR __func__
22
Angie Chiang85e3b962017-10-01 16:04:43 -070023static int read_golomb(MACROBLOCKD *xd, aom_reader *r, FRAME_COUNTS *counts) {
24#if !CONFIG_SYMBOLRATE
25 (void)counts;
26#endif
Angie Chiangcea11f22017-02-24 12:30:40 -080027 int x = 1;
28 int length = 0;
29 int i = 0;
30
31 while (!i) {
Angie Chiang85e3b962017-10-01 16:04:43 -070032 i = av1_read_record_bit(counts, r, ACCT_STR);
Angie Chiangcea11f22017-02-24 12:30:40 -080033 ++length;
Angie Chiangf1880e12017-04-12 15:40:44 -070034 if (length >= 32) {
35 aom_internal_error(xd->error_info, AOM_CODEC_CORRUPT_FRAME,
36 "Invalid length in read_golomb");
37 break;
38 }
Angie Chiangcea11f22017-02-24 12:30:40 -080039 }
40
41 for (i = 0; i < length - 1; ++i) {
42 x <<= 1;
Angie Chiang85e3b962017-10-01 16:04:43 -070043 x += av1_read_record_bit(counts, r, ACCT_STR);
Angie Chiangcea11f22017-02-24 12:30:40 -080044 }
45
46 return x - 1;
47}
48
Dake Hea47cd6c2017-10-13 18:09:58 -070049static INLINE int rec_eob_pos(int16_t eob_token, int16_t extra) {
50 int eob = k_eob_group_start[eob_token];
51 if (eob > 2) {
52 eob += extra;
53 }
54 return eob;
55}
Dake Hea47cd6c2017-10-13 18:09:58 -070056
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -080057uint8_t av1_read_coeffs_txb(const AV1_COMMON *const cm, MACROBLOCKD *const xd,
58 aom_reader *const r, const int blk_row,
59 const int blk_col, const int block, const int plane,
60 tran_low_t *const tcoeffs,
61 const TXB_CTX *const txb_ctx, const TX_SIZE tx_size,
62 int16_t *const max_scan_line, int *const eob) {
63 FRAME_CONTEXT *const ec_ctx = xd->tile_ctx;
Jingning Han58807582017-11-16 22:24:15 -080064#if TXCOEFF_TIMER
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -080065 FRAME_COUNTS *const counts = NULL;
Jingning Han58807582017-11-16 22:24:15 -080066#else
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -080067 FRAME_COUNTS *const counts = xd->counts;
Jingning Han58807582017-11-16 22:24:15 -080068#endif
Debargha Mukherjeeb3eda2f2017-11-28 16:00:20 -080069 const TX_SIZE txs_ctx = get_txsize_entropy_ctx(tx_size);
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -080070 const PLANE_TYPE plane_type = get_plane_type(plane);
71 MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
Urvang Joshi80893152017-10-27 11:51:14 -070072 const int seg_eob = av1_get_max_eob(tx_size);
Angie Chiangcea11f22017-02-24 12:30:40 -080073 int c = 0;
Linfeng Zhang530bee22017-11-28 16:42:27 -080074 int num_updates = 0;
Monty Montgomery125c0fc2017-10-26 00:44:35 -040075 const int16_t *const dequant =
76 xd->plane[plane].seg_dequant_QTX[mbmi->segment_id];
Jingning Hanff705452017-04-27 11:32:15 -070077 const int shift = av1_get_tx_scale(tx_size);
Jingning Han4b9892d2017-11-16 19:39:59 -080078 const int bwl = tx_size_wide_log2[tx_size];
Linfeng Zhang679d81e2017-10-31 15:27:42 -070079 const int width = tx_size_wide[tx_size];
Jingning Han341d79e2017-06-13 15:57:59 -070080 const int height = tx_size_high[tx_size];
Angie Chiangcea11f22017-02-24 12:30:40 -080081 int cul_level = 0;
Linfeng Zhang679d81e2017-10-31 15:27:42 -070082 uint8_t levels_buf[TX_PAD_2D];
83 uint8_t *const levels = set_levels(levels_buf, width);
Linfeng Zhangae7b2f32017-11-08 15:46:57 -080084 DECLARE_ALIGNED(16, uint8_t, level_counts[MAX_TX_SQUARE]);
Linfeng Zhang1015a342017-10-24 16:20:41 -070085 int8_t signs[MAX_TX_SQUARE];
Linfeng Zhang530bee22017-11-28 16:42:27 -080086 uint16_t update_pos[MAX_TX_SQUARE];
Linfeng Zhangce065ca2017-10-17 16:49:30 -070087
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -080088 const int all_zero = av1_read_record_bin(
Angie Chiang85e3b962017-10-01 16:04:43 -070089 counts, r, ec_ctx->txb_skip_cdf[txs_ctx][txb_ctx->txb_skip_ctx], 2,
90 ACCT_STR);
Ola Hugosson13892102017-11-06 08:01:44 +010091 // printf("txb_skip: %d %2d\n", txs_ctx, txb_ctx->txb_skip_ctx);
Angie Chiang133733c2017-03-17 12:50:20 -070092 if (xd->counts)
Jingning Han48be0e12017-06-13 12:12:01 -070093 ++xd->counts->txb_skip[txs_ctx][txb_ctx->txb_skip_ctx][all_zero];
Angie Chiang29b0fad2017-03-20 16:18:45 -070094 *eob = 0;
Angie Chiang133733c2017-03-17 12:50:20 -070095 if (all_zero) {
96 *max_scan_line = 0;
Jingning Han19b5c8f2017-07-06 15:10:12 -070097#if CONFIG_TXK_SEL
98 if (plane == 0) mbmi->txk_type[(blk_row << 4) + blk_col] = DCT_DCT;
99#endif
Angie Chiang133733c2017-03-17 12:50:20 -0700100 return 0;
101 }
102
Linfeng Zhang679d81e2017-10-31 15:27:42 -0700103 memset(levels_buf, 0,
Linfeng Zhang1122d7d2017-10-31 15:30:28 -0700104 sizeof(*levels_buf) *
105 ((width + TX_PAD_HOR) * (height + TX_PAD_VER) + TX_PAD_END));
Linfeng Zhangce065ca2017-10-17 16:49:30 -0700106
Jingning Han7eab9ff2017-07-06 10:12:54 -0700107 (void)blk_row;
108 (void)blk_col;
Angie Chiangcd9b03f2017-04-16 13:37:13 -0700109#if CONFIG_TXK_SEL
Jingning Han19b5c8f2017-07-06 15:10:12 -0700110 av1_read_tx_type(cm, xd, blk_row, blk_col, block, plane,
111 get_min_tx_size(tx_size), r);
Angie Chiangcd9b03f2017-04-16 13:37:13 -0700112#endif
Jingning Han19b5c8f2017-07-06 15:10:12 -0700113 const TX_TYPE tx_type =
114 av1_get_tx_type(plane_type, xd, blk_row, blk_col, block, tx_size);
Angie Chiangbd99b382017-06-20 15:11:16 -0700115 const SCAN_ORDER *const scan_order = get_scan(cm, tx_size, tx_type, mbmi);
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -0800116 const int16_t *const scan = scan_order->scan;
Angie Chiang133733c2017-03-17 12:50:20 -0700117
Dake Hea47cd6c2017-10-13 18:09:58 -0700118 int16_t dummy;
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -0800119 const int16_t max_eob_pt = get_eob_pos_token(seg_eob, &dummy);
Dake Hea47cd6c2017-10-13 18:09:58 -0700120
121 int16_t eob_extra = 0;
122 int16_t eob_pt = 0;
123 int is_equal = 0;
124
125 for (int i = 1; i < max_eob_pt; i++) {
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -0800126 const int eob_pos_ctx = av1_get_eob_pos_ctx(tx_type, i);
Dake Hea47cd6c2017-10-13 18:09:58 -0700127 is_equal = av1_read_record_bin(
128 counts, r, ec_ctx->eob_flag_cdf[txs_ctx][plane_type][eob_pos_ctx], 2,
129 ACCT_STR);
Ola Hugosson13892102017-11-06 08:01:44 +0100130 // printf("eob_flag_cdf: %d %d %2d\n", txs_ctx, plane_type, eob_pos_ctx);
Dake Hea47cd6c2017-10-13 18:09:58 -0700131 // aom_read_symbol(r,
132 // ec_ctx->eob_flag_cdf[AOMMIN(txs_ctx,3)][plane_type][eob_pos_ctx], 2,
133 // ACCT_STR);
134 if (counts) ++counts->eob_flag[txs_ctx][plane_type][eob_pos_ctx][is_equal];
135
136 if (is_equal) {
137 eob_pt = i;
138 break;
139 }
140 }
141 if (is_equal == 0) {
142 eob_pt = max_eob_pt;
143 }
144
145 // printf("Dec: ");
146 if (k_eob_offset_bits[eob_pt] > 0) {
Angie Chiang7ab884e2017-10-18 15:57:12 -0700147 int bit = av1_read_record_bin(
148 counts, r, ec_ctx->eob_extra_cdf[txs_ctx][plane_type][eob_pt], 2,
149 ACCT_STR);
Ola Hugosson13892102017-11-06 08:01:44 +0100150 // printf("eob_extra_cdf: %d %d %2d\n", txs_ctx, plane_type, eob_pt);
Angie Chiang0d04f572017-10-22 18:19:51 -0700151 if (counts) ++counts->eob_extra[txs_ctx][plane_type][eob_pt][bit];
Angie Chiang7ab884e2017-10-18 15:57:12 -0700152 if (bit) {
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -0800153 eob_extra += (1 << (k_eob_offset_bits[eob_pt] - 1));
Angie Chiang7ab884e2017-10-18 15:57:12 -0700154 }
155
156 for (int i = 1; i < k_eob_offset_bits[eob_pt]; i++) {
Angie Chiang7ab884e2017-10-18 15:57:12 -0700157 bit = av1_read_record_bit(counts, r, ACCT_STR);
Ola Hugosson13892102017-11-06 08:01:44 +0100158 // printf("eob_bit:\n");
Dake Hea47cd6c2017-10-13 18:09:58 -0700159 if (bit) {
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -0800160 eob_extra += (1 << (k_eob_offset_bits[eob_pt] - 1 - i));
Dake Hea47cd6c2017-10-13 18:09:58 -0700161 }
162 // printf("%d ", bit);
163 }
164 }
165 *eob = rec_eob_pos(eob_pt, eob_extra);
166 // printf("=>[%d, %d], (%d, %d)\n", seg_eob, *eob, eob_pt, eob_extra);
167
168 for (int i = 0; i < *eob; ++i) {
169 c = *eob - 1 - i;
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -0800170 const int pos = scan[c];
Ola Hugosson13892102017-11-06 08:01:44 +0100171#if CONFIG_LV_MAP_MULTI
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -0800172 const int coeff_ctx =
Ola Hugosson13892102017-11-06 08:01:44 +0100173 get_nz_map_ctx(levels, c, scan, bwl, height, tx_type, c == *eob - 1);
Dake He3fe369c2017-11-16 17:56:44 -0800174#if USE_BASE_EOB_ALPHABET
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -0800175 aom_cdf_prob *cdf;
176 int nsymbs;
Dake He3fe369c2017-11-16 17:56:44 -0800177 if (c == *eob - 1) {
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -0800178 cdf = ec_ctx->coeff_base_eob_cdf[txs_ctx][plane_type]
179 [coeff_ctx - SIG_COEF_CONTEXTS +
180 SIG_COEF_CONTEXTS_EOB];
181 nsymbs = 3;
Dake He3fe369c2017-11-16 17:56:44 -0800182 } else {
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -0800183 cdf = ec_ctx->coeff_base_cdf[txs_ctx][plane_type][coeff_ctx];
184 nsymbs = 4;
Dake He3fe369c2017-11-16 17:56:44 -0800185 }
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -0800186 const int level = av1_read_record_symbol(counts, r, cdf, nsymbs, ACCT_STR) +
187 (c == *eob - 1);
Dake He3fe369c2017-11-16 17:56:44 -0800188#else
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -0800189 const int level = av1_read_record_symbol(
Ola Hugosson13892102017-11-06 08:01:44 +0100190 counts, r, ec_ctx->coeff_base_cdf[txs_ctx][plane_type][coeff_ctx], 4,
191 ACCT_STR);
Dake He3fe369c2017-11-16 17:56:44 -0800192#endif
Ola Hugosson13892102017-11-06 08:01:44 +0100193 // printf("base_cdf: %d %d %2d\n", txs_ctx, plane_type, coeff_ctx);
194 // printf("base_cdf: %d %d %2d : %3d %3d %3d\n", txs_ctx, plane_type,
195 // coeff_ctx,
196 // ec_ctx->coeff_base_cdf[txs_ctx][plane_type][coeff_ctx][0]>>7,
197 // ec_ctx->coeff_base_cdf[txs_ctx][plane_type][coeff_ctx][1]>>7,
198 // ec_ctx->coeff_base_cdf[txs_ctx][plane_type][coeff_ctx][2]>>7);
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -0800199 if (level) {
200 levels[get_paded_idx(pos, bwl)] = level;
201 *max_scan_line = AOMMAX(*max_scan_line, pos);
202 if (level < 3) {
203 cul_level += level;
204 tcoeffs[pos] = (level * dequant[!!c]) >> shift;
Linfeng Zhang530bee22017-11-28 16:42:27 -0800205 } else {
206 update_pos[num_updates++] = pos;
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -0800207 }
Jingning Han8682cd92017-11-16 20:08:31 -0800208 }
Ola Hugosson13892102017-11-06 08:01:44 +0100209#else
Dake Hea47cd6c2017-10-13 18:09:58 -0700210 int is_nz;
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -0800211 const int coeff_ctx = get_nz_map_ctx(levels, c, scan, bwl, height, tx_type);
Dake Hea47cd6c2017-10-13 18:09:58 -0700212
213 if (c < *eob - 1) {
Dake Hea47cd6c2017-10-13 18:09:58 -0700214 is_nz = av1_read_record_bin(
215 counts, r, ec_ctx->nz_map_cdf[txs_ctx][plane_type][coeff_ctx], 2,
216 ACCT_STR);
Dake Hea47cd6c2017-10-13 18:09:58 -0700217 } else {
218 is_nz = 1;
219 }
220
Dake He03a32922017-10-31 08:06:45 -0700221#if USE_CAUSAL_BASE_CTX
222 if (is_nz) {
223 int k;
224 for (k = 0; k < NUM_BASE_LEVELS; ++k) {
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -0800225 const int ctx = coeff_ctx;
226 const int is_k = av1_read_record_bin(
Dake He03a32922017-10-31 08:06:45 -0700227 counts, r, ec_ctx->coeff_base_cdf[txs_ctx][plane_type][k][ctx], 2,
228 ACCT_STR);
229 if (counts) ++counts->coeff_base[txs_ctx][plane_type][k][ctx][is_k];
230
Dake Hebd47bfa2017-11-02 13:44:47 -0700231 // semantic: is_k = 1 if level > (k+1)
Dake He03a32922017-10-31 08:06:45 -0700232 if (is_k == 0) {
233 cul_level += k + 1;
Jingning Hancf3a0822017-11-16 22:19:39 -0800234 tcoeffs[pos] = ((k + 1) * dequant[!!c]) >> shift;
Dake He03a32922017-10-31 08:06:45 -0700235 break;
236 }
237 }
Jingning Hancf3a0822017-11-16 22:19:39 -0800238 levels[get_paded_idx(pos, bwl)] = k + 1;
239 *max_scan_line = AOMMAX(*max_scan_line, pos);
Linfeng Zhang530bee22017-11-28 16:42:27 -0800240 if (k == NUM_BASE_LEVELS) {
241 update_pos[num_updates++] = pos;
242 }
Dake He03a32922017-10-31 08:06:45 -0700243 }
Jingning Hancf3a0822017-11-16 22:19:39 -0800244#else
245 // set non-zero coefficient map.
246 unsigned int(*nz_map_count)[SIG_COEF_CONTEXTS][2] =
247 (counts) ? &counts->nz_map[txs_ctx][plane_type] : NULL;
248 levels[get_paded_idx(pos, bwl)] = is_nz;
249 if (counts) ++(*nz_map_count)[coeff_ctx][is_nz];
Dake He03a32922017-10-31 08:06:45 -0700250#endif
Ola Hugosson13892102017-11-06 08:01:44 +0100251#endif
Dake Hea47cd6c2017-10-13 18:09:58 -0700252 }
Dake Hea47cd6c2017-10-13 18:09:58 -0700253
Jingning Han8682cd92017-11-16 20:08:31 -0800254#if !USE_CAUSAL_BASE_CTX
Angie Chiangcea11f22017-02-24 12:30:40 -0800255 int i;
256 for (i = 0; i < NUM_BASE_LEVELS; ++i) {
Linfeng Zhangf72e1382017-11-01 13:59:41 -0700257 av1_get_base_level_counts(levels, i, width, height, level_counts);
Angie Chiang29b0fad2017-03-20 16:18:45 -0700258 for (c = *eob - 1; c >= 0; --c) {
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -0800259 const int pos = scan[c];
260 uint8_t *const level = &levels[get_paded_idx(pos, bwl)];
Angie Chiangcea11f22017-02-24 12:30:40 -0800261 int ctx;
262
Linfeng Zhangce065ca2017-10-17 16:49:30 -0700263 if (*level <= i) continue;
Angie Chiangcea11f22017-02-24 12:30:40 -0800264
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -0800265 ctx = get_base_ctx(levels, pos, bwl, i, level_counts[pos]);
Angie Chiangcea11f22017-02-24 12:30:40 -0800266
Jingning Han94cea4a2017-09-30 14:13:23 -0700267 if (av1_read_record_bin(
Angie Chiang85e3b962017-10-01 16:04:43 -0700268 counts, r, ec_ctx->coeff_base_cdf[txs_ctx][plane_type][i][ctx], 2,
Jingning Han00803a72017-10-25 16:04:34 -0700269 ACCT_STR)) {
Linfeng Zhangce065ca2017-10-17 16:49:30 -0700270 assert(*level == i + 1);
Angie Chiangcea11f22017-02-24 12:30:40 -0800271 cul_level += i + 1;
272
Jingning Han48be0e12017-06-13 12:12:01 -0700273 if (counts) ++counts->coeff_base[txs_ctx][plane_type][i][ctx][1];
Angie Chiangcea11f22017-02-24 12:30:40 -0800274
Angie Chiangcea11f22017-02-24 12:30:40 -0800275 continue;
276 }
Linfeng Zhangce065ca2017-10-17 16:49:30 -0700277 *level = i + 2;
Jingning Han48be0e12017-06-13 12:12:01 -0700278 if (counts) ++counts->coeff_base[txs_ctx][plane_type][i][ctx][0];
Angie Chiangcea11f22017-02-24 12:30:40 -0800279
Linfeng Zhang530bee22017-11-28 16:42:27 -0800280 update_pos[num_updates++] = pos;
Angie Chiangcea11f22017-02-24 12:30:40 -0800281 }
282 }
Dake He03a32922017-10-31 08:06:45 -0700283#endif
Angie Chiangcea11f22017-02-24 12:30:40 -0800284
Dake He43edb762017-10-26 10:29:46 -0700285 // Loop to decode all signs in the transform block,
286 // starting with the sign of the DC (if applicable)
287 for (c = 0; c < *eob; ++c) {
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -0800288 const int pos = scan[c];
Jingning Hancf3a0822017-11-16 22:19:39 -0800289 int8_t *const sign = &signs[pos];
290 if (levels[get_paded_idx(pos, bwl)] == 0) continue;
Angie Chiangcea11f22017-02-24 12:30:40 -0800291 if (c == 0) {
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -0800292 const int dc_sign_ctx = txb_ctx->dc_sign_ctx;
Dake He43edb762017-10-26 10:29:46 -0700293#if LV_MAP_PROB
Linfeng Zhangce065ca2017-10-17 16:49:30 -0700294 *sign = av1_read_record_bin(
Angie Chiang85e3b962017-10-01 16:04:43 -0700295 counts, r, ec_ctx->dc_sign_cdf[plane_type][dc_sign_ctx], 2, ACCT_STR);
Ola Hugosson13892102017-11-06 08:01:44 +0100296// printf("dc_sign: %d %d\n", plane_type, dc_sign_ctx);
Dake He43edb762017-10-26 10:29:46 -0700297#else
298 *sign = aom_read(r, ec_ctx->dc_sign[plane_type][dc_sign_ctx], ACCT_STR);
299#endif
Linfeng Zhangce065ca2017-10-17 16:49:30 -0700300 if (counts) ++counts->dc_sign[plane_type][dc_sign_ctx][*sign];
Angie Chiangcea11f22017-02-24 12:30:40 -0800301 } else {
Linfeng Zhangce065ca2017-10-17 16:49:30 -0700302 *sign = av1_read_record_bit(counts, r, ACCT_STR);
Angie Chiangcea11f22017-02-24 12:30:40 -0800303 }
Jingning Hanad2c1782017-11-18 14:30:46 -0800304 if (*sign) tcoeffs[pos] = -tcoeffs[pos];
Dake He43edb762017-10-26 10:29:46 -0700305 }
306
Linfeng Zhang530bee22017-11-28 16:42:27 -0800307 if (num_updates) {
Linfeng Zhang97fc4742017-11-07 12:57:25 -0800308 av1_get_br_level_counts(levels, width, height, level_counts);
Linfeng Zhang530bee22017-11-28 16:42:27 -0800309 for (c = 0; c < num_updates; ++c) {
310 const int pos = update_pos[c];
Jingning Hancf3a0822017-11-16 22:19:39 -0800311 uint8_t *const level = &levels[get_paded_idx(pos, bwl)];
Linfeng Zhang97fc4742017-11-07 12:57:25 -0800312 int idx;
313 int ctx;
Dake He43edb762017-10-26 10:29:46 -0700314
Linfeng Zhang530bee22017-11-28 16:42:27 -0800315#if USE_CAUSAL_BASE_CTX
316 assert(*level > NUM_BASE_LEVELS);
317#else
Linfeng Zhang97fc4742017-11-07 12:57:25 -0800318 if (*level <= NUM_BASE_LEVELS) continue;
Linfeng Zhang530bee22017-11-28 16:42:27 -0800319#endif
Angie Chiangcea11f22017-02-24 12:30:40 -0800320
Jingning Hancf3a0822017-11-16 22:19:39 -0800321 ctx = get_br_ctx(levels, pos, bwl, level_counts[pos]);
Angie Chiangcea11f22017-02-24 12:30:40 -0800322
Ola Hugossone72a2092017-11-12 09:11:53 +0100323#if CONFIG_LV_MAP_MULTI
324 for (idx = 0; idx < COEFF_BASE_RANGE / (BR_CDF_SIZE - 1); ++idx) {
Thomas Davies736ddef2017-11-09 09:46:08 +0000325 int k = av1_read_record_symbol(
Ola Hugossone72a2092017-11-12 09:11:53 +0100326 counts, r, ec_ctx->coeff_br_cdf[txs_ctx][plane_type][ctx],
327 BR_CDF_SIZE, ACCT_STR);
328 *level += k;
329 if (k < BR_CDF_SIZE - 1) break;
330 }
331 if (*level <= NUM_BASE_LEVELS + COEFF_BASE_RANGE) {
332 cul_level += *level;
Linfeng Zhang530bee22017-11-28 16:42:27 -0800333 tran_low_t t = (*level * dequant[!!pos]) >> shift;
Jingning Hancf3a0822017-11-16 22:19:39 -0800334 if (signs[pos]) t = -t;
335 tcoeffs[pos] = t;
Ola Hugossone72a2092017-11-12 09:11:53 +0100336 continue;
337 }
338#else
Linfeng Zhang97fc4742017-11-07 12:57:25 -0800339 for (idx = 0; idx < BASE_RANGE_SETS; ++idx) {
Ola Hugosson13892102017-11-06 08:01:44 +0100340 // printf("br: %d %d %d %d\n", txs_ctx, plane_type, idx, ctx);
Linfeng Zhang97fc4742017-11-07 12:57:25 -0800341 if (av1_read_record_bin(
342 counts, r, ec_ctx->coeff_br_cdf[txs_ctx][plane_type][idx][ctx],
343 2, ACCT_STR)) {
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -0800344 const int extra_bits = (1 << br_extra_bits[idx]) - 1;
Linfeng Zhang97fc4742017-11-07 12:57:25 -0800345 // int br_offset = aom_read_literal(r, extra_bits, ACCT_STR);
346 int br_offset = 0;
347 int tok;
348 if (counts) ++counts->coeff_br[txs_ctx][plane_type][idx][ctx][1];
349 for (tok = 0; tok < extra_bits; ++tok) {
350 if (av1_read_record_bin(
351 counts, r, ec_ctx->coeff_lps_cdf[txs_ctx][plane_type][ctx],
352 2, ACCT_STR)) {
353 br_offset = tok;
354 if (counts) ++counts->coeff_lps[txs_ctx][plane_type][ctx][1];
355 break;
356 }
357 if (counts) ++counts->coeff_lps[txs_ctx][plane_type][ctx][0];
Jingning Han87b01b52017-08-31 12:07:20 -0700358 }
Linfeng Zhang97fc4742017-11-07 12:57:25 -0800359 if (tok == extra_bits) br_offset = extra_bits;
360
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -0800361 const int br_base = br_index_to_coeff[idx];
Linfeng Zhang97fc4742017-11-07 12:57:25 -0800362
363 *level = NUM_BASE_LEVELS + 1 + br_base + br_offset;
364 cul_level += *level;
Linfeng Zhang530bee22017-11-28 16:42:27 -0800365 tran_low_t t = (*level * dequant[!!pos]) >> shift;
Jingning Hancf3a0822017-11-16 22:19:39 -0800366 if (signs[pos]) t = -t;
367 tcoeffs[pos] = t;
Linfeng Zhang97fc4742017-11-07 12:57:25 -0800368 break;
Jingning Han87b01b52017-08-31 12:07:20 -0700369 }
Linfeng Zhang97fc4742017-11-07 12:57:25 -0800370 if (counts) ++counts->coeff_br[txs_ctx][plane_type][idx][ctx][0];
Jingning Han87b01b52017-08-31 12:07:20 -0700371 }
Linfeng Zhang97fc4742017-11-07 12:57:25 -0800372
373 if (idx < BASE_RANGE_SETS) continue;
Ola Hugossone72a2092017-11-12 09:11:53 +0100374#endif
Linfeng Zhang97fc4742017-11-07 12:57:25 -0800375 // decode 0-th order Golomb code
376 *level = COEFF_BASE_RANGE + 1 + NUM_BASE_LEVELS;
377 // Save golomb in tcoeffs because adding it to level may incur overflow
Jingning Hancf3a0822017-11-16 22:19:39 -0800378 tran_low_t t = *level + read_golomb(xd, r, counts);
379 cul_level += t;
Linfeng Zhang530bee22017-11-28 16:42:27 -0800380 t = (t * dequant[!!pos]) >> shift;
Jingning Hancf3a0822017-11-16 22:19:39 -0800381 if (signs[pos]) t = -t;
382 tcoeffs[pos] = t;
Jingning Han87b01b52017-08-31 12:07:20 -0700383 }
Angie Chiangcea11f22017-02-24 12:30:40 -0800384 }
385
Angie Chiangcea11f22017-02-24 12:30:40 -0800386 cul_level = AOMMIN(63, cul_level);
387
388 // DC value
389 set_dc_sign(&cul_level, tcoeffs[0]);
390
391 return cul_level;
392}
Angie Chiang133733c2017-03-17 12:50:20 -0700393
Angie Chiang5c0568a2017-03-21 16:00:39 -0700394uint8_t av1_read_coeffs_txb_facade(AV1_COMMON *cm, MACROBLOCKD *xd,
Angie Chiang133733c2017-03-17 12:50:20 -0700395 aom_reader *r, int row, int col, int block,
396 int plane, tran_low_t *tcoeffs,
Jingning Hanaba246d2017-06-14 12:00:16 -0700397 TX_SIZE tx_size, int16_t *max_scan_line,
398 int *eob) {
Angie Chiang133733c2017-03-17 12:50:20 -0700399 MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi;
Angie Chiang29b0fad2017-03-20 16:18:45 -0700400 struct macroblockd_plane *pd = &xd->plane[plane];
Angie Chiang133733c2017-03-17 12:50:20 -0700401
402 const BLOCK_SIZE bsize = mbmi->sb_type;
Angie Chiang133733c2017-03-17 12:50:20 -0700403 const BLOCK_SIZE plane_bsize =
404 AOMMAX(BLOCK_4X4, get_plane_block_size(bsize, pd));
Angie Chiang133733c2017-03-17 12:50:20 -0700405
Angie Chiang133733c2017-03-17 12:50:20 -0700406 TXB_CTX txb_ctx;
407 get_txb_ctx(plane_bsize, tx_size, plane, pd->above_context + col,
408 pd->left_context + row, &txb_ctx);
Jingning Han7eab9ff2017-07-06 10:12:54 -0700409 uint8_t cul_level =
410 av1_read_coeffs_txb(cm, xd, r, row, col, block, plane, tcoeffs, &txb_ctx,
411 tx_size, max_scan_line, eob);
Angie Chiang5c0568a2017-03-21 16:00:39 -0700412#if CONFIG_ADAPT_SCAN
413 PLANE_TYPE plane_type = get_plane_type(plane);
Angie Chiang57127c52017-07-24 13:27:07 -0700414 TX_TYPE tx_type = av1_get_tx_type(plane_type, xd, row, col, block, tx_size);
Jingning Han025c6c42017-11-22 12:06:03 -0800415 const int mi_row = -xd->mb_to_top_edge >> (3 + MI_SIZE_LOG2);
416
Angie Chiang5c0568a2017-03-21 16:00:39 -0700417 if (xd->counts && *eob > 0)
Jingning Han0bd3bf62017-11-28 17:11:51 -0800418 av1_update_scan_count_facade(cm, xd, mi_row, tx_size, tx_type, pd->dqcoeff,
419 *eob);
Angie Chiang5c0568a2017-03-21 16:00:39 -0700420#endif
Angie Chiang29b0fad2017-03-20 16:18:45 -0700421 av1_set_contexts(xd, pd, plane, tx_size, cul_level, col, row);
422 return cul_level;
Angie Chiang133733c2017-03-17 12:50:20 -0700423}