Commit 79fd8c29 authored by Ronald S. Bultje's avatar Ronald S. Bultje
Browse files

Move prediction hit counting to update_state().

The probabilities derived from these statistics are used in bitstream
writing; therefore, we should only do this when we actually decide to
use macroblock coding (over superblock coding). Derf gains +0.15%.

Change-Id: I196814c070a7c79889590658ce10a6eb07454389
parent d415d287
......@@ -431,6 +431,7 @@ static void update_state(VP9_COMP *cpi,
BLOCK_SIZE_TYPE bsize,
int output_enabled) {
int i, x_idx, y;
VP9_COMMON *const cm = &cpi->common;
MACROBLOCK *const x = &cpi->mb;
MACROBLOCKD *const xd = &x->e_mbd;
MODE_INFO *mi = &ctx->mic;
......@@ -485,12 +486,29 @@ static void update_state(VP9_COMP *cpi,
return;
{
int segment_id = mbmi->segment_id;
int segment_id = mbmi->segment_id, ref_pred_flag;
if (!vp9_segfeature_active(xd, segment_id, SEG_LVL_SKIP)) {
for (i = 0; i < NB_TXFM_MODES; i++) {
cpi->rd_tx_select_diff[i] += ctx->txfm_rd_diff[i];
}
}
// Did the chosen reference frame match its predicted value.
ref_pred_flag = ((xd->mode_info_context->mbmi.ref_frame ==
vp9_get_pred_ref(cm, xd)));
vp9_set_pred_flag(xd, PRED_REF, ref_pred_flag);
if (!xd->segmentation_enabled ||
!vp9_segfeature_active(xd, segment_id, SEG_LVL_REF_FRAME) ||
vp9_check_segref(xd, segment_id, INTRA_FRAME) +
vp9_check_segref(xd, segment_id, LAST_FRAME) +
vp9_check_segref(xd, segment_id, GOLDEN_FRAME) +
vp9_check_segref(xd, segment_id, ALTREF_FRAME) > 1) {
// Get the prediction context and status
int pred_context = vp9_get_pred_context(cm, xd, PRED_REF);
// Count prediction success
cpi->ref_pred_count[pred_context][ref_pred_flag]++;
}
}
if (cpi->common.frame_type == KEY_FRAME) {
......@@ -709,12 +727,12 @@ static void set_offsets(VP9_COMP *cpi,
}
}
static int pick_mb_modes(VP9_COMP *cpi,
int mb_row,
int mb_col,
TOKENEXTRA **tp,
int *totalrate,
int *totaldist) {
static int pick_mb_mode(VP9_COMP *cpi,
int mb_row,
int mb_col,
TOKENEXTRA **tp,
int *totalrate,
int *totaldist) {
VP9_COMMON *const cm = &cpi->common;
MACROBLOCK *const x = &cpi->mb;
MACROBLOCKD *const xd = &x->e_mbd;
......@@ -737,36 +755,14 @@ static int pick_mb_modes(VP9_COMP *cpi,
// Save the coding context
vpx_memcpy(&x->mb_context[xd->sb_index][xd->mb_index].mic,
xd->mode_info_context, sizeof(MODE_INFO));
// Dummy encode, do not do the tokenization
encode_macroblock(cpi, tp, 0, mb_row, mb_col);
} else {
int seg_id;
vp9_pick_mode_inter_macroblock(cpi, x, mb_row, mb_col,
totalrate, totaldist);
splitmodes_used += (mbmi->mode == SPLITMV);
// Dummy encode, do not do the tokenization
encode_macroblock(cpi, tp, 0, mb_row, mb_col);
seg_id = mbmi->segment_id;
if (cpi->mb.e_mbd.segmentation_enabled && seg_id == 0) {
if (cpi->mb.e_mbd.segmentation_enabled && mbmi->segment_id == 0) {
cpi->seg0_idx++;
}
if (!xd->segmentation_enabled ||
!vp9_segfeature_active(xd, seg_id, SEG_LVL_REF_FRAME) ||
vp9_check_segref(xd, seg_id, INTRA_FRAME) +
vp9_check_segref(xd, seg_id, LAST_FRAME) +
vp9_check_segref(xd, seg_id, GOLDEN_FRAME) +
vp9_check_segref(xd, seg_id, ALTREF_FRAME) > 1) {
// Get the prediction context and status
int pred_flag = vp9_get_pred_flag(xd, PRED_REF);
int pred_context = vp9_get_pred_context(cm, xd, PRED_REF);
// Count prediction success
cpi->ref_pred_count[pred_context][pred_flag]++;
}
}
return splitmodes_used;
......@@ -1014,10 +1010,14 @@ static void encode_sb_row(VP9_COMP *cpi,
// Index of the MB in the SB 0..3
xd->mb_index = j;
splitmodes_used += pick_mb_modes(cpi, mb_row + y_idx_m,
mb_col + x_idx_m, tp, &r, &d);
splitmodes_used += pick_mb_mode(cpi, mb_row + y_idx_m,
mb_col + x_idx_m, tp, &r, &d);
mb_rate += r;
mb_dist += d;
// Dummy encode, do not do the tokenization
encode_macroblock(cpi, tp, 0, mb_row + y_idx_m,
mb_col + x_idx_m);
}
/* Restore L & A coding context to those in place on entry */
......@@ -1852,7 +1852,6 @@ static void encode_macroblock(VP9_COMP *cpi, TOKENEXTRA **t,
MODE_INFO *mi = xd->mode_info_context;
MB_MODE_INFO *const mbmi = &mi->mbmi;
const int mis = cm->mode_info_stride;
unsigned char ref_pred_flag;
assert(!xd->mode_info_context->mbmi.sb_type);
......@@ -1896,12 +1895,6 @@ static void encode_macroblock(VP9_COMP *cpi, TOKENEXTRA **t,
}
vp9_update_zbin_extra(cpi, x);
// SET VARIOUS PREDICTION FLAGS
// Did the chosen reference frame match its predicted value.
ref_pred_flag = ((mbmi->ref_frame == vp9_get_pred_ref(cm, xd)));
vp9_set_pred_flag(xd, PRED_REF, ref_pred_flag);
}
if (mbmi->ref_frame == INTRA_FRAME) {
......@@ -2111,7 +2104,6 @@ static void encode_superblock(VP9_COMP *cpi, TOKENEXTRA **t,
uint8_t *vdst = xd->dst.v_buffer;
int src_y_stride = x->src.y_stride, dst_y_stride = xd->dst.y_stride;
int src_uv_stride = x->src.uv_stride, dst_uv_stride = xd->dst.uv_stride;
unsigned char ref_pred_flag;
int n;
MODE_INFO *mi = x->e_mbd.mode_info_context;
unsigned int segment_id = mi->mbmi.segment_id;
......@@ -2153,11 +2145,6 @@ static void encode_superblock(VP9_COMP *cpi, TOKENEXTRA **t,
}
vp9_update_zbin_extra(cpi, x);
// Did the chosen reference frame match its predicted value.
ref_pred_flag = ((xd->mode_info_context->mbmi.ref_frame ==
vp9_get_pred_ref(cm, xd)));
vp9_set_pred_flag(xd, PRED_REF, ref_pred_flag);
}
if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment