- match mb_info.mb_type {
- MBType::Intra16x16(_, _, _) => {
- Self::pred_intra(&mut frm, &self.sstate, &mb_info);
- },
- MBType::Intra4x4 | MBType::Intra8x8 => {
- Self::pred_intra(&mut frm, &self.sstate, &mb_info);
- },
- MBType::PCM => {},
- MBType::PSkip => {
- let mv = self.sstate.get_cur_blk4(0).mv[0];
- let rpic = self.frame_refs.select_ref_pic(0, 0);
- Self::do_p_mc(&mut frm, xpos, ypos, 16, 16, mv, rpic);
- },
- MBType::P16x16 => {
- let mv = self.sstate.get_cur_blk4(0).mv[0];
- let rpic = self.frame_refs.select_ref_pic(0, mb_info.ref_l0[0].index());
- Self::do_p_mc(&mut frm, xpos, ypos, 16, 16, mv, rpic);
- },
- MBType::P16x8 | MBType::P8x16 => {
- let (bw, bh, bx, by) = if mb_info.mb_type == MBType::P16x8 {
- (16, 8, 0, 8)
- } else {
- (8, 16, 8, 0)
- };
- let mv = self.sstate.get_cur_blk4(0).mv[0];
- let rpic = self.frame_refs.select_ref_pic(0, mb_info.ref_l0[0].index());
- Self::do_p_mc(&mut frm, xpos, ypos, bw, bh, mv, rpic);
- let mv = self.sstate.get_cur_blk4(bx / 4 + by).mv[0];
- let rpic = self.frame_refs.select_ref_pic(0, mb_info.ref_l0[1].index());
- Self::do_p_mc(&mut frm, xpos + bx, ypos + by, bw, bh, mv, rpic);
- },
- MBType::P8x8 | MBType::P8x8Ref0 => {
- for part in 0..4 {
- let bx = (part & 1) * 8;
- let by = (part & 2) * 4;
- if let Some(buf) = self.frame_refs.select_ref_pic(0, mb_info.ref_l0[part].index()) {
- let mv = self.sstate.get_cur_blk4(bx / 4 + by).mv[0];
-
- match mb_info.sub_mb_type[part] {
- SubMBType::P8x8 => {
- do_mc(&mut frm, buf, xpos + bx, ypos + by, 8, 8, mv);
- },
- SubMBType::P8x4 => {
- do_mc(&mut frm, buf.clone(), xpos + bx, ypos + by, 8, 4, mv);
- let mv = self.sstate.get_cur_blk4(bx / 4 + by + 4).mv[0];
- do_mc(&mut frm, buf, xpos + bx, ypos + by + 4, 8, 4, mv);
- },
- SubMBType::P4x8 => {
- do_mc(&mut frm, buf.clone(), xpos + bx, ypos + by, 4, 8, mv);
- let mv = self.sstate.get_cur_blk4(bx / 4 + by + 1).mv[0];
- do_mc(&mut frm, buf, xpos + bx + 4, ypos + by, 4, 8, mv);
- },
- SubMBType::P4x4 => {
- for sb_no in 0..4 {
- let sxpos = xpos + bx + (sb_no & 1) * 4;
- let sypos = ypos + by + (sb_no & 2) * 2;
- let sblk_no = (bx / 4 + (sb_no & 1)) + ((by / 4) + (sb_no >> 1)) * 4;
- let mv = self.sstate.get_cur_blk4(sblk_no).mv[0];
- do_mc(&mut frm, buf.clone(), sxpos, sypos, 4, 4, mv);
- }
- },
- _ => unreachable!(),
- };
- } else {
- gray_block(&mut frm, xpos + bx, ypos + by, 8, 8);
- }
- }
- },
- MBType::B16x16(mode) => {
- let mv0 = self.sstate.get_cur_blk4(0).mv[0];
- let rpic0 = self.frame_refs.select_ref_pic(0, mb_info.ref_l0[0].index());
- let mv1 = self.sstate.get_cur_blk4(0).mv[1];
- let rpic1 = self.frame_refs.select_ref_pic(1, mb_info.ref_l1[0].index());
- Self::do_b_mc(&mut frm, mode, xpos, ypos, 16, 16, mv0, rpic0, mv1, rpic1, &mut self.avg_buf);
- },
- MBType::B16x8(mode0, mode1) | MBType::B8x16(mode0, mode1) => {
- let (pw, ph) = mb_info.mb_type.size();
- let (px, py) = (pw & 8, ph & 8);
- let modes = [mode0, mode1];
- let (mut bx, mut by) = (0, 0);
- for part in 0..2 {
- let blk = if part == 0 { 0 } else { (px / 4) + py };
- let mv0 = self.sstate.get_cur_blk4(blk).mv[0];
- let rpic0 = self.frame_refs.select_ref_pic(0, mb_info.ref_l0[part].index());
- let mv1 = self.sstate.get_cur_blk4(blk).mv[1];
- let rpic1 = self.frame_refs.select_ref_pic(1, mb_info.ref_l1[part].index());
- Self::do_b_mc(&mut frm, modes[part], xpos + bx, ypos + by, pw, ph, mv0, rpic0, mv1, rpic1, &mut self.avg_buf);
- bx += px;
- by += py;
- }
- },
- MBType::Direct | MBType::BSkip => {
- let is_16x16 = self.frame_refs.get_colocated_info(self.sstate.mb_x, self.sstate.mb_y).0.mb_type.is_16x16();
- if is_16x16 || !self.temporal_mv {
- let mv = self.sstate.get_cur_blk4(0).mv;
- let ref_idx = self.sstate.get_cur_blk8(0).ref_idx;
- let rpic0 = self.frame_refs.select_ref_pic(0, ref_idx[0].index());
- let rpic1 = self.frame_refs.select_ref_pic(1, ref_idx[1].index());
- Self::do_b_mc(&mut frm, BMode::Bi, xpos, ypos, 16, 16, mv[0], rpic0, mv[1], rpic1, &mut self.avg_buf);