From 84ea002eb1e2e8276589ce24370d53e5d46013b4 Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Mon, 22 Oct 2012 11:49:00 -0700 Subject: 8x8 transform support in splitmv. For splitmv, where partitioning is 8x16, 16x8 or 8x8, this patch uses the 8x8 transform (instead of the 4x4) if txfm_mode is ALLOW_8X8 or ALLOW_16X16. For TX_MODE_SELECT, splitmv can indicate which of the 2 transform sizes (4x4 or 8x8) it wants to use. Gains (with hybridtx4x4/8x8/16x16 and tx_select experiments enabled) on derf: +0.9%, HD: +0.4%, STD/HD: +0.8% (SSIM or overall PSNR, both metrics show similar improvements). Change-Id: Ide954b000b415548ed92a7ac78e24f36e60fcf06 --- vp8/decoder/decodemv.c | 11 +++++++---- vp8/decoder/decodframe.c | 20 ++++++++++++++------ vp8/decoder/detokenize.c | 3 ++- 3 files changed, 23 insertions(+), 11 deletions(-) (limited to 'vp8/decoder') diff --git a/vp8/decoder/decodemv.c b/vp8/decoder/decodemv.c index 72ff126f2..064d16426 100644 --- a/vp8/decoder/decodemv.c +++ b/vp8/decoder/decodemv.c @@ -1285,10 +1285,12 @@ static void read_mb_modes_mv(VP8D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi, #if CONFIG_TX_SELECT if (cm->txfm_mode == TX_MODE_SELECT && mbmi->mb_skip_coeff == 0 && ((mbmi->ref_frame == INTRA_FRAME && mbmi->mode <= I8X8_PRED) || - (mbmi->ref_frame != INTRA_FRAME && mbmi->mode != SPLITMV))) { + (mbmi->ref_frame != INTRA_FRAME && !(mbmi->mode == SPLITMV && + mbmi->partitioning == PARTITIONING_4X4)))) { // FIXME(rbultje) code ternary symbol once all experiments are merged mbmi->txfm_size = vp8_read(bc, cm->prob_tx[0]); - if (mbmi->txfm_size != TX_4X4 && mbmi->mode != I8X8_PRED) + if (mbmi->txfm_size != TX_4X4 && mbmi->mode != I8X8_PRED && + mbmi->mode != SPLITMV) mbmi->txfm_size += vp8_read(bc, cm->prob_tx[1]); } else #endif @@ -1297,8 +1299,9 @@ static void read_mb_modes_mv(VP8D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi, (mbmi->ref_frame != INTRA_FRAME && mbmi->mode != SPLITMV))) { mbmi->txfm_size = TX_16X16; } else if (cm->txfm_mode >= ALLOW_8X8 && - ((mbmi->ref_frame == INTRA_FRAME && mbmi->mode != B_PRED) || - (mbmi->ref_frame != INTRA_FRAME && mbmi->mode != SPLITMV))) { + (!(mbmi->ref_frame == INTRA_FRAME && mbmi->mode == B_PRED) && + !(mbmi->ref_frame != INTRA_FRAME && mbmi->mode == SPLITMV && + mbmi->partitioning == PARTITIONING_4X4))) { mbmi->txfm_size = TX_8X8; } else { mbmi->txfm_size = TX_4X4; diff --git a/vp8/decoder/decodframe.c b/vp8/decoder/decodframe.c index 01739c0db..fe36a9db8 100644 --- a/vp8/decoder/decodframe.c +++ b/vp8/decoder/decodframe.c @@ -404,10 +404,16 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd, #endif } } else if (mode == SPLITMV) { - DEQUANT_INVOKE(&pbi->dequant, idct_add_y_block) - (xd->qcoeff, xd->block[0].dequant, - xd->predictor, xd->dst.y_buffer, - xd->dst.y_stride, xd->eobs); + if (tx_size == TX_8X8) { + vp8_dequant_idct_add_y_block_8x8_c(xd->qcoeff, xd->block[0].dequant, + xd->predictor, xd->dst.y_buffer, + xd->dst.y_stride, xd->eobs, xd); + } else { + DEQUANT_INVOKE(&pbi->dequant, + idct_add_y_block)(xd->qcoeff, xd->block[0].dequant, + xd->predictor, xd->dst.y_buffer, + xd->dst.y_stride, xd->eobs); + } } else { BLOCKD *b = &xd->block[24]; @@ -515,8 +521,10 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd, if (!xd->mode_info_context->mbmi.encoded_as_sb) { #endif if ((tx_size == TX_8X8 && - xd->mode_info_context->mbmi.mode != I8X8_PRED) - || tx_size == TX_16X16) + xd->mode_info_context->mbmi.mode != I8X8_PRED && + xd->mode_info_context->mbmi.mode != SPLITMV) + || tx_size == TX_16X16 + ) DEQUANT_INVOKE(&pbi->dequant, idct_add_uv_block_8x8) // (xd->qcoeff + 16 * 16, xd->block[16].dequant, xd->predictor + 16 * 16, xd->dst.u_buffer, xd->dst.v_buffer, diff --git a/vp8/decoder/detokenize.c b/vp8/decoder/detokenize.c index 85f213470..063fc2da6 100644 --- a/vp8/decoder/detokenize.c +++ b/vp8/decoder/detokenize.c @@ -537,7 +537,8 @@ int vp8_decode_mb_tokens_8x8(VP8D_COMP *pbi, MACROBLOCKD *xd, TX_TYPE tx_type = DCT_DCT; #endif - int bufthred = (xd->mode_info_context->mbmi.mode == I8X8_PRED) ? 16 : 24; + int bufthred = (xd->mode_info_context->mbmi.mode == I8X8_PRED || + xd->mode_info_context->mbmi.mode == SPLITMV) ? 16 : 24; if (xd->mode_info_context->mbmi.mode != B_PRED && xd->mode_info_context->mbmi.mode != SPLITMV && xd->mode_info_context->mbmi.mode != I8X8_PRED) { -- cgit v1.2.3