Change supertx syntax order.
Move the supertx skip bit and transform type past the recursive
prediction blocks. This is in preparation for using the segment level
skip feature for supertx blocks.
Change-Id: I8319414b0734144a9264e8a4a60940b6716b12a8
diff --git a/vp10/decoder/decodeframe.c b/vp10/decoder/decodeframe.c
index 437da9a..237774f 100644
--- a/vp10/decoder/decodeframe.c
+++ b/vp10/decoder/decodeframe.c
@@ -1584,41 +1584,9 @@
r, cm->fc->supertx_prob[supertx_context][supertx_size]);
if (xd->counts)
xd->counts->supertx[supertx_context][supertx_size][supertx_enabled]++;
- }
- if (supertx_enabled && read_token) {
- int offset = mi_row * cm->mi_stride + mi_col;
- xd->mi = cm->mi_grid_visible + offset;
- xd->mi[0] = cm->mi + offset;
- set_mi_row_col(xd, tile, mi_row, num_8x8_blocks_high_lookup[bsize],
- mi_col, num_8x8_blocks_wide_lookup[bsize],
- cm->mi_rows, cm->mi_cols);
- set_skip_context(xd, mi_row, mi_col);
- // Here skip is read without using any segment level feature
- skip = read_skip_without_seg(cm, xd, r);
- if (skip) {
- reset_skip_context(xd, bsize);
- } else {
-#if CONFIG_EXT_TX
- if (get_ext_tx_types(supertx_size, bsize, 1) > 1) {
- int eset = get_ext_tx_set(supertx_size, bsize, 1);
- if (eset > 0) {
- txfm = vp10_read_tree(r, vp10_ext_tx_inter_tree[eset],
- cm->fc->inter_ext_tx_prob[eset][supertx_size]);
- if (xd->counts)
- ++xd->counts->inter_ext_tx[eset][supertx_size][txfm];
- }
- }
-#else
- if (supertx_size < TX_32X32) {
- txfm = vp10_read_tree(r, vp10_ext_tx_tree,
- cm->fc->inter_ext_tx_prob[supertx_size]);
- if (xd->counts)
- ++xd->counts->inter_ext_tx[supertx_size][txfm];
- }
-#endif // CONFIG_EXT_TX
- }
#if CONFIG_VAR_TX
- xd->supertx_size = supertx_size;
+ if (supertx_enabled)
+ xd->supertx_size = supertx_size;
#endif
}
#endif // CONFIG_SUPERTX
@@ -1807,6 +1775,38 @@
if (supertx_enabled && read_token) {
uint8_t *dst_buf[3];
int dst_stride[3], i;
+ int offset = mi_row * cm->mi_stride + mi_col;
+
+ xd->mi = cm->mi_grid_visible + offset;
+ xd->mi[0] = cm->mi + offset;
+ set_mi_row_col(xd, tile, mi_row, num_8x8_blocks_high_lookup[bsize],
+ mi_col, num_8x8_blocks_wide_lookup[bsize],
+ cm->mi_rows, cm->mi_cols);
+ set_skip_context(xd, mi_row, mi_col);
+ // Here skip is read without using any segment level feature
+ skip = read_skip_without_seg(cm, xd, r);
+ if (skip) {
+ reset_skip_context(xd, bsize);
+ } else {
+#if CONFIG_EXT_TX
+ if (get_ext_tx_types(supertx_size, bsize, 1) > 1) {
+ int eset = get_ext_tx_set(supertx_size, bsize, 1);
+ if (eset > 0) {
+ txfm = vp10_read_tree(r, vp10_ext_tx_inter_tree[eset],
+ cm->fc->inter_ext_tx_prob[eset][supertx_size]);
+ if (xd->counts)
+ ++xd->counts->inter_ext_tx[eset][supertx_size][txfm];
+ }
+ }
+#else
+ if (supertx_size < TX_32X32) {
+ txfm = vp10_read_tree(r, vp10_ext_tx_tree,
+ cm->fc->inter_ext_tx_prob[supertx_size]);
+ if (xd->counts)
+ ++xd->counts->inter_ext_tx[supertx_size][txfm];
+ }
+#endif // CONFIG_EXT_TX
+ }
set_segment_id_supertx(cm, mi_row, mi_col, bsize);
diff --git a/vp10/encoder/bitstream.c b/vp10/encoder/bitstream.c
index 9757782..f5d58e0 100644
--- a/vp10/encoder/bitstream.c
+++ b/vp10/encoder/bitstream.c
@@ -1773,28 +1773,6 @@
[supertx_size];
supertx_enabled = (xd->mi[0]->mbmi.tx_size == supertx_size);
vp10_write(w, supertx_enabled, prob);
- if (supertx_enabled) {
- vp10_write(w, xd->mi[0]->mbmi.skip, vp10_get_skip_prob(cm, xd));
-#if CONFIG_EXT_TX
- if (get_ext_tx_types(supertx_size, bsize, 1) > 1 &&
- !xd->mi[0]->mbmi.skip) {
- int eset = get_ext_tx_set(supertx_size, bsize, 1);
- if (eset > 0) {
- vp10_write_token(
- w, vp10_ext_tx_inter_tree[eset],
- cm->fc->inter_ext_tx_prob[eset][supertx_size],
- &ext_tx_inter_encodings[eset][xd->mi[0]->mbmi.tx_type]);
- }
- }
-#else
- if (supertx_size < TX_32X32 && !xd->mi[0]->mbmi.skip) {
- vp10_write_token(
- w, vp10_ext_tx_tree,
- cm->fc->inter_ext_tx_prob[supertx_size],
- &ext_tx_encodings[xd->mi[0]->mbmi.tx_type]);
- }
-#endif // CONFIG_EXT_TX
- }
}
#endif // CONFIG_SUPERTX
if (subsize < BLOCK_8X8) {
@@ -1869,24 +1847,52 @@
}
}
#if CONFIG_SUPERTX
- if (partition != PARTITION_NONE && supertx_enabled && pack_token &&
- !mbmi->skip) {
- assert(*tok < tok_end);
- for (plane = 0; plane < MAX_MB_PLANE; ++plane) {
- const int mbmi_txb_size = txsize_to_bsize[mbmi->tx_size];
- const int num_4x4_w = num_4x4_blocks_wide_lookup[mbmi_txb_size];
- const int num_4x4_h = num_4x4_blocks_high_lookup[mbmi_txb_size];
- int row, col;
- TX_SIZE tx = plane ? get_uv_tx_size(mbmi, &xd->plane[plane])
- : mbmi->tx_size;
- BLOCK_SIZE txb_size = txsize_to_bsize[tx];
- int bw = num_4x4_blocks_wide_lookup[txb_size];
+ if (partition != PARTITION_NONE && supertx_enabled && pack_token) {
+ xd->mi = cm->mi_grid_visible + mi_offset;
+ supertx_size = mbmi->tx_size;
+ set_mi_row_col(xd, tile,
+ mi_row, num_8x8_blocks_high_lookup[bsize],
+ mi_col, num_8x8_blocks_wide_lookup[bsize],
+ cm->mi_rows, cm->mi_cols);
+ vp10_write(w, mbmi->skip, vp10_get_skip_prob(cm, xd));
+#if CONFIG_EXT_TX
+ if (get_ext_tx_types(supertx_size, bsize, 1) > 1 &&
+ !mbmi->skip) {
+ int eset = get_ext_tx_set(supertx_size, bsize, 1);
+ if (eset > 0) {
+ vp10_write_token(
+ w, vp10_ext_tx_inter_tree[eset],
+ cm->fc->inter_ext_tx_prob[eset][supertx_size],
+ &ext_tx_inter_encodings[eset][mbmi->tx_type]);
+ }
+ }
+#else
+ if (supertx_size < TX_32X32 && !mbmi->skip) {
+ vp10_write_token(
+ w, vp10_ext_tx_tree,
+ cm->fc->inter_ext_tx_prob[supertx_size],
+ &ext_tx_encodings[mbmi->tx_type]);
+ }
+#endif // CONFIG_EXT_TX
- for (row = 0; row < num_4x4_h; row += bw)
- for (col = 0; col < num_4x4_w; col += bw)
- pack_mb_tokens(w, tok, tok_end, cm->bit_depth, tx);
- assert(*tok < tok_end && (*tok)->token == EOSB_TOKEN);
- (*tok)++;
+ if (!mbmi->skip) {
+ assert(*tok < tok_end);
+ for (plane = 0; plane < MAX_MB_PLANE; ++plane) {
+ const int mbmi_txb_size = txsize_to_bsize[mbmi->tx_size];
+ const int num_4x4_w = num_4x4_blocks_wide_lookup[mbmi_txb_size];
+ const int num_4x4_h = num_4x4_blocks_high_lookup[mbmi_txb_size];
+ int row, col;
+ TX_SIZE tx = plane ? get_uv_tx_size(mbmi, &xd->plane[plane])
+ : mbmi->tx_size;
+ BLOCK_SIZE txb_size = txsize_to_bsize[tx];
+ int bw = num_4x4_blocks_wide_lookup[txb_size];
+
+ for (row = 0; row < num_4x4_h; row += bw)
+ for (col = 0; col < num_4x4_w; col += bw)
+ pack_mb_tokens(w, tok, tok_end, cm->bit_depth, tx);
+ assert(*tok < tok_end && (*tok)->token == EOSB_TOKEN);
+ (*tok)++;
+ }
}
}
#endif // CONFIG_SUPERTX