Enable rectangular transforms for UV
Uses an array to map block sizes, y tx sizes, and subsampling
factors to various transform sizes for UV.
Results improve by 0.1-0.2%
Change-Id: Icb58fd96bc7c01a72cbf1332fe2be4d55a0feedc
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 07ea72d..a5b5396 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -796,9 +796,9 @@
if (blk_row >= max_blocks_high || blk_col >= max_blocks_wide) return;
- plane_tx_size = plane ? get_uv_tx_size_impl(
- mbmi->inter_tx_size[tx_row][tx_col], bsize, 0, 0)
- : mbmi->inter_tx_size[tx_row][tx_col];
+ plane_tx_size =
+ plane ? uv_txsize_lookup[bsize][mbmi->inter_tx_size[tx_row][tx_col]][0][0]
+ : mbmi->inter_tx_size[tx_row][tx_col];
if (tx_size == plane_tx_size) {
pack_mb_tokens(w, tp, tok_end, bit_depth, tx_size);
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index bc17618..b5d4712 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -5087,7 +5087,8 @@
mi_8x8[mis * y + x]->mbmi.tx_size = tx_size;
}
++td->counts->tx_size_totals[txsize_sqr_map[mbmi->tx_size]];
- ++td->counts->tx_size_totals[get_uv_tx_size(mbmi, &xd->plane[1])];
+ ++td->counts
+ ->tx_size_totals[txsize_sqr_map[get_uv_tx_size(mbmi, &xd->plane[1])]];
#if CONFIG_EXT_TX
if (get_ext_tx_types(mbmi->tx_size, bsize, is_inter_block(mbmi)) > 1 &&
cm->base_qindex > 0 && !mbmi->skip &&
@@ -5987,8 +5988,8 @@
pnskip = 1;
tx_size = max_txsize_lookup[bsize];
- tx_size = get_uv_tx_size_impl(tx_size, bsize, cm->subsampling_x,
- cm->subsampling_y);
+ tx_size =
+ uv_txsize_lookup[bsize][tx_size][cm->subsampling_x][cm->subsampling_y];
av1_get_entropy_contexts(bsize, tx_size, pd, ctxa, ctxl);
coeff_ctx = combine_entropy_contexts(ctxa[0], ctxl[0]);
@@ -5998,8 +5999,8 @@
&this_dist, &pnsse, &pnskip);
#else
tx_size = max_txsize_lookup[bsize];
- tx_size = get_uv_tx_size_impl(tx_size, bsize, cm->subsampling_x,
- cm->subsampling_y);
+ tx_size =
+ uv_txsize_lookup[bsize][tx_size][cm->subsampling_x][cm->subsampling_y];
av1_subtract_plane(x, bsize, plane);
av1_txfm_rd_in_plane_supertx(x, cpi, &this_rate, &this_dist, &pnskip,
&pnsse, INT64_MAX, plane, bsize, tx_size, 0);
diff --git a/av1/encoder/encodemb.c b/av1/encoder/encodemb.c
index 93ffdaa..5a21ebd 100644
--- a/av1/encoder/encodemb.c
+++ b/av1/encoder/encodemb.c
@@ -871,9 +871,9 @@
if (blk_row >= max_blocks_high || blk_col >= max_blocks_wide) return;
- plane_tx_size = plane ? get_uv_tx_size_impl(
- mbmi->inter_tx_size[tx_row][tx_col], bsize, 0, 0)
- : mbmi->inter_tx_size[tx_row][tx_col];
+ plane_tx_size =
+ plane ? uv_txsize_lookup[bsize][mbmi->inter_tx_size[tx_row][tx_col]][0][0]
+ : mbmi->inter_tx_size[tx_row][tx_col];
if (tx_size == plane_tx_size) {
encode_block(plane, block, blk_row, blk_col, plane_bsize, tx_size, arg);
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 9a15183..63cc75e 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -3347,9 +3347,9 @@
if (blk_row >= max_blocks_high || blk_col >= max_blocks_wide) return;
- plane_tx_size = plane ? get_uv_tx_size_impl(
- mbmi->inter_tx_size[tx_row][tx_col], bsize, 0, 0)
- : mbmi->inter_tx_size[tx_row][tx_col];
+ plane_tx_size =
+ plane ? uv_txsize_lookup[bsize][mbmi->inter_tx_size[tx_row][tx_col]][0][0]
+ : mbmi->inter_tx_size[tx_row][tx_col];
if (tx_size == plane_tx_size) {
int coeff_ctx, i;
@@ -7750,8 +7750,8 @@
return;
}
}
- max_uv_tx_size = get_uv_tx_size_impl(
- xd->mi[0]->mbmi.tx_size, bsize, pd[1].subsampling_x, pd[1].subsampling_y);
+ max_uv_tx_size = uv_txsize_lookup[bsize][xd->mi[0]->mbmi.tx_size]
+ [pd[1].subsampling_x][pd[1].subsampling_y];
rd_pick_intra_sbuv_mode(cpi, x, &rate_uv, &rate_uv_tokenonly, &dist_uv,
&uv_skip, AOMMAX(BLOCK_8X8, bsize), max_uv_tx_size);
@@ -7971,8 +7971,8 @@
return;
if (rate_y == INT_MAX) return;
- uv_tx = get_uv_tx_size_impl(mbmi->tx_size, bsize, xd->plane[1].subsampling_x,
- xd->plane[1].subsampling_y);
+ uv_tx = uv_txsize_lookup[bsize][mbmi->tx_size][xd->plane[1].subsampling_x]
+ [xd->plane[1].subsampling_y];
if (rate_uv_intra[uv_tx] == INT_MAX) {
choose_intra_uv_mode(cpi, x, ctx, bsize, uv_tx, &rate_uv_intra[uv_tx],
&rate_uv_tokenonly[uv_tx], &dist_uv[uv_tx],
@@ -8673,8 +8673,8 @@
if (mbmi->mode == DC_PRED) dc_skipped = 0;
#endif // CONFIG_EXT_INTRA
- uv_tx = get_uv_tx_size_impl(mbmi->tx_size, bsize, pd->subsampling_x,
- pd->subsampling_y);
+ uv_tx = uv_txsize_lookup[bsize][mbmi->tx_size][pd->subsampling_x]
+ [pd->subsampling_y];
if (rate_uv_intra[uv_tx] == INT_MAX) {
choose_intra_uv_mode(cpi, x, ctx, bsize, uv_tx, &rate_uv_intra[uv_tx],
&rate_uv_tokenonly[uv_tx], &dist_uv[uv_tx],
@@ -9334,9 +9334,8 @@
super_block_yrd(cpi, x, &rate_y, &distortion_y, &skippable, NULL, bsize,
best_rd);
if (rate_y == INT_MAX) goto PALETTE_EXIT;
- uv_tx =
- get_uv_tx_size_impl(mbmi->tx_size, bsize, xd->plane[1].subsampling_x,
- xd->plane[1].subsampling_y);
+ uv_tx = uv_txsize_lookup[bsize][mbmi->tx_size][xd->plane[1].subsampling_x]
+ [xd->plane[1].subsampling_y];
if (rate_uv_intra[uv_tx] == INT_MAX) {
choose_intra_uv_mode(cpi, x, ctx, bsize, uv_tx, &rate_uv_intra[uv_tx],
&rate_uv_tokenonly[uv_tx], &dist_uv[uv_tx],
diff --git a/av1/encoder/tokenize.c b/av1/encoder/tokenize.c
index d76c1a5..b86baa8 100644
--- a/av1/encoder/tokenize.c
+++ b/av1/encoder/tokenize.c
@@ -584,9 +584,9 @@
if (blk_row >= max_blocks_high || blk_col >= max_blocks_wide) return;
- plane_tx_size = plane ? get_uv_tx_size_impl(
- mbmi->inter_tx_size[tx_row][tx_col], bsize, 0, 0)
- : mbmi->inter_tx_size[tx_row][tx_col];
+ plane_tx_size =
+ plane ? uv_txsize_lookup[bsize][mbmi->inter_tx_size[tx_row][tx_col]][0][0]
+ : mbmi->inter_tx_size[tx_row][tx_col];
if (tx_size == plane_tx_size) {
const struct macroblockd_plane *const pd = &xd->plane[plane];