2 use std::cell::RefCell;
3 use nihav_core::formats;
4 use nihav_core::codecs::*;
5 use nihav_core::frame::*;
6 use nihav_core::io::byteio::*;
15 #[derive(Clone, Copy)]
29 const DEFAULT_PIXEL: u8 = 0x40;
32 fn new() -> Self { Buffers { width: 0, height: 0, buf1: Vec::new(), buf2: Vec::new(), fbuf: true } }
36 self.buf1.truncate(0);
37 self.buf2.truncate(0);
39 fn alloc(&mut self, w: usize, h: usize) {
42 self.buf1.resize(w * h + (w >> 2) * (h >> 2) * 2, DEFAULT_PIXEL);
43 self.buf2.resize(w * h + (w >> 2) * (h >> 2) * 2, DEFAULT_PIXEL);
45 fn flip(&mut self) { self.fbuf = !self.fbuf; }
46 fn get_stride(&mut self, planeno: usize) -> usize {
47 if planeno == 0 { self.width } else { self.width >> 2 }
49 fn get_offset(&mut self, planeno: usize) -> usize {
51 1 => self.width * self.height,
52 2 => self.width * self.height + (self.width >> 2) * (self.height >> 2),
56 fn fill_framebuf(&mut self, fbuf: &mut NAVideoBuffer<u8>) {
58 let mut soff = self.get_offset(planeno);
59 let mut doff = fbuf.get_offset(planeno);
60 let sstride = self.get_stride(planeno);
61 let dstride = fbuf.get_stride(planeno);
62 let width = if planeno == 0 { self.width } else { self.width >> 2 };
63 let height = if planeno == 0 { self.height } else { self.height >> 2 };
64 let src = if self.fbuf { &self.buf1[0..] } else { &self.buf2[0..] };
65 let mut dst = fbuf.get_data_mut();
68 dst[doff + x] = src[soff + x] * 2;
75 fn copy_block(&mut self, doff: usize, soff: usize, stride: usize, w: usize, h: usize) {
80 for i in 0..w { self.buf1[didx + i] = self.buf2[sidx + i]; }
86 for i in 0..w { self.buf2[didx + i] = self.buf1[sidx + i]; }
92 fn fill_block(&mut self, doff: usize, stride: usize, w: usize, h: usize, topline: bool) {
94 let mut buf: [u8; 8] = [0; 8];
98 for i in 0..w { self.buf1[didx + i] = DEFAULT_PIXEL; }
103 for i in 0..w { self.buf2[didx + i] = DEFAULT_PIXEL; }
109 for i in 0..w { buf[i] = self.buf1[didx - stride + i]; }
111 for i in 0..w { self.buf1[didx + i] = buf[i]; }
115 for i in 0..w { buf[i] = self.buf2[didx - stride + i]; }
117 for i in 0..w { self.buf2[didx + i] = buf[i]; }
125 #[allow(unused_variables)]
126 fn apply_delta4x4(bufs: &mut Buffers, off: usize, stride: usize,
127 deltas: &[u8], topline: bool, first_line: bool) {
128 let dst = if bufs.fbuf { &mut bufs.buf1[off..(off + 4)] }
129 else { &mut bufs.buf2[off..(off + 4)] };
130 for i in 0..4 { dst[i] = dst[i].wrapping_add(deltas[i]) & 0x7F; }
133 #[allow(unused_variables)]
134 fn apply_delta4x8(bufs: &mut Buffers, off: usize, stride: usize,
135 deltas: &[u8], topline: bool, first_line: bool) {
136 let dst = if bufs.fbuf { &mut bufs.buf1[off..(off + 4 + stride)] }
137 else { &mut bufs.buf2[off..(off + 4 + stride)] };
138 for i in 0..4 { dst[i + stride] = dst[i].wrapping_add(deltas[i]) & 0x7F; }
140 for i in 0..4 { dst[i] = (dst[i + stride] + dst[i]) >> 1; }
142 for i in 0..4 { dst[i] = dst[i + stride]; }
146 #[allow(unused_variables)]
147 fn apply_delta4x8m11(bufs: &mut Buffers, off: usize, stride: usize,
148 deltas: &[u8], topline: bool, first_line: bool) {
149 let dst = if bufs.fbuf { &mut bufs.buf1[off..(off + 4 + stride)] }
150 else { &mut bufs.buf2[off..(off + 4 + stride)] };
151 for i in 0..4 { dst[i] = dst[i] .wrapping_add(deltas[i]) & 0x7F; }
152 for i in 0..4 { dst[i + stride] = dst[i + stride].wrapping_add(deltas[i]) & 0x7F; }
155 #[allow(unused_variables)]
156 fn apply_delta8x8p(bufs: &mut Buffers, off: usize, stride: usize,
157 deltas: &[u8], topline: bool, first_line: bool) {
158 let dst = if bufs.fbuf { &mut bufs.buf1[off..(off + 8 + stride)] }
159 else { &mut bufs.buf2[off..(off + 8 + stride)] };
160 for i in 0..8 { dst[i] = dst[i] .wrapping_add(deltas[i >> 1]) & 0x7F; }
161 for i in 0..8 { dst[i + stride] = dst[i + stride].wrapping_add(deltas[i >> 1]) & 0x7F; }
164 fn apply_delta8x8i(bufs: &mut Buffers, off: usize, stride: usize,
165 deltas: &[u8], topline: bool, firstline: bool) {
166 let dst = if bufs.fbuf { &mut bufs.buf1[off..(off + 8 + stride)] }
167 else { &mut bufs.buf2[off..(off + 8 + stride)] };
169 for i in 0..8 { dst[i + stride] = dst[i ].wrapping_add(deltas[i >> 1]) & 0x7F; }
171 for i in 0..8 { dst[i + stride] = dst[i & !1].wrapping_add(deltas[i >> 1]) & 0x7F; }
174 for i in 0..8 { dst[i] = (dst[i + stride] + dst[i]) >> 1; }
176 for i in 0..8 { dst[i] = dst[i + stride]; }
180 fn copy_line_top(bufs: &mut Buffers, off: usize, stride: usize, bw: usize, topline: bool) {
181 let mut buf: [u8; 8] = [0; 8];
183 let src = if bufs.fbuf { &bufs.buf1[(off - stride)..(off - stride + bw)] }
184 else { &bufs.buf2[(off - stride)..(off - stride + bw)] };
185 for i in 0..bw { buf[i] = src[i]; }
187 for i in 0..bw { buf[i] = DEFAULT_PIXEL; }
189 let dst = if bufs.fbuf { &mut bufs.buf1[off..(off + bw)] }
190 else { &mut bufs.buf2[off..(off + bw)] };
191 for i in 0..bw { dst[i] = buf[i]; }
194 fn copy_line_top4x4(bufs: &mut Buffers, off: usize, stride: usize, topline: bool) {
195 copy_line_top(bufs, off, stride, 4, topline);
198 fn copy_line_top4x8(bufs: &mut Buffers, off: usize, stride: usize, topline: bool) {
199 copy_line_top(bufs, off, stride, 4, topline);
200 copy_line_top(bufs, off + stride, stride, 4, false);
203 fn copy_line_top8x8(bufs: &mut Buffers, off: usize, stride: usize, topline: bool) {
204 let mut buf: [u8; 8] = [0; 8];
206 let src = if bufs.fbuf { &bufs.buf1[(off - stride)..(off - stride + 8)] }
207 else { &bufs.buf2[(off - stride)..(off - stride + 8)] };
208 for i in 0..8 { buf[i] = src[i & !1]; }
210 for i in 0..8 { buf[i] = DEFAULT_PIXEL; }
212 let dst = if bufs.fbuf { &mut bufs.buf1[off..(off + 8)] }
213 else { &mut bufs.buf2[off..(off + 8)] };
214 for i in 0..8 {dst[i] = buf[i]; }
217 fn fill_block8x8(bufs: &mut Buffers, doff: usize, stride: usize, h: usize, topline: bool, firstline: bool) {
219 let mut buf: [u8; 8] = [0; 8];
221 for i in 0..8 { buf[i] = DEFAULT_PIXEL; }
222 } else if bufs.fbuf {
223 for i in 0..8 { buf[i] = bufs.buf1[doff - stride + i]; }
225 for i in 0..8 { buf[i] = bufs.buf1[doff - stride + i]; }
227 if topline && !firstline {
228 for i in 0..4 { buf[i * 2 + 1] = buf[i * 2]; }
230 for i in 0..8 { bufs.buf1[doff + i] = (bufs.buf1[doff - stride + i] + buf[i]) >> 1; }
232 for i in 0..8 { bufs.buf2[doff + i] = (bufs.buf2[doff - stride + i] + buf[i]) >> 1; }
236 let start = if !topline { 0 } else { 1 };
239 for i in 0..8 { bufs.buf1[didx + i] = buf[i]; }
244 for i in 0..8 { bufs.buf2[didx + i] = buf[i]; }
250 struct Indeo3Decoder {
251 info: Rc<NACodecInfo>,
262 #[derive(Clone,Copy)]
274 fn new(w: u16, h: u16) -> Self {
275 IV3Cell { x: 0, y: 0, w: w, h: h, d: 20, vqt: false, mv: None }
277 fn split_h(&self) -> (Self, Self) {
278 let h1 = if self.h > 2 { ((self.h + 2) >> 2) << 1 } else { 1 };
279 let h2 = self.h - h1;
280 let mut cell1 = *self;
283 let mut cell2 = *self;
289 fn split_w(&self, stripw: u16) -> (Self, Self) {
290 let w1 = if self.w > stripw {
291 if self.w > stripw * 2 { stripw * 2 } else { stripw }
293 if self.w > 2 { ((self.w + 2) >> 2) << 1 } else { 1 }
295 let w2 = self.w - w1;
296 let mut cell1 = *self;
299 let mut cell2 = *self;
305 fn no_mv(&self) -> bool { match self.mv { None => true, Some(_) => false } }
308 struct CellDecParams {
314 apply_delta: fn (&mut Buffers, usize, usize, &[u8], bool, bool),
315 copy_line_top: fn (&mut Buffers, usize, usize, bool),
318 const FRMH_TAG: u32 = ((b'F' as u32) << 24) | ((b'R' as u32) << 16)
319 | ((b'M' as u32) << 8) | (b'H' as u32);
321 const H_SPLIT: u8 = 0;
322 const V_SPLIT: u8 = 1;
323 const SKIP_OR_TREE: u8 = 2;
327 let dummy_info = Rc::new(DUMMY_CODEC_INFO);
328 Indeo3Decoder { info: dummy_info, bpos: 0, bbuf: 0, width: 0, height: 0,
329 mvs: Vec::new(), altquant: [0; 16],
330 vq_offset: 0, bufs: Buffers::new() }
333 fn br_reset(&mut self) {
338 fn get_2bits(&mut self, br: &mut ByteReader) -> DecoderResult<u8> {
340 self.bbuf = br.read_byte()?;
344 Ok((self.bbuf >> self.bpos) & 0x3)
347 fn decode_cell_data(&mut self, br: &mut ByteReader, cell: IV3Cell,
348 off: usize, stride: usize, params: CellDecParams) -> DecoderResult<()> {
349 let blk_w = cell.w * 4 / params.bw;
350 let blk_h = cell.h * 4 / params.bh;
351 let scale: usize = if params.bh == 4 { 1 } else { 2 };
353 validate!((((cell.w * 4) % params.bw) == 0) && (((cell.h * 4) % params.bh) == 0));
355 let mut run_blocks = 0;
356 let mut run_skip = false;
358 let mut didx: usize = ((cell.x*4) as usize) + ((cell.y * 4) as usize) * stride + off;
363 let mv = cell.mv.unwrap();
364 let mx = mv.x as i16;
365 let my = mv.y as i16;
366 let l = (cell.x as i16) * 4 + mx;
367 let t = (cell.y as i16) * 4 + my;
368 let r = ((cell.x + cell.w) as i16) * 4 + mx;
369 let b = ((cell.y + cell.h) as i16) * 4 + my;
372 validate!(r <= (self.width as i16));
373 validate!(b <= (self.height as i16));
374 sidx = (l as usize) + (t as usize) * stride + off;
377 let mut xoff: usize = 0;
380 if !run_skip || !cell.no_mv() {
381 if !(params.bw == 8 && cell.no_mv()) {
383 self.bufs.copy_block(didx + xoff, sidx + xoff, stride,
384 params.bw as usize, params.bh as usize);
386 self.bufs.fill_block(didx + xoff, stride,
387 params.bw as usize, params.bh as usize,
388 (cell.y == 0) && (y == 0));
391 fill_block8x8(&mut self.bufs,
392 didx + xoff, stride, 8,
393 y == 0, (cell.y == 0) && (y == 0));
398 let mut line: usize = 0;
400 let c = br.read_byte()?;
402 let delta_tab = if params.hq {
403 IVI3_DELTA_CBS[params.tab[line & 1]]
405 IVI3_DELTA_CBS[params.tab[1]]
409 if (c as usize) < delta_tab.data.len()/2 {
410 idx1 = br.read_byte()? as usize;
411 validate!(idx1 < delta_tab.data.len());
414 let tmp = (c as usize) - delta_tab.data.len()/2;
415 idx1 = tmp / (delta_tab.quad_radix as usize);
416 idx2 = tmp % (delta_tab.quad_radix as usize);
417 if params.swap_q[line & 1] {
418 mem::swap(&mut idx1, &mut idx2);
421 let deltas: [u8; 4] = [delta_tab.data[idx1 * 2] as u8,
422 delta_tab.data[idx1 * 2 + 1] as u8,
423 delta_tab.data[idx2 * 2 + 0] as u8,
424 delta_tab.data[idx2 * 2 + 1] as u8];
425 let topline = (cell.y == 0) && (y == 0) && (line == 0);
426 let first_line = (y == 0) && (line == 0);
428 (params.copy_line_top)(&mut self.bufs,
429 didx + xoff + line * scale * stride,
432 self.bufs.copy_block(didx + xoff + line * scale * stride,
433 sidx + xoff + line * scale * stride,
434 stride, params.bw as usize, scale);
436 (params.apply_delta)(&mut self.bufs,
437 didx + xoff + line * scale * stride,
438 stride, &deltas, topline, first_line);
441 let mut tocopy: usize = 0;
442 let mut do_copy = true;
443 if c == 0xF8 { return Err(DecoderError::InvalidData); }
447 validate!(line == 0);
449 do_copy = !cell.no_mv();
452 validate!(line == 0);
454 do_copy = !cell.no_mv();
457 let c = br.read_byte()?;
458 validate!((c < 64) && ((c & 0x1F) != 0));
459 run_blocks = (c & 0x1F) - 1;
460 run_skip = (c & 0x20) != 0;
462 if params.bw == 4 && cell.no_mv() && run_skip {
472 let nl = 257 - (c as i16) - (line as i16);
474 tocopy = nl as usize;
477 if !(params.bw == 8 && cell.no_mv()) {
479 self.bufs.copy_block(didx + xoff + line * scale * stride,
480 sidx + xoff + line * scale * stride,
481 stride, params.bw as usize,
484 self.bufs.fill_block(didx + xoff + line * scale * stride,
485 stride, params.bw as usize,
487 (cell.y == 0) && (y == 0) && (line == 0));
490 fill_block8x8(&mut self.bufs,
491 didx + xoff + line * 2 * stride,
493 (y == 0) && (line == 0),
494 (cell.y == 0) && (y == 0) && (line == 0));
501 xoff += params.bw as usize;
503 didx += stride * (params.bh as usize);
504 sidx += stride * (params.bh as usize);
509 fn copy_cell(&mut self, cell: IV3Cell, off: usize, stride: usize) -> DecoderResult<()> {
510 if cell.no_mv() { return Err(DecoderError::InvalidData); }
511 let mv = cell.mv.unwrap();
512 let mx = mv.x as i16;
513 let my = mv.y as i16;
514 let l = (cell.x as i16) * 4 + mx;
515 let t = (cell.y as i16) * 4 + my;
516 let r = ((cell.x + cell.w) as i16) * 4 + mx;
517 let b = ((cell.y + cell.h) as i16) * 4 + my;
520 validate!(r <= (self.width as i16));
521 validate!(b <= (self.height as i16));
522 let sidx: usize = off + (l as usize) + (t as usize) * stride;
523 let didx: usize = off + ((cell.x * 4) as usize) + ((cell.y * 4) as usize) * stride;
524 self.bufs.copy_block(didx, sidx, stride, (cell.w * 4) as usize, (cell.h * 4) as usize);
528 fn decode_cell(&mut self, br: &mut ByteReader, cell: IV3Cell, off: usize,
529 stride: usize, intra: bool) -> DecoderResult<()> {
530 let code = br.read_byte()?;
531 let mode = code >> 4;
532 let vq_idx = code & 0xF;
534 let mut idx1: usize = vq_idx as usize;
535 let mut idx2: usize = vq_idx as usize;
536 if (mode == 1) || (mode == 4) {
537 let c = self.altquant[vq_idx as usize];
538 idx1 = (c >> 4) as usize;
539 idx2 = (c & 0xF) as usize;
542 idx1 += self.vq_offset as usize;
543 idx2 += self.vq_offset as usize;
544 validate!((idx1 < 24) && (idx2 < 24));
546 let mut cp = CellDecParams {
549 swap_q: [idx2 >= 16, idx1 >= 16],
551 apply_delta: apply_delta4x4,
552 copy_line_top: copy_line_top4x4,
554 if (mode == 0) || (mode == 1) {
558 } else if (mode == 3) || (mode == 4) {
559 if !cell.no_mv() { return Err(DecoderError::InvalidData); }
563 cp.apply_delta = apply_delta4x8;
564 cp.copy_line_top = copy_line_top4x8;
565 } else if mode == 10 {
568 cp.apply_delta = apply_delta8x8p;
570 cp.apply_delta = apply_delta8x8i;
574 cp.copy_line_top = copy_line_top8x8;
575 } else if mode == 11 {
576 if cell.no_mv() { return Err(DecoderError::InvalidData); }
580 cp.apply_delta = apply_delta4x8m11;
581 cp.copy_line_top = copy_line_top4x8;
583 return Err(DecoderError::InvalidData);
585 self.decode_cell_data(br, cell, off, stride, cp)
588 fn parse_tree(&mut self, br: &mut ByteReader, cell: IV3Cell, off: usize,
589 stride: usize, stripw: u16, intra: bool) -> DecoderResult<()> {
590 let op = self.get_2bits(br)?;
592 validate!(cell.h > 1);
593 validate!(cell.d > 0);
594 let (cell1, cell2) = cell.split_h();
595 self.parse_tree(br, cell1, off, stride, stripw, intra)?;
596 self.parse_tree(br, cell2, off, stride, stripw, intra)?;
598 } else if op == V_SPLIT {
599 validate!(cell.w > 1);
600 validate!(cell.d > 0);
601 let (cell1, cell2) = cell.split_w(stripw);
602 self.parse_tree(br, cell1, off, stride, stripw, intra)?;
603 self.parse_tree(br, cell2, off, stride, stripw, intra)?;
605 } else if op == SKIP_OR_TREE {
607 let mut newcell = cell;
610 self.parse_tree(br, newcell, off, stride, stripw, intra)
613 let code = self.get_2bits(br)?;
615 if code == 1 { return Err(DecoderError::NotImplemented); }
616 self.copy_cell(cell, off, stride)
620 let mut newcell = cell;
623 let mv_idx = br.read_byte()? as usize;
624 validate!(mv_idx < self.mvs.len());
625 newcell.mv = Some(self.mvs[mv_idx]);
626 self.parse_tree(br, newcell, off, stride, stripw, intra)
628 self.decode_cell(br, cell, off, stride, intra)
633 fn decode_plane_intra(&mut self, br: &mut ByteReader, planeno: usize,
634 start: u64, end: u64) -> DecoderResult<()> {
635 let offs = self.bufs.get_offset(planeno);
636 let stride = self.bufs.get_stride(planeno);
637 br.seek(SeekFrom::Start(start))?;
639 let nvec = br.read_u32le()?;
640 validate!(nvec == 0); // for intra there should be no mc_vecs
641 self.mvs.truncate(0);
643 let x = br.read_byte()? as i8;
644 let y = br.read_byte()? as i8;
645 self.mvs.push(MV{ x: x, y: y });
648 let shift = if planeno == 0 { 2 } else { 4 };
649 let cell = IV3Cell::new((self.bufs.width >> shift) as u16,
650 (self.bufs.height >> shift) as u16);
652 self.parse_tree(br, cell, offs, stride, if planeno > 0 { 10 } else { 40 }, true)?;
653 validate!(br.tell() <= end);
657 fn decode_plane_inter(&mut self, br: &mut ByteReader, planeno: usize,
658 start: u64, end: u64) -> DecoderResult<()> {
659 let offs = self.bufs.get_offset(planeno);
660 let stride = self.bufs.get_stride(planeno);
661 br.seek(SeekFrom::Start(start))?;
663 let nvec = br.read_u32le()?;
664 validate!(nvec <= 256); // for intra there should be no mc_vecs
665 self.mvs.truncate(0);
667 let y = br.read_byte()? as i8;
668 let x = br.read_byte()? as i8;
669 self.mvs.push(MV{ x: x, y: y });
672 let shift = if planeno == 0 { 2 } else { 4 };
673 let cell = IV3Cell::new((self.bufs.width >> shift) as u16,
674 (self.bufs.height >> shift) as u16);
676 self.parse_tree(br, cell, offs, stride, if planeno > 0 { 10 } else { 40 }, false)?;
677 validate!(br.tell() <= end);
682 const FLAG_KEYFRAME: u16 = 1 << 2;
683 const FLAG_NONREF: u16 = 1 << 8;
685 impl NADecoder for Indeo3Decoder {
686 fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
687 if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
688 let w = vinfo.get_width();
689 let h = vinfo.get_height();
690 let fmt = formats::YUV410_FORMAT;
691 let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, false, fmt));
692 self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()));
696 Err(DecoderError::InvalidData)
699 fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
700 let src = pkt.get_buffer();
701 let mut mr = MemoryReader::new_read(&src);
702 let mut br = ByteReader::new(&mut mr);
703 let frameno = br.read_u32le()?;
704 let hdr_2 = br.read_u32le()?;
705 let check = br.read_u32le()?;
706 let size = br.read_u32le()?;
708 let data_start = br.tell();
710 if (frameno ^ hdr_2 ^ size ^ FRMH_TAG) != check {
711 return Err(DecoderError::InvalidData);
713 if (size as i64) > br.left() { return Err(DecoderError::InvalidData); }
714 let ver = br.read_u16le()?;
715 if ver != 32 { return Err(DecoderError::NotImplemented); }
716 let flags = br.read_u16le()?;
717 let size2 = br.read_u32le()?;
718 validate!(((size2 + 7) >> 3) <= size);
719 let cb = br.read_byte()?;
722 let height = br.read_u16le()?;
723 let width = br.read_u16le()?;
724 validate!((width >= 16) && (width <= 640));
725 validate!((height >= 16) && (height <= 640));
726 validate!(((width & 3) == 0) && ((height & 3) == 0));
727 if (self.bufs.width != (width as usize)) || (self.bufs.height != (height as usize)) {
728 self.bufs.alloc(width as usize, height as usize);
731 self.height = height;
733 let yoff = br.read_u32le()?;
734 let uoff = br.read_u32le()?;
735 let voff = br.read_u32le()?;
736 if yoff > size { return Err(DecoderError::InvalidData); }
737 if uoff > size { return Err(DecoderError::InvalidData); }
738 if voff > size { return Err(DecoderError::InvalidData); }
741 br.read_buf(&mut self.altquant)?;
743 let mut yend = src.len() as u32;//size;
744 if (uoff < yend) && (uoff > yoff) { yend = uoff; }
745 if (voff < yend) && (voff > yoff) { yend = voff; }
747 if (yoff < uend) && (yoff > uoff) { uend = yoff; }
748 if (voff < uend) && (voff > uoff) { uend = voff; }
750 if (yoff < vend) && (yoff > voff) { vend = yoff; }
751 if (uoff < vend) && (uoff > voff) { vend = uoff; }
753 let intraframe = (flags & FLAG_KEYFRAME) != 0;
754 let vinfo = self.info.get_properties().get_video_info().unwrap();
755 let bufret = alloc_video_buffer(vinfo, 2);
756 if let Err(_) = bufret { return Err(DecoderError::InvalidData); }
757 let mut bufinfo = bufret.unwrap();
758 let mut buf = bufinfo.get_vbuf().unwrap();
759 let ystart = data_start + (yoff as u64);
760 let ustart = data_start + (uoff as u64);
761 let vstart = data_start + (voff as u64);
762 let yendpos = data_start + (yend as u64);
763 let uendpos = data_start + (uend as u64);
764 let vendpos = data_start + (vend as u64);
766 self.decode_plane_intra(&mut br, 0, ystart, yendpos)?;
767 self.decode_plane_intra(&mut br, 1, ustart, uendpos)?;
768 self.decode_plane_intra(&mut br, 2, vstart, vendpos)?;
770 self.decode_plane_inter(&mut br, 0, ystart, yendpos)?;
771 self.decode_plane_inter(&mut br, 1, ustart, uendpos)?;
772 self.decode_plane_inter(&mut br, 2, vstart, vendpos)?;
774 self.bufs.fill_framebuf(&mut buf);
775 if (flags & FLAG_NONREF) == 0 { self.bufs.flip(); }
776 let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
777 frm.set_keyframe(intraframe);
778 frm.set_frame_type(if intraframe { FrameType::I } else { FrameType::P });
779 Ok(Rc::new(RefCell::new(frm)))
783 pub fn get_decoder() -> Box<NADecoder> {
784 Box::new(Indeo3Decoder::new())
789 use crate::test::dec_video::test_file_decoding;
792 test_file_decoding("avi", "assets/iv32_example.avi", Some(10), true, false, None);
796 const DT_1_1: IviDeltaCB = IviDeltaCB{ quad_radix: 7, data: &[
797 0, 0, 2, 2, -2, -2, -1, 3,
798 1, -3, 3, -1, -3, 1, 4, 4,
799 -4, -4, 1, 5, -1, -5, 5, 1,
800 -5, -1, -4, 4, 4, -4, -2, 6,
801 2, -6, 6, -2, -6, 2, 4, 9,
802 -4, -9, 9, 4, -9, -4, 9, 9,
803 -9, -9, 1, 10, -1, -10, 10, 1,
804 -10, -1, -5, 8, 5, -8, 8, -5,
805 -8, 5, 9, 15, -9, -15, 15, 9,
806 -15, -9, -3, 12, 3, -12, 12, -3,
807 -12, 3, 4, 16, -4, -16, 16, 4,
808 -16, -4, 16, 16, -16, -16, 0, 18,
809 0, -18, 18, 0, -18, 0, -12, 12,
810 12, -12, -9, 16, 9, -16, 16, -9,
811 -16, 9, 11, 27, -11, -27, 27, 11,
812 -27, -11, 19, 28, -19, -28, 28, 19,
813 -28, -19, -6, 22, 6, -22, 22, -6,
814 -22, 6, 4, 29, -4, -29, 29, 4,
815 -29, -4, 30, 30, -30, -30, -2, 33,
816 2, -33, 33, -2, -33, 2, -18, 23,
817 18, -23, 23, -18, -23, 18, -15, 30,
818 15, -30, 30, -15, -30, 15, 22, 46,
819 -22, -46, 46, 22, -46, -22, 13, 47,
820 -13, -47, 47, 13, -47, -13, 35, 49,
821 -35, -49, 49, 35, -49, -35, -11, 41,
822 11, -41, 41, -11, -41, 11, 4, 51,
823 -4, -51, 51, 4, -51, -4, 54, 54,
824 -54, -54, -34, 34, 34, -34, -29, 42,
825 29, -42, 42, -29, -42, 29, -6, 60,
826 6, -60, 60, -6, -60, 6, 27, 76,
827 -27, -76, 76, 27, -76, -27, 43, 77,
828 -43, -77, 77, 43, -77, -43, -24, 55,
829 24, -55, 55, -24, -55, 24, 14, 79,
830 -14, -79, 79, 14, -79, -14, 63, 83,
831 -63, -83, 83, 63, -83, -63, -20, 74,
832 20, -74, 74, -20, -74, 20, 2, 88,
833 -2, -88, 88, 2, -88, -2, 93, 93,
834 -93, -93, -52, 61, 52, -61, 61, -52,
835 -61, 52, 52, 120, -52, -120, 120, 52,
836 -120, -52, -45, 75, 45, -75, 75, -45,
837 -75, 45, 75, 125, -75, -125, 125, 75,
838 -125, -75, 33, 122, -33, -122, 122, 33,
839 -122, -33, -13, 103, 13, -103, 103, -13,
840 -103, 13, -40, 96, 40, -96, 96, -40,
841 -96, 40, -34, 127, 34, -127, 127, -34,
842 -127, 34, -89, 89, 89, -89, -78, 105,
843 78, -105, 105, -78, -105, 78, 12, 12,
844 -12, -12, 23, 23, -23, -23, 42, 42,
845 -42, -42, 73, 73, -73, -73,
848 const DT_1_2: IviDeltaCB = IviDeltaCB{ quad_radix: 9, data: &[
849 0, 0, 3, 3, -3, -3, -1, 4,
850 1, -4, 4, -1, -4, 1, 7, 7,
851 -7, -7, 2, 8, -2, -8, 8, 2,
852 -8, -2, -2, 9, 2, -9, 9, -2,
853 -9, 2, -6, 6, 6, -6, 6, 13,
854 -6, -13, 13, 6, -13, -6, 13, 13,
855 -13, -13, 1, 14, -1, -14, 14, 1,
856 -14, -1, -8, 12, 8, -12, 12, -8,
857 -12, 8, 14, 23, -14, -23, 23, 14,
858 -23, -14, -5, 18, 5, -18, 18, -5,
859 -18, 5, 6, 24, -6, -24, 24, 6,
860 -24, -6, 24, 24, -24, -24, -1, 27,
861 1, -27, 27, -1, -27, 1, -17, 17,
862 17, -17, -13, 23, 13, -23, 23, -13,
863 -23, 13, 16, 40, -16, -40, 40, 16,
864 -40, -16, 28, 41, -28, -41, 41, 28,
865 -41, -28, -9, 33, 9, -33, 33, -9,
866 -33, 9, 6, 43, -6, -43, 43, 6,
867 -43, -6, 46, 46, -46, -46, -4, 50,
868 4, -50, 50, -4, -50, 4, -27, 34,
869 27, -34, 34, -27, -34, 27, -22, 45,
870 22, -45, 45, -22, -45, 22, 34, 69,
871 -34, -69, 69, 34, -69, -34, 19, 70,
872 -19, -70, 70, 19, -70, -19, 53, 73,
873 -53, -73, 73, 53, -73, -53, -17, 62,
874 17, -62, 62, -17, -62, 17, 5, 77,
875 -5, -77, 77, 5, -77, -5, 82, 82,
876 -82, -82, -51, 51, 51, -51, -43, 64,
877 43, -64, 64, -43, -64, 43, -10, 90,
878 10, -90, 90, -10, -90, 10, 41, 114,
879 -41, -114, 114, 41, -114, -41, 64, 116,
880 -64, -116, 116, 64, -116, -64, -37, 82,
881 37, -82, 82, -37, -82, 37, 22, 119,
882 -22, -119, 119, 22, -119, -22, 95, 124,
883 -95, -124, 124, 95, -124, -95, -30, 111,
884 30, -111, 111, -30, -111, 30, -78, 92,
885 78, -92, 92, -78, -92, 78, -68, 113,
886 68, -113, 113, -68, -113, 68, 18, 18,
887 -18, -18, 34, 34, -34, -34, 63, 63,
888 -63, -63, 109, 109, -109, -109,
891 const DT_1_3: IviDeltaCB = IviDeltaCB{ quad_radix: 10, data: &[
892 0, 0, 4, 4, -4, -4, -1, 5,
893 1, -5, 5, -1, -5, 1, 3, 10,
894 -3, -10, 10, 3, -10, -3, 9, 9,
895 -9, -9, -7, 7, 7, -7, -3, 12,
896 3, -12, 12, -3, -12, 3, 8, 17,
897 -8, -17, 17, 8, -17, -8, 17, 17,
898 -17, -17, 1, 19, -1, -19, 19, 1,
899 -19, -1, -11, 16, 11, -16, 16, -11,
900 -16, 11, -6, 23, 6, -23, 23, -6,
901 -23, 6, 18, 31, -18, -31, 31, 18,
902 -31, -18, 8, 32, -8, -32, 32, 8,
903 -32, -8, 33, 33, -33, -33, -1, 36,
904 1, -36, 36, -1, -36, 1, -23, 23,
905 23, -23, -17, 31, 17, -31, 31, -17,
906 -31, 17, 21, 54, -21, -54, 54, 21,
907 -54, -21, 37, 55, -37, -55, 55, 37,
908 -55, -37, -12, 44, 12, -44, 44, -12,
909 -44, 12, 8, 57, -8, -57, 57, 8,
910 -57, -8, 61, 61, -61, -61, -5, 66,
911 5, -66, 66, -5, -66, 5, -36, 45,
912 36, -45, 45, -36, -45, 36, -29, 60,
913 29, -60, 60, -29, -60, 29, 45, 92,
914 -45, -92, 92, 45, -92, -45, 25, 93,
915 -25, -93, 93, 25, -93, -25, 71, 97,
916 -71, -97, 97, 71, -97, -71, -22, 83,
917 22, -83, 83, -22, -83, 22, 7, 102,
918 -7, -102, 102, 7, -102, -7, 109, 109,
919 -109, -109, -68, 68, 68, -68, -57, 85,
920 57, -85, 85, -57, -85, 57, -13, 120,
921 13, -120, 120, -13, -120, 13, -49, 110,
922 49, -110, 110, -49, -110, 49, -104, 123,
923 104, -123, 123, -104, -123, 104, 24, 24,
924 -24, -24, 46, 46, -46, -46, 84, 84,
928 const DT_1_4: IviDeltaCB = IviDeltaCB{ quad_radix: 11, data: &[
929 0, 0, 5, 5, -5, -5, -2, 7,
930 2, -7, 7, -2, -7, 2, 11, 11,
931 -11, -11, 3, 13, -3, -13, 13, 3,
932 -13, -3, -9, 9, 9, -9, -4, 15,
933 4, -15, 15, -4, -15, 4, 11, 22,
934 -11, -22, 22, 11, -22, -11, 21, 21,
935 -21, -21, 2, 24, -2, -24, 24, 2,
936 -24, -2, -14, 20, 14, -20, 20, -14,
937 -20, 14, 23, 38, -23, -38, 38, 23,
938 -38, -23, -8, 29, 8, -29, 29, -8,
939 -29, 8, 11, 39, -11, -39, 39, 11,
940 -39, -11, 41, 41, -41, -41, -1, 45,
941 1, -45, 45, -1, -45, 1, -29, 29,
942 29, -29, -22, 39, 22, -39, 39, -22,
943 -39, 22, 27, 67, -27, -67, 67, 27,
944 -67, -27, 47, 69, -47, -69, 69, 47,
945 -69, -47, -15, 56, 15, -56, 56, -15,
946 -56, 15, 11, 71, -11, -71, 71, 11,
947 -71, -11, 76, 76, -76, -76, -6, 83,
948 6, -83, 83, -6, -83, 6, -45, 57,
949 45, -57, 57, -45, -57, 45, -36, 75,
950 36, -75, 75, -36, -75, 36, 56, 115,
951 -56, -115, 115, 56, -115, -56, 31, 117,
952 -31, -117, 117, 31, -117, -31, 88, 122,
953 -88, -122, 122, 88, -122, -88, -28, 104,
954 28, -104, 104, -28, -104, 28, -85, 85,
955 85, -85, -72, 106, 72, -106, 106, -72,
956 -106, 72, 30, 30, -30, -30, 58, 58,
957 -58, -58, 105, 105, -105, -105,
960 const DT_1_5: IviDeltaCB = IviDeltaCB{ quad_radix: 12, data: &[
961 0, 0, 6, 6, -6, -6, -2, 8,
962 2, -8, 8, -2, -8, 2, 13, 13,
963 -13, -13, 4, 15, -4, -15, 15, 4,
964 -15, -4, -11, 11, 11, -11, -5, 18,
965 5, -18, 18, -5, -18, 5, 13, 26,
966 -13, -26, 26, 13, -26, -13, 26, 26,
967 -26, -26, 2, 29, -2, -29, 29, 2,
968 -29, -2, -16, 24, 16, -24, 24, -16,
969 -24, 16, 28, 46, -28, -46, 46, 28,
970 -46, -28, -9, 35, 9, -35, 35, -9,
971 -35, 9, 13, 47, -13, -47, 47, 13,
972 -47, -13, 49, 49, -49, -49, -1, 54,
973 1, -54, 54, -1, -54, 1, -35, 35,
974 35, -35, -26, 47, 26, -47, 47, -26,
975 -47, 26, 32, 81, -32, -81, 81, 32,
976 -81, -32, 56, 83, -56, -83, 83, 56,
977 -83, -56, -18, 67, 18, -67, 67, -18,
978 -67, 18, 13, 86, -13, -86, 86, 13,
979 -86, -13, 91, 91, -91, -91, -7, 99,
980 7, -99, 99, -7, -99, 7, -54, 68,
981 54, -68, 68, -54, -68, 54, -44, 90,
982 44, -90, 90, -44, -90, 44, -33, 124,
983 33, -124, 124, -33, -124, 33, -103, 103,
984 103, -103, -86, 127, 86, -127, 127, -86,
985 -127, 86, 37, 37, -37, -37, 69, 69,
989 const DT_1_6: IviDeltaCB = IviDeltaCB{ quad_radix: 12, data: &[
990 0, 0, 7, 7, -7, -7, -3, 10,
991 3, -10, 10, -3, -10, 3, 16, 16,
992 -16, -16, 5, 18, -5, -18, 18, 5,
993 -18, -5, -13, 13, 13, -13, -6, 21,
994 6, -21, 21, -6, -21, 6, 15, 30,
995 -15, -30, 30, 15, -30, -15, 30, 30,
996 -30, -30, 2, 34, -2, -34, 34, 2,
997 -34, -2, -19, 28, 19, -28, 28, -19,
998 -28, 19, 32, 54, -32, -54, 54, 32,
999 -54, -32, -11, 41, 11, -41, 41, -11,
1000 -41, 11, 15, 55, -15, -55, 55, 15,
1001 -55, -15, 57, 57, -57, -57, -1, 63,
1002 1, -63, 63, -1, -63, 1, -40, 40,
1003 40, -40, -30, 55, 30, -55, 55, -30,
1004 -55, 30, 37, 94, -37, -94, 94, 37,
1005 -94, -37, 65, 96, -65, -96, 96, 65,
1006 -96, -65, -21, 78, 21, -78, 78, -21,
1007 -78, 21, 15, 100, -15, -100, 100, 15,
1008 -100, -15, 106, 106, -106, -106, -8, 116,
1009 8, -116, 116, -8, -116, 8, -63, 79,
1010 63, -79, 79, -63, -79, 63, -51, 105,
1011 51, -105, 105, -51, -105, 51, -120, 120,
1012 120, -120, 43, 43, -43, -43, 80, 80,
1016 const DT_1_7: IviDeltaCB = IviDeltaCB{ quad_radix: 12, data: &[
1017 0, 0, 8, 8, -8, -8, -3, 11,
1018 3, -11, 11, -3, -11, 3, 18, 18,
1019 -18, -18, 5, 20, -5, -20, 20, 5,
1020 -20, -5, -15, 15, 15, -15, -7, 24,
1021 7, -24, 24, -7, -24, 7, 17, 35,
1022 -17, -35, 35, 17, -35, -17, 34, 34,
1023 -34, -34, 3, 38, -3, -38, 38, 3,
1024 -38, -3, -22, 32, 22, -32, 32, -22,
1025 -32, 22, 37, 61, -37, -61, 61, 37,
1026 -61, -37, -13, 47, 13, -47, 47, -13,
1027 -47, 13, 17, 63, -17, -63, 63, 17,
1028 -63, -17, 65, 65, -65, -65, -1, 72,
1029 1, -72, 72, -1, -72, 1, -46, 46,
1030 46, -46, -35, 63, 35, -63, 63, -35,
1031 -63, 35, 43, 107, -43, -107, 107, 43,
1032 -107, -43, 75, 110, -75, -110, 110, 75,
1033 -110, -75, -24, 89, 24, -89, 89, -24,
1034 -89, 24, 17, 114, -17, -114, 114, 17,
1035 -114, -17, 121, 121, -121, -121, -72, 91,
1036 72, -91, 91, -72, -91, 72, -58, 120,
1037 58, -120, 120, -58, -120, 58, 49, 49,
1038 -49, -49, 92, 92, -92, -92,
1041 const DT_1_8: IviDeltaCB = IviDeltaCB{ quad_radix: 13, data: &[
1042 0, 0, 9, 9, -9, -9, -3, 12,
1043 3, -12, 12, -3, -12, 3, 20, 20,
1044 -20, -20, 6, 23, -6, -23, 23, 6,
1045 -23, -6, -17, 17, 17, -17, -7, 27,
1046 7, -27, 27, -7, -27, 7, 19, 39,
1047 -19, -39, 39, 19, -39, -19, 39, 39,
1048 -39, -39, 3, 43, -3, -43, 43, 3,
1049 -43, -3, -24, 36, 24, -36, 36, -24,
1050 -36, 24, 42, 69, -42, -69, 69, 42,
1051 -69, -42, -14, 53, 14, -53, 53, -14,
1052 -53, 14, 19, 71, -19, -71, 71, 19,
1053 -71, -19, 73, 73, -73, -73, -2, 80,
1054 2, -80, 80, -2, -80, 2, -52, 52,
1055 52, -52, -39, 70, 39, -70, 70, -39,
1056 -70, 39, 48, 121, -48, -121, 121, 48,
1057 -121, -48, 84, 124, -84, -124, 124, 84,
1058 -124, -84, -27, 100, 27, -100, 100, -27,
1059 -100, 27, -81, 102, 81, -102, 102, -81,
1060 -102, 81, 55, 55, -55, -55, 104, 104,
1064 const DT_2_1: IviDeltaCB = IviDeltaCB{ quad_radix: 7, data: &[
1065 0, 0, 2, 2, -2, -2, 0, 2,
1066 0, -2, 2, 0, -2, 0, 4, 4,
1067 -4, -4, 0, 4, 0, -4, 4, 0,
1068 -4, 0, -4, 4, 4, -4, -2, 6,
1069 2, -6, 6, -2, -6, 2, 4, 8,
1070 -4, -8, 8, 4, -8, -4, 8, 8,
1071 -8, -8, 0, 10, 0, -10, 10, 0,
1072 -10, 0, -4, 8, 4, -8, 8, -4,
1073 -8, 4, 8, 14, -8, -14, 14, 8,
1074 -14, -8, -2, 12, 2, -12, 12, -2,
1075 -12, 2, 4, 16, -4, -16, 16, 4,
1076 -16, -4, 16, 16, -16, -16, 0, 18,
1077 0, -18, 18, 0, -18, 0, -12, 12,
1078 12, -12, -8, 16, 8, -16, 16, -8,
1079 -16, 8, 10, 26, -10, -26, 26, 10,
1080 -26, -10, 18, 28, -18, -28, 28, 18,
1081 -28, -18, -6, 22, 6, -22, 22, -6,
1082 -22, 6, 4, 28, -4, -28, 28, 4,
1083 -28, -4, 30, 30, -30, -30, -2, 32,
1084 2, -32, 32, -2, -32, 2, -18, 22,
1085 18, -22, 22, -18, -22, 18, -14, 30,
1086 14, -30, 30, -14, -30, 14, 22, 46,
1087 -22, -46, 46, 22, -46, -22, 12, 46,
1088 -12, -46, 46, 12, -46, -12, 34, 48,
1089 -34, -48, 48, 34, -48, -34, -10, 40,
1090 10, -40, 40, -10, -40, 10, 4, 50,
1091 -4, -50, 50, 4, -50, -4, 54, 54,
1092 -54, -54, -34, 34, 34, -34, -28, 42,
1093 28, -42, 42, -28, -42, 28, -6, 60,
1094 6, -60, 60, -6, -60, 6, 26, 76,
1095 -26, -76, 76, 26, -76, -26, 42, 76,
1096 -42, -76, 76, 42, -76, -42, -24, 54,
1097 24, -54, 54, -24, -54, 24, 14, 78,
1098 -14, -78, 78, 14, -78, -14, 62, 82,
1099 -62, -82, 82, 62, -82, -62, -20, 74,
1100 20, -74, 74, -20, -74, 20, 2, 88,
1101 -2, -88, 88, 2, -88, -2, 92, 92,
1102 -92, -92, -52, 60, 52, -60, 60, -52,
1103 -60, 52, 52, 118, -52, -118, 118, 52,
1104 -118, -52, -44, 74, 44, -74, 74, -44,
1105 -74, 44, 74, 118, -74, -118, 118, 74,
1106 -118, -74, 32, 118, -32, -118, 118, 32,
1107 -118, -32, -12, 102, 12, -102, 102, -12,
1108 -102, 12, -40, 96, 40, -96, 96, -40,
1109 -96, 40, -34, 118, 34, -118, 118, -34,
1110 -118, 34, -88, 88, 88, -88, -78, 104,
1111 78, -104, 104, -78, -104, 78, 12, 12,
1112 -12, -12, 22, 22, -22, -22, 42, 42,
1113 -42, -42, 72, 72, -72, -72,
1116 const DT_2_2: IviDeltaCB = IviDeltaCB{ quad_radix: 9, data: &[
1117 0, 0, 3, 3, -3, -3, 0, 3,
1118 0, -3, 3, 0, -3, 0, 6, 6,
1119 -6, -6, 3, 9, -3, -9, 9, 3,
1120 -9, -3, -3, 9, 3, -9, 9, -3,
1121 -9, 3, -6, 6, 6, -6, 6, 12,
1122 -6, -12, 12, 6, -12, -6, 12, 12,
1123 -12, -12, 0, 15, 0, -15, 15, 0,
1124 -15, 0, -9, 12, 9, -12, 12, -9,
1125 -12, 9, 15, 24, -15, -24, 24, 15,
1126 -24, -15, -6, 18, 6, -18, 18, -6,
1127 -18, 6, 6, 24, -6, -24, 24, 6,
1128 -24, -6, 24, 24, -24, -24, 0, 27,
1129 0, -27, 27, 0, -27, 0, -18, 18,
1130 18, -18, -12, 24, 12, -24, 24, -12,
1131 -24, 12, 15, 39, -15, -39, 39, 15,
1132 -39, -15, 27, 42, -27, -42, 42, 27,
1133 -42, -27, -9, 33, 9, -33, 33, -9,
1134 -33, 9, 6, 42, -6, -42, 42, 6,
1135 -42, -6, 45, 45, -45, -45, -3, 51,
1136 3, -51, 51, -3, -51, 3, -27, 33,
1137 27, -33, 33, -27, -33, 27, -21, 45,
1138 21, -45, 45, -21, -45, 21, 33, 69,
1139 -33, -69, 69, 33, -69, -33, 18, 69,
1140 -18, -69, 69, 18, -69, -18, 54, 72,
1141 -54, -72, 72, 54, -72, -54, -18, 63,
1142 18, -63, 63, -18, -63, 18, 6, 78,
1143 -6, -78, 78, 6, -78, -6, 81, 81,
1144 -81, -81, -51, 51, 51, -51, -42, 63,
1145 42, -63, 63, -42, -63, 42, -9, 90,
1146 9, -90, 90, -9, -90, 9, 42, 114,
1147 -42, -114, 114, 42, -114, -42, 63, 117,
1148 -63, -117, 117, 63, -117, -63, -36, 81,
1149 36, -81, 81, -36, -81, 36, 21, 120,
1150 -21, -120, 120, 21, -120, -21, 96, 123,
1151 -96, -123, 123, 96, -123, -96, -30, 111,
1152 30, -111, 111, -30, -111, 30, -78, 93,
1153 78, -93, 93, -78, -93, 78, -69, 114,
1154 69, -114, 114, -69, -114, 69, 18, 18,
1155 -18, -18, 33, 33, -33, -33, 63, 63,
1156 -63, -63, 108, 108, -108, -108,
1159 const DT_2_3: IviDeltaCB = IviDeltaCB{ quad_radix: 10, data: &[
1160 0, 0, 4, 4, -4, -4, 0, 4,
1161 0, -4, 4, 0, -4, 0, 4, 8,
1162 -4, -8, 8, 4, -8, -4, 8, 8,
1163 -8, -8, -8, 8, 8, -8, -4, 12,
1164 4, -12, 12, -4, -12, 4, 8, 16,
1165 -8, -16, 16, 8, -16, -8, 16, 16,
1166 -16, -16, 0, 20, 0, -20, 20, 0,
1167 -20, 0, -12, 16, 12, -16, 16, -12,
1168 -16, 12, -4, 24, 4, -24, 24, -4,
1169 -24, 4, 16, 32, -16, -32, 32, 16,
1170 -32, -16, 8, 32, -8, -32, 32, 8,
1171 -32, -8, 32, 32, -32, -32, 0, 36,
1172 0, -36, 36, 0, -36, 0, -24, 24,
1173 24, -24, -16, 32, 16, -32, 32, -16,
1174 -32, 16, 20, 52, -20, -52, 52, 20,
1175 -52, -20, 36, 56, -36, -56, 56, 36,
1176 -56, -36, -12, 44, 12, -44, 44, -12,
1177 -44, 12, 8, 56, -8, -56, 56, 8,
1178 -56, -8, 60, 60, -60, -60, -4, 64,
1179 4, -64, 64, -4, -64, 4, -36, 44,
1180 36, -44, 44, -36, -44, 36, -28, 60,
1181 28, -60, 60, -28, -60, 28, 44, 92,
1182 -44, -92, 92, 44, -92, -44, 24, 92,
1183 -24, -92, 92, 24, -92, -24, 72, 96,
1184 -72, -96, 96, 72, -96, -72, -20, 84,
1185 20, -84, 84, -20, -84, 20, 8, 100,
1186 -8, -100, 100, 8, -100, -8, 108, 108,
1187 -108, -108, -68, 68, 68, -68, -56, 84,
1188 56, -84, 84, -56, -84, 56, -12, 120,
1189 12, -120, 120, -12, -120, 12, -48, 108,
1190 48, -108, 108, -48, -108, 48, -104, 124,
1191 104, -124, 124, -104, -124, 104, 24, 24,
1192 -24, -24, 44, 44, -44, -44, 84, 84,
1196 const DT_2_4: IviDeltaCB = IviDeltaCB{ quad_radix: 11, data: &[
1197 0, 0, 5, 5, -5, -5, 0, 5,
1198 0, -5, 5, 0, -5, 0, 10, 10,
1199 -10, -10, 5, 15, -5, -15, 15, 5,
1200 -15, -5, -10, 10, 10, -10, -5, 15,
1201 5, -15, 15, -5, -15, 5, 10, 20,
1202 -10, -20, 20, 10, -20, -10, 20, 20,
1203 -20, -20, 0, 25, 0, -25, 25, 0,
1204 -25, 0, -15, 20, 15, -20, 20, -15,
1205 -20, 15, 25, 40, -25, -40, 40, 25,
1206 -40, -25, -10, 30, 10, -30, 30, -10,
1207 -30, 10, 10, 40, -10, -40, 40, 10,
1208 -40, -10, 40, 40, -40, -40, 0, 45,
1209 0, -45, 45, 0, -45, 0, -30, 30,
1210 30, -30, -20, 40, 20, -40, 40, -20,
1211 -40, 20, 25, 65, -25, -65, 65, 25,
1212 -65, -25, 45, 70, -45, -70, 70, 45,
1213 -70, -45, -15, 55, 15, -55, 55, -15,
1214 -55, 15, 10, 70, -10, -70, 70, 10,
1215 -70, -10, 75, 75, -75, -75, -5, 85,
1216 5, -85, 85, -5, -85, 5, -45, 55,
1217 45, -55, 55, -45, -55, 45, -35, 75,
1218 35, -75, 75, -35, -75, 35, 55, 115,
1219 -55, -115, 115, 55, -115, -55, 30, 115,
1220 -30, -115, 115, 30, -115, -30, 90, 120,
1221 -90, -120, 120, 90, -120, -90, -30, 105,
1222 30, -105, 105, -30, -105, 30, -85, 85,
1223 85, -85, -70, 105, 70, -105, 105, -70,
1224 -105, 70, 30, 30, -30, -30, 60, 60,
1225 -60, -60, 105, 105, -105, -105,
1228 const DT_2_5: IviDeltaCB = IviDeltaCB{ quad_radix: 12, data: &[
1229 0, 0, 6, 6, -6, -6, 0, 6,
1230 0, -6, 6, 0, -6, 0, 12, 12,
1231 -12, -12, 6, 12, -6, -12, 12, 6,
1232 -12, -6, -12, 12, 12, -12, -6, 18,
1233 6, -18, 18, -6, -18, 6, 12, 24,
1234 -12, -24, 24, 12, -24, -12, 24, 24,
1235 -24, -24, 0, 30, 0, -30, 30, 0,
1236 -30, 0, -18, 24, 18, -24, 24, -18,
1237 -24, 18, 30, 48, -30, -48, 48, 30,
1238 -48, -30, -6, 36, 6, -36, 36, -6,
1239 -36, 6, 12, 48, -12, -48, 48, 12,
1240 -48, -12, 48, 48, -48, -48, 0, 54,
1241 0, -54, 54, 0, -54, 0, -36, 36,
1242 36, -36, -24, 48, 24, -48, 48, -24,
1243 -48, 24, 30, 78, -30, -78, 78, 30,
1244 -78, -30, 54, 84, -54, -84, 84, 54,
1245 -84, -54, -18, 66, 18, -66, 66, -18,
1246 -66, 18, 12, 84, -12, -84, 84, 12,
1247 -84, -12, 90, 90, -90, -90, -6, 96,
1248 6, -96, 96, -6, -96, 6, -54, 66,
1249 54, -66, 66, -54, -66, 54, -42, 90,
1250 42, -90, 90, -42, -90, 42, -30, 126,
1251 30, -126, 126, -30, -126, 30, -102, 102,
1252 102, -102, -84, 126, 84, -126, 126, -84,
1253 -126, 84, 36, 36, -36, -36, 66, 66,
1257 const DT_2_6: IviDeltaCB = IviDeltaCB{ quad_radix: 12, data: &[
1258 0, 0, 7, 7, -7, -7, 0, 7,
1259 0, -7, 7, 0, -7, 0, 14, 14,
1260 -14, -14, 7, 21, -7, -21, 21, 7,
1261 -21, -7, -14, 14, 14, -14, -7, 21,
1262 7, -21, 21, -7, -21, 7, 14, 28,
1263 -14, -28, 28, 14, -28, -14, 28, 28,
1264 -28, -28, 0, 35, 0, -35, 35, 0,
1265 -35, 0, -21, 28, 21, -28, 28, -21,
1266 -28, 21, 35, 56, -35, -56, 56, 35,
1267 -56, -35, -14, 42, 14, -42, 42, -14,
1268 -42, 14, 14, 56, -14, -56, 56, 14,
1269 -56, -14, 56, 56, -56, -56, 0, 63,
1270 0, -63, 63, 0, -63, 0, -42, 42,
1271 42, -42, -28, 56, 28, -56, 56, -28,
1272 -56, 28, 35, 91, -35, -91, 91, 35,
1273 -91, -35, 63, 98, -63, -98, 98, 63,
1274 -98, -63, -21, 77, 21, -77, 77, -21,
1275 -77, 21, 14, 98, -14, -98, 98, 14,
1276 -98, -14, 105, 105, -105, -105, -7, 119,
1277 7, -119, 119, -7, -119, 7, -63, 77,
1278 63, -77, 77, -63, -77, 63, -49, 105,
1279 49, -105, 105, -49, -105, 49, -119, 119,
1280 119, -119, 42, 42, -42, -42, 77, 77,
1284 const DT_2_7: IviDeltaCB = IviDeltaCB{ quad_radix: 12, data: &[
1285 0, 0, 8, 8, -8, -8, 0, 8,
1286 0, -8, 8, 0, -8, 0, 16, 16,
1287 -16, -16, 8, 16, -8, -16, 16, 8,
1288 -16, -8, -16, 16, 16, -16, -8, 24,
1289 8, -24, 24, -8, -24, 8, 16, 32,
1290 -16, -32, 32, 16, -32, -16, 32, 32,
1291 -32, -32, 0, 40, 0, -40, 40, 0,
1292 -40, 0, -24, 32, 24, -32, 32, -24,
1293 -32, 24, 40, 64, -40, -64, 64, 40,
1294 -64, -40, -16, 48, 16, -48, 48, -16,
1295 -48, 16, 16, 64, -16, -64, 64, 16,
1296 -64, -16, 64, 64, -64, -64, 0, 72,
1297 0, -72, 72, 0, -72, 0, -48, 48,
1298 48, -48, -32, 64, 32, -64, 64, -32,
1299 -64, 32, 40, 104, -40, -104, 104, 40,
1300 -104, -40, 72, 112, -72, -112, 112, 72,
1301 -112, -72, -24, 88, 24, -88, 88, -24,
1302 -88, 24, 16, 112, -16, -112, 112, 16,
1303 -112, -16, 120, 120, -120, -120, -72, 88,
1304 72, -88, 88, -72, -88, 72, -56, 120,
1305 56, -120, 120, -56, -120, 56, 48, 48,
1306 -48, -48, 88, 88, -88, -88,
1309 const DT_2_8: IviDeltaCB = IviDeltaCB{ quad_radix: 13, data: &[
1310 0, 0, 9, 9, -9, -9, 0, 9,
1311 0, -9, 9, 0, -9, 0, 18, 18,
1312 -18, -18, 9, 27, -9, -27, 27, 9,
1313 -27, -9, -18, 18, 18, -18, -9, 27,
1314 9, -27, 27, -9, -27, 9, 18, 36,
1315 -18, -36, 36, 18, -36, -18, 36, 36,
1316 -36, -36, 0, 45, 0, -45, 45, 0,
1317 -45, 0, -27, 36, 27, -36, 36, -27,
1318 -36, 27, 45, 72, -45, -72, 72, 45,
1319 -72, -45, -18, 54, 18, -54, 54, -18,
1320 -54, 18, 18, 72, -18, -72, 72, 18,
1321 -72, -18, 72, 72, -72, -72, 0, 81,
1322 0, -81, 81, 0, -81, 0, -54, 54,
1323 54, -54, -36, 72, 36, -72, 72, -36,
1324 -72, 36, 45, 117, -45, -117, 117, 45,
1325 -117, -45, 81, 126, -81, -126, 126, 81,
1326 -126, -81, -27, 99, 27, -99, 99, -27,
1327 -99, 27, -81, 99, 81, -99, 99, -81,
1328 -99, 81, 54, 54, -54, -54, 108, 108,
1332 const DT_3_1: IviDeltaCB = IviDeltaCB{ quad_radix: 11, data: &[
1333 0, 0, 2, 2, -2, -2, 0, 3,
1334 0, -3, 3, 0, -3, 0, 6, 6,
1335 -6, -6, 0, 7, 0, -7, 7, 0,
1336 -7, 0, -5, 5, 5, -5, 5, -5,
1337 -5, 5, 6, 11, -6, -11, 11, 6,
1338 -11, -6, 0, 8, 0, -8, 8, 0,
1339 -8, 0, 11, 11, -11, -11, 0, 12,
1340 0, -12, 12, 0, -12, 0, 12, 17,
1341 -12, -17, 17, 12, -17, -12, 17, 17,
1342 -17, -17, 6, 18, -6, -18, 18, 6,
1343 -18, -6, -8, 11, 8, -11, 11, -8,
1344 -11, 8, 0, 15, 0, -15, 15, 0,
1345 -15, 0, 0, 20, 0, -20, 20, 0,
1346 -20, 0, 18, 25, -18, -25, 25, 18,
1347 -25, -18, 11, 25, -11, -25, 25, 11,
1348 -25, -11, 25, 25, -25, -25, -14, 14,
1349 14, -14, 14, -14, -14, 14, 0, 26,
1350 0, -26, 26, 0, -26, 0, -11, 18,
1351 11, -18, 18, -11, -18, 11, -7, 22,
1352 7, -22, 22, -7, -22, 7, 26, 34,
1353 -26, -34, 34, 26, -34, -26, 18, 34,
1354 -18, -34, 34, 18, -34, -18, 34, 34,
1355 -34, -34, 11, 35, -11, -35, 35, 11,
1356 -35, -11, 0, 29, 0, -29, 29, 0,
1357 -29, 0, -19, 22, 19, -22, 22, -19,
1358 -22, 19, -15, 26, 15, -26, 26, -15,
1359 -26, 15, 0, 37, 0, -37, 37, 0,
1360 -37, 0, 27, 44, -27, -44, 44, 27,
1361 -44, -27, 36, 44, -36, -44, 44, 36,
1362 -44, -36, 18, 44, -18, -44, 44, 18,
1363 -44, -18, -10, 33, 10, -33, 33, -10,
1364 -33, 10, 45, 45, -45, -45, 0, 0,
1367 const DT_3_2: IviDeltaCB = IviDeltaCB{ quad_radix: 13, data: &[
1368 0, 0, 0, 2, 0, -2, 2, 0,
1369 -2, 0, 2, 2, -2, -2, 6, 6,
1370 -6, -6, 0, 6, 0, -6, 6, 0,
1371 -6, 0, -4, 4, 4, -4, 10, -6,
1372 -10, 6, 0, -12, 0, 12, -6, -12,
1373 6, -12, -6, 12, 6, 12, -14, 0,
1374 14, 0, 12, 12, -12, -12, 0, -18,
1375 0, 18, 14, -12, -14, 12, -18, -6,
1376 18, -6, -18, 6, 18, 6, -10, -18,
1377 10, -18, -10, 18, 10, 18, -22, 0,
1378 22, 0, 0, -24, 0, 24, -22, -12,
1379 22, -12, -22, 12, 22, 12, -8, -24,
1380 8, -24, -8, 24, 8, 24, -26, -6,
1381 26, -6, -26, 6, 26, 6, -28, 0,
1382 28, 0, 20, 20, -20, -20, -14, -26,
1383 14, 26, -30, -12, 30, 12, -10, -32,
1384 10, 32, -18, -32, 18, 32, -26, -26,
1385 26, 26, -34, -20, 34, 20, -38, -12,
1386 38, 12, -32, -32, 32, 32, 32, 32,
1387 -22, -40, -34, -34, 34, 34,
1390 const DT_3_3: IviDeltaCB = IviDeltaCB{ quad_radix: 13, data: &[
1391 0, 0, 0, 2, 0, -2, 2, 0,
1392 -2, 0, 4, 4, -4, -4, 10, 10,
1393 -10, -10, 0, 10, 0, -10, 10, 0,
1394 -10, 0, -6, 6, 6, -6, 14, -8,
1395 -14, 8, -18, 0, 18, 0, 10, -16,
1396 -10, 16, 0, -24, 0, 24, -24, -8,
1397 24, -8, -24, 8, 24, 8, 18, 18,
1398 -18, -18, 20, -16, -20, 16, -14, -26,
1399 14, -26, -14, 26, 14, 26, -30, 0,
1400 30, 0, 0, -34, 0, 34, -34, -8,
1401 34, -8, -34, 8, 34, 8, -30, -18,
1402 30, -18, -30, 18, 30, 18, -10, -34,
1403 10, -34, -10, 34, 10, 34, -20, -34,
1404 20, 34, -40, 0, 40, 0, 30, 30,
1405 -30, -30, -40, -18, 40, 18, 0, -44,
1406 0, 44, -16, -44, 16, 44, -36, -36,
1407 -36, -36, 36, 36, -26, -44, 26, 44,
1408 -46, -26, 46, 26, -52, -18, 52, 18,
1409 -20, -54, -44, -44, 44, 44, -32, -54,
1410 -46, -46, -46, -46, 46, 46,
1413 const DT_3_4: IviDeltaCB = IviDeltaCB{ quad_radix: 13, data: &[
1414 0, 0, 0, 4, 0, -4, 4, 0,
1415 -4, 0, 4, 4, -4, -4, 12, 12,
1416 -12, -12, 0, 12, 0, -12, 12, 0,
1417 -12, 0, -8, 8, 8, -8, 8, -16,
1418 -8, 16, 0, -24, 0, 24, -24, -8,
1419 24, -8, -24, 8, 24, 8, 20, -16,
1420 -20, 16, -28, 0, 28, 0, -16, -24,
1421 16, -24, -16, 24, 16, 24, 0, -32,
1422 0, 32, -28, -16, 28, -16, -28, 16,
1423 28, 16, -8, -32, 8, -32, -32, -8,
1424 32, -8, -32, 8, 32, 8, -8, 32,
1425 8, 32, 24, 24, -24, -24, 24, -24,
1426 -24, 24, -20, -32, 20, 32, -40, 0,
1427 40, 0, -40, -16, 40, 16, 0, -44,
1428 0, -44, -44, 0, 44, 0, 0, 44,
1429 0, 44, -32, -32, 32, 32, -16, -44,
1430 16, 44, -24, -44, -44, -24, 44, 24,
1431 24, 44, -48, -16, 48, 16, -36, -36,
1432 -36, -36, 36, 36, 36, 36, -20, -52,
1433 40, 40, -40, -40, -32, -52,
1436 const DT_3_5: IviDeltaCB = IviDeltaCB{ quad_radix: 13, data: &[
1437 0, 0, 2, 2, -2, -2, 6, 6,
1438 -6, -6, 12, 12, -12, -12, 20, 20,
1439 -20, -20, 32, 32, -32, -32, 46, 46,
1440 -46, -46, 0, 0, 0, 0, 0, 0,
1441 0, 0, 0, 0, 0, 0, 0, 0,
1442 0, 0, 0, 0, 0, 0, 0, 0,
1443 0, 0, 0, 0, 0, 0, 0, 0,
1444 0, 0, 0, 0, 0, 0, 0, 0,
1445 0, 0, 0, 0, 0, 0, 0, 0,
1446 0, 0, 0, 0, 0, 0, 0, 0,
1447 0, 0, 0, 0, 0, 0, 0, 0,
1448 0, 0, 0, 0, 0, 0, 0, 0,
1449 0, 0, 0, 0, 0, 0, 0, 0,
1450 0, 0, 0, 0, 0, 0, 0, 0,
1451 0, 0, 0, 0, 0, 0, 0, 0,
1452 0, 0, 0, 0, 0, 0, 0, 0,
1453 0, 0, 0, 0, 0, 0, 0, 0,
1454 0, 0, 0, 0, 0, 0, 0, 0,
1455 0, 0, 0, 0, 0, 0, 0, 0,
1459 const IVI3_DELTA_CBS: [&IviDeltaCB; 24] = [
1460 &DT_1_1, &DT_1_2, &DT_1_3, &DT_1_4, &DT_1_5, &DT_1_6, &DT_1_7, &DT_1_8,
1461 &DT_2_1, &DT_2_2, &DT_2_3, &DT_2_4, &DT_2_5, &DT_2_6, &DT_2_7, &DT_2_8,
1462 &DT_3_1, &DT_3_2, &DT_3_3, &DT_3_4, &DT_3_5, &DT_3_5, &DT_3_5, &DT_3_5