update_txk_array: always store tx_type as 16x16 units
This aligns it with the related fix in av1_read_coeffs_txb_facade() for decoder in commit 9760eebfc8538590db43dde829fa53b6ca1a1a75.
For issue https://gitlab.com/AOMediaCodec/avm/-/issues/459
diff --git a/av1/common/blockd.h b/av1/common/blockd.h
index 4f1543a..7b537ed 100644
--- a/av1/common/blockd.h
+++ b/av1/common/blockd.h
@@ -3450,22 +3450,14 @@
static INLINE void update_txk_array(MACROBLOCKD *const xd, int blk_row,
int blk_col, TX_SIZE tx_size,
TX_TYPE tx_type) {
- const int stride = xd->tx_type_map_stride;
- xd->tx_type_map[blk_row * stride + blk_col] = tx_type;
-
const int txw = tx_size_wide_unit[tx_size];
const int txh = tx_size_high_unit[tx_size];
- // The 16x16 unit is due to the constraint from tx_64x64 which sets the
- // maximum tx size for chroma as 32x32. Coupled with 4x1 transform block
- // size, the constraint takes effect in 32x16 / 16x32 size too. To solve
- // the intricacy, cover all the 16x16 units inside a 64 level transform.
- if (txw == tx_size_wide_unit[TX_64X64] ||
- txh == tx_size_high_unit[TX_64X64]) {
- const int tx_unit = tx_size_wide_unit[TX_16X16];
- for (int idy = 0; idy < txh; idy += tx_unit) {
- for (int idx = 0; idx < txw; idx += tx_unit) {
- xd->tx_type_map[(blk_row + idy) * stride + blk_col + idx] = tx_type;
- }
+ // This covers all the 16x16 units copy inside a 64 or 32 level transform.
+ const int tx_unit = tx_size_wide_unit[TX_16X16];
+ const int stride = xd->tx_type_map_stride;
+ for (int idy = 0; idy < txh; idy += tx_unit) {
+ for (int idx = 0; idx < txw; idx += tx_unit) {
+ xd->tx_type_map[(blk_row + idy) * stride + blk_col + idx] = tx_type;
}
}
}
diff --git a/av1/decoder/decodetxb.c b/av1/decoder/decodetxb.c
index 7c7e7f6..d19d293 100644
--- a/av1/decoder/decodetxb.c
+++ b/av1/decoder/decodetxb.c
@@ -1328,21 +1328,10 @@
}
av1_set_entropy_contexts(xd, pd, plane, plane_bsize, tx_size, cul_level, col,
row);
- if (is_inter_block(mbmi, xd->tree_type)) {
+ if (is_inter_block(mbmi, xd->tree_type) && (plane == 0)) {
const TX_TYPE tx_type_inter = av1_get_tx_type(
xd, plane_type, row, col, tx_size, cm->features.reduced_tx_set_used);
- if (plane == 0) {
- const int txw = tx_size_wide_unit[tx_size];
- const int txh = tx_size_high_unit[tx_size];
- // This covers all the 16x16 units copy inside a 64 or 32 level transform.
- const int tx_unit = tx_size_wide_unit[TX_16X16];
- const int stride = xd->tx_type_map_stride;
- for (int idy = 0; idy < txh; idy += tx_unit) {
- for (int idx = 0; idx < txw; idx += tx_unit) {
- xd->tx_type_map[(row + idy) * stride + col + idx] = tx_type_inter;
- }
- }
- }
+ update_txk_array(xd, row, col, tx_size, tx_type_inter);
}
#if TXCOEFF_TIMER