add flush() to decoder interface
[nihav.git] / nihav-core / src / codecs / mod.rs
... / ...
CommitLineData
1use std::fmt;
2use std::ops::{Add, AddAssign, Sub, SubAssign};
3
4pub use crate::frame::*;
5use std::mem;
6use crate::io::byteio::ByteIOError;
7use crate::io::bitreader::BitReaderError;
8use crate::io::codebook::CodebookError;
9
10#[derive(Debug,Clone,Copy,PartialEq)]
11#[allow(dead_code)]
12pub enum DecoderError {
13 NoFrame,
14 AllocError,
15 TryAgain,
16 InvalidData,
17 ShortData,
18 MissingReference,
19 NotImplemented,
20 Bug,
21}
22
23pub type DecoderResult<T> = Result<T, DecoderError>;
24
25impl From<ByteIOError> for DecoderError {
26 fn from(_: ByteIOError) -> Self { DecoderError::ShortData }
27}
28
29impl From<BitReaderError> for DecoderError {
30 fn from(e: BitReaderError) -> Self {
31 match e {
32 BitReaderError::BitstreamEnd => DecoderError::ShortData,
33 _ => DecoderError::InvalidData,
34 }
35 }
36}
37
38impl From<CodebookError> for DecoderError {
39 fn from(_: CodebookError) -> Self { DecoderError::InvalidData }
40}
41
42impl From<AllocatorError> for DecoderError {
43 fn from(_: AllocatorError) -> Self { DecoderError::AllocError }
44}
45
46#[allow(dead_code)]
47pub struct HAMShuffler {
48 lastframe: Option<NAVideoBufferRef<u8>>,
49}
50
51impl HAMShuffler {
52 #[allow(dead_code)]
53 pub fn new() -> Self { HAMShuffler { lastframe: None } }
54 #[allow(dead_code)]
55 pub fn clear(&mut self) { self.lastframe = None; }
56 #[allow(dead_code)]
57 pub fn add_frame(&mut self, buf: NAVideoBufferRef<u8>) {
58 self.lastframe = Some(buf);
59 }
60 #[allow(dead_code)]
61 pub fn clone_ref(&mut self) -> Option<NAVideoBufferRef<u8>> {
62 if let Some(ref mut frm) = self.lastframe {
63 let newfrm = frm.copy_buffer();
64 *frm = newfrm.clone().into_ref();
65 Some(newfrm.into_ref())
66 } else {
67 None
68 }
69 }
70 #[allow(dead_code)]
71 pub fn get_output_frame(&mut self) -> Option<NAVideoBufferRef<u8>> {
72 match self.lastframe {
73 Some(ref frm) => Some(frm.clone()),
74 None => None,
75 }
76 }
77}
78
79impl Default for HAMShuffler {
80 fn default() -> Self { Self { lastframe: None } }
81}
82
83#[allow(dead_code)]
84pub struct IPShuffler {
85 lastframe: Option<NAVideoBufferRef<u8>>,
86}
87
88impl IPShuffler {
89 #[allow(dead_code)]
90 pub fn new() -> Self { IPShuffler { lastframe: None } }
91 #[allow(dead_code)]
92 pub fn clear(&mut self) { self.lastframe = None; }
93 #[allow(dead_code)]
94 pub fn add_frame(&mut self, buf: NAVideoBufferRef<u8>) {
95 self.lastframe = Some(buf);
96 }
97 #[allow(dead_code)]
98 pub fn get_ref(&mut self) -> Option<NAVideoBufferRef<u8>> {
99 if let Some(ref frm) = self.lastframe {
100 Some(frm.clone())
101 } else {
102 None
103 }
104 }
105}
106
107impl Default for IPShuffler {
108 fn default() -> Self { Self { lastframe: None } }
109}
110
111#[allow(dead_code)]
112pub struct IPBShuffler {
113 lastframe: Option<NAVideoBufferRef<u8>>,
114 nextframe: Option<NAVideoBufferRef<u8>>,
115}
116
117impl IPBShuffler {
118 #[allow(dead_code)]
119 pub fn new() -> Self { IPBShuffler { lastframe: None, nextframe: None } }
120 #[allow(dead_code)]
121 pub fn clear(&mut self) { self.lastframe = None; self.nextframe = None; }
122 #[allow(dead_code)]
123 pub fn add_frame(&mut self, buf: NAVideoBufferRef<u8>) {
124 mem::swap(&mut self.lastframe, &mut self.nextframe);
125 self.lastframe = Some(buf);
126 }
127 #[allow(dead_code)]
128 pub fn get_lastref(&mut self) -> Option<NAVideoBufferRef<u8>> {
129 if let Some(ref frm) = self.lastframe {
130 Some(frm.clone())
131 } else {
132 None
133 }
134 }
135 #[allow(dead_code)]
136 pub fn get_nextref(&mut self) -> Option<NAVideoBufferRef<u8>> {
137 if let Some(ref frm) = self.nextframe {
138 Some(frm.clone())
139 } else {
140 None
141 }
142 }
143 #[allow(dead_code)]
144 pub fn get_b_fwdref(&mut self) -> Option<NAVideoBufferRef<u8>> {
145 if let Some(ref frm) = self.nextframe {
146 Some(frm.clone())
147 } else {
148 None
149 }
150 }
151 #[allow(dead_code)]
152 pub fn get_b_bwdref(&mut self) -> Option<NAVideoBufferRef<u8>> {
153 if let Some(ref frm) = self.lastframe {
154 Some(frm.clone())
155 } else {
156 None
157 }
158 }
159}
160
161impl Default for IPBShuffler {
162 fn default() -> Self { Self { lastframe: None, nextframe: None } }
163}
164
165#[derive(Debug,Clone,Copy,Default,PartialEq)]
166pub struct MV {
167 pub x: i16,
168 pub y: i16,
169}
170
171#[allow(clippy::many_single_char_names)]
172#[allow(clippy::collapsible_if)]
173impl MV {
174 pub fn new(x: i16, y: i16) -> Self { MV{ x, y } }
175 pub fn pred(a: MV, b: MV, c: MV) -> Self {
176 let x;
177 if a.x < b.x {
178 if b.x < c.x {
179 x = b.x;
180 } else {
181 if a.x < c.x { x = c.x; } else { x = a.x; }
182 }
183 } else {
184 if b.x < c.x {
185 if a.x < c.x { x = a.x; } else { x = c.x; }
186 } else {
187 x = b.x;
188 }
189 }
190 let y;
191 if a.y < b.y {
192 if b.y < c.y {
193 y = b.y;
194 } else {
195 if a.y < c.y { y = c.y; } else { y = a.y; }
196 }
197 } else {
198 if b.y < c.y {
199 if a.y < c.y { y = a.y; } else { y = c.y; }
200 } else {
201 y = b.y;
202 }
203 }
204 MV { x, y }
205 }
206}
207
208pub const ZERO_MV: MV = MV { x: 0, y: 0 };
209
210impl Add for MV {
211 type Output = MV;
212 fn add(self, other: MV) -> MV { MV { x: self.x + other.x, y: self.y + other.y } }
213}
214
215impl AddAssign for MV {
216 fn add_assign(&mut self, other: MV) { self.x += other.x; self.y += other.y; }
217}
218
219impl Sub for MV {
220 type Output = MV;
221 fn sub(self, other: MV) -> MV { MV { x: self.x - other.x, y: self.y - other.y } }
222}
223
224impl SubAssign for MV {
225 fn sub_assign(&mut self, other: MV) { self.x -= other.x; self.y -= other.y; }
226}
227
228impl fmt::Display for MV {
229 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
230 write!(f, "{},{}", self.x, self.y)
231 }
232}
233
234pub struct NADecoderSupport {
235 pub pool_u8: NAVideoBufferPool<u8>,
236 pub pool_u16: NAVideoBufferPool<u16>,
237 pub pool_u32: NAVideoBufferPool<u32>,
238}
239
240impl NADecoderSupport {
241 pub fn new() -> Self {
242 Self {
243 pool_u8: NAVideoBufferPool::new(0),
244 pool_u16: NAVideoBufferPool::new(0),
245 pool_u32: NAVideoBufferPool::new(0),
246 }
247 }
248}
249
250impl Default for NADecoderSupport {
251 fn default() -> Self { Self::new() }
252}
253
254
255pub trait NADecoder {
256 fn init(&mut self, supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()>;
257 fn decode(&mut self, supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef>;
258 fn flush(&mut self);
259}
260
261#[derive(Clone,Copy)]
262pub struct DecoderInfo {
263 pub name: &'static str,
264 pub get_decoder: fn () -> Box<dyn NADecoder>,
265}
266
267#[cfg(any(feature="blockdsp"))]
268pub mod blockdsp;
269
270#[cfg(feature="h263")]
271pub mod h263;
272
273#[derive(Default)]
274pub struct RegisteredDecoders {
275 decs: Vec<DecoderInfo>,
276}
277
278impl RegisteredDecoders {
279 pub fn new() -> Self {
280 Self { decs: Vec::new() }
281 }
282 pub fn add_decoder(&mut self, dec: DecoderInfo) {
283 self.decs.push(dec);
284 }
285 pub fn find_decoder(&self, name: &str) -> Option<fn () -> Box<dyn NADecoder>> {
286 for &dec in self.decs.iter() {
287 if dec.name == name {
288 return Some(dec.get_decoder);
289 }
290 }
291 None
292 }
293 pub fn iter(&self) -> std::slice::Iter<DecoderInfo> {
294 self.decs.iter()
295 }
296}
297
298pub const ZIGZAG: [usize; 64] = [
299 0, 1, 8, 16, 9, 2, 3, 10,
300 17, 24, 32, 25, 18, 11, 4, 5,
301 12, 19, 26, 33, 40, 48, 41, 34,
302 27, 20, 13, 6, 7, 14, 21, 28,
303 35, 42, 49, 56, 57, 50, 43, 36,
304 29, 22, 15, 23, 30, 37, 44, 51,
305 58, 59, 52, 45, 38, 31, 39, 46,
306 53, 60, 61, 54, 47, 55, 62, 63
307];