1 use nihav_core::io::bitreader::*;
2 use nihav_core::formats;
3 use nihav_core::frame::*;
4 use nihav_core::codecs::*;
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;
204 blk_cb = br.read_ivi_codebook_desc(false, true)?;
206 blk_cb = self.blk_cb;
210 rvmap_idx = br.read(3)? as usize;
215 let mut corr_map: [u8; CORR_MAP_SIZE] = [0; CORR_MAP_SIZE];
217 num_corr = br.read(8)? as usize;
218 validate!(num_corr*2 <= CORR_MAP_SIZE);
219 for i in 0..num_corr*2 {
220 corr_map[i] = br.read(8)? as u8;
227 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))
230 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<()> {
235 for mb_y in 0..tile.mb_h {
236 for mb_x in 0..tile.mb_w {
237 let mut mb = MB::new(tile.pos_x + mb_x * band.mb_size, tile.pos_y + mb_y * band.mb_size);
238 if !br.read_bool()? {
239 if pic_hdr.ftype.is_intra() {
240 mb.mtype = MBType::Intra;
241 } else if band.inherit_mv {
242 if let Some(ref tileref) = ref_tile {
243 mb.mtype = tileref.mb[mb_idx].mtype;
245 return Err(DecoderError::MissingReference);
248 if !pic_hdr.ftype.is_bidir() {
249 mb.mtype = if br.read_bool()? { MBType::Inter } else { MBType::Intra };
251 mb.mtype = match br.read(2)? {
252 0 => { MBType::Intra },
253 1 => { MBType::Inter },
254 2 => { MBType::Backward },
255 _ => { MBType::Bidir },
259 if band.mb_size == band.blk_size {
260 mb.cbp = br.read(1)? as u8;
262 mb.cbp = br.read(4)? as u8;
265 if let Some(ref tileref) = ref_tile {
266 mb.qd = tileref.mb[mb_idx].qd;
267 mb.q = calc_quant(band.quant, mb.qd);
269 mb.q = band.quant as u8;
271 } else if (mb.cbp != 0) || ((band.plane_no == 0) && (band.band_no == 0) && pic_hdr.in_q) {
272 mb.qd = br.read_ivi_cb_s(&self.mb_cb)? as i16;
273 mb.q = calc_quant(band.quant, mb.qd);
275 mb.q = band.quant as u8;
278 if mb.mtype != MBType::Intra {
280 if let Some(ref tileref) = ref_tile {
281 let mx = tileref.mb[mb_idx].mv_x;
282 let my = tileref.mb[mb_idx].mv_y;
287 mb.mv_x = scale_mv(mx, mv_scale);
288 mb.mv_y = scale_mv(my, mv_scale);
292 mv_y += br.read_ivi_cb_s(&self.mb_cb)?;
293 mv_x += br.read_ivi_cb_s(&self.mb_cb)?;
296 if mb.mtype == MBType::Backward {
299 } else if mb.mtype == MBType::Bidir {
300 mv_y += br.read_ivi_cb_s(&self.mb_cb)?;
301 mv_x += br.read_ivi_cb_s(&self.mb_cb)?;
308 validate!(!pic_hdr.ftype.is_intra());
309 mb.mtype = MBType::Inter;
312 if (band.plane_no == 0) && (band.band_no == 0) && pic_hdr.in_q {
313 mb.qd = br.read_ivi_cb_s(&self.mb_cb)? as i16;
314 mb.q = calc_quant(band.quant, mb.qd);
317 if let Some(ref tileref) = ref_tile {
318 let mx = tileref.mb[mb_idx].mv_x;
319 let my = tileref.mb[mb_idx].mv_y;
324 mb.mv_x = scale_mv(mx, mv_scale);
325 mb.mv_y = scale_mv(my, mv_scale);
330 tile.mb[mb_idx] = mb;
338 fn recombine_plane(&mut self, src: &[i16], sstride: usize, dst: &mut [u8], dstride: usize, w: usize, h: usize) {
340 let mut idx1 = w / 2;
341 let mut idx2 = (h / 2) * sstride;
342 let mut idx3 = idx2 + idx1;
344 let mut oidx1 = dstride;
348 let p0 = src[idx0 + x];
349 let p1 = src[idx1 + x];
350 let p2 = src[idx2 + x];
351 let p3 = src[idx3 + x];
356 dst[oidx0 + x * 2 + 0] = clip8(((s0 + s1 + 2) >> 2) + 128);
357 dst[oidx0 + x * 2 + 1] = clip8(((d0 + d1 + 2) >> 2) + 128);
358 dst[oidx1 + x * 2 + 0] = clip8(((s0 - s1 + 2) >> 2) + 128);
359 dst[oidx1 + x * 2 + 1] = clip8(((d0 - d1 + 2) >> 2) + 128);
365 oidx0 += dstride * 2;
366 oidx1 += dstride * 2;
369 let hw = (w / 2) as isize;
370 let hh = (h / 2) as isize;
371 let mut band0 = src.as_ptr();
372 let mut band1 = band0.offset(hw);
373 let mut band2 = band0.add((h / 2) * sstride);
374 let mut band3 = band2.offset(hw);
375 let mut dst0 = dst.as_mut_ptr();
376 let mut dst1 = dst0.add(dstride);
378 let mut b0_ptr = band0;
379 let mut b1_ptr = band1;
380 let mut b2_ptr = band2;
381 let mut b3_ptr = band3;
382 let mut d0_ptr = dst0;
383 let mut d1_ptr = dst1;
385 let p0 = i32::from(*b0_ptr);
386 let p1 = i32::from(*b1_ptr);
387 let p2 = i32::from(*b2_ptr);
388 let p3 = i32::from(*b3_ptr);
389 let s0 = p0.wrapping_add(p2);
390 let s1 = p1.wrapping_add(p3);
391 let d0 = p0.wrapping_sub(p2);
392 let d1 = p1.wrapping_sub(p3);
393 let o0 = s0.wrapping_add(s1).wrapping_add(2);
394 let o1 = d0.wrapping_add(d1).wrapping_add(2);
395 let o2 = s0.wrapping_sub(s1).wrapping_add(2);
396 let o3 = d0.wrapping_sub(d1).wrapping_add(2);
397 *d0_ptr.offset(0) = mclip8((o0 >> 2).wrapping_add(128));
398 *d0_ptr.offset(1) = mclip8((o1 >> 2).wrapping_add(128));
399 *d1_ptr.offset(0) = mclip8((o2 >> 2).wrapping_add(128));
400 *d1_ptr.offset(1) = mclip8((o3 >> 2).wrapping_add(128));
401 b0_ptr = b0_ptr.offset(1);
402 b1_ptr = b1_ptr.offset(1);
403 b2_ptr = b2_ptr.offset(1);
404 b3_ptr = b3_ptr.offset(1);
405 d0_ptr = d0_ptr.offset(2);
406 d1_ptr = d1_ptr.offset(2);
408 band0 = band0.add(sstride);
409 band1 = band1.add(sstride);
410 band2 = band2.add(sstride);
411 band3 = band3.add(sstride);
412 dst0 = dst0.add(dstride * 2);
413 dst1 = dst1.add(dstride * 2);
419 struct Indeo4Decoder {
420 info: NACodecInfoRef,
427 info: NACodecInfo::new_dummy(),
428 dec: IVIDecoder::new(),
433 impl NADecoder for Indeo4Decoder {
434 fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> {
435 if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
436 let w = vinfo.get_width();
437 let h = vinfo.get_height();
438 let f = vinfo.is_flipped();
439 let fmt = formats::YUV410_FORMAT;
440 let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, f, fmt));
441 self.info = NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()).into_ref();
444 Err(DecoderError::InvalidData)
447 fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
448 let src = pkt.get_buffer();
449 let mut br = BitReader::new(src.as_slice(), src.len(), BitReaderMode::LE);
451 let mut ip = Indeo4Parser::new();
452 let bufinfo = self.dec.decode_frame(&mut ip, &mut br)?;
453 let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
454 frm.set_keyframe(self.dec.is_intra());
455 frm.set_frame_type(self.dec.get_frame_type());
460 const INDEO4_PICTURE_SIZE_TAB: [[usize; 2]; 7] = [
461 [640, 480], [320, 240], [160, 120], [704, 480], [352, 240], [352, 288], [176, 144]
464 const INDEO4_SLICE_SIZE_TAB: [usize; 15] = [
465 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 480
468 const INDEO4_FRAME_TYPE: [IVIFrameType; 7] = [
469 IVIFrameType::Intra, IVIFrameType::Intra1, IVIFrameType::Inter, IVIFrameType::Bidir,
470 IVIFrameType::InterDroppable, IVIFrameType::NULL, IVIFrameType::NULL2
473 const INDEO4_TRANSFORMS: [IVITransformType; 18] = [
474 IVITransformType::Haar(TSize::T8x8, TDir::TwoD),
475 IVITransformType::Haar(TSize::T8x8, TDir::Row),
476 IVITransformType::Haar(TSize::T8x8, TDir::Col),
477 IVITransformType::None(TSize::T8x8),
478 IVITransformType::Slant(TSize::T8x8, TDir::TwoD),
479 IVITransformType::Slant(TSize::T8x8, TDir::Row),
480 IVITransformType::Slant(TSize::T8x8, TDir::Col),
481 IVITransformType::DCT(TSize::T8x8, TDir::TwoD),
482 IVITransformType::DCT(TSize::T8x8, TDir::Row),
483 IVITransformType::DCT(TSize::T8x8, TDir::Col),
484 IVITransformType::Haar(TSize::T4x4, TDir::TwoD),
485 IVITransformType::Slant(TSize::T4x4, TDir::TwoD),
486 IVITransformType::None(TSize::T4x4),
487 IVITransformType::Haar(TSize::T4x4, TDir::Row),
488 IVITransformType::Haar(TSize::T4x4, TDir::Col),
489 IVITransformType::Slant(TSize::T4x4, TDir::Row),
490 IVITransformType::Slant(TSize::T4x4, TDir::Col),
491 IVITransformType::DCT(TSize::T4x4, TDir::TwoD),
494 const INDEO4_SCAN_8X8_ALT: [usize; 64] = [
495 0, 8, 1, 9, 16, 24, 2, 3,
496 17, 25, 10, 11, 32, 40, 48, 56,
497 4, 5, 6, 7, 33, 41, 49, 57,
498 18, 19, 26, 27, 12, 13, 14, 15,
499 34, 35, 43, 42, 50, 51, 59, 58,
500 20, 21, 22, 23, 31, 30, 29, 28,
501 36, 37, 38, 39, 47, 46, 45, 44,
502 52, 53, 54, 55, 63, 62, 61, 60
504 const INDEO4_SCAN_4X4_ALT: [usize; 16] = [ 0, 1, 4, 5, 8, 12, 2, 3, 9, 13, 6, 7, 10, 11, 14, 15 ];
505 const INDEO4_SCAN_4X4_VER: [usize; 16] = [ 0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15 ];
506 const INDEO4_SCAN_4X4_HOR: [usize; 16] = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ];
508 const INDEO4_SCANS_8X8: [&[usize; 64]; 5] = [
509 &IVI_ZIGZAG, &INDEO4_SCAN_8X8_ALT, &IVI_SCAN_8X8_HOR, &IVI_SCAN_8X8_VER, &IVI_ZIGZAG
511 const INDEO4_SCANS_4X4: [&[usize; 16]; 5] = [
512 &IVI_SCAN_4X4, &INDEO4_SCAN_4X4_ALT, &INDEO4_SCAN_4X4_VER, &INDEO4_SCAN_4X4_HOR, &IVI_SCAN_4X4
515 const INDEO4_Q8X8_IDX: [usize; 15] = [ 0, 1, 0, 2, 1, 3, 0, 4, 1, 5, 0, 1, 6, 7, 8 ];
516 const INDEO4_Q4X4_IDX: [usize; 7] = [ 0, 1, 2, 2, 3, 3, 4 ];
518 const INDEO4_QUANT8X8_INTRA: [[u16; 64]; 9] = [
520 43, 342, 385, 470, 555, 555, 598, 726,
521 342, 342, 470, 513, 555, 598, 726, 769,
522 385, 470, 555, 555, 598, 726, 726, 811,
523 470, 470, 555, 555, 598, 726, 769, 854,
524 470, 555, 555, 598, 683, 726, 854, 1025,
525 555, 555, 598, 683, 726, 854, 1025, 1153,
526 555, 555, 598, 726, 811, 982, 1195, 1451,
527 555, 598, 726, 811, 982, 1195, 1451, 1793
529 86, 1195, 2390, 2390, 4865, 4865, 4865, 4865,
530 1195, 1195, 2390, 2390, 4865, 4865, 4865, 4865,
531 2390, 2390, 4865, 4865, 6827, 6827, 6827, 6827,
532 2390, 2390, 4865, 4865, 6827, 6827, 6827, 6827,
533 4865, 4865, 6827, 6827, 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
538 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
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
547 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
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
556 897, 897, 897, 897, 897, 897, 897, 897,
557 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067,
558 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
559 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409,
560 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579,
561 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
562 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921,
563 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091
565 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
566 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
567 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
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
574 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
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
583 22, 171, 214, 257, 257, 299, 299, 342,
584 171, 171, 257, 257, 299, 299, 342, 385,
585 214, 257, 257, 299, 299, 342, 342, 385,
586 257, 257, 257, 299, 299, 342, 385, 427,
587 257, 257, 299, 299, 342, 385, 427, 513,
588 257, 299, 299, 342, 385, 427, 513, 598,
589 299, 299, 299, 385, 385, 470, 598, 726,
590 299, 299, 385, 385, 470, 598, 726, 897
592 86, 598, 1195, 1195, 2390, 2390, 2390, 2390,
593 598, 598, 1195, 1195, 2390, 2390, 2390, 2390,
594 1195, 1195, 2390, 2390, 3414, 3414, 3414, 3414,
595 1195, 1195, 2390, 2390, 3414, 3414, 3414, 3414,
596 2390, 2390, 3414, 3414, 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
602 const INDEO4_QUANT8X8_INTER: [[u16; 64]; 9] = [
604 427, 427, 470, 427, 427, 427, 470, 470,
605 427, 427, 470, 427, 427, 427, 470, 470,
606 470, 470, 470, 470, 470, 470, 470, 470,
607 427, 427, 470, 470, 427, 427, 470, 470,
608 427, 427, 470, 427, 427, 427, 470, 470,
609 427, 427, 470, 427, 427, 427, 470, 470,
610 470, 470, 470, 470, 470, 470, 470, 470,
611 470, 470, 470, 470, 470, 470, 470, 470
613 1707, 1707, 2433, 2433, 3414, 3414, 3414, 3414,
614 1707, 1707, 2433, 2433, 3414, 3414, 3414, 3414,
615 2433, 2433, 3414, 3414, 4822, 4822, 4822, 4822,
616 2433, 2433, 3414, 3414, 4822, 4822, 4822, 4822,
617 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414,
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
622 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
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
631 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
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
640 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
641 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
642 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281,
643 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
644 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
645 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
646 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281,
647 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281
649 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
650 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
651 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
652 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
653 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
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
658 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
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
667 86, 171, 171, 214, 214, 214, 214, 257,
668 171, 171, 214, 214, 214, 214, 257, 257,
669 171, 214, 214, 214, 214, 257, 257, 257,
670 214, 214, 214, 214, 257, 257, 257, 299,
671 214, 214, 214, 257, 257, 257, 299, 299,
672 214, 214, 257, 257, 257, 299, 299, 299,
673 214, 257, 257, 257, 299, 299, 299, 342,
674 257, 257, 257, 299, 299, 299, 342, 342
676 854, 854, 1195, 1195, 1707, 1707, 1707, 1707,
677 854, 854, 1195, 1195, 1707, 1707, 1707, 1707,
678 1195, 1195, 1707, 1707, 2390, 2390, 2390, 2390,
679 1195, 1195, 1707, 1707, 2390, 2390, 2390, 2390,
680 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707,
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
686 const INDEO4_QUANT4X4_INTRA: [[u16; 16]; 5] = [
693 129, 1025, 1451, 1451,
694 1025, 1025, 1451, 1451,
695 1451, 1451, 2049, 2049,
696 1451, 1451, 2049, 2049
714 const INDEO4_QUANT4X4_INTER: [[u16; 16]; 5] = [
721 513, 1025, 1238, 1238,
722 1025, 1025, 1238, 1238,
723 1238, 1238, 1451, 1451,
724 1238, 1238, 1451, 1451
742 const INDEO4_Q8_INTRA: [&[u16; 64]; 9] = [
743 &INDEO4_QUANT8X8_INTRA[0], &INDEO4_QUANT8X8_INTRA[1], &INDEO4_QUANT8X8_INTRA[2],
744 &INDEO4_QUANT8X8_INTRA[3], &INDEO4_QUANT8X8_INTRA[4], &INDEO4_QUANT8X8_INTRA[5],
745 &INDEO4_QUANT8X8_INTRA[6], &INDEO4_QUANT8X8_INTRA[7], &INDEO4_QUANT8X8_INTRA[8],
747 const INDEO4_Q8_INTER: [&[u16; 64]; 9] = [
748 &INDEO4_QUANT8X8_INTER[0], &INDEO4_QUANT8X8_INTER[1], &INDEO4_QUANT8X8_INTER[2],
749 &INDEO4_QUANT8X8_INTER[3], &INDEO4_QUANT8X8_INTER[4], &INDEO4_QUANT8X8_INTER[5],
750 &INDEO4_QUANT8X8_INTER[6], &INDEO4_QUANT8X8_INTER[7], &INDEO4_QUANT8X8_INTER[8],
752 const INDEO4_Q4_INTRA: [&[u16; 16]; 5] = [
753 &INDEO4_QUANT4X4_INTRA[0], &INDEO4_QUANT4X4_INTRA[1], &INDEO4_QUANT4X4_INTRA[2],
754 &INDEO4_QUANT4X4_INTRA[3], &INDEO4_QUANT4X4_INTRA[4]
756 const INDEO4_Q4_INTER: [&[u16; 16]; 5] = [
757 &INDEO4_QUANT4X4_INTER[0], &INDEO4_QUANT4X4_INTER[1], &INDEO4_QUANT4X4_INTER[2],
758 &INDEO4_QUANT4X4_INTER[3], &INDEO4_QUANT4X4_INTER[4]
761 pub fn get_decoder() -> Box<dyn NADecoder> {
762 Box::new(Indeo4Decoder::new())
767 use nihav_core::codecs::RegisteredDecoders;
768 use nihav_core::demuxers::RegisteredDemuxers;
769 use nihav_core::test::dec_video::*;
770 use crate::codecs::indeo_register_all_codecs;
771 use nihav_commonfmt::demuxers::generic_register_all_demuxers;
774 let mut dmx_reg = RegisteredDemuxers::new();
775 generic_register_all_demuxers(&mut dmx_reg);
776 let mut dec_reg = RegisteredDecoders::new();
777 indeo_register_all_codecs(&mut dec_reg);
779 test_file_decoding("avi", "assets/Indeo/IV4/volcano.avi", /*None*/Some(16), true, false, None/*Some("iv4")*/, &dmx_reg, &dec_reg);