X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=src%2Fcodecs%2Fmod.rs;h=a2c10fe93f013b1f1d5f6cbe21b11e47e508fdc9;hb=d532000c8949263f00e6755c6390b3a65eb81b5c;hp=782d4513a0d2dfe42b7cebeb0407373ca153e44c;hpb=77d06de29413155ff49abe69a6a946295355655e;p=nihav.git diff --git a/src/codecs/mod.rs b/src/codecs/mod.rs index 782d451..a2c10fe 100644 --- a/src/codecs/mod.rs +++ b/src/codecs/mod.rs @@ -1,9 +1,9 @@ #[cfg(feature="decoder_indeo2")] pub mod indeo2; -use std::rc::Rc; use frame::*; -use demuxers::*; +use std::rc::Rc; +use std::cell::RefCell; use io::byteio::ByteIOError; use io::bitreader::BitReaderError; use io::codebook::CodebookError; @@ -37,8 +37,60 @@ impl From for DecoderError { fn from(_: CodebookError) -> Self { DecoderError::InvalidData } } +#[allow(dead_code)] +struct HAMShuffler { + lastframe: Option>, +} + +impl HAMShuffler { + #[allow(dead_code)] + fn new() -> Self { HAMShuffler { 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 clone_ref(&mut self) -> Option> { + if let Some(ref mut frm) = self.lastframe { + let newfrm = frm.copy_buffer(); + *frm = newfrm.clone(); + Some(newfrm) + } else { + None + } + } + #[allow(dead_code)] + fn get_output_frame(&mut self) -> Option> { + match self.lastframe { + Some(ref frm) => Some(frm.clone()), + None => None, + } + } +} + pub trait NADecoder { fn init(&mut self, info: Rc) -> DecoderResult<()>; - fn decode(&mut self, pkt: &NAPacket) -> DecoderResult>; + fn decode(&mut self, pkt: &NAPacket) -> DecoderResult; } +#[derive(Clone,Copy)] +pub struct DecoderInfo { + name: &'static str, + get_decoder: fn () -> Box, +} + +const DECODERS: &[DecoderInfo] = &[ +#[cfg(feature="decoder_indeo2")] + DecoderInfo { name: "indeo2", get_decoder: indeo2::get_decoder }, +]; + +pub fn find_decoder(name: &str) -> Option Box> { + for &dec in DECODERS { + if dec.name == name { + return Some(dec.get_decoder); + } + } + None +}