+ } else {
+ let ref_mv_info = self.mv_data[mb_pos];
+ let has_fwd = binfo.get_num_mvs() > 0;
+ let has_bwd = binfo.get_num_mvs2() > 0;
+//todo refactor
+ if has_fwd || has_bwd {
+ let fwd_mv;
+ if has_fwd {
+ fwd_mv = mvi.predict(mb_x, 0, false, binfo.get_mv(0), sstate.first_line, sstate.first_mb);
+ } else {
+ fwd_mv = ZERO_MV;
+ mvi.set_zero_mv(mb_x);
+ }
+ let bwd_mv;
+ if has_bwd {
+ bwd_mv = mvi2.predict(mb_x, 0, false, binfo.get_mv2(0), sstate.first_line, sstate.first_mb);
+ } else {
+ bwd_mv = ZERO_MV;
+ mvi2.set_zero_mv(mb_x);
+ }
+ if let (Some(ref fwd_buf), Some(ref bck_buf)) = (self.ipbs.get_nextref(), self.ipbs.get_lastref()) {
+ if has_fwd && has_bwd {
+ bdsp.copy_blocks(&mut buf, fwd_buf, mb_x * 16, mb_y * 16, 16, 16, fwd_mv);
+ bdsp.avg_blocks (&mut buf, bck_buf, mb_x * 16, mb_y * 16, 16, 16, bwd_mv);
+ } else if has_fwd {
+ bdsp.copy_blocks(&mut buf, fwd_buf, mb_x * 16, mb_y * 16, 16, 16, fwd_mv);
+ } else {
+ bdsp.copy_blocks(&mut buf, bck_buf, mb_x * 16, mb_y * 16, 16, 16, bwd_mv);
+ }
+ }
+ } else {
+ if let BlockMVInfo::Inter_4MV(mvs) = ref_mv_info {
+ for blk_no in 0..4 {
+ let ref_mv = mvs[blk_no];
+ let ref_mv_fwd = ref_mv.scale(bsdiff, tsdiff);
+ let ref_mv_bwd = ref_mv - ref_mv_fwd;
+ let xoff = mb_x * 16 + (blk_no & 1) * 8;
+ let yoff = mb_y * 16 + (blk_no & 2) * 4;
+ if let (Some(ref fwd_buf), Some(ref bck_buf)) = (self.ipbs.get_nextref(), self.ipbs.get_lastref()) {
+ bdsp.copy_blocks(&mut buf, fwd_buf, xoff, yoff, 8, 8, ref_mv_fwd);
+ bdsp.avg_blocks (&mut buf, bck_buf, xoff, yoff, 8, 8, ref_mv_bwd);
+ }
+ }
+ } else {
+ let ref_mv = if let BlockMVInfo::Inter_1MV(mv_) = ref_mv_info { mv_ } else { ZERO_MV };
+ let ref_mv_fwd = ref_mv.scale(bsdiff, tsdiff);
+ let ref_mv_bwd = MV::b_sub(ref_mv, ref_mv_fwd, ZERO_MV, bsdiff, tsdiff);
+
+ if let (Some(ref fwd_buf), Some(ref bck_buf)) = (self.ipbs.get_nextref(), self.ipbs.get_lastref()) {
+ bdsp.copy_blocks(&mut buf, fwd_buf, mb_x * 16, mb_y * 16, 16, 16, ref_mv_fwd);
+ bdsp.avg_blocks (&mut buf, bck_buf, mb_x * 16, mb_y * 16, 16, 16, ref_mv_bwd);
+ }
+ }
+ mvi.set_zero_mv(mb_x);
+ mvi2.set_zero_mv(mb_x);
+ }
+ if cbp != 0 {
+ for i in 0..6 {
+ bd.decode_block_inter(&binfo, &sstate, binfo.get_q(), i, ((cbp >> (5 - i)) & 1) != 0, &mut blk[i])?;
+ bdsp.idct(&mut blk[i]);
+ }
+ blockdsp::add_blocks(&mut buf, mb_x, mb_y, &blk);
+ }