indeo4: typo
[nihav.git] / src / codecs / indeo / indeo4.rs
CommitLineData
01c971c5
KS
1use std::cell::Ref;
2use io::bitreader::*;
3use formats;
4use super::super::*;
5use super::ivi::*;
6use super::ivibr::*;
7
8struct Indeo4Parser {
9 mb_cb: IVICodebook,
10 blk_cb: IVICodebook,
11}
12
13fn calc_quant(glob_q: u32, qd: i16) -> u8 {
14 let q = (glob_q as i16) + qd;
15 if q < 0 {
16 0
17 } else if q > 31 {
18 31
19 } else {
20 q as u8
21 }
22}
23
24impl Indeo4Parser {
25 fn new() -> Self {
26 Indeo4Parser {
27 mb_cb: IVI_CB_ZERO,
28 blk_cb: IVI_CB_ZERO,
29 }
30 }
31}
32
33impl 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()?;
42 br.skip(1)?;
43 let data_size;
44 if br.read_bool()? {
45 data_size = br.read(24)? as usize;
46 } else {
47 data_size = 0;
48 }
49 if ftype.is_null() {
50 return Ok(PictureHeader::new_null(ftype));
51 }
52 if br.read_bool()? {
53 br.skip(32)?; // key lock
54 }
55 let width;
56 let height;
57 let pic_size_idx = br.read(3)?;
58 if pic_size_idx < 7 {
59 width = INDEO4_PICTURE_SIZE_TAB[pic_size_idx as usize][0];
60 height = INDEO4_PICTURE_SIZE_TAB[pic_size_idx as usize][1];
61 } else {
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));
66 }
67
68 let slice_w;
69 let slice_h;
70 if br.read_bool()? {
71 let idx = br.read(4)? as usize;
72 if idx < 15 {
73 slice_w = INDEO4_SLICE_SIZE_TAB[idx];
74 slice_h = INDEO4_SLICE_SIZE_TAB[idx];
75 } else {
76 slice_w = width;
77 slice_h = height;
78 }
79 } else {
80 slice_w = width;
81 slice_h = height;
82 }
83 let subsampling = br.read(2)?;
84 validate!(subsampling == 0);
85 let sc_idx = br.read(2)?;
86 match sc_idx {
87 3 => { },
88 2 => { validate!(br.read(2*4)? == 0xFF); }
89 _ => { return Err(DecoderError::InvalidData); }
90 };
91 let luma_bands = if sc_idx == 2 { 4 } else { 1 };
92 let sc_idx = br.read(2)?;
93 match sc_idx {
94 3 => { },
95 2 => { validate!(br.read(2*4)? == 0xFF); }
96 _ => { return Err(DecoderError::InvalidData); }
97 };
98 let chroma_bands = if sc_idx == 2 { 4 } else { 1 };
99 let frame_no;
100 if br.read_bool()? {
101 frame_no = br.read(20)?;
102 } else {
103 frame_no = 0;
104 }
105 if br.read_bool()? {
106 br.skip(8)?; // decTimeEst
107 }
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;
116 if br.read_bool()? {
117 br.skip(3)?;
118 }
119 let checksum = if br.read_bool()? { br.read(16)? } else { 0 };
120 if br.read_bool()? {
121 br.skip(8)?; // pic hdr extension
122 }
123 if br.read_bool()? {
124 println!("bad blocks bits!");
125 }
126 br.align();
127
128 Ok(PictureHeader::new(ftype, width, height, slice_w, slice_h, transparent, luma_bands, chroma_bands, in_q))
129 }
130
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);
137 if br.read_bool()? {
138 br.align();
139 return Ok(BandHeader::new_empty(plane_no, band_no));
140 }
141 let hdr_size;
142 if br.read_bool()? {
143 hdr_size = br.read(16)? as usize;
144 } else {
145 hdr_size = 32;
146 }
147 let mv_mode = br.read(2)?;
148 validate!(mv_mode < 2);
149 if br.read_bool()? {
150 br.skip(16)?; //checksum
151 }
152
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)?;
160
161 let tr: IVITransformType;
162 let txtype: TxType;
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;
169
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));
188 } else {
189 unreachable!();
190 }
191 } else {
192 tr = IVITransformType::None(TSize::T8x8);
193 txtype = TxType::None;
194 }
195
196 let blk_cb;
197 if br.read_bool()? {
198
199 blk_cb = br.read_ivi_codebook_desc(false, true)?;
200 } else {
201 blk_cb = self.blk_cb;
202 }
203 let rvmap_idx;
204 if br.read_bool()? {
205 rvmap_idx = br.read(3)? as usize;
206 } else {
207 rvmap_idx = 8;
208 }
209 let num_corr;
210 let mut corr_map: [u8; CORR_MAP_SIZE] = [0; CORR_MAP_SIZE];
211 if br.read_bool()? {
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;
216 }
217 } else {
218 num_corr = 0;
219 }
220
221 br.align();
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))
223 }
224
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<()> {
226 let mut mv_x = 0;
227 let mut mv_y = 0;
228 let mut mb_idx = 0;
229
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;
239 } else {
240 return Err(DecoderError::MissingReference);
241 }
242 } else {
243 if !pic_hdr.ftype.is_bidir() {
244 mb.mtype = if br.read_bool()? { MBType::Inter } else { MBType::Intra };
245 } else {
246 mb.mtype = match br.read(2)? {
247 0 => { MBType::Intra },
248 1 => { MBType::Inter },
249 2 => { MBType::Backward },
250 _ => { MBType::Bidir },
251 };
252 }
253 }
254 if band.mb_size == band.blk_size {
255 mb.cbp = br.read(1)? as u8;
256 } else {
257 mb.cbp = br.read(4)? as u8;
258 }
259 if band.inherit_qd {
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);
263 } else {
264 mb.q = band.quant as u8;
265 }
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);
269 } else {
270 mb.q = band.quant as u8;
271 }
272
273 if mb.mtype != MBType::Intra {
274 if band.inherit_mv {
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;
278 if mv_scale == 0 {
279 mb.mv_x = mx;
280 mb.mv_y = my;
281 } else {
282 mb.mv_x = scale_mv(mx, mv_scale);
283 mb.mv_y = scale_mv(my, mv_scale);
284 }
285 }
286 } else {
287 mv_y += br.read_ivi_cb_s(&self.mb_cb)?;
288 mv_x += br.read_ivi_cb_s(&self.mb_cb)?;
289 mb.mv_x = mv_x;
290 mb.mv_y = mv_y;
291 if mb.mtype == MBType::Backward {
3466a801
KS
292 mb.mv_x = -mb.mv_x;
293 mb.mv_y = -mb.mv_y;
01c971c5
KS
294 } else if mb.mtype == MBType::Bidir {
295 mv_y += br.read_ivi_cb_s(&self.mb_cb)?;
296 mv_x += br.read_ivi_cb_s(&self.mb_cb)?;
297 mb.mv2_x = -mv_x;
298 mb.mv2_y = -mv_y;
299 }
300 }
301 }
302 } else {
303 validate!(!pic_hdr.ftype.is_intra());
304 mb.mtype = MBType::Inter;
305 mb.cbp = 0;
306 mb.qd = 0;
307 if (band.plane_no == 0) && (band.band_no == 0) && pic_hdr.in_q {
308 mb.qd = br.read_ivi_cb_s(&self.mb_cb)? as i16;
309 mb.q = calc_quant(band.quant, mb.qd);
310 }
311 if band.inherit_mv {
312 if let Some(ref tileref) = ref_tile {
313 let mx = tileref.mb[mb_idx].mv_x;
314 let my = tileref.mb[mb_idx].mv_y;
315 if mv_scale == 0 {
316 mb.mv_x = mx;
317 mb.mv_y = my;
318 } else {
319 mb.mv_x = scale_mv(mx, mv_scale);
320 mb.mv_y = scale_mv(my, mv_scale);
321 }
322 }
323 }
324 }
325 tile.mb[mb_idx] = mb;
326 mb_idx += 1;
327 }
328 }
329 br.align();
330 Ok(())
331 }
332
333 fn recombine_plane(&mut self, src: &[i16], sstride: usize, dst: &mut [u8], dstride: usize, w: usize, h: usize) {
334 let mut idx0 = 0;
335 let mut idx1 = w / 2;
336 let mut idx2 = (h / 2) * sstride;
337 let mut idx3 = idx2 + idx1;
338 let mut oidx0 = 0;
339 let mut oidx1 = dstride;
340
341 for _ in 0..(h/2) {
342 for x in 0..(w/2) {
343 let p0 = src[idx0 + x];
344 let p1 = src[idx1 + x];
345 let p2 = src[idx2 + x];
346 let p3 = src[idx3 + x];
347 dst[oidx0 + x * 2 + 0] = clip8(((p0 + p1 + p2 + p3 + 2) >> 2) + 128);
348 dst[oidx0 + x * 2 + 1] = clip8(((p0 + p1 - p2 - p3 + 2) >> 2) + 128);
349 dst[oidx1 + x * 2 + 0] = clip8(((p0 - p1 + p2 - p3 + 2) >> 2) + 128);
350 dst[oidx1 + x * 2 + 1] = clip8(((p0 - p1 - p2 + p3 + 2) >> 2) + 128);
351 }
352 idx0 += sstride;
353 idx1 += sstride;
354 idx2 += sstride;
355 idx3 += sstride;
356 oidx0 += dstride * 2;
357 oidx1 += dstride * 2;
358 }
359 }
360}
361
362struct Indeo4Decoder {
363 info: Rc<NACodecInfo>,
364 dec: IVIDecoder,
365}
366
367impl Indeo4Decoder {
368 fn new() -> Self {
369 Indeo4Decoder {
370 info: NACodecInfo::new_dummy(),
371 dec: IVIDecoder::new(),
372 }
373 }
374}
375
376impl NADecoder for Indeo4Decoder {
377 fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
378 if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
379 let w = vinfo.get_width();
380 let h = vinfo.get_height();
381 let f = vinfo.is_flipped();
382 let fmt = formats::YUV410_FORMAT;
383 let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, f, fmt));
384 self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()));
385 Ok(())
386 } else {
387 Err(DecoderError::InvalidData)
388 }
389 }
390 fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
391 let src = pkt.get_buffer();
392 let mut br = BitReader::new(src.as_slice(), src.len(), BitReaderMode::LE);
393
394 let mut ip = Indeo4Parser::new();
395 let bufinfo = self.dec.decode_frame(&mut ip, &mut br)?;
396 let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
397 frm.set_keyframe(self.dec.is_intra());
398 frm.set_frame_type(self.dec.get_frame_type());
399 Ok(Rc::new(RefCell::new(frm)))
400 }
401}
402
403const INDEO4_PICTURE_SIZE_TAB: [[usize; 2]; 7] = [
44511c7a 404 [640, 480], [320, 240], [160, 120], [704, 480], [352, 240], [352, 288], [176, 144]
01c971c5
KS
405];
406
407const INDEO4_SLICE_SIZE_TAB: [usize; 15] = [
408 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 480
409];
410
411const INDEO4_FRAME_TYPE: [IVIFrameType; 7] = [
412 IVIFrameType::Intra, IVIFrameType::Intra1, IVIFrameType::Inter, IVIFrameType::Bidir,
413 IVIFrameType::InterDroppable, IVIFrameType::NULL, IVIFrameType::NULL2
414];
415
416const INDEO4_TRANSFORMS: [IVITransformType; 18] = [
417 IVITransformType::Haar(TSize::T8x8, TDir::TwoD),
418 IVITransformType::Haar(TSize::T8x8, TDir::Row),
419 IVITransformType::Haar(TSize::T8x8, TDir::Col),
420 IVITransformType::None(TSize::T8x8),
421 IVITransformType::Slant(TSize::T8x8, TDir::TwoD),
422 IVITransformType::Slant(TSize::T8x8, TDir::Row),
423 IVITransformType::Slant(TSize::T8x8, TDir::Col),
424 IVITransformType::DCT(TSize::T8x8, TDir::TwoD),
425 IVITransformType::DCT(TSize::T8x8, TDir::Row),
426 IVITransformType::DCT(TSize::T8x8, TDir::Col),
427 IVITransformType::Haar(TSize::T4x4, TDir::TwoD),
428 IVITransformType::Slant(TSize::T4x4, TDir::TwoD),
429 IVITransformType::None(TSize::T4x4),
430 IVITransformType::Haar(TSize::T4x4, TDir::Row),
431 IVITransformType::Haar(TSize::T4x4, TDir::Col),
432 IVITransformType::Slant(TSize::T4x4, TDir::Row),
433 IVITransformType::Slant(TSize::T4x4, TDir::Col),
434 IVITransformType::DCT(TSize::T4x4, TDir::TwoD),
435];
436
437const INDEO4_SCAN_8X8_ALT: [usize; 64] = [
438 0, 8, 1, 9, 16, 24, 2, 3,
439 17, 25, 10, 11, 32, 40, 48, 56,
440 4, 5, 6, 7, 33, 41, 49, 57,
441 18, 19, 26, 27, 12, 13, 14, 15,
442 34, 35, 43, 42, 50, 51, 59, 58,
443 20, 21, 22, 23, 31, 30, 29, 28,
444 36, 37, 38, 39, 47, 46, 45, 44,
445 52, 53, 54, 55, 63, 62, 61, 60
446];
447const INDEO4_SCAN_4X4_ALT: [usize; 16] = [ 0, 1, 4, 5, 8, 12, 2, 3, 9, 13, 6, 7, 10, 11, 14, 15 ];
448const INDEO4_SCAN_4X4_VER: [usize; 16] = [ 0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15 ];
449const INDEO4_SCAN_4X4_HOR: [usize; 16] = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ];
450
451const INDEO4_SCANS_8X8: [&[usize; 64]; 5] = [
452 &IVI_ZIGZAG, &INDEO4_SCAN_8X8_ALT, &IVI_SCAN_8X8_HOR, &IVI_SCAN_8X8_VER, &IVI_ZIGZAG
453];
454const INDEO4_SCANS_4X4: [&[usize; 16]; 5] = [
455 &IVI_SCAN_4X4, &INDEO4_SCAN_4X4_ALT, &INDEO4_SCAN_4X4_VER, &INDEO4_SCAN_4X4_HOR, &IVI_SCAN_4X4
456];
457
458const INDEO4_Q8X8_IDX: [usize; 15] = [ 0, 1, 0, 2, 1, 3, 0, 4, 1, 5, 0, 1, 6, 7, 8 ];
459const INDEO4_Q4X4_IDX: [usize; 7] = [ 0, 1, 2, 2, 3, 3, 4 ];
460
461const INDEO4_QUANT8X8_INTRA: [[u16; 64]; 9] = [
462 [
463 43, 342, 385, 470, 555, 555, 598, 726,
464 342, 342, 470, 513, 555, 598, 726, 769,
465 385, 470, 555, 555, 598, 726, 726, 811,
466 470, 470, 555, 555, 598, 726, 769, 854,
467 470, 555, 555, 598, 683, 726, 854, 1025,
468 555, 555, 598, 683, 726, 854, 1025, 1153,
469 555, 555, 598, 726, 811, 982, 1195, 1451,
470 555, 598, 726, 811, 982, 1195, 1451, 1793
471 ], [
472 86, 1195, 2390, 2390, 4865, 4865, 4865, 4865,
473 1195, 1195, 2390, 2390, 4865, 4865, 4865, 4865,
474 2390, 2390, 4865, 4865, 6827, 6827, 6827, 6827,
475 2390, 2390, 4865, 4865, 6827, 6827, 6827, 6827,
476 4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827,
477 4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827,
478 4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827,
479 4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827
480 ], [
481 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
482 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
483 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
484 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
485 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
486 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
487 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
488 235, 1067, 1195, 1323, 1451, 1579, 1707, 1835
489 ], [
490 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
491 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
492 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
493 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
494 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
495 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
496 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
497 1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414
498 ], [
499 897, 897, 897, 897, 897, 897, 897, 897,
500 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067,
501 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
502 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409,
503 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579,
504 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
505 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921,
506 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091
507 ], [
508 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
509 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
510 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
511 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
512 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
513 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
514 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
515 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414
516 ], [
517 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
518 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
519 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
520 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
521 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
522 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
523 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
524 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390
525 ], [
526 22, 171, 214, 257, 257, 299, 299, 342,
527 171, 171, 257, 257, 299, 299, 342, 385,
528 214, 257, 257, 299, 299, 342, 342, 385,
529 257, 257, 257, 299, 299, 342, 385, 427,
530 257, 257, 299, 299, 342, 385, 427, 513,
531 257, 299, 299, 342, 385, 427, 513, 598,
532 299, 299, 299, 385, 385, 470, 598, 726,
533 299, 299, 385, 385, 470, 598, 726, 897
534 ], [
535 86, 598, 1195, 1195, 2390, 2390, 2390, 2390,
536 598, 598, 1195, 1195, 2390, 2390, 2390, 2390,
537 1195, 1195, 2390, 2390, 3414, 3414, 3414, 3414,
538 1195, 1195, 2390, 2390, 3414, 3414, 3414, 3414,
539 2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414,
540 2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414,
541 2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414,
542 2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414
543 ]
544];
545const INDEO4_QUANT8X8_INTER: [[u16; 64]; 9] = [
546 [
547 427, 427, 470, 427, 427, 427, 470, 470,
548 427, 427, 470, 427, 427, 427, 470, 470,
549 470, 470, 470, 470, 470, 470, 470, 470,
550 427, 427, 470, 470, 427, 427, 470, 470,
551 427, 427, 470, 427, 427, 427, 470, 470,
552 427, 427, 470, 427, 427, 427, 470, 470,
553 470, 470, 470, 470, 470, 470, 470, 470,
554 470, 470, 470, 470, 470, 470, 470, 470
555 ], [
556 1707, 1707, 2433, 2433, 3414, 3414, 3414, 3414,
557 1707, 1707, 2433, 2433, 3414, 3414, 3414, 3414,
558 2433, 2433, 3414, 3414, 4822, 4822, 4822, 4822,
559 2433, 2433, 3414, 3414, 4822, 4822, 4822, 4822,
560 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414,
561 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414,
562 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414,
563 3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414
564 ], [
565 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
566 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
567 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
568 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
569 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
570 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
571 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
572 1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281
573 ], [
574 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
575 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
576 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
577 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
578 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
579 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
580 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
581 2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433
582 ], [
583 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
584 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
585 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281,
586 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
587 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
588 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
589 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281,
590 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281
591 ], [
592 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
593 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
594 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
595 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
596 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
597 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
598 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
599 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433
600 ], [
601 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
602 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
603 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
604 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
605 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
606 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
607 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
608 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707
609 ], [
610 86, 171, 171, 214, 214, 214, 214, 257,
611 171, 171, 214, 214, 214, 214, 257, 257,
612 171, 214, 214, 214, 214, 257, 257, 257,
613 214, 214, 214, 214, 257, 257, 257, 299,
614 214, 214, 214, 257, 257, 257, 299, 299,
615 214, 214, 257, 257, 257, 299, 299, 299,
616 214, 257, 257, 257, 299, 299, 299, 342,
617 257, 257, 257, 299, 299, 299, 342, 342
618 ], [
619 854, 854, 1195, 1195, 1707, 1707, 1707, 1707,
620 854, 854, 1195, 1195, 1707, 1707, 1707, 1707,
621 1195, 1195, 1707, 1707, 2390, 2390, 2390, 2390,
622 1195, 1195, 1707, 1707, 2390, 2390, 2390, 2390,
623 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707,
624 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707,
625 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707,
626 1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707
627 ]
628];
629const INDEO4_QUANT4X4_INTRA: [[u16; 16]; 5] = [
630 [
631 22, 214, 257, 299,
632 214, 257, 299, 342,
633 257, 299, 342, 427,
634 299, 342, 427, 513
635 ], [
636 129, 1025, 1451, 1451,
637 1025, 1025, 1451, 1451,
638 1451, 1451, 2049, 2049,
639 1451, 1451, 2049, 2049
640 ], [
641 43, 171, 171, 171,
642 43, 171, 171, 171,
643 43, 171, 171, 171,
644 43, 171, 171, 171
645 ], [
646 43, 43, 43, 43,
647 171, 171, 171, 171,
648 171, 171, 171, 171,
649 171, 171, 171, 171
650 ], [
651 43, 43, 43, 43,
652 43, 43, 43, 43,
653 43, 43, 43, 43,
654 43, 43, 43, 43
655 ]
656];
657const INDEO4_QUANT4X4_INTER: [[u16; 16]; 5] = [
658 [
659 107, 214, 257, 299,
660 214, 257, 299, 299,
661 257, 299, 299, 342,
662 299, 299, 342, 342
663 ], [
664 513, 1025, 1238, 1238,
665 1025, 1025, 1238, 1238,
666 1238, 1238, 1451, 1451,
667 1238, 1238, 1451, 1451
668 ], [
669 43, 171, 171, 171,
670 43, 171, 171, 171,
671 43, 171, 171, 171,
672 43, 171, 171, 171
673 ], [
674 43, 43, 43, 43,
675 171, 171, 171, 171,
676 171, 171, 171, 171,
677 171, 171, 171, 171
678 ], [
679 43, 43, 43, 43,
680 43, 43, 43, 43,
681 43, 43, 43, 43,
682 43, 43, 43, 43
683 ]
684];
685const INDEO4_Q8_INTRA: [&[u16; 64]; 9] = [
686 &INDEO4_QUANT8X8_INTRA[0], &INDEO4_QUANT8X8_INTRA[1], &INDEO4_QUANT8X8_INTRA[2],
687 &INDEO4_QUANT8X8_INTRA[3], &INDEO4_QUANT8X8_INTRA[4], &INDEO4_QUANT8X8_INTRA[5],
688 &INDEO4_QUANT8X8_INTRA[6], &INDEO4_QUANT8X8_INTRA[7], &INDEO4_QUANT8X8_INTRA[8],
689];
690const INDEO4_Q8_INTER: [&[u16; 64]; 9] = [
691 &INDEO4_QUANT8X8_INTER[0], &INDEO4_QUANT8X8_INTER[1], &INDEO4_QUANT8X8_INTER[2],
692 &INDEO4_QUANT8X8_INTER[3], &INDEO4_QUANT8X8_INTER[4], &INDEO4_QUANT8X8_INTER[5],
693 &INDEO4_QUANT8X8_INTER[6], &INDEO4_QUANT8X8_INTER[7], &INDEO4_QUANT8X8_INTER[8],
694];
695const INDEO4_Q4_INTRA: [&[u16; 16]; 5] = [
696 &INDEO4_QUANT4X4_INTRA[0], &INDEO4_QUANT4X4_INTRA[1], &INDEO4_QUANT4X4_INTRA[2],
697 &INDEO4_QUANT4X4_INTRA[3], &INDEO4_QUANT4X4_INTRA[4]
698];
699const INDEO4_Q4_INTER: [&[u16; 16]; 5] = [
700 &INDEO4_QUANT4X4_INTER[0], &INDEO4_QUANT4X4_INTER[1], &INDEO4_QUANT4X4_INTER[2],
701 &INDEO4_QUANT4X4_INTER[3], &INDEO4_QUANT4X4_INTER[4]
702];
703
704pub fn get_decoder() -> Box<NADecoder> {
705 Box::new(Indeo4Decoder::new())
706}
707
708#[cfg(test)]
709mod test {
710 use test::dec_video::test_file_decoding;
711 #[test]
712 fn test_indeo4() {
713 test_file_decoding("avi", "assets/IV4/volcano.avi", /*None*/Some(16), true, false, Some("iv4"));
714panic!("the end");
715 }
716}