X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=src%2Fcodecs%2Fmod.rs;h=1ee9f0deda2b73f7eebd13d2c5891c306f2e1b50;hb=5a3ac1b7ad4ea52f43b0464ecedffdad9db643fe;hp=54dc0f2096ca7d25d571e61351ed2684b62299a3;hpb=3f29a2a8c129f8d9bea68b235d5c3a649d60be2c;p=nihav.git diff --git a/src/codecs/mod.rs b/src/codecs/mod.rs index 54dc0f2..1ee9f0d 100644 --- a/src/codecs/mod.rs +++ b/src/codecs/mod.rs @@ -1,6 +1,7 @@ use frame::*; use std::rc::Rc; use std::cell::RefCell; +use std::mem; use io::byteio::ByteIOError; use io::bitreader::BitReaderError; use io::codebook::CodebookError; @@ -8,6 +9,9 @@ use io::codebook::CodebookError; #[derive(Debug,Clone,Copy,PartialEq)] #[allow(dead_code)] pub enum DecoderError { + NoFrame, + AllocError, + TryAgain, InvalidData, ShortData, MissingReference, @@ -15,7 +19,7 @@ pub enum DecoderError { Bug, } -type DecoderResult = Result; +pub type DecoderResult = Result; impl From for DecoderError { fn from(_: ByteIOError) -> Self { DecoderError::ShortData } @@ -34,6 +38,14 @@ 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 { println!("check failed at {}:{}", file!(), line!()); return Err(DecoderError::InvalidData); } }; +} + #[allow(dead_code)] struct HAMShuffler { lastframe: Option>, @@ -91,6 +103,40 @@ impl IPShuffler { } } +#[allow(dead_code)] +struct IPBShuffler { + lastframe: Option>, + nextframe: Option>, +} + +impl IPBShuffler { + #[allow(dead_code)] + fn new() -> Self { IPBShuffler { lastframe: None, nextframe: None } } + #[allow(dead_code)] + fn clear(&mut self) { self.lastframe = None; self.nextframe = None; } + #[allow(dead_code)] + fn add_frame(&mut self, buf: NAVideoBuffer) { + mem::swap(&mut self.lastframe, &mut self.nextframe); + self.lastframe = Some(buf); + } + #[allow(dead_code)] + fn get_lastref(&mut self) -> Option> { + if let Some(ref frm) = self.lastframe { + Some(frm.clone()) + } else { + None + } + } + #[allow(dead_code)] + fn get_nextref(&mut self) -> Option> { + if let Some(ref frm) = self.nextframe { + Some(frm.clone()) + } else { + None + } + } +} + pub trait NADecoder { fn init(&mut self, info: Rc) -> DecoderResult<()>; fn decode(&mut self, pkt: &NAPacket) -> DecoderResult; @@ -102,24 +148,49 @@ pub struct DecoderInfo { get_decoder: fn () -> Box, } -macro_rules! validate { - ($a:expr) => { if !$a { return Err(DecoderError::InvalidData); } }; -} +#[cfg(feature="h263")] +mod blockdsp; + +#[cfg(feature="decoder_clearvideo")] +mod clearvideo; +#[cfg(feature="decoder_gdvvid")] +mod gremlinvideo; +#[cfg(any(feature="decoder_indeo2", feature="decoder_indeo3", feature="decoder_indeo4", feature="decoder_indeo5", feature="decoder_imc"))] +mod indeo; +#[cfg(feature="h263")] +mod h263; -#[cfg(feature="decoder_indeo2")] -mod indeo2; -#[cfg(feature="decoder_indeo3")] -mod indeo3; #[cfg(feature="decoder_pcm")] mod pcm; const DECODERS: &[DecoderInfo] = &[ +#[cfg(feature="decoder_clearvideo")] + DecoderInfo { name: "clearvideo", get_decoder: clearvideo::get_decoder }, +#[cfg(feature="decoder_clearvideo")] + DecoderInfo { name: "clearvideo_rm", get_decoder: clearvideo::get_decoder_rm }, +#[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: indeo3::get_decoder }, + DecoderInfo { name: "indeo3", get_decoder: indeo::indeo3::get_decoder }, +#[cfg(feature="decoder_indeo4")] + DecoderInfo { name: "indeo4", get_decoder: indeo::indeo4::get_decoder }, +#[cfg(feature="decoder_indeo5")] + DecoderInfo { name: "indeo5", get_decoder: indeo::indeo5::get_decoder }, +#[cfg(feature="decoder_intel263")] + DecoderInfo { name: "intel263", get_decoder: h263::intel263::get_decoder }, +#[cfg(feature="decoder_realvideo1")] + DecoderInfo { name: "realvideo1", get_decoder: h263::rv10::get_decoder }, +#[cfg(feature="decoder_realvideo2")] + DecoderInfo { name: "realvideo2", get_decoder: h263::rv20::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> { @@ -130,64 +201,3 @@ pub fn find_decoder(name: &str) -> Option Box> { } None } - -#[cfg(test)] -use std::fs::{File, OpenOptions}; -#[cfg(test)] -use std::io::prelude::*; - -#[cfg(test)] -fn write_pgmyuv(pfx: &str, strno: usize, num: u64, frmref: NAFrameRef) { - let frm = frmref.borrow(); - let name = format!("assets/{}out{:02}_{:04}.pgm", pfx, strno, num); - let mut ofile = File::create(name).unwrap(); - let buf = frm.get_buffer().get_vbuf().unwrap(); - let (w, h) = buf.get_dimensions(0); - let (w2, h2) = buf.get_dimensions(1); - let tot_h = h + h2; - let hdr = format!("P5\n{} {}\n255\n", w, tot_h); - ofile.write_all(hdr.as_bytes()).unwrap(); - let dta = buf.get_data(); - let ls = buf.get_stride(0); - let mut idx = 0; - let mut idx2 = ls; - let mut pad: Vec = Vec::with_capacity((w - w2 * 2) / 2); - pad.resize((w - w2 * 2) / 2, 0xFF); - for _ in 0..h { - let line = &dta[idx..idx2]; - ofile.write_all(line).unwrap(); - idx += ls; - idx2 += ls; - } - let mut base1 = buf.get_offset(1); - let stride1 = buf.get_stride(1); - let mut base2 = buf.get_offset(2); - let stride2 = buf.get_stride(2); - for _ in 0..h2 { - let bend1 = base1 + w2; - let line = &dta[base1..bend1]; - ofile.write_all(line).unwrap(); - ofile.write_all(pad.as_slice()).unwrap(); - - let bend2 = base2 + w2; - let line = &dta[base2..bend2]; - ofile.write_all(line).unwrap(); - ofile.write_all(pad.as_slice()).unwrap(); - - base1 += stride1; - base2 += stride2; - } -} - -#[cfg(test)] -fn write_sound(pfx: &str, strno: usize, frmref: NAFrameRef, first: bool) { - let frm = frmref.borrow(); - let name = format!("assets/{}out{:02}.raw", pfx, strno); - let mut file = if first { File::create(name).unwrap() } else { OpenOptions::new().write(true).append(true).open(name).unwrap() }; - let btype = frm.get_buffer(); - let _ = match btype { - NABufferType::AudioU8(ref ab) => file.write_all(ab.get_data().as_ref()), - NABufferType::AudioPacked(ref ab) => file.write_all(ab.get_data().as_ref()), - _ => Ok(()), - }; -}