X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=src%2Fformats.rs;h=aa053b2e75f55df7eb5cf6b7e0b64b3121a89a35;hb=503374e726db6340d38efd2459f48863a415d31d;hp=3f7ae7fb2fd610c3b7b432e82cbe2b800805bd34;hpb=fba6f8e46fbe906f5c7b372becc14c4400533eeb;p=nihav.git diff --git a/src/formats.rs b/src/formats.rs index 3f7ae7f..aa053b2 100644 --- a/src/formats.rs +++ b/src/formats.rs @@ -1,7 +1,7 @@ use std::string::*; use std::fmt; -#[derive(Debug,Copy,Clone)] +#[derive(Debug,Copy,Clone,PartialEq)] pub struct NASoniton { bits: u8, be: bool, @@ -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, } @@ -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() } @@ -147,7 +161,7 @@ impl NAChannelMap { } } -#[derive(Debug,Clone,Copy)] +#[derive(Debug,Clone,Copy,PartialEq)] pub enum RGBSubmodel { RGB, SRGB, @@ -163,7 +177,7 @@ impl fmt::Display for RGBSubmodel { } } -#[derive(Debug,Clone,Copy)] +#[derive(Debug,Clone,Copy,PartialEq)] pub enum YUVSubmodel { YCbCr, YIQ, @@ -181,7 +195,7 @@ impl fmt::Display for YUVSubmodel { } } -#[derive(Debug, Clone,Copy)] +#[derive(Debug, Clone,Copy,PartialEq)] pub enum ColorModel { RGB(RGBSubmodel), YUV(YUVSubmodel), @@ -214,7 +228,7 @@ impl fmt::Display for ColorModel { } } -#[derive(Clone,Copy)] +#[derive(Clone,Copy,PartialEq)] pub struct NAPixelChromaton { h_ss: u8, v_ss: u8, @@ -234,7 +248,7 @@ bitflags! { } -#[derive(Clone,Copy)] +#[derive(Clone,Copy,PartialEq)] pub struct NAPixelFormaton { model: ColorModel, components: u8, @@ -268,6 +282,14 @@ pub const YUV420_FORMAT: NAPixelFormaton = NAPixelFormaton { model: ColorModel:: None, None], elem_size: 0, be: false, alpha: false, palette: false }; +pub const YUV410_FORMAT: NAPixelFormaton = NAPixelFormaton { model: ColorModel::YUV(YUVSubmodel::YUVJ), components: 3, + comp_info: [ + chromaton!(0, 0, false, 8, 0, 0, 1), + chromaton!(yuv8; 2, 2, 1), + chromaton!(yuv8; 2, 2, 2), + None, None], + elem_size: 0, be: false, alpha: false, palette: false }; + pub const PAL8_FORMAT: NAPixelFormaton = NAPixelFormaton { model: ColorModel::RGB(RGBSubmodel::RGB), components: 3, comp_info: [ chromaton!(pal8; 0), @@ -284,6 +306,14 @@ pub const RGB565_FORMAT: NAPixelFormaton = NAPixelFormaton { model: ColorModel:: None, None], elem_size: 2, be: false, alpha: false, palette: false }; +pub const RGB24_FORMAT: NAPixelFormaton = NAPixelFormaton { model: ColorModel::RGB(RGBSubmodel::RGB), components: 3, + comp_info: [ + chromaton!(packrgb; 8, 0, 2, 3), + chromaton!(packrgb; 8, 0, 1, 3), + chromaton!(packrgb; 8, 0, 0, 3), + None, None], + elem_size: 3, be: false, alpha: false, palette: false }; + impl NAPixelChromaton { pub fn get_subsampling(&self) -> (u8, u8) { (self.h_ss, self.v_ss) } pub fn is_packed(&self) -> bool { self.packed } @@ -291,6 +321,21 @@ impl NAPixelChromaton { pub fn get_shift(&self) -> u8 { self.shift } 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 d = self.depth as usize; + (self.get_width(width) * d + d - 1) >> 3 + } + pub fn get_data_size(&self, width: usize, height: usize) -> usize { + let nh = (height + ((1 << self.v_ss) - 1)) >> self.v_ss; + self.get_linesize(width) * nh + } } impl fmt::Display for NAPixelChromaton { @@ -331,7 +376,7 @@ impl NAPixelFormaton { } pub fn get_model(&self) -> ColorModel { self.model } - pub fn get_num_comp(&self) -> u8 { self.components } + pub fn get_num_comp(&self) -> usize { self.components as usize } pub fn get_chromaton(&self, idx: usize) -> Option { if idx < self.comp_info.len() { return self.comp_info[idx]; } None