void vp9_setup_block_planes(MACROBLOCKD *xd, int ss_x, int ss_y);
-static INLINE TX_SIZE get_uv_tx_size_impl(TX_SIZE y_tx_size, BLOCK_SIZE bsize,
+static TX_SIZE get_uv_tx_size_impl(TX_SIZE y_tx_size, BLOCK_SIZE bsize,
int xss, int yss) {
if (bsize < BLOCK_8X8) {
return TX_4X4;
} else {
const BLOCK_SIZE plane_bsize = ss_size_lookup[bsize][xss][yss];
- return MIN(y_tx_size, max_txsize_lookup[plane_bsize]);
+ TX_SIZE uv_tx_size = TX_4X4;
+ if (y_tx_size == TX_32X32)
+ uv_tx_size = TX_16X16;
+ else if (y_tx_size == TX_16X16)
+ uv_tx_size = TX_8X8;
+ else if (y_tx_size == TX_8X8)
+ uv_tx_size = TX_4X4;
+
+ return MIN(uv_tx_size, max_txsize_lookup[plane_bsize]);
}
}
MACROBLOCKD *const xd = args->xd;
MB_MODE_INFO *const mbmi = &xd->mi[0].src_mi->mbmi;
struct macroblockd_plane *const pd = &xd->plane[plane];
+ int tx_idx = (blk_row >> (1 - pd->subsampling_y)) * 8 +
+ (blk_col >> (1 - pd->subsampling_x));
TX_SIZE plane_tx_size = plane ?
- get_uv_tx_size_impl(mbmi->tx_size, plane_bsize,
- 0, 0) : mbmi->tx_size;
+ get_uv_tx_size_impl(mbmi->inter_tx_size[tx_idx], plane_bsize, 0, 0) :
+ mbmi->inter_tx_size[tx_idx];
int max_blocks_high = num_4x4_blocks_high_lookup[plane_bsize];
int max_blocks_wide = num_4x4_blocks_wide_lookup[plane_bsize];
mbmi->skip = 1; // skip loopfilter
}
}
+
xd->corrupted |= vp9_reader_has_error(r);
}
vp9_reader *r) {
MB_MODE_INFO *mbmi = &xd->mi[0].src_mi->mbmi;
int is_split = 0;
+ int tx_idx = (blk_row / 2) * 8 + (blk_col / 2);
int max_blocks_high = num_4x4_blocks_high_lookup[mbmi->sb_type];
int max_blocks_wide = num_4x4_blocks_wide_lookup[mbmi->sb_type];
+ BLOCK_SIZE bsize = txsize_to_bsize[tx_size];
+ int bh = num_4x4_blocks_high_lookup[bsize];
+ int i, j;
+
if (xd->mb_to_bottom_edge < 0)
max_blocks_high += xd->mb_to_bottom_edge >> 5;
if (xd->mb_to_right_edge < 0)
is_split = vp9_read_bit(r);
if (!is_split) {
+ mbmi->inter_tx_size[tx_idx] = tx_size;
+ for (j = 0; j < bh / 2; ++j)
+ for (i = 0; i < bh / 2; ++i)
+ mbmi->inter_tx_size[tx_idx + j * 8 + i] = tx_size;
mbmi->tx_size = tx_size;
} else {
- BLOCK_SIZE bsize = txsize_to_bsize[tx_size];
- int bh = num_4x4_blocks_high_lookup[bsize];
- int i;
-
if (tx_size == TX_8X8) {
+ mbmi->inter_tx_size[tx_idx] = TX_4X4;
mbmi->tx_size = TX_4X4;
return;
}
read_tx_size_inter(cm, xd, max_txsize_lookup[mbmi->sb_type],
idy, idx, r);
} else {
+ int i;
mbmi->tx_size = read_tx_size(cm, xd, counts,
!mbmi->skip || !inter_block, r);
+ for (i = 0; i < 64; ++i)
+ mbmi->inter_tx_size[i] = mbmi->tx_size;
}
if (inter_block)
TX_SIZE tx_size, int blk_row, int blk_col,
vp9_writer *w) {
MB_MODE_INFO *mbmi = &xd->mi[0].src_mi->mbmi;
+ int tx_idx = (blk_row / 2) * 8 + (blk_col / 2);
int max_blocks_high = num_4x4_blocks_high_lookup[mbmi->sb_type];
int max_blocks_wide = num_4x4_blocks_wide_lookup[mbmi->sb_type];
if (xd->mb_to_bottom_edge < 0)
return;
// TODO(jingning): this assumes support of the possible 64x64 transform.
- if (tx_size == mbmi->tx_size) {
+ if (tx_size == mbmi->inter_tx_size[tx_idx]) {
vp9_write_bit(w, 0);
} else { // further split
BLOCK_SIZE bsize = txsize_to_bsize[tx_size];
MACROBLOCKD *const xd = &x->e_mbd;
MB_MODE_INFO *const mbmi = &xd->mi[0].src_mi->mbmi;
struct macroblockd_plane *const pd = &xd->plane[plane];
- int blk_idx = (blk_row / 2) * 8 + (blk_col / 2);
+ int tx_idx = (blk_row >> (1 - pd->subsampling_y)) * 8 +
+ (blk_col >> (1 - pd->subsampling_x));
TX_SIZE plane_tx_size = plane ?
- get_uv_tx_size_impl(mbmi->inter_tx_size[blk_idx], plane_bsize, 0, 0) :
- mbmi->inter_tx_size[blk_idx];
+ get_uv_tx_size_impl(mbmi->inter_tx_size[tx_idx], plane_bsize, 0, 0) :
+ mbmi->inter_tx_size[tx_idx];
int max_blocks_high = num_4x4_blocks_high_lookup[plane_bsize];
int max_blocks_wide = num_4x4_blocks_wide_lookup[plane_bsize];
if (xd->mb_to_bottom_edge < 0)
MACROBLOCKD *const xd = &x->e_mbd;
MB_MODE_INFO *const mbmi = &xd->mi[0].src_mi->mbmi;
const struct macroblockd_plane *const pd = &xd->plane[plane];
- int blk_idx = (blk_row / 2) * 8 + (blk_col / 2);
+ int tx_idx = (blk_row >> (1 - pd->subsampling_y)) * 8 +
+ (blk_col >> (1 - pd->subsampling_x));
TX_SIZE plane_tx_size = plane ?
- get_uv_tx_size_impl(mbmi->inter_tx_size[blk_idx],
- plane_bsize, 0, 0) :
- mbmi->inter_tx_size[blk_idx];
+ get_uv_tx_size_impl(mbmi->inter_tx_size[tx_idx], plane_bsize, 0, 0) :
+ mbmi->inter_tx_size[tx_idx];
int max_blocks_high = num_4x4_blocks_high_lookup[plane_bsize];
int max_blocks_wide = num_4x4_blocks_wide_lookup[plane_bsize];