]> git.nihav.org Git - nihav.git/blobdiff - src/codecs/h263/mod.rs
rv20: B-frame parsing
[nihav.git] / src / codecs / h263 / mod.rs
index a1446ae8726be4bd21edc380a3899afb4015529c..cf2350d6043e6b259acc4d9eec9fddd1c6628d51 100644 (file)
@@ -21,7 +21,6 @@ pub trait BlockDecoder {
     fn decode_block_intra(&mut self, info: &BlockInfo, sstate: &SliceState, quant: u8, no: usize, coded: bool, blk: &mut [i16; 64]) -> DecoderResult<()>;
     fn decode_block_inter(&mut self, info: &BlockInfo, sstate: &SliceState, quant: u8, no: usize, coded: bool, blk: &mut [i16; 64]) -> DecoderResult<()>;
     fn is_slice_end(&mut self) -> bool;
-    fn is_gob(&mut self) -> bool;
 }
 
 pub trait BlockDSP {
@@ -121,6 +120,8 @@ pub struct SliceState {
     pub is_iframe:  bool,
     pub mb_x:       usize,
     pub mb_y:       usize,
+    pub first_line: bool,
+    pub first_mb:   bool,
 }
 
 const SLICE_NO_END: usize = 99999999;
@@ -142,26 +143,30 @@ 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, first_mb: true }
+    }
+    pub fn next_mb(&mut self) { self.mb_x += 1; self.first_mb = false; }
+    pub fn new_row(&mut self) {
+        self.mb_x = 0; self.mb_y += 1;
+        self.first_line = false; self.first_mb = 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; }
 }
 
 #[derive(Debug,Clone,Copy)]
 pub struct BlockInfo {
-    intra:   bool,
-    skip:    bool,
-    mode:    Type,
-    cbp:     u8,
-    q:       u8,
-    mv:      [MV; 4],
-    num_mv:  usize,
-    bpart:   bool,
-    b_cbp:   u8,
-    mv2:     [MV; 2],
-    num_mv2: usize,
-    fwd:     bool,
+    pub intra:   bool,
+    pub skip:    bool,
+    pub mode:    Type,
+    pub cbp:     u8,
+    pub q:       u8,
+    pub mv:      [MV; 4],
+    pub num_mv:  usize,
+    pub bpart:   bool,
+    pub b_cbp:   u8,
+    pub mv2:     [MV; 2],
+    pub num_mv2: usize,
+    pub fwd:     bool,
+    pub acpred:  ACPredMode,
 }
 
 #[allow(dead_code)]
@@ -173,6 +178,15 @@ pub struct BBlockInfo {
     fwd:     bool,
 }
 
+#[allow(dead_code)]
+#[derive(Debug,Clone,Copy,PartialEq)]
+pub enum ACPredMode {
+    None,
+    DC,
+    Ver,
+    Hor,
+}
+
 #[allow(dead_code)]
 impl BlockInfo {
     pub fn new(mode: Type, cbp: u8, q: u8) -> Self {
@@ -189,6 +203,7 @@ impl BlockInfo {
             mv2:     [ZERO_MV, ZERO_MV],
             num_mv2: 0,
             fwd:     false,
+            acpred:  ACPredMode::None,
         }
     }
     pub fn is_intra(&self) -> bool { self.intra }
@@ -222,6 +237,8 @@ impl BlockInfo {
         self.mv2    = mv_arr;
     }
     pub fn is_b_fwd(&self) -> bool { self.fwd }
+    pub fn set_acpred(&mut self, acpred: ACPredMode) { self.acpred = acpred }
+    pub fn get_acpred(&self) -> ACPredMode { self.acpred }
 }
 
 impl BBlockInfo {