return;
set_offsets(pbi, bsize, mi_row, mi_col);
- vp9_decode_mb_mode_mv(pbi, xd, mi_row, mi_col, r);
+ vp9_read_mode_info(pbi, mi_row, mi_col, r);
- if (xd->mode_info_context->mbmi.ref_frame[0] == INTRA_FRAME) {
- decode_sb_intra(pbi, mi_row, mi_col, r,
- (bsize < BLOCK_SIZE_SB8X8) ? BLOCK_SIZE_SB8X8 : bsize);
+ if (less8x8)
+ bsize = BLOCK_SIZE_SB8X8;
+
+ // Has to be called after set_offsets
+ mbmi = &xd->mode_info_context->mbmi;
+
+ if (mbmi->ref_frame[0] == INTRA_FRAME) {
+ // Intra reconstruction
+ decode_tokens(pbi, bsize, r);
+ foreach_transformed_block(xd, bsize, decode_block_intra, xd);
} else {
+ // Inter reconstruction
+ int eobtotal;
set_refs(pbi, mi_row, mi_col);
- if (bsize < BLOCK_SIZE_SB8X8)
- decode_atom(pbi, mi_row, mi_col, r);
- else
- decode_sb(pbi, mi_row, mi_col, r, bsize);
+ vp9_setup_interp_filters(xd, mbmi->interp_filter, cm);
+ vp9_build_inter_predictors_sb(xd, mi_row, mi_col, bsize);
+ eobtotal = decode_tokens(pbi, bsize, r);
+ if (less8x8) {
+ if (eobtotal >= 0)
+ foreach_transformed_block(xd, bsize, decode_block, xd);
+ } else {
+ assert(mbmi->sb_type == bsize);
+ if (eobtotal == 0)
+ vp9_set_pred_flag(xd, bsize, PRED_MBSKIP, 1); // skip loopfilter
+ else if (eobtotal > 0)
+ foreach_transformed_block(xd, bsize, decode_block, xd);
+ }
}
xd->corrupted |= vp9_reader_has_error(r);
}