From 6f43ff5824e16a4c0bbbcc890c5e54e74755447f Mon Sep 17 00:00:00 2001 From: Jingning Han Date: Mon, 15 Apr 2013 09:31:27 -0700 Subject: Make the use of pred buffers consistent in MB/SB Use in-place buffers (dst of MACROBLOCKD) for macroblock prediction. This makes the macroblock buffer handling consistent with those of superblock. Remove predictor buffer MACROBLOCKD. Change-Id: Id1bcd898961097b1e6230c10f0130753a59fc6df --- vp9/common/vp9_blockd.h | 2 - vp9/common/vp9_mbpitch.c | 3 -- vp9/common/vp9_recon.c | 19 ++++----- vp9/common/vp9_reconinter.c | 70 ++++++--------------------------- vp9/common/vp9_reconinter.h | 26 ++++++------ vp9/common/vp9_reconintra.c | 37 +---------------- vp9/common/vp9_rtcd_defs.sh | 35 +++++++---------- vp9/common/x86/vp9_recon_wrapper_sse2.c | 8 ++-- 8 files changed, 57 insertions(+), 143 deletions(-) (limited to 'vp9/common') diff --git a/vp9/common/vp9_blockd.h b/vp9/common/vp9_blockd.h index 8d67402c8..9525a0e14 100644 --- a/vp9/common/vp9_blockd.h +++ b/vp9/common/vp9_blockd.h @@ -290,7 +290,6 @@ typedef struct { } MODE_INFO; typedef struct blockd { - uint8_t *predictor; int16_t *diff; int16_t *dequant; @@ -354,7 +353,6 @@ struct mb_plane { typedef struct macroblockd { DECLARE_ALIGNED(16, int16_t, diff[64*64+32*32*2]); /* from idct diff */ - DECLARE_ALIGNED(16, uint8_t, predictor[384]); // unused for superblocks #if CONFIG_CODE_NONZEROCOUNT DECLARE_ALIGNED(16, uint16_t, nzcs[256+64*2]); #endif diff --git a/vp9/common/vp9_mbpitch.c b/vp9/common/vp9_mbpitch.c index aba950e9a..6ed5f27d9 100644 --- a/vp9/common/vp9_mbpitch.c +++ b/vp9/common/vp9_mbpitch.c @@ -78,7 +78,6 @@ void vp9_setup_block_dptrs(MACROBLOCKD *mb) { const int to = r * 4 + c; const int from = r * 4 * 16 + c * 4; blockd[to].diff = &mb->diff[from]; - blockd[to].predictor = &mb->predictor[from]; } } @@ -87,7 +86,6 @@ void vp9_setup_block_dptrs(MACROBLOCKD *mb) { const int to = 16 + r * 2 + c; const int from = 256 + r * 4 * 8 + c * 4; blockd[to].diff = &mb->diff[from]; - blockd[to].predictor = &mb->predictor[from]; } } @@ -96,7 +94,6 @@ void vp9_setup_block_dptrs(MACROBLOCKD *mb) { const int to = 20 + r * 2 + c; const int from = 320 + r * 4 * 8 + c * 4; blockd[to].diff = &mb->diff[from]; - blockd[to].predictor = &mb->predictor[from]; } } diff --git a/vp9/common/vp9_recon.c b/vp9/common/vp9_recon.c index 0625ccb8e..121776c69 100644 --- a/vp9/common/vp9_recon.c +++ b/vp9/common/vp9_recon.c @@ -32,22 +32,22 @@ static INLINE void recon(int rows, int cols, void vp9_recon_b_c(uint8_t *pred_ptr, int16_t *diff_ptr, uint8_t *dst_ptr, int stride) { - recon(4, 4, pred_ptr, 16, diff_ptr, 16, dst_ptr, stride); + recon(4, 4, pred_ptr, stride, diff_ptr, 16, dst_ptr, stride); } void vp9_recon_uv_b_c(uint8_t *pred_ptr, int16_t *diff_ptr, uint8_t *dst_ptr, int stride) { - recon(4, 4, pred_ptr, 8, diff_ptr, 8, dst_ptr, stride); + recon(4, 4, pred_ptr, stride, diff_ptr, 8, dst_ptr, stride); } void vp9_recon4b_c(uint8_t *pred_ptr, int16_t *diff_ptr, uint8_t *dst_ptr, int stride) { - recon(4, 16, pred_ptr, 16, diff_ptr, 16, dst_ptr, stride); + recon(4, 16, pred_ptr, stride, diff_ptr, 16, dst_ptr, stride); } void vp9_recon2b_c(uint8_t *pred_ptr, int16_t *diff_ptr, uint8_t *dst_ptr, int stride) { - recon(4, 8, pred_ptr, 8, diff_ptr, 8, dst_ptr, stride); + recon(4, 8, pred_ptr, stride, diff_ptr, 8, dst_ptr, stride); } void vp9_recon_sby_s_c(MACROBLOCKD *mb, uint8_t *dst, @@ -95,7 +95,8 @@ void vp9_recon_mby_c(MACROBLOCKD *xd) { for (i = 0; i < 16; i += 4) { BLOCKD *b = &xd->block[i]; - vp9_recon4b(b->predictor, b->diff, *(b->base_dst) + b->dst, b->dst_stride); + vp9_recon4b(*(b->base_dst) + b->dst, b->diff, + *(b->base_dst) + b->dst, b->dst_stride); } } @@ -104,13 +105,13 @@ void vp9_recon_mb_c(MACROBLOCKD *xd) { for (i = 0; i < 16; i += 4) { BLOCKD *b = &xd->block[i]; - - vp9_recon4b(b->predictor, b->diff, *(b->base_dst) + b->dst, b->dst_stride); + vp9_recon4b(*(b->base_dst) + b->dst, b->diff, + *(b->base_dst) + b->dst, b->dst_stride); } for (i = 16; i < 24; i += 2) { BLOCKD *b = &xd->block[i]; - - vp9_recon2b(b->predictor, b->diff, *(b->base_dst) + b->dst, b->dst_stride); + vp9_recon2b(*(b->base_dst) + b->dst, b->diff, + *(b->base_dst) + b->dst, b->dst_stride); } } diff --git a/vp9/common/vp9_reconinter.c b/vp9/common/vp9_reconinter.c index 79ca0b4e5..71be77df1 100644 --- a/vp9/common/vp9_reconinter.c +++ b/vp9/common/vp9_reconinter.c @@ -399,7 +399,7 @@ static void build_2x1_inter_predictor_wh(const BLOCKD *d0, const BLOCKD *d1, int row, int col) { struct scale_factors * scale = &s[which_mv]; - assert(d1->predictor - d0->predictor == block_size); + assert(d1->dst - d0->dst == block_size); assert(d1->pre == d0->pre + block_size); scale->set_scaled_offsets(scale, row, col); @@ -446,11 +446,11 @@ static void build_2x1_inter_predictor(const BLOCKD *d0, const BLOCKD *d1, int block_size, int stride, int which_mv, int weight, const struct subpix_fn_table *subpix, - int row, int col, int use_dst) { - uint8_t *d0_predictor = use_dst ? *(d0->base_dst) + d0->dst : d0->predictor; - uint8_t *d1_predictor = use_dst ? *(d1->base_dst) + d1->dst : d1->predictor; + int row, int col) { + uint8_t *d0_predictor = *(d0->base_dst) + d0->dst; + uint8_t *d1_predictor = *(d1->base_dst) + d1->dst; struct scale_factors * scale = &s[which_mv]; - stride = use_dst ? d0->dst_stride : stride; + stride = d0->dst_stride; assert(d1_predictor - d0_predictor == block_size); assert(d1->pre == d0->pre + block_size); @@ -1338,8 +1338,7 @@ void vp9_build_inter_predictors_sb(MACROBLOCKD *mb, } static void build_inter4x4_predictors_mb(MACROBLOCKD *xd, - int mb_row, int mb_col, - int use_dst) { + int mb_row, int mb_col) { int i; MB_MODE_INFO * mbmi = &xd->mode_info_context->mbmi; BLOCKD *blockd = xd->block; @@ -1368,8 +1367,7 @@ static void build_inter4x4_predictors_mb(MACROBLOCKD *xd, build_2x1_inter_predictor(d0, d1, xd->scale_factor, 8, 16, which_mv, which_mv ? weight : 0, - &xd->subpix, mb_row * 16 + y, mb_col * 16, - use_dst); + &xd->subpix, mb_row * 16 + y, mb_col * 16); } } } else { @@ -1386,8 +1384,7 @@ static void build_inter4x4_predictors_mb(MACROBLOCKD *xd, build_2x1_inter_predictor(d0, d1, xd->scale_factor, 4, 16, which_mv, which_mv ? weight : 0, &xd->subpix, - mb_row * 16 + y, mb_col * 16 + x, - use_dst); + mb_row * 16 + y, mb_col * 16 + x); } } } @@ -1405,8 +1402,7 @@ static void build_inter4x4_predictors_mb(MACROBLOCKD *xd, for (which_mv = 0; which_mv < 1 + use_second_ref; ++which_mv) { build_2x1_inter_predictor(d0, d1, xd->scale_factor_uv, 4, 8, which_mv, which_mv ? weight : 0, &xd->subpix, - mb_row * 8 + y, mb_col * 8 + x, - use_dst); + mb_row * 8 + y, mb_col * 8 + x); } } } @@ -1493,58 +1489,17 @@ static void build_4x4uvmvs(MACROBLOCKD *xd) { } } -void vp9_build_inter16x16_predictors_mb(MACROBLOCKD *xd, - uint8_t *dst_y, - uint8_t *dst_u, - uint8_t *dst_v, - int dst_ystride, - int dst_uvstride, - int mb_row, - int mb_col) { - vp9_build_inter16x16_predictors_mby(xd, dst_y, dst_ystride, mb_row, mb_col); - vp9_build_inter16x16_predictors_mbuv(xd, dst_u, dst_v, dst_uvstride, - mb_row, mb_col); -#if CONFIG_COMP_INTERINTRA_PRED - if (xd->mode_info_context->mbmi.second_ref_frame == INTRA_FRAME) { - vp9_build_interintra_16x16_predictors_mb(xd, dst_y, dst_u, dst_v, - dst_ystride, dst_uvstride); - } -#endif -} - void vp9_build_inter_predictors_mb(MACROBLOCKD *xd, int mb_row, int mb_col) { if (xd->mode_info_context->mbmi.mode != SPLITMV) { - // TODO(jingning): to be replaced with vp9_build_inter_predictors_sb() when - // converting buffers from predictors to dst. - vp9_build_inter16x16_predictors_mb(xd, xd->predictor, - &xd->predictor[256], - &xd->predictor[320], 16, 8, - mb_row, mb_col); - + vp9_build_inter_predictors_sb(xd, mb_row, mb_col, BLOCK_SIZE_MB16X16); } else { build_4x4uvmvs(xd); - build_inter4x4_predictors_mb(xd, mb_row, mb_col, 0); + build_inter4x4_predictors_mb(xd, mb_row, mb_col); } } -void vp9_build_inter_predictors_mb_s(MACROBLOCKD *xd, - int mb_row, - int mb_col) { - if (xd->mode_info_context->mbmi.mode != SPLITMV) { - vp9_build_inter16x16_predictors_mb(xd, xd->dst.y_buffer, - xd->dst.u_buffer, - xd->dst.v_buffer, - xd->dst.y_stride, - xd->dst.uv_stride, - mb_row, mb_col); - - } else { - build_4x4uvmvs(xd); - build_inter4x4_predictors_mb(xd, mb_row, mb_col, 1); - } -} /*encoder only*/ void vp9_build_inter4x4_predictors_mbuv(MACROBLOCKD *xd, int mb_row, int mb_col) { @@ -1593,8 +1548,7 @@ void vp9_build_inter4x4_predictors_mbuv(MACROBLOCKD *xd, for (which_mv = 0; which_mv < 1 + use_second_ref; ++which_mv) { build_2x1_inter_predictor(d0, d1, xd->scale_factor_uv, 4, 8, which_mv, which_mv ? weight : 0, - &xd->subpix, mb_row * 8 + y, mb_col * 8 + x, - 0); + &xd->subpix, mb_row * 8 + y, mb_col * 8 + x); } } } diff --git a/vp9/common/vp9_reconinter.h b/vp9/common/vp9_reconinter.h index 068853d1d..533d30466 100644 --- a/vp9/common/vp9_reconinter.h +++ b/vp9/common/vp9_reconinter.h @@ -29,14 +29,20 @@ void vp9_build_inter16x16_predictors_mbuv(MACROBLOCKD *xd, int mb_row, int mb_col); -void vp9_build_inter16x16_predictors_mb(MACROBLOCKD *xd, - uint8_t *dst_y, - uint8_t *dst_u, - uint8_t *dst_v, - int dst_ystride, - int dst_uvstride, - int mb_row, - int mb_col); +void vp9_build_inter_predictors_sby(MACROBLOCKD *x, + uint8_t *dst_y, + int dst_ystride, + int mb_row, + int mb_col, + BLOCK_SIZE_TYPE bsize); + +void vp9_build_inter_predictors_sbuv(MACROBLOCKD *x, + uint8_t *dst_u, + uint8_t *dst_v, + int dst_uvstride, + int mb_row, + int mb_col, + BLOCK_SIZE_TYPE bsize); void vp9_build_inter_predictors_sb(MACROBLOCKD *mb, int mb_row, int mb_col, @@ -46,10 +52,6 @@ void vp9_build_inter_predictors_mb(MACROBLOCKD *xd, int mb_row, int mb_col); -void vp9_build_inter_predictors_mb_s(MACROBLOCKD *xd, - int mb_row, - int mb_col); - void vp9_build_inter4x4_predictors_mbuv(MACROBLOCKD *xd, int mb_row, int mb_col); diff --git a/vp9/common/vp9_reconintra.c b/vp9/common/vp9_reconintra.c index 632191183..88c3f191e 100644 --- a/vp9/common/vp9_reconintra.c +++ b/vp9/common/vp9_reconintra.c @@ -273,7 +273,8 @@ void vp9_recon_intra_mbuv(MACROBLOCKD *xd) { int i; for (i = 16; i < 24; i += 2) { BLOCKD *b = &xd->block[i]; - vp9_recon2b(b->predictor, b->diff, *(b->base_dst) + b->dst, b->dst_stride); + vp9_recon2b(*(b->base_dst) + b->dst, b->diff, + *(b->base_dst) + b->dst, b->dst_stride); } } @@ -758,40 +759,6 @@ void vp9_build_intra_predictors_sbuv_s(MACROBLOCKD *xd, xd->left_available, xd->right_available); } -// TODO(jingning): merge mby and mbuv into the above sby and sbmu functions -void vp9_build_intra_predictors_mby(MACROBLOCKD *xd) { - vp9_build_intra_predictors(xd->dst.y_buffer, xd->dst.y_stride, - xd->predictor, 16, - xd->mode_info_context->mbmi.mode, - 16, 16, - xd->up_available, xd->left_available, - xd->right_available); -} - -void vp9_build_intra_predictors_mbuv_internal(MACROBLOCKD *xd, - uint8_t *upred_ptr, - uint8_t *vpred_ptr, - int uv_stride, - int mode, int bsize) { - vp9_build_intra_predictors(xd->dst.u_buffer, xd->dst.uv_stride, - upred_ptr, uv_stride, mode, - bsize, bsize, - xd->up_available, xd->left_available, - xd->right_available); - vp9_build_intra_predictors(xd->dst.v_buffer, xd->dst.uv_stride, - vpred_ptr, uv_stride, mode, - bsize, bsize, - xd->up_available, xd->left_available, - xd->right_available); -} - -void vp9_build_intra_predictors_mbuv(MACROBLOCKD *xd) { - vp9_build_intra_predictors_mbuv_internal(xd, &xd->predictor[256], - &xd->predictor[320], 8, - xd->mode_info_context->mbmi.uv_mode, - 8); -} - void vp9_intra8x8_predict(MACROBLOCKD *xd, BLOCKD *b, int mode, diff --git a/vp9/common/vp9_rtcd_defs.sh b/vp9/common/vp9_rtcd_defs.sh index ae5b7fbc4..f9f2395f3 100644 --- a/vp9/common/vp9_rtcd_defs.sh +++ b/vp9/common/vp9_rtcd_defs.sh @@ -68,11 +68,15 @@ specialize vp9_recon_b prototype void vp9_recon_uv_b "uint8_t *pred_ptr, int16_t *diff_ptr, uint8_t *dst_ptr, int stride" specialize vp9_recon_uv_b +# TODO(jingning): The prototype functions in c are modified to enable block-size configurable +# operations. Need to change the sse2 accrodingly. prototype void vp9_recon2b "uint8_t *pred_ptr, int16_t *diff_ptr, uint8_t *dst_ptr, int stride" -specialize vp9_recon2b sse2 +specialize vp9_recon2b +# specialize vp9_recon2b sse2 prototype void vp9_recon4b "uint8_t *pred_ptr, int16_t *diff_ptr, uint8_t *dst_ptr, int stride" -specialize vp9_recon4b sse2 +specialize vp9_recon4b +# specialize vp9_recon4b sse2 prototype void vp9_recon_mb "struct macroblockd *x" specialize vp9_recon_mb @@ -86,17 +90,14 @@ specialize vp9_recon_sby_s prototype void vp9_recon_sbuv_s "struct macroblockd *x, uint8_t *udst, uint8_t *vdst, enum BLOCK_SIZE_TYPE bsize" specialize void vp9_recon_sbuv_s +prototype void vp9_build_intra_predictors "uint8_t *src, int src_stride, uint8_t *pred, int y_stride, int mode, int bw, int bh, int up_available, int left_available, int right_available" +specialize void vp9_build_intra_predictors + prototype void vp9_build_intra_predictors_sby_s "struct macroblockd *x, enum BLOCK_SIZE_TYPE bsize" -specialize vp9_build_intra_predictors_sby_s; +specialize vp9_build_intra_predictors_sby_s prototype void vp9_build_intra_predictors_sbuv_s "struct macroblockd *x, enum BLOCK_SIZE_TYPE bsize" -specialize vp9_build_intra_predictors_sbuv_s; - -prototype void vp9_build_intra_predictors_mby "struct macroblockd *x" -specialize vp9_build_intra_predictors_mby; - -prototype void vp9_build_intra_predictors_mbuv "struct macroblockd *x" -specialize vp9_build_intra_predictors_mbuv; +specialize vp9_build_intra_predictors_sbuv_s prototype void vp9_intra4x4_predict "struct macroblockd *xd, struct blockd *x, int b_mode, uint8_t *predictor, int pre_stride" specialize vp9_intra4x4_predict; @@ -620,16 +621,10 @@ specialize vp9_block_error mmx sse2 vp9_block_error_sse2=vp9_block_error_xmm prototype void vp9_subtract_b "struct block *be, struct blockd *bd, int pitch" -specialize vp9_subtract_b mmx sse2 - -prototype void vp9_subtract_b "struct block *be, struct blockd *bd, int pitch" -specialize vp9_subtract_b mmx sse2 - -prototype void vp9_subtract_mby "int16_t *diff, uint8_t *src, uint8_t *pred, int stride" -specialize vp9_subtract_mby mmx sse2 - -prototype void vp9_subtract_mbuv "int16_t *diff, uint8_t *usrc, uint8_t *vsrc, uint8_t *pred, int stride" -specialize vp9_subtract_mbuv mmx sse2 +# TODO(jingning): The prototype function in c has been changed to remove +# the use of predictor buffer in MACROBLOCKD. Need to modify the mmx and sse2 +# versions accordingly. +specialize vp9_subtract_b # # Structured Similarity (SSIM) diff --git a/vp9/common/x86/vp9_recon_wrapper_sse2.c b/vp9/common/x86/vp9_recon_wrapper_sse2.c index bb7baf8a0..12d2f970c 100644 --- a/vp9/common/x86/vp9_recon_wrapper_sse2.c +++ b/vp9/common/x86/vp9_recon_wrapper_sse2.c @@ -73,15 +73,15 @@ static void build_intra_predictors_mbuv_x86(MACROBLOCKD *xd, } void vp9_build_intra_predictors_mbuv_sse2(MACROBLOCKD *xd) { - build_intra_predictors_mbuv_x86(xd, &xd->predictor[256], - &xd->predictor[320], 8, + build_intra_predictors_mbuv_x86(xd, xd->dst.u_buffer, + xd->dst.v_buffer, xd->dst.uv_stride, vp9_intra_pred_uv_tm_sse2, vp9_intra_pred_uv_ho_mmx2); } void vp9_build_intra_predictors_mbuv_ssse3(MACROBLOCKD *xd) { - build_intra_predictors_mbuv_x86(xd, &xd->predictor[256], - &xd->predictor[320], 8, + build_intra_predictors_mbuv_x86(xd, xd->dst.u_buffer, + xd->dst.v_buffer, xd->dst.uv_stride, vp9_intra_pred_uv_tm_ssse3, vp9_intra_pred_uv_ho_ssse3); } -- cgit v1.2.3