diff options
author | Dmitry Kovalev <dkovalev@google.com> | 2013-11-13 10:01:05 -0800 |
---|---|---|
committer | Gerrit Code Review <gerrit@gerrit.golo.chromium.org> | 2013-11-13 10:01:05 -0800 |
commit | 60d1a5299576649f6db38714319b5845683ff0ab (patch) | |
tree | e2eb02fcf4c36899255dc94a0ab4449f88f30a25 /vp9/common | |
parent | 8ce0967df88eaaee32bd1a532778fc8f1af1baef (diff) | |
parent | 22a001988bffbd6ba023d1522460d380bf65baa5 (diff) | |
download | libvpx-60d1a5299576649f6db38714319b5845683ff0ab.tar libvpx-60d1a5299576649f6db38714319b5845683ff0ab.tar.gz libvpx-60d1a5299576649f6db38714319b5845683ff0ab.tar.bz2 libvpx-60d1a5299576649f6db38714319b5845683ff0ab.zip |
Merge "Optimizing set_contexts() function."
Diffstat (limited to 'vp9/common')
-rw-r--r-- | vp9/common/vp9_blockd.h | 77 |
1 files changed, 33 insertions, 44 deletions
diff --git a/vp9/common/vp9_blockd.h b/vp9/common/vp9_blockd.h index b5f917110..c5da3758a 100644 --- a/vp9/common/vp9_blockd.h +++ b/vp9/common/vp9_blockd.h @@ -449,57 +449,46 @@ static void extend_for_intra(MACROBLOCKD *xd, BLOCK_SIZE plane_bsize, } } } -static void set_contexts_on_border(const MACROBLOCKD *xd, - struct macroblockd_plane *pd, - BLOCK_SIZE plane_bsize, - int tx_size_in_blocks, int has_eob, - int aoff, int loff, - ENTROPY_CONTEXT *A, ENTROPY_CONTEXT *L) { - int mi_blocks_wide = num_4x4_blocks_wide_lookup[plane_bsize]; - int mi_blocks_high = num_4x4_blocks_high_lookup[plane_bsize]; - int above_contexts = tx_size_in_blocks; - int left_contexts = tx_size_in_blocks; - int pt; - - // xd->mb_to_right_edge is in units of pixels * 8. This converts - // it to 4x4 block sizes. - if (xd->mb_to_right_edge < 0) - 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 - // our border. Any blocks that do are set to 0... - if (above_contexts + aoff > mi_blocks_wide) - above_contexts = mi_blocks_wide - aoff; - - if (left_contexts + loff > mi_blocks_high) - left_contexts = mi_blocks_high - loff; - - for (pt = 0; pt < above_contexts; pt++) - A[pt] = has_eob; - for (pt = above_contexts; pt < tx_size_in_blocks; pt++) - A[pt] = 0; - for (pt = 0; pt < left_contexts; pt++) - L[pt] = has_eob; - for (pt = left_contexts; pt < tx_size_in_blocks; pt++) - L[pt] = 0; -} static void set_contexts(const MACROBLOCKD *xd, struct macroblockd_plane *pd, BLOCK_SIZE plane_bsize, TX_SIZE tx_size, int has_eob, int aoff, int loff) { - ENTROPY_CONTEXT *const A = pd->above_context + aoff; - ENTROPY_CONTEXT *const L = pd->left_context + loff; + ENTROPY_CONTEXT *const a = pd->above_context + aoff; + ENTROPY_CONTEXT *const l = pd->left_context + loff; const int tx_size_in_blocks = 1 << tx_size; - if (xd->mb_to_right_edge < 0 || xd->mb_to_bottom_edge < 0) { - set_contexts_on_border(xd, pd, plane_bsize, tx_size_in_blocks, has_eob, - aoff, loff, A, L); + // above + if (has_eob && xd->mb_to_right_edge < 0) { + int i; + const int blocks_wide = num_4x4_blocks_wide_lookup[plane_bsize] + + (xd->mb_to_right_edge >> (5 + pd->subsampling_x)); + int above_contexts = tx_size_in_blocks; + if (above_contexts + aoff > blocks_wide) + above_contexts = blocks_wide - aoff; + + for (i = 0; i < above_contexts; ++i) + a[i] = has_eob; + for (i = above_contexts; i < tx_size_in_blocks; ++i) + a[i] = 0; + } else { + vpx_memset(a, has_eob, sizeof(ENTROPY_CONTEXT) * tx_size_in_blocks); + } + + // left + if (has_eob && xd->mb_to_bottom_edge < 0) { + int i; + const int blocks_high = num_4x4_blocks_high_lookup[plane_bsize] + + (xd->mb_to_bottom_edge >> (5 + pd->subsampling_y)); + int left_contexts = tx_size_in_blocks; + if (left_contexts + loff > blocks_high) + left_contexts = blocks_high - loff; + + for (i = 0; i < left_contexts; ++i) + l[i] = has_eob; + for (i = left_contexts; i < tx_size_in_blocks; ++i) + l[i] = 0; } else { - vpx_memset(A, has_eob, sizeof(ENTROPY_CONTEXT) * tx_size_in_blocks); - vpx_memset(L, has_eob, sizeof(ENTROPY_CONTEXT) * tx_size_in_blocks); + vpx_memset(l, has_eob, sizeof(ENTROPY_CONTEXT) * tx_size_in_blocks); } } |