Index: source/libvpx/vp9/decoder/vp9_decodframe.c |
=================================================================== |
--- source/libvpx/vp9/decoder/vp9_decodframe.c (revision 177019) |
+++ source/libvpx/vp9/decoder/vp9_decodframe.c (working copy) |
@@ -10,17 +10,19 @@ |
#include "vp9/decoder/vp9_onyxd_int.h" |
+#include "vp9/common/vp9_common.h" |
#include "vp9/common/vp9_header.h" |
#include "vp9/common/vp9_reconintra.h" |
#include "vp9/common/vp9_reconintra4x4.h" |
#include "vp9/common/vp9_reconinter.h" |
+#include "vp9/common/vp9_entropy.h" |
#include "vp9/decoder/vp9_decodframe.h" |
#include "vp9/decoder/vp9_detokenize.h" |
#include "vp9/common/vp9_invtrans.h" |
#include "vp9/common/vp9_alloccommon.h" |
#include "vp9/common/vp9_entropymode.h" |
#include "vp9/common/vp9_quant_common.h" |
-#include "vpx_scale/vpxscale.h" |
+#include "vpx_scale/vpx_scale.h" |
#include "vp9/common/vp9_setupintrarecon.h" |
#include "vp9/decoder/vp9_decodemv.h" |
@@ -81,17 +83,17 @@ |
VP9_COMMON *const pc = &pbi->common; |
for (Q = 0; Q < QINDEX_RANGE; Q++) { |
- pc->Y1dequant[Q][0] = (short)vp9_dc_quant(Q, pc->y1dc_delta_q); |
- pc->Y2dequant[Q][0] = (short)vp9_dc2quant(Q, pc->y2dc_delta_q); |
- pc->UVdequant[Q][0] = (short)vp9_dc_uv_quant(Q, pc->uvdc_delta_q); |
+ pc->Y1dequant[Q][0] = (int16_t)vp9_dc_quant(Q, pc->y1dc_delta_q); |
+ pc->Y2dequant[Q][0] = (int16_t)vp9_dc2quant(Q, pc->y2dc_delta_q); |
+ pc->UVdequant[Q][0] = (int16_t)vp9_dc_uv_quant(Q, pc->uvdc_delta_q); |
/* all the ac values =; */ |
for (i = 1; i < 16; i++) { |
- int rc = vp9_default_zig_zag1d[i]; |
+ int rc = vp9_default_zig_zag1d_4x4[i]; |
- pc->Y1dequant[Q][rc] = (short)vp9_ac_yquant(Q); |
- pc->Y2dequant[Q][rc] = (short)vp9_ac2quant(Q, pc->y2ac_delta_q); |
- pc->UVdequant[Q][rc] = (short)vp9_ac_uv_quant(Q, pc->uvac_delta_q); |
+ pc->Y1dequant[Q][rc] = (int16_t)vp9_ac_yquant(Q); |
+ pc->Y2dequant[Q][rc] = (int16_t)vp9_ac2quant(Q, pc->y2ac_delta_q); |
+ pc->UVdequant[Q][rc] = (int16_t)vp9_ac_uv_quant(Q, pc->uvac_delta_q); |
} |
} |
} |
@@ -170,20 +172,25 @@ |
*/ |
static void skip_recon_mb(VP9D_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) { |
+ if (xd->mode_info_context->mbmi.sb_type == BLOCK_SIZE_SB64X64) { |
+ vp9_build_intra_predictors_sb64uv_s(xd); |
+ vp9_build_intra_predictors_sb64y_s(xd); |
+ } else if (xd->mode_info_context->mbmi.sb_type == BLOCK_SIZE_SB32X32) { |
vp9_build_intra_predictors_sbuv_s(xd); |
vp9_build_intra_predictors_sby_s(xd); |
} else { |
-#endif |
- vp9_build_intra_predictors_mbuv_s(xd); |
- vp9_build_intra_predictors_mby_s(xd); |
-#if CONFIG_SUPERBLOCKS |
+ vp9_build_intra_predictors_mbuv_s(xd); |
+ vp9_build_intra_predictors_mby_s(xd); |
} |
-#endif |
} else { |
-#if CONFIG_SUPERBLOCKS |
- if (xd->mode_info_context->mbmi.encoded_as_sb) { |
+ if (xd->mode_info_context->mbmi.sb_type == BLOCK_SIZE_SB64X64) { |
+ vp9_build_inter64x64_predictors_sb(xd, |
+ xd->dst.y_buffer, |
+ xd->dst.u_buffer, |
+ xd->dst.v_buffer, |
+ xd->dst.y_stride, |
+ xd->dst.uv_stride); |
+ } else if (xd->mode_info_context->mbmi.sb_type == BLOCK_SIZE_SB32X32) { |
vp9_build_inter32x32_predictors_sb(xd, |
xd->dst.y_buffer, |
xd->dst.u_buffer, |
@@ -191,35 +198,32 @@ |
xd->dst.y_stride, |
xd->dst.uv_stride); |
} else { |
-#endif |
- vp9_build_1st_inter16x16_predictors_mb(xd, |
- xd->dst.y_buffer, |
- xd->dst.u_buffer, |
- xd->dst.v_buffer, |
- xd->dst.y_stride, |
- xd->dst.uv_stride); |
- |
- if (xd->mode_info_context->mbmi.second_ref_frame > 0) { |
- vp9_build_2nd_inter16x16_predictors_mb(xd, |
+ vp9_build_1st_inter16x16_predictors_mb(xd, |
xd->dst.y_buffer, |
xd->dst.u_buffer, |
xd->dst.v_buffer, |
xd->dst.y_stride, |
xd->dst.uv_stride); |
- } |
-#if CONFIG_COMP_INTERINTRA_PRED |
- else if (xd->mode_info_context->mbmi.second_ref_frame == INTRA_FRAME) { |
- vp9_build_interintra_16x16_predictors_mb(xd, |
+ |
+ if (xd->mode_info_context->mbmi.second_ref_frame > 0) { |
+ vp9_build_2nd_inter16x16_predictors_mb(xd, |
xd->dst.y_buffer, |
xd->dst.u_buffer, |
xd->dst.v_buffer, |
xd->dst.y_stride, |
xd->dst.uv_stride); |
- } |
+ } |
+#if CONFIG_COMP_INTERINTRA_PRED |
+ else if (xd->mode_info_context->mbmi.second_ref_frame == INTRA_FRAME) { |
+ vp9_build_interintra_16x16_predictors_mb(xd, |
+ xd->dst.y_buffer, |
+ xd->dst.u_buffer, |
+ xd->dst.v_buffer, |
+ xd->dst.y_stride, |
+ xd->dst.uv_stride); |
+ } |
#endif |
-#if CONFIG_SUPERBLOCKS |
} |
-#endif |
} |
} |
@@ -283,10 +287,10 @@ |
for (i = 0; i < 4; i++) { |
int ib = vp9_i8x8_block[i]; |
int idx = (ib & 0x02) ? (ib + 2) : ib; |
- short *q = xd->block[idx].qcoeff; |
- short *dq = xd->block[0].dequant; |
- unsigned char *pre = xd->block[ib].predictor; |
- unsigned char *dst = *(xd->block[ib].base_dst) + xd->block[ib].dst; |
+ int16_t *q = xd->block[idx].qcoeff; |
+ int16_t *dq = xd->block[0].dequant; |
+ uint8_t *pre = xd->block[ib].predictor; |
+ uint8_t *dst = *(xd->block[ib].base_dst) + xd->block[ib].dst; |
int stride = xd->dst.y_stride; |
BLOCKD *b = &xd->block[ib]; |
if (xd->mode_info_context->mbmi.mode == I8X8_PRED) { |
@@ -414,9 +418,6 @@ |
assert(get_2nd_order_usage(xd) == 0); |
for (i = 0; i < 16; i++) { |
int b_mode; |
-#if CONFIG_COMP_INTRA_PRED |
- int b_mode2; |
-#endif |
BLOCKD *b = &xd->block[i]; |
b_mode = xd->mode_info_context->bmi[i].as_mode.first; |
#if CONFIG_NEWBINTRAMODES |
@@ -425,17 +426,8 @@ |
#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; |
- if (b_mode2 == (B_PREDICTION_MODE)(B_DC_PRED - 1)) { |
-#endif |
- vp9_intra4x4_predict(b, b_mode, b->predictor); |
-#if CONFIG_COMP_INTRA_PRED |
- } else { |
- vp9_comp_intra4x4_predict(b, b_mode, b_mode2, b->predictor); |
- } |
-#endif |
+ vp9_intra4x4_predict(b, b_mode, b->predictor); |
tx_type = get_tx_type_4x4(xd, b); |
if (tx_type != DCT_DCT) { |
vp9_ht_dequant_idct_add_c(tx_type, b->qcoeff, |
@@ -446,12 +438,12 @@ |
vp9_dequant_idct_add(b->qcoeff, b->dequant, b->predictor, |
*(b->base_dst) + b->dst, 16, b->dst_stride); |
} |
- xd->above_context->y2 = 1; |
- xd->left_context->y2 = 1; |
} |
if (!xd->mode_info_context->mbmi.mb_skip_coeff) { |
vp9_decode_mb_tokens_4x4_uv(pbi, xd, bc); |
} |
+ xd->above_context->y2 = 0; |
+ xd->left_context->y2 = 0; |
vp9_build_intra_predictors_mbuv(xd); |
pbi->idct_add_uv_block(xd->qcoeff + 16 * 16, |
xd->block[16].dequant, |
@@ -546,10 +538,10 @@ |
} |
} |
-#if CONFIG_SUPERBLOCKS |
static void decode_16x16_sb(VP9D_COMP *pbi, MACROBLOCKD *xd, |
- BOOL_DECODER* const bc, int n) { |
- int x_idx = n & 1, y_idx = n >> 1; |
+ BOOL_DECODER* const bc, int n, |
+ int maska, int shiftb) { |
+ int x_idx = n & maska, y_idx = n >> shiftb; |
TX_TYPE tx_type = get_tx_type_16x16(xd, &xd->block[0]); |
if (tx_type != DCT_DCT) { |
vp9_ht_dequant_idct_add_16x16_c( |
@@ -573,17 +565,18 @@ |
}; |
static void decode_8x8_sb(VP9D_COMP *pbi, MACROBLOCKD *xd, |
- BOOL_DECODER* const bc, int n) { |
+ BOOL_DECODER* const bc, int n, |
+ int maska, int shiftb) { |
+ int x_idx = n & maska, y_idx = n >> shiftb; |
BLOCKD *b = &xd->block[24]; |
- int x_idx = n & 1, y_idx = n >> 1; |
TX_TYPE tx_type = get_tx_type_8x8(xd, &xd->block[0]); |
if (tx_type != DCT_DCT) { |
int i; |
for (i = 0; i < 4; i++) { |
int ib = vp9_i8x8_block[i]; |
int idx = (ib & 0x02) ? (ib + 2) : ib; |
- short *q = xd->block[idx].qcoeff; |
- short *dq = xd->block[0].dequant; |
+ int16_t *q = xd->block[idx].qcoeff; |
+ int16_t *dq = xd->block[0].dequant; |
int stride = xd->dst.y_stride; |
BLOCKD *b = &xd->block[ib]; |
tx_type = get_tx_type_8x8(xd, &xd->block[ib]); |
@@ -634,9 +627,10 @@ |
}; |
static void decode_4x4_sb(VP9D_COMP *pbi, MACROBLOCKD *xd, |
- BOOL_DECODER* const bc, int n) { |
+ BOOL_DECODER* const bc, int n, |
+ int maska, int shiftb) { |
+ int x_idx = n & maska, y_idx = n >> shiftb; |
BLOCKD *b = &xd->block[24]; |
- int x_idx = n & 1, y_idx = n >> 1; |
TX_TYPE tx_type = get_tx_type_4x4(xd, &xd->block[0]); |
if (tx_type != DCT_DCT) { |
int i; |
@@ -689,15 +683,16 @@ |
xd->dst.uv_stride, xd->eobs + 16, xd); |
}; |
-static void decode_superblock(VP9D_COMP *pbi, MACROBLOCKD *xd, |
- int mb_row, unsigned int mb_col, |
- BOOL_DECODER* const bc) { |
+static void decode_superblock64(VP9D_COMP *pbi, MACROBLOCKD *xd, |
+ int mb_row, unsigned int mb_col, |
+ BOOL_DECODER* const bc) { |
int i, n, eobtotal; |
TX_SIZE tx_size = xd->mode_info_context->mbmi.txfm_size; |
VP9_COMMON *const pc = &pbi->common; |
MODE_INFO *orig_mi = xd->mode_info_context; |
+ const int mis = pc->mode_info_stride; |
- assert(xd->mode_info_context->mbmi.encoded_as_sb); |
+ assert(xd->mode_info_context->mbmi.sb_type == BLOCK_SIZE_SB64X64); |
if (pbi->common.frame_type != KEY_FRAME) |
vp9_setup_interp_filters(xd, xd->mode_info_context->mbmi.interp_filter, pc); |
@@ -707,7 +702,133 @@ |
mb_init_dequantizer(pbi, xd); |
if (xd->mode_info_context->mbmi.mb_skip_coeff) { |
+ int n; |
+ |
vp9_reset_mb_tokens_context(xd); |
+ for (n = 1; n <= 3; n++) { |
+ if (mb_col < pc->mb_cols - n) |
+ xd->above_context += n; |
+ if (mb_row < pc->mb_rows - n) |
+ xd->left_context += n; |
+ vp9_reset_mb_tokens_context(xd); |
+ if (mb_col < pc->mb_cols - n) |
+ xd->above_context -= n; |
+ if (mb_row < pc->mb_rows - n) |
+ xd->left_context -= n; |
+ } |
+ |
+ /* Special case: Force the loopfilter to skip when eobtotal and |
+ * mb_skip_coeff are zero. |
+ */ |
+ skip_recon_mb(pbi, xd); |
+ return; |
+ } |
+ |
+ /* do prediction */ |
+ if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) { |
+ vp9_build_intra_predictors_sb64y_s(xd); |
+ vp9_build_intra_predictors_sb64uv_s(xd); |
+ } else { |
+ vp9_build_inter64x64_predictors_sb(xd, xd->dst.y_buffer, |
+ xd->dst.u_buffer, xd->dst.v_buffer, |
+ xd->dst.y_stride, xd->dst.uv_stride); |
+ } |
+ |
+ /* dequantization and idct */ |
+ if (xd->mode_info_context->mbmi.txfm_size == TX_32X32) { |
+ for (n = 0; n < 4; n++) { |
+ const int x_idx = n & 1, y_idx = n >> 1; |
+ |
+ if (mb_col + x_idx * 2 >= pc->mb_cols || |
+ mb_row + y_idx * 2 >= pc->mb_rows) |
+ continue; |
+ |
+ xd->left_context = pc->left_context + (y_idx << 1); |
+ xd->above_context = pc->above_context + mb_col + (x_idx << 1); |
+ xd->mode_info_context = orig_mi + x_idx * 2 + y_idx * 2 * mis; |
+ eobtotal = vp9_decode_sb_tokens(pbi, xd, bc); |
+ if (eobtotal == 0) { // skip loopfilter |
+ xd->mode_info_context->mbmi.mb_skip_coeff = 1; |
+ if (mb_col + 1 < pc->mb_cols) |
+ xd->mode_info_context[1].mbmi.mb_skip_coeff = 1; |
+ if (mb_row + 1 < pc->mb_rows) { |
+ xd->mode_info_context[mis].mbmi.mb_skip_coeff = 1; |
+ if (mb_col + 1 < pc->mb_cols) |
+ xd->mode_info_context[mis + 1].mbmi.mb_skip_coeff = 1; |
+ } |
+ } else { |
+ vp9_dequant_idct_add_32x32(xd->sb_coeff_data.qcoeff, xd->block[0].dequant, |
+ xd->dst.y_buffer + x_idx * 32 + |
+ xd->dst.y_stride * y_idx * 32, |
+ xd->dst.y_buffer + x_idx * 32 + |
+ xd->dst.y_stride * y_idx * 32, |
+ xd->dst.y_stride, xd->dst.y_stride, |
+ xd->eobs[0]); |
+ vp9_dequant_idct_add_uv_block_16x16_c(xd->sb_coeff_data.qcoeff + 1024, |
+ xd->block[16].dequant, |
+ xd->dst.u_buffer + x_idx * 16 + |
+ xd->dst.uv_stride * y_idx * 16, |
+ xd->dst.v_buffer + x_idx * 16 + |
+ xd->dst.uv_stride * y_idx * 16, |
+ xd->dst.uv_stride, xd->eobs + 16); |
+ } |
+ } |
+ } else { |
+ for (n = 0; n < 16; n++) { |
+ int x_idx = n & 3, y_idx = n >> 2; |
+ |
+ if (mb_col + x_idx >= pc->mb_cols || mb_row + y_idx >= pc->mb_rows) |
+ continue; |
+ |
+ xd->above_context = pc->above_context + mb_col + x_idx; |
+ xd->left_context = pc->left_context + y_idx; |
+ xd->mode_info_context = orig_mi + x_idx + y_idx * mis; |
+ for (i = 0; i < 25; i++) { |
+ xd->block[i].eob = 0; |
+ xd->eobs[i] = 0; |
+ } |
+ |
+ eobtotal = vp9_decode_mb_tokens(pbi, xd, bc); |
+ if (eobtotal == 0) { // skip loopfilter |
+ xd->mode_info_context->mbmi.mb_skip_coeff = 1; |
+ continue; |
+ } |
+ |
+ if (tx_size == TX_16X16) { |
+ decode_16x16_sb(pbi, xd, bc, n, 3, 2); |
+ } else if (tx_size == TX_8X8) { |
+ decode_8x8_sb(pbi, xd, bc, n, 3, 2); |
+ } else { |
+ decode_4x4_sb(pbi, xd, bc, n, 3, 2); |
+ } |
+ } |
+ } |
+ |
+ xd->above_context = pc->above_context + mb_col; |
+ xd->left_context = pc->left_context; |
+ xd->mode_info_context = orig_mi; |
+} |
+ |
+static void decode_superblock32(VP9D_COMP *pbi, MACROBLOCKD *xd, |
+ int mb_row, unsigned int mb_col, |
+ BOOL_DECODER* const bc) { |
+ int i, n, eobtotal; |
+ TX_SIZE tx_size = xd->mode_info_context->mbmi.txfm_size; |
+ VP9_COMMON *const pc = &pbi->common; |
+ MODE_INFO *orig_mi = xd->mode_info_context; |
+ const int mis = pc->mode_info_stride; |
+ |
+ assert(xd->mode_info_context->mbmi.sb_type == BLOCK_SIZE_SB32X32); |
+ |
+ if (pbi->common.frame_type != KEY_FRAME) |
+ vp9_setup_interp_filters(xd, xd->mode_info_context->mbmi.interp_filter, pc); |
+ |
+ // re-initialize macroblock dequantizer before detokenization |
+ if (xd->segmentation_enabled) |
+ mb_init_dequantizer(pbi, xd); |
+ |
+ if (xd->mode_info_context->mbmi.mb_skip_coeff) { |
+ vp9_reset_mb_tokens_context(xd); |
if (mb_col < pc->mb_cols - 1) |
xd->above_context++; |
if (mb_row < pc->mb_rows - 1) |
@@ -736,41 +857,62 @@ |
} |
/* dequantization and idct */ |
- for (n = 0; n < 4; n++) { |
- int x_idx = n & 1, y_idx = n >> 1; |
+ if (xd->mode_info_context->mbmi.txfm_size == TX_32X32) { |
+ eobtotal = vp9_decode_sb_tokens(pbi, xd, bc); |
+ if (eobtotal == 0) { // skip loopfilter |
+ xd->mode_info_context->mbmi.mb_skip_coeff = 1; |
+ if (mb_col + 1 < pc->mb_cols) |
+ xd->mode_info_context[1].mbmi.mb_skip_coeff = 1; |
+ if (mb_row + 1 < pc->mb_rows) { |
+ xd->mode_info_context[mis].mbmi.mb_skip_coeff = 1; |
+ if (mb_col + 1 < pc->mb_cols) |
+ xd->mode_info_context[mis + 1].mbmi.mb_skip_coeff = 1; |
+ } |
+ } else { |
+ vp9_dequant_idct_add_32x32(xd->sb_coeff_data.qcoeff, xd->block[0].dequant, |
+ xd->dst.y_buffer, xd->dst.y_buffer, |
+ xd->dst.y_stride, xd->dst.y_stride, |
+ xd->eobs[0]); |
+ vp9_dequant_idct_add_uv_block_16x16_c(xd->sb_coeff_data.qcoeff + 1024, |
+ xd->block[16].dequant, |
+ xd->dst.u_buffer, xd->dst.v_buffer, |
+ xd->dst.uv_stride, xd->eobs + 16); |
+ } |
+ } else { |
+ for (n = 0; n < 4; n++) { |
+ int x_idx = n & 1, y_idx = n >> 1; |
- if (mb_col + x_idx >= pc->mb_cols || mb_row + y_idx >= pc->mb_rows) |
- continue; |
+ if (mb_col + x_idx >= pc->mb_cols || mb_row + y_idx >= pc->mb_rows) |
+ continue; |
+ xd->above_context = pc->above_context + mb_col + x_idx; |
+ xd->left_context = pc->left_context + y_idx + (mb_row & 2); |
+ xd->mode_info_context = orig_mi + x_idx + y_idx * mis; |
+ for (i = 0; i < 25; i++) { |
+ xd->block[i].eob = 0; |
+ xd->eobs[i] = 0; |
+ } |
- xd->above_context = pc->above_context + mb_col + x_idx; |
- xd->left_context = pc->left_context + y_idx; |
- xd->mode_info_context = orig_mi + x_idx + y_idx * pc->mode_info_stride; |
- for (i = 0; i < 25; i++) { |
- xd->block[i].eob = 0; |
- xd->eobs[i] = 0; |
- } |
+ eobtotal = vp9_decode_mb_tokens(pbi, xd, bc); |
+ if (eobtotal == 0) { // skip loopfilter |
+ xd->mode_info_context->mbmi.mb_skip_coeff = 1; |
+ continue; |
+ } |
- eobtotal = vp9_decode_mb_tokens(pbi, xd, bc); |
- if (eobtotal == 0) { // skip loopfilter |
- xd->mode_info_context->mbmi.mb_skip_coeff = 1; |
- continue; |
+ if (tx_size == TX_16X16) { |
+ decode_16x16_sb(pbi, xd, bc, n, 1, 1); |
+ } else if (tx_size == TX_8X8) { |
+ decode_8x8_sb(pbi, xd, bc, n, 1, 1); |
+ } else { |
+ decode_4x4_sb(pbi, xd, bc, n, 1, 1); |
+ } |
} |
- if (tx_size == TX_16X16) { |
- decode_16x16_sb(pbi, xd, bc, n); |
- } else if (tx_size == TX_8X8) { |
- decode_8x8_sb(pbi, xd, bc, n); |
- } else { |
- decode_4x4_sb(pbi, xd, bc, n); |
- } |
+ xd->above_context = pc->above_context + mb_col; |
+ xd->left_context = pc->left_context + (mb_row & 2); |
+ xd->mode_info_context = orig_mi; |
} |
- |
- xd->above_context = pc->above_context + mb_col; |
- xd->left_context = pc->left_context; |
- xd->mode_info_context = orig_mi; |
} |
-#endif |
static void decode_macroblock(VP9D_COMP *pbi, MACROBLOCKD *xd, |
int mb_row, unsigned int mb_col, |
@@ -780,9 +922,7 @@ |
int i; |
int tx_size; |
-#if CONFIG_SUPERBLOCKS |
- assert(!xd->mode_info_context->mbmi.encoded_as_sb); |
-#endif |
+ assert(!xd->mode_info_context->mbmi.sb_type); |
// re-initialize macroblock dequantizer before detokenization |
if (xd->segmentation_enabled) |
@@ -904,190 +1044,176 @@ |
FILE *vpxlog = 0; |
#endif |
-/* Decode a row of Superblocks (2x2 region of MBs) */ |
-static void |
-decode_sb_row(VP9D_COMP *pbi, VP9_COMMON *pc, int mbrow, MACROBLOCKD *xd, |
- BOOL_DECODER* const bc) { |
- int i; |
- int sb_col; |
- int mb_row, mb_col; |
- int recon_yoffset, recon_uvoffset; |
- int ref_fb_idx = pc->lst_fb_idx; |
- int dst_fb_idx = pc->new_fb_idx; |
- int recon_y_stride = pc->yv12_fb[ref_fb_idx].y_stride; |
- int recon_uv_stride = pc->yv12_fb[ref_fb_idx].uv_stride; |
- int row_delta[4] = { 0, +1, 0, -1}; |
- int col_delta[4] = { +1, -1, +1, +1}; |
- int sb_cols = (pc->mb_cols + 1) >> 1; |
+static void set_offsets(VP9D_COMP *pbi, int block_size, |
+ int mb_row, int mb_col) { |
+ VP9_COMMON *const cm = &pbi->common; |
+ MACROBLOCKD *const xd = &pbi->mb; |
+ const int mis = cm->mode_info_stride; |
+ const int idx = mis * mb_row + mb_col; |
+ const int dst_fb_idx = cm->new_fb_idx; |
+ const int recon_y_stride = cm->yv12_fb[dst_fb_idx].y_stride; |
+ const int recon_uv_stride = cm->yv12_fb[dst_fb_idx].uv_stride; |
+ const int recon_yoffset = mb_row * 16 * recon_y_stride + 16 * mb_col; |
+ const int recon_uvoffset = mb_row * 8 * recon_uv_stride + 8 * mb_col; |
- // For a SB there are 2 left contexts, each pertaining to a MB row within |
- vpx_memset(pc->left_context, 0, sizeof(pc->left_context)); |
+ xd->mode_info_context = cm->mi + idx; |
+ xd->mode_info_context->mbmi.sb_type = block_size >> 5; |
+ xd->prev_mode_info_context = cm->prev_mi + idx; |
+ xd->above_context = cm->above_context + mb_col; |
+ xd->left_context = cm->left_context + (mb_row & 3); |
- mb_row = mbrow; |
- mb_col = 0; |
+ /* Distance of Mb to the various image edges. |
+ * These are specified to 8th pel as they are always compared to |
+ * values that are in 1/8th pel units |
+ */ |
+ block_size >>= 4; // in mb units |
+ xd->mb_to_top_edge = -((mb_row * 16)) << 3; |
+ xd->mb_to_left_edge = -((mb_col * 16) << 3); |
+ xd->mb_to_bottom_edge = ((cm->mb_rows - block_size - mb_row) * 16) << 3; |
+ xd->mb_to_right_edge = ((cm->mb_cols - block_size - mb_col) * 16) << 3; |
- for (sb_col = 0; sb_col < sb_cols; sb_col++) { |
- MODE_INFO *mi = xd->mode_info_context; |
+ xd->up_available = (mb_row != 0); |
+ xd->left_available = (mb_col != 0); |
-#if CONFIG_SUPERBLOCKS |
- mi->mbmi.encoded_as_sb = vp9_read(bc, pc->sb_coded); |
-#endif |
+ xd->dst.y_buffer = cm->yv12_fb[dst_fb_idx].y_buffer + recon_yoffset; |
+ xd->dst.u_buffer = cm->yv12_fb[dst_fb_idx].u_buffer + recon_uvoffset; |
+ xd->dst.v_buffer = cm->yv12_fb[dst_fb_idx].v_buffer + recon_uvoffset; |
+} |
- // Process the 4 MBs within the SB in the order: |
- // top-left, top-right, bottom-left, bottom-right |
- for (i = 0; i < 4; i++) { |
- int dy = row_delta[i]; |
- int dx = col_delta[i]; |
- int offset_extended = dy * xd->mode_info_stride + dx; |
+static void set_refs(VP9D_COMP *pbi, int block_size, |
+ int mb_row, int mb_col) { |
+ VP9_COMMON *const cm = &pbi->common; |
+ MACROBLOCKD *const xd = &pbi->mb; |
+ MODE_INFO *mi = xd->mode_info_context; |
+ MB_MODE_INFO *const mbmi = &mi->mbmi; |
- xd->mb_index = i; |
+ if (mbmi->ref_frame > INTRA_FRAME) { |
+ int ref_fb_idx, ref_yoffset, ref_uvoffset, ref_y_stride, ref_uv_stride; |
- mi = xd->mode_info_context; |
- if ((mb_row >= pc->mb_rows) || (mb_col >= pc->mb_cols)) { |
- // MB lies outside frame, skip on to next |
- mb_row += dy; |
- mb_col += dx; |
- xd->mode_info_context += offset_extended; |
- xd->prev_mode_info_context += offset_extended; |
- continue; |
- } |
-#if CONFIG_SUPERBLOCKS |
- if (i) |
- mi->mbmi.encoded_as_sb = 0; |
-#endif |
+ /* Select the appropriate reference frame for this MB */ |
+ if (mbmi->ref_frame == LAST_FRAME) |
+ ref_fb_idx = cm->lst_fb_idx; |
+ else if (mbmi->ref_frame == GOLDEN_FRAME) |
+ ref_fb_idx = cm->gld_fb_idx; |
+ else |
+ ref_fb_idx = cm->alt_fb_idx; |
- // Set above context pointer |
- xd->above_context = pc->above_context + mb_col; |
- xd->left_context = pc->left_context + (i >> 1); |
+ ref_y_stride = cm->yv12_fb[ref_fb_idx].y_stride; |
+ ref_yoffset = mb_row * 16 * ref_y_stride + 16 * mb_col; |
+ xd->pre.y_buffer = cm->yv12_fb[ref_fb_idx].y_buffer + ref_yoffset; |
+ ref_uv_stride = cm->yv12_fb[ref_fb_idx].uv_stride; |
+ ref_uvoffset = mb_row * 8 * ref_uv_stride + 8 * mb_col; |
+ xd->pre.u_buffer = cm->yv12_fb[ref_fb_idx].u_buffer + ref_uvoffset; |
+ xd->pre.v_buffer = cm->yv12_fb[ref_fb_idx].v_buffer + ref_uvoffset; |
- /* Distance of Mb to the various image edges. |
- * These are specified to 8th pel as they are always compared to |
- * values that are in 1/8th pel units |
- */ |
- xd->mb_to_top_edge = -((mb_row * 16)) << 3; |
- xd->mb_to_left_edge = -((mb_col * 16) << 3); |
-#if CONFIG_SUPERBLOCKS |
- if (mi->mbmi.encoded_as_sb) { |
- xd->mb_to_bottom_edge = ((pc->mb_rows - 2 - mb_row) * 16) << 3; |
- xd->mb_to_right_edge = ((pc->mb_cols - 2 - mb_col) * 16) << 3; |
- } else { |
-#endif |
- xd->mb_to_bottom_edge = ((pc->mb_rows - 1 - mb_row) * 16) << 3; |
- xd->mb_to_right_edge = ((pc->mb_cols - 1 - mb_col) * 16) << 3; |
-#if CONFIG_SUPERBLOCKS |
+ /* propagate errors from reference frames */ |
+ xd->corrupted |= cm->yv12_fb[ref_fb_idx].corrupted; |
+ |
+ if (mbmi->second_ref_frame > INTRA_FRAME) { |
+ int second_ref_fb_idx; |
+ |
+ /* Select the appropriate reference frame for this MB */ |
+ if (mbmi->second_ref_frame == LAST_FRAME) |
+ second_ref_fb_idx = cm->lst_fb_idx; |
+ else if (mbmi->second_ref_frame == GOLDEN_FRAME) |
+ second_ref_fb_idx = cm->gld_fb_idx; |
+ else |
+ second_ref_fb_idx = cm->alt_fb_idx; |
+ |
+ xd->second_pre.y_buffer = |
+ cm->yv12_fb[second_ref_fb_idx].y_buffer + ref_yoffset; |
+ xd->second_pre.u_buffer = |
+ cm->yv12_fb[second_ref_fb_idx].u_buffer + ref_uvoffset; |
+ xd->second_pre.v_buffer = |
+ cm->yv12_fb[second_ref_fb_idx].v_buffer + ref_uvoffset; |
+ |
+ /* propagate errors from reference frames */ |
+ xd->corrupted |= cm->yv12_fb[second_ref_fb_idx].corrupted; |
+ } |
+ } |
+ |
+ if (mbmi->sb_type) { |
+ const int n_mbs = 1 << mbmi->sb_type; |
+ const int y_mbs = MIN(n_mbs, cm->mb_rows - mb_row); |
+ const int x_mbs = MIN(n_mbs, cm->mb_cols - mb_col); |
+ const int mis = cm->mode_info_stride; |
+ int x, y; |
+ |
+ for (y = 0; y < y_mbs; y++) { |
+ for (x = !y; x < x_mbs; x++) { |
+ mi[y * mis + x] = *mi; |
} |
-#endif |
-#ifdef DEC_DEBUG |
- dec_debug = (pbi->common.current_video_frame == 1 && |
- mb_row == 2 && mb_col == 8); |
- if (dec_debug) |
-#if CONFIG_SUPERBLOCKS |
- printf("Enter Debug %d %d sb %d\n", mb_row, mb_col, |
- mi->mbmi.encoded_as_sb); |
-#else |
- printf("Enter Debug %d %d\n", mb_row, mb_col); |
-#endif |
-#endif |
- xd->up_available = (mb_row != 0); |
- xd->left_available = (mb_col != 0); |
+ } |
+ } |
+} |
+/* Decode a row of Superblocks (2x2 region of MBs) */ |
+static void decode_sb_row(VP9D_COMP *pbi, VP9_COMMON *pc, |
+ int mb_row, MACROBLOCKD *xd, |
+ BOOL_DECODER* const bc) { |
+ int mb_col; |
- recon_yoffset = (mb_row * recon_y_stride * 16) + (mb_col * 16); |
- recon_uvoffset = (mb_row * recon_uv_stride * 8) + (mb_col * 8); |
+ // For a SB there are 2 left contexts, each pertaining to a MB row within |
+ vpx_memset(pc->left_context, 0, sizeof(pc->left_context)); |
- xd->dst.y_buffer = pc->yv12_fb[dst_fb_idx].y_buffer + recon_yoffset; |
- xd->dst.u_buffer = pc->yv12_fb[dst_fb_idx].u_buffer + recon_uvoffset; |
- xd->dst.v_buffer = pc->yv12_fb[dst_fb_idx].v_buffer + recon_uvoffset; |
- |
+ for (mb_col = 0; mb_col < pc->mb_cols; mb_col += 4) { |
+ if (vp9_read(bc, pc->sb64_coded)) { |
+ set_offsets(pbi, 64, mb_row, mb_col); |
vp9_decode_mb_mode_mv(pbi, xd, mb_row, mb_col, bc); |
+ set_refs(pbi, 64, mb_row, mb_col); |
+ decode_superblock64(pbi, xd, mb_row, mb_col, bc); |
+ xd->corrupted |= bool_error(bc); |
+ } else { |
+ int j; |
- update_blockd_bmi(xd); |
-#ifdef DEC_DEBUG |
- if (dec_debug) |
- printf("Hello\n"); |
-#endif |
+ for (j = 0; j < 4; j++) { |
+ const int x_idx_sb = (j & 1) << 1, y_idx_sb = j & 2; |
- /* Select the appropriate reference frame for this MB */ |
- if (xd->mode_info_context->mbmi.ref_frame == LAST_FRAME) |
- ref_fb_idx = pc->lst_fb_idx; |
- else if (xd->mode_info_context->mbmi.ref_frame == GOLDEN_FRAME) |
- ref_fb_idx = pc->gld_fb_idx; |
- else |
- ref_fb_idx = pc->alt_fb_idx; |
+ if (mb_row + y_idx_sb >= pc->mb_rows || |
+ mb_col + x_idx_sb >= pc->mb_cols) { |
+ // MB lies outside frame, skip on to next |
+ continue; |
+ } |
- xd->pre.y_buffer = pc->yv12_fb[ref_fb_idx].y_buffer + recon_yoffset; |
- xd->pre.u_buffer = pc->yv12_fb[ref_fb_idx].u_buffer + recon_uvoffset; |
- xd->pre.v_buffer = pc->yv12_fb[ref_fb_idx].v_buffer + recon_uvoffset; |
+ xd->sb_index = j; |
- if (xd->mode_info_context->mbmi.second_ref_frame > 0) { |
- int second_ref_fb_idx; |
+ if (vp9_read(bc, pc->sb32_coded)) { |
+ set_offsets(pbi, 32, mb_row + y_idx_sb, mb_col + x_idx_sb); |
+ vp9_decode_mb_mode_mv(pbi, |
+ xd, mb_row + y_idx_sb, mb_col + x_idx_sb, bc); |
+ set_refs(pbi, 32, mb_row + y_idx_sb, mb_col + x_idx_sb); |
+ decode_superblock32(pbi, |
+ xd, mb_row + y_idx_sb, mb_col + x_idx_sb, bc); |
+ xd->corrupted |= bool_error(bc); |
+ } else { |
+ int i; |
- /* Select the appropriate reference frame for this MB */ |
- if (xd->mode_info_context->mbmi.second_ref_frame == LAST_FRAME) |
- second_ref_fb_idx = pc->lst_fb_idx; |
- else if (xd->mode_info_context->mbmi.second_ref_frame == |
- GOLDEN_FRAME) |
- second_ref_fb_idx = pc->gld_fb_idx; |
- else |
- second_ref_fb_idx = pc->alt_fb_idx; |
+ // Process the 4 MBs within the SB in the order: |
+ // top-left, top-right, bottom-left, bottom-right |
+ for (i = 0; i < 4; i++) { |
+ const int x_idx = x_idx_sb + (i & 1), y_idx = y_idx_sb + (i >> 1); |
- xd->second_pre.y_buffer = |
- pc->yv12_fb[second_ref_fb_idx].y_buffer + recon_yoffset; |
- xd->second_pre.u_buffer = |
- pc->yv12_fb[second_ref_fb_idx].u_buffer + recon_uvoffset; |
- xd->second_pre.v_buffer = |
- pc->yv12_fb[second_ref_fb_idx].v_buffer + recon_uvoffset; |
- } |
+ if (mb_row + y_idx >= pc->mb_rows || |
+ mb_col + x_idx >= pc->mb_cols) { |
+ // MB lies outside frame, skip on to next |
+ continue; |
+ } |
- if (xd->mode_info_context->mbmi.ref_frame != INTRA_FRAME) { |
- /* propagate errors from reference frames */ |
- xd->corrupted |= pc->yv12_fb[ref_fb_idx].corrupted; |
- } |
+ set_offsets(pbi, 16, mb_row + y_idx, mb_col + x_idx); |
+ xd->mb_index = i; |
+ vp9_decode_mb_mode_mv(pbi, xd, mb_row + y_idx, mb_col + x_idx, bc); |
+ update_blockd_bmi(xd); |
+ set_refs(pbi, 16, mb_row + y_idx, mb_col + x_idx); |
+ vp9_intra_prediction_down_copy(xd); |
+ decode_macroblock(pbi, xd, mb_row, mb_col, bc); |
-#if CONFIG_SUPERBLOCKS |
- if (xd->mode_info_context->mbmi.encoded_as_sb) { |
- if (mb_col < pc->mb_cols - 1) |
- mi[1] = mi[0]; |
- if (mb_row < pc->mb_rows - 1) { |
- mi[pc->mode_info_stride] = mi[0]; |
- if (mb_col < pc->mb_cols - 1) |
- mi[pc->mode_info_stride + 1] = mi[0]; |
+ /* check if the boolean decoder has suffered an error */ |
+ xd->corrupted |= bool_error(bc); |
+ } |
} |
} |
- if (xd->mode_info_context->mbmi.encoded_as_sb) { |
- decode_superblock(pbi, xd, mb_row, mb_col, bc); |
- } else { |
-#endif |
- vp9_intra_prediction_down_copy(xd); |
- decode_macroblock(pbi, xd, mb_row, mb_col, bc); |
-#if CONFIG_SUPERBLOCKS |
- } |
-#endif |
- |
- /* check if the boolean decoder has suffered an error */ |
- xd->corrupted |= bool_error(bc); |
- |
-#if CONFIG_SUPERBLOCKS |
- if (mi->mbmi.encoded_as_sb) { |
- assert(!i); |
- mb_col += 2; |
- xd->mode_info_context += 2; |
- xd->prev_mode_info_context += 2; |
- break; |
- } |
-#endif |
- |
- // skip to next MB |
- xd->mode_info_context += offset_extended; |
- xd->prev_mode_info_context += offset_extended; |
- mb_row += dy; |
- mb_col += dx; |
} |
} |
- |
- /* skip prediction column */ |
- xd->mode_info_context += 1 - (pc->mb_cols & 0x1) + xd->mode_info_stride; |
- xd->prev_mode_info_context += 1 - (pc->mb_cols & 0x1) + xd->mode_info_stride; |
} |
static unsigned int read_partition_size(const unsigned char *cx_size) { |
@@ -1210,14 +1336,13 @@ |
} |
-static void read_coef_probs_common( |
- BOOL_DECODER* const bc, |
- vp9_prob coef_probs[BLOCK_TYPES][COEF_BANDS] |
- [PREV_COEF_CONTEXTS][ENTROPY_NODES]) { |
+static void read_coef_probs_common(BOOL_DECODER* const bc, |
+ vp9_coeff_probs *coef_probs, |
+ int block_types) { |
int i, j, k, l; |
if (vp9_read_bit(bc)) { |
- for (i = 0; i < BLOCK_TYPES; i++) { |
+ for (i = 0; i < block_types; i++) { |
for (j = !i; j < COEF_BANDS; j++) { |
/* NB: This j loop starts from 1 on block type i == 0 */ |
for (k = 0; k < PREV_COEF_CONTEXTS; k++) { |
@@ -1240,17 +1365,21 @@ |
static void read_coef_probs(VP9D_COMP *pbi, BOOL_DECODER* const bc) { |
VP9_COMMON *const pc = &pbi->common; |
- read_coef_probs_common(bc, pc->fc.coef_probs); |
- read_coef_probs_common(bc, pc->fc.hybrid_coef_probs); |
+ read_coef_probs_common(bc, pc->fc.coef_probs_4x4, BLOCK_TYPES_4X4); |
+ read_coef_probs_common(bc, pc->fc.hybrid_coef_probs_4x4, BLOCK_TYPES_4X4); |
if (pbi->common.txfm_mode != ONLY_4X4) { |
- read_coef_probs_common(bc, pc->fc.coef_probs_8x8); |
- read_coef_probs_common(bc, pc->fc.hybrid_coef_probs_8x8); |
+ read_coef_probs_common(bc, pc->fc.coef_probs_8x8, BLOCK_TYPES_8X8); |
+ read_coef_probs_common(bc, pc->fc.hybrid_coef_probs_8x8, BLOCK_TYPES_8X8); |
} |
if (pbi->common.txfm_mode > ALLOW_8X8) { |
- read_coef_probs_common(bc, pc->fc.coef_probs_16x16); |
- read_coef_probs_common(bc, pc->fc.hybrid_coef_probs_16x16); |
+ read_coef_probs_common(bc, pc->fc.coef_probs_16x16, BLOCK_TYPES_16X16); |
+ read_coef_probs_common(bc, pc->fc.hybrid_coef_probs_16x16, |
+ BLOCK_TYPES_16X16); |
} |
+ if (pbi->common.txfm_mode > ALLOW_16X16) { |
+ read_coef_probs_common(bc, pc->fc.coef_probs_32x32, BLOCK_TYPES_32X32); |
+ } |
} |
int vp9_decode_frame(VP9D_COMP *pbi, const unsigned char **p_data_end) { |
@@ -1435,15 +1564,17 @@ |
} |
} |
-#if CONFIG_SUPERBLOCKS |
- pc->sb_coded = vp9_read_literal(&header_bc, 8); |
-#endif |
+ pc->sb64_coded = vp9_read_literal(&header_bc, 8); |
+ pc->sb32_coded = vp9_read_literal(&header_bc, 8); |
/* Read the loop filter level and type */ |
pc->txfm_mode = vp9_read_literal(&header_bc, 2); |
+ if (pc->txfm_mode == 3) |
+ pc->txfm_mode += vp9_read_bit(&header_bc); |
if (pc->txfm_mode == TX_MODE_SELECT) { |
pc->prob_tx[0] = vp9_read_literal(&header_bc, 8); |
pc->prob_tx[1] = vp9_read_literal(&header_bc, 8); |
+ pc->prob_tx[2] = vp9_read_literal(&header_bc, 8); |
} |
pc->filter_type = (LOOPFILTERTYPE) vp9_read_bit(&header_bc); |
@@ -1575,6 +1706,33 @@ |
} |
} |
+#if CONFIG_NEW_MVREF |
+ // If Key frame reset mv ref id probabilities to defaults |
+ if (pc->frame_type == KEY_FRAME) { |
+ // Defaults probabilities for encoding the MV ref id signal |
+ vpx_memset(xd->mb_mv_ref_probs, VP9_DEFAULT_MV_REF_PROB, |
+ sizeof(xd->mb_mv_ref_probs)); |
+ } else { |
+ // Read any mv_ref index probability updates |
+ int i, j; |
+ |
+ for (i = 0; i < MAX_REF_FRAMES; ++i) { |
+ // Skip the dummy entry for intra ref frame. |
+ if (i == INTRA_FRAME) { |
+ continue; |
+ } |
+ |
+ // Read any updates to probabilities |
+ for (j = 0; j < MAX_MV_REF_CANDIDATES - 1; ++j) { |
+ if (vp9_read(&header_bc, VP9_MVREF_UPDATE_PROB)) { |
+ xd->mb_mv_ref_probs[i][j] = |
+ (vp9_prob)vp9_read_literal(&header_bc, 8); |
+ } |
+ } |
+ } |
+ } |
+#endif |
+ |
if (0) { |
FILE *z = fopen("decodestats.stt", "a"); |
fprintf(z, "%6d F:%d,G:%d,A:%d,L:%d,Q:%d\n", |
@@ -1587,10 +1745,10 @@ |
fclose(z); |
} |
- vp9_copy(pbi->common.fc.pre_coef_probs, |
- pbi->common.fc.coef_probs); |
- vp9_copy(pbi->common.fc.pre_hybrid_coef_probs, |
- pbi->common.fc.hybrid_coef_probs); |
+ vp9_copy(pbi->common.fc.pre_coef_probs_4x4, |
+ pbi->common.fc.coef_probs_4x4); |
+ vp9_copy(pbi->common.fc.pre_hybrid_coef_probs_4x4, |
+ pbi->common.fc.hybrid_coef_probs_4x4); |
vp9_copy(pbi->common.fc.pre_coef_probs_8x8, |
pbi->common.fc.coef_probs_8x8); |
vp9_copy(pbi->common.fc.pre_hybrid_coef_probs_8x8, |
@@ -1599,10 +1757,10 @@ |
pbi->common.fc.coef_probs_16x16); |
vp9_copy(pbi->common.fc.pre_hybrid_coef_probs_16x16, |
pbi->common.fc.hybrid_coef_probs_16x16); |
+ vp9_copy(pbi->common.fc.pre_coef_probs_32x32, |
+ pbi->common.fc.coef_probs_32x32); |
vp9_copy(pbi->common.fc.pre_ymode_prob, pbi->common.fc.ymode_prob); |
-#if CONFIG_SUPERBLOCKS |
vp9_copy(pbi->common.fc.pre_sb_ymode_prob, pbi->common.fc.sb_ymode_prob); |
-#endif |
vp9_copy(pbi->common.fc.pre_uv_mode_prob, pbi->common.fc.uv_mode_prob); |
vp9_copy(pbi->common.fc.pre_bmode_prob, pbi->common.fc.bmode_prob); |
vp9_copy(pbi->common.fc.pre_i8x8_mode_prob, pbi->common.fc.i8x8_mode_prob); |
@@ -1612,16 +1770,15 @@ |
pbi->common.fc.pre_interintra_prob = pbi->common.fc.interintra_prob; |
#endif |
pbi->common.fc.pre_nmvc = pbi->common.fc.nmvc; |
- vp9_zero(pbi->common.fc.coef_counts); |
- vp9_zero(pbi->common.fc.hybrid_coef_counts); |
+ vp9_zero(pbi->common.fc.coef_counts_4x4); |
+ vp9_zero(pbi->common.fc.hybrid_coef_counts_4x4); |
vp9_zero(pbi->common.fc.coef_counts_8x8); |
vp9_zero(pbi->common.fc.hybrid_coef_counts_8x8); |
vp9_zero(pbi->common.fc.coef_counts_16x16); |
vp9_zero(pbi->common.fc.hybrid_coef_counts_16x16); |
+ vp9_zero(pbi->common.fc.coef_counts_32x32); |
vp9_zero(pbi->common.fc.ymode_counts); |
-#if CONFIG_SUPERBLOCKS |
vp9_zero(pbi->common.fc.sb_ymode_counts); |
-#endif |
vp9_zero(pbi->common.fc.uv_mode_counts); |
vp9_zero(pbi->common.fc.bmode_counts); |
vp9_zero(pbi->common.fc.i8x8_mode_counts); |
@@ -1660,12 +1817,8 @@ |
vpx_memset(pc->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES) * pc->mb_cols); |
- // Resset the macroblock mode info context to the start of the list |
- xd->mode_info_context = pc->mi; |
- xd->prev_mode_info_context = pc->prev_mi; |
- |
/* Decode a row of superblocks */ |
- for (mb_row = 0; mb_row < pc->mb_rows; mb_row += 2) { |
+ for (mb_row = 0; mb_row < pc->mb_rows; mb_row += 4) { |
decode_sb_row(pbi, pc, mb_row, xd, &residual_bc); |
} |
corrupt_tokens |= xd->corrupted; |