]> git.nihav.org Git - nihav.git/blobdiff - src/codecs/h263/decoder.rs
h263: add missing calls for backward MV predictor keeper
[nihav.git] / src / codecs / h263 / decoder.rs
index 4f2dbe94479ebe49438d9aded9fa451b9f1d49e8..85d9eeaa5cbe510935c4273571b8ee710e45f30a 100644 (file)
@@ -3,7 +3,7 @@ use frame::*;
 use super::super::*;
 use super::super::blockdsp;
 use super::*;
-use super::code::*;
+//use super::code::*;
 use formats;
 
 #[allow(dead_code)]
@@ -330,7 +330,7 @@ impl H263BaseDecoder {
                             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]; }
                         }
-                        h263_idct(&mut blk[i]);
+                        bdsp.idct(&mut blk[i]);
                     }
                     blockdsp::put_blocks(&mut buf, mb_x, mb_y, &blk);
                     mvi.set_zero_mv(mb_x);
@@ -362,12 +362,18 @@ impl H263BaseDecoder {
                     }
                     for i in 0..6 {
                         bd.decode_block_inter(&binfo, &sstate, binfo.get_q(), i, ((cbp >> (5 - i)) & 1) != 0, &mut blk[i])?;
-                        h263_idct(&mut blk[i]);
+                        bdsp.idct(&mut blk[i]);
                     }
                     blockdsp::add_blocks(&mut buf, mb_x, mb_y, &blk);
+                    if is_b {
+                        mvi2.set_zero_mv(mb_x);
+                    }
                 } else if binfo.mode != Type::B {
                     self.mv_data.push(BlockMVInfo::Inter_1MV(ZERO_MV));
                     mvi.set_zero_mv(mb_x);
+                    if is_b {
+                        mvi2.set_zero_mv(mb_x);
+                    }
                     if let Some(ref srcbuf) = self.ipbs.get_lastref() {
                         bdsp.copy_blocks(&mut buf, srcbuf, mb_x * 16, mb_y * 16, 16, 16, ZERO_MV);
                     }
@@ -430,7 +436,7 @@ impl H263BaseDecoder {
                     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])?;
-                            h263_idct(&mut blk[i]);
+                            bdsp.idct(&mut blk[i]);
                         }
                         blockdsp::add_blocks(&mut buf, mb_x, mb_y, &blk);
                     }
@@ -447,7 +453,7 @@ impl H263BaseDecoder {
                     b_mb.cbp = cbp;
                     for i in 0..6 {
                         bd.decode_block_inter(&binfo, &sstate, bquant, i, (cbp & (1 << (5 - i))) != 0, &mut b_mb.blk[i])?;
-                        h263_idct(&mut b_mb.blk[i]);
+                        bdsp.idct(&mut b_mb.blk[i]);
                     }
 
                     let is_fwd = !binfo.is_b_fwd();
@@ -483,6 +489,9 @@ impl H263BaseDecoder {
                 }
             }
             mvi.update_row();
+            if is_b {
+                mvi2.update_row();
+            }
             cbpi.update_row();
             sstate.new_row();
         }