]> git.nihav.org Git - nihav.git/blobdiff - src/codecs/h263/decoder.rs
h263: track first line state too
[nihav.git] / src / codecs / h263 / decoder.rs
index db200e71769f06042501e4e4622c42b3a0a9daa4..420f6f8039343d1ed9467113ead3367dd9dd9e8f 100644 (file)
@@ -129,6 +129,7 @@ pub struct H263BaseDecoder {
     has_b:      bool,
     b_data:     Vec<BMB>,
     pred_coeffs: Vec<PredCoeffs>,
+    is_gob:     bool,
 }
 
 #[inline]
@@ -147,7 +148,7 @@ fn clip_ac(ac: i16) -> i16 {
 
 #[allow(dead_code)]
 impl H263BaseDecoder {
-    pub fn new() -> Self {
+    pub fn new(is_gob: bool) -> Self {
         H263BaseDecoder{
             w: 0, h: 0, mb_w: 0, mb_h: 0, num_mb: 0,
             ftype: Type::Special,
@@ -155,6 +156,7 @@ impl H263BaseDecoder {
             last_ts: 0,
             has_b: false, b_data: Vec::new(),
             pred_coeffs: Vec::new(),
+            is_gob: is_gob,
         }
     }
 
@@ -191,7 +193,7 @@ impl H263BaseDecoder {
         let mut bufinfo = bufret.unwrap();
         let mut buf = bufinfo.get_vbuf().unwrap();
 
-        let mut slice = if bd.is_gob() {
+        let mut slice = if self.is_gob {
                 SliceInfo::get_default_slice(&pinfo)
             } else {
                 bd.decode_slice_header(&pinfo)?
@@ -213,8 +215,11 @@ impl H263BaseDecoder {
 
                 if slice.is_at_end(mb_pos) || (slice.needs_check() && mb_pos > 0 && bd.is_slice_end()) {
                     slice = bd.decode_slice_header(&pinfo)?;
-                    //mvi.reset(self.mb_w, mb_x, pinfo.get_mvmode());
-                    //cbpi.reset(self.mb_w);
+                    if !self.is_gob {
+                        mvi.reset(self.mb_w, mb_x, pinfo.get_mvmode());
+                        cbpi.reset(self.mb_w);
+                        sstate.first_line = true;
+                    }
                 }
 
                 let binfo = bd.decode_block_header(&pinfo, &slice, &sstate)?;
@@ -226,7 +231,7 @@ impl H263BaseDecoder {
                         bd.decode_block_intra(&binfo, &sstate, binfo.get_q(), i, (cbp & (1 << (5 - i))) != 0, &mut blk[i])?;
                         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 has_a = (i == 2) || (i == 3) || !sstate.first_line;
                             let (b_mb, b_blk) = if has_b {
                                     if (i == 1) || (i == 3) {
                                         (mb_pos, i - 1)