9 fn mclip8(a: i32) -> u8 {
10 if (a as u16) > 255 { !(a >> 16) as u8 }
19 fn calc_quant(glob_q: u32, qd: i16) -> u8 {
20 let q = (glob_q as i16) + qd;
39 impl IndeoXParser for Indeo4Parser {
40 #[allow(unused_variables,unused_assignments)]
41 fn decode_picture_header(&mut self, br: &mut BitReader) -> DecoderResult<PictureHeader> {
42 let sync = br.read(18)?;
43 validate!(sync == 0x3FFF8);
44 let ftype_idx = br.read(3)?;
45 validate!(ftype_idx < 7);
46 let ftype = INDEO4_FRAME_TYPE[ftype_idx as usize];
47 let transparent = br.read_bool()?;
51 data_size = br.read(24)? as usize;
56 return Ok(PictureHeader::new_null(ftype));
59 br.skip(32)?; // key lock
63 let pic_size_idx = br.read(3)?;
65 width = INDEO4_PICTURE_SIZE_TAB[pic_size_idx as usize][0];
66 height = INDEO4_PICTURE_SIZE_TAB[pic_size_idx as usize][1];
68 height = br.read(16)? as usize;
69 width = br.read(16)? as usize;
70 validate!((width > 0) && ((width & 3) == 0));
71 validate!((height > 0) && ((height & 3) == 0));
77 let idx = br.read(4)? as usize;
79 slice_w = INDEO4_SLICE_SIZE_TAB[idx];
80 slice_h = INDEO4_SLICE_SIZE_TAB[idx];
89 let subsampling = br.read(2)?;
90 validate!(subsampling == 0);
91 let sc_idx = br.read(2)?;
94 2 => { validate!(br.read(2*4)? == 0xFF); }
95 _ => { return Err(DecoderError::InvalidData); }
97 let luma_bands = if sc_idx == 2 { 4 } else { 1 };
98 let sc_idx = br.read(2)?;
101 2 => { validate!(br.read(2*4)? == 0xFF); }
102 _ => { return Err(DecoderError::InvalidData); }
104 let chroma_bands = if sc_idx == 2 { 4 } else { 1 };
107 frame_no = br.read(20)?;
112 br.skip(8)?; // decTimeEst
114 let desc_coded = br.read_bool()?;
115 self.mb_cb = br.read_ivi_codebook_desc(true, desc_coded)?;
116 let desc_coded = br.read_bool()?;
117 self.blk_cb = br.read_ivi_codebook_desc(false, desc_coded)?;
118 let rvmap = if br.read_bool()? { br.read(3)? as usize } else { 8 };
119 let in_imf = br.read_bool()?;
120 let in_q = br.read_bool()?;
121 let glob_q = br.read(5)? as u8;
125 let checksum = if br.read_bool()? { br.read(16)? } else { 0 };
127 br.skip(8)?; // pic hdr extension
130 println!("bad blocks bits!");
134 Ok(PictureHeader::new(ftype, width, height, slice_w, slice_h, transparent, luma_bands, chroma_bands, in_q))
137 #[allow(unused_variables,unused_assignments)]
138 fn decode_band_header(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, plane: usize, band: usize) -> DecoderResult<BandHeader> {
139 let plane_no = br.read(2)? as usize;
140 let band_no = br.read(4)? as usize;
141 validate!(plane_no == plane);
142 validate!(band_no == band);
145 return Ok(BandHeader::new_empty(plane_no, band_no));
149 hdr_size = br.read(16)? as usize;
153 let mv_mode = br.read(2)?;
154 validate!(mv_mode < 2);
156 br.skip(16)?; //checksum
159 let scale = br.read(2)?;
160 validate!(scale != 3);
161 let mb_size = 16 >> scale;
162 let blk_size = 8 >> (scale >> 1);
163 let inherit_mv = br.read_bool()?;
164 let inherit_qd = br.read_bool()?;
165 let quant = br.read(5)?;
167 let tr: IVITransformType;
169 if !br.read_bool()? || pic_hdr.ftype == IVIFrameType::Intra {
170 let tr_id = br.read(5)?;
171 validate!(tr_id < 18);
172 let scan_idx = br.read(4)? as usize;
173 validate!(scan_idx != 15);
174 let qmat_idx = br.read(5)? as usize;
176 tr = INDEO4_TRANSFORMS[tr_id as usize];
177 if (scan_idx < 5) || (scan_idx >= 10) {
178 validate!(tr.is_8x8());
179 validate!(qmat_idx < 15);
180 let scan = if scan_idx < 5 { INDEO4_SCANS_8X8[scan_idx] }
181 else { INDEO4_SCANS_8X8[4] };
182 let qidx = INDEO4_Q8X8_IDX[qmat_idx];
183 let qintra = INDEO4_Q8_INTRA[qidx];
184 let qinter = INDEO4_Q8_INTER[qidx];
185 txtype = TxType::Transform8(TxParams8x8::new(qintra, qinter, scan));
186 } else if scan_idx < 10 {
187 validate!(!tr.is_8x8());
188 validate!((qmat_idx >= 15) && (qmat_idx < 22));
189 let scan = INDEO4_SCANS_4X4[scan_idx - 5];
190 let qidx = INDEO4_Q4X4_IDX[qmat_idx - 15];
191 let qintra = INDEO4_Q4_INTRA[qidx];
192 let qinter = INDEO4_Q4_INTER[qidx];
193 txtype = TxType::Transform4(TxParams4x4::new(qintra, qinter, scan));
198 tr = IVITransformType::None(TSize::T8x8);
199 txtype = TxType::None;
205 blk_cb = br.read_ivi_codebook_desc(false, true)?;
207 blk_cb = self.blk_cb;
211 rvmap_idx = br.read(3)? as usize;
216 let mut corr_map: [u8; CORR_MAP_SIZE] = [0; CORR_MAP_SIZE];
218 num_corr = br.read(8)? as usize;
219 validate!(num_corr*2 <= CORR_MAP_SIZE);
220 for i in 0..num_corr*2 {
221 corr_map[i] = br.read(8)? as u8;
228 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))
231 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<()> {
236 for mb_y in 0..tile.mb_h {
237 for mb_x in 0..tile.mb_w {
238 let mut mb = MB::new(tile.pos_x + mb_x * band.mb_size, tile.pos_y + mb_y * band.mb_size);
239 if !br.read_bool()? {
240 if pic_hdr.ftype.is_intra() {
241 mb.mtype = MBType::Intra;
242 } else if band.inherit_mv {
243 if let Some(ref tileref) = ref_tile {
244 mb.mtype = tileref.mb[mb_idx].mtype;
246 return Err(DecoderError::MissingReference);
249 if !pic_hdr.ftype.is_bidir() {
250 mb.mtype = if br.read_bool()? { MBType::Inter } else { MBType::Intra };
252 mb.mtype = match br.read(2)? {
253 0 => { MBType::Intra },
254 1 => { MBType::Inter },
255 2 => { MBType::Backward },
256 _ => { MBType::Bidir },
260 if band.mb_size == band.blk_size {
261 mb.cbp = br.read(1)? as u8;
263 mb.cbp = br.read(4)? as u8;
266 if let Some(ref tileref) = ref_tile {
267 mb.qd = tileref.mb[mb_idx].qd;
268 mb.q = calc_quant(band.quant, mb.qd);
270 mb.q = band.quant as u8;
272 } else if (mb.cbp != 0) || ((band.plane_no == 0) && (band.band_no == 0) && pic_hdr.in_q) {
273 mb.qd = br.read_ivi_cb_s(&self.mb_cb)? as i16;
274 mb.q = calc_quant(band.quant, mb.qd);
276 mb.q = band.quant as u8;
279 if mb.mtype != MBType::Intra {
281 if let Some(ref tileref) = ref_tile {
282 let mx = tileref.mb[mb_idx].mv_x;
283 let my = tileref.mb[mb_idx].mv_y;
288 mb.mv_x = scale_mv(mx, mv_scale);
289 mb.mv_y = scale_mv(my, mv_scale);
293 mv_y += br.read_ivi_cb_s(&self.mb_cb)?;
294 mv_x += br.read_ivi_cb_s(&self.mb_cb)?;
297 if mb.mtype == MBType::Backward {
300 } else if mb.mtype == MBType::Bidir {
301 mv_y += br.read_ivi_cb_s(&self.mb_cb)?;
302 mv_x += br.read_ivi_cb_s(&self.mb_cb)?;
309 validate!(!pic_hdr.ftype.is_intra());
310 mb.mtype = MBType::Inter;
313 if (band.plane_no == 0) && (band.band_no == 0) && pic_hdr.in_q {
314 mb.qd = br.read_ivi_cb_s(&self.mb_cb)? as i16;
315 mb.q = calc_quant(band.quant, mb.qd);
318 if let Some(ref tileref) = ref_tile {
319 let mx = tileref.mb[mb_idx].mv_x;
320 let my = tileref.mb[mb_idx].mv_y;
325 mb.mv_x = scale_mv(mx, mv_scale);
326 mb.mv_y = scale_mv(my, mv_scale);
331 tile.mb[mb_idx] = mb;
339 fn recombine_plane(&mut self, src: &[i16], sstride: usize, dst: &mut [u8], dstride: usize, w: usize, h: usize) {
341 let mut idx1 = w / 2;
342 let mut idx2 = (h / 2) * sstride;
343 let mut idx3 = idx2 + idx1;
345 let mut oidx1 = dstride;
349 let p0 = src[idx0 + x];
350 let p1 = src[idx1 + x];
351 let p2 = src[idx2 + x];
352 let p3 = src[idx3 + x];
357 dst[oidx0 + x * 2 + 0] = clip8(((s0 + s1 + 2) >> 2) + 128);
358 dst[oidx0 + x * 2 + 1] = clip8(((d0 + d1 + 2) >> 2) + 128);
359 dst[oidx1 + x * 2 + 0] = clip8(((s0 - s1 + 2) >> 2) + 128);
360 dst[oidx1 + x * 2 + 1] = clip8(((d0 - d1 + 2) >> 2) + 128);
366 oidx0 += dstride * 2;
367 oidx1 += dstride * 2;
370 let hw = (w / 2) as isize;
371 let hh = (h / 2) as isize;
372 let mut band0 = src.as_ptr();
373 let mut band1 = band0.offset(hw);
374 let mut band2 = band0.offset(((h / 2) * sstride) as isize);
375 let mut band3 = band2.offset(hw);
376 let mut dst0 = dst.as_mut_ptr();
377 let mut dst1 = dst0.offset(dstride as isize);
379 let mut b0_ptr = band0;
380 let mut b1_ptr = band1;
381 let mut b2_ptr = band2;
382 let mut b3_ptr = band3;
383 let mut d0_ptr = dst0;
384 let mut d1_ptr = dst1;
386 let p0 = *b0_ptr as i32;
387 let p1 = *b1_ptr as i32;
388 let p2 = *b2_ptr as i32;
389 let p3 = *b3_ptr as i32;
390 let s0 = p0.wrapping_add(p2);
391 let s1 = p1.wrapping_add(p3);
392 let d0 = p0.wrapping_sub(p2);
393 let d1 = p1.wrapping_sub(p3);
394 let o0 = s0.wrapping_add(s1).wrapping_add(2);
395 let o1 = d0.wrapping_add(d1).wrapping_add(2);
396 let o2 = s0.wrapping_sub(s1).wrapping_add(2);
397 let o3 = d0.wrapping_sub(d1).wrapping_add(2);
398 *d0_ptr.offset(0) = mclip8((o0 >> 2).wrapping_add(128));
399 *d0_ptr.offset(1) = mclip8((o1 >> 2).wrapping_add(128));
400 *d1_ptr.offset(0) = mclip8((o2 >> 2).wrapping_add(128));
401 *d1_ptr.offset(1) = mclip8((o3 >> 2).wrapping_add(128));
402 b0_ptr = b0_ptr.offset(1);
403 b1_ptr = b1_ptr.offset(1);
404 b2_ptr = b2_ptr.offset(1);
405 b3_ptr = b3_ptr.offset(1);
406 d0_ptr = d0_ptr.offset(2);
407 d1_ptr = d1_ptr.offset(2);
409 band0 = band0.offset(sstride as isize);
410 band1 = band1.offset(sstride as isize);
411 band2 = band2.offset(sstride as isize);
412 band3 = band3.offset(sstride as isize);
413 dst0 = dst0.offset((dstride * 2) as isize);
414 dst1 = dst1.offset((dstride * 2) as isize);
420 struct Indeo4Decoder {
421 info: Rc<NACodecInfo>,
428 info: NACodecInfo::new_dummy(),
429 dec: IVIDecoder::new(),
434 impl NADecoder for Indeo4Decoder {
435 fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
436 if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
437 let w = vinfo.get_width();
438 let h = vinfo.get_height();
439 let f = vinfo.is_flipped();
440 let fmt = formats::YUV410_FORMAT;
441 let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, f, fmt));
442 self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()));
445 Err(DecoderError::InvalidData)
448 fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
449 let src = pkt.get_buffer();
450 let mut br = BitReader::new(src.as_slice(), src.len(), BitReaderMode::LE);
452 let mut ip = Indeo4Parser::new();
453 let bufinfo = self.dec.decode_frame(&mut ip, &mut br)?;
454 let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
455 frm.set_keyframe(self.dec.is_intra());
456 frm.set_frame_type(self.dec.get_frame_type());
457 Ok(Rc::new(RefCell::new(frm)))
461 const INDEO4_PICTURE_SIZE_TAB: [[usize; 2]; 7] = [
462 [640, 480], [320, 240], [160, 120], [704, 480], [352, 240], [352, 288], [176, 144]
465 const INDEO4_SLICE_SIZE_TAB: [usize; 15] = [
466 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 480
469 const INDEO4_FRAME_TYPE: [IVIFrameType; 7] = [
470 IVIFrameType::Intra, IVIFrameType::Intra1, IVIFrameType::Inter, IVIFrameType::Bidir,
471 IVIFrameType::InterDroppable, IVIFrameType::NULL, IVIFrameType::NULL2
474 const INDEO4_TRANSFORMS: [IVITransformType; 18] = [
475 IVITransformType::Haar(TSize::T8x8, TDir::TwoD),
476 IVITransformType::Haar(TSize::T8x8, TDir::Row),
477 IVITransformType::Haar(TSize::T8x8, TDir::Col),
478 IVITransformType::None(TSize::T8x8),
479 IVITransformType::Slant(TSize::T8x8, TDir::TwoD),
480 IVITransformType::Slant(TSize::T8x8, TDir::Row),
481 IVITransformType::Slant(TSize::T8x8, TDir::Col),
482 IVITransformType::DCT(TSize::T8x8, TDir::TwoD),
483 IVITransformType::DCT(TSize::T8x8, TDir::Row),
484 IVITransformType::DCT(TSize::T8x8, TDir::Col),
485 IVITransformType::Haar(TSize::T4x4, TDir::TwoD),
486 IVITransformType::Slant(TSize::T4x4, TDir::TwoD),
487 IVITransformType::None(TSize::T4x4),
488 IVITransformType::Haar(TSize::T4x4, TDir::Row),
489 IVITransformType::Haar(TSize::T4x4, TDir::Col),
490 IVITransformType::Slant(TSize::T4x4, TDir::Row),
491 IVITransformType::Slant(TSize::T4x4, TDir::Col),
492 IVITransformType::DCT(TSize::T4x4, TDir::TwoD),
495 const INDEO4_SCAN_8X8_ALT: [usize; 64] = [
496 0, 8, 1, 9, 16, 24, 2, 3,
497 17, 25, 10, 11, 32, 40, 48, 56,
498 4, 5, 6, 7, 33, 41, 49, 57,
499 18, 19, 26, 27, 12, 13, 14, 15,
500 34, 35, 43, 42, 50, 51, 59, 58,
501 20, 21, 22, 23, 31, 30, 29, 28,
502 36, 37, 38, 39, 47, 46, 45, 44,
503 52, 53, 54, 55, 63, 62, 61, 60
505 const INDEO4_SCAN_4X4_ALT: [usize; 16] = [ 0, 1, 4, 5, 8, 12, 2, 3, 9, 13, 6, 7, 10, 11, 14, 15 ];
506 const INDEO4_SCAN_4X4_VER: [usize; 16] = [ 0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15 ];
507 const INDEO4_SCAN_4X4_HOR: [usize; 16] = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ];
509 const INDEO4_SCANS_8X8: [&[usize; 64]; 5] = [
510 &IVI_ZIGZAG, &INDEO4_SCAN_8X8_ALT, &IVI_SCAN_8X8_HOR, &IVI_SCAN_8X8_VER, &IVI_ZIGZAG
512 const INDEO4_SCANS_4X4: [&[usize; 16]; 5] = [
513 &IVI_SCAN_4X4, &INDEO4_SCAN_4X4_ALT, &INDEO4_SCAN_4X4_VER, &INDEO4_SCAN_4X4_HOR, &IVI_SCAN_4X4
516 const INDEO4_Q8X8_IDX: [usize; 15] = [ 0, 1, 0, 2, 1, 3, 0, 4, 1, 5, 0, 1, 6, 7, 8 ];
517 const INDEO4_Q4X4_IDX: [usize; 7] = [ 0, 1, 2, 2, 3, 3, 4 ];
519 const INDEO4_QUANT8X8_INTRA: [[u16; 64]; 9] = [
521 43, 342, 385, 470, 555, 555, 598, 726,
522 342, 342, 470, 513, 555, 598, 726, 769,
523 385, 470, 555, 555, 598, 726, 726, 811,
524 470, 470, 555, 555, 598, 726, 769, 854,
525 470, 555, 555, 598, 683, 726, 854, 1025,
526 555, 555, 598, 683, 726, 854, 1025, 1153,
527 555, 555, 598, 726, 811, 982, 1195, 1451,
528 555, 598, 726, 811, 982, 1195, 1451, 1793
530 86, 1195, 2390, 2390, 4865, 4865, 4865, 4865,
531 1195, 1195, 2390, 2390, 4865, 4865, 4865, 4865,
532 2390, 2390, 4865, 4865, 6827, 6827, 6827, 6827,
533 2390, 2390, 4865, 4865, 6827, 6827, 6827, 6827,
534 4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827,
535 4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827,
536 4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827,
537 4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827
539 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
540 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
541 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
542 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
543 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
544 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
545 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
546 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835
548 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
549 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
550 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
551 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
552 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
553 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
554 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
555 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414
557 897, 897, 897, 897, 897, 897, 897, 897,
558 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067,
559 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
560 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409,
561 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579,
562 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
563 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921,
564 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091
566 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
567 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
568 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
569 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
570 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
571 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
572 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
573 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414
575 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
576 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
577 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
578 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
579 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
580 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
581 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
582 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390
584 22, 171, 214, 257, 257, 299, 299, 342,
585 171, 171, 257, 257, 299, 299, 342, 385,
586 214, 257, 257, 299, 299, 342, 342, 385,
587 257, 257, 257, 299, 299, 342, 385, 427,
588 257, 257, 299, 299, 342, 385, 427, 513,
589 257, 299, 299, 342, 385, 427, 513, 598,
590 299, 299, 299, 385, 385, 470, 598, 726,
591 299, 299, 385, 385, 470, 598, 726, 897
593 86, 598, 1195, 1195, 2390, 2390, 2390, 2390,
594 598, 598, 1195, 1195, 2390, 2390, 2390, 2390,
595 1195, 1195, 2390, 2390, 3414, 3414, 3414, 3414,
596 1195, 1195, 2390, 2390, 3414, 3414, 3414, 3414,
597 2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414,
598 2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414,
599 2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414,
600 2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414
603 const INDEO4_QUANT8X8_INTER: [[u16; 64]; 9] = [
605 427, 427, 470, 427, 427, 427, 470, 470,
606 427, 427, 470, 427, 427, 427, 470, 470,
607 470, 470, 470, 470, 470, 470, 470, 470,
608 427, 427, 470, 470, 427, 427, 470, 470,
609 427, 427, 470, 427, 427, 427, 470, 470,
610 427, 427, 470, 427, 427, 427, 470, 470,
611 470, 470, 470, 470, 470, 470, 470, 470,
612 470, 470, 470, 470, 470, 470, 470, 470
614 1707, 1707, 2433, 2433, 3414, 3414, 3414, 3414,
615 1707, 1707, 2433, 2433, 3414, 3414, 3414, 3414,
616 2433, 2433, 3414, 3414, 4822, 4822, 4822, 4822,
617 2433, 2433, 3414, 3414, 4822, 4822, 4822, 4822,
618 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414,
619 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414,
620 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414,
621 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414
623 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
624 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
625 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
626 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
627 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
628 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
629 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
630 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281
632 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
633 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
634 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
635 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
636 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
637 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
638 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
639 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433
641 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
642 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
643 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281,
644 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
645 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
646 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
647 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281,
648 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281
650 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
651 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
652 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
653 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
654 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
655 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
656 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
657 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433
659 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
660 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
661 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
662 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
663 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
664 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
665 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
666 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707
668 86, 171, 171, 214, 214, 214, 214, 257,
669 171, 171, 214, 214, 214, 214, 257, 257,
670 171, 214, 214, 214, 214, 257, 257, 257,
671 214, 214, 214, 214, 257, 257, 257, 299,
672 214, 214, 214, 257, 257, 257, 299, 299,
673 214, 214, 257, 257, 257, 299, 299, 299,
674 214, 257, 257, 257, 299, 299, 299, 342,
675 257, 257, 257, 299, 299, 299, 342, 342
677 854, 854, 1195, 1195, 1707, 1707, 1707, 1707,
678 854, 854, 1195, 1195, 1707, 1707, 1707, 1707,
679 1195, 1195, 1707, 1707, 2390, 2390, 2390, 2390,
680 1195, 1195, 1707, 1707, 2390, 2390, 2390, 2390,
681 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707,
682 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707,
683 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707,
684 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707
687 const INDEO4_QUANT4X4_INTRA: [[u16; 16]; 5] = [
694 129, 1025, 1451, 1451,
695 1025, 1025, 1451, 1451,
696 1451, 1451, 2049, 2049,
697 1451, 1451, 2049, 2049
715 const INDEO4_QUANT4X4_INTER: [[u16; 16]; 5] = [
722 513, 1025, 1238, 1238,
723 1025, 1025, 1238, 1238,
724 1238, 1238, 1451, 1451,
725 1238, 1238, 1451, 1451
743 const INDEO4_Q8_INTRA: [&[u16; 64]; 9] = [
744 &INDEO4_QUANT8X8_INTRA[0], &INDEO4_QUANT8X8_INTRA[1], &INDEO4_QUANT8X8_INTRA[2],
745 &INDEO4_QUANT8X8_INTRA[3], &INDEO4_QUANT8X8_INTRA[4], &INDEO4_QUANT8X8_INTRA[5],
746 &INDEO4_QUANT8X8_INTRA[6], &INDEO4_QUANT8X8_INTRA[7], &INDEO4_QUANT8X8_INTRA[8],
748 const INDEO4_Q8_INTER: [&[u16; 64]; 9] = [
749 &INDEO4_QUANT8X8_INTER[0], &INDEO4_QUANT8X8_INTER[1], &INDEO4_QUANT8X8_INTER[2],
750 &INDEO4_QUANT8X8_INTER[3], &INDEO4_QUANT8X8_INTER[4], &INDEO4_QUANT8X8_INTER[5],
751 &INDEO4_QUANT8X8_INTER[6], &INDEO4_QUANT8X8_INTER[7], &INDEO4_QUANT8X8_INTER[8],
753 const INDEO4_Q4_INTRA: [&[u16; 16]; 5] = [
754 &INDEO4_QUANT4X4_INTRA[0], &INDEO4_QUANT4X4_INTRA[1], &INDEO4_QUANT4X4_INTRA[2],
755 &INDEO4_QUANT4X4_INTRA[3], &INDEO4_QUANT4X4_INTRA[4]
757 const INDEO4_Q4_INTER: [&[u16; 16]; 5] = [
758 &INDEO4_QUANT4X4_INTER[0], &INDEO4_QUANT4X4_INTER[1], &INDEO4_QUANT4X4_INTER[2],
759 &INDEO4_QUANT4X4_INTER[3], &INDEO4_QUANT4X4_INTER[4]
762 pub fn get_decoder() -> Box<NADecoder> {
763 Box::new(Indeo4Decoder::new())
768 use test::dec_video::test_file_decoding;
771 test_file_decoding("avi", "assets/IV4/volcano.avi", /*None*/Some(16), true, false, None/*Some("iv4")*/);