13 fn calc_quant(glob_q: u32, qd: i16) -> u8 {
14 let q = (glob_q as i16) + qd;
33 impl 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()?;
45 data_size = br.read(24)? as usize;
50 return Ok(PictureHeader::new_null(ftype));
53 br.skip(32)?; // key lock
57 let pic_size_idx = br.read(3)?;
59 width = INDEO4_PICTURE_SIZE_TAB[pic_size_idx as usize][0];
60 height = INDEO4_PICTURE_SIZE_TAB[pic_size_idx as usize][1];
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));
71 let idx = br.read(4)? as usize;
73 slice_w = INDEO4_SLICE_SIZE_TAB[idx];
74 slice_h = INDEO4_SLICE_SIZE_TAB[idx];
83 let subsampling = br.read(2)?;
84 validate!(subsampling == 0);
85 let sc_idx = br.read(2)?;
88 2 => { validate!(br.read(2*4)? == 0xFF); }
89 _ => { return Err(DecoderError::InvalidData); }
91 let luma_bands = if sc_idx == 2 { 4 } else { 1 };
92 let sc_idx = br.read(2)?;
95 2 => { validate!(br.read(2*4)? == 0xFF); }
96 _ => { return Err(DecoderError::InvalidData); }
98 let chroma_bands = if sc_idx == 2 { 4 } else { 1 };
101 frame_no = br.read(20)?;
106 br.skip(8)?; // decTimeEst
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;
119 let checksum = if br.read_bool()? { br.read(16)? } else { 0 };
121 br.skip(8)?; // pic hdr extension
124 println!("bad blocks bits!");
128 Ok(PictureHeader::new(ftype, width, height, slice_w, slice_h, transparent, luma_bands, chroma_bands, in_q))
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);
139 return Ok(BandHeader::new_empty(plane_no, band_no));
143 hdr_size = br.read(16)? as usize;
147 let mv_mode = br.read(2)?;
148 validate!(mv_mode < 2);
150 br.skip(16)?; //checksum
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)?;
161 let tr: IVITransformType;
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;
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));
192 tr = IVITransformType::None(TSize::T8x8);
193 txtype = TxType::None;
199 blk_cb = br.read_ivi_codebook_desc(false, true)?;
201 blk_cb = self.blk_cb;
205 rvmap_idx = br.read(3)? as usize;
210 let mut corr_map: [u8; CORR_MAP_SIZE] = [0; CORR_MAP_SIZE];
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;
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))
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<()> {
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;
240 return Err(DecoderError::MissingReference);
243 if !pic_hdr.ftype.is_bidir() {
244 mb.mtype = if br.read_bool()? { MBType::Inter } else { MBType::Intra };
246 mb.mtype = match br.read(2)? {
247 0 => { MBType::Intra },
248 1 => { MBType::Inter },
249 2 => { MBType::Backward },
250 _ => { MBType::Bidir },
254 if band.mb_size == band.blk_size {
255 mb.cbp = br.read(1)? as u8;
257 mb.cbp = br.read(4)? as u8;
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);
264 mb.q = band.quant as u8;
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);
270 mb.q = band.quant as u8;
273 if mb.mtype != MBType::Intra {
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;
282 mb.mv_x = scale_mv(mx, mv_scale);
283 mb.mv_y = scale_mv(my, mv_scale);
287 mv_y += br.read_ivi_cb_s(&self.mb_cb)?;
288 mv_x += br.read_ivi_cb_s(&self.mb_cb)?;
291 if mb.mtype == MBType::Backward {
294 } else if mb.mtype == MBType::Bidir {
295 mv_y += br.read_ivi_cb_s(&self.mb_cb)?;
296 mv_x += br.read_ivi_cb_s(&self.mb_cb)?;
303 validate!(!pic_hdr.ftype.is_intra());
304 mb.mtype = MBType::Inter;
307 if (band.plane_no == 0) && (band.band_no == 0) && pic_hdr.in_q {
308 mb.qd = br.read_ivi_cb_s(&self.mb_cb)? as i16;
309 mb.q = calc_quant(band.quant, mb.qd);
312 if let Some(ref tileref) = ref_tile {
313 let mx = tileref.mb[mb_idx].mv_x;
314 let my = tileref.mb[mb_idx].mv_y;
319 mb.mv_x = scale_mv(mx, mv_scale);
320 mb.mv_y = scale_mv(my, mv_scale);
325 tile.mb[mb_idx] = mb;
333 fn recombine_plane(&mut self, src: &[i16], sstride: usize, dst: &mut [u8], dstride: usize, w: usize, h: usize) {
335 let mut idx1 = w / 2;
336 let mut idx2 = (h / 2) * sstride;
337 let mut idx3 = idx2 + idx1;
339 let mut oidx1 = dstride;
343 let p0 = src[idx0 + x];
344 let p1 = src[idx1 + x];
345 let p2 = src[idx2 + x];
346 let p3 = src[idx3 + x];
347 dst[oidx0 + x * 2 + 0] = clip8(((p0 + p1 + p2 + p3 + 2) >> 2) + 128);
348 dst[oidx0 + x * 2 + 1] = clip8(((p0 + p1 - p2 - p3 + 2) >> 2) + 128);
349 dst[oidx1 + x * 2 + 0] = clip8(((p0 - p1 + p2 - p3 + 2) >> 2) + 128);
350 dst[oidx1 + x * 2 + 1] = clip8(((p0 - p1 - p2 + p3 + 2) >> 2) + 128);
356 oidx0 += dstride * 2;
357 oidx1 += dstride * 2;
362 struct Indeo4Decoder {
363 info: Rc<NACodecInfo>,
370 info: NACodecInfo::new_dummy(),
371 dec: IVIDecoder::new(),
376 impl NADecoder for Indeo4Decoder {
377 fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
378 if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
379 let w = vinfo.get_width();
380 let h = vinfo.get_height();
381 let f = vinfo.is_flipped();
382 let fmt = formats::YUV410_FORMAT;
383 let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, f, fmt));
384 self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()));
387 Err(DecoderError::InvalidData)
390 fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
391 let src = pkt.get_buffer();
392 let mut br = BitReader::new(src.as_slice(), src.len(), BitReaderMode::LE);
394 let mut ip = Indeo4Parser::new();
395 let bufinfo = self.dec.decode_frame(&mut ip, &mut br)?;
396 let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
397 frm.set_keyframe(self.dec.is_intra());
398 frm.set_frame_type(self.dec.get_frame_type());
399 Ok(Rc::new(RefCell::new(frm)))
403 const INDEO4_PICTURE_SIZE_TAB: [[usize; 2]; 7] = [
404 [640, 480], [320, 240], [160, 120], [704, 480], [352, 240], [352, 288], [176, 144]
407 const INDEO4_SLICE_SIZE_TAB: [usize; 15] = [
408 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 480
411 const INDEO4_FRAME_TYPE: [IVIFrameType; 7] = [
412 IVIFrameType::Intra, IVIFrameType::Intra1, IVIFrameType::Inter, IVIFrameType::Bidir,
413 IVIFrameType::InterDroppable, IVIFrameType::NULL, IVIFrameType::NULL2
416 const INDEO4_TRANSFORMS: [IVITransformType; 18] = [
417 IVITransformType::Haar(TSize::T8x8, TDir::TwoD),
418 IVITransformType::Haar(TSize::T8x8, TDir::Row),
419 IVITransformType::Haar(TSize::T8x8, TDir::Col),
420 IVITransformType::None(TSize::T8x8),
421 IVITransformType::Slant(TSize::T8x8, TDir::TwoD),
422 IVITransformType::Slant(TSize::T8x8, TDir::Row),
423 IVITransformType::Slant(TSize::T8x8, TDir::Col),
424 IVITransformType::DCT(TSize::T8x8, TDir::TwoD),
425 IVITransformType::DCT(TSize::T8x8, TDir::Row),
426 IVITransformType::DCT(TSize::T8x8, TDir::Col),
427 IVITransformType::Haar(TSize::T4x4, TDir::TwoD),
428 IVITransformType::Slant(TSize::T4x4, TDir::TwoD),
429 IVITransformType::None(TSize::T4x4),
430 IVITransformType::Haar(TSize::T4x4, TDir::Row),
431 IVITransformType::Haar(TSize::T4x4, TDir::Col),
432 IVITransformType::Slant(TSize::T4x4, TDir::Row),
433 IVITransformType::Slant(TSize::T4x4, TDir::Col),
434 IVITransformType::DCT(TSize::T4x4, TDir::TwoD),
437 const INDEO4_SCAN_8X8_ALT: [usize; 64] = [
438 0, 8, 1, 9, 16, 24, 2, 3,
439 17, 25, 10, 11, 32, 40, 48, 56,
440 4, 5, 6, 7, 33, 41, 49, 57,
441 18, 19, 26, 27, 12, 13, 14, 15,
442 34, 35, 43, 42, 50, 51, 59, 58,
443 20, 21, 22, 23, 31, 30, 29, 28,
444 36, 37, 38, 39, 47, 46, 45, 44,
445 52, 53, 54, 55, 63, 62, 61, 60
447 const INDEO4_SCAN_4X4_ALT: [usize; 16] = [ 0, 1, 4, 5, 8, 12, 2, 3, 9, 13, 6, 7, 10, 11, 14, 15 ];
448 const INDEO4_SCAN_4X4_VER: [usize; 16] = [ 0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15 ];
449 const INDEO4_SCAN_4X4_HOR: [usize; 16] = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ];
451 const INDEO4_SCANS_8X8: [&[usize; 64]; 5] = [
452 &IVI_ZIGZAG, &INDEO4_SCAN_8X8_ALT, &IVI_SCAN_8X8_HOR, &IVI_SCAN_8X8_VER, &IVI_ZIGZAG
454 const INDEO4_SCANS_4X4: [&[usize; 16]; 5] = [
455 &IVI_SCAN_4X4, &INDEO4_SCAN_4X4_ALT, &INDEO4_SCAN_4X4_VER, &INDEO4_SCAN_4X4_HOR, &IVI_SCAN_4X4
458 const INDEO4_Q8X8_IDX: [usize; 15] = [ 0, 1, 0, 2, 1, 3, 0, 4, 1, 5, 0, 1, 6, 7, 8 ];
459 const INDEO4_Q4X4_IDX: [usize; 7] = [ 0, 1, 2, 2, 3, 3, 4 ];
461 const INDEO4_QUANT8X8_INTRA: [[u16; 64]; 9] = [
463 43, 342, 385, 470, 555, 555, 598, 726,
464 342, 342, 470, 513, 555, 598, 726, 769,
465 385, 470, 555, 555, 598, 726, 726, 811,
466 470, 470, 555, 555, 598, 726, 769, 854,
467 470, 555, 555, 598, 683, 726, 854, 1025,
468 555, 555, 598, 683, 726, 854, 1025, 1153,
469 555, 555, 598, 726, 811, 982, 1195, 1451,
470 555, 598, 726, 811, 982, 1195, 1451, 1793
472 86, 1195, 2390, 2390, 4865, 4865, 4865, 4865,
473 1195, 1195, 2390, 2390, 4865, 4865, 4865, 4865,
474 2390, 2390, 4865, 4865, 6827, 6827, 6827, 6827,
475 2390, 2390, 4865, 4865, 6827, 6827, 6827, 6827,
476 4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827,
477 4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827,
478 4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827,
479 4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827
481 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
482 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
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
490 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
491 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
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
499 897, 897, 897, 897, 897, 897, 897, 897,
500 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067,
501 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
502 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409,
503 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579,
504 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
505 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921,
506 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091
508 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
509 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
510 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
511 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
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
517 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
518 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
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
526 22, 171, 214, 257, 257, 299, 299, 342,
527 171, 171, 257, 257, 299, 299, 342, 385,
528 214, 257, 257, 299, 299, 342, 342, 385,
529 257, 257, 257, 299, 299, 342, 385, 427,
530 257, 257, 299, 299, 342, 385, 427, 513,
531 257, 299, 299, 342, 385, 427, 513, 598,
532 299, 299, 299, 385, 385, 470, 598, 726,
533 299, 299, 385, 385, 470, 598, 726, 897
535 86, 598, 1195, 1195, 2390, 2390, 2390, 2390,
536 598, 598, 1195, 1195, 2390, 2390, 2390, 2390,
537 1195, 1195, 2390, 2390, 3414, 3414, 3414, 3414,
538 1195, 1195, 2390, 2390, 3414, 3414, 3414, 3414,
539 2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414,
540 2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414,
541 2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414,
542 2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414
545 const INDEO4_QUANT8X8_INTER: [[u16; 64]; 9] = [
547 427, 427, 470, 427, 427, 427, 470, 470,
548 427, 427, 470, 427, 427, 427, 470, 470,
549 470, 470, 470, 470, 470, 470, 470, 470,
550 427, 427, 470, 470, 427, 427, 470, 470,
551 427, 427, 470, 427, 427, 427, 470, 470,
552 427, 427, 470, 427, 427, 427, 470, 470,
553 470, 470, 470, 470, 470, 470, 470, 470,
554 470, 470, 470, 470, 470, 470, 470, 470
556 1707, 1707, 2433, 2433, 3414, 3414, 3414, 3414,
557 1707, 1707, 2433, 2433, 3414, 3414, 3414, 3414,
558 2433, 2433, 3414, 3414, 4822, 4822, 4822, 4822,
559 2433, 2433, 3414, 3414, 4822, 4822, 4822, 4822,
560 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414,
561 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414,
562 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414,
563 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414
565 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
566 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
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
574 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
575 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
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
583 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
584 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
585 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281,
586 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
587 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
588 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
589 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281,
590 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281
592 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
593 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
594 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
595 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
596 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
597 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
598 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
599 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433
601 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
602 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
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
610 86, 171, 171, 214, 214, 214, 214, 257,
611 171, 171, 214, 214, 214, 214, 257, 257,
612 171, 214, 214, 214, 214, 257, 257, 257,
613 214, 214, 214, 214, 257, 257, 257, 299,
614 214, 214, 214, 257, 257, 257, 299, 299,
615 214, 214, 257, 257, 257, 299, 299, 299,
616 214, 257, 257, 257, 299, 299, 299, 342,
617 257, 257, 257, 299, 299, 299, 342, 342
619 854, 854, 1195, 1195, 1707, 1707, 1707, 1707,
620 854, 854, 1195, 1195, 1707, 1707, 1707, 1707,
621 1195, 1195, 1707, 1707, 2390, 2390, 2390, 2390,
622 1195, 1195, 1707, 1707, 2390, 2390, 2390, 2390,
623 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707,
624 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707,
625 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707,
626 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707
629 const INDEO4_QUANT4X4_INTRA: [[u16; 16]; 5] = [
636 129, 1025, 1451, 1451,
637 1025, 1025, 1451, 1451,
638 1451, 1451, 2049, 2049,
639 1451, 1451, 2049, 2049
657 const INDEO4_QUANT4X4_INTER: [[u16; 16]; 5] = [
664 513, 1025, 1238, 1238,
665 1025, 1025, 1238, 1238,
666 1238, 1238, 1451, 1451,
667 1238, 1238, 1451, 1451
685 const INDEO4_Q8_INTRA: [&[u16; 64]; 9] = [
686 &INDEO4_QUANT8X8_INTRA[0], &INDEO4_QUANT8X8_INTRA[1], &INDEO4_QUANT8X8_INTRA[2],
687 &INDEO4_QUANT8X8_INTRA[3], &INDEO4_QUANT8X8_INTRA[4], &INDEO4_QUANT8X8_INTRA[5],
688 &INDEO4_QUANT8X8_INTRA[6], &INDEO4_QUANT8X8_INTRA[7], &INDEO4_QUANT8X8_INTRA[8],
690 const INDEO4_Q8_INTER: [&[u16; 64]; 9] = [
691 &INDEO4_QUANT8X8_INTER[0], &INDEO4_QUANT8X8_INTER[1], &INDEO4_QUANT8X8_INTER[2],
692 &INDEO4_QUANT8X8_INTER[3], &INDEO4_QUANT8X8_INTER[4], &INDEO4_QUANT8X8_INTER[5],
693 &INDEO4_QUANT8X8_INTER[6], &INDEO4_QUANT8X8_INTER[7], &INDEO4_QUANT8X8_INTER[8],
695 const INDEO4_Q4_INTRA: [&[u16; 16]; 5] = [
696 &INDEO4_QUANT4X4_INTRA[0], &INDEO4_QUANT4X4_INTRA[1], &INDEO4_QUANT4X4_INTRA[2],
697 &INDEO4_QUANT4X4_INTRA[3], &INDEO4_QUANT4X4_INTRA[4]
699 const INDEO4_Q4_INTER: [&[u16; 16]; 5] = [
700 &INDEO4_QUANT4X4_INTER[0], &INDEO4_QUANT4X4_INTER[1], &INDEO4_QUANT4X4_INTER[2],
701 &INDEO4_QUANT4X4_INTER[3], &INDEO4_QUANT4X4_INTER[4]
704 pub fn get_decoder() -> Box<NADecoder> {
705 Box::new(Indeo4Decoder::new())
710 use test::dec_video::test_file_decoding;
713 test_file_decoding("avi", "assets/IV4/volcano.avi", /*None*/Some(16), true, false, Some("iv4"));