X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=src%2Fframe.rs;h=cfe6ab81488554df27d156881a3d55d603889c15;hb=3b501dcbaabd5922d829b217a541e697e8ed1a59;hp=066a0166ec1e005241955f4cdd4efadcc70597f8;hpb=5869fd634c6a174ef2c541ddad4b1a4e9ec26d29;p=nihav.git diff --git a/src/frame.rs b/src/frame.rs index 066a016..cfe6ab8 100644 --- a/src/frame.rs +++ b/src/frame.rs @@ -1,20 +1,83 @@ use std::collections::HashMap; +use std::rc::Rc; #[allow(dead_code)] +#[derive(Copy,Clone)] pub struct NASoniton { bits: u8, is_be: bool, packed: bool, planar: bool, float: bool, + signed: bool, } #[allow(dead_code)] -pub const SND_U8_FORMAT: NASoniton = NASoniton { bits: 8, is_be: false, packed: false, planar: false, float: false }; +pub const SND_U8_FORMAT: NASoniton = NASoniton { bits: 8, is_be: false, packed: false, planar: false, float: false, signed: false }; #[allow(dead_code)] -pub const SND_S16_FORMAT: NASoniton = NASoniton { bits: 16, is_be: false, packed: false, planar: false, float: false }; +pub const SND_S16_FORMAT: NASoniton = NASoniton { bits: 16, is_be: false, packed: false, planar: false, float: false, signed: true }; + +#[derive(Debug,Clone,Copy)] +pub enum NAChannelType { + C, L, R, Ls, Rs, Lss, Rss, LFE, Lc, Rc, Lh, Rh, Ch, LFE2, Lw, Rw, Ov, Lhs, Rhs, Chr, Ll, Rl, Cl, Lt, Rt, Lo, Ro +} + +impl NAChannelType { + pub fn is_center(&self) -> bool { + match *self { + NAChannelType::C => true, NAChannelType::Ch => true, + NAChannelType::Cl => true, NAChannelType::Ov => true, + NAChannelType::LFE => true, NAChannelType::LFE2 => true, + _ => false, + } + } + pub fn is_left(&self) -> bool { + match *self { + NAChannelType::L => true, NAChannelType::Ls => true, + NAChannelType::Lss => true, NAChannelType::Lc => true, + NAChannelType::Lh => true, NAChannelType::Lw => true, + NAChannelType::Lhs => true, NAChannelType::Ll => true, + NAChannelType::Lt => true, NAChannelType::Lo => true, + _ => false, + } + } + pub fn is_right(&self) -> bool { + match *self { + NAChannelType::R => true, NAChannelType::Rs => true, + NAChannelType::Rss => true, NAChannelType::Rc => true, + NAChannelType::Rh => true, NAChannelType::Rw => true, + NAChannelType::Rhs => true, NAChannelType::Rl => true, + NAChannelType::Rt => true, NAChannelType::Ro => true, + _ => false, + } + } +} + +pub struct NAChannelMap { + ids: Vec, +} + +impl NAChannelMap { + pub fn new() -> Self { NAChannelMap { ids: Vec::new() } } + pub fn add_channel(&mut self, ch: NAChannelType) { + self.ids.push(ch); + } + pub fn num_channels(&self) -> usize { + self.ids.len() + } + pub fn get_channel(&self, idx: usize) -> NAChannelType { + self.ids[idx] + } + pub fn find_channel_id(&self, t: NAChannelType) -> Option { + for i in 0..self.ids.len() { + if self.ids[i] as i32 == t as i32 { return Some(i as u8); } + } + None + } +} #[allow(dead_code)] +#[derive(Clone,Copy)] pub struct NAAudioInfo { sample_rate: u32, channels: u8, @@ -28,7 +91,7 @@ impl NAAudioInfo { } } -#[derive(Debug)] +#[derive(Debug,Clone,Copy)] pub enum ColorModel { RGB, YUV, @@ -38,6 +101,7 @@ pub enum ColorModel { } #[allow(dead_code)] +#[derive(Clone,Copy)] pub struct NAPixelChromaton { h_ss: u8, v_ss: u8, @@ -49,6 +113,7 @@ pub struct NAPixelChromaton { } #[allow(dead_code)] +#[derive(Clone,Copy)] pub struct NAPixelFormaton { model: ColorModel, components: u8, @@ -90,6 +155,7 @@ pub const PAL8_FORMAT: NAPixelFormaton = NAPixelFormaton { model: ColorModel::RG #[allow(dead_code)] +#[derive(Clone,Copy)] pub struct NAVideoInfo { width: u32, height: u32, @@ -103,6 +169,7 @@ impl NAVideoInfo { } } +#[derive(Clone,Copy)] pub enum NACodecTypeInfo { None, Audio(NAAudioInfo), @@ -116,14 +183,24 @@ pub struct NABuffer<'a> { } #[allow(dead_code)] -pub struct NACodecInfo<'a> { +#[derive(Clone)] +pub struct NACodecInfo { properties: NACodecTypeInfo, - extradata: Option<&'a[u8]>, + extradata: Option>>, } -impl<'a> NACodecInfo<'a> { - pub fn new(p: NACodecTypeInfo, edata: Option<&'a[u8]>) -> Self { - NACodecInfo { properties: p, extradata: edata } +impl NACodecInfo { + pub fn new(p: NACodecTypeInfo, edata: Option>) -> Self { + let extradata = match edata { + None => None, + Some(vec) => Some(Rc::new(vec)), + }; + NACodecInfo { properties: p, extradata: extradata } + } + pub fn get_properties(&self) -> NACodecTypeInfo { self.properties } + pub fn get_extradata(&self) -> Option>> { + if let Some(ref vec) = self.extradata { return Some(vec.clone()); } + None } } @@ -146,11 +223,11 @@ pub struct NAFrame<'a> { dts: Option, duration: Option, buffer: &'a mut NABuffer<'a>, - info: &'a NACodecInfo<'a>, + info: &'a NACodecInfo, options: HashMap>, } #[allow(dead_code)] pub struct NACodecContext<'a> { - info: &'a NACodecInfo<'a>, + info: &'a NACodecInfo, }