h263: track first line state too
authorKostya Shishkov <kostya.shishkov@gmail.com>
Mon, 27 Nov 2017 16:59:56 +0000 (17:59 +0100)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Mon, 27 Nov 2017 16:59:56 +0000 (17:59 +0100)
src/codecs/h263/decoder.rs
src/codecs/h263/mod.rs

index 15e18fc7ce491e26927863d76612861669706c78..420f6f8039343d1ed9467113ead3367dd9dd9e8f 100644 (file)
@@ -215,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)?;
@@ -228,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)
index c5d63fc0b70017e64c7a0fc7ea09b07933847b0f..7e5064e90769c3d648b617b2b654b3c635bb8360 100644 (file)
@@ -120,6 +120,7 @@ pub struct SliceState {
     pub is_iframe:  bool,
     pub mb_x:       usize,
     pub mb_y:       usize,
+    pub first_line: bool,
 }
 
 const SLICE_NO_END: usize = 99999999;
@@ -141,10 +142,10 @@ impl SliceInfo {
 
 impl SliceState {
     pub fn new(is_iframe: bool) -> Self {
-        SliceState { is_iframe: is_iframe, mb_x: 0, mb_y: 0 }
+        SliceState { is_iframe: is_iframe, mb_x: 0, mb_y: 0, first_line: true }
     }
     pub fn next_mb(&mut self) { self.mb_x += 1; }
-    pub fn new_row(&mut self) { self.mb_x = 0; self.mb_y += 1; }
+    pub fn new_row(&mut self) { self.mb_x = 0; self.mb_y += 1; self.first_line = false; }
 }
 
 #[derive(Debug,Clone,Copy)]