X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=src%2Fcodecs%2Fmod.rs;h=c3833576f79deff0225533814ab3c62b9b290b36;hb=16dd4f445b3ee6b038926fdd2b9cd0081186eb28;hp=7edcf9eb2e6cdb60ea3292f269505eca78908ea3;hpb=48c88fde06894a7692eb6350cbef12aa85d923f1;p=nihav.git diff --git a/src/codecs/mod.rs b/src/codecs/mod.rs index 7edcf9e..c383357 100644 --- a/src/codecs/mod.rs +++ b/src/codecs/mod.rs @@ -1,8 +1,10 @@ -#[cfg(feature="decoder_indeo2")] -pub mod indeo2; +use std::fmt; +use std::ops::{Add, AddAssign, Sub, SubAssign}; -use std::rc::Rc; 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; @@ -10,6 +12,9 @@ use io::codebook::CodebookError; #[derive(Debug,Clone,Copy,PartialEq)] #[allow(dead_code)] pub enum DecoderError { + NoFrame, + AllocError, + TryAgain, InvalidData, ShortData, MissingReference, @@ -17,7 +22,7 @@ pub enum DecoderError { Bug, } -type DecoderResult = Result; +pub type DecoderResult = Result; impl From for DecoderError { fn from(_: ByteIOError) -> Self { DecoderError::ShortData } @@ -36,9 +41,192 @@ 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>, +} + +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, + } + } +} + +#[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 + } + } +} + +#[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 + } + } + #[allow(dead_code)] + fn get_b_fwdref(&mut self) -> Option> { + if let Some(ref frm) = self.nextframe { + Some(frm.clone()) + } else { + None + } + } + #[allow(dead_code)] + fn get_b_bwdref(&mut self) -> Option> { + if let Some(ref frm) = self.lastframe { + Some(frm.clone()) + } else { + None + } + } +} + +#[derive(Debug,Clone,Copy)] +pub struct MV { + pub x: i16, + pub y: i16, +} + +impl MV { + pub fn new(x: i16, y: i16) -> Self { MV{ x: x, y: y } } + pub fn pred(a: MV, b: MV, c: MV) -> Self { + let x; + if a.x < b.x { + if b.x < c.x { + x = b.x; + } else { + if a.x < c.x { x = c.x; } else { x = a.x; } + } + } else { + if b.x < c.x { + if a.x < c.x { x = a.x; } else { x = c.x; } + } else { + x = b.x; + } + } + let y; + if a.y < b.y { + if b.y < c.y { + y = b.y; + } else { + if a.y < c.y { y = c.y; } else { y = a.y; } + } + } else { + if b.y < c.y { + if a.y < c.y { y = a.y; } else { y = c.y; } + } else { + y = b.y; + } + } + MV { x: x, y: y } + } +} + +pub const ZERO_MV: MV = MV { x: 0, y: 0 }; + +impl Add for MV { + type Output = MV; + fn add(self, other: MV) -> MV { MV { x: self.x + other.x, y: self.y + other.y } } +} + +impl AddAssign for MV { + fn add_assign(&mut self, other: MV) { self.x += other.x; self.y += other.y; } +} + +impl Sub for MV { + type Output = MV; + fn sub(self, other: MV) -> MV { MV { x: self.x - other.x, y: self.y - other.y } } +} + +impl SubAssign for MV { + fn sub_assign(&mut self, other: MV) { self.x -= other.x; self.y -= other.y; } +} + +impl fmt::Display for MV { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{},{}", self.x, self.y) + } +} + + 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)] @@ -47,9 +235,69 @@ pub struct DecoderInfo { get_decoder: fn () -> Box, } +#[cfg(any(feature="h263", feature="decoder_realvideo3", feature="decoder_realvideo4"))] +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(any(feature="decoder_realvideo3", feature="decoder_realvideo4", feature="decoder_realvideo6", feature="decoder_realaudio144", feature="decoder_realaudio288"))] +mod real; + +#[cfg(feature="decoder_pcm")] +mod pcm; +#[cfg(feature="decoder_sipro")] +mod sipro; +#[cfg(feature="decoder_ts102366")] +mod ts102366; + 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: 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_realvideo3")] + DecoderInfo { name: "realvideo3", get_decoder: real::rv30::get_decoder }, +#[cfg(feature="decoder_realvideo4")] + DecoderInfo { name: "realvideo4", get_decoder: real::rv40::get_decoder }, +#[cfg(feature="decoder_realvideo6")] + DecoderInfo { name: "realvideo6", get_decoder: real::rv60::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 }, +#[cfg(feature="decoder_realaudio144")] + DecoderInfo { name: "ra14.4", get_decoder: real::ra144::get_decoder }, +#[cfg(feature="decoder_realaudio288")] + DecoderInfo { name: "ra28.8", get_decoder: real::ra288::get_decoder }, +#[cfg(feature="decoder_sipro")] + DecoderInfo { name: "sipro", get_decoder: sipro::get_decoder }, +#[cfg(feature="decoder_ts102366")] + DecoderInfo { name: "ac3", get_decoder: ts102366::get_decoder }, ]; pub fn find_decoder(name: &str) -> Option Box> {