X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=src%2Fcodecs%2Fmod.rs;h=45005a39e0a100f684b19b438ce56a4b8cf27815;hb=06fd8c8865256ab5348996a23afeeb512bc45835;hp=14cb0b31cdce037d779d10adbae7a9276c863bd5;hpb=5c253468a59eed17a04ed9eed23da90f1b1da1a8;p=nihav.git diff --git a/src/codecs/mod.rs b/src/codecs/mod.rs index 14cb0b3..45005a3 100644 --- a/src/codecs/mod.rs +++ b/src/codecs/mod.rs @@ -1,6 +1,3 @@ -#[cfg(feature="decoder_indeo2")] -pub mod indeo2; - use frame::*; use std::rc::Rc; use std::cell::RefCell; @@ -11,6 +8,9 @@ use io::codebook::CodebookError; #[derive(Debug,Clone,Copy,PartialEq)] #[allow(dead_code)] pub enum DecoderError { + NoFrame, + AllocError, + TryAgain, InvalidData, ShortData, MissingReference, @@ -18,7 +18,7 @@ pub enum DecoderError { Bug, } -type DecoderResult = Result; +pub type DecoderResult = Result; impl From for DecoderError { fn from(_: ByteIOError) -> Self { DecoderError::ShortData } @@ -37,9 +37,17 @@ impl From for DecoderError { fn from(_: CodebookError) -> Self { DecoderError::InvalidData } } +impl From for DecoderError { + fn from(_: AllocatorError) -> Self { DecoderError::AllocError } +} + +macro_rules! validate { + ($a:expr) => { if !$a { return Err(DecoderError::InvalidData); } }; +} + #[allow(dead_code)] struct HAMShuffler { - lastframe: Option, + lastframe: Option>, } impl HAMShuffler { @@ -48,13 +56,13 @@ impl HAMShuffler { #[allow(dead_code)] fn clear(&mut self) { self.lastframe = None; } #[allow(dead_code)] - fn add_frame(&mut self, frm: NAFrame) { - self.lastframe = Some(Rc::new(RefCell::new(frm))); + fn add_frame(&mut self, buf: NAVideoBuffer) { + self.lastframe = Some(buf); } #[allow(dead_code)] - fn clone_ref(&mut self) -> Option { + fn clone_ref(&mut self) -> Option> { if let Some(ref mut frm) = self.lastframe { - let newfrm = Rc::new(RefCell::new(NAFrame::from_copy(&frm.borrow()))); + let newfrm = frm.copy_buffer(); *frm = newfrm.clone(); Some(newfrm) } else { @@ -62,7 +70,7 @@ impl HAMShuffler { } } #[allow(dead_code)] - fn get_output_frame(&mut self) -> Option { + fn get_output_frame(&mut self) -> Option> { match self.lastframe { Some(ref frm) => Some(frm.clone()), None => None, @@ -70,6 +78,30 @@ impl HAMShuffler { } } +#[allow(dead_code)] +struct IPShuffler { + lastframe: Option>, +} + +impl IPShuffler { + #[allow(dead_code)] + fn new() -> Self { IPShuffler { lastframe: None } } + #[allow(dead_code)] + fn clear(&mut self) { self.lastframe = None; } + #[allow(dead_code)] + fn add_frame(&mut self, buf: NAVideoBuffer) { + self.lastframe = Some(buf); + } + #[allow(dead_code)] + fn get_ref(&mut self) -> Option> { + if let Some(ref frm) = self.lastframe { + Some(frm.clone()) + } else { + None + } + } +} + pub trait NADecoder { fn init(&mut self, info: Rc) -> DecoderResult<()>; fn decode(&mut self, pkt: &NAPacket) -> DecoderResult; @@ -81,9 +113,35 @@ pub struct DecoderInfo { get_decoder: fn () -> Box, } +#[cfg(feature="h263")] +mod blockdsp; + +#[cfg(feature="decoder_gdvvid")] +mod gremlinvideo; +#[cfg(any(feature="decoder_indeo2", feature="decoder_indeo3", feature="decoder_imc"))] +mod indeo; +#[cfg(feature="h263")] +mod h263; + +#[cfg(feature="decoder_pcm")] +mod pcm; + const DECODERS: &[DecoderInfo] = &[ +#[cfg(feature="decoder_gdvvid")] + DecoderInfo { name: "gdv-video", get_decoder: gremlinvideo::get_decoder }, #[cfg(feature="decoder_indeo2")] - DecoderInfo { name: "indeo2", get_decoder: indeo2::get_decoder }, + DecoderInfo { name: "indeo2", get_decoder: indeo::indeo2::get_decoder }, +#[cfg(feature="decoder_indeo3")] + DecoderInfo { name: "indeo3", get_decoder: indeo::indeo3::get_decoder }, +#[cfg(feature="decoder_intel263")] + DecoderInfo { name: "intel263", get_decoder: h263::intel263::get_decoder }, + +#[cfg(feature="decoder_pcm")] + DecoderInfo { name: "pcm", get_decoder: pcm::get_decoder }, +#[cfg(feature="decoder_imc")] + DecoderInfo { name: "imc", get_decoder: indeo::imc::get_decoder_imc }, +#[cfg(feature="decoder_imc")] + DecoderInfo { name: "iac", get_decoder: indeo::imc::get_decoder_iac }, ]; pub fn find_decoder(name: &str) -> Option Box> {