Commit bb072000 authored by Dmitry Kovalev's avatar Dmitry Kovalev
Browse files

foreach_transformed_block_in_plane cleanup, explicit tx_size var.

Making foreach_transformed_block_in_plane more clear (it's not finished
yet). Using explicit tx_size variable consistently instead of
(ss_txfrm_size / 2) or (ss_txfrm_size >> 1) expression.

Change-Id: I1b9bba2c0a9f817fca72c88324bbe6004766fb7d
parent f2c073ef
...@@ -393,7 +393,7 @@ static INLINE struct plane_block_idx plane_block_idx(int y_blocks, ...@@ -393,7 +393,7 @@ static INLINE struct plane_block_idx plane_block_idx(int y_blocks,
} }
static BLOCK_SIZE_TYPE get_plane_block_size(BLOCK_SIZE_TYPE bsize, static BLOCK_SIZE_TYPE get_plane_block_size(BLOCK_SIZE_TYPE bsize,
struct macroblockd_plane *pd) { const struct macroblockd_plane *pd) {
BLOCK_SIZE_TYPE bs = ss_size_lookup[bsize] BLOCK_SIZE_TYPE bs = ss_size_lookup[bsize]
[pd->subsampling_x][pd->subsampling_y]; [pd->subsampling_x][pd->subsampling_y];
assert(bs < BLOCK_SIZES); assert(bs < BLOCK_SIZES);
...@@ -418,7 +418,7 @@ typedef void (*foreach_transformed_block_visitor)(int plane, int block, ...@@ -418,7 +418,7 @@ typedef void (*foreach_transformed_block_visitor)(int plane, int block,
static INLINE void foreach_transformed_block_in_plane( static INLINE void foreach_transformed_block_in_plane(
const MACROBLOCKD* const xd, BLOCK_SIZE_TYPE bsize, int plane, const MACROBLOCKD* const xd, BLOCK_SIZE_TYPE bsize, int plane,
foreach_transformed_block_visitor visit, void *arg) { foreach_transformed_block_visitor visit, void *arg) {
const int bw = b_width_log2(bsize), bh = b_height_log2(bsize); const struct macroblockd_plane *const pd = &xd->plane[plane];
// block and transform sizes, in number of 4x4 blocks log 2 ("*_b") // block and transform sizes, in number of 4x4 blocks log 2 ("*_b")
// 4x4=0, 8x8=2, 16x16=4, 32x32=6, 64x64=8 // 4x4=0, 8x8=2, 16x16=4, 32x32=6, 64x64=8
...@@ -426,56 +426,45 @@ static INLINE void foreach_transformed_block_in_plane( ...@@ -426,56 +426,45 @@ static INLINE void foreach_transformed_block_in_plane(
const MB_MODE_INFO* mbmi = &xd->mode_info_context->mbmi; const MB_MODE_INFO* mbmi = &xd->mode_info_context->mbmi;
const TX_SIZE tx_size = plane ? get_uv_tx_size(mbmi) const TX_SIZE tx_size = plane ? get_uv_tx_size(mbmi)
: mbmi->txfm_size; : mbmi->txfm_size;
const int block_size_b = bw + bh; const int bw = b_width_log2(bsize) - pd->subsampling_x;
const int bh = b_height_log2(bsize) - pd->subsampling_y;
const int txfrm_size_b = tx_size * 2; const int txfrm_size_b = tx_size * 2;
// subsampled size of the block
const int ss_sum = xd->plane[plane].subsampling_x
+ xd->plane[plane].subsampling_y;
const int ss_block_size = block_size_b - ss_sum;
const int step = 1 << txfrm_size_b; const int step = 1 << txfrm_size_b;
int i; int i;
assert(txfrm_size_b <= block_size_b);
assert(txfrm_size_b <= ss_block_size);
// If mb_to_right_edge is < 0 we are in a situation in which // If mb_to_right_edge is < 0 we are in a situation in which
// the current block size extends into the UMV and we won't // the current block size extends into the UMV and we won't
// visit the sub blocks that are wholly within the UMV. // visit the sub blocks that are wholly within the UMV.
if (xd->mb_to_right_edge < 0 || xd->mb_to_bottom_edge < 0) { if (xd->mb_to_right_edge < 0 || xd->mb_to_bottom_edge < 0) {
int r, c; int r, c;
const int sw = bw - xd->plane[plane].subsampling_x;
const int sh = bh - xd->plane[plane].subsampling_y; int max_blocks_wide = 1 << bw;
int max_blocks_wide = 1 << sw; int max_blocks_high = 1 << bh;
int max_blocks_high = 1 << sh;
// xd->mb_to_right_edge is in units of pixels * 8. This converts // xd->mb_to_right_edge is in units of pixels * 8. This converts
// it to 4x4 block sizes. // it to 4x4 block sizes.
if (xd->mb_to_right_edge < 0) if (xd->mb_to_right_edge < 0)
max_blocks_wide += max_blocks_wide += (xd->mb_to_right_edge >> (5 + pd->subsampling_x));
(xd->mb_to_right_edge >> (5 + xd->plane[plane].subsampling_x));
if (xd->mb_to_bottom_edge < 0) if (xd->mb_to_bottom_edge < 0)
max_blocks_high += max_blocks_high += (xd->mb_to_bottom_edge >> (5 + pd->subsampling_y));
(xd->mb_to_bottom_edge >> (5 + xd->plane[plane].subsampling_y));
i = 0; i = 0;
// Unlike the normal case - in here we have to keep track of the // Unlike the normal case - in here we have to keep track of the
// row and column of the blocks we use so that we know if we are in // row and column of the blocks we use so that we know if we are in
// the unrestricted motion border. // the unrestricted motion border.
for (r = 0; r < (1 << sh); r += (1 << tx_size)) { for (r = 0; r < (1 << bh); r += (1 << tx_size)) {
for (c = 0; c < (1 << sw); c += (1 << tx_size)) { for (c = 0; c < (1 << bw); c += (1 << tx_size)) {
if (r < max_blocks_high && c < max_blocks_wide) if (r < max_blocks_high && c < max_blocks_wide)
visit(plane, i, bsize, txfrm_size_b, arg); visit(plane, i, bsize, txfrm_size_b, arg);
i += step; i += step;
} }
} }
} else { } else {
for (i = 0; i < (1 << ss_block_size); i += step) { const int ss_block_size = bw + bh;
assert(txfrm_size_b <= ss_block_size);
for (i = 0; i < (1 << ss_block_size); i += step)
visit(plane, i, bsize, txfrm_size_b, arg); visit(plane, i, bsize, txfrm_size_b, arg);
}
} }
} }
...@@ -484,10 +473,8 @@ static INLINE void foreach_transformed_block( ...@@ -484,10 +473,8 @@ static INLINE void foreach_transformed_block(
foreach_transformed_block_visitor visit, void *arg) { foreach_transformed_block_visitor visit, void *arg) {
int plane; int plane;
for (plane = 0; plane < MAX_MB_PLANE; plane++) { for (plane = 0; plane < MAX_MB_PLANE; plane++)
foreach_transformed_block_in_plane(xd, bsize, plane, foreach_transformed_block_in_plane(xd, bsize, plane, visit, arg);
visit, arg);
}
} }
static INLINE void foreach_transformed_block_uv( static INLINE void foreach_transformed_block_uv(
...@@ -495,10 +482,8 @@ static INLINE void foreach_transformed_block_uv( ...@@ -495,10 +482,8 @@ static INLINE void foreach_transformed_block_uv(
foreach_transformed_block_visitor visit, void *arg) { foreach_transformed_block_visitor visit, void *arg) {
int plane; int plane;
for (plane = 1; plane < MAX_MB_PLANE; plane++) { for (plane = 1; plane < MAX_MB_PLANE; plane++)
foreach_transformed_block_in_plane(xd, bsize, plane, foreach_transformed_block_in_plane(xd, bsize, plane, visit, arg);
visit, arg);
}
} }
// TODO(jkoleszar): In principle, pred_w, pred_h are unnecessary, as we could // TODO(jkoleszar): In principle, pred_w, pred_h are unnecessary, as we could
...@@ -548,9 +533,8 @@ static INLINE void foreach_predicted_block( ...@@ -548,9 +533,8 @@ static INLINE void foreach_predicted_block(
foreach_predicted_block_visitor visit, void *arg) { foreach_predicted_block_visitor visit, void *arg) {
int plane; int plane;
for (plane = 0; plane < MAX_MB_PLANE; plane++) { for (plane = 0; plane < MAX_MB_PLANE; plane++)
foreach_predicted_block_in_plane(xd, bsize, plane, visit, arg); foreach_predicted_block_in_plane(xd, bsize, plane, visit, arg);
}
} }
static int raster_block_offset(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize, static int raster_block_offset(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize,
...@@ -577,7 +561,7 @@ static int txfrm_block_to_raster_block(MACROBLOCKD *xd, ...@@ -577,7 +561,7 @@ static int txfrm_block_to_raster_block(MACROBLOCKD *xd,
int plane, int block, int plane, int block,
int ss_txfrm_size) { int ss_txfrm_size) {
const int bwl = b_width_log2(bsize) - xd->plane[plane].subsampling_x; const int bwl = b_width_log2(bsize) - xd->plane[plane].subsampling_x;
const int txwl = ss_txfrm_size / 2; const int txwl = ss_txfrm_size >> 1;
const int tx_cols_log2 = bwl - txwl; const int tx_cols_log2 = bwl - txwl;
const int tx_cols = 1 << tx_cols_log2; const int tx_cols = 1 << tx_cols_log2;
const int raster_mb = block >> ss_txfrm_size; const int raster_mb = block >> ss_txfrm_size;
...@@ -592,7 +576,7 @@ static void txfrm_block_to_raster_xy(MACROBLOCKD *xd, ...@@ -592,7 +576,7 @@ static void txfrm_block_to_raster_xy(MACROBLOCKD *xd,
int ss_txfrm_size, int ss_txfrm_size,
int *x, int *y) { int *x, int *y) {
const int bwl = b_width_log2(bsize) - xd->plane[plane].subsampling_x; const int bwl = b_width_log2(bsize) - xd->plane[plane].subsampling_x;
const int txwl = ss_txfrm_size / 2; const int txwl = ss_txfrm_size >> 1;
const int tx_cols_log2 = bwl - txwl; const int tx_cols_log2 = bwl - txwl;
const int tx_cols = 1 << tx_cols_log2; const int tx_cols = 1 << tx_cols_log2;
const int raster_mb = block >> ss_txfrm_size; const int raster_mb = block >> ss_txfrm_size;
...@@ -656,14 +640,14 @@ static void set_contexts_on_border(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize, ...@@ -656,14 +640,14 @@ static void set_contexts_on_border(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize,
if (xd->mb_to_right_edge < 0) if (xd->mb_to_right_edge < 0)
mi_blocks_wide += (xd->mb_to_right_edge >> (5 + pd->subsampling_x)); mi_blocks_wide += (xd->mb_to_right_edge >> (5 + pd->subsampling_x));
if (xd->mb_to_bottom_edge < 0)
mi_blocks_high += (xd->mb_to_bottom_edge >> (5 + pd->subsampling_y));
// this code attempts to avoid copying into contexts that are outside // this code attempts to avoid copying into contexts that are outside
// our border. Any blocks that do are set to 0... // our border. Any blocks that do are set to 0...
if (above_contexts + aoff > mi_blocks_wide) if (above_contexts + aoff > mi_blocks_wide)
above_contexts = mi_blocks_wide - aoff; above_contexts = mi_blocks_wide - aoff;
if (xd->mb_to_bottom_edge < 0)
mi_blocks_high += (xd->mb_to_bottom_edge >> (5 + pd->subsampling_y));
if (left_contexts + loff > mi_blocks_high) if (left_contexts + loff > mi_blocks_high)
left_contexts = mi_blocks_high - loff; left_contexts = mi_blocks_high - loff;
......
...@@ -99,8 +99,9 @@ static void decode_block(int plane, int block, BLOCK_SIZE_TYPE bsize, ...@@ -99,8 +99,9 @@ static void decode_block(int plane, int block, BLOCK_SIZE_TYPE bsize,
uint8_t* const dst = raster_block_offset_uint8(xd, bsize, plane, uint8_t* const dst = raster_block_offset_uint8(xd, bsize, plane,
raster_block, raster_block,
pd->dst.buf, stride); pd->dst.buf, stride);
const TX_SIZE tx_size = (TX_SIZE)(ss_txfrm_size >> 1);
switch (ss_txfrm_size / 2) { switch (tx_size) {
case TX_4X4: { case TX_4X4: {
const TX_TYPE tx_type = get_tx_type_4x4(pd->plane_type, xd, raster_block); const TX_TYPE tx_type = get_tx_type_4x4(pd->plane_type, xd, raster_block);
if (tx_type == DCT_DCT) if (tx_type == DCT_DCT)
...@@ -120,6 +121,8 @@ static void decode_block(int plane, int block, BLOCK_SIZE_TYPE bsize, ...@@ -120,6 +121,8 @@ static void decode_block(int plane, int block, BLOCK_SIZE_TYPE bsize,
case TX_32X32: case TX_32X32:
vp9_idct_add_32x32(qcoeff, dst, stride, eob); vp9_idct_add_32x32(qcoeff, dst, stride, eob);
break; break;
default:
assert(!"Invalid transform size");
} }
} }
...@@ -134,7 +137,7 @@ static void decode_block_intra(int plane, int block, BLOCK_SIZE_TYPE bsize, ...@@ -134,7 +137,7 @@ static void decode_block_intra(int plane, int block, BLOCK_SIZE_TYPE bsize,
uint8_t* const dst = raster_block_offset_uint8(xd, bsize, plane, uint8_t* const dst = raster_block_offset_uint8(xd, bsize, plane,
raster_block, raster_block,
pd->dst.buf, pd->dst.stride); pd->dst.buf, pd->dst.stride);
const TX_SIZE tx_size = (TX_SIZE)(ss_txfrm_size / 2); const TX_SIZE tx_size = (TX_SIZE)(ss_txfrm_size >> 1);
int b_mode; int b_mode;
int plane_b_size; int plane_b_size;
const int tx_ib = raster_block >> tx_size; const int tx_ib = raster_block >> tx_size;
......
...@@ -260,19 +260,19 @@ static void decode_block(int plane, int block, ...@@ -260,19 +260,19 @@ static void decode_block(int plane, int block,
MACROBLOCKD *xd = &arg->pbi->mb; MACROBLOCKD *xd = &arg->pbi->mb;
struct macroblockd_plane* pd = &xd->plane[plane]; struct macroblockd_plane* pd = &xd->plane[plane];
const int segment_id = xd->mode_info_context->mbmi.segment_id; const int segment_id = xd->mode_info_context->mbmi.segment_id;
const TX_SIZE ss_tx_size = ss_txfrm_size / 2; const TX_SIZE tx_size = ss_txfrm_size >> 1;
const int seg_eob = get_eob(&xd->seg, segment_id, 16 << ss_txfrm_size); const int seg_eob = get_eob(&xd->seg, segment_id, 16 << ss_txfrm_size);
const int off = block >> ss_txfrm_size; const int off = block >> ss_txfrm_size;
const int mod = bw - ss_tx_size - pd->subsampling_x; const int mod = bw - tx_size - pd->subsampling_x;
const int aoff = (off & ((1 << mod) - 1)) << ss_tx_size; const int aoff = (off & ((1 << mod) - 1)) << tx_size;
const int loff = (off >> mod) << ss_tx_size; const int loff = (off >> mod) << tx_size;
const int tx_size_in_blocks = 1 << ss_tx_size; const int tx_size_in_blocks = 1 << tx_size;
ENTROPY_CONTEXT *A = pd->above_context + aoff; ENTROPY_CONTEXT *A = pd->above_context + aoff;
ENTROPY_CONTEXT *L = pd->left_context + loff; ENTROPY_CONTEXT *L = pd->left_context + loff;
const int eob = decode_coefs(&arg->pbi->common, xd, arg->r, block, const int eob = decode_coefs(&arg->pbi->common, xd, arg->r, block,
pd->plane_type, seg_eob, pd->plane_type, seg_eob,
BLOCK_OFFSET(pd->qcoeff, block), BLOCK_OFFSET(pd->qcoeff, block),
ss_tx_size, pd->dequant, A, L); tx_size, pd->dequant, A, L);
if (xd->mb_to_right_edge < 0 || xd->mb_to_bottom_edge < 0) { if (xd->mb_to_right_edge < 0 || xd->mb_to_bottom_edge < 0) {
set_contexts_on_border(xd, bsize, plane, tx_size_in_blocks, eob, aoff, loff, set_contexts_on_border(xd, bsize, plane, tx_size_in_blocks, eob, aoff, loff,
......
...@@ -374,13 +374,14 @@ void vp9_optimize_b(int plane, int block, BLOCK_SIZE_TYPE bsize, ...@@ -374,13 +374,14 @@ void vp9_optimize_b(int plane, int block, BLOCK_SIZE_TYPE bsize,
int ss_txfrm_size, MACROBLOCK *mb, int ss_txfrm_size, MACROBLOCK *mb,
struct optimize_ctx *ctx) { struct optimize_ctx *ctx) {
MACROBLOCKD *const xd = &mb->e_mbd; MACROBLOCKD *const xd = &mb->e_mbd;
const TX_SIZE tx_size = (TX_SIZE)(ss_txfrm_size >> 1);
int x, y; int x, y;
// find current entropy context // find current entropy context
txfrm_block_to_raster_xy(xd, bsize, plane, block, ss_txfrm_size, &x, &y); txfrm_block_to_raster_xy(xd, bsize, plane, block, ss_txfrm_size, &x, &y);
optimize_b(mb, plane, block, bsize, optimize_b(mb, plane, block, bsize, &ctx->ta[plane][x], &ctx->tl[plane][y],
&ctx->ta[plane][x], &ctx->tl[plane][y], ss_txfrm_size / 2); tx_size);
} }
static void optimize_block(int plane, int block, BLOCK_SIZE_TYPE bsize, static void optimize_block(int plane, int block, BLOCK_SIZE_TYPE bsize,
...@@ -460,7 +461,7 @@ void xform_quant(int plane, int block, BLOCK_SIZE_TYPE bsize, ...@@ -460,7 +461,7 @@ void xform_quant(int plane, int block, BLOCK_SIZE_TYPE bsize,
int16_t *dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block); int16_t *dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block);
const int16_t *scan, *iscan; const int16_t *scan, *iscan;
uint16_t *eob = &pd->eobs[block]; uint16_t *eob = &pd->eobs[block];
const TX_SIZE tx_size = (TX_SIZE)(ss_txfrm_size / 2); const TX_SIZE tx_size = (TX_SIZE)(ss_txfrm_size >> 1);
const int bwl = b_width_log2(bsize) - pd->subsampling_x, bw = 1 << bwl; const int bwl = b_width_log2(bsize) - pd->subsampling_x, bw = 1 << bwl;
const int twl = bwl - tx_size, twmask = (1 << twl) - 1; const int twl = bwl - tx_size, twmask = (1 << twl) - 1;
int xoff, yoff; int xoff, yoff;
...@@ -534,17 +535,17 @@ static void encode_block(int plane, int block, BLOCK_SIZE_TYPE bsize, ...@@ -534,17 +535,17 @@ static void encode_block(int plane, int block, BLOCK_SIZE_TYPE bsize,
uint8_t *const dst = raster_block_offset_uint8(xd, bsize, plane, uint8_t *const dst = raster_block_offset_uint8(xd, bsize, plane,
raster_block, raster_block,
pd->dst.buf, pd->dst.stride); pd->dst.buf, pd->dst.stride);
const TX_SIZE tx_size = (TX_SIZE)(ss_txfrm_size >> 1);
xform_quant(plane, block, bsize, ss_txfrm_size, arg); xform_quant(plane, block, bsize, ss_txfrm_size, arg);
if (x->optimize) if (x->optimize)
vp9_optimize_b(plane, block, bsize, ss_txfrm_size, x, args->ctx); vp9_optimize_b(plane, block, bsize, ss_txfrm_size, x, args->ctx);
if (x->skip_encode) if (x->skip_encode || pd->eobs[block] == 0)
return;
if (pd->eobs[block] == 0)
return; return;
switch (ss_txfrm_size / 2) { switch (tx_size) {
case TX_32X32: case TX_32X32:
vp9_short_idct32x32_add(dqcoeff, dst, pd->dst.stride); vp9_short_idct32x32_add(dqcoeff, dst, pd->dst.stride);
break; break;
...@@ -563,6 +564,8 @@ static void encode_block(int plane, int block, BLOCK_SIZE_TYPE bsize, ...@@ -563,6 +564,8 @@ static void encode_block(int plane, int block, BLOCK_SIZE_TYPE bsize,
inverse_transform_b_4x4_add(xd, pd->eobs[block], dqcoeff, inverse_transform_b_4x4_add(xd, pd->eobs[block], dqcoeff,
dst, pd->dst.stride); dst, pd->dst.stride);
break; break;
default:
assert(!"Invalid transform size");
} }
} }
...@@ -630,7 +633,7 @@ void encode_block_intra(int plane, int block, BLOCK_SIZE_TYPE bsize, ...@@ -630,7 +633,7 @@ void encode_block_intra(int plane, int block, BLOCK_SIZE_TYPE bsize,
MACROBLOCK *const x = args->x; MACROBLOCK *const x = args->x;
MACROBLOCKD *const xd = &x->e_mbd; MACROBLOCKD *const xd = &x->e_mbd;
MB_MODE_INFO *mbmi = &xd->mode_info_context->mbmi; MB_MODE_INFO *mbmi = &xd->mode_info_context->mbmi;
const TX_SIZE tx_size = (TX_SIZE)(ss_txfrm_size / 2); const TX_SIZE tx_size = (TX_SIZE)(ss_txfrm_size >> 1);
struct macroblock_plane *const p = &x->plane[plane]; struct macroblock_plane *const p = &x->plane[plane];
struct macroblockd_plane *const pd = &xd->plane[plane]; struct macroblockd_plane *const pd = &xd->plane[plane];
int16_t *coeff = BLOCK_OFFSET(p->coeff, block); int16_t *coeff = BLOCK_OFFSET(p->coeff, block);
......
...@@ -100,8 +100,8 @@ struct tokenize_b_args { ...@@ -100,8 +100,8 @@ struct tokenize_b_args {
static void set_entropy_context_b(int plane, int block, BLOCK_SIZE_TYPE bsize, static void set_entropy_context_b(int plane, int block, BLOCK_SIZE_TYPE bsize,
int ss_txfrm_size, void *arg) { int ss_txfrm_size, void *arg) {
struct tokenize_b_args* const args = arg; struct tokenize_b_args* const args = arg;
TX_SIZE tx_size = ss_txfrm_size >> 1; const TX_SIZE tx_size = (TX_SIZE)(ss_txfrm_size >> 1);
MACROBLOCKD *xd = args->xd; MACROBLOCKD *const xd = args->xd;
const int bwl = b_width_log2(bsize); const int bwl = b_width_log2(bsize);
const int off = block >> (2 * tx_size); const int off = block >> (2 * tx_size);
const int mod = bwl - tx_size - xd->plane[plane].subsampling_x; const int mod = bwl - tx_size - xd->plane[plane].subsampling_x;
...@@ -127,7 +127,7 @@ static void tokenize_b(int plane, int block, BLOCK_SIZE_TYPE bsize, ...@@ -127,7 +127,7 @@ static void tokenize_b(int plane, int block, BLOCK_SIZE_TYPE bsize,
VP9_COMP *cpi = args->cpi; VP9_COMP *cpi = args->cpi;
MACROBLOCKD *xd = args->xd; MACROBLOCKD *xd = args->xd;
TOKENEXTRA **tp = args->tp; TOKENEXTRA **tp = args->tp;
const TX_SIZE tx_size = ss_txfrm_size >> 1; const TX_SIZE tx_size = (TX_SIZE)(ss_txfrm_size >> 1);
const int tx_size_in_blocks = 1 << tx_size; const int tx_size_in_blocks = 1 << tx_size;
MB_MODE_INFO *mbmi = &xd->mode_info_context->mbmi; MB_MODE_INFO *mbmi = &xd->mode_info_context->mbmi;
int pt; /* near block/prev token context index */ int pt; /* near block/prev token context index */
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment