void vp9_tokenize_sb(VP9_COMP *cpi, TOKENEXTRA **t, int dry_run, BLOCK_SIZE_TYPE bsize) { VP9_COMMON *const cm = &cpi->common; MACROBLOCKD *const xd = &cpi->mb.e_mbd; MB_MODE_INFO *const mbmi = &xd->mode_info_context->mbmi; TOKENEXTRA *t_backup = *t; const int mb_skip_context = vp9_get_pred_context_mbskip(xd); const int skip_inc = !vp9_segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP); struct tokenize_b_args arg = {cpi, xd, t, mbmi->txfm_size}; mbmi->skip_coeff = vp9_sb_is_skippable(xd, bsize); if (mbmi->skip_coeff) { if (!dry_run) cm->counts.mbskip[mb_skip_context][1] += skip_inc; reset_skip_context(xd, bsize); if (dry_run) *t = t_backup; return; } if (!dry_run) { cm->counts.mbskip[mb_skip_context][0] += skip_inc; foreach_transformed_block(xd, bsize, tokenize_b, &arg); } else { foreach_transformed_block(xd, bsize, set_entropy_context_b, &arg); *t = t_backup; } }
static uint8_t read_skip_coeff(VP9_COMMON *const cm, MACROBLOCKD *const xd, int segment_id, vp9_reader *r) { int skip_coeff = vp9_segfeature_active(&cm->seg, segment_id, SEG_LVL_SKIP); if (!skip_coeff) { const int ctx = vp9_get_pred_context_mbskip(xd); skip_coeff = vp9_read(r, vp9_get_pred_prob_mbskip(cm, xd)); if (!cm->frame_parallel_decoding_mode) ++cm->counts.mbskip[ctx][skip_coeff]; } return skip_coeff; }