12 #[derive(Clone, Copy)]
26 const DEFAULT_PIXEL: u8 = 0x40;
29 fn new() -> Self { Buffers { width: 0, height: 0, buf1: Vec::new(), buf2: Vec::new(), fbuf: true } }
33 self.buf1.truncate(0);
34 self.buf2.truncate(0);
36 fn alloc(&mut self, w: usize, h: usize) {
39 self.buf1.resize(w * h + (w >> 2) * (h >> 2) * 2, DEFAULT_PIXEL);
40 self.buf2.resize(w * h + (w >> 2) * (h >> 2) * 2, DEFAULT_PIXEL);
42 fn flip(&mut self) { self.fbuf = !self.fbuf; }
43 fn get_stride(&mut self, planeno: usize) -> usize {
44 if planeno == 0 { self.width } else { self.width >> 2 }
46 fn get_offset(&mut self, planeno: usize) -> usize {
48 1 => self.width * self.height,
49 2 => self.width * self.height + (self.width >> 2) * (self.height >> 2),
53 fn fill_framebuf(&mut self, fbuf: &mut NAVideoBuffer<u8>) {
55 let mut soff = self.get_offset(planeno);
56 let mut doff = fbuf.get_offset(planeno);
57 let sstride = self.get_stride(planeno);
58 let dstride = fbuf.get_stride(planeno);
59 let width = if planeno == 0 { self.width } else { self.width >> 2 };
60 let height = if planeno == 0 { self.height } else { self.height >> 2 };
61 let src = if self.fbuf { &self.buf1[0..] } else { &self.buf2[0..] };
62 let mut dst = fbuf.get_data_mut();
65 dst[doff + x] = src[soff + x] * 2;
72 fn copy_block(&mut self, doff: usize, soff: usize, stride: usize, w: usize, h: usize) {
77 for i in 0..w { self.buf1[didx + i] = self.buf2[sidx + i]; }
83 for i in 0..w { self.buf2[didx + i] = self.buf1[sidx + i]; }
89 fn fill_block(&mut self, doff: usize, stride: usize, w: usize, h: usize, topline: bool) {
91 let mut buf: [u8; 8] = [0; 8];
95 for i in 0..w { self.buf1[didx + i] = DEFAULT_PIXEL; }
100 for i in 0..w { self.buf2[didx + i] = DEFAULT_PIXEL; }
106 for i in 0..w { buf[i] = self.buf1[didx - stride + i]; }
108 for i in 0..w { self.buf1[didx + i] = buf[i]; }
112 for i in 0..w { buf[i] = self.buf2[didx - stride + i]; }
114 for i in 0..w { self.buf2[didx + i] = buf[i]; }
122 #[allow(unused_variables)]
123 fn apply_delta4x4(bufs: &mut Buffers, off: usize, stride: usize,
124 deltas: &[u8], topline: bool, first_line: bool) {
125 let mut dst = if bufs.fbuf { &mut bufs.buf1[off..(off + 4)] }
126 else { &mut bufs.buf2[off..(off + 4)] };
127 for i in 0..4 { dst[i] = dst[i].wrapping_add(deltas[i]) & 0x7F; }
130 #[allow(unused_variables)]
131 fn apply_delta4x8(bufs: &mut Buffers, off: usize, stride: usize,
132 deltas: &[u8], topline: bool, first_line: bool) {
133 let mut dst = if bufs.fbuf { &mut bufs.buf1[off..(off + 4 + stride)] }
134 else { &mut bufs.buf2[off..(off + 4 + stride)] };
135 for i in 0..4 { dst[i + stride] = dst[i].wrapping_add(deltas[i]) & 0x7F; }
137 for i in 0..4 { dst[i] = (dst[i + stride] + dst[i]) >> 1; }
139 for i in 0..4 { dst[i] = dst[i + stride]; }
143 #[allow(unused_variables)]
144 fn apply_delta4x8m11(bufs: &mut Buffers, off: usize, stride: usize,
145 deltas: &[u8], topline: bool, first_line: bool) {
146 let mut dst = if bufs.fbuf { &mut bufs.buf1[off..(off + 4 + stride)] }
147 else { &mut bufs.buf2[off..(off + 4 + stride)] };
148 for i in 0..4 { dst[i] = dst[i] .wrapping_add(deltas[i]) & 0x7F; }
149 for i in 0..4 { dst[i + stride] = dst[i + stride].wrapping_add(deltas[i]) & 0x7F; }
152 #[allow(unused_variables)]
153 fn apply_delta8x8p(bufs: &mut Buffers, off: usize, stride: usize,
154 deltas: &[u8], topline: bool, first_line: bool) {
155 let mut dst = if bufs.fbuf { &mut bufs.buf1[off..(off + 8 + stride)] }
156 else { &mut bufs.buf2[off..(off + 8 + stride)] };
157 for i in 0..8 { dst[i] = dst[i] .wrapping_add(deltas[i >> 1]) & 0x7F; }
158 for i in 0..8 { dst[i + stride] = dst[i + stride].wrapping_add(deltas[i >> 1]) & 0x7F; }
161 fn apply_delta8x8i(bufs: &mut Buffers, off: usize, stride: usize,
162 deltas: &[u8], topline: bool, firstline: bool) {
163 let mut dst = if bufs.fbuf { &mut bufs.buf1[off..(off + 8 + stride)] }
164 else { &mut bufs.buf2[off..(off + 8 + stride)] };
166 for i in 0..8 { dst[i + stride] = dst[i ].wrapping_add(deltas[i >> 1]) & 0x7F; }
168 for i in 0..8 { dst[i + stride] = dst[i & !1].wrapping_add(deltas[i >> 1]) & 0x7F; }
171 for i in 0..8 { dst[i] = (dst[i + stride] + dst[i]) >> 1; }
173 for i in 0..8 { dst[i] = dst[i + stride]; }
177 fn copy_line_top(bufs: &mut Buffers, off: usize, stride: usize, bw: usize, topline: bool) {
178 let mut buf: [u8; 8] = [0; 8];
180 let src = if bufs.fbuf { &bufs.buf1[(off - stride)..(off - stride + bw)] }
181 else { &bufs.buf2[(off - stride)..(off - stride + bw)] };
182 for i in 0..bw { buf[i] = src[i]; }
184 for i in 0..bw { buf[i] = DEFAULT_PIXEL; }
186 let mut dst = if bufs.fbuf { &mut bufs.buf1[off..(off + bw)] }
187 else { &mut bufs.buf2[off..(off + bw)] };
188 for i in 0..bw { dst[i] = buf[i]; }
191 fn copy_line_top4x4(bufs: &mut Buffers, off: usize, stride: usize, topline: bool) {
192 copy_line_top(bufs, off, stride, 4, topline);
195 fn copy_line_top4x8(bufs: &mut Buffers, off: usize, stride: usize, topline: bool) {
196 copy_line_top(bufs, off, stride, 4, topline);
197 copy_line_top(bufs, off + stride, stride, 4, false);
200 fn copy_line_top8x8(bufs: &mut Buffers, off: usize, stride: usize, topline: bool) {
201 let mut buf: [u8; 8] = [0; 8];
203 let src = if bufs.fbuf { &bufs.buf1[(off - stride)..(off - stride + 8)] }
204 else { &bufs.buf2[(off - stride)..(off - stride + 8)] };
205 for i in 0..8 { buf[i] = src[i & !1]; }
207 for i in 0..8 { buf[i] = DEFAULT_PIXEL; }
209 let mut dst = if bufs.fbuf { &mut bufs.buf1[off..(off + 8)] }
210 else { &mut bufs.buf2[off..(off + 8)] };
211 for i in 0..8 {dst[i] = buf[i]; }
214 fn fill_block8x8(bufs: &mut Buffers, doff: usize, stride: usize, h: usize, topline: bool, firstline: bool) {
216 let mut buf: [u8; 8] = [0; 8];
218 for i in 0..8 { buf[i] = DEFAULT_PIXEL; }
219 } else if bufs.fbuf {
220 for i in 0..8 { buf[i] = bufs.buf1[doff - stride + i]; }
222 for i in 0..8 { buf[i] = bufs.buf1[doff - stride + i]; }
224 if topline && !firstline {
225 for i in 0..4 { buf[i * 2 + 1] = buf[i * 2]; }
227 for i in 0..8 { bufs.buf1[doff + i] = (bufs.buf1[doff - stride + i] + buf[i]) >> 1; }
229 for i in 0..8 { bufs.buf2[doff + i] = (bufs.buf2[doff - stride + i] + buf[i]) >> 1; }
233 let start = if !topline { 0 } else { 1 };
236 for i in 0..8 { bufs.buf1[didx + i] = buf[i]; }
241 for i in 0..8 { bufs.buf2[didx + i] = buf[i]; }
247 struct Indeo3Decoder {
248 info: Rc<NACodecInfo>,
259 #[derive(Clone,Copy)]
271 fn new(w: u16, h: u16) -> Self {
272 IV3Cell { x: 0, y: 0, w: w, h: h, d: 20, vqt: false, mv: None }
274 fn split_h(&self) -> (Self, Self) {
275 let h1 = if self.h > 2 { ((self.h + 2) >> 2) << 1 } else { 1 };
276 let h2 = self.h - h1;
277 let mut cell1 = *self;
280 let mut cell2 = *self;
286 fn split_w(&self, stripw: u16) -> (Self, Self) {
287 let w1 = if self.w > stripw {
288 if self.w > stripw * 2 { stripw * 2 } else { stripw }
290 if self.w > 2 { ((self.w + 2) >> 2) << 1 } else { 1 }
292 let w2 = self.w - w1;
293 let mut cell1 = *self;
296 let mut cell2 = *self;
302 fn no_mv(&self) -> bool { match self.mv { None => true, Some(_) => false } }
305 struct CellDecParams {
311 apply_delta: fn (&mut Buffers, usize, usize, &[u8], bool, bool),
312 copy_line_top: fn (&mut Buffers, usize, usize, bool),
315 const FRMH_TAG: u32 = ((b'F' as u32) << 24) | ((b'R' as u32) << 16)
316 | ((b'M' as u32) << 8) | (b'H' as u32);
318 const H_SPLIT: u8 = 0;
319 const V_SPLIT: u8 = 1;
320 const SKIP_OR_TREE: u8 = 2;
324 let dummy_info = Rc::new(DUMMY_CODEC_INFO);
325 Indeo3Decoder { info: dummy_info, bpos: 0, bbuf: 0, width: 0, height: 0,
326 mvs: Vec::new(), altquant: [0; 16],
327 vq_offset: 0, bufs: Buffers::new() }
330 fn br_reset(&mut self) {
335 fn get_2bits(&mut self, br: &mut ByteReader) -> DecoderResult<u8> {
337 self.bbuf = br.read_byte()?;
341 Ok((self.bbuf >> self.bpos) & 0x3)
344 fn decode_cell_data(&mut self, br: &mut ByteReader, cell: IV3Cell,
345 off: usize, stride: usize, params: CellDecParams) -> DecoderResult<()> {
346 let blk_w = cell.w * 4 / params.bw;
347 let blk_h = cell.h * 4 / params.bh;
348 let scale: usize = if params.bh == 4 { 1 } else { 2 };
350 validate!((((cell.w * 4) % params.bw) == 0) && (((cell.h * 4) % params.bh) == 0));
352 let mut run_blocks = 0;
353 let mut run_skip = false;
355 let mut didx: usize = ((cell.x*4) as usize) + ((cell.y * 4) as usize) * stride + off;
360 let mv = cell.mv.unwrap();
361 let mx = mv.x as i16;
362 let my = mv.y as i16;
363 let l = (cell.x as i16) * 4 + mx;
364 let t = (cell.y as i16) * 4 + my;
365 let r = ((cell.x + cell.w) as i16) * 4 + mx;
366 let b = ((cell.y + cell.h) as i16) * 4 + my;
369 validate!(r <= (self.width as i16));
370 validate!(b <= (self.height as i16));
371 sidx = (l as usize) + (t as usize) * stride + off;
374 let mut xoff: usize = 0;
377 if !run_skip || !cell.no_mv() {
378 if !(params.bw == 8 && cell.no_mv()) {
380 self.bufs.copy_block(didx + xoff, sidx + xoff, stride,
381 params.bw as usize, params.bh as usize);
383 self.bufs.fill_block(didx + xoff, stride,
384 params.bw as usize, params.bh as usize,
385 (cell.y == 0) && (y == 0));
388 fill_block8x8(&mut self.bufs,
389 didx + xoff, stride, 8,
390 (y == 0), (cell.y == 0) && (y == 0));
395 let mut line: usize = 0;
397 let c = br.read_byte()?;
399 let delta_tab = if params.hq {
400 IVI3_DELTA_CBS[params.tab[line & 1]]
402 IVI3_DELTA_CBS[params.tab[1]]
406 if (c as usize) < delta_tab.data.len()/2 {
407 idx1 = br.read_byte()? as usize;
408 validate!(idx1 < delta_tab.data.len());
411 let tmp = (c as usize) - delta_tab.data.len()/2;
412 idx1 = tmp / (delta_tab.quad_radix as usize);
413 idx2 = tmp % (delta_tab.quad_radix as usize);
414 if params.swap_q[line & 1] {
415 mem::swap(&mut idx1, &mut idx2);
418 let deltas: [u8; 4] = [delta_tab.data[idx1 * 2] as u8,
419 delta_tab.data[idx1 * 2 + 1] as u8,
420 delta_tab.data[idx2 * 2 + 0] as u8,
421 delta_tab.data[idx2 * 2 + 1] as u8];
422 let topline = (cell.y == 0) && (y == 0) && (line == 0);
423 let first_line = (y == 0) && (line == 0);
425 (params.copy_line_top)(&mut self.bufs,
426 didx + xoff + line * scale * stride,
429 self.bufs.copy_block(didx + xoff + line * scale * stride,
430 sidx + xoff + line * scale * stride,
431 stride, params.bw as usize, scale);
433 (params.apply_delta)(&mut self.bufs,
434 didx + xoff + line * scale * stride,
435 stride, &deltas, topline, first_line);
438 let mut tocopy: usize = 0;
439 let mut do_copy = true;
440 if c == 0xF8 { return Err(DecoderError::InvalidData); }
444 validate!(line == 0);
446 do_copy = !cell.no_mv();
449 validate!(line == 0);
451 do_copy = !cell.no_mv();
454 let c = br.read_byte()?;
455 validate!((c < 64) && ((c & 0x1F) != 0));
456 run_blocks = (c & 0x1F) - 1;
457 run_skip = (c & 0x20) != 0;
459 if params.bw == 4 && cell.no_mv() && run_skip {
469 let nl = 257 - (c as i16) - (line as i16);
471 tocopy = nl as usize;
474 if !(params.bw == 8 && cell.no_mv()) {
476 self.bufs.copy_block(didx + xoff + line * scale * stride,
477 sidx + xoff + line * scale * stride,
478 stride, params.bw as usize,
481 self.bufs.fill_block(didx + xoff + line * scale * stride,
482 stride, params.bw as usize,
484 (cell.y == 0) && (y == 0) && (line == 0));
487 fill_block8x8(&mut self.bufs,
488 didx + xoff + line * 2 * stride,
490 (y == 0) && (line == 0),
491 (cell.y == 0) && (y == 0) && (line == 0));
498 xoff += params.bw as usize;
500 didx += stride * (params.bh as usize);
501 sidx += stride * (params.bh as usize);
506 fn copy_cell(&mut self, cell: IV3Cell, off: usize, stride: usize) -> DecoderResult<()> {
507 if cell.no_mv() { return Err(DecoderError::InvalidData); }
508 let mv = cell.mv.unwrap();
509 let mx = mv.x as i16;
510 let my = mv.y as i16;
511 let l = (cell.x as i16) * 4 + mx;
512 let t = (cell.y as i16) * 4 + my;
513 let r = ((cell.x + cell.w) as i16) * 4 + mx;
514 let b = ((cell.y + cell.h) as i16) * 4 + my;
517 validate!(r <= (self.width as i16));
518 validate!(b <= (self.height as i16));
519 let sidx: usize = off + (l as usize) + (t as usize) * stride;
520 let didx: usize = off + ((cell.x * 4) as usize) + ((cell.y * 4) as usize) * stride;
521 self.bufs.copy_block(didx, sidx, stride, (cell.w * 4) as usize, (cell.h * 4) as usize);
525 fn decode_cell(&mut self, br: &mut ByteReader, cell: IV3Cell, off: usize,
526 stride: usize, intra: bool) -> DecoderResult<()> {
527 let code = br.read_byte()?;
528 let mode = code >> 4;
529 let vq_idx = code & 0xF;
531 let mut idx1: usize = vq_idx as usize;
532 let mut idx2: usize = vq_idx as usize;
533 if (mode == 1) || (mode == 4) {
534 let c = self.altquant[vq_idx as usize];
535 idx1 = (c >> 4) as usize;
536 idx2 = (c & 0xF) as usize;
539 idx1 += self.vq_offset as usize;
540 idx2 += self.vq_offset as usize;
541 validate!((idx1 < 24) && (idx2 < 24));
543 let mut cp = CellDecParams {
546 swap_q: [idx2 >= 16, idx1 >= 16],
548 apply_delta: apply_delta4x4,
549 copy_line_top: copy_line_top4x4,
551 if (mode == 0) || (mode == 1) {
555 } else if (mode == 3) || (mode == 4) {
556 if !cell.no_mv() { return Err(DecoderError::InvalidData); }
560 cp.apply_delta = apply_delta4x8;
561 cp.copy_line_top = copy_line_top4x8;
562 } else if mode == 10 {
565 cp.apply_delta = apply_delta8x8p;
567 cp.apply_delta = apply_delta8x8i;
571 cp.copy_line_top = copy_line_top8x8;
572 } else if mode == 11 {
573 if cell.no_mv() { return Err(DecoderError::InvalidData); }
577 cp.apply_delta = apply_delta4x8m11;
578 cp.copy_line_top = copy_line_top4x8;
580 return Err(DecoderError::InvalidData);
582 self.decode_cell_data(br, cell, off, stride, cp)
585 fn parse_tree(&mut self, br: &mut ByteReader, cell: IV3Cell, off: usize,
586 stride: usize, stripw: u16, intra: bool) -> DecoderResult<()> {
587 let op = self.get_2bits(br)?;
589 validate!(cell.h > 1);
590 validate!(cell.d > 0);
591 let (cell1, cell2) = cell.split_h();
592 self.parse_tree(br, cell1, off, stride, stripw, intra)?;
593 self.parse_tree(br, cell2, off, stride, stripw, intra)?;
595 } else if op == V_SPLIT {
596 validate!(cell.w > 1);
597 validate!(cell.d > 0);
598 let (cell1, cell2) = cell.split_w(stripw);
599 self.parse_tree(br, cell1, off, stride, stripw, intra)?;
600 self.parse_tree(br, cell2, off, stride, stripw, intra)?;
602 } else if op == SKIP_OR_TREE {
604 let mut newcell = cell;
607 self.parse_tree(br, newcell, off, stride, stripw, intra)
610 let code = self.get_2bits(br)?;
612 if code == 1 { return Err(DecoderError::NotImplemented); }
613 self.copy_cell(cell, off, stride)
617 let mut newcell = cell;
620 let mv_idx = br.read_byte()? as usize;
621 validate!(mv_idx < self.mvs.len());
622 newcell.mv = Some(self.mvs[mv_idx]);
623 self.parse_tree(br, newcell, off, stride, stripw, intra)
625 self.decode_cell(br, cell, off, stride, intra)
630 fn decode_plane_intra(&mut self, br: &mut ByteReader, planeno: usize,
631 start: u64, end: u64) -> DecoderResult<()> {
632 let offs = self.bufs.get_offset(planeno);
633 let stride = self.bufs.get_stride(planeno);
634 br.seek(SeekFrom::Start(start))?;
636 let nvec = br.read_u32le()?;
637 validate!(nvec == 0); // for intra there should be no mc_vecs
638 self.mvs.truncate(0);
640 let x = br.read_byte()? as i8;
641 let y = br.read_byte()? as i8;
642 self.mvs.push(MV{ x: x, y: y });
645 let shift = if planeno == 0 { 2 } else { 4 };
646 let cell = IV3Cell::new((self.bufs.width >> shift) as u16,
647 (self.bufs.height >> shift) as u16);
649 self.parse_tree(br, cell, offs, stride, if planeno > 0 { 10 } else { 40 }, true)?;
650 validate!(br.tell() <= end);
654 fn decode_plane_inter(&mut self, br: &mut ByteReader, planeno: usize,
655 start: u64, end: u64) -> DecoderResult<()> {
656 let offs = self.bufs.get_offset(planeno);
657 let stride = self.bufs.get_stride(planeno);
658 br.seek(SeekFrom::Start(start))?;
660 let nvec = br.read_u32le()?;
661 validate!(nvec <= 256); // for intra there should be no mc_vecs
662 self.mvs.truncate(0);
664 let y = br.read_byte()? as i8;
665 let x = br.read_byte()? as i8;
666 self.mvs.push(MV{ x: x, y: y });
669 let shift = if planeno == 0 { 2 } else { 4 };
670 let cell = IV3Cell::new((self.bufs.width >> shift) as u16,
671 (self.bufs.height >> shift) as u16);
673 self.parse_tree(br, cell, offs, stride, if planeno > 0 { 10 } else { 40 }, false)?;
674 validate!(br.tell() <= end);
679 const FLAG_KEYFRAME: u16 = 1 << 2;
680 const FLAG_NONREF: u16 = 1 << 8;
682 impl NADecoder for Indeo3Decoder {
683 fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
684 if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
685 let w = vinfo.get_width();
686 let h = vinfo.get_height();
687 let fmt = formats::YUV410_FORMAT;
688 let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, false, fmt));
689 self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()));
693 Err(DecoderError::InvalidData)
696 fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
697 let src = pkt.get_buffer();
698 let mut mr = MemoryReader::new_read(&src);
699 let mut br = ByteReader::new(&mut mr);
700 let frameno = br.read_u32le()?;
701 let hdr_2 = br.read_u32le()?;
702 let check = br.read_u32le()?;
703 let size = br.read_u32le()?;
705 let data_start = br.tell();
707 if (frameno ^ hdr_2 ^ size ^ FRMH_TAG) != check {
708 return Err(DecoderError::InvalidData);
710 if (size as i64) > br.left() { return Err(DecoderError::InvalidData); }
711 let ver = br.read_u16le()?;
712 if ver != 32 { return Err(DecoderError::NotImplemented); }
713 let flags = br.read_u16le()?;
714 let size2 = br.read_u32le()?;
715 validate!(((size2 + 7) >> 3) <= size);
716 let cb = br.read_byte()?;
719 let height = br.read_u16le()?;
720 let width = br.read_u16le()?;
721 validate!((width >= 16) && (width <= 640));
722 validate!((height >= 16) && (height <= 640));
723 validate!(((width & 3) == 0) && ((height & 3) == 0));
724 if (self.bufs.width != (width as usize)) || (self.bufs.height != (height as usize)) {
725 self.bufs.alloc(width as usize, height as usize);
728 self.height = height;
730 let yoff = br.read_u32le()?;
731 let uoff = br.read_u32le()?;
732 let voff = br.read_u32le()?;
733 if yoff > size { return Err(DecoderError::InvalidData); }
734 if uoff > size { return Err(DecoderError::InvalidData); }
735 if voff > size { return Err(DecoderError::InvalidData); }
738 br.read_buf(&mut self.altquant)?;
740 let mut yend = src.len() as u32;//size;
741 if (uoff < yend) && (uoff > yoff) { yend = uoff; }
742 if (voff < yend) && (voff > yoff) { yend = voff; }
744 if (yoff < uend) && (yoff > uoff) { uend = yoff; }
745 if (voff < uend) && (voff > uoff) { uend = voff; }
747 if (yoff < vend) && (yoff > voff) { vend = yoff; }
748 if (uoff < vend) && (uoff > voff) { vend = uoff; }
750 let intraframe = (flags & FLAG_KEYFRAME) != 0;
751 let vinfo = self.info.get_properties().get_video_info().unwrap();
752 let bufret = alloc_video_buffer(vinfo, 2);
753 if let Err(_) = bufret { return Err(DecoderError::InvalidData); }
754 let mut bufinfo = bufret.unwrap();
755 let mut buf = bufinfo.get_vbuf().unwrap();
756 let ystart = data_start + (yoff as u64);
757 let ustart = data_start + (uoff as u64);
758 let vstart = data_start + (voff as u64);
759 let yendpos = data_start + (yend as u64);
760 let uendpos = data_start + (uend as u64);
761 let vendpos = data_start + (vend as u64);
763 self.decode_plane_intra(&mut br, 0, ystart, yendpos)?;
764 self.decode_plane_intra(&mut br, 1, ustart, uendpos)?;
765 self.decode_plane_intra(&mut br, 2, vstart, vendpos)?;
767 self.decode_plane_inter(&mut br, 0, ystart, yendpos)?;
768 self.decode_plane_inter(&mut br, 1, ustart, uendpos)?;
769 self.decode_plane_inter(&mut br, 2, vstart, vendpos)?;
771 self.bufs.fill_framebuf(&mut buf);
772 if (flags & FLAG_NONREF) == 0 { self.bufs.flip(); }
773 let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
774 frm.set_keyframe(intraframe);
775 frm.set_frame_type(if intraframe { FrameType::I } else { FrameType::P });
776 Ok(Rc::new(RefCell::new(frm)))
789 let avi_dmx = find_demuxer("avi").unwrap();
790 let mut file = File::open("assets/iv32_example.avi").unwrap();
791 let mut fr = FileReader::new_read(&mut file);
792 let mut br = ByteReader::new(&mut fr);
793 let mut dmx = avi_dmx.new_demuxer(&mut br);
796 let mut decs: Vec<Option<Box<NADecoder>>> = Vec::new();
797 for i in 0..dmx.get_num_streams() {
798 let s = dmx.get_stream(i).unwrap();
799 let info = s.get_info();
800 let decfunc = find_decoder(info.get_name());
801 if let Some(df) = decfunc {
802 let mut dec = (df)();
803 dec.init(info).unwrap();
804 decs.push(Some(dec));
807 panic!("decoder {} not found", info.get_name());
812 let pktres = dmx.get_frame();
813 if let Err(e) = pktres {
814 if e == DemuxerError::EOF { break; }
816 let pkt = pktres.unwrap();
817 let streamno = pkt.get_stream().get_id() as usize;
818 if let Some(ref mut dec) = decs[streamno] {
819 let frm = dec.decode(&pkt).unwrap();
820 if pkt.get_stream().get_info().is_video() {
821 write_pgmyuv("iv3", streamno, pkt.get_pts().unwrap(), frm);
823 write_sound("iv3", streamno, frm, pkt.get_pts().unwrap() == 0);
826 if pkt.get_pts().unwrap() > 10 { break; }
830 pub fn get_decoder() -> Box<NADecoder> {
831 Box::new(Indeo3Decoder::new())
834 const DT_1_1: IviDeltaCB = IviDeltaCB{ quad_radix: 7, data: &[
835 0, 0, 2, 2, -2, -2, -1, 3,
836 1, -3, 3, -1, -3, 1, 4, 4,
837 -4, -4, 1, 5, -1, -5, 5, 1,
838 -5, -1, -4, 4, 4, -4, -2, 6,
839 2, -6, 6, -2, -6, 2, 4, 9,
840 -4, -9, 9, 4, -9, -4, 9, 9,
841 -9, -9, 1, 10, -1, -10, 10, 1,
842 -10, -1, -5, 8, 5, -8, 8, -5,
843 -8, 5, 9, 15, -9, -15, 15, 9,
844 -15, -9, -3, 12, 3, -12, 12, -3,
845 -12, 3, 4, 16, -4, -16, 16, 4,
846 -16, -4, 16, 16, -16, -16, 0, 18,
847 0, -18, 18, 0, -18, 0, -12, 12,
848 12, -12, -9, 16, 9, -16, 16, -9,
849 -16, 9, 11, 27, -11, -27, 27, 11,
850 -27, -11, 19, 28, -19, -28, 28, 19,
851 -28, -19, -6, 22, 6, -22, 22, -6,
852 -22, 6, 4, 29, -4, -29, 29, 4,
853 -29, -4, 30, 30, -30, -30, -2, 33,
854 2, -33, 33, -2, -33, 2, -18, 23,
855 18, -23, 23, -18, -23, 18, -15, 30,
856 15, -30, 30, -15, -30, 15, 22, 46,
857 -22, -46, 46, 22, -46, -22, 13, 47,
858 -13, -47, 47, 13, -47, -13, 35, 49,
859 -35, -49, 49, 35, -49, -35, -11, 41,
860 11, -41, 41, -11, -41, 11, 4, 51,
861 -4, -51, 51, 4, -51, -4, 54, 54,
862 -54, -54, -34, 34, 34, -34, -29, 42,
863 29, -42, 42, -29, -42, 29, -6, 60,
864 6, -60, 60, -6, -60, 6, 27, 76,
865 -27, -76, 76, 27, -76, -27, 43, 77,
866 -43, -77, 77, 43, -77, -43, -24, 55,
867 24, -55, 55, -24, -55, 24, 14, 79,
868 -14, -79, 79, 14, -79, -14, 63, 83,
869 -63, -83, 83, 63, -83, -63, -20, 74,
870 20, -74, 74, -20, -74, 20, 2, 88,
871 -2, -88, 88, 2, -88, -2, 93, 93,
872 -93, -93, -52, 61, 52, -61, 61, -52,
873 -61, 52, 52, 120, -52, -120, 120, 52,
874 -120, -52, -45, 75, 45, -75, 75, -45,
875 -75, 45, 75, 125, -75, -125, 125, 75,
876 -125, -75, 33, 122, -33, -122, 122, 33,
877 -122, -33, -13, 103, 13, -103, 103, -13,
878 -103, 13, -40, 96, 40, -96, 96, -40,
879 -96, 40, -34, 127, 34, -127, 127, -34,
880 -127, 34, -89, 89, 89, -89, -78, 105,
881 78, -105, 105, -78, -105, 78, 12, 12,
882 -12, -12, 23, 23, -23, -23, 42, 42,
883 -42, -42, 73, 73, -73, -73,
886 const DT_1_2: IviDeltaCB = IviDeltaCB{ quad_radix: 9, data: &[
887 0, 0, 3, 3, -3, -3, -1, 4,
888 1, -4, 4, -1, -4, 1, 7, 7,
889 -7, -7, 2, 8, -2, -8, 8, 2,
890 -8, -2, -2, 9, 2, -9, 9, -2,
891 -9, 2, -6, 6, 6, -6, 6, 13,
892 -6, -13, 13, 6, -13, -6, 13, 13,
893 -13, -13, 1, 14, -1, -14, 14, 1,
894 -14, -1, -8, 12, 8, -12, 12, -8,
895 -12, 8, 14, 23, -14, -23, 23, 14,
896 -23, -14, -5, 18, 5, -18, 18, -5,
897 -18, 5, 6, 24, -6, -24, 24, 6,
898 -24, -6, 24, 24, -24, -24, -1, 27,
899 1, -27, 27, -1, -27, 1, -17, 17,
900 17, -17, -13, 23, 13, -23, 23, -13,
901 -23, 13, 16, 40, -16, -40, 40, 16,
902 -40, -16, 28, 41, -28, -41, 41, 28,
903 -41, -28, -9, 33, 9, -33, 33, -9,
904 -33, 9, 6, 43, -6, -43, 43, 6,
905 -43, -6, 46, 46, -46, -46, -4, 50,
906 4, -50, 50, -4, -50, 4, -27, 34,
907 27, -34, 34, -27, -34, 27, -22, 45,
908 22, -45, 45, -22, -45, 22, 34, 69,
909 -34, -69, 69, 34, -69, -34, 19, 70,
910 -19, -70, 70, 19, -70, -19, 53, 73,
911 -53, -73, 73, 53, -73, -53, -17, 62,
912 17, -62, 62, -17, -62, 17, 5, 77,
913 -5, -77, 77, 5, -77, -5, 82, 82,
914 -82, -82, -51, 51, 51, -51, -43, 64,
915 43, -64, 64, -43, -64, 43, -10, 90,
916 10, -90, 90, -10, -90, 10, 41, 114,
917 -41, -114, 114, 41, -114, -41, 64, 116,
918 -64, -116, 116, 64, -116, -64, -37, 82,
919 37, -82, 82, -37, -82, 37, 22, 119,
920 -22, -119, 119, 22, -119, -22, 95, 124,
921 -95, -124, 124, 95, -124, -95, -30, 111,
922 30, -111, 111, -30, -111, 30, -78, 92,
923 78, -92, 92, -78, -92, 78, -68, 113,
924 68, -113, 113, -68, -113, 68, 18, 18,
925 -18, -18, 34, 34, -34, -34, 63, 63,
926 -63, -63, 109, 109, -109, -109,
929 const DT_1_3: IviDeltaCB = IviDeltaCB{ quad_radix: 10, data: &[
930 0, 0, 4, 4, -4, -4, -1, 5,
931 1, -5, 5, -1, -5, 1, 3, 10,
932 -3, -10, 10, 3, -10, -3, 9, 9,
933 -9, -9, -7, 7, 7, -7, -3, 12,
934 3, -12, 12, -3, -12, 3, 8, 17,
935 -8, -17, 17, 8, -17, -8, 17, 17,
936 -17, -17, 1, 19, -1, -19, 19, 1,
937 -19, -1, -11, 16, 11, -16, 16, -11,
938 -16, 11, -6, 23, 6, -23, 23, -6,
939 -23, 6, 18, 31, -18, -31, 31, 18,
940 -31, -18, 8, 32, -8, -32, 32, 8,
941 -32, -8, 33, 33, -33, -33, -1, 36,
942 1, -36, 36, -1, -36, 1, -23, 23,
943 23, -23, -17, 31, 17, -31, 31, -17,
944 -31, 17, 21, 54, -21, -54, 54, 21,
945 -54, -21, 37, 55, -37, -55, 55, 37,
946 -55, -37, -12, 44, 12, -44, 44, -12,
947 -44, 12, 8, 57, -8, -57, 57, 8,
948 -57, -8, 61, 61, -61, -61, -5, 66,
949 5, -66, 66, -5, -66, 5, -36, 45,
950 36, -45, 45, -36, -45, 36, -29, 60,
951 29, -60, 60, -29, -60, 29, 45, 92,
952 -45, -92, 92, 45, -92, -45, 25, 93,
953 -25, -93, 93, 25, -93, -25, 71, 97,
954 -71, -97, 97, 71, -97, -71, -22, 83,
955 22, -83, 83, -22, -83, 22, 7, 102,
956 -7, -102, 102, 7, -102, -7, 109, 109,
957 -109, -109, -68, 68, 68, -68, -57, 85,
958 57, -85, 85, -57, -85, 57, -13, 120,
959 13, -120, 120, -13, -120, 13, -49, 110,
960 49, -110, 110, -49, -110, 49, -104, 123,
961 104, -123, 123, -104, -123, 104, 24, 24,
962 -24, -24, 46, 46, -46, -46, 84, 84,
966 const DT_1_4: IviDeltaCB = IviDeltaCB{ quad_radix: 11, data: &[
967 0, 0, 5, 5, -5, -5, -2, 7,
968 2, -7, 7, -2, -7, 2, 11, 11,
969 -11, -11, 3, 13, -3, -13, 13, 3,
970 -13, -3, -9, 9, 9, -9, -4, 15,
971 4, -15, 15, -4, -15, 4, 11, 22,
972 -11, -22, 22, 11, -22, -11, 21, 21,
973 -21, -21, 2, 24, -2, -24, 24, 2,
974 -24, -2, -14, 20, 14, -20, 20, -14,
975 -20, 14, 23, 38, -23, -38, 38, 23,
976 -38, -23, -8, 29, 8, -29, 29, -8,
977 -29, 8, 11, 39, -11, -39, 39, 11,
978 -39, -11, 41, 41, -41, -41, -1, 45,
979 1, -45, 45, -1, -45, 1, -29, 29,
980 29, -29, -22, 39, 22, -39, 39, -22,
981 -39, 22, 27, 67, -27, -67, 67, 27,
982 -67, -27, 47, 69, -47, -69, 69, 47,
983 -69, -47, -15, 56, 15, -56, 56, -15,
984 -56, 15, 11, 71, -11, -71, 71, 11,
985 -71, -11, 76, 76, -76, -76, -6, 83,
986 6, -83, 83, -6, -83, 6, -45, 57,
987 45, -57, 57, -45, -57, 45, -36, 75,
988 36, -75, 75, -36, -75, 36, 56, 115,
989 -56, -115, 115, 56, -115, -56, 31, 117,
990 -31, -117, 117, 31, -117, -31, 88, 122,
991 -88, -122, 122, 88, -122, -88, -28, 104,
992 28, -104, 104, -28, -104, 28, -85, 85,
993 85, -85, -72, 106, 72, -106, 106, -72,
994 -106, 72, 30, 30, -30, -30, 58, 58,
995 -58, -58, 105, 105, -105, -105,
998 const DT_1_5: IviDeltaCB = IviDeltaCB{ quad_radix: 12, data: &[
999 0, 0, 6, 6, -6, -6, -2, 8,
1000 2, -8, 8, -2, -8, 2, 13, 13,
1001 -13, -13, 4, 15, -4, -15, 15, 4,
1002 -15, -4, -11, 11, 11, -11, -5, 18,
1003 5, -18, 18, -5, -18, 5, 13, 26,
1004 -13, -26, 26, 13, -26, -13, 26, 26,
1005 -26, -26, 2, 29, -2, -29, 29, 2,
1006 -29, -2, -16, 24, 16, -24, 24, -16,
1007 -24, 16, 28, 46, -28, -46, 46, 28,
1008 -46, -28, -9, 35, 9, -35, 35, -9,
1009 -35, 9, 13, 47, -13, -47, 47, 13,
1010 -47, -13, 49, 49, -49, -49, -1, 54,
1011 1, -54, 54, -1, -54, 1, -35, 35,
1012 35, -35, -26, 47, 26, -47, 47, -26,
1013 -47, 26, 32, 81, -32, -81, 81, 32,
1014 -81, -32, 56, 83, -56, -83, 83, 56,
1015 -83, -56, -18, 67, 18, -67, 67, -18,
1016 -67, 18, 13, 86, -13, -86, 86, 13,
1017 -86, -13, 91, 91, -91, -91, -7, 99,
1018 7, -99, 99, -7, -99, 7, -54, 68,
1019 54, -68, 68, -54, -68, 54, -44, 90,
1020 44, -90, 90, -44, -90, 44, -33, 124,
1021 33, -124, 124, -33, -124, 33, -103, 103,
1022 103, -103, -86, 127, 86, -127, 127, -86,
1023 -127, 86, 37, 37, -37, -37, 69, 69,
1027 const DT_1_6: IviDeltaCB = IviDeltaCB{ quad_radix: 12, data: &[
1028 0, 0, 7, 7, -7, -7, -3, 10,
1029 3, -10, 10, -3, -10, 3, 16, 16,
1030 -16, -16, 5, 18, -5, -18, 18, 5,
1031 -18, -5, -13, 13, 13, -13, -6, 21,
1032 6, -21, 21, -6, -21, 6, 15, 30,
1033 -15, -30, 30, 15, -30, -15, 30, 30,
1034 -30, -30, 2, 34, -2, -34, 34, 2,
1035 -34, -2, -19, 28, 19, -28, 28, -19,
1036 -28, 19, 32, 54, -32, -54, 54, 32,
1037 -54, -32, -11, 41, 11, -41, 41, -11,
1038 -41, 11, 15, 55, -15, -55, 55, 15,
1039 -55, -15, 57, 57, -57, -57, -1, 63,
1040 1, -63, 63, -1, -63, 1, -40, 40,
1041 40, -40, -30, 55, 30, -55, 55, -30,
1042 -55, 30, 37, 94, -37, -94, 94, 37,
1043 -94, -37, 65, 96, -65, -96, 96, 65,
1044 -96, -65, -21, 78, 21, -78, 78, -21,
1045 -78, 21, 15, 100, -15, -100, 100, 15,
1046 -100, -15, 106, 106, -106, -106, -8, 116,
1047 8, -116, 116, -8, -116, 8, -63, 79,
1048 63, -79, 79, -63, -79, 63, -51, 105,
1049 51, -105, 105, -51, -105, 51, -120, 120,
1050 120, -120, 43, 43, -43, -43, 80, 80,
1054 const DT_1_7: IviDeltaCB = IviDeltaCB{ quad_radix: 12, data: &[
1055 0, 0, 8, 8, -8, -8, -3, 11,
1056 3, -11, 11, -3, -11, 3, 18, 18,
1057 -18, -18, 5, 20, -5, -20, 20, 5,
1058 -20, -5, -15, 15, 15, -15, -7, 24,
1059 7, -24, 24, -7, -24, 7, 17, 35,
1060 -17, -35, 35, 17, -35, -17, 34, 34,
1061 -34, -34, 3, 38, -3, -38, 38, 3,
1062 -38, -3, -22, 32, 22, -32, 32, -22,
1063 -32, 22, 37, 61, -37, -61, 61, 37,
1064 -61, -37, -13, 47, 13, -47, 47, -13,
1065 -47, 13, 17, 63, -17, -63, 63, 17,
1066 -63, -17, 65, 65, -65, -65, -1, 72,
1067 1, -72, 72, -1, -72, 1, -46, 46,
1068 46, -46, -35, 63, 35, -63, 63, -35,
1069 -63, 35, 43, 107, -43, -107, 107, 43,
1070 -107, -43, 75, 110, -75, -110, 110, 75,
1071 -110, -75, -24, 89, 24, -89, 89, -24,
1072 -89, 24, 17, 114, -17, -114, 114, 17,
1073 -114, -17, 121, 121, -121, -121, -72, 91,
1074 72, -91, 91, -72, -91, 72, -58, 120,
1075 58, -120, 120, -58, -120, 58, 49, 49,
1076 -49, -49, 92, 92, -92, -92,
1079 const DT_1_8: IviDeltaCB = IviDeltaCB{ quad_radix: 13, data: &[
1080 0, 0, 9, 9, -9, -9, -3, 12,
1081 3, -12, 12, -3, -12, 3, 20, 20,
1082 -20, -20, 6, 23, -6, -23, 23, 6,
1083 -23, -6, -17, 17, 17, -17, -7, 27,
1084 7, -27, 27, -7, -27, 7, 19, 39,
1085 -19, -39, 39, 19, -39, -19, 39, 39,
1086 -39, -39, 3, 43, -3, -43, 43, 3,
1087 -43, -3, -24, 36, 24, -36, 36, -24,
1088 -36, 24, 42, 69, -42, -69, 69, 42,
1089 -69, -42, -14, 53, 14, -53, 53, -14,
1090 -53, 14, 19, 71, -19, -71, 71, 19,
1091 -71, -19, 73, 73, -73, -73, -2, 80,
1092 2, -80, 80, -2, -80, 2, -52, 52,
1093 52, -52, -39, 70, 39, -70, 70, -39,
1094 -70, 39, 48, 121, -48, -121, 121, 48,
1095 -121, -48, 84, 124, -84, -124, 124, 84,
1096 -124, -84, -27, 100, 27, -100, 100, -27,
1097 -100, 27, -81, 102, 81, -102, 102, -81,
1098 -102, 81, 55, 55, -55, -55, 104, 104,
1102 const DT_2_1: IviDeltaCB = IviDeltaCB{ quad_radix: 7, data: &[
1103 0, 0, 2, 2, -2, -2, 0, 2,
1104 0, -2, 2, 0, -2, 0, 4, 4,
1105 -4, -4, 0, 4, 0, -4, 4, 0,
1106 -4, 0, -4, 4, 4, -4, -2, 6,
1107 2, -6, 6, -2, -6, 2, 4, 8,
1108 -4, -8, 8, 4, -8, -4, 8, 8,
1109 -8, -8, 0, 10, 0, -10, 10, 0,
1110 -10, 0, -4, 8, 4, -8, 8, -4,
1111 -8, 4, 8, 14, -8, -14, 14, 8,
1112 -14, -8, -2, 12, 2, -12, 12, -2,
1113 -12, 2, 4, 16, -4, -16, 16, 4,
1114 -16, -4, 16, 16, -16, -16, 0, 18,
1115 0, -18, 18, 0, -18, 0, -12, 12,
1116 12, -12, -8, 16, 8, -16, 16, -8,
1117 -16, 8, 10, 26, -10, -26, 26, 10,
1118 -26, -10, 18, 28, -18, -28, 28, 18,
1119 -28, -18, -6, 22, 6, -22, 22, -6,
1120 -22, 6, 4, 28, -4, -28, 28, 4,
1121 -28, -4, 30, 30, -30, -30, -2, 32,
1122 2, -32, 32, -2, -32, 2, -18, 22,
1123 18, -22, 22, -18, -22, 18, -14, 30,
1124 14, -30, 30, -14, -30, 14, 22, 46,
1125 -22, -46, 46, 22, -46, -22, 12, 46,
1126 -12, -46, 46, 12, -46, -12, 34, 48,
1127 -34, -48, 48, 34, -48, -34, -10, 40,
1128 10, -40, 40, -10, -40, 10, 4, 50,
1129 -4, -50, 50, 4, -50, -4, 54, 54,
1130 -54, -54, -34, 34, 34, -34, -28, 42,
1131 28, -42, 42, -28, -42, 28, -6, 60,
1132 6, -60, 60, -6, -60, 6, 26, 76,
1133 -26, -76, 76, 26, -76, -26, 42, 76,
1134 -42, -76, 76, 42, -76, -42, -24, 54,
1135 24, -54, 54, -24, -54, 24, 14, 78,
1136 -14, -78, 78, 14, -78, -14, 62, 82,
1137 -62, -82, 82, 62, -82, -62, -20, 74,
1138 20, -74, 74, -20, -74, 20, 2, 88,
1139 -2, -88, 88, 2, -88, -2, 92, 92,
1140 -92, -92, -52, 60, 52, -60, 60, -52,
1141 -60, 52, 52, 118, -52, -118, 118, 52,
1142 -118, -52, -44, 74, 44, -74, 74, -44,
1143 -74, 44, 74, 118, -74, -118, 118, 74,
1144 -118, -74, 32, 118, -32, -118, 118, 32,
1145 -118, -32, -12, 102, 12, -102, 102, -12,
1146 -102, 12, -40, 96, 40, -96, 96, -40,
1147 -96, 40, -34, 118, 34, -118, 118, -34,
1148 -118, 34, -88, 88, 88, -88, -78, 104,
1149 78, -104, 104, -78, -104, 78, 12, 12,
1150 -12, -12, 22, 22, -22, -22, 42, 42,
1151 -42, -42, 72, 72, -72, -72,
1154 const DT_2_2: IviDeltaCB = IviDeltaCB{ quad_radix: 9, data: &[
1155 0, 0, 3, 3, -3, -3, 0, 3,
1156 0, -3, 3, 0, -3, 0, 6, 6,
1157 -6, -6, 3, 9, -3, -9, 9, 3,
1158 -9, -3, -3, 9, 3, -9, 9, -3,
1159 -9, 3, -6, 6, 6, -6, 6, 12,
1160 -6, -12, 12, 6, -12, -6, 12, 12,
1161 -12, -12, 0, 15, 0, -15, 15, 0,
1162 -15, 0, -9, 12, 9, -12, 12, -9,
1163 -12, 9, 15, 24, -15, -24, 24, 15,
1164 -24, -15, -6, 18, 6, -18, 18, -6,
1165 -18, 6, 6, 24, -6, -24, 24, 6,
1166 -24, -6, 24, 24, -24, -24, 0, 27,
1167 0, -27, 27, 0, -27, 0, -18, 18,
1168 18, -18, -12, 24, 12, -24, 24, -12,
1169 -24, 12, 15, 39, -15, -39, 39, 15,
1170 -39, -15, 27, 42, -27, -42, 42, 27,
1171 -42, -27, -9, 33, 9, -33, 33, -9,
1172 -33, 9, 6, 42, -6, -42, 42, 6,
1173 -42, -6, 45, 45, -45, -45, -3, 51,
1174 3, -51, 51, -3, -51, 3, -27, 33,
1175 27, -33, 33, -27, -33, 27, -21, 45,
1176 21, -45, 45, -21, -45, 21, 33, 69,
1177 -33, -69, 69, 33, -69, -33, 18, 69,
1178 -18, -69, 69, 18, -69, -18, 54, 72,
1179 -54, -72, 72, 54, -72, -54, -18, 63,
1180 18, -63, 63, -18, -63, 18, 6, 78,
1181 -6, -78, 78, 6, -78, -6, 81, 81,
1182 -81, -81, -51, 51, 51, -51, -42, 63,
1183 42, -63, 63, -42, -63, 42, -9, 90,
1184 9, -90, 90, -9, -90, 9, 42, 114,
1185 -42, -114, 114, 42, -114, -42, 63, 117,
1186 -63, -117, 117, 63, -117, -63, -36, 81,
1187 36, -81, 81, -36, -81, 36, 21, 120,
1188 -21, -120, 120, 21, -120, -21, 96, 123,
1189 -96, -123, 123, 96, -123, -96, -30, 111,
1190 30, -111, 111, -30, -111, 30, -78, 93,
1191 78, -93, 93, -78, -93, 78, -69, 114,
1192 69, -114, 114, -69, -114, 69, 18, 18,
1193 -18, -18, 33, 33, -33, -33, 63, 63,
1194 -63, -63, 108, 108, -108, -108,
1197 const DT_2_3: IviDeltaCB = IviDeltaCB{ quad_radix: 10, data: &[
1198 0, 0, 4, 4, -4, -4, 0, 4,
1199 0, -4, 4, 0, -4, 0, 4, 8,
1200 -4, -8, 8, 4, -8, -4, 8, 8,
1201 -8, -8, -8, 8, 8, -8, -4, 12,
1202 4, -12, 12, -4, -12, 4, 8, 16,
1203 -8, -16, 16, 8, -16, -8, 16, 16,
1204 -16, -16, 0, 20, 0, -20, 20, 0,
1205 -20, 0, -12, 16, 12, -16, 16, -12,
1206 -16, 12, -4, 24, 4, -24, 24, -4,
1207 -24, 4, 16, 32, -16, -32, 32, 16,
1208 -32, -16, 8, 32, -8, -32, 32, 8,
1209 -32, -8, 32, 32, -32, -32, 0, 36,
1210 0, -36, 36, 0, -36, 0, -24, 24,
1211 24, -24, -16, 32, 16, -32, 32, -16,
1212 -32, 16, 20, 52, -20, -52, 52, 20,
1213 -52, -20, 36, 56, -36, -56, 56, 36,
1214 -56, -36, -12, 44, 12, -44, 44, -12,
1215 -44, 12, 8, 56, -8, -56, 56, 8,
1216 -56, -8, 60, 60, -60, -60, -4, 64,
1217 4, -64, 64, -4, -64, 4, -36, 44,
1218 36, -44, 44, -36, -44, 36, -28, 60,
1219 28, -60, 60, -28, -60, 28, 44, 92,
1220 -44, -92, 92, 44, -92, -44, 24, 92,
1221 -24, -92, 92, 24, -92, -24, 72, 96,
1222 -72, -96, 96, 72, -96, -72, -20, 84,
1223 20, -84, 84, -20, -84, 20, 8, 100,
1224 -8, -100, 100, 8, -100, -8, 108, 108,
1225 -108, -108, -68, 68, 68, -68, -56, 84,
1226 56, -84, 84, -56, -84, 56, -12, 120,
1227 12, -120, 120, -12, -120, 12, -48, 108,
1228 48, -108, 108, -48, -108, 48, -104, 124,
1229 104, -124, 124, -104, -124, 104, 24, 24,
1230 -24, -24, 44, 44, -44, -44, 84, 84,
1234 const DT_2_4: IviDeltaCB = IviDeltaCB{ quad_radix: 11, data: &[
1235 0, 0, 5, 5, -5, -5, 0, 5,
1236 0, -5, 5, 0, -5, 0, 10, 10,
1237 -10, -10, 5, 15, -5, -15, 15, 5,
1238 -15, -5, -10, 10, 10, -10, -5, 15,
1239 5, -15, 15, -5, -15, 5, 10, 20,
1240 -10, -20, 20, 10, -20, -10, 20, 20,
1241 -20, -20, 0, 25, 0, -25, 25, 0,
1242 -25, 0, -15, 20, 15, -20, 20, -15,
1243 -20, 15, 25, 40, -25, -40, 40, 25,
1244 -40, -25, -10, 30, 10, -30, 30, -10,
1245 -30, 10, 10, 40, -10, -40, 40, 10,
1246 -40, -10, 40, 40, -40, -40, 0, 45,
1247 0, -45, 45, 0, -45, 0, -30, 30,
1248 30, -30, -20, 40, 20, -40, 40, -20,
1249 -40, 20, 25, 65, -25, -65, 65, 25,
1250 -65, -25, 45, 70, -45, -70, 70, 45,
1251 -70, -45, -15, 55, 15, -55, 55, -15,
1252 -55, 15, 10, 70, -10, -70, 70, 10,
1253 -70, -10, 75, 75, -75, -75, -5, 85,
1254 5, -85, 85, -5, -85, 5, -45, 55,
1255 45, -55, 55, -45, -55, 45, -35, 75,
1256 35, -75, 75, -35, -75, 35, 55, 115,
1257 -55, -115, 115, 55, -115, -55, 30, 115,
1258 -30, -115, 115, 30, -115, -30, 90, 120,
1259 -90, -120, 120, 90, -120, -90, -30, 105,
1260 30, -105, 105, -30, -105, 30, -85, 85,
1261 85, -85, -70, 105, 70, -105, 105, -70,
1262 -105, 70, 30, 30, -30, -30, 60, 60,
1263 -60, -60, 105, 105, -105, -105,
1266 const DT_2_5: IviDeltaCB = IviDeltaCB{ quad_radix: 12, data: &[
1267 0, 0, 6, 6, -6, -6, 0, 6,
1268 0, -6, 6, 0, -6, 0, 12, 12,
1269 -12, -12, 6, 12, -6, -12, 12, 6,
1270 -12, -6, -12, 12, 12, -12, -6, 18,
1271 6, -18, 18, -6, -18, 6, 12, 24,
1272 -12, -24, 24, 12, -24, -12, 24, 24,
1273 -24, -24, 0, 30, 0, -30, 30, 0,
1274 -30, 0, -18, 24, 18, -24, 24, -18,
1275 -24, 18, 30, 48, -30, -48, 48, 30,
1276 -48, -30, -6, 36, 6, -36, 36, -6,
1277 -36, 6, 12, 48, -12, -48, 48, 12,
1278 -48, -12, 48, 48, -48, -48, 0, 54,
1279 0, -54, 54, 0, -54, 0, -36, 36,
1280 36, -36, -24, 48, 24, -48, 48, -24,
1281 -48, 24, 30, 78, -30, -78, 78, 30,
1282 -78, -30, 54, 84, -54, -84, 84, 54,
1283 -84, -54, -18, 66, 18, -66, 66, -18,
1284 -66, 18, 12, 84, -12, -84, 84, 12,
1285 -84, -12, 90, 90, -90, -90, -6, 96,
1286 6, -96, 96, -6, -96, 6, -54, 66,
1287 54, -66, 66, -54, -66, 54, -42, 90,
1288 42, -90, 90, -42, -90, 42, -30, 126,
1289 30, -126, 126, -30, -126, 30, -102, 102,
1290 102, -102, -84, 126, 84, -126, 126, -84,
1291 -126, 84, 36, 36, -36, -36, 66, 66,
1295 const DT_2_6: IviDeltaCB = IviDeltaCB{ quad_radix: 12, data: &[
1296 0, 0, 7, 7, -7, -7, 0, 7,
1297 0, -7, 7, 0, -7, 0, 14, 14,
1298 -14, -14, 7, 21, -7, -21, 21, 7,
1299 -21, -7, -14, 14, 14, -14, -7, 21,
1300 7, -21, 21, -7, -21, 7, 14, 28,
1301 -14, -28, 28, 14, -28, -14, 28, 28,
1302 -28, -28, 0, 35, 0, -35, 35, 0,
1303 -35, 0, -21, 28, 21, -28, 28, -21,
1304 -28, 21, 35, 56, -35, -56, 56, 35,
1305 -56, -35, -14, 42, 14, -42, 42, -14,
1306 -42, 14, 14, 56, -14, -56, 56, 14,
1307 -56, -14, 56, 56, -56, -56, 0, 63,
1308 0, -63, 63, 0, -63, 0, -42, 42,
1309 42, -42, -28, 56, 28, -56, 56, -28,
1310 -56, 28, 35, 91, -35, -91, 91, 35,
1311 -91, -35, 63, 98, -63, -98, 98, 63,
1312 -98, -63, -21, 77, 21, -77, 77, -21,
1313 -77, 21, 14, 98, -14, -98, 98, 14,
1314 -98, -14, 105, 105, -105, -105, -7, 119,
1315 7, -119, 119, -7, -119, 7, -63, 77,
1316 63, -77, 77, -63, -77, 63, -49, 105,
1317 49, -105, 105, -49, -105, 49, -119, 119,
1318 119, -119, 42, 42, -42, -42, 77, 77,
1322 const DT_2_7: IviDeltaCB = IviDeltaCB{ quad_radix: 12, data: &[
1323 0, 0, 8, 8, -8, -8, 0, 8,
1324 0, -8, 8, 0, -8, 0, 16, 16,
1325 -16, -16, 8, 16, -8, -16, 16, 8,
1326 -16, -8, -16, 16, 16, -16, -8, 24,
1327 8, -24, 24, -8, -24, 8, 16, 32,
1328 -16, -32, 32, 16, -32, -16, 32, 32,
1329 -32, -32, 0, 40, 0, -40, 40, 0,
1330 -40, 0, -24, 32, 24, -32, 32, -24,
1331 -32, 24, 40, 64, -40, -64, 64, 40,
1332 -64, -40, -16, 48, 16, -48, 48, -16,
1333 -48, 16, 16, 64, -16, -64, 64, 16,
1334 -64, -16, 64, 64, -64, -64, 0, 72,
1335 0, -72, 72, 0, -72, 0, -48, 48,
1336 48, -48, -32, 64, 32, -64, 64, -32,
1337 -64, 32, 40, 104, -40, -104, 104, 40,
1338 -104, -40, 72, 112, -72, -112, 112, 72,
1339 -112, -72, -24, 88, 24, -88, 88, -24,
1340 -88, 24, 16, 112, -16, -112, 112, 16,
1341 -112, -16, 120, 120, -120, -120, -72, 88,
1342 72, -88, 88, -72, -88, 72, -56, 120,
1343 56, -120, 120, -56, -120, 56, 48, 48,
1344 -48, -48, 88, 88, -88, -88,
1347 const DT_2_8: IviDeltaCB = IviDeltaCB{ quad_radix: 13, data: &[
1348 0, 0, 9, 9, -9, -9, 0, 9,
1349 0, -9, 9, 0, -9, 0, 18, 18,
1350 -18, -18, 9, 27, -9, -27, 27, 9,
1351 -27, -9, -18, 18, 18, -18, -9, 27,
1352 9, -27, 27, -9, -27, 9, 18, 36,
1353 -18, -36, 36, 18, -36, -18, 36, 36,
1354 -36, -36, 0, 45, 0, -45, 45, 0,
1355 -45, 0, -27, 36, 27, -36, 36, -27,
1356 -36, 27, 45, 72, -45, -72, 72, 45,
1357 -72, -45, -18, 54, 18, -54, 54, -18,
1358 -54, 18, 18, 72, -18, -72, 72, 18,
1359 -72, -18, 72, 72, -72, -72, 0, 81,
1360 0, -81, 81, 0, -81, 0, -54, 54,
1361 54, -54, -36, 72, 36, -72, 72, -36,
1362 -72, 36, 45, 117, -45, -117, 117, 45,
1363 -117, -45, 81, 126, -81, -126, 126, 81,
1364 -126, -81, -27, 99, 27, -99, 99, -27,
1365 -99, 27, -81, 99, 81, -99, 99, -81,
1366 -99, 81, 54, 54, -54, -54, 108, 108,
1370 const DT_3_1: IviDeltaCB = IviDeltaCB{ quad_radix: 11, data: &[
1371 0, 0, 2, 2, -2, -2, 0, 3,
1372 0, -3, 3, 0, -3, 0, 6, 6,
1373 -6, -6, 0, 7, 0, -7, 7, 0,
1374 -7, 0, -5, 5, 5, -5, 5, -5,
1375 -5, 5, 6, 11, -6, -11, 11, 6,
1376 -11, -6, 0, 8, 0, -8, 8, 0,
1377 -8, 0, 11, 11, -11, -11, 0, 12,
1378 0, -12, 12, 0, -12, 0, 12, 17,
1379 -12, -17, 17, 12, -17, -12, 17, 17,
1380 -17, -17, 6, 18, -6, -18, 18, 6,
1381 -18, -6, -8, 11, 8, -11, 11, -8,
1382 -11, 8, 0, 15, 0, -15, 15, 0,
1383 -15, 0, 0, 20, 0, -20, 20, 0,
1384 -20, 0, 18, 25, -18, -25, 25, 18,
1385 -25, -18, 11, 25, -11, -25, 25, 11,
1386 -25, -11, 25, 25, -25, -25, -14, 14,
1387 14, -14, 14, -14, -14, 14, 0, 26,
1388 0, -26, 26, 0, -26, 0, -11, 18,
1389 11, -18, 18, -11, -18, 11, -7, 22,
1390 7, -22, 22, -7, -22, 7, 26, 34,
1391 -26, -34, 34, 26, -34, -26, 18, 34,
1392 -18, -34, 34, 18, -34, -18, 34, 34,
1393 -34, -34, 11, 35, -11, -35, 35, 11,
1394 -35, -11, 0, 29, 0, -29, 29, 0,
1395 -29, 0, -19, 22, 19, -22, 22, -19,
1396 -22, 19, -15, 26, 15, -26, 26, -15,
1397 -26, 15, 0, 37, 0, -37, 37, 0,
1398 -37, 0, 27, 44, -27, -44, 44, 27,
1399 -44, -27, 36, 44, -36, -44, 44, 36,
1400 -44, -36, 18, 44, -18, -44, 44, 18,
1401 -44, -18, -10, 33, 10, -33, 33, -10,
1402 -33, 10, 45, 45, -45, -45, 0, 0,
1405 const DT_3_2: IviDeltaCB = IviDeltaCB{ quad_radix: 13, data: &[
1406 0, 0, 0, 2, 0, -2, 2, 0,
1407 -2, 0, 2, 2, -2, -2, 6, 6,
1408 -6, -6, 0, 6, 0, -6, 6, 0,
1409 -6, 0, -4, 4, 4, -4, 10, -6,
1410 -10, 6, 0, -12, 0, 12, -6, -12,
1411 6, -12, -6, 12, 6, 12, -14, 0,
1412 14, 0, 12, 12, -12, -12, 0, -18,
1413 0, 18, 14, -12, -14, 12, -18, -6,
1414 18, -6, -18, 6, 18, 6, -10, -18,
1415 10, -18, -10, 18, 10, 18, -22, 0,
1416 22, 0, 0, -24, 0, 24, -22, -12,
1417 22, -12, -22, 12, 22, 12, -8, -24,
1418 8, -24, -8, 24, 8, 24, -26, -6,
1419 26, -6, -26, 6, 26, 6, -28, 0,
1420 28, 0, 20, 20, -20, -20, -14, -26,
1421 14, 26, -30, -12, 30, 12, -10, -32,
1422 10, 32, -18, -32, 18, 32, -26, -26,
1423 26, 26, -34, -20, 34, 20, -38, -12,
1424 38, 12, -32, -32, 32, 32, 32, 32,
1425 -22, -40, -34, -34, 34, 34,
1428 const DT_3_3: IviDeltaCB = IviDeltaCB{ quad_radix: 13, data: &[
1429 0, 0, 0, 2, 0, -2, 2, 0,
1430 -2, 0, 4, 4, -4, -4, 10, 10,
1431 -10, -10, 0, 10, 0, -10, 10, 0,
1432 -10, 0, -6, 6, 6, -6, 14, -8,
1433 -14, 8, -18, 0, 18, 0, 10, -16,
1434 -10, 16, 0, -24, 0, 24, -24, -8,
1435 24, -8, -24, 8, 24, 8, 18, 18,
1436 -18, -18, 20, -16, -20, 16, -14, -26,
1437 14, -26, -14, 26, 14, 26, -30, 0,
1438 30, 0, 0, -34, 0, 34, -34, -8,
1439 34, -8, -34, 8, 34, 8, -30, -18,
1440 30, -18, -30, 18, 30, 18, -10, -34,
1441 10, -34, -10, 34, 10, 34, -20, -34,
1442 20, 34, -40, 0, 40, 0, 30, 30,
1443 -30, -30, -40, -18, 40, 18, 0, -44,
1444 0, 44, -16, -44, 16, 44, -36, -36,
1445 -36, -36, 36, 36, -26, -44, 26, 44,
1446 -46, -26, 46, 26, -52, -18, 52, 18,
1447 -20, -54, -44, -44, 44, 44, -32, -54,
1448 -46, -46, -46, -46, 46, 46,
1451 const DT_3_4: IviDeltaCB = IviDeltaCB{ quad_radix: 13, data: &[
1452 0, 0, 0, 4, 0, -4, 4, 0,
1453 -4, 0, 4, 4, -4, -4, 12, 12,
1454 -12, -12, 0, 12, 0, -12, 12, 0,
1455 -12, 0, -8, 8, 8, -8, 8, -16,
1456 -8, 16, 0, -24, 0, 24, -24, -8,
1457 24, -8, -24, 8, 24, 8, 20, -16,
1458 -20, 16, -28, 0, 28, 0, -16, -24,
1459 16, -24, -16, 24, 16, 24, 0, -32,
1460 0, 32, -28, -16, 28, -16, -28, 16,
1461 28, 16, -8, -32, 8, -32, -32, -8,
1462 32, -8, -32, 8, 32, 8, -8, 32,
1463 8, 32, 24, 24, -24, -24, 24, -24,
1464 -24, 24, -20, -32, 20, 32, -40, 0,
1465 40, 0, -40, -16, 40, 16, 0, -44,
1466 0, -44, -44, 0, 44, 0, 0, 44,
1467 0, 44, -32, -32, 32, 32, -16, -44,
1468 16, 44, -24, -44, -44, -24, 44, 24,
1469 24, 44, -48, -16, 48, 16, -36, -36,
1470 -36, -36, 36, 36, 36, 36, -20, -52,
1471 40, 40, -40, -40, -32, -52,
1474 const DT_3_5: IviDeltaCB = IviDeltaCB{ quad_radix: 13, data: &[
1475 0, 0, 2, 2, -2, -2, 6, 6,
1476 -6, -6, 12, 12, -12, -12, 20, 20,
1477 -20, -20, 32, 32, -32, -32, 46, 46,
1478 -46, -46, 0, 0, 0, 0, 0, 0,
1479 0, 0, 0, 0, 0, 0, 0, 0,
1480 0, 0, 0, 0, 0, 0, 0, 0,
1481 0, 0, 0, 0, 0, 0, 0, 0,
1482 0, 0, 0, 0, 0, 0, 0, 0,
1483 0, 0, 0, 0, 0, 0, 0, 0,
1484 0, 0, 0, 0, 0, 0, 0, 0,
1485 0, 0, 0, 0, 0, 0, 0, 0,
1486 0, 0, 0, 0, 0, 0, 0, 0,
1487 0, 0, 0, 0, 0, 0, 0, 0,
1488 0, 0, 0, 0, 0, 0, 0, 0,
1489 0, 0, 0, 0, 0, 0, 0, 0,
1490 0, 0, 0, 0, 0, 0, 0, 0,
1491 0, 0, 0, 0, 0, 0, 0, 0,
1492 0, 0, 0, 0, 0, 0, 0, 0,
1493 0, 0, 0, 0, 0, 0, 0, 0,
1497 const IVI3_DELTA_CBS: [&IviDeltaCB; 24] = [
1498 &DT_1_1, &DT_1_2, &DT_1_3, &DT_1_4, &DT_1_5, &DT_1_6, &DT_1_7, &DT_1_8,
1499 &DT_2_1, &DT_2_2, &DT_2_3, &DT_2_4, &DT_2_5, &DT_2_6, &DT_2_7, &DT_2_8,
1500 &DT_3_1, &DT_3_2, &DT_3_3, &DT_3_4, &DT_3_5, &DT_3_5, &DT_3_5, &DT_3_5