Index: source/libvpx/vp9/decoder/vp9_decodframe.c |
=================================================================== |
--- source/libvpx/vp9/decoder/vp9_decodframe.c (revision 207064) |
+++ source/libvpx/vp9/decoder/vp9_decodframe.c (working copy) |
@@ -20,7 +20,6 @@ |
#include "vp9/common/vp9_reconintra.h" |
#include "vp9/common/vp9_reconinter.h" |
#include "vp9/common/vp9_entropy.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" |
@@ -199,14 +198,14 @@ |
static void decode_block(int plane, int block, BLOCK_SIZE_TYPE bsize, |
int ss_txfrm_size, void *arg) { |
MACROBLOCKD* const xd = arg; |
- int16_t* const qcoeff = BLOCK_OFFSET(xd->plane[plane].qcoeff, block, 16); |
- const int stride = xd->plane[plane].dst.stride; |
+ struct macroblockd_plane *pd = &xd->plane[plane]; |
+ int16_t* const qcoeff = BLOCK_OFFSET(pd->qcoeff, block, 16); |
+ const int stride = pd->dst.stride; |
const int raster_block = txfrm_block_to_raster_block(xd, bsize, plane, |
block, ss_txfrm_size); |
uint8_t* const dst = raster_block_offset_uint8(xd, bsize, plane, |
raster_block, |
- xd->plane[plane].dst.buf, |
- stride); |
+ pd->dst.buf, stride); |
TX_TYPE tx_type; |
@@ -214,23 +213,20 @@ |
case TX_4X4: |
tx_type = plane == 0 ? get_tx_type_4x4(xd, raster_block) : DCT_DCT; |
if (tx_type == DCT_DCT) |
- xd->itxm_add(qcoeff, dst, stride, xd->plane[plane].eobs[block]); |
+ xd->itxm_add(qcoeff, dst, stride, pd->eobs[block]); |
else |
- vp9_iht_add_c(tx_type, qcoeff, dst, stride, |
- xd->plane[plane].eobs[block]); |
+ vp9_iht_add_c(tx_type, qcoeff, dst, stride, pd->eobs[block]); |
break; |
case TX_8X8: |
tx_type = plane == 0 ? get_tx_type_8x8(xd, raster_block) : DCT_DCT; |
- vp9_iht_add_8x8_c(tx_type, qcoeff, dst, stride, |
- xd->plane[plane].eobs[block]); |
+ vp9_iht_add_8x8_c(tx_type, qcoeff, dst, stride, pd->eobs[block]); |
break; |
case TX_16X16: |
tx_type = plane == 0 ? get_tx_type_16x16(xd, raster_block) : DCT_DCT; |
- vp9_iht_add_16x16_c(tx_type, qcoeff, dst, stride, |
- xd->plane[plane].eobs[block]); |
+ vp9_iht_add_16x16_c(tx_type, qcoeff, dst, stride, pd->eobs[block]); |
break; |
case TX_32X32: |
- vp9_idct_add_32x32(qcoeff, dst, stride, xd->plane[plane].eobs[block]); |
+ vp9_idct_add_32x32(qcoeff, dst, stride, pd->eobs[block]); |
break; |
} |
} |
@@ -238,65 +234,40 @@ |
static void decode_block_intra(int plane, int block, BLOCK_SIZE_TYPE bsize, |
int ss_txfrm_size, void *arg) { |
MACROBLOCKD* const xd = arg; |
- int16_t* const qcoeff = BLOCK_OFFSET(xd->plane[plane].qcoeff, block, 16); |
- const int stride = xd->plane[plane].dst.stride; |
+ struct macroblockd_plane *pd = &xd->plane[plane]; |
+ |
const int raster_block = txfrm_block_to_raster_block(xd, bsize, plane, |
block, ss_txfrm_size); |
uint8_t* const dst = raster_block_offset_uint8(xd, bsize, plane, |
raster_block, |
- xd->plane[plane].dst.buf, |
- stride); |
+ pd->dst.buf, pd->dst.stride); |
const TX_SIZE tx_size = (TX_SIZE)(ss_txfrm_size / 2); |
- TX_TYPE tx_type; |
- int mode, b_mode; |
+ int b_mode; |
int plane_b_size; |
- int tx_ib = raster_block >> tx_size; |
- mode = plane == 0? xd->mode_info_context->mbmi.mode: |
- xd->mode_info_context->mbmi.uv_mode; |
+ const int tx_ib = raster_block >> tx_size; |
+ const int mode = plane == 0 ? xd->mode_info_context->mbmi.mode |
+ : xd->mode_info_context->mbmi.uv_mode; |
- if (xd->mode_info_context->mbmi.sb_type < BLOCK_SIZE_SB8X8 && plane == 0) { |
+ if (plane == 0 && xd->mode_info_context->mbmi.sb_type < BLOCK_SIZE_SB8X8) { |
assert(bsize == BLOCK_SIZE_SB8X8); |
b_mode = xd->mode_info_context->bmi[raster_block].as_mode.first; |
} else { |
b_mode = mode; |
} |
- if (xd->mb_to_right_edge < 0 || xd->mb_to_bottom_edge < 0) { |
+ if (xd->mb_to_right_edge < 0 || xd->mb_to_bottom_edge < 0) |
extend_for_intra(xd, plane, block, bsize, ss_txfrm_size); |
- } |
- plane_b_size = b_width_log2(bsize) - xd->plane[plane].subsampling_x; |
- vp9_predict_intra_block(xd, tx_ib, plane_b_size, tx_size, |
- b_mode, dst, xd->plane[plane].dst.stride); |
+ plane_b_size = b_width_log2(bsize) - pd->subsampling_x; |
+ vp9_predict_intra_block(xd, tx_ib, plane_b_size, tx_size, b_mode, |
+ dst, pd->dst.stride); |
// Early exit if there are no coefficients |
if (xd->mode_info_context->mbmi.mb_skip_coeff) |
return; |
- switch (ss_txfrm_size / 2) { |
- case TX_4X4: |
- tx_type = plane == 0 ? get_tx_type_4x4(xd, raster_block) : DCT_DCT; |
- if (tx_type == DCT_DCT) |
- xd->itxm_add(qcoeff, dst, stride, xd->plane[plane].eobs[block]); |
- else |
- vp9_iht_add_c(tx_type, qcoeff, dst, stride, |
- xd->plane[plane].eobs[block]); |
- break; |
- case TX_8X8: |
- tx_type = plane == 0 ? get_tx_type_8x8(xd, raster_block) : DCT_DCT; |
- vp9_iht_add_8x8_c(tx_type, qcoeff, dst, stride, |
- xd->plane[plane].eobs[block]); |
- break; |
- case TX_16X16: |
- tx_type = plane == 0 ? get_tx_type_16x16(xd, raster_block) : DCT_DCT; |
- vp9_iht_add_16x16_c(tx_type, qcoeff, dst, stride, |
- xd->plane[plane].eobs[block]); |
- break; |
- case TX_32X32: |
- vp9_idct_add_32x32(qcoeff, dst, stride, xd->plane[plane].eobs[block]); |
- break; |
- } |
+ decode_block(plane, block, bsize, ss_txfrm_size, arg); |
} |
static void decode_atom(VP9D_COMP *pbi, MACROBLOCKD *xd, |
@@ -315,13 +286,11 @@ |
if (mbmi->mb_skip_coeff) { |
vp9_reset_sb_tokens_context(xd, bsize); |
} else { |
- // re-initialize macroblock dequantizer before detokenization |
if (xd->segmentation_enabled) |
mb_init_dequantizer(&pbi->common, xd); |
- if (!vp9_reader_has_error(r)) { |
- vp9_decode_tokens(pbi, xd, r, bsize); |
- } |
+ if (!vp9_reader_has_error(r)) |
+ vp9_decode_tokens(pbi, r, bsize); |
foreach_transformed_block(xd, bsize, decode_block, xd); |
} |
@@ -334,13 +303,11 @@ |
if (mbmi->mb_skip_coeff) { |
vp9_reset_sb_tokens_context(xd, bsize); |
} else { |
- // re-initialize macroblock dequantizer before detokenization |
if (xd->segmentation_enabled) |
mb_init_dequantizer(&pbi->common, xd); |
- if (!vp9_reader_has_error(r)) { |
- vp9_decode_tokens(pbi, xd, r, bsize); |
- } |
+ if (!vp9_reader_has_error(r)) |
+ vp9_decode_tokens(pbi, r, bsize); |
} |
foreach_transformed_block(xd, bsize, decode_block_intra, xd); |
@@ -374,7 +341,7 @@ |
mb_init_dequantizer(pc, xd); |
// dequantization and idct |
- eobtotal = vp9_decode_tokens(pbi, xd, r, bsize); |
+ eobtotal = vp9_decode_tokens(pbi, r, bsize); |
if (eobtotal == 0) { // skip loopfilter |
for (n = 0; n < bw * bh; n++) { |
const int x_idx = n & (bw - 1), y_idx = n >> bwl; |
@@ -390,10 +357,10 @@ |
static void set_offsets(VP9D_COMP *pbi, BLOCK_SIZE_TYPE bsize, |
int mi_row, int mi_col) { |
- const int bh = 1 << mi_height_log2(bsize); |
- const int bw = 1 << mi_width_log2(bsize); |
VP9_COMMON *const cm = &pbi->common; |
MACROBLOCKD *const xd = &pbi->mb; |
+ const int bh = 1 << mi_height_log2(bsize); |
+ const int bw = 1 << mi_width_log2(bsize); |
const int mi_idx = mi_row * cm->mode_info_stride + mi_col; |
int i; |
@@ -401,14 +368,14 @@ |
xd->mode_info_context->mbmi.sb_type = bsize; |
// Special case: if prev_mi is NULL, the previous mode info context |
// cannot be used. |
- xd->prev_mode_info_context = cm->prev_mi ? |
- cm->prev_mi + mi_idx : NULL; |
+ xd->prev_mode_info_context = cm->prev_mi ? cm->prev_mi + mi_idx : NULL; |
for (i = 0; i < MAX_MB_PLANE; i++) { |
- xd->plane[i].above_context = cm->above_context[i] + |
- (mi_col * 2 >> xd->plane[i].subsampling_x); |
- xd->plane[i].left_context = cm->left_context[i] + |
- (((mi_row * 2) & 15) >> xd->plane[i].subsampling_y); |
+ struct macroblockd_plane *pd = &xd->plane[i]; |
+ pd->above_context = cm->above_context[i] + |
+ (mi_col * 2 >> pd->subsampling_x); |
+ pd->left_context = cm->left_context[i] + |
+ (((mi_row * 2) & 15) >> pd->subsampling_y); |
} |
xd->above_seg_context = cm->above_seg_context + mi_col; |
xd->left_seg_context = cm->left_seg_context + (mi_row & MI_MASK); |
@@ -474,8 +441,7 @@ |
vp9_reader* r, BLOCK_SIZE_TYPE bsize) { |
VP9_COMMON *const pc = &pbi->common; |
MACROBLOCKD *const xd = &pbi->mb; |
- int bsl = mi_width_log2(bsize), bs = (1 << bsl) / 2; |
- int n; |
+ int bs = (1 << mi_width_log2(bsize)) / 2, n; |
PARTITION_TYPE partition = PARTITION_NONE; |
BLOCK_SIZE_TYPE subsize; |
@@ -563,26 +529,22 @@ |
static void read_coef_probs_common(FRAME_CONTEXT *fc, TX_SIZE tx_size, |
vp9_reader *r) { |
- const int entropy_nodes_update = UNCONSTRAINED_NODES; |
vp9_coeff_probs_model *coef_probs = fc->coef_probs[tx_size]; |
- int i, j, k, l, m; |
- |
if (vp9_read_bit(r)) { |
+ int i, j, k, l, m; |
for (i = 0; i < BLOCK_TYPES; i++) { |
for (j = 0; j < REF_TYPES; j++) { |
for (k = 0; k < COEF_BANDS; k++) { |
for (l = 0; l < PREV_COEF_CONTEXTS; l++) { |
- const int mstart = 0; |
if (l >= 3 && k == 0) |
continue; |
- for (m = mstart; m < entropy_nodes_update; m++) { |
+ for (m = 0; m < UNCONSTRAINED_NODES; m++) { |
vp9_prob *const p = coef_probs[i][j][k][l] + m; |
- if (vp9_read(r, VP9_COEF_UPDATE_PROB)) { |
+ if (vp9_read(r, VP9_COEF_UPDATE_PROB)) |
*p = vp9_read_prob_diff_update(r, *p); |
- } |
} |
} |
} |
@@ -1118,8 +1080,7 @@ |
cm->frame_context_idx = vp9_rb_read_literal(rb, NUM_FRAME_CONTEXTS_LG2); |
- if ((cm->frame_type == KEY_FRAME) || |
- cm->error_resilient_mode || cm->intra_only) |
+ if (cm->frame_type == KEY_FRAME || cm->error_resilient_mode || cm->intra_only) |
vp9_setup_past_independence(cm, xd); |
setup_loopfilter(pbi, rb); |