static void write_modes_b(VP9_COMP *cpi, const TileInfo *const tile, vpx_writer *w, TOKENEXTRA **tok, const TOKENEXTRA *const tok_end, int mi_row, int mi_col) { const VP9_COMMON *const cm = &cpi->common; MACROBLOCKD *const xd = &cpi->td.mb.e_mbd; MODE_INFO *m; xd->mi = cm->mi_grid_visible + (mi_row * cm->mi_stride + mi_col); m = xd->mi[0]; cpi->td.mb.mbmi_ext = cpi->td.mb.mbmi_ext_base + (mi_row * cm->mi_cols + mi_col); set_mi_row_col(xd, tile, mi_row, num_8x8_blocks_high_lookup[m->sb_type], mi_col, num_8x8_blocks_wide_lookup[m->sb_type], cm->mi_rows, cm->mi_cols); if (frame_is_intra_only(cm)) { write_mb_modes_kf(cm, xd, xd->mi, w); } else { pack_inter_mode_mvs(cpi, m, w); } assert(*tok < tok_end); pack_mb_tokens(w, tok, tok_end, cm->bit_depth); }
static void count_segs(const AV1_COMMON *cm, MACROBLOCKD *xd, const TileInfo *tile, MODE_INFO **mi, unsigned *no_pred_segcounts, unsigned (*temporal_predictor_count)[2], unsigned *t_unpred_seg_counts, int bw, int bh, int mi_row, int mi_col) { int segment_id; if (mi_row >= cm->mi_rows || mi_col >= cm->mi_cols) return; xd->mi = mi; segment_id = xd->mi[0]->mbmi.segment_id; #if CONFIG_DEPENDENT_HORZTILES set_mi_row_col(xd, tile, mi_row, bh, mi_col, bw, cm->mi_rows, cm->mi_cols, cm->dependent_horz_tiles); #else set_mi_row_col(xd, tile, mi_row, bh, mi_col, bw, cm->mi_rows, cm->mi_cols); #endif // Count the number of hits on each segment with no prediction no_pred_segcounts[segment_id]++; // Temporal prediction not allowed on key frames if (cm->frame_type != KEY_FRAME) { const BLOCK_SIZE bsize = xd->mi[0]->mbmi.sb_type; // Test to see if the segment id matches the predicted value. const int pred_segment_id = get_segment_id(cm, cm->last_frame_seg_map, bsize, mi_row, mi_col); const int pred_flag = pred_segment_id == segment_id; const int pred_context = av1_get_pred_context_seg_id(xd); // Store the prediction status for this mb and update counts // as appropriate xd->mi[0]->mbmi.seg_id_predicted = pred_flag; temporal_predictor_count[pred_context][pred_flag]++; // Update the "unpredicted" segment count if (!pred_flag) t_unpred_seg_counts[segment_id]++; } }
static void count_segs(VP9_COMP *cpi, MODE_INFO *mi, int *no_pred_segcounts, int (*temporal_predictor_count)[2], int *t_unpred_seg_counts, int bw, int bh, int mi_row, int mi_col) { VP9_COMMON *const cm = &cpi->common; MACROBLOCKD *const xd = &cpi->mb.e_mbd; int segment_id; if (mi_row >= cm->mi_rows || mi_col >= cm->mi_cols) return; segment_id = mi->mbmi.segment_id; xd->mode_info_context = mi; set_mi_row_col(cm, xd, mi_row, bh, mi_col, bw); // Count the number of hits on each segment with no prediction no_pred_segcounts[segment_id]++; // Temporal prediction not allowed on key frames if (cm->frame_type != KEY_FRAME) { // Test to see if the segment id matches the predicted value. const int pred_seg_id = vp9_get_pred_mi_segid(cm, mi->mbmi.sb_type, mi_row, mi_col); const int seg_predicted = (segment_id == pred_seg_id); // Get the segment id prediction context const int pred_context = vp9_get_pred_context(cm, xd, PRED_SEG_ID); // Store the prediction status for this mb and update counts // as appropriate vp9_set_pred_flag(xd, PRED_SEG_ID, seg_predicted); temporal_predictor_count[pred_context][seg_predicted]++; if (!seg_predicted) // Update the "unpredicted" segment count t_unpred_seg_counts[segment_id]++; } }