diff options
Diffstat (limited to 'vp8/decoder/decodframe.c')
-rw-r--r-- | vp8/decoder/decodframe.c | 215 |
1 files changed, 84 insertions, 131 deletions
diff --git a/vp8/decoder/decodframe.c b/vp8/decoder/decodframe.c index 34b43ce3b..a46b0de34 100644 --- a/vp8/decoder/decodframe.c +++ b/vp8/decoder/decodframe.c @@ -13,7 +13,6 @@ #include "vp8/common/header.h" #include "vp8/common/reconintra.h" #include "vp8/common/reconintra4x4.h" -#include "vp8/common/recon.h" #include "vp8/common/reconinter.h" #include "dequantize.h" #include "detokenize.h" @@ -35,6 +34,7 @@ #include "vp8/common/seg_common.h" #include "vp8/common/entropy.h" +#include "vpx_rtcd.h" #include <assert.h> #include <stdio.h> @@ -173,14 +173,12 @@ static void skip_recon_mb(VP8D_COMP *pbi, MACROBLOCKD *xd) { if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) { #if CONFIG_SUPERBLOCKS if (xd->mode_info_context->mbmi.encoded_as_sb) { - RECON_INVOKE(&pbi->common.rtcd.recon, build_intra_predictors_sbuv_s)(xd); - RECON_INVOKE(&pbi->common.rtcd.recon, - build_intra_predictors_sby_s)(xd); + vp8_build_intra_predictors_sbuv_s(xd); + vp8_build_intra_predictors_sby_s(xd); } else { #endif - RECON_INVOKE(&pbi->common.rtcd.recon, build_intra_predictors_mbuv_s)(xd); - RECON_INVOKE(&pbi->common.rtcd.recon, - build_intra_predictors_mby_s)(xd); + vp8_build_intra_predictors_mbuv_s(xd); + vp8_build_intra_predictors_mby_s(xd); #if CONFIG_SUPERBLOCKS } #endif @@ -231,39 +229,6 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd, if (xd->segmentation_enabled) mb_init_dequantizer(pbi, xd); - if (pbi->common.frame_type == KEY_FRAME) { -#if CONFIG_TX16X16 || CONFIG_HYBRIDTRANSFORM16X16 - if (xd->mode_info_context->mbmi.mode <= TM_PRED || - xd->mode_info_context->mbmi.mode == NEWMV || - xd->mode_info_context->mbmi.mode == ZEROMV || - xd->mode_info_context->mbmi.mode == NEARMV || - xd->mode_info_context->mbmi.mode == NEARESTMV) - xd->mode_info_context->mbmi.txfm_size = TX_16X16; - else -#endif - if (pbi->common.txfm_mode == ALLOW_8X8 && - xd->mode_info_context->mbmi.mode != B_PRED) - xd->mode_info_context->mbmi.txfm_size = TX_8X8; - else - xd->mode_info_context->mbmi.txfm_size = TX_4X4; - } else { -#if CONFIG_TX16X16 || CONFIG_HYBRIDTRANSFORM16X16 - if (xd->mode_info_context->mbmi.mode <= TM_PRED || - xd->mode_info_context->mbmi.mode == NEWMV || - xd->mode_info_context->mbmi.mode == ZEROMV || - xd->mode_info_context->mbmi.mode == NEARMV || - xd->mode_info_context->mbmi.mode == NEARESTMV) - xd->mode_info_context->mbmi.txfm_size = TX_16X16; - else -#endif - if (pbi->common.txfm_mode == ALLOW_8X8 && - xd->mode_info_context->mbmi.mode != B_PRED && - xd->mode_info_context->mbmi.mode != SPLITMV) - xd->mode_info_context->mbmi.txfm_size = TX_8X8; - else - xd->mode_info_context->mbmi.txfm_size = TX_4X4; - } - #if CONFIG_SUPERBLOCKS if (xd->mode_info_context->mbmi.encoded_as_sb) { xd->mode_info_context->mbmi.txfm_size = TX_8X8; @@ -323,12 +288,9 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd, xd->block[i].eob = 0; xd->eobs[i] = 0; } -#if CONFIG_TX16X16 || CONFIG_HYBRIDTRANSFORM16X16 if (tx_type == TX_16X16) eobtotal = vp8_decode_mb_tokens_16x16(pbi, xd); - else -#endif - if (tx_type == TX_8X8) + else if (tx_type == TX_8X8) eobtotal = vp8_decode_mb_tokens_8x8(pbi, xd); else eobtotal = vp8_decode_mb_tokens(pbi, xd); @@ -367,15 +329,14 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd, if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) { #if CONFIG_SUPERBLOCKS if (xd->mode_info_context->mbmi.encoded_as_sb) { - RECON_INVOKE(&pbi->common.rtcd.recon, build_intra_predictors_sby_s)(xd); - RECON_INVOKE(&pbi->common.rtcd.recon, build_intra_predictors_sbuv_s)(xd); + vp8_build_intra_predictors_sby_s(xd); + vp8_build_intra_predictors_sbuv_s(xd); } else #endif if (mode != I8X8_PRED) { - RECON_INVOKE(&pbi->common.rtcd.recon, build_intra_predictors_mbuv)(xd); + vp8_build_intra_predictors_mbuv(xd); if (mode != B_PRED) { - RECON_INVOKE(&pbi->common.rtcd.recon, - build_intra_predictors_mby)(xd); + vp8_build_intra_predictors_mby(xd); } #if 0 // Intra-modes requiring recon data from top-right @@ -400,10 +361,8 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd, if (mode == I8X8_PRED) { for (i = 0; i < 4; i++) { int ib = vp8_i8x8_block[i]; -#if !CONFIG_HYBRIDTRANSFORM8X8 const int iblock[4] = {0, 1, 4, 5}; int j; -#endif int i8x8mode; BLOCKD *b; @@ -417,30 +376,37 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd, b = &xd->block[ib]; i8x8mode = b->bmi.as_mode.first; - RECON_INVOKE(RTCD_VTABLE(recon), intra8x8_predict) - (b, i8x8mode, b->predictor); + vp8_intra8x8_predict(b, i8x8mode, b->predictor); + if (xd->mode_info_context->mbmi.txfm_size == TX_8X8) { #if CONFIG_HYBRIDTRANSFORM8X8 - vp8_ht_dequant_idct_add_8x8_c(b->bmi.as_mode.tx_type, - q, dq, pre, dst, 16, stride); - q += 64; + vp8_ht_dequant_idct_add_8x8_c(b->bmi.as_mode.tx_type, + q, dq, pre, dst, 16, stride); + q += 64; #else - vp8_dequant_idct_add_8x8_c(q, dq, pre, dst, 16, stride); - q += 64; + vp8_dequant_idct_add_8x8_c(q, dq, pre, dst, 16, stride); + q += 64; #endif + } else { + for (j = 0; j < 4; j++) { + b = &xd->block[ib + iblock[j]]; + vp8_dequant_idct_add_c(b->qcoeff, b->dequant, b->predictor, + *(b->base_dst) + b->dst, 16, b->dst_stride); + } + } b = &xd->block[16 + i]; - RECON_INVOKE(RTCD_VTABLE(recon), intra_uv4x4_predict) - (b, i8x8mode, b->predictor); - DEQUANT_INVOKE(&pbi->dequant, idct_add) - (b->qcoeff, b->dequant, b->predictor, - *(b->base_dst) + b->dst, 8, b->dst_stride); + vp8_intra_uv4x4_predict(b, i8x8mode, b->predictor); + DEQUANT_INVOKE(&pbi->dequant, idct_add)(b->qcoeff, b->dequant, + b->predictor, + *(b->base_dst) + b->dst, 8, + b->dst_stride); b = &xd->block[20 + i]; - RECON_INVOKE(RTCD_VTABLE(recon), intra_uv4x4_predict) - (b, i8x8mode, b->predictor); - DEQUANT_INVOKE(&pbi->dequant, idct_add) - (b->qcoeff, b->dequant, b->predictor, - *(b->base_dst) + b->dst, 8, b->dst_stride); + vp8_intra_uv4x4_predict(b, i8x8mode, b->predictor); + DEQUANT_INVOKE(&pbi->dequant, idct_add)(b->qcoeff, b->dequant, + b->predictor, + *(b->base_dst) + b->dst, 8, + b->dst_stride); } } else if (mode == B_PRED) { for (i = 0; i < 16; i++) { @@ -451,12 +417,10 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd, if (b_mode2 == (B_PREDICTION_MODE)(B_DC_PRED - 1)) { #endif - RECON_INVOKE(RTCD_VTABLE(recon), intra4x4_predict) - (b, b_mode, b->predictor); + vp8_intra4x4_predict(b, b_mode, b->predictor); #if CONFIG_COMP_INTRA_PRED } else { - RECON_INVOKE(RTCD_VTABLE(recon), comp_intra4x4_predict) - (b, b_mode, b_mode2, b->predictor); + vp8_comp_intra4x4_predict(b, b_mode, b_mode2, b->predictor); } #endif @@ -490,7 +454,6 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd, } else { BLOCKD *b = &xd->block[24]; -#if CONFIG_TX16X16 || CONFIG_HYBRIDTRANSFORM16X16 if (tx_type == TX_16X16) { #if CONFIG_HYBRIDTRANSFORM16X16 if (mode < I8X8_PRED && active_ht16) { @@ -513,9 +476,7 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd, 16, xd->dst.y_stride); #endif } - else -#endif - if (tx_type == TX_8X8) { + else if (tx_type == TX_8X8) { #if CONFIG_SUPERBLOCKS void *orig = xd->mode_info_context; int n, num = xd->mode_info_context->mbmi.encoded_as_sb ? 4 : 1; @@ -602,9 +563,7 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd, #endif if ((tx_type == TX_8X8 && xd->mode_info_context->mbmi.mode != I8X8_PRED) -#if CONFIG_TX16X16 || CONFIG_HYBRIDTRANSFORM16X16 || tx_type == TX_16X16 -#endif ) DEQUANT_INVOKE(&pbi->dequant, idct_add_uv_block_8x8) // (xd->qcoeff + 16 * 16, xd->block[16].dequant, @@ -668,8 +627,7 @@ decode_sb_row(VP8D_COMP *pbi, VP8_COMMON *pc, int mbrow, MACROBLOCKD *xd) { MODE_INFO *mi = xd->mode_info_context; #if CONFIG_SUPERBLOCKS - if (pbi->interleaved_decoding) - mi->mbmi.encoded_as_sb = vp8_read(&pbi->bc, pc->sb_coded); + mi->mbmi.encoded_as_sb = vp8_read(&pbi->bc, pc->sb_coded); #endif // Process the 4 MBs within the SB in the order: @@ -718,8 +676,7 @@ decode_sb_row(VP8D_COMP *pbi, VP8_COMMON *pc, int mbrow, MACROBLOCKD *xd) { if (i) mi->mbmi.encoded_as_sb = 0; #endif - if(pbi->interleaved_decoding) - vpx_decode_mb_mode_mv(pbi, xd, mb_row, mb_col); + vpx_decode_mb_mode_mv(pbi, xd, mb_row, mb_col); update_blockd_bmi(xd); @@ -858,6 +815,7 @@ static void init_frame(VP8D_COMP *pbi) { vp8_init_mv_probs(pc); vp8_init_mbmode_probs(pc); + vp8_default_bmode_probs(pc->fc.bmode_prob); vp8_default_coef_probs(pc); vp8_kf_default_bmode_probs(pc->kf_bmode_prob); @@ -891,6 +849,14 @@ static void init_frame(VP8D_COMP *pbi) { vpx_memcpy(pbi->common.fc.vp8_mode_contexts, pbi->common.fc.mode_context, sizeof(pbi->common.fc.mode_context)); + vpx_memset(pc->prev_mip, 0, + (pc->mb_cols + 1) * (pc->mb_rows + 1)* sizeof(MODE_INFO)); + vpx_memset(pc->mip, 0, + (pc->mb_cols + 1) * (pc->mb_rows + 1)* sizeof(MODE_INFO)); + + update_mode_info_border(pc, pc->mip); + update_mode_info_in_image(pc, pc->mi); + } else { if (!pc->use_bilinear_mc_filter) @@ -1006,7 +972,7 @@ static void read_coef_probs(VP8D_COMP *pbi) { } #endif - if (pbi->common.txfm_mode == ALLOW_8X8 && vp8_read_bit(bc)) { + if (pbi->common.txfm_mode != ONLY_4X4 && vp8_read_bit(bc)) { // read coef probability tree for (i = 0; i < BLOCK_TYPES_8X8; i++) for (j = !i; j < COEF_BANDS; j++) @@ -1025,7 +991,7 @@ static void read_coef_probs(VP8D_COMP *pbi) { } } #if CONFIG_HYBRIDTRANSFORM8X8 - if (pbi->common.txfm_mode == ALLOW_8X8 && vp8_read_bit(bc)) { + if (pbi->common.txfm_mode != ONLY_4X4 && vp8_read_bit(bc)) { // read coef probability tree for (i = 0; i < BLOCK_TYPES_8X8; i++) for (j = !i; j < COEF_BANDS; j++) @@ -1045,9 +1011,8 @@ static void read_coef_probs(VP8D_COMP *pbi) { } #endif -#if CONFIG_TX16X16 // 16x16 - if (vp8_read_bit(bc)) { + if (pbi->common.txfm_mode > ALLOW_8X8 && vp8_read_bit(bc)) { // read coef probability tree for (i = 0; i < BLOCK_TYPES_16X16; ++i) for (j = !i; j < COEF_BANDS; ++j) @@ -1066,7 +1031,7 @@ static void read_coef_probs(VP8D_COMP *pbi) { } } #if CONFIG_HYBRIDTRANSFORM16X16 - if (vp8_read_bit(bc)) { + if (pbi->common.txfm_mode > ALLOW_8X8 && vp8_read_bit(bc)) { // read coef probability tree for (i = 0; i < BLOCK_TYPES_16X16; ++i) for (j = !i; j < COEF_BANDS; ++j) @@ -1085,7 +1050,6 @@ static void read_coef_probs(VP8D_COMP *pbi) { } } #endif -#endif } int vp8_decode_frame(VP8D_COMP *pbi) { @@ -1177,7 +1141,7 @@ int vp8_decode_frame(VP8D_COMP *pbi) { init_frame(pbi); - if (vp8dx_start_decode(bc, data, data_end - data)) + if (vp8dx_start_decode(bc, data, first_partition_length_in_bytes)) vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR, "Failed to allocate bool decoder 0"); if (pc->frame_type == KEY_FRAME) { @@ -1194,9 +1158,27 @@ int vp8_decode_frame(VP8D_COMP *pbi) { xd->update_mb_segmentation_map = (unsigned char)vp8_read_bit(bc); // If so what method will be used. - if (xd->update_mb_segmentation_map) - pc->temporal_update = (unsigned char)vp8_read_bit(bc); + if (xd->update_mb_segmentation_map) { + // Which macro block level features are enabled + // Read the probs used to decode the segment id for each macro + // block. + for (i = 0; i < MB_FEATURE_TREE_PROBS; i++) { + xd->mb_segment_tree_probs[i] = vp8_read_bit(bc) ? + (vp8_prob)vp8_read_literal(bc, 8) : 255; + } + + // Read the prediction probs needed to decode the segment id + pc->temporal_update = (unsigned char)vp8_read_bit(bc); + for (i = 0; i < PREDICTION_PROBS; i++) { + if (pc->temporal_update) { + pc->segment_pred_probs[i] = vp8_read_bit(bc) ? + (vp8_prob)vp8_read_literal(bc, 8) : 255; + } else { + pc->segment_pred_probs[i] = 255; + } + } + } // Is the segment data being updated xd->update_mb_segmentation_data = (unsigned char)vp8_read_bit(bc); @@ -1261,38 +1243,6 @@ int vp8_decode_frame(VP8D_COMP *pbi) { } } } - - if (xd->update_mb_segmentation_map) { - // Which macro block level features are enabled - vpx_memset(xd->mb_segment_tree_probs, 255, - sizeof(xd->mb_segment_tree_probs)); - vpx_memset(pc->segment_pred_probs, 255, - sizeof(pc->segment_pred_probs)); - - // Read the probs used to decode the segment id for each macro - // block. - for (i = 0; i < MB_FEATURE_TREE_PROBS; i++) { - // If not explicitly set value is defaulted to 255 by - // memset above - if (vp8_read_bit(bc)) - xd->mb_segment_tree_probs[i] = - (vp8_prob)vp8_read_literal(bc, 8); - } - - // If predictive coding of segment map is enabled read the - // prediction probabilities. - if (pc->temporal_update) { - // Read the prediction probs needed to decode the segment id - // when predictive coding enabled - for (i = 0; i < PREDICTION_PROBS; i++) { - // If not explicitly set value is defaulted to 255 by - // memset above - if (vp8_read_bit(bc)) - pc->segment_pred_probs[i] = - (vp8_prob)vp8_read_literal(bc, 8); - } - } - } } // Read common prediction model status flag probability updates for the @@ -1314,7 +1264,17 @@ int vp8_decode_frame(VP8D_COMP *pbi) { #endif /* Read the loop filter level and type */ +#if CONFIG_TX_SELECT + pc->txfm_mode = vp8_read_literal(bc, 2); + if (pc->txfm_mode == TX_MODE_SELECT) { + pc->prob_tx[0] = vp8_read_literal(bc, 8); + pc->prob_tx[1] = vp8_read_literal(bc, 8); + } +#else pc->txfm_mode = (TXFM_MODE) vp8_read_bit(bc); + if (pc->txfm_mode == ALLOW_8X8) + pc->txfm_mode = ALLOW_16X16; +#endif pc->filter_type = (LOOPFILTERTYPE) vp8_read_bit(bc); pc->filter_level = vp8_read_literal(bc, 6); @@ -1458,14 +1418,12 @@ int vp8_decode_frame(VP8D_COMP *pbi) { vp8_copy(pbi->common.fc.pre_hybrid_coef_probs_8x8, pbi->common.fc.hybrid_coef_probs_8x8); #endif -#if CONFIG_TX16X16 vp8_copy(pbi->common.fc.pre_coef_probs_16x16, pbi->common.fc.coef_probs_16x16); #if CONFIG_HYBRIDTRANSFORM16X16 vp8_copy(pbi->common.fc.pre_hybrid_coef_probs_16x16, pbi->common.fc.hybrid_coef_probs_16x16); #endif -#endif vp8_copy(pbi->common.fc.pre_ymode_prob, pbi->common.fc.ymode_prob); vp8_copy(pbi->common.fc.pre_uv_mode_prob, pbi->common.fc.uv_mode_prob); vp8_copy(pbi->common.fc.pre_bmode_prob, pbi->common.fc.bmode_prob); @@ -1486,12 +1444,10 @@ int vp8_decode_frame(VP8D_COMP *pbi) { #if CONFIG_HYBRIDTRANSFORM8X8 vp8_zero(pbi->common.fc.hybrid_coef_counts_8x8); #endif -#if CONFIG_TX16X16 vp8_zero(pbi->common.fc.coef_counts_16x16); #if CONFIG_HYBRIDTRANSFORM16X16 vp8_zero(pbi->common.fc.hybrid_coef_counts_16x16); #endif -#endif vp8_zero(pbi->common.fc.ymode_counts); vp8_zero(pbi->common.fc.uv_mode_counts); vp8_zero(pbi->common.fc.bmode_counts); @@ -1530,10 +1486,7 @@ int vp8_decode_frame(VP8D_COMP *pbi) { /* Read the mb_no_coeff_skip flag */ pc->mb_no_coeff_skip = (int)vp8_read_bit(bc); - if(pbi->interleaved_decoding) - vpx_decode_mode_mvs_init(pbi); - else - vp8_decode_mode_mvs(pbi); + vpx_decode_mode_mvs_init(pbi); vpx_memset(pc->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES) * pc->mb_cols); |