diff --git a/av1/common/onyxc_int.h b/av1/common/onyxc_int.h index f515786e0..30ddde8e0 100644 --- a/av1/common/onyxc_int.h +++ b/av1/common/onyxc_int.h @@ -678,6 +678,30 @@ static INLINE int partition_plane_context(const MACROBLOCKD *xd, int mi_row, return (left * 2 + above) + bsl * PARTITION_PLOFFSET; } +static INLINE int max_block_wide(const MACROBLOCKD *xd, const BLOCK_SIZE bsize, + const int plane) { + int max_blocks_wide = block_size_wide[bsize]; + const struct macroblockd_plane *const pd = &xd->plane[plane]; + + if (xd->mb_to_right_edge < 0) + max_blocks_wide += xd->mb_to_right_edge >> (3 + pd->subsampling_x); + + // Scale the width in the transform block unit. + return max_blocks_wide >> tx_size_wide_log2[0]; +} + +static INLINE int max_block_high(const MACROBLOCKD *xd, const BLOCK_SIZE bsize, + const int plane) { + int max_blocks_high = block_size_high[bsize]; + const struct macroblockd_plane *const pd = &xd->plane[plane]; + + if (xd->mb_to_bottom_edge < 0) + max_blocks_high += xd->mb_to_bottom_edge >> (3 + pd->subsampling_y); + + // Scale the width in the transform block unit. + return max_blocks_high >> tx_size_wide_log2[0]; +} + static INLINE void av1_zero_above_context(AV1_COMMON *const cm, int mi_col_start, int mi_col_end) { const int width = mi_col_end - mi_col_start; diff --git a/av1/common/pred_common.h b/av1/common/pred_common.h index b90674943..6b47ed2e0 100644 --- a/av1/common/pred_common.h +++ b/av1/common/pred_common.h @@ -205,13 +205,8 @@ static void update_tx_counts(AV1_COMMON *cm, MACROBLOCKD *xd, const int tx_row = blk_row >> (1 - pd->subsampling_y); const int tx_col = blk_col >> (1 - pd->subsampling_x); const TX_SIZE plane_tx_size = mbmi->inter_tx_size[tx_row][tx_col]; - 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) - max_blocks_high += xd->mb_to_bottom_edge >> (5 + pd->subsampling_y); - if (xd->mb_to_right_edge < 0) - max_blocks_wide += xd->mb_to_right_edge >> (5 + pd->subsampling_x); + const int max_blocks_high = max_block_high(xd, plane_bsize, 0); + const int max_blocks_wide = max_block_wide(xd, plane_bsize, 0); if (blk_row >= max_blocks_high || blk_col >= max_blocks_wide) return; diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c index 7310d70ae..e232a8796 100644 --- a/av1/encoder/bitstream.c +++ b/av1/encoder/bitstream.c @@ -356,14 +356,12 @@ static void write_tx_size_vartx(const AV1_COMMON *cm, const MACROBLOCKD *xd, aom_writer *w) { const int tx_row = blk_row >> 1; const int tx_col = blk_col >> 1; - int max_blocks_high = num_4x4_blocks_high_lookup[mbmi->sb_type]; - int max_blocks_wide = num_4x4_blocks_wide_lookup[mbmi->sb_type]; + const int max_blocks_high = max_block_high(xd, mbmi->sb_type, 0); + const int max_blocks_wide = max_block_wide(xd, mbmi->sb_type, 0); + int ctx = txfm_partition_context(xd->above_txfm_context + tx_col, xd->left_txfm_context + tx_row, tx_size); - if (xd->mb_to_bottom_edge < 0) max_blocks_high += xd->mb_to_bottom_edge >> 5; - if (xd->mb_to_right_edge < 0) max_blocks_wide += xd->mb_to_right_edge >> 5; - if (blk_row >= max_blocks_high || blk_col >= max_blocks_wide) return; if (depth == MAX_VARTX_DEPTH) { @@ -831,13 +829,8 @@ static void pack_txb_tokens(aom_writer *w, const TOKENEXTRA **tp, const int tx_row = blk_row >> (1 - pd->subsampling_y); const int tx_col = blk_col >> (1 - pd->subsampling_x); TX_SIZE plane_tx_size; - 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) - max_blocks_high += xd->mb_to_bottom_edge >> (5 + pd->subsampling_y); - if (xd->mb_to_right_edge < 0) - max_blocks_wide += xd->mb_to_right_edge >> (5 + pd->subsampling_x); + const int max_blocks_high = max_block_high(xd, plane_bsize, plane); + const int max_blocks_wide = max_block_wide(xd, plane_bsize, plane); if (blk_row >= max_blocks_high || blk_col >= max_blocks_wide) return; diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c index 47e328bf8..5ad334dda 100644 --- a/av1/encoder/encodeframe.c +++ b/av1/encoder/encodeframe.c @@ -4992,15 +4992,12 @@ static void update_txfm_count(MACROBLOCK *x, MACROBLOCKD *xd, MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi; const int tx_row = blk_row >> 1; const int tx_col = blk_col >> 1; - int max_blocks_high = num_4x4_blocks_high_lookup[mbmi->sb_type]; - int max_blocks_wide = num_4x4_blocks_wide_lookup[mbmi->sb_type]; + const int max_blocks_high = max_block_high(xd, mbmi->sb_type, 0); + const int max_blocks_wide = max_block_wide(xd, mbmi->sb_type, 0); int ctx = txfm_partition_context(xd->above_txfm_context + tx_col, xd->left_txfm_context + tx_row, tx_size); const TX_SIZE plane_tx_size = mbmi->inter_tx_size[tx_row][tx_col]; - if (xd->mb_to_bottom_edge < 0) max_blocks_high += xd->mb_to_bottom_edge >> 5; - if (xd->mb_to_right_edge < 0) max_blocks_wide += xd->mb_to_right_edge >> 5; - if (blk_row >= max_blocks_high || blk_col >= max_blocks_wide) return; if (tx_size == plane_tx_size) { @@ -5057,13 +5054,10 @@ static void set_txfm_context(MACROBLOCKD *xd, TX_SIZE tx_size, int blk_row, MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi; const int tx_row = blk_row >> 1; const int tx_col = blk_col >> 1; - int max_blocks_high = num_4x4_blocks_high_lookup[mbmi->sb_type]; - int max_blocks_wide = num_4x4_blocks_wide_lookup[mbmi->sb_type]; + const int max_blocks_high = max_block_high(xd, mbmi->sb_type, 0); + const int max_blocks_wide = max_block_wide(xd, mbmi->sb_type, 0); const TX_SIZE plane_tx_size = mbmi->inter_tx_size[tx_row][tx_col]; - if (xd->mb_to_bottom_edge < 0) max_blocks_high += xd->mb_to_bottom_edge >> 5; - if (xd->mb_to_right_edge < 0) max_blocks_wide += xd->mb_to_right_edge >> 5; - if (blk_row >= max_blocks_high || blk_col >= max_blocks_wide) return; if (tx_size == plane_tx_size) { diff --git a/av1/encoder/encodemb.c b/av1/encoder/encodemb.c index 03ddf2c1c..3a33f350c 100644 --- a/av1/encoder/encodemb.c +++ b/av1/encoder/encodemb.c @@ -863,14 +863,8 @@ static void encode_block_inter(int plane, int block, int blk_row, int blk_col, const int tx_row = blk_row >> (1 - pd->subsampling_y); const int tx_col = blk_col >> (1 - pd->subsampling_x); TX_SIZE plane_tx_size; - - 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) - max_blocks_high += xd->mb_to_bottom_edge >> (5 + pd->subsampling_y); - if (xd->mb_to_right_edge < 0) - max_blocks_wide += xd->mb_to_right_edge >> (5 + pd->subsampling_x); + const int max_blocks_high = max_block_high(xd, plane_bsize, plane); + const int max_blocks_wide = max_block_wide(xd, plane_bsize, plane); if (blk_row >= max_blocks_high || blk_col >= max_blocks_wide) return; diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c index dbb7dc420..e1c8c062b 100644 --- a/av1/encoder/rdopt.c +++ b/av1/encoder/rdopt.c @@ -3057,8 +3057,8 @@ static void select_tx_block(const AV1_COMP *cpi, MACROBLOCK *x, int blk_row, TX_SIZE(*const inter_tx_size) [MAX_MIB_SIZE] = (TX_SIZE(*)[MAX_MIB_SIZE]) & mbmi->inter_tx_size[tx_row][tx_col]; - int max_blocks_high = block_size_high[plane_bsize]; - int max_blocks_wide = block_size_wide[plane_bsize]; + const int max_blocks_high = max_block_high(xd, plane_bsize, plane); + const int max_blocks_wide = max_block_wide(xd, plane_bsize, plane); const int bw = block_size_wide[plane_bsize] >> tx_size_wide_log2[0]; int64_t this_rd = INT64_MAX; ENTROPY_CONTEXT *pta = ta + blk_col; @@ -3105,14 +3105,6 @@ static void select_tx_block(const AV1_COMP *cpi, MACROBLOCK *x, int blk_row, } coeff_ctx = combine_entropy_contexts(stxa, stxl); - if (xd->mb_to_bottom_edge < 0) - max_blocks_high += xd->mb_to_bottom_edge >> (3 + pd->subsampling_y); - if (xd->mb_to_right_edge < 0) - max_blocks_wide += xd->mb_to_right_edge >> (3 + pd->subsampling_x); - - max_blocks_high >>= tx_size_wide_log2[0]; - max_blocks_wide >>= tx_size_wide_log2[0]; - *rate = 0; *dist = 0; *bsse = 0;