From de735929cf1b75caf845c996e09376635bdfc65a Mon Sep 17 00:00:00 2001 From: Jingning Han <jingning@google.com> Date: Mon, 27 May 2013 07:55:25 -0700 Subject: [PATCH] Reduce bmi buffer length from 16 to 4 This commit removes the use of bmi_ in the first-pass encoding by forcing encode_intra4x4block_ to use DC_PRED, followed by DCT_DCT only, as John suggested. This makes the need for bmi buffer only up to 4 entries, instead of 16. Change-Id: I3410007dfae789ee46a09ae20c39d3ce3c7954aa --- vp9/common/vp9_blockd.h | 2 +- vp9/encoder/vp9_encodeintra.c | 27 ++++++++------------------- 2 files changed, 9 insertions(+), 20 deletions(-) diff --git a/vp9/common/vp9_blockd.h b/vp9/common/vp9_blockd.h index e53e107ade..cc8b239831 100644 --- a/vp9/common/vp9_blockd.h +++ b/vp9/common/vp9_blockd.h @@ -254,7 +254,7 @@ typedef struct { typedef struct { MB_MODE_INFO mbmi; - union b_mode_info bmi[16]; + union b_mode_info bmi[4]; } MODE_INFO; struct scale_factors { diff --git a/vp9/encoder/vp9_encodeintra.c b/vp9/encoder/vp9_encodeintra.c index 91866b28ff..cd67cc4e1f 100644 --- a/vp9/encoder/vp9_encodeintra.c +++ b/vp9/encoder/vp9_encodeintra.c @@ -31,19 +31,17 @@ int vp9_encode_intra(VP9_COMP *cpi, MACROBLOCK *x, int use_16x16_pred) { } else { int i; - for (i = 0; i < 16; i++) { - x->e_mbd.mode_info_context->bmi[i].as_mode.first = B_DC_PRED; + for (i = 0; i < 16; i++) encode_intra4x4block(x, i, BLOCK_SIZE_MB16X16); - } } return vp9_get_mb_ss(x->plane[0].src_diff); } +// This function is used only by the firstpass encoding. static void encode_intra4x4block(MACROBLOCK *x, int ib, BLOCK_SIZE_TYPE bsize) { MACROBLOCKD * const xd = &x->e_mbd; - TX_TYPE tx_type; uint8_t* const src = raster_block_offset_uint8(xd, bsize, 0, ib, x->plane[0].src.buf, x->plane[0].src.stride); @@ -58,26 +56,17 @@ static void encode_intra4x4block(MACROBLOCK *x, int ib, assert(ib < (1 << (bwl + bhl))); - vp9_intra4x4_predict(&x->e_mbd, ib, bsize, - xd->mode_info_context->bmi[ib].as_mode.first, + vp9_intra4x4_predict(&x->e_mbd, ib, bsize, DC_PRED, dst, xd->plane[0].dst.stride); vp9_subtract_block(4, 4, src_diff, 4 << bwl, src, x->plane[0].src.stride, dst, xd->plane[0].dst.stride); - tx_type = get_tx_type_4x4(&x->e_mbd, ib); - if (tx_type != DCT_DCT) { - vp9_short_fht4x4(src_diff, coeff, 4 << bwl, tx_type); - x->quantize_b_4x4(x, ib, tx_type, 16); - vp9_short_iht4x4_add(BLOCK_OFFSET(xd->plane[0].dqcoeff, ib, 16), dst, - xd->plane[0].dst.stride, tx_type); - } else { - x->fwd_txm4x4(src_diff, coeff, 8 << bwl); - x->quantize_b_4x4(x, ib, tx_type, 16); - vp9_inverse_transform_b_4x4_add(&x->e_mbd, xd->plane[0].eobs[ib], - BLOCK_OFFSET(xd->plane[0].dqcoeff, ib, 16), - dst, xd->plane[0].dst.stride); - } + x->fwd_txm4x4(src_diff, coeff, 8 << bwl); + x->quantize_b_4x4(x, ib, DCT_DCT, 16); + vp9_inverse_transform_b_4x4_add(&x->e_mbd, xd->plane[0].eobs[ib], + BLOCK_OFFSET(xd->plane[0].dqcoeff, ib, 16), + dst, xd->plane[0].dst.stride); } void vp9_encode_intra16x16mby(VP9_COMMON *const cm, MACROBLOCK *x) { -- GitLab