break;
case PRED_DUAL:
- // Second ref not INTRA indicates use of dual pred in neighbour
- pred_context =
- ((m - 1)->mbmi.second_ref_frame != INTRA_FRAME) +
- ((m - cm->mode_info_stride)->mbmi.second_ref_frame != INTRA_FRAME);
+ // Context based on use of dual pred flag by neighbours
+ //pred_context =
+ // ((m - 1)->mbmi.second_ref_frame != INTRA_FRAME) +
+ // ((m - cm->mode_info_stride)->mbmi.second_ref_frame != INTRA_FRAME);
+
+ // Context based on mode
+ //if ( m->mbmi.mode == ZEROMV )
+ // pred_context = 0;
+ //else if ( (m->mbmi.mode == NEARESTMV) || (m->mbmi.mode == NEARMV) )
+ // pred_context = 1;
+ //else
+ // pred_context = 2;
+
+ // Context based on reference frame
+ if ( m->mbmi.ref_frame == LAST_FRAME )
+ pred_context = 0;
+ else if ( m->mbmi.ref_frame == GOLDEN_FRAME )
+ pred_context = 1;
+ else
+ pred_context = 2;
+
break;
#endif
break;
case PRED_DUAL:
- // Second ref non zero indicates use of dual pred in neighbour
+ // In keeping with convention elsewhre the probability returned is
+ // the probability of a "0" outcome which in this case means the
+ // probability of dual pred off.
pred_probability = cm->prob_dualpred[pred_context];
break;
#endif
int row, col;
int prob_skip_false = 0;
+
#if CONFIG_DUALPRED
+#if !CONFIG_COMPRED
int prob_dual_pred[3];
+#endif
#endif /* CONFIG_DUALPRED */
// Values used in prediction model coding
{
if (cpi->single_pred_count[i] + cpi->dual_pred_count[i])
{
+#if CONFIG_COMPRED
+ pc->prob_dualpred[i] = cpi->single_pred_count[i] * 255 /
+ (cpi->single_pred_count[i] + cpi->dual_pred_count[i]);
+ if (pc->prob_dualpred[i] < 1)
+ pc->prob_dualpred[i] = 1;
+ }
+ else
+ {
+ pc->prob_dualpred[i] = 128;
+ }
+ vp8_write_literal(w, pc->prob_dualpred[i], 8);
+#else
prob_dual_pred[i] = cpi->single_pred_count[i] * 256 /
- (cpi->single_pred_count[i] + cpi->dual_pred_count[i]);
+ (cpi->single_pred_count[i] + cpi->dual_pred_count[i]);
if (prob_dual_pred[i] < 1)
prob_dual_pred[i] = 1;
else if (prob_dual_pred[i] > 255)
prob_dual_pred[i] = 128;
}
vp8_write_literal(w, prob_dual_pred[i], 8);
-
-#if CONFIG_COMPRED
- pc->prob_dualpred[i] = prob_dual_pred[i];
#endif
}
}
int prob_skip_false = 0;
#if CONFIG_DUALPRED
+#if !CONFIG_COMPRED
int prob_dual_pred[3];
+#endif
#endif /* CONFIG_DUALPRED */
// Values used in prediction model coding
{
if (cpi->single_pred_count[i] + cpi->dual_pred_count[i])
{
+#if CONFIG_COMPRED
+ pc->prob_dualpred[i] = cpi->single_pred_count[i] * 255 /
+ (cpi->single_pred_count[i] + cpi->dual_pred_count[i]);
+ if (pc->prob_dualpred[i] < 1)
+ pc->prob_dualpred[i] = 1;
+ }
+ else
+ {
+ pc->prob_dualpred[i] = 128;
+ }
+ vp8_write_literal(w, pc->prob_dualpred[i], 8);
+#else
prob_dual_pred[i] = cpi->single_pred_count[i] * 256 /
- (cpi->single_pred_count[i] + cpi->dual_pred_count[i]);
+ (cpi->single_pred_count[i] + cpi->dual_pred_count[i]);
if (prob_dual_pred[i] < 1)
prob_dual_pred[i] = 1;
else if (prob_dual_pred[i] > 255)
prob_dual_pred[i] = 128;
}
vp8_write_literal(w, prob_dual_pred[i], 8);
-
-#if CONFIG_COMPRED
- pc->prob_dualpred[i] = prob_dual_pred[i];
#endif
}
}
if (x->e_mbd.mode_info_context->mbmi.ref_frame &&
x->e_mbd.mode_info_context->mbmi.mode != SPLITMV)
{
- MB_MODE_INFO *t = &x->e_mbd.mode_info_context[-cpi->common.mode_info_stride].mbmi;
+ unsigned char pred_context;
+
+#if CONFIG_COMPRED
+ pred_context = get_pred_context( cm, xd, PRED_DUAL );
+#else
+ MB_MODE_INFO *t = &x->e_mbd.mode_info_context
+ [-cpi->common.mode_info_stride].mbmi;
MB_MODE_INFO *l = &x->e_mbd.mode_info_context[-1].mbmi;
- int cnt = (t->second_ref_frame != INTRA_FRAME) + (l->second_ref_frame != INTRA_FRAME);
- if (x->e_mbd.mode_info_context->mbmi.second_ref_frame == INTRA_FRAME)
- cpi->single_pred_count[cnt]++;
+ pred_context = (t->second_ref_frame != INTRA_FRAME) +
+ (l->second_ref_frame != INTRA_FRAME);
+#endif
+ if (xd->mode_info_context->mbmi.second_ref_frame == INTRA_FRAME)
+ cpi->single_pred_count[pred_context]++;
else
- cpi->dual_pred_count[cnt]++;
+ cpi->dual_pred_count[pred_context]++;
}
#endif /* CONFIG_DUALPRED */