]> git.nihav.org Git - nihav.git/blame - nihav-indeo/src/codecs/indeo5.rs
avimux: do not record palette change chunks in OpenDML index
[nihav.git] / nihav-indeo / src / codecs / indeo5.rs
CommitLineData
5641dccf
KS
1use nihav_core::io::bitreader::*;
2use nihav_core::formats;
3use nihav_core::frame::*;
4use nihav_core::codecs::*;
b4d5b851 5use nihav_codec_support::codecs::ZIGZAG;
01c971c5
KS
6use super::ivi::*;
7use super::ivibr::*;
8
9fn calc_quant(glob_q: u32, qd: i16) -> usize {
e6aaad5c 10 let qq = (glob_q as i16) + qd;
01c971c5
KS
11 if qq < 0 {
12 0
13 } else if qq > 23 {
14 23
15 } else {
16 qq as usize
17 }
18}
19
20struct Indeo5Parser {
21 mb_cb: IVICodebook,
22
23 width: usize,
24 height: usize,
25 tile_w: usize,
26 tile_h: usize,
27 luma_bands: usize,
28 chroma_bands: usize,
29
30 is_hpel: [bool; 5],
31 mb_size: [usize; 5],
32 blk_size: [usize; 5],
33}
34
35impl Indeo5Parser {
36 fn new() -> Self {
37 Indeo5Parser {
38 mb_cb: IVI_CB_ZERO,
39
40 width: 0,
41 height: 0,
42 tile_w: 0,
43 tile_h: 0,
44 luma_bands: 0,
45 chroma_bands: 0,
46
47 is_hpel: [false; 5],
48 mb_size: [0; 5],
49 blk_size: [0; 5],
50 }
51 }
52}
53
54fn skip_extension(br: &mut BitReader) -> DecoderResult<()> {
55 loop {
56 let len = br.read(8)?;
57 if len == 0 { break; }
58 br.skip(len * 8)?;
59 }
60 Ok(())
61}
62
63impl IndeoXParser for Indeo5Parser {
01c971c5
KS
64 fn decode_picture_header(&mut self, br: &mut BitReader) -> DecoderResult<PictureHeader> {
65 let sync = br.read(5)?;
66 validate!(sync == 0x1F);
67 let ftype_idx = br.read(3)?;
68 validate!(ftype_idx < 5);
69 let ftype = INDEO5_FRAME_TYPE[ftype_idx as usize];
39cd2175 70 let _fnum = br.read(8)?;
01c971c5
KS
71 if ftype == IVIFrameType::Intra {
72 let gop_flags = br.read(8)?;
39cd2175 73 let _hdr_size = if (gop_flags & 0x01) != 0 { br.read(16)? } else { 0 };
01c971c5
KS
74 if (gop_flags & 0x20) != 0 {
75 br.skip(32)?; // lock word
76 }
77 self.tile_w = 0;
78 self.tile_h = 0;
79 if (gop_flags & 0x40) != 0 {
80 self.tile_w = 64 << br.read(2)?;
81 self.tile_h = self.tile_w;
82 }
83 validate!(self.tile_w < 256);
84 self.luma_bands = (br.read(2)? * 3 + 1) as usize;
85 self.chroma_bands = (br.read(1)? * 3 + 1) as usize;
86 validate!((self.luma_bands == 4) || (self.luma_bands == 1));
87 validate!(self.chroma_bands == 1);
88 let pic_size_idx = br.read(4)? as usize;
89 let w;
90 let h;
91 if pic_size_idx < 15 {
92 w = INDEO5_PICTURE_SIZE_TAB[pic_size_idx][0];
93 h = INDEO5_PICTURE_SIZE_TAB[pic_size_idx][1];
94 } else {
95 h = br.read(13)? as usize;
96 w = br.read(13)? as usize;
97 }
98 validate!((w != 0) && (h != 0));
99 self.width = w;
100 self.height = h;
101
102 validate!((gop_flags & 0x02) == 0);
103 if self.tile_w == 0 {
104 self.tile_w = w;
105 self.tile_h = h;
106 }
107 for b in 0..self.luma_bands+self.chroma_bands {
108 self.is_hpel[b] = br.read_bool()?;
109 let mb_scale = br.read(1)?;
110 self.blk_size[b] = 8 >> br.read(1)?;
111 self.mb_size[b] = self.blk_size[b] << (1 - mb_scale);
112 let ext_tr = br.read_bool()?;
113 validate!(!ext_tr);
114 let end_marker = br.read(2)?;
115 validate!(end_marker == 0);
116 }
117 if (gop_flags & 0x08) != 0 {
118 let align = br.read(3)?;
119 validate!(align == 0);
120 if br.read_bool()? {
121 br.skip(24)?; // transparency color
122 }
123 }
124 br.align();
125 br.skip(23)?;
126 if br.read_bool()? { // gop extension
127 loop {
128 let v = br.read(16)?;
129 if (v & 0x8000) == 0 { break; }
130 }
131 }
132 br.align();
133 }
134 if ftype.is_null() {
135 br.align();
136 return Ok(PictureHeader::new_null(ftype));
137 }
138 let flags = br.read(8)?;
39cd2175
KS
139 let _size = if (flags & 0x01) != 0 { br.read(24)? } else { 0 };
140 let _checksum = if (flags & 0x10) != 0 { br.read(16)? } else { 0 };
01c971c5
KS
141 if (flags & 0x20) != 0 {
142 skip_extension(br)?;
143 }
144 let in_q = (flags & 0x08) != 0;
145 self.mb_cb = br.read_ivi_codebook_desc(true, (flags & 0x40) != 0)?;
146 br.skip(3)?;
147 br.align();
148
149 Ok(PictureHeader::new(ftype, self.width, self.height, self.tile_w, self.tile_h, false, self.luma_bands, self.chroma_bands, in_q))
150 }
151
39cd2175 152 fn decode_band_header(&mut self, br: &mut BitReader, _pic_hdr: &PictureHeader, plane_no: usize, band_no: usize) -> DecoderResult<BandHeader> {
01c971c5
KS
153 let band_flags = br.read(8)?;
154
155 if (band_flags & 0x01) != 0 {
156 br.align();
157 return Ok(BandHeader::new_empty(plane_no, band_no));
158 }
159 let inherit_mv = (band_flags & 0x02) != 0;
160 let has_qdelta = (band_flags & 0x04) != 0;
161 let inherit_qd = ((band_flags & 0x08) != 0) || !has_qdelta;
162 let data_size: usize;
163 if (band_flags & 0x80) != 0 {
164 data_size = br.read(24)? as usize;
51772ce8 165 validate!(data_size >= 4);
01c971c5
KS
166 } else {
167 data_size = 0;
168 }
51772ce8 169 validate!(data_size <= ((br.left() / 8) as usize) + 4);
01c971c5
KS
170
171 let num_corr: usize;
172 let mut corr_map: [u8; CORR_MAP_SIZE] = [0; CORR_MAP_SIZE];
173 if (band_flags & 0x10) != 0 {
174 num_corr = br.read(8)? as usize;
175 validate!(num_corr*2 <= CORR_MAP_SIZE);
39cd2175
KS
176 for el in corr_map[..num_corr*2].iter_mut() {
177 *el = br.read(8)? as u8;
01c971c5
KS
178 }
179 } else {
180 num_corr = 0;
181 }
39cd2175 182 let rvmap_idx = if (band_flags & 0x40) != 0 { br.read(3)? as usize } else { 8 };
01c971c5
KS
183 let blk_cb = br.read_ivi_codebook_desc(false, (band_flags & 0x80) != 0)?;
184 if br.read_bool()? {
185 br.skip(16)?; // checksum
186 }
187 let band_q = br.read(5)?;
188 if (band_flags & 0x20) != 0 {
189 skip_extension(br)?;
190 }
191 br.align();
192
193 let tr;
194 let txtype;
195 let band_id = if plane_no == 0 { band_no } else { self.luma_bands };
196 match plane_no {
197 0 => {
198 let scan = INDEO5_SCAN8X8[band_no];
199 let qintra;
200 let qinter;
201 validate!(self.blk_size[band_id] == 8);
202 match band_no {
203 0 => {
204 tr = IVITransformType::Slant(TSize::T8x8, TDir::TwoD);
205 if self.luma_bands == 1 {
206 qintra = INDEO5_Q8_INTRA[0];
207 qinter = INDEO5_Q8_INTER[0];
208 } else {
209 qintra = INDEO5_Q8_INTRA[1];
210 qinter = INDEO5_Q8_INTER[1];
211 }
212 },
213 1 => {
214 tr = IVITransformType::Slant(TSize::T8x8, TDir::Row);
215 qintra = INDEO5_Q8_INTRA[2];
216 qinter = INDEO5_Q8_INTER[2];
217 },
218 2 => {
219 tr = IVITransformType::Slant(TSize::T8x8, TDir::Col);
220 qintra = INDEO5_Q8_INTRA[3];
221 qinter = INDEO5_Q8_INTER[3];
222 },
223 3 => {
224 tr = IVITransformType::None(TSize::T8x8);
225 qintra = INDEO5_Q8_INTRA[4];
226 qinter = INDEO5_Q8_INTER[4];
227 },
228 _ => { unreachable!(); }
229 };
230 txtype = TxType::Transform8(TxParams8x8::new(qintra, qinter, scan));
231 },
232 1 | 2 => {
233 validate!(self.blk_size[band_id] == 4);
234 tr = IVITransformType::Slant(TSize::T4x4, TDir::TwoD);
235 let scan = INDEO5_SCAN4X4;
236 let qintra = INDEO5_Q4_INTRA;
237 let qinter = INDEO5_Q4_INTER;
238 txtype = TxType::Transform4(TxParams4x4::new(qintra, qinter, scan));
239 },
240 _ => { unreachable!(); }
241 };
1a151e53 242
01c971c5
KS
243 Ok(BandHeader::new(plane_no, band_no, self.mb_size[band_id], self.blk_size[band_id], self.is_hpel[band_id], inherit_mv, has_qdelta, inherit_qd, band_q, rvmap_idx, num_corr, corr_map, blk_cb, tr, txtype))
244 }
245
b7c882c1 246 #[allow(clippy::cognitive_complexity)]
39cd2175 247 #[allow(clippy::collapsible_else_if)]
08a1fab7 248 fn decode_mb_info(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, band: &BandHeader, tile: &mut IVITile, ref_tile: Option<&IVITile>, mv_scale: u8) -> DecoderResult<()> {
01c971c5
KS
249 let mut mv_x = 0;
250 let mut mv_y = 0;
251 let band_id = if pic_hdr.luma_bands == 4 { band.band_no + 1 } else { 0 };
252 let mut mb_idx = 0;
253 for mb_y in 0..tile.mb_h {
254 for mb_x in 0..tile.mb_w {
255 let mut mb = MB::new(tile.pos_x + mb_x * band.mb_size, tile.pos_y + mb_y * band.mb_size);
256 if !br.read_bool()? {
257 if pic_hdr.ftype.is_intra() {
258 mb.mtype = MBType::Intra;
259 } else if band.inherit_mv {
6f263099 260 if let Some(tileref) = ref_tile {
01c971c5
KS
261 mb.mtype = tileref.mb[mb_idx].mtype;
262 } else {
263 return Err(DecoderError::MissingReference);
264 }
265 } else {
266 mb.mtype = if br.read_bool()? { MBType::Inter } else { MBType::Intra };
267 }
268 if band.mb_size == band.blk_size {
269 mb.cbp = br.read(1)? as u8;
270 } else {
271 mb.cbp = br.read(4)? as u8;
272 }
273 let q;
274 if band.has_qdelta {
275 if band.inherit_qd {
6f263099 276 if let Some(tileref) = ref_tile {
01c971c5
KS
277 mb.qd = tileref.mb[mb_idx].qd;
278 q = calc_quant(band.quant, mb.qd);
279 } else {
280 return Err(DecoderError::MissingReference);
281 }
282 } else if (mb.cbp != 0) || ((band.plane_no == 0) && (band.band_no == 0) && pic_hdr.in_q) {
283 mb.qd = br.read_ivi_cb_s(&self.mb_cb)? as i16;
284 q = calc_quant(band.quant, mb.qd);
285 } else {
286 q = band.quant as usize;
287 }
288 } else {
289 q = band.quant as usize;
290 }
291
292 if mb.mtype == MBType::Intra {
293 if band.blk_size == 8 {
294 mb.q = INDEO5_QSCALE8_INTRA[band_id][q];
295 } else {
296 mb.q = INDEO5_QSCALE4_INTRA[q];
297 }
298 } else {
299 if band.blk_size == 8 {
300 mb.q = INDEO5_QSCALE8_INTER[band_id][q];
301 } else {
302 mb.q = INDEO5_QSCALE4_INTER[q];
303 }
304 }
305
306 if mb.mtype != MBType::Intra {
307 if band.inherit_mv {
6f263099 308 if let Some(tileref) = ref_tile {
01c971c5
KS
309 let mx = tileref.mb[mb_idx].mv_x;
310 let my = tileref.mb[mb_idx].mv_y;
311 if mv_scale == 0 {
312 mb.mv_x = mx;
313 mb.mv_y = my;
314 } else {
315 mb.mv_x = scale_mv(mx, mv_scale);
316 mb.mv_y = scale_mv(my, mv_scale);
317 }
318 }
319 } else {
320 mv_y += br.read_ivi_cb_s(&self.mb_cb)?;
321 mv_x += br.read_ivi_cb_s(&self.mb_cb)?;
322 mb.mv_x = mv_x;
323 mb.mv_y = mv_y;
324 }
325 }
326 } else {
327 validate!(!pic_hdr.ftype.is_intra());
328 mb.mtype = MBType::Inter;
329 mb.cbp = 0;
330 mb.qd = 0;
331 if (band.plane_no == 0) && (band.band_no == 0) && pic_hdr.in_q {
332 mb.qd = br.read_ivi_cb_s(&self.mb_cb)? as i16;
333 let q = calc_quant(band.quant, mb.qd);
334 if mb.mtype == MBType::Intra {
335 if band.blk_size == 8 {
336 mb.q = INDEO5_QSCALE8_INTRA[band_id][q];
337 } else {
338 mb.q = INDEO5_QSCALE4_INTRA[q];
339 }
340 } else {
341 if band.blk_size == 8 {
342 mb.q = INDEO5_QSCALE8_INTER[band_id][q];
343 } else {
344 mb.q = INDEO5_QSCALE4_INTER[q];
345 }
346 }
347 }
348 if band.inherit_mv {
6f263099 349 if let Some(tileref) = ref_tile {
01c971c5
KS
350 let mx = tileref.mb[mb_idx].mv_x;
351 let my = tileref.mb[mb_idx].mv_y;
352 if mv_scale == 0 {
353 mb.mv_x = mx;
354 mb.mv_y = my;
355 } else {
356 mb.mv_x = scale_mv(mx, mv_scale);
357 mb.mv_y = scale_mv(my, mv_scale);
358 }
359 }
360 }
361 }
362 tile.mb[mb_idx] = mb;
363 mb_idx += 1;
364 }
365 }
366 br.align();
367 Ok(())
368 }
369
39cd2175 370 #[allow(clippy::identity_op)]
01c971c5
KS
371 fn recombine_plane(&mut self, src: &[i16], sstride: usize, dst: &mut [u8], dstride: usize, w: usize, h: usize) {
372 let mut idx0 = 0;
373 let mut idx1 = w / 2;
374 let mut idx2 = (h / 2) * sstride;
375 let mut idx3 = idx2 + idx1;
376 let mut bidx1 = idx1;
377 let mut bidx3 = idx3;
378 let mut oidx0 = 0;
379 let mut oidx1 = dstride;
380 let filt_lo = |a: i16, b: i16| a + b;
381 let filt_hi = |a: i16, b: i16, c: i16| a - b * 6 + c;
382
6048a37f 383 for _ in 0..(h/2)-1 {
01c971c5
KS
384 let mut b0_1 = src[idx0];
385 let mut b0_2 = src[idx0 + sstride];
386 let mut b1_1 = src[bidx1];
387 let mut b1_2 = src[idx1];
388 let mut b1_3 = filt_hi(b1_1, b1_2, src[idx1 + sstride]);
389 let mut b2_1;
390 let mut b2_2 = src[idx2];
391 let mut b2_3 = b2_2;
392 let mut b2_4;
393 let mut b2_5 = src[idx2 + sstride];
394 let mut b2_6 = b2_5;
395 let mut b3_1;
396 let mut b3_2 = src[bidx3];
397 let mut b3_3 = b3_2;
398 let mut b3_4;
399 let mut b3_5 = src[idx3];
400 let mut b3_6 = b3_5;
401 let mut b3_8 = filt_hi(b3_2, b3_5, src[idx3 + sstride]);
402 let mut b3_9 = b3_8;
403 let mut b3_7;
404
6048a37f 405 for x in 0..(w/2)-1 {
01c971c5
KS
406 b2_1 = b2_2;
407 b2_2 = b2_3;
408 b2_4 = b2_5;
409 b2_5 = b2_6;
410 b3_1 = b3_2;
411 b3_2 = b3_3;
412 b3_4 = b3_5;
413 b3_5 = b3_6;
414 b3_7 = b3_8;
415 b3_8 = b3_9;
416
417 let tmp0 = b0_1;
418 let tmp1 = b0_2;
419 b0_1 = src[idx0 + x + 1];
420 b0_2 = src[idx0 + x + 1 + sstride];
421 let mut p0 = tmp0 << 4;
422 let mut p1 = (tmp0 + b0_1) << 3;
423 let mut p2 = (tmp0 + tmp1) << 3;
424 let mut p3 = (tmp0 + tmp1 + b0_1 + b0_2) << 2;
425
426 let tmp0 = b1_1;
427 let tmp1 = b1_2;
428 let tmp2 = filt_lo(tmp0, tmp1);
429 let tmp3 = filt_hi(tmp0, tmp1, b1_3);
430 b1_2 = src[ idx1 + x + 1];
431 b1_1 = src[bidx1 + x + 1];
432 b1_3 = filt_hi(b1_1, b1_2, src[idx1 + x + 1 + sstride]);
433 p0 += tmp2 << 3;
434 p1 += (tmp2 + b1_1 + b1_2) << 2;
435 p2 += tmp3 << 2;
436 p3 += (tmp3 + b1_3) << 1;
437
438 b2_3 = src[idx2 + x + 1];
439 b2_6 = src[idx2 + x + 1 + sstride];
440 let tmp0 = filt_lo(b2_1, b2_2);
441 let tmp1 = filt_hi(b2_1, b2_2, b2_3);
442 p0 += tmp0 << 3;
443 p1 += tmp1 << 2;
444 p2 += (tmp0 + filt_lo(b2_4, b2_5)) << 2;
445 p3 += (tmp1 + filt_hi(b2_4, b2_5, b2_6)) << 1;
446
447 b3_6 = src[idx3 + x + 1];
448 b3_3 = src[bidx3 + x + 1];
449 b3_9 = filt_hi(b3_3, b3_6, src[idx3 + x + 1 + sstride]);
450 let tmp0 = b3_1 + b3_4;
451 let tmp1 = b3_2 + b3_5;
452 let tmp2 = b3_3 + b3_6;
453 p0 += filt_lo(tmp0, tmp1) << 2;
454 p1 += filt_hi(tmp0, tmp1, tmp2) << 1;
455 p2 += filt_lo(b3_7, b3_8) << 1;
456 p3 += filt_hi(b3_7, b3_8, b3_9) << 0;
457
458 dst[oidx0 + x * 2 + 0] = clip8((p0 >> 6) + 128);
459 dst[oidx0 + x * 2 + 1] = clip8((p1 >> 6) + 128);
460 dst[oidx1 + x * 2 + 0] = clip8((p2 >> 6) + 128);
461 dst[oidx1 + x * 2 + 1] = clip8((p3 >> 6) + 128);
462 }
463 bidx1 = idx1;
464 bidx3 = idx3;
465 idx0 += sstride;
466 idx1 += sstride;
467 idx2 += sstride;
468 idx3 += sstride;
469 oidx0 += dstride * 2;
470 oidx1 += dstride * 2;
471 }
472 }
473}
474
475struct Indeo5Decoder {
2422d969 476 info: NACodecInfoRef,
01c971c5
KS
477 dec: IVIDecoder,
478 ip: Indeo5Parser,
479}
480
481impl Indeo5Decoder {
f7686373 482 fn new(scalable: bool) -> Self {
01c971c5
KS
483 Indeo5Decoder {
484 info: NACodecInfo::new_dummy(),
f7686373 485 dec: IVIDecoder::new(scalable),
01c971c5
KS
486 ip: Indeo5Parser::new(),
487 }
488 }
489}
490
491impl NADecoder for Indeo5Decoder {
01613464 492 fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> {
01c971c5
KS
493 if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
494 let w = vinfo.get_width();
495 let h = vinfo.get_height();
496 let f = vinfo.is_flipped();
497 let fmt = formats::YUV410_FORMAT;
498 let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, f, fmt));
2422d969 499 self.info = NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()).into_ref();
01c971c5
KS
500 Ok(())
501 } else {
502 Err(DecoderError::InvalidData)
503 }
504 }
01613464 505 fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
01c971c5 506 let src = pkt.get_buffer();
fa90ccfb 507 let mut br = BitReader::new(src.as_slice(), BitReaderMode::LE);
01c971c5
KS
508
509 let bufinfo = self.dec.decode_frame(&mut self.ip, &mut br)?;
510 let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
511 frm.set_keyframe(self.dec.is_intra());
512 frm.set_frame_type(self.dec.get_frame_type());
171860fc 513 Ok(frm.into_ref())
01c971c5 514 }
f9be4e75
KS
515 fn flush(&mut self) {
516 self.dec.flush();
517 }
01c971c5
KS
518}
519
7d57ae2f
KS
520impl NAOptionHandler for Indeo5Decoder {
521 fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] }
522 fn set_options(&mut self, _options: &[NAOption]) { }
523 fn query_option_value(&self, _name: &str) -> Option<NAValue> { None }
524}
525
01c971c5
KS
526const INDEO5_PICTURE_SIZE_TAB: [[usize; 2]; 15] = [
527 [640, 480], [320, 240], [160, 120], [704, 480], [352, 240], [352, 288], [176, 144],
528 [240, 180], [640, 240], [704, 240], [80, 60], [88, 72], [0, 0], [0, 0], [0, 0]
529];
530
531const INDEO5_FRAME_TYPE: [IVIFrameType; 5] = [
532 IVIFrameType::Intra, IVIFrameType::Inter, IVIFrameType::InterScal,
533 IVIFrameType::InterDroppable, IVIFrameType::NULL,
534];
535
536const INDEO5_QUANT8X8_INTRA: [[u16; 64]; 5] = [
537 [
538 0x1a, 0x2e, 0x36, 0x42, 0x46, 0x4a, 0x4e, 0x5a,
539 0x2e, 0x32, 0x3e, 0x42, 0x46, 0x4e, 0x56, 0x6a,
540 0x36, 0x3e, 0x3e, 0x44, 0x4a, 0x54, 0x66, 0x72,
541 0x42, 0x42, 0x44, 0x4a, 0x52, 0x62, 0x6c, 0x7a,
542 0x46, 0x46, 0x4a, 0x52, 0x5e, 0x66, 0x72, 0x8e,
543 0x4a, 0x4e, 0x54, 0x62, 0x66, 0x6e, 0x86, 0xa6,
544 0x4e, 0x56, 0x66, 0x6c, 0x72, 0x86, 0x9a, 0xca,
545 0x5a, 0x6a, 0x72, 0x7a, 0x8e, 0xa6, 0xca, 0xfe,
546 ], [
547 0x26, 0x3a, 0x3e, 0x46, 0x4a, 0x4e, 0x52, 0x5a,
548 0x3a, 0x3e, 0x42, 0x46, 0x4a, 0x4e, 0x56, 0x5e,
549 0x3e, 0x42, 0x46, 0x48, 0x4c, 0x52, 0x5a, 0x62,
550 0x46, 0x46, 0x48, 0x4a, 0x4e, 0x56, 0x5e, 0x66,
551 0x4a, 0x4a, 0x4c, 0x4e, 0x52, 0x5a, 0x62, 0x6a,
552 0x4e, 0x4e, 0x52, 0x56, 0x5a, 0x5e, 0x66, 0x6e,
553 0x52, 0x56, 0x5a, 0x5e, 0x62, 0x66, 0x6a, 0x72,
554 0x5a, 0x5e, 0x62, 0x66, 0x6a, 0x6e, 0x72, 0x76,
555 ], [
556 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
557 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
558 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
559 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
560 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
561 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
562 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
563 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
564 ], [
565 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e,
566 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
567 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,
568 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4,
569 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde,
570 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2,
571 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6,
572 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2,
573 ], [
574 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
575 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
576 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
577 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
578 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
579 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
580 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
581 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
582 ]
583];
584const INDEO5_QUANT8X8_INTER: [[u16; 64]; 5] = [
585 [
586 0x26, 0x3a, 0x3e, 0x46, 0x4a, 0x4e, 0x52, 0x5a,
587 0x3a, 0x3e, 0x42, 0x46, 0x4a, 0x4e, 0x56, 0x5e,
588 0x3e, 0x42, 0x46, 0x48, 0x4c, 0x52, 0x5a, 0x62,
589 0x46, 0x46, 0x48, 0x4a, 0x4e, 0x56, 0x5e, 0x66,
590 0x4a, 0x4a, 0x4c, 0x4e, 0x52, 0x5a, 0x62, 0x6a,
591 0x4e, 0x4e, 0x52, 0x56, 0x5a, 0x5e, 0x66, 0x6e,
592 0x52, 0x56, 0x5a, 0x5e, 0x62, 0x66, 0x6a, 0x72,
593 0x5a, 0x5e, 0x62, 0x66, 0x6a, 0x6e, 0x72, 0x76,
594 ], [
595 0x26, 0x3a, 0x3e, 0x46, 0x4a, 0x4e, 0x52, 0x5a,
596 0x3a, 0x3e, 0x42, 0x46, 0x4a, 0x4e, 0x56, 0x5e,
597 0x3e, 0x42, 0x46, 0x48, 0x4c, 0x52, 0x5a, 0x62,
598 0x46, 0x46, 0x48, 0x4a, 0x4e, 0x56, 0x5e, 0x66,
599 0x4a, 0x4a, 0x4c, 0x4e, 0x52, 0x5a, 0x62, 0x6a,
600 0x4e, 0x4e, 0x52, 0x56, 0x5a, 0x5e, 0x66, 0x6e,
601 0x52, 0x56, 0x5a, 0x5e, 0x62, 0x66, 0x6a, 0x72,
602 0x5a, 0x5e, 0x62, 0x66, 0x6a, 0x6e, 0x72, 0x76,
603 ], [
604 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
605 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
606 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
607 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
608 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
609 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
610 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
611 0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
612 ], [
613 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e,
614 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
615 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,
616 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4,
617 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde,
618 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2,
619 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6,
620 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2,
621 ], [
622 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
623 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
624 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
625 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
626 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
627 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
628 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
629 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
630 ]
631];
632const INDEO5_QUANT4X4_INTRA: [u16; 16] = [
633 0x1e, 0x3e, 0x4a, 0x52,
634 0x3e, 0x4a, 0x52, 0x5e,
635 0x4a, 0x52, 0x5e, 0x7a,
636 0x52, 0x5e, 0x7a, 0x92
637];
638const INDEO5_QUANT4X4_INTER: [u16; 16] = [
639 0x1e, 0x3e, 0x4a, 0x52,
640 0x3e, 0x4a, 0x52, 0x56,
641 0x4a, 0x52, 0x56, 0x5e,
642 0x52, 0x56, 0x5e, 0x66
643];
644const INDEO5_Q8_INTRA: [&[u16; 64]; 5] = [
645 &INDEO5_QUANT8X8_INTRA[0], &INDEO5_QUANT8X8_INTRA[1], &INDEO5_QUANT8X8_INTRA[2],
646 &INDEO5_QUANT8X8_INTRA[3], &INDEO5_QUANT8X8_INTRA[4],
647];
648const INDEO5_Q8_INTER: [&[u16; 64]; 5] = [
649 &INDEO5_QUANT8X8_INTER[0], &INDEO5_QUANT8X8_INTER[1], &INDEO5_QUANT8X8_INTER[2],
650 &INDEO5_QUANT8X8_INTER[3], &INDEO5_QUANT8X8_INTER[4],
651];
652const INDEO5_Q4_INTRA: &[u16; 16] = &INDEO5_QUANT4X4_INTRA;
653const INDEO5_Q4_INTER: &[u16; 16] = &INDEO5_QUANT4X4_INTER;
654
655const INDEO5_SCAN8X8: [&[usize; 64]; 4] = [
64e8b971 656 &ZIGZAG, &IVI_SCAN_8X8_VER, &IVI_SCAN_8X8_HOR, &IVI_SCAN_8X8_HOR
01c971c5
KS
657];
658const INDEO5_SCAN4X4: &[usize; 16] = &IVI_SCAN_4X4;
659
660const INDEO5_QSCALE8_INTRA: [[u8; 24]; 5] = [
661 [
662 0x0b, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x17, 0x18, 0x1a, 0x1c, 0x1e, 0x20,
663 0x22, 0x24, 0x27, 0x28, 0x2a, 0x2d, 0x2f, 0x31, 0x34, 0x37, 0x39, 0x3c,
664 ], [
665 0x01, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1b, 0x1e, 0x22, 0x25, 0x28, 0x2c,
666 0x30, 0x34, 0x38, 0x3d, 0x42, 0x47, 0x4c, 0x52, 0x58, 0x5e, 0x65, 0x6c,
667 ], [
668 0x13, 0x22, 0x27, 0x2a, 0x2d, 0x33, 0x36, 0x3c, 0x41, 0x45, 0x49, 0x4e,
669 0x53, 0x58, 0x5d, 0x63, 0x69, 0x6f, 0x75, 0x7c, 0x82, 0x88, 0x8e, 0x95,
670 ], [
671 0x13, 0x1f, 0x21, 0x24, 0x27, 0x29, 0x2d, 0x2f, 0x34, 0x37, 0x3a, 0x3d,
672 0x40, 0x44, 0x48, 0x4c, 0x4f, 0x52, 0x56, 0x5a, 0x5e, 0x62, 0x66, 0x6b,
673 ], [
674 0x31, 0x42, 0x47, 0x47, 0x4d, 0x52, 0x58, 0x58, 0x5d, 0x63, 0x67, 0x6b,
675 0x6f, 0x73, 0x78, 0x7c, 0x80, 0x84, 0x89, 0x8e, 0x93, 0x98, 0x9d, 0xa4,
676 ]
677];
678const INDEO5_QSCALE8_INTER: [[u8; 24]; 5] = [
679 [
680 0x0b, 0x11, 0x13, 0x14, 0x15, 0x16, 0x18, 0x1a, 0x1b, 0x1d, 0x20, 0x22,
681 0x23, 0x25, 0x28, 0x2a, 0x2e, 0x32, 0x35, 0x39, 0x3d, 0x41, 0x44, 0x4a,
682 ], [
683 0x07, 0x14, 0x16, 0x18, 0x1b, 0x1e, 0x22, 0x25, 0x29, 0x2d, 0x31, 0x35,
684 0x3a, 0x3f, 0x44, 0x4a, 0x50, 0x56, 0x5c, 0x63, 0x6a, 0x71, 0x78, 0x7e,
685 ], [
686 0x15, 0x25, 0x28, 0x2d, 0x30, 0x34, 0x3a, 0x3d, 0x42, 0x48, 0x4c, 0x51,
687 0x56, 0x5b, 0x60, 0x65, 0x6b, 0x70, 0x76, 0x7c, 0x82, 0x88, 0x8f, 0x97,
688 ], [
689 0x13, 0x1f, 0x20, 0x22, 0x25, 0x28, 0x2b, 0x2d, 0x30, 0x33, 0x36, 0x39,
690 0x3c, 0x3f, 0x42, 0x45, 0x48, 0x4b, 0x4e, 0x52, 0x56, 0x5a, 0x5e, 0x62,
691 ], [
692 0x3c, 0x52, 0x58, 0x5d, 0x63, 0x68, 0x68, 0x6d, 0x73, 0x78, 0x7c, 0x80,
693 0x84, 0x89, 0x8e, 0x93, 0x98, 0x9d, 0xa3, 0xa9, 0xad, 0xb1, 0xb5, 0xba
694 ]
695];
696const INDEO5_QSCALE4_INTRA: [u8; 24] = [
697 0x01, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x13, 0x14,
698 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20
699];
700const INDEO5_QSCALE4_INTER: [u8; 24] = [
701 0x0b, 0x0d, 0x0d, 0x0e, 0x11, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
702 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23
703];
704
08a1fab7 705pub fn get_decoder() -> Box<dyn NADecoder + Send> {
f7686373
KS
706 Box::new(Indeo5Decoder::new(false))
707}
708
709pub fn get_decoder_scalable() -> Box<dyn NADecoder + Send> {
710 Box::new(Indeo5Decoder::new(true))
01c971c5
KS
711}
712
713#[cfg(test)]
714mod test {
3167c45c
KS
715 use nihav_core::codecs::RegisteredDecoders;
716 use nihav_core::demuxers::RegisteredDemuxers;
ce742854 717 use nihav_codec_support::test::dec_video::*;
78fb6560 718 use crate::indeo_register_all_decoders;
e64739f8 719 use nihav_commonfmt::generic_register_all_demuxers;
01c971c5
KS
720 #[test]
721 fn test_indeo5() {
3167c45c
KS
722 let mut dmx_reg = RegisteredDemuxers::new();
723 generic_register_all_demuxers(&mut dmx_reg);
724 let mut dec_reg = RegisteredDecoders::new();
78fb6560 725 indeo_register_all_decoders(&mut dec_reg);
3167c45c 726
886cde48 727 // sample: https://samples.mplayerhq.hu/V-codecs/IV50/sample.avi
122c047f
KS
728 test_decoding("avi", "indeo5", "assets/Indeo/IV5/sample.avi", Some(100),
729 &dmx_reg, &dec_reg, ExpectedTestResult::MD5Frames(vec![
6048a37f
KS
730 [0xcb451428, 0x5c8b1519, 0x96a81eda, 0x0c9cccf0],
731 [0x7554e11f, 0x3b60d661, 0x3bcd14b5, 0x036dcc16],
732 [0x92a20e68, 0x83418e5c, 0x640b6786, 0x9c867622],
733 [0x0b2cde46, 0x67b68ac5, 0xc152edc6, 0xda591ac3],
734 [0x9034354b, 0x81c66b57, 0xcb671505, 0x0062a75f],
735 [0x38606276, 0x547b83df, 0x4a22f079, 0x2afb8362],
736 [0x0d3fe5df, 0xadc8b042, 0x4ee9cb0d, 0xf9b79b11],
737 [0x2b0b1ddb, 0x612a163a, 0x47b5afc8, 0xeb4c79a5],
738 [0x8eadd17e, 0xc4c8c932, 0x57508232, 0x643e1498],
739 [0x0dcc7da2, 0x7b059de2, 0x0ff46dd9, 0x04c11f77],
740 [0xe358728a, 0xe42fc515, 0x8f5cc35f, 0x02973436],
741 [0x66847a32, 0x884b41f0, 0x0c3062bc, 0xb58d923b],
742 [0x555b2711, 0xbcb54b64, 0x5a6141e5, 0xa7b5cc44],
743 [0x0f326348, 0x5d36cb21, 0xe7f8210d, 0x8a43c2c5],
744 [0x4e7b18a3, 0x42146bbb, 0x04c4cf2b, 0x78fe3c0d],
745 [0x220f0721, 0xe681444a, 0x974bf97b, 0x9b658cfe],
746 [0x2d5a5f22, 0x23bd1ed8, 0xed383633, 0x5905422d],
747 [0x982ae872, 0x17b8f765, 0x3d1735af, 0xa2872d9f],
748 [0x743a2819, 0x392d856e, 0xf2ee64ca, 0x63101b79],
749 [0x0c9e0aa7, 0x79414f6b, 0x162c19a6, 0x86d69b96],
750 [0x3eae05ad, 0xbff350bb, 0x97e8a205, 0xfa8e42b2],
751 [0x0ccae893, 0xdfcf9885, 0xef39d053, 0x0a655a73],
752 [0x75e98d11, 0x83fab601, 0xe836a6d2, 0xb2a7c7cb],
753 [0x1565b1ce, 0x8ab813c5, 0xb1658413, 0xeebaf068],
754 [0xe2bb47dd, 0xc3c277a7, 0x8c6bd4be, 0xbbca989d],
755 [0xea97912e, 0xcd224d66, 0x76fd31c2, 0x7a854abf],
756 [0x8eebb842, 0x0534b043, 0xf55a3b65, 0x3868b974],
757 [0x82c55a0b, 0x5d18c3c8, 0xbdc40fd1, 0x5d11f2e2],
758 [0xda46bff0, 0xedc1e115, 0x77cb8b8a, 0xf5fd6ddf],
759 [0x7c9c19e9, 0x4188e742, 0xd8c2cbaf, 0x0ecd1aaa],
760 [0x33145d5b, 0x0c8e2f61, 0x2ab4b213, 0xf1cf9ebe],
761 [0x64f561e1, 0xae2aa75b, 0xe4d56a57, 0xdcc54d10],
762 [0x25545f02, 0x8c271a6a, 0x6b676110, 0xa348628b],
763 [0x8c33d2d7, 0x7dfc25a0, 0xbdb68979, 0xac7ce8f1],
764 [0x8adc7126, 0x71c4d390, 0x4b47aeed, 0x444dbd2b],
765 [0xaab41fbc, 0x2c6de4d8, 0x83b61f31, 0xc68879b1],
766 [0x90961b3a, 0x9a1d4b51, 0xbf34d9d1, 0xe90137a7],
767 [0x2e988439, 0x2d7e67ec, 0x9bfd6405, 0xd851ee32],
768 [0x3b2b45e8, 0x76225018, 0xa2632614, 0x06234ca9],
769 [0xd52dc6af, 0x36c0d185, 0x90f4a9d2, 0x0b024990],
770 [0x5ed3ebb2, 0xb19b49a2, 0xd691c27a, 0x7d52941c],
771 [0xcb22479a, 0x3713b23d, 0x24abe31b, 0x45877b4e],
772 [0x143aa9f1, 0xe7709011, 0xa6ef993b, 0x8e4f33e2],
773 [0xc8b1ad16, 0x820b4f85, 0xe9d1482a, 0x806af90c],
774 [0x4f1eda2b, 0xa73eac8c, 0x8004e66b, 0xa0804e11],
775 [0x668ceb7b, 0xad020ed3, 0x90687534, 0x96eded7e],
776 [0x8bbd77d0, 0x29fc1ae4, 0xc41fb7cf, 0x31b08f08],
777 [0x02d07857, 0x4ed79f55, 0x89cfe082, 0x97167616],
778 [0xd99dbf57, 0x87ef7406, 0x59c9abdf, 0xf664be32],
779 [0x6d2bd834, 0x6b61d6e5, 0x3fd282ce, 0xbc877248],
780 [0xb4dbab3f, 0x7006dded, 0x39608927, 0x9773b83e],
781 [0x6e1f21e8, 0xff1a76c0, 0x197dd40b, 0x3cedee3d],
782 [0x551f64b8, 0x98161c0f, 0xb93103a7, 0xac12366e],
783 [0x6854311c, 0x6bc09f24, 0x226ec3e9, 0x91507815],
784 [0xb106d988, 0x6c9cda70, 0xebf972ce, 0x97b1efa8],
785 [0x91b8c27b, 0x257ff731, 0x1589d60d, 0xcb2b3de9],
786 [0x819d3677, 0xa6afca81, 0x3d2b4ba9, 0xba8cc70f],
787 [0xfb2c67fa, 0x75af7785, 0xde6133b0, 0x1bb59f2c],
788 [0xceb72cd4, 0x8c581ccb, 0x803233f2, 0xb88a174b],
789 [0xe2811f64, 0xa488d42c, 0x3a62a574, 0x918df881],
790 [0x95a66cf8, 0x0529a646, 0x3bc15b00, 0xfb0eedc9],
791 [0x1e90f3ce, 0xa8f81b7f, 0x13d5445c, 0xc969a914],
792 [0x25287783, 0x19869a3d, 0x93672c2a, 0x07a57f5e],
793 [0x44dfacc0, 0x528ae192, 0x141721a9, 0x85b2a3d9],
794 [0x45f13c20, 0x90b07bb5, 0x9a155a2f, 0x3933fb77],
795 [0x40531c62, 0x437c14b6, 0xc03c8d39, 0x35f5ae87],
796 [0x32e58909, 0xdb068147, 0xa967c6cf, 0x33d9416a],
797 [0xa8c44523, 0x12a89332, 0xddd09ccf, 0x7b04c0d2],
798 [0xae00b8b4, 0x589efb18, 0xf8c1dec1, 0xfd9d867f],
799 [0xe2fc1828, 0x5f7a3b28, 0x72de1c32, 0xc01e6ea6],
800 [0x8be4c525, 0xcde70d98, 0xd7f5f5a1, 0xf39faadf],
801 [0x9c744944, 0x00a491f4, 0x665707a9, 0xa93fad9d],
802 [0x036f2525, 0x827ddd36, 0x989c99db, 0x6b9455fc],
803 [0x52c6b5d2, 0xfd4e23f9, 0xb620b0da, 0x462d7566],
804 [0x00ba54e6, 0xfe9021ae, 0xa8c65c37, 0xda979c78],
805 [0x6e11dca0, 0x41887539, 0x2b9781af, 0x94e6b930],
806 [0x086be7db, 0xcce50438, 0x2d94bc75, 0x00f4ebfe],
807 [0xd2216f7c, 0x33321d48, 0x8ce0f144, 0x34c1fd4f],
808 [0x9083c0fc, 0x6cb46451, 0xd8202b2f, 0xae5db326],
809 [0xe894be71, 0x0e1b6c67, 0x70d5e81f, 0x2075d5ff],
810 [0x7f9f10f7, 0x0a8df81d, 0x406cb9cc, 0x524879b5],
811 [0x4c329904, 0x6f939b2c, 0xd49f8bba, 0xad54aee5],
812 [0x92d68b43, 0x2c631f71, 0x98329455, 0x91971f7f],
813 [0x1b06289e, 0x4879af78, 0xc66d7c82, 0xda19e863],
814 [0x399741da, 0xd362b007, 0x8f94e50c, 0xcdd23209],
815 [0xa2063194, 0xc67f368a, 0x83462433, 0xe719c2db],
816 [0x9da0bfd1, 0x8977f90e, 0x7f2f4172, 0xab5213ff],
817 [0x82823c8f, 0xd7cdd62e, 0xac3a59ba, 0x17ef0fb9],
818 [0xb3e51375, 0xfebb3ad3, 0x54ffdda4, 0xfbf44cf9],
819 [0x261f8183, 0x8328012b, 0x47d7e527, 0xc19cca15],
820 [0xef25bfc7, 0x79460e21, 0xeb65f2ef, 0x63731f9f],
821 [0xd14fc8f5, 0x209123ea, 0xf5f1cf21, 0x93f84381],
822 [0xf5375f67, 0x0846d9a1, 0x07aaf802, 0xe753fa08],
823 [0x65a56edd, 0x4ea28e39, 0x10d17a7b, 0xa9445d87],
824 [0xbeb8eb53, 0xd01b9c94, 0xd1d15e41, 0x639307cc],
825 [0xc2272546, 0xd1701452, 0x2fe76cbd, 0xe1dd7697],
826 [0xff6c09f6, 0x1d7804c2, 0x1ca3a2f8, 0x3fffb67b],
827 [0xfe48f3fd, 0x0046ec25, 0x1ed4401a, 0xd67f4ed6],
828 [0x46c3c72f, 0x8398b8c1, 0xe26aff08, 0x0dd1ecbb],
829 [0xc7f49f94, 0xca32d87c, 0x2e063788, 0x0229c6c0],
830 [0xa9ec4820, 0x576c7877, 0xc21211c3, 0x502af3d3]]));
01c971c5 831 }
b3f8f1f4
KS
832 #[test]
833 fn test_indeo5_scalable() {
834 let mut dmx_reg = RegisteredDemuxers::new();
835 crate::indeo_register_all_demuxers(&mut dmx_reg);
836 let mut dec_reg = RegisteredDecoders::new();
837 indeo_register_all_decoders(&mut dec_reg);
838
85a7799e 839 // sample is a trailer for Heart of Darkness game
b3f8f1f4
KS
840 test_decoding("ivf", "indeo5s", "assets/Indeo/TRAILERIIE.IVF", Some(31),
841 &dmx_reg, &dec_reg, ExpectedTestResult::MD5Frames(vec![
842 [0xd6c5b653, 0x082e25e6, 0x90c0c112, 0xfa7f46c8],
843 [0x75e96cdb, 0x198cdb95, 0xde228898, 0x3cf68cfc],
844 [0xb1bed823, 0xad632d3e, 0x2e509143, 0x5e59e911],
845 [0xe3e7e2f0, 0xb8c7d968, 0xcb0b9273, 0xb7e48207],
846 [0xc6ef6975, 0xe0cc0b05, 0x983f7888, 0x64c9b89f],
847 [0xda936fad, 0xa170c0f2, 0x889a3e0c, 0xfef1a626],
848 [0xa85ccb32, 0x2c6847c4, 0x3259f48d, 0xe7e1b47b],
849 [0xedbb8256, 0x1e889428, 0xbc268e66, 0xf41d15f1],
850 [0xd6869899, 0x5121410d, 0xb12dfc96, 0x7dc67a24],
851 [0x9a594172, 0x3d9269c7, 0x1a7277fd, 0xe597dd01],
852 [0x3af07da6, 0x1968872d, 0xf7fc190e, 0x5c61c184],
853 [0xd8eec91e, 0x1aa55dfe, 0x9703a2ce, 0x1ce30990],
854 [0xea4821ae, 0x44ab9f2f, 0xa882bccb, 0xcae50f58],
855 [0x6ddfb989, 0x1affb8ad, 0x7bb2d74a, 0xc28e1a1d],
856 [0x4c9aa98d, 0xb6b2ddd2, 0xfb533baf, 0xc2d90242],
857 [0x332c8e68, 0x47a942ea, 0x6ced7891, 0x7667ad97],
858 [0x940ad339, 0x448ea27c, 0x3b7d0328, 0x4a4cf19f],
859 [0x08a60746, 0x399949ef, 0xce81ef06, 0xbc1d7d6b],
860 [0x4b5e51d0, 0xe26d32f1, 0xb1872663, 0xa70c6e65],
861 [0x428fb122, 0xf3a55f40, 0xdc4316d7, 0xe2765f76],
862 [0xcce4fa35, 0xb47d9848, 0xcbe7fef4, 0x5285022b],
863 [0xde30af92, 0x28a04fe2, 0x317f6be8, 0xde5c161c],
864 [0xe1f00bf7, 0xab2d4e91, 0x9eb674e6, 0x3b863314],
865 [0xac944130, 0xa5d1171a, 0xe8a0b591, 0x09d7652d],
866 [0x17c17612, 0x7cd40f67, 0x7aec3009, 0x2405b862],
867 [0x1d88eb87, 0x44496fb8, 0x58665011, 0xc545f745],
868 [0x04c32cce, 0x38eca98f, 0xd6227880, 0xc7d0f2bf],
869 [0x76d9dcb8, 0x92a35e1a, 0x2b968e96, 0x2c362e4a],
870 [0xda4904e7, 0x2d9d0a74, 0x63932049, 0x7bf9f0de],
871 [0x4f18931c, 0x61b9046f, 0xf5eac763, 0x0c1826d5],
872 [0x823d8746, 0x17debe43, 0xe256fda4, 0xdd1a6832],
873 [0x0bb4b91d, 0xf66f1c19, 0x166ee91a, 0x69379e27]]));
874 }
01c971c5 875}