]> git.nihav.org Git - nihav.git/blobdiff - src/formats.rs
bitreader: drop unneeded mut
[nihav.git] / src / formats.rs
index 8e6bc68e6cc234770c488da5c26e2e93f0e0b86e..29b54b02d0a2865e37b745a59f63fda0c6f9ce39 100644 (file)
@@ -23,7 +23,7 @@ bitflags! {
 
 pub const SND_U8_FORMAT: NASoniton = NASoniton { bits: 8, be: false, packed: false, planar: false, float: false, signed: false };
 pub const SND_S16_FORMAT: NASoniton = NASoniton { bits: 16, be: false, packed: false, planar: false, float: false, signed: true };
-pub const SND_F32_FORMAT: NASoniton = NASoniton { bits: 32, be: false, packed: false, planar: false, float: true, signed: true };
+pub const SND_F32P_FORMAT: NASoniton = NASoniton { bits: 32, be: false, packed: false, planar: true, float: true, signed: true };
 
 impl NASoniton {
     pub fn new(bits: u8, flags: SonitonFlags) -> Self {
@@ -41,6 +41,14 @@ impl NASoniton {
     pub fn is_planar(&self) -> bool { self.planar }
     pub fn is_float(&self)  -> bool { self.float }
     pub fn is_signed(&self) -> bool { self.signed }
+
+    pub fn get_audio_size(&self, length: u64) -> usize {
+        if self.packed {
+            ((length * (self.bits as u64) + 7) >> 3) as usize
+        } else {
+            (length * (((self.bits + 7) >> 3) as u64)) as usize
+        }
+    }
 }
 
 impl fmt::Display for NASoniton {
@@ -51,7 +59,7 @@ impl fmt::Display for NASoniton {
     }
 }
 
-#[derive(Debug,Clone,Copy)]
+#[derive(Debug,Clone,Copy,PartialEq)]
 pub enum NAChannelType {
     C, L, R, Cs, Ls, Rs, Lss, Rss, LFE, Lc, Rc, Lh, Rh, Ch, LFE2, Lw, Rw, Ov, Lhs, Rhs, Chs, Ll, Rl, Cl, Lt, Rt, Lo, Ro
 }
@@ -124,6 +132,7 @@ impl fmt::Display for NAChannelType {
     }
 }
 
+#[derive(Clone)]
 pub struct NAChannelMap {
     ids: Vec<NAChannelType>,
 }
@@ -133,6 +142,11 @@ impl NAChannelMap {
     pub fn add_channel(&mut self, ch: NAChannelType) {
         self.ids.push(ch);
     }
+    pub fn add_channels(&mut self, chs: &[NAChannelType]) {
+        for i in 0..chs.len() {
+            self.ids.push(chs[i]);
+        }
+    }
     pub fn num_channels(&self) -> usize {
         self.ids.len()
     }
@@ -308,10 +322,19 @@ impl NAPixelChromaton {
     pub fn get_offset(&self) -> u8  { self.comp_offs }
     pub fn get_step(&self)  -> u8   { self.next_elem }
 
+    pub fn get_width(&self, width: usize) -> usize {
+        (width  + ((1 << self.h_ss) - 1)) >> self.h_ss
+    }
+    pub fn get_height(&self, height: usize) -> usize {
+        (height + ((1 << self.v_ss) - 1)) >> self.v_ss
+    }
     pub fn get_linesize(&self, width: usize) -> usize {
-        let nw = (width  + ((1 << self.h_ss) - 1)) >> self.h_ss;
         let d = self.depth as usize;
-        (nw * d + d - 1) >> 3
+        if self.packed {
+            (self.get_width(width) * d + d - 1) >> 3
+        } else {
+            self.get_width(width)
+        }
     }
     pub fn get_data_size(&self, width: usize, height: usize) -> usize {
         let nh = (height + ((1 << self.v_ss) - 1)) >> self.v_ss;
@@ -391,7 +414,7 @@ mod test {
     fn test_fmt() {
         println!("{}", SND_S16_FORMAT);
         println!("{}", SND_U8_FORMAT);
-        println!("{}", SND_F32_FORMAT);
+        println!("{}", SND_F32P_FORMAT);
         println!("formaton yuv- {}", YUV420_FORMAT);
         println!("formaton pal- {}", PAL8_FORMAT);
         println!("formaton rgb565- {}", RGB565_FORMAT);