+ if apply_acpred && (binfo.acpred != ACPredMode::None) {
+ let has_b = (i == 1) || (i == 3) || (mb_x > 0);
+ let has_a = (i == 2) || (i == 3) || (mb_y > 0);
+ let (b_mb, b_blk) = if has_b {
+ if (i == 1) || (i == 3) {
+ (mb_pos, i - 1)
+ } else if i < 4 {
+ (mb_pos - 1, i + 1)
+ } else {
+ (mb_pos - 1, i)
+ }
+ } else { (0, 0) };
+ let (a_mb, a_blk) = if has_a {
+ if (i == 2) || (i == 3) {
+ (mb_pos, i - 2)
+ } else if i < 4 {
+ (mb_pos - self.mb_w, i + 2)
+ } else {
+ (mb_pos - self.mb_w, i)
+ }
+ } else { (0, 0) };
+ match binfo.acpred {
+ ACPredMode::DC => {
+ let dc;
+ if has_a && has_b {
+ dc = (self.pred_coeffs[b_mb].hor[b_blk][0] + self.pred_coeffs[a_mb].ver[a_blk][0]) / 2;
+ } else if has_a {
+ dc = self.pred_coeffs[a_mb].ver[a_blk][0];
+ } else if has_b {
+ dc = self.pred_coeffs[b_mb].hor[b_blk][0];
+ } else {
+ dc = 1024;
+ }
+ blk[i][0] = clip_dc(blk[i][0] + dc);
+ },
+ ACPredMode::Hor => {
+ if has_b {
+ for k in 0..8 {
+ blk[i][k * 8] += self.pred_coeffs[b_mb].hor[b_blk][k];
+ }
+ for k in 1..8 {
+ blk[i][k * 8] = clip_ac(blk[i][k * 8]);
+ }
+ } else {
+ blk[i][0] += 1024;
+ }
+ blk[i][0] = clip_dc(blk[i][0]);
+ },
+ ACPredMode::Ver => {
+ if has_a {
+ for k in 0..8 {
+ blk[i][k] += self.pred_coeffs[a_mb].ver[a_blk][k];
+ }
+ for k in 1..8 {
+ blk[i][k] = clip_ac(blk[i][k]);
+ }
+ } else {
+ blk[i][0] += 1024;
+ }
+ blk[i][0] = clip_dc(blk[i][0]);
+ },
+ ACPredMode::None => {},
+ };
+ for t in 0..8 { self.pred_coeffs[mb_pos].hor[i][t] = blk[i][t * 8]; }
+ for t in 0..8 { self.pred_coeffs[mb_pos].ver[i][t] = blk[i][t]; }
+ }