ivi: fix off-by-one shift
[nihav.git] / src / codecs / indeo / indeo4.rs
CommitLineData
01c971c5
KS
1use std::cell::Ref;
2use io::bitreader::*;
3use formats;
4use super::super::*;
5use super::ivi::*;
6use super::ivibr::*;
7
8struct Indeo4Parser {
9 mb_cb: IVICodebook,
10 blk_cb: IVICodebook,
11}
12
13fn calc_quant(glob_q: u32, qd: i16) -> u8 {
14 let q = (glob_q as i16) + qd;
15 if q < 0 {
16 0
17 } else if q > 31 {
18 31
19 } else {
20 q as u8
21 }
22}
23
24impl Indeo4Parser {
25 fn new() -> Self {
26 Indeo4Parser {
27 mb_cb: IVI_CB_ZERO,
28 blk_cb: IVI_CB_ZERO,
29 }
30 }
31}
32
33impl IndeoXParser for Indeo4Parser {
34#[allow(unused_variables,unused_assignments)]
35 fn decode_picture_header(&mut self, br: &mut BitReader) -> DecoderResult<PictureHeader> {
36 let sync = br.read(18)?;
37 validate!(sync == 0x3FFF8);
38 let ftype_idx = br.read(3)?;
39 validate!(ftype_idx < 7);
40 let ftype = INDEO4_FRAME_TYPE[ftype_idx as usize];
41 let transparent = br.read_bool()?;
42 br.skip(1)?;
43 let data_size;
44 if br.read_bool()? {
45 data_size = br.read(24)? as usize;
46 } else {
47 data_size = 0;
48 }
49 if ftype.is_null() {
50 return Ok(PictureHeader::new_null(ftype));
51 }
52 if br.read_bool()? {
53 br.skip(32)?; // key lock
54 }
55 let width;
56 let height;
57 let pic_size_idx = br.read(3)?;
58 if pic_size_idx < 7 {
59 width = INDEO4_PICTURE_SIZE_TAB[pic_size_idx as usize][0];
60 height = INDEO4_PICTURE_SIZE_TAB[pic_size_idx as usize][1];
61 } else {
62 height = br.read(16)? as usize;
63 width = br.read(16)? as usize;
64 validate!((width > 0) && ((width & 3) == 0));
65 validate!((height > 0) && ((height & 3) == 0));
66 }
67
68 let slice_w;
69 let slice_h;
70 if br.read_bool()? {
71 let idx = br.read(4)? as usize;
72 if idx < 15 {
73 slice_w = INDEO4_SLICE_SIZE_TAB[idx];
74 slice_h = INDEO4_SLICE_SIZE_TAB[idx];
75 } else {
76 slice_w = width;
77 slice_h = height;
78 }
79 } else {
80 slice_w = width;
81 slice_h = height;
82 }
83 let subsampling = br.read(2)?;
84 validate!(subsampling == 0);
85 let sc_idx = br.read(2)?;
86 match sc_idx {
87 3 => { },
88 2 => { validate!(br.read(2*4)? == 0xFF); }
89 _ => { return Err(DecoderError::InvalidData); }
90 };
91 let luma_bands = if sc_idx == 2 { 4 } else { 1 };
92 let sc_idx = br.read(2)?;
93 match sc_idx {
94 3 => { },
95 2 => { validate!(br.read(2*4)? == 0xFF); }
96 _ => { return Err(DecoderError::InvalidData); }
97 };
98 let chroma_bands = if sc_idx == 2 { 4 } else { 1 };
99 let frame_no;
100 if br.read_bool()? {
101 frame_no = br.read(20)?;
102 } else {
103 frame_no = 0;
104 }
105 if br.read_bool()? {
106 br.skip(8)?; // decTimeEst
107 }
108 let desc_coded = br.read_bool()?;
109 self.mb_cb = br.read_ivi_codebook_desc(true, desc_coded)?;
110 let desc_coded = br.read_bool()?;
111 self.blk_cb = br.read_ivi_codebook_desc(false, desc_coded)?;
112 let rvmap = if br.read_bool()? { br.read(3)? as usize } else { 8 };
113 let in_imf = br.read_bool()?;
114 let in_q = br.read_bool()?;
115 let glob_q = br.read(5)? as u8;
116 if br.read_bool()? {
117 br.skip(3)?;
118 }
119 let checksum = if br.read_bool()? { br.read(16)? } else { 0 };
120 if br.read_bool()? {
121 br.skip(8)?; // pic hdr extension
122 }
123 if br.read_bool()? {
124 println!("bad blocks bits!");
125 }
126 br.align();
127
128 Ok(PictureHeader::new(ftype, width, height, slice_w, slice_h, transparent, luma_bands, chroma_bands, in_q))
129 }
130
131#[allow(unused_variables,unused_assignments)]
132 fn decode_band_header(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, plane: usize, band: usize) -> DecoderResult<BandHeader> {
133 let plane_no = br.read(2)? as usize;
134 let band_no = br.read(4)? as usize;
135 validate!(plane_no == plane);
136 validate!(band_no == band);
137 if br.read_bool()? {
138 br.align();
139 return Ok(BandHeader::new_empty(plane_no, band_no));
140 }
141 let hdr_size;
142 if br.read_bool()? {
143 hdr_size = br.read(16)? as usize;
144 } else {
145 hdr_size = 32;
146 }
147 let mv_mode = br.read(2)?;
148 validate!(mv_mode < 2);
149 if br.read_bool()? {
150 br.skip(16)?; //checksum
151 }
152
153 let scale = br.read(2)?;
154 validate!(scale != 3);
155 let mb_size = 16 >> scale;
156 let blk_size = 8 >> (scale >> 1);
157 let inherit_mv = br.read_bool()?;
158 let inherit_qd = br.read_bool()?;
159 let quant = br.read(5)?;
160
161 let tr: IVITransformType;
162 let txtype: TxType;
163 if !br.read_bool()? || pic_hdr.ftype == IVIFrameType::Intra {
164 let tr_id = br.read(5)?;
165 validate!(tr_id < 18);
166 let scan_idx = br.read(4)? as usize;
167 validate!(scan_idx != 15);
168 let qmat_idx = br.read(5)? as usize;
169
170 tr = INDEO4_TRANSFORMS[tr_id as usize];
171 if (scan_idx < 5) || (scan_idx >= 10) {
172 validate!(tr.is_8x8());
173 validate!(qmat_idx < 15);
174 let scan = if scan_idx < 5 { INDEO4_SCANS_8X8[scan_idx] }
175 else { INDEO4_SCANS_8X8[4] };
176 let qidx = INDEO4_Q8X8_IDX[qmat_idx];
177 let qintra = INDEO4_Q8_INTRA[qidx];
178 let qinter = INDEO4_Q8_INTER[qidx];
179 txtype = TxType::Transform8(TxParams8x8::new(qintra, qinter, scan));
180 } else if scan_idx < 10 {
181 validate!(!tr.is_8x8());
182 validate!((qmat_idx >= 15) && (qmat_idx < 22));
183 let scan = INDEO4_SCANS_4X4[scan_idx - 5];
184 let qidx = INDEO4_Q4X4_IDX[qmat_idx - 15];
185 let qintra = INDEO4_Q4_INTRA[qidx];
186 let qinter = INDEO4_Q4_INTER[qidx];
187 txtype = TxType::Transform4(TxParams4x4::new(qintra, qinter, scan));
188 } else {
189 unreachable!();
190 }
191 } else {
192 tr = IVITransformType::None(TSize::T8x8);
193 txtype = TxType::None;
194 }
195
196 let blk_cb;
197 if br.read_bool()? {
198
199 blk_cb = br.read_ivi_codebook_desc(false, true)?;
200 } else {
201 blk_cb = self.blk_cb;
202 }
203 let rvmap_idx;
204 if br.read_bool()? {
205 rvmap_idx = br.read(3)? as usize;
206 } else {
207 rvmap_idx = 8;
208 }
209 let num_corr;
210 let mut corr_map: [u8; CORR_MAP_SIZE] = [0; CORR_MAP_SIZE];
211 if br.read_bool()? {
212 num_corr = br.read(8)? as usize;
213 validate!(num_corr*2 <= CORR_MAP_SIZE);
214 for i in 0..num_corr*2 {
215 corr_map[i] = br.read(8)? as u8;
216 }
217 } else {
218 num_corr = 0;
219 }
220
221 br.align();
222 Ok(BandHeader::new(plane_no, band_no, mb_size, blk_size, mv_mode == 1, inherit_mv, false, inherit_qd, quant, rvmap_idx, num_corr, corr_map, blk_cb, tr, txtype))
223 }
224
225 fn decode_mb_info(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, band: &BandHeader, tile: &mut IVITile, ref_tile: Option<Ref<IVITile>>, mv_scale: u8) -> DecoderResult<()> {
226 let mut mv_x = 0;
227 let mut mv_y = 0;
228 let mut mb_idx = 0;
229
230 for mb_y in 0..tile.mb_h {
231 for mb_x in 0..tile.mb_w {
232 let mut mb = MB::new(tile.pos_x + mb_x * band.mb_size, tile.pos_y + mb_y * band.mb_size);
233 if !br.read_bool()? {
234 if pic_hdr.ftype.is_intra() {
235 mb.mtype = MBType::Intra;
236 } else if band.inherit_mv {
237 if let Some(ref tileref) = ref_tile {
238 mb.mtype = tileref.mb[mb_idx].mtype;
239 } else {
240 return Err(DecoderError::MissingReference);
241 }
242 } else {
243 if !pic_hdr.ftype.is_bidir() {
244 mb.mtype = if br.read_bool()? { MBType::Inter } else { MBType::Intra };
245 } else {
246 mb.mtype = match br.read(2)? {
247 0 => { MBType::Intra },
248 1 => { MBType::Inter },
249 2 => { MBType::Backward },
250 _ => { MBType::Bidir },
251 };
252 }
253 }
254 if band.mb_size == band.blk_size {
255 mb.cbp = br.read(1)? as u8;
256 } else {
257 mb.cbp = br.read(4)? as u8;
258 }
259 if band.inherit_qd {
260 if let Some(ref tileref) = ref_tile {
261 mb.qd = tileref.mb[mb_idx].qd;
262 mb.q = calc_quant(band.quant, mb.qd);
263 } else {
264 mb.q = band.quant as u8;
265 }
266 } else if (mb.cbp != 0) || ((band.plane_no == 0) && (band.band_no == 0) && pic_hdr.in_q) {
267 mb.qd = br.read_ivi_cb_s(&self.mb_cb)? as i16;
268 mb.q = calc_quant(band.quant, mb.qd);
269 } else {
270 mb.q = band.quant as u8;
271 }
272
273 if mb.mtype != MBType::Intra {
274 if band.inherit_mv {
275 if let Some(ref tileref) = ref_tile {
276 let mx = tileref.mb[mb_idx].mv_x;
277 let my = tileref.mb[mb_idx].mv_y;
278 if mv_scale == 0 {
279 mb.mv_x = mx;
280 mb.mv_y = my;
281 } else {
282 mb.mv_x = scale_mv(mx, mv_scale);
283 mb.mv_y = scale_mv(my, mv_scale);
284 }
285 }
286 } else {
287 mv_y += br.read_ivi_cb_s(&self.mb_cb)?;
288 mv_x += br.read_ivi_cb_s(&self.mb_cb)?;
289 mb.mv_x = mv_x;
290 mb.mv_y = mv_y;
291 if mb.mtype == MBType::Backward {
292 mb.mv2_x = -mb.mv_x;
293 mb.mv2_y = -mb.mv_y;
294 mb.mv_x = 0;
295 mb.mv_y = 0;
296 } else if mb.mtype == MBType::Bidir {
297 mv_y += br.read_ivi_cb_s(&self.mb_cb)?;
298 mv_x += br.read_ivi_cb_s(&self.mb_cb)?;
299 mb.mv2_x = -mv_x;
300 mb.mv2_y = -mv_y;
301 }
302 }
303 }
304 } else {
305 validate!(!pic_hdr.ftype.is_intra());
306 mb.mtype = MBType::Inter;
307 mb.cbp = 0;
308 mb.qd = 0;
309 if (band.plane_no == 0) && (band.band_no == 0) && pic_hdr.in_q {
310 mb.qd = br.read_ivi_cb_s(&self.mb_cb)? as i16;
311 mb.q = calc_quant(band.quant, mb.qd);
312 }
313 if band.inherit_mv {
314 if let Some(ref tileref) = ref_tile {
315 let mx = tileref.mb[mb_idx].mv_x;
316 let my = tileref.mb[mb_idx].mv_y;
317 if mv_scale == 0 {
318 mb.mv_x = mx;
319 mb.mv_y = my;
320 } else {
321 mb.mv_x = scale_mv(mx, mv_scale);
322 mb.mv_y = scale_mv(my, mv_scale);
323 }
324 }
325 }
326 }
327 tile.mb[mb_idx] = mb;
328 mb_idx += 1;
329 }
330 }
331 br.align();
332 Ok(())
333 }
334
335 fn recombine_plane(&mut self, src: &[i16], sstride: usize, dst: &mut [u8], dstride: usize, w: usize, h: usize) {
336 let mut idx0 = 0;
337 let mut idx1 = w / 2;
338 let mut idx2 = (h / 2) * sstride;
339 let mut idx3 = idx2 + idx1;
340 let mut oidx0 = 0;
341 let mut oidx1 = dstride;
342
343 for _ in 0..(h/2) {
344 for x in 0..(w/2) {
345 let p0 = src[idx0 + x];
346 let p1 = src[idx1 + x];
347 let p2 = src[idx2 + x];
348 let p3 = src[idx3 + x];
349 dst[oidx0 + x * 2 + 0] = clip8(((p0 + p1 + p2 + p3 + 2) >> 2) + 128);
350 dst[oidx0 + x * 2 + 1] = clip8(((p0 + p1 - p2 - p3 + 2) >> 2) + 128);
351 dst[oidx1 + x * 2 + 0] = clip8(((p0 - p1 + p2 - p3 + 2) >> 2) + 128);
352 dst[oidx1 + x * 2 + 1] = clip8(((p0 - p1 - p2 + p3 + 2) >> 2) + 128);
353 }
354 idx0 += sstride;
355 idx1 += sstride;
356 idx2 += sstride;
357 idx3 += sstride;
358 oidx0 += dstride * 2;
359 oidx1 += dstride * 2;
360 }
361 }
362}
363
364struct Indeo4Decoder {
365 info: Rc<NACodecInfo>,
366 dec: IVIDecoder,
367}
368
369impl Indeo4Decoder {
370 fn new() -> Self {
371 Indeo4Decoder {
372 info: NACodecInfo::new_dummy(),
373 dec: IVIDecoder::new(),
374 }
375 }
376}
377
378impl NADecoder for Indeo4Decoder {
379 fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
380 if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
381 let w = vinfo.get_width();
382 let h = vinfo.get_height();
383 let f = vinfo.is_flipped();
384 let fmt = formats::YUV410_FORMAT;
385 let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, f, fmt));
386 self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()));
387 Ok(())
388 } else {
389 Err(DecoderError::InvalidData)
390 }
391 }
392 fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
393 let src = pkt.get_buffer();
394 let mut br = BitReader::new(src.as_slice(), src.len(), BitReaderMode::LE);
395
396 let mut ip = Indeo4Parser::new();
397 let bufinfo = self.dec.decode_frame(&mut ip, &mut br)?;
398 let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
399 frm.set_keyframe(self.dec.is_intra());
400 frm.set_frame_type(self.dec.get_frame_type());
401 Ok(Rc::new(RefCell::new(frm)))
402 }
403}
404
405const INDEO4_PICTURE_SIZE_TAB: [[usize; 2]; 7] = [
406 [640, 480], [320, 240], [160, 120], [704, 480], [352, 240], [252, 288], [176, 144]
407];
408
409const INDEO4_SLICE_SIZE_TAB: [usize; 15] = [
410 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 480
411];
412
413const INDEO4_FRAME_TYPE: [IVIFrameType; 7] = [
414 IVIFrameType::Intra, IVIFrameType::Intra1, IVIFrameType::Inter, IVIFrameType::Bidir,
415 IVIFrameType::InterDroppable, IVIFrameType::NULL, IVIFrameType::NULL2
416];
417
418const INDEO4_TRANSFORMS: [IVITransformType; 18] = [
419 IVITransformType::Haar(TSize::T8x8, TDir::TwoD),
420 IVITransformType::Haar(TSize::T8x8, TDir::Row),
421 IVITransformType::Haar(TSize::T8x8, TDir::Col),
422 IVITransformType::None(TSize::T8x8),
423 IVITransformType::Slant(TSize::T8x8, TDir::TwoD),
424 IVITransformType::Slant(TSize::T8x8, TDir::Row),
425 IVITransformType::Slant(TSize::T8x8, TDir::Col),
426 IVITransformType::DCT(TSize::T8x8, TDir::TwoD),
427 IVITransformType::DCT(TSize::T8x8, TDir::Row),
428 IVITransformType::DCT(TSize::T8x8, TDir::Col),
429 IVITransformType::Haar(TSize::T4x4, TDir::TwoD),
430 IVITransformType::Slant(TSize::T4x4, TDir::TwoD),
431 IVITransformType::None(TSize::T4x4),
432 IVITransformType::Haar(TSize::T4x4, TDir::Row),
433 IVITransformType::Haar(TSize::T4x4, TDir::Col),
434 IVITransformType::Slant(TSize::T4x4, TDir::Row),
435 IVITransformType::Slant(TSize::T4x4, TDir::Col),
436 IVITransformType::DCT(TSize::T4x4, TDir::TwoD),
437];
438
439const INDEO4_SCAN_8X8_ALT: [usize; 64] = [
440 0, 8, 1, 9, 16, 24, 2, 3,
441 17, 25, 10, 11, 32, 40, 48, 56,
442 4, 5, 6, 7, 33, 41, 49, 57,
443 18, 19, 26, 27, 12, 13, 14, 15,
444 34, 35, 43, 42, 50, 51, 59, 58,
445 20, 21, 22, 23, 31, 30, 29, 28,
446 36, 37, 38, 39, 47, 46, 45, 44,
447 52, 53, 54, 55, 63, 62, 61, 60
448];
449const INDEO4_SCAN_4X4_ALT: [usize; 16] = [ 0, 1, 4, 5, 8, 12, 2, 3, 9, 13, 6, 7, 10, 11, 14, 15 ];
450const INDEO4_SCAN_4X4_VER: [usize; 16] = [ 0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15 ];
451const INDEO4_SCAN_4X4_HOR: [usize; 16] = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ];
452
453const INDEO4_SCANS_8X8: [&[usize; 64]; 5] = [
454 &IVI_ZIGZAG, &INDEO4_SCAN_8X8_ALT, &IVI_SCAN_8X8_HOR, &IVI_SCAN_8X8_VER, &IVI_ZIGZAG
455];
456const INDEO4_SCANS_4X4: [&[usize; 16]; 5] = [
457 &IVI_SCAN_4X4, &INDEO4_SCAN_4X4_ALT, &INDEO4_SCAN_4X4_VER, &INDEO4_SCAN_4X4_HOR, &IVI_SCAN_4X4
458];
459
460const INDEO4_Q8X8_IDX: [usize; 15] = [ 0, 1, 0, 2, 1, 3, 0, 4, 1, 5, 0, 1, 6, 7, 8 ];
461const INDEO4_Q4X4_IDX: [usize; 7] = [ 0, 1, 2, 2, 3, 3, 4 ];
462
463const INDEO4_QUANT8X8_INTRA: [[u16; 64]; 9] = [
464 [
465 43, 342, 385, 470, 555, 555, 598, 726,
466 342, 342, 470, 513, 555, 598, 726, 769,
467 385, 470, 555, 555, 598, 726, 726, 811,
468 470, 470, 555, 555, 598, 726, 769, 854,
469 470, 555, 555, 598, 683, 726, 854, 1025,
470 555, 555, 598, 683, 726, 854, 1025, 1153,
471 555, 555, 598, 726, 811, 982, 1195, 1451,
472 555, 598, 726, 811, 982, 1195, 1451, 1793
473 ], [
474 86, 1195, 2390, 2390, 4865, 4865, 4865, 4865,
475 1195, 1195, 2390, 2390, 4865, 4865, 4865, 4865,
476 2390, 2390, 4865, 4865, 6827, 6827, 6827, 6827,
477 2390, 2390, 4865, 4865, 6827, 6827, 6827, 6827,
478 4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827,
479 4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827,
480 4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827,
481 4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827
482 ], [
483 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
484 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
485 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
486 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
487 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
488 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
489 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
490 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835
491 ], [
492 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
493 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
494 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
495 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
496 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
497 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
498 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
499 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414
500 ], [
501 897, 897, 897, 897, 897, 897, 897, 897,
502 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067,
503 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
504 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409,
505 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579,
506 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
507 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921,
508 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091
509 ], [
510 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
511 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
512 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
513 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
514 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
515 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
516 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
517 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414
518 ], [
519 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
520 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
521 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
522 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
523 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
524 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
525 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
526 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390
527 ], [
528 22, 171, 214, 257, 257, 299, 299, 342,
529 171, 171, 257, 257, 299, 299, 342, 385,
530 214, 257, 257, 299, 299, 342, 342, 385,
531 257, 257, 257, 299, 299, 342, 385, 427,
532 257, 257, 299, 299, 342, 385, 427, 513,
533 257, 299, 299, 342, 385, 427, 513, 598,
534 299, 299, 299, 385, 385, 470, 598, 726,
535 299, 299, 385, 385, 470, 598, 726, 897
536 ], [
537 86, 598, 1195, 1195, 2390, 2390, 2390, 2390,
538 598, 598, 1195, 1195, 2390, 2390, 2390, 2390,
539 1195, 1195, 2390, 2390, 3414, 3414, 3414, 3414,
540 1195, 1195, 2390, 2390, 3414, 3414, 3414, 3414,
541 2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414,
542 2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414,
543 2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414,
544 2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414
545 ]
546];
547const INDEO4_QUANT8X8_INTER: [[u16; 64]; 9] = [
548 [
549 427, 427, 470, 427, 427, 427, 470, 470,
550 427, 427, 470, 427, 427, 427, 470, 470,
551 470, 470, 470, 470, 470, 470, 470, 470,
552 427, 427, 470, 470, 427, 427, 470, 470,
553 427, 427, 470, 427, 427, 427, 470, 470,
554 427, 427, 470, 427, 427, 427, 470, 470,
555 470, 470, 470, 470, 470, 470, 470, 470,
556 470, 470, 470, 470, 470, 470, 470, 470
557 ], [
558 1707, 1707, 2433, 2433, 3414, 3414, 3414, 3414,
559 1707, 1707, 2433, 2433, 3414, 3414, 3414, 3414,
560 2433, 2433, 3414, 3414, 4822, 4822, 4822, 4822,
561 2433, 2433, 3414, 3414, 4822, 4822, 4822, 4822,
562 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414,
563 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414,
564 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414,
565 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414
566 ], [
567 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
568 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
569 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
570 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
571 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
572 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
573 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
574 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281
575 ], [
576 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
577 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
578 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
579 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
580 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
581 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
582 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
583 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433
584 ], [
585 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
586 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
587 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281,
588 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
589 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
590 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
591 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281,
592 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281
593 ], [
594 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
595 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
596 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
597 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
598 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
599 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
600 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
601 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433
602 ], [
603 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
604 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
605 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
606 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
607 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
608 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
609 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
610 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707
611 ], [
612 86, 171, 171, 214, 214, 214, 214, 257,
613 171, 171, 214, 214, 214, 214, 257, 257,
614 171, 214, 214, 214, 214, 257, 257, 257,
615 214, 214, 214, 214, 257, 257, 257, 299,
616 214, 214, 214, 257, 257, 257, 299, 299,
617 214, 214, 257, 257, 257, 299, 299, 299,
618 214, 257, 257, 257, 299, 299, 299, 342,
619 257, 257, 257, 299, 299, 299, 342, 342
620 ], [
621 854, 854, 1195, 1195, 1707, 1707, 1707, 1707,
622 854, 854, 1195, 1195, 1707, 1707, 1707, 1707,
623 1195, 1195, 1707, 1707, 2390, 2390, 2390, 2390,
624 1195, 1195, 1707, 1707, 2390, 2390, 2390, 2390,
625 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707,
626 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707,
627 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707,
628 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707
629 ]
630];
631const INDEO4_QUANT4X4_INTRA: [[u16; 16]; 5] = [
632 [
633 22, 214, 257, 299,
634 214, 257, 299, 342,
635 257, 299, 342, 427,
636 299, 342, 427, 513
637 ], [
638 129, 1025, 1451, 1451,
639 1025, 1025, 1451, 1451,
640 1451, 1451, 2049, 2049,
641 1451, 1451, 2049, 2049
642 ], [
643 43, 171, 171, 171,
644 43, 171, 171, 171,
645 43, 171, 171, 171,
646 43, 171, 171, 171
647 ], [
648 43, 43, 43, 43,
649 171, 171, 171, 171,
650 171, 171, 171, 171,
651 171, 171, 171, 171
652 ], [
653 43, 43, 43, 43,
654 43, 43, 43, 43,
655 43, 43, 43, 43,
656 43, 43, 43, 43
657 ]
658];
659const INDEO4_QUANT4X4_INTER: [[u16; 16]; 5] = [
660 [
661 107, 214, 257, 299,
662 214, 257, 299, 299,
663 257, 299, 299, 342,
664 299, 299, 342, 342
665 ], [
666 513, 1025, 1238, 1238,
667 1025, 1025, 1238, 1238,
668 1238, 1238, 1451, 1451,
669 1238, 1238, 1451, 1451
670 ], [
671 43, 171, 171, 171,
672 43, 171, 171, 171,
673 43, 171, 171, 171,
674 43, 171, 171, 171
675 ], [
676 43, 43, 43, 43,
677 171, 171, 171, 171,
678 171, 171, 171, 171,
679 171, 171, 171, 171
680 ], [
681 43, 43, 43, 43,
682 43, 43, 43, 43,
683 43, 43, 43, 43,
684 43, 43, 43, 43
685 ]
686];
687const INDEO4_Q8_INTRA: [&[u16; 64]; 9] = [
688 &INDEO4_QUANT8X8_INTRA[0], &INDEO4_QUANT8X8_INTRA[1], &INDEO4_QUANT8X8_INTRA[2],
689 &INDEO4_QUANT8X8_INTRA[3], &INDEO4_QUANT8X8_INTRA[4], &INDEO4_QUANT8X8_INTRA[5],
690 &INDEO4_QUANT8X8_INTRA[6], &INDEO4_QUANT8X8_INTRA[7], &INDEO4_QUANT8X8_INTRA[8],
691];
692const INDEO4_Q8_INTER: [&[u16; 64]; 9] = [
693 &INDEO4_QUANT8X8_INTER[0], &INDEO4_QUANT8X8_INTER[1], &INDEO4_QUANT8X8_INTER[2],
694 &INDEO4_QUANT8X8_INTER[3], &INDEO4_QUANT8X8_INTER[4], &INDEO4_QUANT8X8_INTER[5],
695 &INDEO4_QUANT8X8_INTER[6], &INDEO4_QUANT8X8_INTER[7], &INDEO4_QUANT8X8_INTER[8],
696];
697const INDEO4_Q4_INTRA: [&[u16; 16]; 5] = [
698 &INDEO4_QUANT4X4_INTRA[0], &INDEO4_QUANT4X4_INTRA[1], &INDEO4_QUANT4X4_INTRA[2],
699 &INDEO4_QUANT4X4_INTRA[3], &INDEO4_QUANT4X4_INTRA[4]
700];
701const INDEO4_Q4_INTER: [&[u16; 16]; 5] = [
702 &INDEO4_QUANT4X4_INTER[0], &INDEO4_QUANT4X4_INTER[1], &INDEO4_QUANT4X4_INTER[2],
703 &INDEO4_QUANT4X4_INTER[3], &INDEO4_QUANT4X4_INTER[4]
704];
705
706pub fn get_decoder() -> Box<NADecoder> {
707 Box::new(Indeo4Decoder::new())
708}
709
710#[cfg(test)]
711mod test {
712 use test::dec_video::test_file_decoding;
713 #[test]
714 fn test_indeo4() {
715 test_file_decoding("avi", "assets/IV4/volcano.avi", /*None*/Some(16), true, false, Some("iv4"));
716panic!("the end");
717 }
718}