split NihAV into subcrates
[nihav.git] / nihav-indeo / src / codecs / indeo3.rs
1 use std::rc::Rc;
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::*;
7 use std::io::SeekFrom;
8 use std::mem;
9
10 struct IviDeltaCB {
11 quad_radix: u8,
12 data: &'static [i8],
13 }
14
15 #[derive(Clone, Copy)]
16 struct MV {
17 x: i8,
18 y: i8
19 }
20
21 struct Buffers {
22 width: usize,
23 height: usize,
24 buf1: Vec<u8>,
25 buf2: Vec<u8>,
26 fbuf: bool,
27 }
28
29 const DEFAULT_PIXEL: u8 = 0x40;
30
31 impl Buffers {
32 fn new() -> Self { Buffers { width: 0, height: 0, buf1: Vec::new(), buf2: Vec::new(), fbuf: true } }
33 fn reset(&mut self) {
34 self.width = 0;
35 self.height = 0;
36 self.buf1.truncate(0);
37 self.buf2.truncate(0);
38 }
39 fn alloc(&mut self, w: usize, h: usize) {
40 self.width = w;
41 self.height = h;
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);
44 }
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 }
48 }
49 fn get_offset(&mut self, planeno: usize) -> usize {
50 match planeno {
51 1 => self.width * self.height,
52 2 => self.width * self.height + (self.width >> 2) * (self.height >> 2),
53 _ => 0,
54 }
55 }
56 fn fill_framebuf(&mut self, fbuf: &mut NAVideoBuffer<u8>) {
57 for planeno in 0..3 {
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();
66 for _ in 0..height {
67 for x in 0..width {
68 dst[doff + x] = src[soff + x] * 2;
69 }
70 soff += sstride;
71 doff += dstride;
72 }
73 }
74 }
75 fn copy_block(&mut self, doff: usize, soff: usize, stride: usize, w: usize, h: usize) {
76 let mut sidx = soff;
77 let mut didx = doff;
78 if self.fbuf {
79 for _ in 0..h {
80 for i in 0..w { self.buf1[didx + i] = self.buf2[sidx + i]; }
81 sidx += stride;
82 didx += stride;
83 }
84 } else {
85 for _ in 0..h {
86 for i in 0..w { self.buf2[didx + i] = self.buf1[sidx + i]; }
87 sidx += stride;
88 didx += stride;
89 }
90 }
91 }
92 fn fill_block(&mut self, doff: usize, stride: usize, w: usize, h: usize, topline: bool) {
93 let mut didx = doff;
94 let mut buf: [u8; 8] = [0; 8];
95 if topline {
96 if self.fbuf {
97 for _ in 0..h {
98 for i in 0..w { self.buf1[didx + i] = DEFAULT_PIXEL; }
99 didx += stride;
100 }
101 } else {
102 for _ in 0..h {
103 for i in 0..w { self.buf2[didx + i] = DEFAULT_PIXEL; }
104 didx += stride;
105 }
106 }
107 } else {
108 if self.fbuf {
109 for i in 0..w { buf[i] = self.buf1[didx - stride + i]; }
110 for _ in 0..h {
111 for i in 0..w { self.buf1[didx + i] = buf[i]; }
112 didx += stride;
113 }
114 } else {
115 for i in 0..w { buf[i] = self.buf2[didx - stride + i]; }
116 for _ in 0..h {
117 for i in 0..w { self.buf2[didx + i] = buf[i]; }
118 didx += stride;
119 }
120 }
121 }
122 }
123 }
124
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; }
131 }
132
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; }
139 if !topline {
140 for i in 0..4 { dst[i] = (dst[i + stride] + dst[i]) >> 1; }
141 } else {
142 for i in 0..4 { dst[i] = dst[i + stride]; }
143 }
144 }
145
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; }
153 }
154
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; }
162 }
163
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)] };
168 if !firstline {
169 for i in 0..8 { dst[i + stride] = dst[i ].wrapping_add(deltas[i >> 1]) & 0x7F; }
170 } else {
171 for i in 0..8 { dst[i + stride] = dst[i & !1].wrapping_add(deltas[i >> 1]) & 0x7F; }
172 }
173 if !topline {
174 for i in 0..8 { dst[i] = (dst[i + stride] + dst[i]) >> 1; }
175 } else {
176 for i in 0..8 { dst[i] = dst[i + stride]; }
177 }
178 }
179
180 fn copy_line_top(bufs: &mut Buffers, off: usize, stride: usize, bw: usize, topline: bool) {
181 let mut buf: [u8; 8] = [0; 8];
182 if !topline {
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]; }
186 } else {
187 for i in 0..bw { buf[i] = DEFAULT_PIXEL; }
188 }
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]; }
192 }
193
194 fn copy_line_top4x4(bufs: &mut Buffers, off: usize, stride: usize, topline: bool) {
195 copy_line_top(bufs, off, stride, 4, topline);
196 }
197
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);
201 }
202
203 fn copy_line_top8x8(bufs: &mut Buffers, off: usize, stride: usize, topline: bool) {
204 let mut buf: [u8; 8] = [0; 8];
205 if !topline {
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]; }
209 } else {
210 for i in 0..8 { buf[i] = DEFAULT_PIXEL; }
211 }
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]; }
215 }
216
217 fn fill_block8x8(bufs: &mut Buffers, doff: usize, stride: usize, h: usize, topline: bool, firstline: bool) {
218 let mut didx = doff;
219 let mut buf: [u8; 8] = [0; 8];
220 if firstline {
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]; }
224 } else {
225 for i in 0..8 { buf[i] = bufs.buf1[doff - stride + i]; }
226 }
227 if topline && !firstline {
228 for i in 0..4 { buf[i * 2 + 1] = buf[i * 2]; }
229 if bufs.fbuf {
230 for i in 0..8 { bufs.buf1[doff + i] = (bufs.buf1[doff - stride + i] + buf[i]) >> 1; }
231 } else {
232 for i in 0..8 { bufs.buf2[doff + i] = (bufs.buf2[doff - stride + i] + buf[i]) >> 1; }
233 }
234 }
235
236 let start = if !topline { 0 } else { 1 };
237 if bufs.fbuf {
238 for _ in start..h {
239 for i in 0..8 { bufs.buf1[didx + i] = buf[i]; }
240 didx += stride;
241 }
242 } else {
243 for _ in start..h {
244 for i in 0..8 { bufs.buf2[didx + i] = buf[i]; }
245 didx += stride;
246 }
247 }
248 }
249
250 struct Indeo3Decoder {
251 info: Rc<NACodecInfo>,
252 bpos: u8,
253 bbuf: u8,
254 width: u16,
255 height: u16,
256 mvs: Vec<MV>,
257 altquant: [u8; 16],
258 vq_offset: u8,
259 bufs: Buffers,
260 }
261
262 #[derive(Clone,Copy)]
263 struct IV3Cell {
264 x: u16,
265 y: u16,
266 w: u16,
267 h: u16,
268 d: u8,
269 vqt: bool,
270 mv: Option<MV>,
271 }
272
273 impl IV3Cell {
274 fn new(w: u16, h: u16) -> Self {
275 IV3Cell { x: 0, y: 0, w: w, h: h, d: 20, vqt: false, mv: None }
276 }
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;
281 cell1.h = h1;
282 cell1.d -= 1;
283 let mut cell2 = *self;
284 cell2.y += h1;
285 cell2.h = h2;
286 cell2.d -= 1;
287 (cell1, cell2)
288 }
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 }
292 } else {
293 if self.w > 2 { ((self.w + 2) >> 2) << 1 } else { 1 }
294 };
295 let w2 = self.w - w1;
296 let mut cell1 = *self;
297 cell1.w = w1;
298 cell1.d -= 1;
299 let mut cell2 = *self;
300 cell2.x += w1;
301 cell2.w = w2;
302 cell2.d -= 1;
303 (cell1, cell2)
304 }
305 fn no_mv(&self) -> bool { match self.mv { None => true, Some(_) => false } }
306 }
307
308 struct CellDecParams {
309 tab: [usize; 2],
310 bw: u16,
311 bh: u16,
312 swap_q: [bool; 2],
313 hq: bool,
314 apply_delta: fn (&mut Buffers, usize, usize, &[u8], bool, bool),
315 copy_line_top: fn (&mut Buffers, usize, usize, bool),
316 }
317
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);
320
321 const H_SPLIT: u8 = 0;
322 const V_SPLIT: u8 = 1;
323 const SKIP_OR_TREE: u8 = 2;
324
325 impl Indeo3Decoder {
326 fn new() -> Self {
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() }
331 }
332
333 fn br_reset(&mut self) {
334 self.bpos = 0;
335 self.bbuf = 0;
336 }
337
338 fn get_2bits(&mut self, br: &mut ByteReader) -> DecoderResult<u8> {
339 if self.bpos == 0 {
340 self.bbuf = br.read_byte()?;
341 self.bpos = 8;
342 }
343 self.bpos -= 2;
344 Ok((self.bbuf >> self.bpos) & 0x3)
345 }
346
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 };
352
353 validate!((((cell.w * 4) % params.bw) == 0) && (((cell.h * 4) % params.bh) == 0));
354
355 let mut run_blocks = 0;
356 let mut run_skip = false;
357
358 let mut didx: usize = ((cell.x*4) as usize) + ((cell.y * 4) as usize) * stride + off;
359 let mut sidx: usize;
360 if cell.no_mv() {
361 sidx = 0;
362 } else {
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;
370 validate!(l >= 0);
371 validate!(t >= 0);
372 validate!(r <= (self.width as i16));
373 validate!(b <= (self.height as i16));
374 sidx = (l as usize) + (t as usize) * stride + off;
375 }
376 for y in 0..blk_h {
377 let mut xoff: usize = 0;
378 for _ in 0..blk_w {
379 if run_blocks > 0 {
380 if !run_skip || !cell.no_mv() {
381 if !(params.bw == 8 && cell.no_mv()) {
382 if !cell.no_mv() {
383 self.bufs.copy_block(didx + xoff, sidx + xoff, stride,
384 params.bw as usize, params.bh as usize);
385 } else {
386 self.bufs.fill_block(didx + xoff, stride,
387 params.bw as usize, params.bh as usize,
388 (cell.y == 0) && (y == 0));
389 }
390 } else {
391 fill_block8x8(&mut self.bufs,
392 didx + xoff, stride, 8,
393 y == 0, (cell.y == 0) && (y == 0));
394 }
395 }
396 run_blocks -= 1;
397 } else {
398 let mut line: usize = 0;
399 while line < 4 {
400 let c = br.read_byte()?;
401 if c < 0xF8 {
402 let delta_tab = if params.hq {
403 IVI3_DELTA_CBS[params.tab[line & 1]]
404 } else {
405 IVI3_DELTA_CBS[params.tab[1]]
406 };
407 let mut idx1;
408 let mut idx2;
409 if (c as usize) < delta_tab.data.len()/2 {
410 idx1 = br.read_byte()? as usize;
411 validate!(idx1 < delta_tab.data.len());
412 idx2 = c as usize;
413 } else {
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);
419 }
420 }
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);
427 if cell.no_mv() {
428 (params.copy_line_top)(&mut self.bufs,
429 didx + xoff + line * scale * stride,
430 stride, topline);
431 } else {
432 self.bufs.copy_block(didx + xoff + line * scale * stride,
433 sidx + xoff + line * scale * stride,
434 stride, params.bw as usize, scale);
435 }
436 (params.apply_delta)(&mut self.bufs,
437 didx + xoff + line * scale * stride,
438 stride, &deltas, topline, first_line);
439 line += 1;
440 } else {
441 let mut tocopy: usize = 0;
442 let mut do_copy = true;
443 if c == 0xF8 { return Err(DecoderError::InvalidData); }
444 if c == 0xF9 {
445 run_blocks = 1;
446 run_skip = true;
447 validate!(line == 0);
448 tocopy = 4;
449 do_copy = !cell.no_mv();
450 }
451 if c == 0xFA {
452 validate!(line == 0);
453 tocopy = 4;
454 do_copy = !cell.no_mv();
455 }
456 if c == 0xFB {
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;
461 tocopy = 4 - line;
462 if params.bw == 4 && cell.no_mv() && run_skip {
463 do_copy = false;
464 }
465 }
466 if c == 0xFC {
467 run_skip = false;
468 run_blocks = 1;
469 tocopy = 4 - line;
470 }
471 if c >= 0xFD {
472 let nl = 257 - (c as i16) - (line as i16);
473 validate!(nl > 0);
474 tocopy = nl as usize;
475 }
476 if do_copy {
477 if !(params.bw == 8 && cell.no_mv()) {
478 if !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,
482 tocopy * scale);
483 } else {
484 self.bufs.fill_block(didx + xoff + line * scale * stride,
485 stride, params.bw as usize,
486 tocopy * scale,
487 (cell.y == 0) && (y == 0) && (line == 0));
488 }
489 } else {
490 fill_block8x8(&mut self.bufs,
491 didx + xoff + line * 2 * stride,
492 stride, tocopy * 2,
493 (y == 0) && (line == 0),
494 (cell.y == 0) && (y == 0) && (line == 0));
495 }
496 }
497 line += tocopy;
498 }
499 }
500 }
501 xoff += params.bw as usize;
502 }
503 didx += stride * (params.bh as usize);
504 sidx += stride * (params.bh as usize);
505 }
506 Ok(())
507 }
508
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;
518 validate!(l >= 0);
519 validate!(t >= 0);
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);
525 Ok(())
526 }
527
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;
533
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;
540 }
541
542 idx1 += self.vq_offset as usize;
543 idx2 += self.vq_offset as usize;
544 validate!((idx1 < 24) && (idx2 < 24));
545
546 let mut cp = CellDecParams {
547 tab: [idx2, idx1],
548 bw: 0, bh: 0,
549 swap_q: [idx2 >= 16, idx1 >= 16],
550 hq: false,
551 apply_delta: apply_delta4x4,
552 copy_line_top: copy_line_top4x4,
553 };
554 if (mode == 0) || (mode == 1) {
555 cp.bw = 4;
556 cp.bh = 4;
557 cp.hq = true;
558 } else if (mode == 3) || (mode == 4) {
559 if !cell.no_mv() { return Err(DecoderError::InvalidData); }
560 cp.bw = 4;
561 cp.bh = 8;
562 cp.hq = true;
563 cp.apply_delta = apply_delta4x8;
564 cp.copy_line_top = copy_line_top4x8;
565 } else if mode == 10 {
566 if !cell.no_mv() {
567 validate!(!intra);
568 cp.apply_delta = apply_delta8x8p;
569 } else {
570 cp.apply_delta = apply_delta8x8i;
571 }
572 cp.bw = 8;
573 cp.bh = 8;
574 cp.copy_line_top = copy_line_top8x8;
575 } else if mode == 11 {
576 if cell.no_mv() { return Err(DecoderError::InvalidData); }
577 validate!(!intra);
578 cp.bw = 4;
579 cp.bh = 8;
580 cp.apply_delta = apply_delta4x8m11;
581 cp.copy_line_top = copy_line_top4x8;
582 } else {
583 return Err(DecoderError::InvalidData);
584 }
585 self.decode_cell_data(br, cell, off, stride, cp)
586 }
587
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)?;
591 if op == H_SPLIT {
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)?;
597 Ok(())
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)?;
604 Ok(())
605 } else if op == SKIP_OR_TREE {
606 if !cell.vqt {
607 let mut newcell = cell;
608 newcell.vqt = true;
609 newcell.d -= 1;
610 self.parse_tree(br, newcell, off, stride, stripw, intra)
611 } else {
612 validate!(!intra);
613 let code = self.get_2bits(br)?;
614 validate!(code < 2);
615 if code == 1 { return Err(DecoderError::NotImplemented); }
616 self.copy_cell(cell, off, stride)
617 }
618 } else {
619 if !cell.vqt {
620 let mut newcell = cell;
621 newcell.vqt = true;
622 newcell.d -= 1;
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)
627 } else {
628 self.decode_cell(br, cell, off, stride, intra)
629 }
630 }
631 }
632
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))?;
638
639 let nvec = br.read_u32le()?;
640 validate!(nvec == 0); // for intra there should be no mc_vecs
641 self.mvs.truncate(0);
642 for _ in 0..nvec {
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 });
646 }
647
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);
651 self.br_reset();
652 self.parse_tree(br, cell, offs, stride, if planeno > 0 { 10 } else { 40 }, true)?;
653 validate!(br.tell() <= end);
654 Ok(())
655 }
656
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))?;
662
663 let nvec = br.read_u32le()?;
664 validate!(nvec <= 256); // for intra there should be no mc_vecs
665 self.mvs.truncate(0);
666 for _ in 0..nvec {
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 });
670 }
671
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);
675 self.br_reset();
676 self.parse_tree(br, cell, offs, stride, if planeno > 0 { 10 } else { 40 }, false)?;
677 validate!(br.tell() <= end);
678 Ok(())
679 }
680 }
681
682 const FLAG_KEYFRAME: u16 = 1 << 2;
683 const FLAG_NONREF: u16 = 1 << 8;
684
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()));
693 self.bufs.reset();
694 Ok(())
695 } else {
696 Err(DecoderError::InvalidData)
697 }
698 }
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()?;
707
708 let data_start = br.tell();
709
710 if (frameno ^ hdr_2 ^ size ^ FRMH_TAG) != check {
711 return Err(DecoderError::InvalidData);
712 }
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()?;
720 self.vq_offset = cb;
721 br.read_skip(3)?;
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);
729 }
730 self.width = width;
731 self.height = height;
732
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); }
739
740 br.read_skip(4)?;
741 br.read_buf(&mut self.altquant)?;
742
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; }
746 let mut uend = size;
747 if (yoff < uend) && (yoff > uoff) { uend = yoff; }
748 if (voff < uend) && (voff > uoff) { uend = voff; }
749 let mut vend = size;
750 if (yoff < vend) && (yoff > voff) { vend = yoff; }
751 if (uoff < vend) && (uoff > voff) { vend = uoff; }
752
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);
765 if intraframe {
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)?;
769 } else {
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)?;
773 }
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)))
780 }
781 }
782
783 pub fn get_decoder() -> Box<NADecoder> {
784 Box::new(Indeo3Decoder::new())
785 }
786
787 #[cfg(test)]
788 mod test {
789 use crate::test::dec_video::test_file_decoding;
790 #[test]
791 fn test_indeo3() {
792 test_file_decoding("avi", "assets/iv32_example.avi", Some(10), true, false, None);
793 }
794 }
795
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,
846 ]};
847
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,
889 ]};
890
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,
925 -84, -84,
926 ]};
927
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,
958 ]};
959
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,
986 -69, -69,
987 ]};
988
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,
1013 -80, -80,
1014 ]};
1015
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,
1039 ]};
1040
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,
1061 -104, -104,
1062 ]};
1063
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,
1114 ]};
1115
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,
1157 ]};
1158
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,
1193 -84, -84,
1194 ]};
1195
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,
1226 ]};
1227
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,
1254 -66, -66,
1255 ]};
1256
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,
1281 -77, -77,
1282 ]};
1283
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,
1307 ]};
1308
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,
1329 -108, -108,
1330 ]};
1331
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,
1365 ]};
1366
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,
1388 ]};
1389
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,
1411 ]};
1412
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,
1434 ]};
1435
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,
1456 0, 0, 0, 0, 0, 0,
1457 ]};
1458
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
1463 ];