{
/* On L edge, get from MB to left of us */
--cur_mb;
- b += 4;
+ switch (cur_mb->mbmi.mode)
+ {
+ case B_PRED:
+ return (cur_mb->bmi + b + 3)->as_mode;
+ case DC_PRED:
+ return B_DC_PRED;
+ case V_PRED:
+ return B_VE_PRED;
+ case H_PRED:
+ return B_HE_PRED;
+ case TM_PRED:
+ return B_TM_PRED;
+ default:
+ return B_DC_PRED;
+ }
}
return (cur_mb->bmi + b - 1)->as_mode;
{
/* On top edge, get from MB above us */
cur_mb -= mi_stride;
- b += 16;
+
+ switch (cur_mb->mbmi.mode)
+ {
+ case B_PRED:
+ return (cur_mb->bmi + b + 12)->as_mode;
+ case DC_PRED:
+ return B_DC_PRED;
+ case V_PRED:
+ return B_VE_PRED;
+ case H_PRED:
+ return B_HE_PRED;
+ case TM_PRED:
+ return B_TM_PRED;
+ default:
+ return B_DC_PRED;
+ }
}
return (cur_mb->bmi + b - 4)->as_mode;
RECON_INVOKE(&rtcd->common->recon, recon_mby)
(IF_RTCD(&rtcd->common->recon), &x->e_mbd);
- // make sure block modes are set the way we want them for context updates
- for (b = 0; b < 16; b++)
- {
- BLOCKD *d = &x->e_mbd.block[b];
-
- switch (x->e_mbd.mode_info_context->mbmi.mode)
- {
- case DC_PRED:
- d->bmi.as_mode = B_DC_PRED;
- break;
- case V_PRED:
- d->bmi.as_mode = B_VE_PRED;
- break;
- case H_PRED:
- d->bmi.as_mode = B_HE_PRED;
- break;
- case TM_PRED:
- d->bmi.as_mode = B_TM_PRED;
- break;
- default:
- d->bmi.as_mode = B_DC_PRED;
- break;
- }
- }
}
void vp8_encode_intra16x16mbuv(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *x)
MACROBLOCK *x,
int ib,
B_PREDICTION_MODE *best_mode,
- B_PREDICTION_MODE above,
- B_PREDICTION_MODE left,
+ unsigned int *mode_costs,
int *bestrate,
int *bestdistortion)
int best_rd = INT_MAX; // 1<<30
int rate;
int distortion;
- unsigned int *mode_costs;
-
- if (x->e_mbd.frame_type == KEY_FRAME)
- {
- mode_costs = x->bmode_costs[above][left];
- }
- else
- {
- mode_costs = x->inter_bmode_costs;
- }
for (mode = B_DC_PRED; mode <= B_HE_PRED /*B_HU_PRED*/; mode++)
{
int cost = mb->mbmode_cost [xd->frame_type] [B_PRED];
int error;
int distortion = 0;
+ unsigned int *bmode_costs;
vp8_intra_prediction_down_copy(xd);
+ bmode_costs = mb->inter_bmode_costs;
+
for (i = 0; i < 16; i++)
{
MODE_INFO *const mic = xd->mode_info_context;
const int mis = xd->mode_info_stride;
- const B_PREDICTION_MODE A = above_block_mode(mic, i, mis);
- const B_PREDICTION_MODE L = left_block_mode(mic, i);
B_PREDICTION_MODE UNINITIALIZED_IS_SAFE(best_mode);
int UNINITIALIZED_IS_SAFE(r), UNINITIALIZED_IS_SAFE(d);
- pick_intra4x4block(rtcd, mb, i, &best_mode, A, L, &r, &d);
+ if (mb->e_mbd.frame_type == KEY_FRAME)
+ {
+ const B_PREDICTION_MODE A = above_block_mode(mic, i, mis);
+ const B_PREDICTION_MODE L = left_block_mode(mic, i);
+
+ bmode_costs = mb->bmode_costs[A][L];
+ }
+
+
+ pick_intra4x4block(rtcd, mb, i, &best_mode, bmode_costs, &r, &d);
cost += r;
distortion += d;