summaryrefslogtreecommitdiff
path: root/vp8/decoder/decodframe.c
diff options
context:
space:
mode:
Diffstat (limited to 'vp8/decoder/decodframe.c')
-rw-r--r--vp8/decoder/decodframe.c215
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);