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 {
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)?;
305 validate!(!pic_hdr.ftype.is_intra());
306 mb.mtype = MBType::Inter;
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);
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;
321 mb.mv_x = scale_mv(mx, mv_scale);
322 mb.mv_y = scale_mv(my, mv_scale);
327 tile.mb[mb_idx] = mb;
335 fn recombine_plane(&mut self, src: &[i16], sstride: usize, dst: &mut [u8], dstride: usize, w: usize, h: usize) {
337 let mut idx1 = w / 2;
338 let mut idx2 = (h / 2) * sstride;
339 let mut idx3 = idx2 + idx1;
341 let mut oidx1 = dstride;
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);
358 oidx0 += dstride * 2;
359 oidx1 += dstride * 2;
364 struct Indeo4Decoder {
365 info: Rc<NACodecInfo>,
372 info: NACodecInfo::new_dummy(),
373 dec: IVIDecoder::new(),
378 impl 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()));
389 Err(DecoderError::InvalidData)
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);
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)))
405 const INDEO4_PICTURE_SIZE_TAB: [[usize; 2]; 7] = [
406 [640, 480], [320, 240], [160, 120], [704, 480], [352, 240], [252, 288], [176, 144]
409 const INDEO4_SLICE_SIZE_TAB: [usize; 15] = [
410 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 480
413 const INDEO4_FRAME_TYPE: [IVIFrameType; 7] = [
414 IVIFrameType::Intra, IVIFrameType::Intra1, IVIFrameType::Inter, IVIFrameType::Bidir,
415 IVIFrameType::InterDroppable, IVIFrameType::NULL, IVIFrameType::NULL2
418 const 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),
439 const 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
449 const INDEO4_SCAN_4X4_ALT: [usize; 16] = [ 0, 1, 4, 5, 8, 12, 2, 3, 9, 13, 6, 7, 10, 11, 14, 15 ];
450 const INDEO4_SCAN_4X4_VER: [usize; 16] = [ 0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15 ];
451 const INDEO4_SCAN_4X4_HOR: [usize; 16] = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ];
453 const INDEO4_SCANS_8X8: [&[usize; 64]; 5] = [
454 &IVI_ZIGZAG, &INDEO4_SCAN_8X8_ALT, &IVI_SCAN_8X8_HOR, &IVI_SCAN_8X8_VER, &IVI_ZIGZAG
456 const 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
460 const INDEO4_Q8X8_IDX: [usize; 15] = [ 0, 1, 0, 2, 1, 3, 0, 4, 1, 5, 0, 1, 6, 7, 8 ];
461 const INDEO4_Q4X4_IDX: [usize; 7] = [ 0, 1, 2, 2, 3, 3, 4 ];
463 const INDEO4_QUANT8X8_INTRA: [[u16; 64]; 9] = [
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
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
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
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
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
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
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
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
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
547 const INDEO4_QUANT8X8_INTER: [[u16; 64]; 9] = [
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
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
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
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
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
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
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
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
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
631 const INDEO4_QUANT4X4_INTRA: [[u16; 16]; 5] = [
638 129, 1025, 1451, 1451,
639 1025, 1025, 1451, 1451,
640 1451, 1451, 2049, 2049,
641 1451, 1451, 2049, 2049
659 const INDEO4_QUANT4X4_INTER: [[u16; 16]; 5] = [
666 513, 1025, 1238, 1238,
667 1025, 1025, 1238, 1238,
668 1238, 1238, 1451, 1451,
669 1238, 1238, 1451, 1451
687 const 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],
692 const 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],
697 const 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]
701 const 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]
706 pub fn get_decoder() -> Box<NADecoder> {
707 Box::new(Indeo4Decoder::new())
712 use test::dec_video::test_file_decoding;
715 test_file_decoding("avi", "assets/IV4/volcano.avi", /*None*/Some(16), true, false, Some("iv4"));