From f19a1cafed9e3aac536d04773ec20b808b91cd50 Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Fri, 16 Nov 2012 22:26:12 -0800 Subject: [PATCH] Remove special-case inline detokenization in b_pred reconstruction. Just like for all other block modes, b_pred tokens can be read together before starting macroblock reconstruction. This removes special cases for b_pred in decode_macroblock() and allows to make decode_coefs_4x4() static in detokenize.c. While at it, remove the redundant handling and checking of plane_type and block_index (i) in decode_coefs_4x4(). Since the function is static, and is called only from decode_mb_tokens_4x4(), we don't need to worry that the arguments ever go out of sync. Change-Id: I2d415da0b51b89d0490a6b9e24cc86363c2090f7 --- vp9/decoder/decodframe.c | 23 +++++------------------ vp9/decoder/detokenize.c | 36 ++++++++++++++++-------------------- vp9/decoder/detokenize.h | 9 +++++---- 3 files changed, 26 insertions(+), 42 deletions(-) diff --git a/vp9/decoder/decodframe.c b/vp9/decoder/decodframe.c index af33724ed..b884bade9 100644 --- a/vp9/decoder/decodframe.c +++ b/vp9/decoder/decodframe.c @@ -292,7 +292,7 @@ static void decode_superblock(VP9D_COMP *pbi, MACROBLOCKD *xd, } else if (tx_size == TX_8X8) { eobtotal = vp9_decode_mb_tokens_8x8(pbi, xd, bc); } else { - eobtotal = vp9_decode_mb_tokens(pbi, xd, bc); + eobtotal = vp9_decode_mb_tokens_4x4(pbi, xd, bc); } if (eobtotal == 0) { // skip loopfilter xd->mode_info_context->mbmi.mb_skip_coeff = 1; @@ -395,8 +395,8 @@ static void decode_macroblock(VP9D_COMP *pbi, MACROBLOCKD *xd, eobtotal = vp9_decode_mb_tokens_16x16(pbi, xd, bc); } else if (tx_size == TX_8X8) { eobtotal = vp9_decode_mb_tokens_8x8(pbi, xd, bc); - } else if (mode != B_PRED) { - eobtotal = vp9_decode_mb_tokens(pbi, xd, bc); + } else { + eobtotal = vp9_decode_mb_tokens_4x4(pbi, xd, bc); } } @@ -423,9 +423,7 @@ static void decode_macroblock(VP9D_COMP *pbi, MACROBLOCKD *xd, /* do prediction */ if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) { if (mode != I8X8_PRED) { - if (mode != B_PRED) { - vp9_build_intra_predictors_mbuv(xd); - } + vp9_build_intra_predictors_mbuv(xd); if (mode != B_PRED) { vp9_build_intra_predictors_mby(xd); } @@ -493,8 +491,6 @@ static void decode_macroblock(VP9D_COMP *pbi, MACROBLOCKD *xd, xd->mode_info_context->bmi[i].as_mode.context = b->bmi.as_mode.context = vp9_find_bpred_context(b); #endif - if (!xd->mode_info_context->mbmi.mb_skip_coeff) - eobtotal += vp9_decode_coefs_4x4(pbi, xd, bc, PLANE_TYPE_Y_WITH_DC, i); #if CONFIG_COMP_INTRA_PRED b_mode2 = xd->mode_info_context->bmi[i].as_mode.second; @@ -517,14 +513,6 @@ static void decode_macroblock(VP9D_COMP *pbi, MACROBLOCKD *xd, *(b->base_dst) + b->dst, 16, b->dst_stride); } } - if (!xd->mode_info_context->mbmi.mb_skip_coeff) { - for (i = 16; i < 24; ++i) - eobtotal += vp9_decode_coefs_4x4(pbi, xd, bc, PLANE_TYPE_UV, i); - } - vp9_build_intra_predictors_mbuv(xd); - pbi->idct_add_uv_block(xd->qcoeff + 16 * 16, xd->block[16].dequant, - xd->predictor + 16 * 16, xd->dst.u_buffer, - xd->dst.v_buffer, xd->dst.uv_stride, xd->eobs + 16); } else if (mode == SPLITMV) { if (tx_size == TX_8X8) { vp9_dequant_idct_add_y_block_8x8(xd->qcoeff, xd->block[0].dequant, @@ -596,8 +584,7 @@ static void decode_macroblock(VP9D_COMP *pbi, MACROBLOCKD *xd, (xd->qcoeff + 16 * 16, xd->block[16].dequant, xd->predictor + 16 * 16, xd->dst.u_buffer, xd->dst.v_buffer, xd->dst.uv_stride, xd->eobs + 16, xd); - else if (xd->mode_info_context->mbmi.mode != I8X8_PRED && - xd->mode_info_context->mbmi.mode != B_PRED) + else if (xd->mode_info_context->mbmi.mode != I8X8_PRED) pbi->idct_add_uv_block(xd->qcoeff + 16 * 16, xd->block[16].dequant, xd->predictor + 16 * 16, xd->dst.u_buffer, xd->dst.v_buffer, xd->dst.uv_stride, xd->eobs + 16); diff --git a/vp9/decoder/detokenize.c b/vp9/decoder/detokenize.c index 2aa588fe0..cf3a95844 100644 --- a/vp9/decoder/detokenize.c +++ b/vp9/decoder/detokenize.c @@ -568,8 +568,9 @@ int vp9_decode_mb_tokens_8x8(VP9D_COMP* const pbi, return eobtotal; } -int vp9_decode_coefs_4x4(VP9D_COMP *dx, MACROBLOCKD *xd, - BOOL_DECODER* const bc, int type, int i) { +static int decode_coefs_4x4(VP9D_COMP *dx, MACROBLOCKD *xd, + BOOL_DECODER* const bc, + PLANE_TYPE type, int i) { ENTROPY_CONTEXT *const A = (ENTROPY_CONTEXT *)xd->above_context; ENTROPY_CONTEXT *const L = (ENTROPY_CONTEXT *)xd->left_context; ENTROPY_CONTEXT *const a = A + vp9_block2above[i]; @@ -577,16 +578,9 @@ int vp9_decode_coefs_4x4(VP9D_COMP *dx, MACROBLOCKD *xd, INT16 *qcoeff_ptr = &xd->qcoeff[0]; const int *scan = vp9_default_zig_zag1d; unsigned short *const eobs = xd->eobs; - int c, seg_eob; - TX_TYPE tx_type = DCT_DCT; int segment_id = xd->mode_info_context->mbmi.segment_id; - - seg_eob = get_eob(xd, segment_id, 16); - - if (i == 24) - type = PLANE_TYPE_Y2; - else if (i >= 16) - type = PLANE_TYPE_UV; + int c, seg_eob = get_eob(xd, segment_id, 16); + TX_TYPE tx_type = DCT_DCT; if (type == PLANE_TYPE_Y_WITH_DC) tx_type = get_tx_type(xd, &xd->block[i]); @@ -611,24 +605,26 @@ int vp9_decode_coefs_4x4(VP9D_COMP *dx, MACROBLOCKD *xd, return c; } -int vp9_decode_mb_tokens(VP9D_COMP* const dx, - MACROBLOCKD* const xd, - BOOL_DECODER* const bc) { - int i, type, eobtotal = 0; +int vp9_decode_mb_tokens_4x4(VP9D_COMP* const dx, + MACROBLOCKD* const xd, + BOOL_DECODER* const bc) { + int i, eobtotal = 0; + PLANE_TYPE type; if (xd->mode_info_context->mbmi.mode != B_PRED && xd->mode_info_context->mbmi.mode != I8X8_PRED && xd->mode_info_context->mbmi.mode != SPLITMV) { - - eobtotal += vp9_decode_coefs_4x4(dx, xd, bc, PLANE_TYPE_Y2, 24) - 16; - + eobtotal += decode_coefs_4x4(dx, xd, bc, PLANE_TYPE_Y2, 24) - 16; type = PLANE_TYPE_Y_NO_DC; } else { type = PLANE_TYPE_Y_WITH_DC; } - for (i = 0; i < 24; ++i) { - eobtotal += vp9_decode_coefs_4x4(dx, xd, bc, type, i); + for (i = 0; i < 16; ++i) { + eobtotal += decode_coefs_4x4(dx, xd, bc, type, i); } + do { + eobtotal += decode_coefs_4x4(dx, xd, bc, PLANE_TYPE_UV, i); + } while (++i < 24); return eobtotal; } diff --git a/vp9/decoder/detokenize.h b/vp9/decoder/detokenize.h index 674850382..5a7d354ce 100644 --- a/vp9/decoder/detokenize.h +++ b/vp9/decoder/detokenize.h @@ -15,13 +15,14 @@ #include "onyxd_int.h" void vp9_reset_mb_tokens_context(MACROBLOCKD* const); -int vp9_decode_mb_tokens(VP9D_COMP* const, MACROBLOCKD* const, - BOOL_DECODER* const); + +int vp9_decode_mb_tokens_4x4(VP9D_COMP* const, MACROBLOCKD* const, + BOOL_DECODER* const); + int vp9_decode_mb_tokens_8x8(VP9D_COMP* const, MACROBLOCKD* const, BOOL_DECODER* const); + int vp9_decode_mb_tokens_16x16(VP9D_COMP* const, MACROBLOCKD* const, BOOL_DECODER* const); -int vp9_decode_coefs_4x4(VP9D_COMP *dx, MACROBLOCKD *xd, BOOL_DECODER* const bc, - int type, int i); #endif /* DETOKENIZE_H */ -- 2.40.0