3 use std::cell::RefCell;
5 use io::byteio::ByteIOError;
6 use io::bitreader::BitReaderError;
7 use io::codebook::CodebookError;
9 #[derive(Debug,Clone,Copy,PartialEq)]
11 pub enum DecoderError {
22 pub type DecoderResult<T> = Result<T, DecoderError>;
24 impl From<ByteIOError> for DecoderError {
25 fn from(_: ByteIOError) -> Self { DecoderError::ShortData }
28 impl From<BitReaderError> for DecoderError {
29 fn from(e: BitReaderError) -> Self {
31 BitReaderError::BitstreamEnd => DecoderError::ShortData,
32 _ => DecoderError::InvalidData,
37 impl From<CodebookError> for DecoderError {
38 fn from(_: CodebookError) -> Self { DecoderError::InvalidData }
41 impl From<AllocatorError> for DecoderError {
42 fn from(_: AllocatorError) -> Self { DecoderError::AllocError }
45 macro_rules! validate {
46 ($a:expr) => { if !$a { println!("check failed at {}:{}", file!(), line!()); return Err(DecoderError::InvalidData); } };
51 lastframe: Option<NAVideoBuffer<u8>>,
56 fn new() -> Self { HAMShuffler { lastframe: None } }
58 fn clear(&mut self) { self.lastframe = None; }
60 fn add_frame(&mut self, buf: NAVideoBuffer<u8>) {
61 self.lastframe = Some(buf);
64 fn clone_ref(&mut self) -> Option<NAVideoBuffer<u8>> {
65 if let Some(ref mut frm) = self.lastframe {
66 let newfrm = frm.copy_buffer();
67 *frm = newfrm.clone();
74 fn get_output_frame(&mut self) -> Option<NAVideoBuffer<u8>> {
75 match self.lastframe {
76 Some(ref frm) => Some(frm.clone()),
84 lastframe: Option<NAVideoBuffer<u8>>,
89 fn new() -> Self { IPShuffler { lastframe: None } }
91 fn clear(&mut self) { self.lastframe = None; }
93 fn add_frame(&mut self, buf: NAVideoBuffer<u8>) {
94 self.lastframe = Some(buf);
97 fn get_ref(&mut self) -> Option<NAVideoBuffer<u8>> {
98 if let Some(ref frm) = self.lastframe {
108 lastframe: Option<NAVideoBuffer<u8>>,
109 nextframe: Option<NAVideoBuffer<u8>>,
114 fn new() -> Self { IPBShuffler { lastframe: None, nextframe: None } }
116 fn clear(&mut self) { self.lastframe = None; self.nextframe = None; }
118 fn add_frame(&mut self, buf: NAVideoBuffer<u8>) {
119 mem::swap(&mut self.lastframe, &mut self.nextframe);
120 self.lastframe = Some(buf);
123 fn get_lastref(&mut self) -> Option<NAVideoBuffer<u8>> {
124 if let Some(ref frm) = self.lastframe {
131 fn get_nextref(&mut self) -> Option<NAVideoBuffer<u8>> {
132 if let Some(ref frm) = self.nextframe {
140 pub trait NADecoder {
141 fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()>;
142 fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef>;
145 #[derive(Clone,Copy)]
146 pub struct DecoderInfo {
148 get_decoder: fn () -> Box<NADecoder>,
151 #[cfg(feature="h263")]
154 #[cfg(feature="decoder_clearvideo")]
156 #[cfg(feature="decoder_gdvvid")]
158 #[cfg(any(feature="decoder_indeo2", feature="decoder_indeo3", feature="decoder_indeo4", feature="decoder_indeo5", feature="decoder_imc"))]
160 #[cfg(feature="h263")]
163 #[cfg(feature="decoder_pcm")]
166 const DECODERS: &[DecoderInfo] = &[
167 #[cfg(feature="decoder_clearvideo")]
168 DecoderInfo { name: "clearvideo", get_decoder: clearvideo::get_decoder },
169 #[cfg(feature="decoder_clearvideo")]
170 DecoderInfo { name: "clearvideo_rm", get_decoder: clearvideo::get_decoder_rm },
171 #[cfg(feature="decoder_gdvvid")]
172 DecoderInfo { name: "gdv-video", get_decoder: gremlinvideo::get_decoder },
173 #[cfg(feature="decoder_indeo2")]
174 DecoderInfo { name: "indeo2", get_decoder: indeo::indeo2::get_decoder },
175 #[cfg(feature="decoder_indeo3")]
176 DecoderInfo { name: "indeo3", get_decoder: indeo::indeo3::get_decoder },
177 #[cfg(feature="decoder_indeo4")]
178 DecoderInfo { name: "indeo4", get_decoder: indeo::indeo4::get_decoder },
179 #[cfg(feature="decoder_indeo5")]
180 DecoderInfo { name: "indeo5", get_decoder: indeo::indeo5::get_decoder },
181 #[cfg(feature="decoder_intel263")]
182 DecoderInfo { name: "intel263", get_decoder: h263::intel263::get_decoder },
183 #[cfg(feature="decoder_realvideo1")]
184 DecoderInfo { name: "realvideo1", get_decoder: h263::rv10::get_decoder },
185 #[cfg(feature="decoder_realvideo2")]
186 DecoderInfo { name: "realvideo2", get_decoder: h263::rv20::get_decoder },
188 #[cfg(feature="decoder_pcm")]
189 DecoderInfo { name: "pcm", get_decoder: pcm::get_decoder },
190 #[cfg(feature="decoder_imc")]
191 DecoderInfo { name: "imc", get_decoder: indeo::imc::get_decoder_imc },
192 #[cfg(feature="decoder_imc")]
193 DecoderInfo { name: "iac", get_decoder: indeo::imc::get_decoder_iac },
196 pub fn find_decoder(name: &str) -> Option<fn () -> Box<NADecoder>> {
197 for &dec in DECODERS {
198 if dec.name == name {
199 return Some(dec.get_decoder);