summaryrefslogtreecommitdiff
path: root/vp8/decoder
diff options
context:
space:
mode:
Diffstat (limited to 'vp8/decoder')
-rw-r--r--vp8/decoder/decodframe.c146
1 files changed, 47 insertions, 99 deletions
diff --git a/vp8/decoder/decodframe.c b/vp8/decoder/decodframe.c
index 5fb510b64..80efa5802 100644
--- a/vp8/decoder/decodframe.c
+++ b/vp8/decoder/decodframe.c
@@ -40,10 +40,6 @@
#include <stdio.h>
-#ifdef DEC_DEBUG
-int dec_debug = 0;
-#endif
-
#define COEFCOUNT_TESTING
static int merge_index(int v, int n, int modulus) {
@@ -209,17 +205,6 @@ static void skip_recon_mb(VP8D_COMP *pbi, MACROBLOCKD *xd) {
}
#endif
}
-#ifdef DEC_DEBUG
- if (dec_debug) {
- int i, j;
- printf("Generating predictors\n");
- for (i = 0; i < 16; i++) {
- for (j = 0; j < 16; j++) printf("%3d ", xd->dst.y_buffer[i * xd->dst.y_stride + j]);
- printf("\n");
- }
- }
-#endif
-
}
extern const int vp8_i8x8_block[4];
@@ -255,14 +240,10 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd,
xd->mode_info_context->mbmi.mode == NEARMV ||
xd->mode_info_context->mbmi.mode == NEARESTMV)
xd->mode_info_context->mbmi.txfm_size = TX_16X16;
- else if (pbi->common.txfm_mode == ALLOW_8X8 &&
- xd->mode_info_context->mbmi.mode != I8X8_PRED &&
- xd->mode_info_context->mbmi.mode != B_PRED)
-#else
- if (pbi->common.txfm_mode == ALLOW_8X8 &&
- xd->mode_info_context->mbmi.mode != I8X8_PRED &&
- xd->mode_info_context->mbmi.mode != B_PRED)
+ 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;
@@ -272,30 +253,18 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd,
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.mode == NEARESTMV)
xd->mode_info_context->mbmi.txfm_size = TX_16X16;
- } else if (pbi->common.txfm_mode == ALLOW_8X8 &&
- xd->mode_info_context->mbmi.mode != I8X8_PRED &&
- xd->mode_info_context->mbmi.mode != B_PRED &&
- xd->mode_info_context->mbmi.mode != SPLITMV) {
-#else
- if (pbi->common.txfm_mode == ALLOW_8X8 &&
- xd->mode_info_context->mbmi.mode != I8X8_PRED &&
- xd->mode_info_context->mbmi.mode != B_PRED &&
- xd->mode_info_context->mbmi.mode != SPLITMV) {
+ 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 {
+ else
xd->mode_info_context->mbmi.txfm_size = TX_4X4;
- }
}
-#if CONFIG_HYBRIDTRANSFORM8X8
- if (xd->mode_info_context->mbmi.mode == I8X8_PRED) {
- xd->mode_info_context->mbmi.txfm_size = TX_8X8;
- }
-#endif
#if CONFIG_SUPERBLOCKS
if (xd->mode_info_context->mbmi.encoded_as_sb) {
xd->mode_info_context->mbmi.txfm_size = TX_8X8;
@@ -303,6 +272,41 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd,
#endif
tx_type = xd->mode_info_context->mbmi.txfm_size;
+ mode = xd->mode_info_context->mbmi.mode;
+
+#if CONFIG_HYBRIDTRANSFORM
+ // parse transform types for intra 4x4 mode
+ QIndex = xd->q_index;
+ active_ht = (QIndex < ACTIVE_HT);
+ if (mode == B_PRED) {
+ for (i = 0; i < 16; i++) {
+ BLOCKD *b = &xd->block[i];
+ int b_mode = xd->mode_info_context->bmi[i].as_mode.first;
+ if(active_ht)
+ txfm_map(b, b_mode);
+ } // loop over 4x4 blocks
+ }
+#endif
+
+#if CONFIG_HYBRIDTRANSFORM8X8
+ if (mode == I8X8_PRED) {
+ for (i = 0; i < 4; i++) {
+ int ib = vp8_i8x8_block[i];
+ BLOCKD *b = &xd->block[ib];
+ int i8x8mode = b->bmi.as_mode.first;
+ txfm_map(b, pred_mode_conv(i8x8mode));
+ }
+ }
+#endif
+
+#if CONFIG_HYBRIDTRANSFORM16X16
+ active_ht16 = (QIndex < ACTIVE_HT16);
+ if (mode < I8X8_PRED) {
+ BLOCKD *b = &xd->block[0];
+ if(active_ht16)
+ txfm_map(b, pred_mode_conv(mode));
+ }
+#endif
if (xd->mode_info_context->mbmi.mb_skip_coeff) {
vp8_reset_mb_tokens_context(xd);
@@ -329,19 +333,9 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd,
eobtotal = vp8_decode_mb_tokens_8x8(pbi, xd);
else
eobtotal = vp8_decode_mb_tokens(pbi, xd);
-#ifdef DEC_DEBUG
- if (dec_debug) {
- printf("\nTokens (%d)\n", eobtotal);
- for (i = 0; i < 400; i++) {
- printf("%3d ", xd->qcoeff[i]);
- if (i % 16 == 15) printf("\n");
- }
- printf("\n");
- }
-#endif
}
- mode = xd->mode_info_context->mbmi.mode;
+ //mode = xd->mode_info_context->mbmi.mode;
#if CONFIG_SWITCHABLE_INTERP
if (pbi->common.frame_type != KEY_FRAME)
vp8_setup_interp_filters(xd, xd->mode_info_context->mbmi.interp_filter,
@@ -366,39 +360,10 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd,
}
}
-#ifdef DEC_DEBUG
- if (dec_debug) {
- int i, j;
- printf("Generating predictors\n");
- for (i = 0; i < 16; i++) {
- for (j = 0; j < 16; j++) printf("%3d ", xd->dst.y_buffer[i * xd->dst.y_stride + j]);
- printf("\n");
- }
- }
-#endif
-
// moved to be performed before detokenization
// if (xd->segmentation_enabled)
// mb_init_dequantizer(pbi, xd);
-#if CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM16X16
- // parse transform types for intra 4x4 mode
- QIndex = xd->q_index;
- active_ht = (QIndex < ACTIVE_HT);
- if (mode == B_PRED) {
- for (i = 0; i < 16; i++) {
- BLOCKD *b = &xd->block[i];
- int b_mode = xd->mode_info_context->bmi[i].as_mode.first;
- if(active_ht)
- txfm_map(b, b_mode);
- } // loop over 4x4 blocks
- }
-#endif
-
-#if CONFIG_HYBRIDTRANSFORM16X16
- active_ht16 = (QIndex < ACTIVE_HT16);
-#endif
-
/* do prediction */
if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) {
#if CONFIG_SUPERBLOCKS
@@ -451,9 +416,6 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd,
unsigned char *pre = xd->block[ib].predictor;
unsigned char *dst = *(xd->block[ib].base_dst) + xd->block[ib].dst;
int stride = xd->dst.y_stride;
-
- tx_type = TX_4X4;
- xd->mode_info_context->mbmi.txfm_size = TX_4X4;
#endif
b = &xd->block[ib];
@@ -462,7 +424,6 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd,
(b, i8x8mode, b->predictor);
#if CONFIG_HYBRIDTRANSFORM8X8
- txfm_map(b, pred_mode_conv(i8x8mode));
vp8_ht_dequant_idct_add_8x8_c(b->bmi.as_mode.tx_type,
q, dq, pre, dst, 16, stride);
q += 64;
@@ -598,16 +559,6 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd,
continue; // only happens for SBs, which are already in dest buffer
#endif
DEQUANT_INVOKE(&pbi->dequant, block_2x2)(b);
-#ifdef DEC_DEBUG
- if (dec_debug) {
- int j;
- printf("DQcoeff Haar\n");
- for (j = 0; j < 16; j++) {
- printf("%d ", b->dqcoeff[j]);
- }
- printf("\n");
- }
-#endif
IDCT_INVOKE(RTCD_VTABLE(idct), ihaar2)(&b->dqcoeff[0], b->diff, 8);
((int *)b->qcoeff)[0] = 0;// 2nd order block are set to 0 after inverse transform
((int *)b->qcoeff)[1] = 0;
@@ -665,7 +616,8 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd,
#if CONFIG_SUPERBLOCKS
if (!xd->mode_info_context->mbmi.encoded_as_sb) {
#endif
- if (tx_type == TX_8X8
+ if ((tx_type == TX_8X8 &&
+ xd->mode_info_context->mbmi.mode != I8X8_PRED)
#if CONFIG_TX16X16 || CONFIG_HYBRIDTRANSFORM16X16
|| tx_type == TX_16X16
#endif
@@ -753,10 +705,6 @@ decode_sb_row(VP8D_COMP *pbi, VP8_COMMON *pc, int mbrow, MACROBLOCKD *xd) {
continue;
}
-#ifdef DEC_DEBUG
- dec_debug = (pc->current_video_frame == 0 && mb_row == 0 && mb_col == 0);
-#endif
-
// Set above context pointer
xd->above_context = pc->above_context + mb_col;
xd->left_context = pc->left_context + (i >> 1);