blob: 17d67cbf68fac8d75381e7aad442429c9f00cea7 [file] [log] [blame]
Angie Chiangcea11f22017-02-24 12:30:40 -08001/*
James Zernb7c05bd2024-06-11 19:15:10 -07002 * Copyright (c) 2017, Alliance for Open Media. All rights reserved.
Angie Chiangcea11f22017-02-24 12:30:40 -08003 *
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
Angie Chiang41220ab2018-02-14 17:48:23 -080012#include "av1/decoder/decodetxb.h"
13
Linfeng Zhangae7b2f32017-11-08 15:46:57 -080014#include "aom_ports/mem.h"
Angie Chiang133733c2017-03-17 12:50:20 -070015#include "av1/common/idct.h"
Angie Chiang1b1c4a32018-02-13 16:36:54 -080016#include "av1/common/scan.h"
Angie Chiangcea11f22017-02-24 12:30:40 -080017#include "av1/common/txb_common.h"
Angie Chiangde58e492017-04-13 17:10:14 -070018#include "av1/decoder/decodemv.h"
Angie Chiangcea11f22017-02-24 12:30:40 -080019
20#define ACCT_STR __func__
21
Yunqing Wang1694a4f2018-01-30 16:40:55 -080022static int read_golomb(MACROBLOCKD *xd, aom_reader *r) {
Angie Chiangcea11f22017-02-24 12:30:40 -080023 int x = 1;
24 int length = 0;
25 int i = 0;
26
27 while (!i) {
Yunqing Wang1694a4f2018-01-30 16:40:55 -080028 i = aom_read_bit(r, ACCT_STR);
Angie Chiangcea11f22017-02-24 12:30:40 -080029 ++length;
Frank Bossen6940fc12018-05-16 09:03:52 -040030 if (length > 20) {
Angie Chiangf1880e12017-04-12 15:40:44 -070031 aom_internal_error(xd->error_info, AOM_CODEC_CORRUPT_FRAME,
32 "Invalid length in read_golomb");
33 break;
34 }
Angie Chiangcea11f22017-02-24 12:30:40 -080035 }
36
37 for (i = 0; i < length - 1; ++i) {
38 x <<= 1;
Yunqing Wang1694a4f2018-01-30 16:40:55 -080039 x += aom_read_bit(r, ACCT_STR);
Angie Chiangcea11f22017-02-24 12:30:40 -080040 }
41
42 return x - 1;
43}
44
Wan-Teh Chang12c64e82024-08-08 16:02:19 -070045static inline int rec_eob_pos(const int eob_token, const int extra) {
Yaowu Xu3a19b8a2019-05-01 08:40:42 -070046 int eob = av1_eob_group_start[eob_token];
Dake Hea47cd6c2017-10-13 18:09:58 -070047 if (eob > 2) {
48 eob += extra;
49 }
50 return eob;
51}
Dake Hea47cd6c2017-10-13 18:09:58 -070052
Wan-Teh Chang12c64e82024-08-08 16:02:19 -070053static inline int get_dqv(const int16_t *dequant, int coeff_idx,
Angie Chiangb3167a62018-01-30 19:37:57 -080054 const qm_val_t *iqmatrix) {
55 int dqv = dequant[!!coeff_idx];
Angie Chiangb3167a62018-01-30 19:37:57 -080056 if (iqmatrix != NULL)
57 dqv =
58 ((iqmatrix[coeff_idx] * dqv) + (1 << (AOM_QM_BITS - 1))) >> AOM_QM_BITS;
Angie Chiangb3167a62018-01-30 19:37:57 -080059 return dqv;
60}
Angie Chiangb3167a62018-01-30 19:37:57 -080061
Wan-Teh Chang12c64e82024-08-08 16:02:19 -070062static inline void read_coeffs_reverse_2d(aom_reader *r, TX_SIZE tx_size,
Angie Chiang6d5419c2018-02-20 15:12:15 -080063 int start_si, int end_si,
Kyle Siefring7bb4c542022-12-09 10:27:41 -050064 const int16_t *scan, int bhl,
Angie Chiang6d5419c2018-02-20 15:12:15 -080065 uint8_t *levels,
66 base_cdf_arr base_cdf,
67 br_cdf_arr br_cdf) {
Angie Chianga7440302018-02-20 14:36:09 -080068 for (int c = end_si; c >= start_si; --c) {
69 const int pos = scan[c];
Kyle Siefring7bb4c542022-12-09 10:27:41 -050070 const int coeff_ctx = get_lower_levels_ctx_2d(levels, pos, bhl, tx_size);
Angie Chianga7440302018-02-20 14:36:09 -080071 const int nsymbs = 4;
72 int level = aom_read_symbol(r, base_cdf[coeff_ctx], nsymbs, ACCT_STR);
73 if (level > NUM_BASE_LEVELS) {
Kyle Siefring7bb4c542022-12-09 10:27:41 -050074 const int br_ctx = get_br_ctx_2d(levels, pos, bhl);
Angie Chianga7440302018-02-20 14:36:09 -080075 aom_cdf_prob *cdf = br_cdf[br_ctx];
76 for (int idx = 0; idx < COEFF_BASE_RANGE; idx += BR_CDF_SIZE - 1) {
77 const int k = aom_read_symbol(r, cdf, BR_CDF_SIZE, ACCT_STR);
78 level += k;
79 if (k < BR_CDF_SIZE - 1) break;
80 }
Angie Chianga7440302018-02-20 14:36:09 -080081 }
Kyle Siefring7bb4c542022-12-09 10:27:41 -050082 levels[get_padded_idx(pos, bhl)] = level;
Angie Chianga7440302018-02-20 14:36:09 -080083 }
84}
85
Wan-Teh Chang12c64e82024-08-08 16:02:19 -070086static inline void read_coeffs_reverse(aom_reader *r, TX_SIZE tx_size,
Katsuhisa Yuasa55c95f82018-04-03 00:51:22 +090087 TX_CLASS tx_class, int start_si,
Kyle Siefring7bb4c542022-12-09 10:27:41 -050088 int end_si, const int16_t *scan, int bhl,
Angie Chiang6dea31e2018-02-16 17:47:20 -080089 uint8_t *levels, base_cdf_arr base_cdf,
Angie Chiang6d5419c2018-02-20 15:12:15 -080090 br_cdf_arr br_cdf) {
Angie Chiang6dea31e2018-02-16 17:47:20 -080091 for (int c = end_si; c >= start_si; --c) {
92 const int pos = scan[c];
93 const int coeff_ctx =
Kyle Siefring7bb4c542022-12-09 10:27:41 -050094 get_lower_levels_ctx(levels, pos, bhl, tx_size, tx_class);
Angie Chiang6dea31e2018-02-16 17:47:20 -080095 const int nsymbs = 4;
96 int level = aom_read_symbol(r, base_cdf[coeff_ctx], nsymbs, ACCT_STR);
97 if (level > NUM_BASE_LEVELS) {
Kyle Siefring7bb4c542022-12-09 10:27:41 -050098 const int br_ctx = get_br_ctx(levels, pos, bhl, tx_class);
Angie Chiang6dea31e2018-02-16 17:47:20 -080099 aom_cdf_prob *cdf = br_cdf[br_ctx];
100 for (int idx = 0; idx < COEFF_BASE_RANGE; idx += BR_CDF_SIZE - 1) {
101 const int k = aom_read_symbol(r, cdf, BR_CDF_SIZE, ACCT_STR);
102 level += k;
103 if (k < BR_CDF_SIZE - 1) break;
104 }
Angie Chiang6dea31e2018-02-16 17:47:20 -0800105 }
Kyle Siefring7bb4c542022-12-09 10:27:41 -0500106 levels[get_padded_idx(pos, bhl)] = level;
Angie Chiang6dea31e2018-02-16 17:47:20 -0800107 }
108}
109
James Zern27b123f2024-10-03 18:44:19 -0700110static uint8_t read_coeffs_txb(const AV1_COMMON *const cm,
111 DecoderCodingBlock *dcb, aom_reader *const r,
112 const int blk_row, const int blk_col,
113 const int plane, const TXB_CTX *const txb_ctx,
114 const TX_SIZE tx_size) {
Urvang Joshibac1dea2020-04-20 11:37:15 -0700115 MACROBLOCKD *const xd = &dcb->xd;
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -0800116 FRAME_CONTEXT *const ec_ctx = xd->tile_ctx;
Sebastien Alaiwanc84e32f2018-01-11 15:50:18 +0100117 const int32_t max_value = (1 << (7 + xd->bd)) - 1;
118 const int32_t min_value = -(1 << (7 + xd->bd));
Debargha Mukherjeeb3eda2f2017-11-28 16:00:20 -0800119 const TX_SIZE txs_ctx = get_txsize_entropy_ctx(tx_size);
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -0800120 const PLANE_TYPE plane_type = get_plane_type(plane);
Yue Chen53b53f02018-03-29 14:31:23 -0700121 MB_MODE_INFO *const mbmi = xd->mi[0];
Linfeng Zhang0ff69c62017-12-04 10:35:38 -0800122 struct macroblockd_plane *const pd = &xd->plane[plane];
123 const int16_t *const dequant = pd->seg_dequant_QTX[mbmi->segment_id];
Urvang Joshibac1dea2020-04-20 11:37:15 -0700124 tran_low_t *const tcoeffs = dcb->dqcoeff_block[plane] + dcb->cb_offset[plane];
Jingning Hanff705452017-04-27 11:32:15 -0700125 const int shift = av1_get_tx_scale(tx_size);
Kyle Siefring7bb4c542022-12-09 10:27:41 -0500126 const int bhl = get_txb_bhl(tx_size);
Angie Chianga9ba58e2017-12-01 19:22:43 -0800127 const int width = get_txb_wide(tx_size);
128 const int height = get_txb_high(tx_size);
Angie Chiangcea11f22017-02-24 12:30:40 -0800129 int cul_level = 0;
Matthieu Vaudano928c37952018-03-29 10:22:53 +0200130 int dc_val = 0;
Linfeng Zhang679d81e2017-10-31 15:27:42 -0700131 uint8_t levels_buf[TX_PAD_2D];
Kyle Siefring7bb4c542022-12-09 10:27:41 -0500132 uint8_t *const levels = set_levels(levels_buf, height);
Hui Su41d61522018-01-23 10:47:55 -0800133 const int all_zero = aom_read_symbol(
134 r, ec_ctx->txb_skip_cdf[txs_ctx][txb_ctx->txb_skip_ctx], 2, ACCT_STR);
Urvang Joshibac1dea2020-04-20 11:37:15 -0700135 eob_info *eob_data = dcb->eob_data[plane] + dcb->txb_offset[plane];
Deepa K G610c9b82018-06-19 12:47:01 +0530136 uint16_t *const eob = &(eob_data->eob);
137 uint16_t *const max_scan_line = &(eob_data->max_scan_line);
138 *max_scan_line = 0;
Angie Chiang29b0fad2017-03-20 16:18:45 -0700139 *eob = 0;
Jim Bankoskic04ce612018-12-20 15:45:33 -0800140
141#if CONFIG_INSPECTION
142 if (plane == 0) {
143 const int txk_type_idx =
chiyotsai0f5cd052020-08-27 14:37:44 -0700144 av1_get_txk_type_index(mbmi->bsize, blk_row, blk_col);
Jim Bankoskic04ce612018-12-20 15:45:33 -0800145 mbmi->tx_skip[txk_type_idx] = all_zero;
146 }
147#endif
148
Angie Chiang133733c2017-03-17 12:50:20 -0700149 if (all_zero) {
150 *max_scan_line = 0;
Hui Sude1a5db2018-02-22 15:44:49 -0800151 if (plane == 0) {
Hui Su52b7ddc2019-10-10 16:27:16 -0700152 xd->tx_type_map[blk_row * xd->tx_type_map_stride + blk_col] = DCT_DCT;
Hui Sude1a5db2018-02-22 15:44:49 -0800153 }
Angie Chiang133733c2017-03-17 12:50:20 -0700154 return 0;
155 }
156
Luc Trudeau963dd9b2018-04-11 13:59:11 -0400157 if (plane == AOM_PLANE_Y) {
158 // only y plane's tx_type is transmitted
159 av1_read_tx_type(cm, xd, blk_row, blk_col, tx_size, r);
160 }
Urvang Joshib6409e92020-03-23 11:23:27 -0700161 const TX_TYPE tx_type =
162 av1_get_tx_type(xd, plane_type, blk_row, blk_col, tx_size,
163 cm->features.reduced_tx_set_used);
Jingning Hane8bd3a02018-04-09 11:52:35 -0700164 const TX_CLASS tx_class = tx_type_to_class[tx_type];
Angie Chiangb3167a62018-01-30 19:37:57 -0800165 const qm_val_t *iqmatrix =
Urvang Joshif409a632020-03-28 01:03:50 -0700166 av1_get_iqmatrix(&cm->quant_params, xd, plane, tx_size, tx_type);
Yaowu Xuf1e12932018-02-26 15:50:09 -0800167 const SCAN_ORDER *const scan_order = get_scan(tx_size, tx_type);
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -0800168 const int16_t *const scan = scan_order->scan;
Linfeng Zhang0c72b2f2017-12-04 10:59:28 -0800169 int eob_extra = 0;
170 int eob_pt = 1;
Angie Chiang133733c2017-03-17 12:50:20 -0700171
Dake He0db7d0e2017-12-21 15:23:20 -0800172 const int eob_multi_size = txsize_log2_minus4[tx_size];
Jingning Hane8bd3a02018-04-09 11:52:35 -0700173 const int eob_multi_ctx = (tx_class == TX_CLASS_2D) ? 0 : 1;
Dake He0db7d0e2017-12-21 15:23:20 -0800174 switch (eob_multi_size) {
175 case 0:
Yunqing Wang1694a4f2018-01-30 16:40:55 -0800176 eob_pt =
177 aom_read_symbol(r, ec_ctx->eob_flag_cdf16[plane_type][eob_multi_ctx],
178 5, ACCT_STR) +
179 1;
Dake He0db7d0e2017-12-21 15:23:20 -0800180 break;
181 case 1:
Yunqing Wang1694a4f2018-01-30 16:40:55 -0800182 eob_pt =
183 aom_read_symbol(r, ec_ctx->eob_flag_cdf32[plane_type][eob_multi_ctx],
184 6, ACCT_STR) +
185 1;
Dake He0db7d0e2017-12-21 15:23:20 -0800186 break;
187 case 2:
Yunqing Wang1694a4f2018-01-30 16:40:55 -0800188 eob_pt =
189 aom_read_symbol(r, ec_ctx->eob_flag_cdf64[plane_type][eob_multi_ctx],
190 7, ACCT_STR) +
191 1;
Dake He0db7d0e2017-12-21 15:23:20 -0800192 break;
193 case 3:
194 eob_pt =
Yunqing Wang1694a4f2018-01-30 16:40:55 -0800195 aom_read_symbol(r, ec_ctx->eob_flag_cdf128[plane_type][eob_multi_ctx],
196 8, ACCT_STR) +
Dake He0db7d0e2017-12-21 15:23:20 -0800197 1;
198 break;
199 case 4:
200 eob_pt =
Yunqing Wang1694a4f2018-01-30 16:40:55 -0800201 aom_read_symbol(r, ec_ctx->eob_flag_cdf256[plane_type][eob_multi_ctx],
202 9, ACCT_STR) +
Dake He0db7d0e2017-12-21 15:23:20 -0800203 1;
204 break;
205 case 5:
206 eob_pt =
Yunqing Wang1694a4f2018-01-30 16:40:55 -0800207 aom_read_symbol(r, ec_ctx->eob_flag_cdf512[plane_type][eob_multi_ctx],
208 10, ACCT_STR) +
Dake He0db7d0e2017-12-21 15:23:20 -0800209 1;
210 break;
211 case 6:
212 default:
Yunqing Wang1694a4f2018-01-30 16:40:55 -0800213 eob_pt = aom_read_symbol(
214 r, ec_ctx->eob_flag_cdf1024[plane_type][eob_multi_ctx], 11,
215 ACCT_STR) +
216 1;
Dake He0db7d0e2017-12-21 15:23:20 -0800217 break;
218 }
Dake Hea47cd6c2017-10-13 18:09:58 -0700219
Yaowu Xu3a19b8a2019-05-01 08:40:42 -0700220 const int eob_offset_bits = av1_eob_offset_bits[eob_pt];
wenyao.liu0be59012018-12-24 10:27:31 +0800221 if (eob_offset_bits > 0) {
Jingning Hanff4a9f82018-06-08 10:48:45 -0700222 const int eob_ctx = eob_pt - 3;
Hui Su41d61522018-01-23 10:47:55 -0800223 int bit = aom_read_symbol(
Jingning Hanff4a9f82018-06-08 10:48:45 -0700224 r, ec_ctx->eob_extra_cdf[txs_ctx][plane_type][eob_ctx], 2, ACCT_STR);
Angie Chiang7ab884e2017-10-18 15:57:12 -0700225 if (bit) {
wenyao.liu0be59012018-12-24 10:27:31 +0800226 eob_extra += (1 << (eob_offset_bits - 1));
Angie Chiang7ab884e2017-10-18 15:57:12 -0700227 }
228
wenyao.liu0be59012018-12-24 10:27:31 +0800229 for (int i = 1; i < eob_offset_bits; i++) {
Yunqing Wang1694a4f2018-01-30 16:40:55 -0800230 bit = aom_read_bit(r, ACCT_STR);
Dake Hea47cd6c2017-10-13 18:09:58 -0700231 if (bit) {
wenyao.liu0be59012018-12-24 10:27:31 +0800232 eob_extra += (1 << (eob_offset_bits - 1 - i));
Dake Hea47cd6c2017-10-13 18:09:58 -0700233 }
Dake Hea47cd6c2017-10-13 18:09:58 -0700234 }
235 }
236 *eob = rec_eob_pos(eob_pt, eob_extra);
Dake Hea47cd6c2017-10-13 18:09:58 -0700237
wenyao.liuebc72de2019-01-18 11:45:06 +0800238 if (*eob > 1) {
239 memset(levels_buf, 0,
240 sizeof(*levels_buf) *
Kyle Siefring7bb4c542022-12-09 10:27:41 -0500241 ((height + TX_PAD_HOR) * (width + TX_PAD_VER) + TX_PAD_END));
wenyao.liuebc72de2019-01-18 11:45:06 +0800242 }
243
Angie Chiangda708cd2018-02-16 12:08:31 -0800244 {
Angie Chiangf8a68222018-02-16 14:54:28 -0800245 // Read the non-zero coefficient with scan index eob-1
Angie Chiangda708cd2018-02-16 12:08:31 -0800246 // TODO(angiebird): Put this into a function
247 const int c = *eob - 1;
248 const int pos = scan[c];
Kyle Siefring7bb4c542022-12-09 10:27:41 -0500249 const int coeff_ctx = get_lower_levels_ctx_eob(bhl, width, c);
Angie Chiangda708cd2018-02-16 12:08:31 -0800250 const int nsymbs = 3;
251 aom_cdf_prob *cdf =
252 ec_ctx->coeff_base_eob_cdf[txs_ctx][plane_type][coeff_ctx];
253 int level = aom_read_symbol(r, cdf, nsymbs, ACCT_STR) + 1;
254 if (level > NUM_BASE_LEVELS) {
Kyle Siefring7bb4c542022-12-09 10:27:41 -0500255 const int br_ctx = get_br_ctx_eob(pos, bhl, tx_class);
wenyao.liu0be59012018-12-24 10:27:31 +0800256 cdf = ec_ctx->coeff_br_cdf[AOMMIN(txs_ctx, TX_32X32)][plane_type][br_ctx];
Angie Chiangda708cd2018-02-16 12:08:31 -0800257 for (int idx = 0; idx < COEFF_BASE_RANGE; idx += BR_CDF_SIZE - 1) {
wenyao.liu0be59012018-12-24 10:27:31 +0800258 const int k = aom_read_symbol(r, cdf, BR_CDF_SIZE, ACCT_STR);
Angie Chiangda708cd2018-02-16 12:08:31 -0800259 level += k;
260 if (k < BR_CDF_SIZE - 1) break;
261 }
Angie Chiangda708cd2018-02-16 12:08:31 -0800262 }
Kyle Siefring7bb4c542022-12-09 10:27:41 -0500263 levels[get_padded_idx(pos, bhl)] = level;
Angie Chiangda708cd2018-02-16 12:08:31 -0800264 }
Angie Chiang09756712018-02-21 12:18:11 -0800265 if (*eob > 1) {
266 base_cdf_arr base_cdf = ec_ctx->coeff_base_cdf[txs_ctx][plane_type];
267 br_cdf_arr br_cdf =
268 ec_ctx->coeff_br_cdf[AOMMIN(txs_ctx, TX_32X32)][plane_type];
Angie Chiang09756712018-02-21 12:18:11 -0800269 if (tx_class == TX_CLASS_2D) {
Kyle Siefring7bb4c542022-12-09 10:27:41 -0500270 read_coeffs_reverse_2d(r, tx_size, 1, *eob - 1 - 1, scan, bhl, levels,
Angie Chiang09756712018-02-21 12:18:11 -0800271 base_cdf, br_cdf);
Kyle Siefring7bb4c542022-12-09 10:27:41 -0500272 read_coeffs_reverse(r, tx_size, tx_class, 0, 0, scan, bhl, levels,
Angie Chiang09756712018-02-21 12:18:11 -0800273 base_cdf, br_cdf);
274 } else {
Kyle Siefring7bb4c542022-12-09 10:27:41 -0500275 read_coeffs_reverse(r, tx_size, tx_class, 0, *eob - 1 - 1, scan, bhl,
Angie Chiang09756712018-02-21 12:18:11 -0800276 levels, base_cdf, br_cdf);
277 }
Angie Chiang41220ab2018-02-14 17:48:23 -0800278 }
279
Angie Chiang41220ab2018-02-14 17:48:23 -0800280 for (int c = 0; c < *eob; ++c) {
Angie Chiang1b1c4a32018-02-13 16:36:54 -0800281 const int pos = scan[c];
Angie Chiang6d5419c2018-02-20 15:12:15 -0800282 uint8_t sign;
Kyle Siefring7bb4c542022-12-09 10:27:41 -0500283 tran_low_t level = levels[get_padded_idx(pos, bhl)];
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -0800284 if (level) {
Linfeng Zhang9a7cc0e2017-11-20 12:37:28 -0800285 *max_scan_line = AOMMAX(*max_scan_line, pos);
Angie Chiang1b1c4a32018-02-13 16:36:54 -0800286 if (c == 0) {
287 const int dc_sign_ctx = txb_ctx->dc_sign_ctx;
Angie Chiang41220ab2018-02-14 17:48:23 -0800288 sign = aom_read_symbol(r, ec_ctx->dc_sign_cdf[plane_type][dc_sign_ctx],
289 2, ACCT_STR);
Angie Chiang1b1c4a32018-02-13 16:36:54 -0800290 } else {
Angie Chiang41220ab2018-02-14 17:48:23 -0800291 sign = aom_read_bit(r, ACCT_STR);
Angie Chiang1b1c4a32018-02-13 16:36:54 -0800292 }
Angie Chiang4f5c3522018-02-26 17:01:32 -0800293 if (level >= MAX_BASE_BR_RANGE) {
Angie Chiang83b9f112018-02-23 15:14:40 -0800294 level += read_golomb(xd, r);
Angie Chiang41220ab2018-02-14 17:48:23 -0800295 }
Matthieu Vaudano928c37952018-03-29 10:22:53 +0200296
297 if (c == 0) dc_val = sign ? -level : level;
298
Yaowu Xuc0ff7a32018-03-09 10:44:38 -0800299 // Bitmasking to clamp level to valid range:
300 // The valid range for 8/10/12 bit vdieo is at most 14/16/18 bit
301 level &= 0xfffff;
Angie Chiang83b9f112018-02-23 15:14:40 -0800302 cul_level += level;
303 tran_low_t dq_coeff;
Yaowu Xuc0ff7a32018-03-09 10:44:38 -0800304 // Bitmasking to clamp dq_coeff to valid range:
305 // The valid range for 8/10/12 bit video is at most 17/19/21 bit
clang-formatd6525762024-08-06 18:52:58 -0700306 dq_coeff =
307 (tran_low_t)((int64_t)level * get_dqv(dequant, scan[c], iqmatrix) &
308 0xffffff);
Angie Chiang83b9f112018-02-23 15:14:40 -0800309 dq_coeff = dq_coeff >> shift;
310 if (sign) {
311 dq_coeff = -dq_coeff;
312 }
313 tcoeffs[pos] = clamp(dq_coeff, min_value, max_value);
Jingning Han87b01b52017-08-31 12:07:20 -0700314 }
Angie Chiangcea11f22017-02-24 12:30:40 -0800315 }
316
Jingning Han258c13d2018-04-03 08:32:39 -0700317 cul_level = AOMMIN(COEFF_CONTEXT_MASK, cul_level);
Angie Chiangcea11f22017-02-24 12:30:40 -0800318
319 // DC value
Matthieu Vaudano928c37952018-03-29 10:22:53 +0200320 set_dc_sign(&cul_level, dc_val);
Angie Chiangcea11f22017-02-24 12:30:40 -0800321
322 return cul_level;
323}
Angie Chiang133733c2017-03-17 12:50:20 -0700324
James Zern27b123f2024-10-03 18:44:19 -0700325void av1_read_coeffs_txb(const AV1_COMMON *const cm, DecoderCodingBlock *dcb,
326 aom_reader *const r, const int plane, const int row,
327 const int col, const TX_SIZE tx_size) {
Deepa K G3bc1f932018-06-21 14:25:03 +0530328#if TXCOEFF_TIMER
329 struct aom_usec_timer timer;
330 aom_usec_timer_start(&timer);
331#endif
Urvang Joshibac1dea2020-04-20 11:37:15 -0700332 MACROBLOCKD *const xd = &dcb->xd;
Yue Chen53b53f02018-03-29 14:31:23 -0700333 MB_MODE_INFO *const mbmi = xd->mi[0];
Linfeng Zhang0ff69c62017-12-04 10:35:38 -0800334 struct macroblockd_plane *const pd = &xd->plane[plane];
Angie Chiang133733c2017-03-17 12:50:20 -0700335
chiyotsai0f5cd052020-08-27 14:37:44 -0700336 const BLOCK_SIZE bsize = mbmi->bsize;
kyslov5859dca2019-04-08 12:13:11 -0700337 assert(bsize < BLOCK_SIZES_ALL);
Cheng Chen8ab1f442018-04-27 18:01:52 -0700338 const BLOCK_SIZE plane_bsize =
339 get_plane_block_size(bsize, pd->subsampling_x, pd->subsampling_y);
Angie Chiang133733c2017-03-17 12:50:20 -0700340
Angie Chiang133733c2017-03-17 12:50:20 -0700341 TXB_CTX txb_ctx;
Urvang Joshi46ff5522020-03-30 15:27:37 -0700342 get_txb_ctx(plane_bsize, tx_size, plane, pd->above_entropy_context + col,
343 pd->left_entropy_context + row, &txb_ctx);
Deepa K G610c9b82018-06-19 12:47:01 +0530344 const uint8_t cul_level =
James Zern27b123f2024-10-03 18:44:19 -0700345 read_coeffs_txb(cm, dcb, r, row, col, plane, &txb_ctx, tx_size);
Urvang Joshi46ff5522020-03-30 15:27:37 -0700346 av1_set_entropy_contexts(xd, pd, plane, plane_bsize, tx_size, cul_level, col,
347 row);
Deepa K G3bc1f932018-06-21 14:25:03 +0530348
349 if (is_inter_block(mbmi)) {
Hui Su52b7ddc2019-10-10 16:27:16 -0700350 const PLANE_TYPE plane_type = get_plane_type(plane);
Deepa K G3bc1f932018-06-21 14:25:03 +0530351 // tx_type will be read out in av1_read_coeffs_txb_facade
Hui Su37980cc2019-10-09 10:16:35 -0700352 const TX_TYPE tx_type = av1_get_tx_type(xd, plane_type, row, col, tx_size,
Urvang Joshib6409e92020-03-23 11:23:27 -0700353 cm->features.reduced_tx_set_used);
Deepa K G3bc1f932018-06-21 14:25:03 +0530354
Hui Su52b7ddc2019-10-10 16:27:16 -0700355 if (plane == 0) {
356 const int txw = tx_size_wide_unit[tx_size];
357 const int txh = tx_size_high_unit[tx_size];
358 // The 16x16 unit is due to the constraint from tx_64x64 which sets the
359 // maximum tx size for chroma as 32x32. Coupled with 4x1 transform block
360 // size, the constraint takes effect in 32x16 / 16x32 size too. To solve
361 // the intricacy, cover all the 16x16 units inside a 64 level transform.
362 if (txw == tx_size_wide_unit[TX_64X64] ||
363 txh == tx_size_high_unit[TX_64X64]) {
364 const int tx_unit = tx_size_wide_unit[TX_16X16];
365 const int stride = xd->tx_type_map_stride;
366 for (int idy = 0; idy < txh; idy += tx_unit) {
367 for (int idx = 0; idx < txw; idx += tx_unit) {
368 xd->tx_type_map[(row + idy) * stride + col + idx] = tx_type;
369 }
370 }
371 }
372 }
Deepa K G3bc1f932018-06-21 14:25:03 +0530373 }
374
375#if TXCOEFF_TIMER
376 aom_usec_timer_mark(&timer);
377 const int64_t elapsed_time = aom_usec_timer_elapsed(&timer);
378 cm->txcoeff_timer += elapsed_time;
379 ++cm->txb_count;
380#endif
Angie Chiang133733c2017-03-17 12:50:20 -0700381}