]> git.nihav.org Git - nihav.git/blame_incremental - nihav-indeo/src/codecs/ivibr.rs
smacker: fix version 4 support
[nihav.git] / nihav-indeo / src / codecs / ivibr.rs
... / ...
CommitLineData
1use std::mem;
2use nihav_core::io::bitreader::*;
3//use io::intcode::*;
4use nihav_core::codecs::*;
5use nihav_core::frame::NABufferRef;
6use super::ivi::*;
7use super::ividsp::*;
8
9pub fn scale_mv(val: i32, scale: u8) -> i32 {
10 (val + (if val > 0 { 1 } else { 0 }) + i32::from(scale) - 1) >> scale
11}
12
13#[derive(Clone,Copy)]
14pub struct IVICodebook {
15 len: usize,
16 bits: [u8; 16],
17 offs: [u32; 16],
18}
19
20impl IVICodebook {
21 pub fn init(&self) -> Self {
22 let mut cb = *self;
23 let mut base: u32 = 0;
24 for i in 0..cb.len {
25 cb.offs[i] = base;
26 base += 1 << cb.bits[i];
27 }
28 cb
29 }
30}
31
32pub const IVI_CB_ZERO: IVICodebook = IVICodebook { len: 0, bits: [0; 16], offs: [0; 16] };
33
34const IVI_REV0: [u32; 1] = [0];
35const IVI_REV1: [u32; 2] = [0, 1];
36const IVI_REV2: [u32; 4] = [0, 2, 1, 3];
37const IVI_REV3: [u32; 8] = [0, 4, 2, 6, 1, 5, 3, 7];
38const IVI_REV4: [u32; 16] = [ 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15];
39const IVI_REV5: [u32; 32] = [ 0, 16, 8, 24, 4, 20, 12, 28, 2, 18, 10, 26, 6, 22, 14, 30, 1, 17, 9, 25, 5, 21, 13, 29, 3, 19, 11, 27, 7, 23, 15, 31];
40const IVI_REV6: [u32; 64] = [ 0, 32, 16, 48, 8, 40, 24, 56, 4, 36, 20, 52, 12, 44, 28, 60, 2, 34, 18, 50, 10, 42, 26, 58, 6, 38, 22, 54, 14, 46, 30, 62, 1, 33, 17, 49, 9, 41, 25, 57, 5, 37, 21, 53, 13, 45, 29, 61, 3, 35, 19, 51, 11, 43, 27, 59, 7, 39, 23, 55, 15, 47, 31, 63];
41const IVI_REV7: [u32; 128] = [ 0, 64, 32, 96, 16, 80, 48, 112, 8, 72, 40, 104, 24, 88, 56, 120, 4, 68, 36, 100, 20, 84, 52, 116, 12, 76, 44, 108, 28, 92, 60, 124, 2, 66, 34, 98, 18, 82, 50, 114, 10, 74, 42, 106, 26, 90, 58, 122, 6, 70, 38, 102, 22, 86, 54, 118, 14, 78, 46, 110, 30, 94, 62, 126, 1, 65, 33, 97, 17, 81, 49, 113, 9, 73, 41, 105, 25, 89, 57, 121, 5, 69, 37, 101, 21, 85, 53, 117, 13, 77, 45, 109, 29, 93, 61, 125, 3, 67, 35, 99, 19, 83, 51, 115, 11, 75, 43, 107, 27, 91, 59, 123, 7, 71, 39, 103, 23, 87, 55, 119, 15, 79, 47, 111, 31, 95, 63, 127];
42const IVI_REV8: [u32; 256] = [ 0, 128, 64, 192, 32, 160, 96, 224, 16, 144, 80, 208, 48, 176, 112, 240, 8, 136, 72, 200, 40, 168, 104, 232, 24, 152, 88, 216, 56, 184, 120, 248, 4, 132, 68, 196, 36, 164, 100, 228, 20, 148, 84, 212, 52, 180, 116, 244, 12, 140, 76, 204, 44, 172, 108, 236, 28, 156, 92, 220, 60, 188, 124, 252, 2, 130, 66, 194, 34, 162, 98, 226, 18, 146, 82, 210, 50, 178, 114, 242, 10, 138, 74, 202, 42, 170, 106, 234, 26, 154, 90, 218, 58, 186, 122, 250, 6, 134, 70, 198, 38, 166, 102, 230, 22, 150, 86, 214, 54, 182, 118, 246, 14, 142, 78, 206, 46, 174, 110, 238, 30, 158, 94, 222, 62, 190, 126, 254, 1, 129, 65, 193, 33, 161, 97, 225, 17, 145, 81, 209, 49, 177, 113, 241, 9, 137, 73, 201, 41, 169, 105, 233, 25, 153, 89, 217, 57, 185, 121, 249, 5, 133, 69, 197, 37, 165, 101, 229, 21, 149, 85, 213, 53, 181, 117, 245, 13, 141, 77, 205, 45, 173, 109, 237, 29, 157, 93, 221, 61, 189, 125, 253, 3, 131, 67, 195, 35, 163, 99, 227, 19, 147, 83, 211, 51, 179, 115, 243, 11, 139, 75, 203, 43, 171, 107, 235, 27, 155, 91, 219, 59, 187, 123, 251, 7, 135, 71, 199, 39, 167, 103, 231, 23, 151, 87, 215, 55, 183, 119, 247, 15, 143, 79, 207, 47, 175, 111, 239, 31, 159, 95, 223, 63, 191, 127, 255];
43
44const IVI_REVS: [&[u32]; 9] = [ &IVI_REV0, &IVI_REV1, &IVI_REV2, &IVI_REV3, &IVI_REV4, &IVI_REV5, &IVI_REV6, &IVI_REV7, &IVI_REV8];
45
46pub trait IVICodebookReader {
47 fn read_ivi_codebook_desc(&mut self, mb_cb: bool, try_default: bool) -> DecoderResult<IVICodebook>;
48 fn read_ivi_cb(&mut self, cb: &IVICodebook) -> BitReaderResult<u32>;
49 fn read_ivi_cb_s(&mut self, cb: &IVICodebook) -> BitReaderResult<i32>;
50}
51
52impl<'a> IVICodebookReader for BitReader<'a> {
53 fn read_ivi_codebook_desc(&mut self, mb_cb: bool, desc_coded: bool) -> DecoderResult<IVICodebook> {
54 if !desc_coded {
55 if mb_cb {
56 Ok(IVI_MB_CB[7].init())
57 } else {
58 Ok(IVI_BLK_CB[7].init())
59 }
60 } else {
61 let idx = self.read(3)? as usize;
62 if idx != 7 {
63 if mb_cb {
64 Ok(IVI_MB_CB[idx].init())
65 } else {
66 Ok(IVI_BLK_CB[idx].init())
67 }
68 } else {
69 let mut cb = IVI_CB_ZERO;
70 cb.len = self.read(4)? as usize;
71 if cb.len == 0 { return Err(DecoderError::InvalidData); }
72 for i in 0..cb.len {
73 cb.bits[i] = self.read(4)? as u8;
74 }
75 Ok(cb.init())
76 }
77 }
78 }
79 #[inline(always)]
80 fn read_ivi_cb(&mut self, cb: &IVICodebook) -> BitReaderResult<u32> {
81/* let pfx = if cb.len == 1 { 0 } else { self.read_code(UintCodeType::LimitedUnary((cb.len - 1) as u32, 0))? as usize };
82 let nbits = cb.bits[pfx];
83 let mut base: u32 = 0;
84 for i in 0..pfx { base += 1 << cb.bits[i]; }
85 let rval = self.read(nbits)?;
86 let add = reverse_bits(rval, nbits);
87 Ok(base + add)*/
88 if cb.len > 1 {
89 let len = (!self.peek(16)).trailing_zeros() as usize;
90 let pfx;
91 if len >= cb.len - 1 {
92 pfx = cb.len - 1;
93 self.skip((cb.len - 1) as u32)?;
94 } else {
95 pfx = len;
96 self.skip((len + 1) as u32)?;
97 }
98 let nbits = cb.bits[pfx];
99 let base = cb.offs[pfx];
100 let rval = self.read(nbits)?;
101 let add = IVI_REVS[nbits as usize][rval as usize];
102 Ok(base + add)
103 } else {
104 let nbits = cb.bits[0];
105 Ok(IVI_REVS[nbits as usize][self.read(nbits)? as usize])
106 }
107 }
108 #[inline(always)]
109 fn read_ivi_cb_s(&mut self, cb: &IVICodebook) -> BitReaderResult<i32> {
110 let v = self.read_ivi_cb(cb)?;
111 if v == 0 {
112 Ok(0)
113 } else {
114 let sign = (v & 1) == 1;
115 let val = (v >> 1) as i32;
116 if sign {
117 Ok(val + 1)
118 } else {
119 Ok(-val)
120 }
121 }
122 }
123}
124
125pub const IVI_MB_CB: &[IVICodebook; 8] = &[
126 IVICodebook { len: 8, bits: [ 0, 4, 5, 4, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] },
127 IVICodebook { len: 12, bits: [ 0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2, 0, 0, 0, 0 ], offs: [0; 16] },
128 IVICodebook { len: 12, bits: [ 0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2, 0, 0, 0, 0 ], offs: [0; 16] },
129 IVICodebook { len: 12, bits: [ 0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 0, 0, 0, 0 ], offs: [0; 16] },
130 IVICodebook { len: 13, bits: [ 0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1, 0, 0, 0 ], offs: [0; 16] },
131 IVICodebook { len: 9, bits: [ 0, 4, 4, 4, 4, 3, 3, 3, 2, 0, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] },
132 IVICodebook { len: 10, bits: [ 0, 4, 4, 4, 4, 3, 3, 2, 2, 2, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] },
133 IVICodebook { len: 12, bits: [ 0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2, 0, 0, 0, 0 ], offs: [0; 16] }
134];
135
136pub const IVI_BLK_CB: &[IVICodebook; 8] = &[
137 IVICodebook { len: 10, bits: [ 1, 2, 3, 4, 4, 7, 5, 5, 4, 1, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] },
138 IVICodebook { len: 11, bits: [ 2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2, 0, 0, 0, 0, 0 ], offs: [0; 16] },
139 IVICodebook { len: 12, bits: [ 2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1, 0, 0, 0, 0 ], offs: [0; 16] },
140 IVICodebook { len: 13, bits: [ 3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1, 0, 0, 0 ], offs: [0; 16] },
141 IVICodebook { len: 11, bits: [ 3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2, 0, 0, 0, 0, 0 ], offs: [0; 16] },
142 IVICodebook { len: 13, bits: [ 3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1, 0, 0, 0 ], offs: [0; 16] },
143 IVICodebook { len: 13, bits: [ 3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1, 0, 0, 0 ], offs: [0; 16] },
144 IVICodebook { len: 9, bits: [ 3, 4, 4, 5, 5, 5, 6, 5, 5, 0, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] }
145];
146
147#[allow(clippy::many_single_char_names)]
148fn read_trans_band_header(br: &mut BitReader, w: usize, h: usize, dst: &mut [i16], dstride: usize) -> DecoderResult<()> {
149 let _color_plane = br.read(2)?;
150 let _bit_depth = br.read(3)?;
151 let dirty_rects = br.read(8)? as usize;
152 for _ in 0..dirty_rects {
153 let _x = br.read(16)?;
154 let _y = br.read(16)?;
155 let _l = br.read(16)?;
156 let _r = br.read(16)?;
157 }
158 let has_trans_color = br.read_bool()?;
159 if has_trans_color {
160 let _r = br.read(8)?;
161 let _g = br.read(8)?;
162 let _b = br.read(8)?;
163 }
164
165 br.skip(1)?;
166
167 let mut cb = IVI_CB_ZERO;
168 cb.len = br.read(4)? as usize;
169 if cb.len == 0 { return Err(DecoderError::InvalidData); }
170 for i in 0..cb.len {
171 cb.bits[i] = br.read(4)? as u8;
172 }
173 cb = cb.init();
174 br.align();
175
176let tile_start = br.tell();
177 let empty = br.read_bool()?;
178 if !empty {
179 br.read_bool()?;
180 let mut len = br.read(8)? as usize;
181 if len == 255 {
182 len = br.read(24)? as usize;
183 }
184 br.align();
185let tile_end = tile_start + len * 8;
186
187 let first_val = br.read_bool()?;
188
189 let mut _dec_size = 0;
190 let mut x = 0;
191 let mut y = 0;
192 let mut fill = if !first_val { 255-128 } else { 0-128 };
193 let tr_w = (w + 31) & !31;
194 while br.tell() < tile_end {
195 let code = br.read_ivi_cb(&cb)? as usize;
196 if code == 0 {
197 _dec_size += 255;
198 for _ in 0..255 {
199 if (x < w) && (y < h) {
200 dst[x + y * dstride] = fill;
201 }
202 x += 1;
203 if x == tr_w {
204 x = 0;
205 y += 1;
206 }
207 }
208 } else {
209 _dec_size += code;
210 for _ in 0..code {
211 if (x < w) && (y < h) {
212 dst[x + y * dstride] = fill;
213 }
214 x += 1;
215 if x == tr_w {
216 x = 0;
217 y += 1;
218 }
219 }
220 fill = !fill;
221 }
222 }
223 br.align();
224 } else {
225 }
226
227 Ok(())
228}
229
230#[allow(clippy::collapsible_else_if)]
231fn decode_block8x8(br: &mut BitReader, blk_cb: &IVICodebook, rvmap: &RVMap, tables: &TxParams8x8, is_intra: bool, is_2d: bool, prev_dc: &mut i32, quant: u8, coeffs: &mut [i32; 64], transform: TrFunc) -> DecoderResult<()> {
232 let mut idx: isize = -1;
233 let quant_mat = if is_intra { tables.quant_intra } else { tables.quant_inter };
234 while idx <= 64 {
235 let c = br.read_ivi_cb(blk_cb)?;
236 if c == rvmap.eob_sym { break; }
237 let run;
238 let val: i32;
239 if c != rvmap.esc_sym {
240 validate!(c < 256);
241 run = rvmap.runtab[c as usize] as isize;
242 val = rvmap.valtab[c as usize] as i32;
243 } else {
244 run = (br.read_ivi_cb(blk_cb)? as isize) + 1;
245 let lo = br.read_ivi_cb(blk_cb)?;
246 let hi = br.read_ivi_cb(blk_cb)?;
247 let v = (hi << 6) + lo;
248 if v == 0 {
249 val = 0; // should not happen but still...
250 } else {
251 let vv = (v >> 1) as i32;
252 if (v & 1) != 0 {
253 val = vv + 1;
254 } else {
255 val = -vv;
256 }
257 }
258 }
259 idx += run;
260 validate!((0..64).contains(&idx));
261
262 let spos = tables.scan[idx as usize];
263 let q = (u32::from(quant_mat[spos]) * u32::from(quant)) >> 9;
264 if q > 1 {
265 let qq = q as i32;
266 let bias = (((q ^ 1) - 1) >> 1) as i32;
267 coeffs[spos] = val * qq;
268 if val > 0 { coeffs[spos] += bias; }
269 else { coeffs[spos] -= bias; }
270 } else {
271 coeffs[spos] = val;
272 }
273 }
274 if is_intra && is_2d {
275 *prev_dc += coeffs[0];
276 coeffs[0] = *prev_dc;
277 }
278 (transform)(coeffs);
279 Ok(())
280}
281
282#[allow(clippy::collapsible_else_if)]
283fn decode_block4x4(br: &mut BitReader, blk_cb: &IVICodebook, rvmap: &RVMap, tables: &TxParams4x4, is_intra: bool, is_2d: bool, prev_dc: &mut i32, quant: u8, coeffs: &mut [i32; 64], transform: TrFunc) -> DecoderResult<()> {
284 let mut idx: isize = -1;
285 let quant_mat = if is_intra { tables.quant_intra } else { tables.quant_inter };
286 while idx <= 64 {
287 let c = br.read_ivi_cb(blk_cb)?;
288 if c == rvmap.eob_sym { break; }
289 let run;
290 let val: i32;
291 if c != rvmap.esc_sym {
292 validate!(c < 256);
293 run = rvmap.runtab[c as usize] as isize;
294 val = rvmap.valtab[c as usize] as i32;
295 } else {
296 run = (br.read_ivi_cb(blk_cb)? as isize) + 1;
297 let lo = br.read_ivi_cb(blk_cb)?;
298 let hi = br.read_ivi_cb(blk_cb)?;
299 let v = (hi << 6) + lo;
300 if v == 0 {
301 val = 0; // should not happen but still...
302 } else {
303 if (v & 1) != 0 {
304 val = ((v >> 1) as i32) + 1;
305 } else {
306 val = -((v >> 1) as i32);
307 }
308 }
309 }
310 idx += run;
311 validate!((0..16).contains(&idx));
312
313 let spos = tables.scan[idx as usize];
314 let q = (u32::from(quant_mat[spos]) * u32::from(quant)) >> 9;
315 if q > 1 {
316 let qq = q as i32;
317 let bias = (((q ^ 1) - 1) >> 1) as i32;
318 coeffs[spos] = val * qq;
319 if val > 0 { coeffs[spos] += bias; }
320 else { coeffs[spos] -= bias; }
321 } else {
322 coeffs[spos] = val;
323 }
324 }
325 if is_intra && is_2d {
326 *prev_dc += coeffs[0];
327 coeffs[0] = *prev_dc;
328 }
329 (transform)(coeffs);
330 Ok(())
331}
332
333fn put_block(frame: &mut [i16], offs: usize, stride: usize, blk: &[i32], blk_size: usize) {
334 unsafe {
335 let mut dptr = frame.as_mut_ptr().add(offs);
336 for y in 0..blk_size {
337 for x in 0..blk_size {
338 *dptr.add(x) = blk[x + y * blk_size] as i16;
339 }
340 dptr = dptr.add(stride);
341 }
342 }
343}
344
345fn add_block(frame: &mut [i16], offs: usize, stride: usize, blk: &[i32], blk_size: usize) {
346 unsafe {
347 let mut dptr = frame.as_mut_ptr().add(offs);
348 for y in 0..blk_size {
349 for x in 0..blk_size {
350 *dptr.add(x) = (*dptr.add(x)).wrapping_add(blk[x + y * blk_size] as i16);
351 }
352 dptr = dptr.add(stride);
353 }
354 }
355}
356
357struct FrameData {
358 plane_buf: [Vec<i16>; 4],
359 plane_stride: [usize; 4],
360 pic_hdr: PictureHeader,
361}
362
363fn align(val: usize, bits: u8) -> usize {
364 let mask = (1 << bits) - 1;
365 (val + mask) & !mask
366}
367
368impl FrameData {
369 fn new() -> NABufferRef<Self> {
370 NABufferRef::new(FrameData {
371 plane_buf: [Vec::new(), Vec::new(), Vec::new(), Vec::new()],
372 plane_stride: [0, 0, 0, 0],
373 pic_hdr: PictureHeader::new_null(IVIFrameType::Intra),
374 })
375 }
376 fn realloc(&mut self, pic_hdr: &PictureHeader) -> DecoderResult<()> {
377 let width = align(pic_hdr.width, 6);
378 let height = align(pic_hdr.height, 6);
379
380 let stride = width;
381 self.plane_buf[0].resize(stride * height, 0);
382 self.plane_stride[0] = stride;
383 for plane in 1..3 {
384 self.plane_buf[plane].resize((stride >> 1) * (height >> 1), 0);
385 self.plane_stride[plane] = stride >> 1;
386 }
387 if pic_hdr.transparent {
388 self.plane_buf[3].resize(stride * height, 0);
389 self.plane_stride[3] = stride;
390 }
391 self.pic_hdr = *pic_hdr;
392 Ok(())
393 }
394 fn fill_plane(&mut self, vb: &mut NAVideoBuffer<u8>, plane: usize) {
395 let dplane = if (plane == 1) || (plane == 2) { plane ^ 3 } else { plane };
396 let (w, h) = vb.get_dimensions(dplane);
397 let mut didx = vb.get_offset(dplane);
398 let dstride = vb.get_stride(dplane);
399 let dst = vb.get_data_mut().unwrap();
400 let src = &self.plane_buf[plane];
401 let mut sidx = 0;
402 let sstride = self.plane_stride[plane];
403 for _ in 0..h {
404 for x in 0..w {
405 dst[didx + x] = clip8(src[sidx + x] + 128);
406 }
407 didx += dstride;
408 sidx += sstride;
409 }
410 }
411}
412
413#[allow(clippy::many_single_char_names)]
414fn do_mc(dst: &mut [i16], dstride: usize, src: &[i16], sstride: usize, x: usize, y: usize, l: usize, r: usize, t: usize, b: usize, mv_x: i32, mv_y: i32, is_hpel: bool, blk_size: usize) {
415 let (xoff, yoff, mv_mode) = if is_hpel {
416 (mv_x >> 1, mv_y >> 1, ((mv_x & 1) + (mv_y & 1) * 2) as u8)
417 } else{
418 (mv_x, mv_y, 0)
419 };
420 let xpos = (x as isize) + (xoff as isize);
421 let ypos = (y as isize) + (yoff as isize);
422 if (xpos < (l as isize)) || ((xpos as usize) + blk_size + ((mv_mode & 1) as usize) > r) ||
423 (ypos < (t as isize)) || ((ypos as usize) + blk_size + ((mv_mode >> 1) as usize) > b) {
424//println!(" copy from {},{} of {}-{},{}-{} {}x{}!", xpos, ypos, l,r,t,b,blk_size,blk_size);
425 return;
426 }
427 let sidx = (xpos as usize) + (ypos as usize) * sstride;
428 if blk_size == 8 {
429 ivi_mc_put(dst, dstride, &src[sidx..], sstride, mv_mode, 8, 8);
430 } else {
431 ivi_mc_put(dst, dstride, &src[sidx..], sstride, mv_mode, 4, 4);
432 }
433}
434
435#[allow(clippy::many_single_char_names)]
436fn do_mc_b(dst: &mut [i16], dstride: usize, src1: &[i16], sstride1: usize, src2: &[i16], sstride2: usize, x: usize, y: usize, l: usize, r: usize, t: usize, b: usize, mv_x: i32, mv_y: i32, mv2_x: i32, mv2_y: i32, is_hpel: bool, blk_size: usize) {
437 let (xoff1, yoff1, mv_mode1) = if is_hpel {
438 (mv_x >> 1, mv_y >> 1, ((mv_x & 1) + (mv_y & 1) * 2) as u8)
439 } else{
440 (mv_x, mv_y, 0)
441 };
442 let xpos1 = (x as isize) + (xoff1 as isize);
443 let ypos1 = (y as isize) + (yoff1 as isize);
444 if (xpos1 < (l as isize)) || ((xpos1 as usize) + blk_size + ((mv_mode1 & 1) as usize) > r) ||
445 (ypos1 < (t as isize)) || ((ypos1 as usize) + blk_size + ((mv_mode1 >> 1) as usize) > b) {
446 return;
447 }
448 let sidx1 = (xpos1 as usize) + (ypos1 as usize) * sstride1;
449 let (xoff2, yoff2, mv_mode2) = if is_hpel {
450 (mv2_x >> 1, mv2_y >> 1, ((mv2_x & 1) + (mv2_y & 1) * 2) as u8)
451 } else{
452 (mv2_x, mv2_y, 0)
453 };
454 let xpos2 = (x as isize) + (xoff2 as isize);
455 let ypos2 = (y as isize) + (yoff2 as isize);
456 if (xpos2 < (l as isize)) || ((xpos2 as usize) + blk_size + ((mv_mode2 & 1) as usize) > r) ||
457 (ypos2 < (t as isize)) || ((ypos2 as usize) + blk_size + ((mv_mode2 >> 1) as usize) > b) {
458 return;
459 }
460 let sidx2 = (xpos2 as usize) + (ypos2 as usize) * sstride2;
461 ivi_mc_avg(dst, dstride, &src1[sidx1..], sstride1, mv_mode1, &src2[sidx2..], sstride2, mv_mode2, blk_size, blk_size);
462}
463
464pub trait IndeoXParser {
465 fn decode_picture_header(&mut self, br: &mut BitReader) -> DecoderResult<PictureHeader>;
466 fn decode_band_header(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, plane: usize, band: usize) -> DecoderResult<BandHeader>;
467 fn decode_mb_info(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, band_hdr: &BandHeader, tile: &mut IVITile, ref_tile: Option<&IVITile>, mv_scale: u8) -> DecoderResult<()>;
468 fn recombine_plane(&mut self, src: &[i16], sstride: usize, dst: &mut [u8], dstride: usize, w: usize, h: usize);
469}
470
471const MISSING_REF: usize = 42;
472
473pub struct IVIDecoder {
474 ftype: IVIFrameType,
475 frames: [NABufferRef<FrameData>; 4],
476 cur_frame: usize,
477 prev_frame: usize,
478 next_frame: usize,
479 iref_0: usize,
480 iref_1: usize,
481 scal_ref: usize,
482 vinfo: NAVideoInfo,
483 vinfoa: NAVideoInfo,
484 bref: Option<NABufferType>,
485
486 bands: Vec<BandHeader>,
487 band_tiles: usize,
488 tiles: Vec<IVITile>,
489 num_tiles: [[usize; 4]; 4],
490 tile_start: [[usize; 4]; 4],
491
492 scalable: bool,
493}
494
495impl IVIDecoder {
496 pub fn new(scalable: bool) -> Self {
497 let mut bands: Vec<BandHeader> = Vec::with_capacity(12);
498 bands.resize(12, BandHeader::new_empty(42, 42));
499 IVIDecoder {
500 ftype: IVIFrameType::NULL,
501 frames: [FrameData::new(), FrameData::new(), FrameData::new(), FrameData::new()],
502 cur_frame: 0, prev_frame: MISSING_REF, next_frame: MISSING_REF,
503 iref_0: MISSING_REF, iref_1: MISSING_REF, scal_ref: MISSING_REF,
504 vinfo: NAVideoInfo::new(0, 0, false, YUV410_FORMAT),
505 vinfoa: NAVideoInfo::new(0, 0, false, YUVA410_FORMAT),
506 bref: None,
507
508 bands,
509 band_tiles: 0,
510 tiles: Vec::new(), tile_start: [[0; 4]; 4], num_tiles: [[0; 4]; 4],
511
512 scalable,
513 }
514 }
515
516 fn realloc(&mut self, pic_hdr: &PictureHeader) -> DecoderResult<()> {
517 let planes = if pic_hdr.transparent { 4 } else { 3 };
518
519 //self.bands.clear();
520 self.tiles.clear();
521 self.num_tiles = [[0; 4]; 4];
522 self.tile_start = [[0; 4]; 4];
523 let mut tstart: usize = 0;
524 for plane in 0..planes {
525 let is_luma = (plane != 1) && (plane != 2);
526 let bands = if is_luma { pic_hdr.luma_bands } else { pic_hdr.chroma_bands };
527 let mut band_w = if is_luma { pic_hdr.width } else { (pic_hdr.width + 3) >> 2 };
528 let mut band_h = if is_luma { pic_hdr.height } else { (pic_hdr.height + 3) >> 2 };
529 let mut tile_w = if is_luma { pic_hdr.slice_w } else { (pic_hdr.slice_w + 3) >> 2 };
530 let mut tile_h = if is_luma { pic_hdr.slice_h } else { (pic_hdr.slice_h + 3) >> 2 };
531 if bands > 1 {
532 band_w = (band_w + 1) >> 1;
533 band_h = (band_h + 1) >> 1;
534 if plane == 0 {
535 tile_w = (tile_w + 1) >> 1;
536 tile_h = (tile_h + 1) >> 1;
537 }
538 }
539 if plane == 0 {
540 self.band_tiles = ((band_w + tile_w - 1) / tile_w) * ((band_h + tile_h - 1) / tile_h);
541 }
542 for band in 0..bands {
543 self.tile_start[plane][band] = tstart;
544 let band_xoff = if (band & 1) == 1 { band_w } else { 0 };
545 let band_yoff = if (band & 2) == 2 { band_h } else { 0 };
546 let mut y = 0;
547 while y < band_h {
548 let cur_h = if y + tile_h <= band_h { tile_h } else { band_h - y };
549 let mut x = 0;
550 while x < band_w {
551 let cur_w = if x + tile_w <= band_w { tile_w } else { band_w - x };
552 let tile = IVITile::new(band_xoff + x, band_yoff + y, cur_w, cur_h);
553 self.tiles.push(tile);
554 self.num_tiles[plane][band] += 1;
555 tstart += 1;
556 x += tile_w;
557 }
558 y += tile_h;
559 }
560 }
561 }
562 Ok(())
563 }
564 fn decode_band(&mut self, pic_hdr: &PictureHeader, dec: &mut dyn IndeoXParser, br: &mut BitReader, plane_no: usize, band_no: usize) -> DecoderResult<()> {
565 let bidx = match plane_no {
566 0 => { band_no },
567 _ => { pic_hdr.luma_bands + plane_no - 1 },
568 };
569 let prev_band = if bidx >= self.bands.len() { BandHeader::new_empty(plane_no, band_no) } else { self.bands[bidx].clone() };
570 let mut band = dec.decode_band_header(br, pic_hdr, plane_no, band_no)?;
571 if let TxType::None = band.ttype {
572 validate!(band.plane_no == prev_band.plane_no);
573 validate!(band.band_no == prev_band.band_no);
574 validate!(band.blk_size == prev_band.blk_size);
575 band.tr = prev_band.tr;
576 band.ttype = prev_band.ttype;
577 };
578
579 let tstart = self.tile_start[band.plane_no][band.band_no];
580 let tend = tstart + self.num_tiles[band.plane_no][band.band_no];
581 let mb_size = band.mb_size;
582 let (tr, tr_dc) = match band.ttype {
583 TxType::Transform4(_) => { ivi_get_transform4x4_funcs(band.tr) },
584 TxType::Transform8(_) => { ivi_get_transform8x8_funcs(band.tr) },
585 _ => { ivi_get_transform4x4_funcs(band.tr) },
586 };
587 for tile_no in tstart..tend {
588 {
589 let tile = &mut self.tiles[tile_no];
590 let mb_w = (tile.w + mb_size - 1) / mb_size;
591 let mb_h = (tile.h + mb_size - 1) / mb_size;
592 tile.mb_w = mb_w;
593 tile.mb_h = mb_h;
594 tile.mb.clear();
595 tile.mb.resize(mb_w * mb_h, MB::new(0, 0));
596 }
597
598 let tile_start = br.tell();
599 if !br.read_bool()? {
600 let res = br.read_bool()?;
601 validate!(res);
602 let mut len = br.read(8)? as usize;
603 if len == 255 {
604 len = br.read(24)? as usize;
605 }
606 br.align();
607 validate!(len > 0);
608 let tile_end = (tile_start & !7) + len * 8;
609 validate!(tile_end > br.tell());
610 validate!(tile_end <= br.tell() + (br.left() as usize));
611 {
612 let ref_tile: Option<&IVITile>;
613 let mv_scale = if (plane_no == 0) && (band_no == 0) { 0 } else {
614 (((self.bands[0].mb_size >> 3) as i8) - ((band.mb_size >> 3) as i8)) as u8
615 };
616 let (ref_tiles, cur_tiles) = self.tiles.split_at_mut(tile_no);
617 let tile = &mut cur_tiles[0];
618 if plane_no != 0 || band_no != 0 {
619 let rtile = &ref_tiles[tile_no % self.band_tiles];
620 if (tile.mb_w != rtile.mb_w) || (tile.mb_h != rtile.mb_h) {
621 ref_tile = None;
622 } else {
623 ref_tile = Some(rtile);
624 }
625 } else {
626 ref_tile = None;
627 }
628 dec.decode_mb_info(br, pic_hdr, &band, tile, ref_tile, mv_scale)?;
629 }
630
631 self.decode_tile(br, &band, tile_no, tr, tr_dc)?;
632 br.align();
633let skip_part = tile_end - br.tell();
634br.skip(skip_part as u32)?;
635 } else {
636 {
637 let ref_tile: Option<&IVITile>;
638 let mv_scale = if (plane_no == 0) && (band_no == 0) { 0 } else {
639 (((self.bands[0].mb_size >> 3) as i8) - ((band.mb_size >> 3) as i8)) as u8
640 };
641 let (ref_tiles, cur_tiles) = self.tiles.split_at_mut(tile_no);
642 let tile = &mut cur_tiles[0];
643 if plane_no != 0 || band_no != 0 {
644 let rtile = &ref_tiles[0];
645 if (tile.mb_w != rtile.mb_w) || (tile.mb_h != rtile.mb_h) {
646 ref_tile = None;
647 } else {
648 ref_tile = Some(rtile);
649 }
650 } else {
651 ref_tile = None;
652 }
653 let mut mb_idx = 0;
654 for mb_y in 0..tile.mb_h {
655 for mb_x in 0..tile.mb_w {
656 let mut mb = MB::new(tile.pos_x + mb_x * band.mb_size, tile.pos_y + mb_y * band.mb_size);
657 mb.mtype = MBType::Inter;
658 mb.cbp = 0;
659 if band.inherit_mv {
660 if let Some(tileref) = ref_tile {
661 let mx = tileref.mb[mb_idx].mv_x;
662 let my = tileref.mb[mb_idx].mv_y;
663 mb.mv_x = scale_mv(mx, mv_scale);
664 mb.mv_y = scale_mv(my, mv_scale);
665 }
666 }
667 tile.mb[mb_idx] = mb;
668 mb_idx += 1;
669 }
670 }
671 }
672 self.decode_tile(br, &band, tile_no, tr, tr_dc)?;
673 }
674 }
675 self.bands[bidx] = band;
676 br.align();
677 Ok(())
678 }
679 #[allow(clippy::collapsible_else_if)]
680 fn decode_tile(&mut self, br: &mut BitReader, band: &BandHeader, tile_no: usize, tr: TrFunc, transform_dc: TrFuncDC) -> DecoderResult<()> {
681 let mut mb_idx = 0;
682 let mut prev_dc: i32 = 0;
683 let tile = &mut self.tiles[tile_no];
684 let mut frame = self.frames[self.cur_frame].clone();
685
686 let stride = frame.plane_stride[band.plane_no];
687 let mut dstidx = tile.pos_x + tile.pos_y * stride;
688 let dst = &mut frame.plane_buf[band.plane_no];
689 let pos_x = tile.pos_x;
690 let pos_y = tile.pos_y;
691 let tile_w = (tile.w + 15) & !15;
692 let tile_h = (tile.h + 15) & !15;
693 for mb_y in 0..tile.mb_h {
694 for mb_x in 0..tile.mb_w {
695 let mb = &mut tile.mb[mb_idx];
696
697 let is_intra = mb.mtype == MBType::Intra;
698
699 if band.mb_size != band.blk_size {
700 let mut cbp = mb.cbp;
701 for blk_no in 0..4 {
702 let mut blk: [i32; 64] = [0; 64];
703 let boff = (blk_no & 1) * band.blk_size + (blk_no >> 1) * band.blk_size * stride + mb_x * band.mb_size;
704 if !is_intra {
705 if mb.mtype != MBType::Bidir {
706 let idx = if mb.mtype != MBType::Backward { self.prev_frame } else { self.next_frame };
707 let pf = &self.frames[idx];
708 do_mc(&mut dst[dstidx + boff..], stride,
709 &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no],
710 pos_x + mb_x * band.mb_size + (blk_no & 1) * band.blk_size,
711 pos_y + mb_y * band.mb_size + (blk_no >> 1) * band.blk_size,
712 pos_x, pos_x + tile_w, pos_y, pos_y + tile_h,
713 mb.mv_x, mb.mv_y, band.halfpel, band.blk_size);
714 } else {
715 let pf = &self.frames[self.prev_frame];
716 let nf = &self.frames[self.next_frame];
717 do_mc_b(&mut dst[dstidx + boff..], stride,
718 &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no],
719 &nf.plane_buf[band.plane_no], nf.plane_stride[band.plane_no],
720 pos_x + mb_x * band.mb_size + (blk_no & 1) * band.blk_size,
721 pos_y + mb_y * band.mb_size + (blk_no >> 1) * band.blk_size,
722 pos_x, pos_x + tile_w, pos_y, pos_y + tile_h,
723 mb.mv_x, mb.mv_y, mb.mv2_x, mb.mv2_y, band.halfpel,
724 band.blk_size);
725 }
726 }
727 if (cbp & 1) != 0 {
728 if let TxType::Transform8(ref params) = band.ttype {
729 decode_block8x8(br, &band.blk_cb, &band.rvmap, params, is_intra, band.tr.is_2d(), &mut prev_dc, mb.q, &mut blk, tr)?;
730 if is_intra {
731 put_block(dst, dstidx + boff, stride, &blk, 8);
732 } else {
733 add_block(dst, dstidx + boff, stride, &blk, 8);
734 }
735 }
736 if let TxType::Transform4(ref params) = band.ttype {
737 decode_block4x4(br, &band.blk_cb, &band.rvmap, params, is_intra, band.tr.is_2d(), &mut prev_dc, mb.q, &mut blk, tr)?;
738 if is_intra {
739 put_block(dst, dstidx + boff, stride, &blk, 4);
740 } else {
741 add_block(dst, dstidx + boff, stride, &blk, 4);
742 }
743 }
744 } else {
745 if is_intra {
746 (transform_dc)(&mut blk, prev_dc);
747 put_block(dst, dstidx + boff, stride, &blk, band.blk_size);
748 }
749 }
750 cbp >>= 1;
751 }
752 } else {
753 let mut blk: [i32; 64] = [0; 64];
754 if !is_intra {
755 if mb.mtype != MBType::Bidir {
756 let idx = if mb.mtype != MBType::Backward { self.prev_frame } else { self.next_frame };
757 let pf = &self.frames[idx];
758 do_mc(&mut dst[dstidx + mb_x * band.blk_size..], stride,
759 &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no],
760 pos_x + mb_x * band.mb_size,
761 pos_y + mb_y * band.mb_size,
762 pos_x, pos_x + tile_w, pos_y, pos_y + tile_h,
763 mb.mv_x, mb.mv_y, band.halfpel, band.blk_size);
764 } else {
765 let pf = &self.frames[self.prev_frame];
766 let nf = &self.frames[self.next_frame];
767 do_mc_b(&mut dst[dstidx + mb_x * band.blk_size..], stride,
768 &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no],
769 &nf.plane_buf[band.plane_no], nf.plane_stride[band.plane_no],
770 pos_x + mb_x * band.mb_size,
771 pos_y + mb_y * band.mb_size,
772 pos_x, pos_x + tile_w, pos_y, pos_y + tile_h,
773 mb.mv_x, mb.mv_y, mb.mv2_x, mb.mv2_y, band.halfpel,
774 band.blk_size);
775 }
776 }
777 if mb.cbp != 0 {
778 if let TxType::Transform8(ref params) = band.ttype {
779 decode_block8x8(br, &band.blk_cb, &band.rvmap, params, is_intra, band.tr.is_2d(), &mut prev_dc, mb.q, &mut blk, tr)?;
780 }
781 if let TxType::Transform4(ref params) = band.ttype {
782 decode_block4x4(br, &band.blk_cb, &band.rvmap, params, is_intra, band.tr.is_2d(), &mut prev_dc, mb.q, &mut blk, tr)?;
783 }
784 if is_intra {
785 if band.blk_size == 8 {
786 put_block(dst, dstidx + mb_x * band.blk_size, stride, &blk, 8);
787 } else {
788 put_block(dst, dstidx + mb_x * band.blk_size, stride, &blk, 4);
789 }
790 } else {
791 if band.blk_size == 8 {
792 add_block(dst, dstidx + mb_x * band.blk_size, stride, &blk, 8);
793 } else {
794 add_block(dst, dstidx + mb_x * band.blk_size, stride, &blk, 4);
795 }
796 }
797 } else {
798 if is_intra {
799 (transform_dc)(&mut blk, prev_dc);
800 if band.blk_size == 8 {
801 put_block(dst, dstidx + mb_x * band.blk_size, stride, &blk, 8);
802 } else {
803 put_block(dst, dstidx + mb_x * band.blk_size, stride, &blk, 4);
804 }
805 }
806 }
807 }
808 mb_idx += 1;
809 }
810 dstidx += stride * band.mb_size;
811 }
812 Ok(())
813 }
814
815 fn find_unused_frame(&self) -> usize {
816 for fno in 0..4 {
817 if (fno != self.iref_0) && (fno != self.iref_1) && (fno != self.scal_ref) {
818 return fno;
819 }
820 }
821 unreachable!();
822 }
823
824 fn decode_single_frame(&mut self, dec: &mut dyn IndeoXParser, br: &mut BitReader) -> DecoderResult<NABufferType> {
825 let pic_hdr = dec.decode_picture_header(br)?;
826 self.ftype = pic_hdr.ftype;
827 if pic_hdr.ftype.is_null() {
828 return Ok(NABufferType::None);
829 }
830
831 self.cur_frame = self.find_unused_frame();
832 match self.ftype {
833 IVIFrameType::Inter => {
834 self.prev_frame = self.iref_0;
835 if self.prev_frame == MISSING_REF {
836 return Err(DecoderError::MissingReference);
837 }
838 },
839 IVIFrameType::InterDroppable => {
840 self.prev_frame = self.scal_ref;
841 if self.prev_frame == MISSING_REF {
842 return Err(DecoderError::MissingReference);
843 }
844 },
845 IVIFrameType::InterScal => {
846 self.prev_frame = self.scal_ref;
847 if self.prev_frame == MISSING_REF {
848 return Err(DecoderError::MissingReference);
849 }
850 },
851 IVIFrameType::Bidir => {
852 self.prev_frame = self.iref_1;
853 self.next_frame = self.iref_0;
854 if (self.prev_frame == MISSING_REF) || (self.next_frame == MISSING_REF) {
855 return Err(DecoderError::MissingReference);
856 }
857 },
858 _ => {},
859 };
860
861 let mut vinfo = if pic_hdr.transparent { self.vinfoa } else { self.vinfo };
862 vinfo.set_width(pic_hdr.width);
863 vinfo.set_height(pic_hdr.height);
864 let mut buftype = alloc_video_buffer(vinfo, 0)?;
865 self.realloc(&pic_hdr)?;
866 self.frames[self.cur_frame].realloc(&pic_hdr)?;
867
868 if !self.scalable {
869 for plane in 0..3 {
870 let num_bands = if plane == 0 { pic_hdr.luma_bands } else { pic_hdr.chroma_bands };
871 for band in 0..num_bands {
872 self.decode_band(&pic_hdr, dec, br, plane, band)?;
873 }
874 if let NABufferType::Video(ref mut vb) = buftype {
875 let mut frame = self.frames[self.cur_frame].clone();
876 if num_bands == 1 {
877 frame.fill_plane(vb, plane);
878 } else {
879 let dplane = if (plane == 1) || (plane == 2) { plane ^ 3 } else { plane };
880 let (w, h) = vb.get_dimensions(dplane);
881 let dstride = vb.get_stride(dplane);
882 let off = vb.get_offset(dplane);
883 let dst = vb.get_data_mut().unwrap();
884 dec.recombine_plane(&frame.plane_buf[plane], frame.plane_stride[plane], &mut dst[off..], dstride, w, h);
885 }
886 }
887 }
888 } else {
889 let mut bands_decoded = [[false; 10]; 3];
890 let mut num_decoded = 0;
891
892 let num_bands = [ pic_hdr.luma_bands, pic_hdr.chroma_bands, pic_hdr.chroma_bands ];
893
894 for plane in 0..3 {
895 for band in 0..num_bands[plane] {
896 if br.peek(8) == 0x01 { // skipped scalable bands
897 br.skip(8)?;
898 continue;
899 }
900 self.decode_band(&pic_hdr, dec, br, plane, band)?;
901 bands_decoded[plane][band] = true;
902 num_decoded += 1;
903 }
904 }
905 if (num_decoded < num_bands[0] + num_bands[1] + num_bands[2]) && (br.left() > 0) {
906 validate!(br.read(8)? == 0x00);
907 while br.peek(8) == 0x00 {
908 if br.skip(8).is_err() { // happens at the end of data
909 break;
910 }
911 }
912 validate!((br.tell() & 31) == 0);
913
914 for (plane, &nbands) in num_bands.iter().enumerate() {
915 for (band, band_decoded) in bands_decoded[plane][..nbands].iter_mut().enumerate() {
916 if *band_decoded || br.left() == 0 {
917 continue;
918 }
919 self.decode_band(&pic_hdr, dec, br, plane, band)?;
920 *band_decoded = true;
921 num_decoded += 1;
922 }
923 }
924 }
925
926 if let NABufferType::Video(ref mut vb) = buftype {
927 for (plane, &nbands) in num_bands.iter().enumerate() {
928 let mut frame = self.frames[self.cur_frame].clone();
929 if nbands == 1 {
930 frame.fill_plane(vb, plane);
931 } else {
932 let dplane = if (plane == 1) || (plane == 2) { plane ^ 3 } else { plane };
933 let (w, h) = vb.get_dimensions(dplane);
934 let dstride = vb.get_stride(dplane);
935 let off = vb.get_offset(dplane);
936 let dst = vb.get_data_mut().unwrap();
937 dec.recombine_plane(&frame.plane_buf[plane], frame.plane_stride[plane], &mut dst[off..], dstride, w, h);
938 }
939 }
940 }
941 }
942 if pic_hdr.transparent {
943 let mut frame = self.frames[self.cur_frame].clone();
944 let stride = frame.plane_stride[3];
945 read_trans_band_header(br, pic_hdr.width, pic_hdr.height, &mut frame.plane_buf[3], stride)?;
946 if let NABufferType::Video(ref mut vb) = buftype {
947 frame.fill_plane(vb, 3);
948 }
949 }
950
951 match self.ftype {
952 IVIFrameType::Intra | IVIFrameType::Intra1 | IVIFrameType::Inter => {
953 self.iref_1 = self.iref_0;
954 self.iref_0 = self.cur_frame;
955 self.scal_ref = self.cur_frame;
956 },
957 IVIFrameType::InterScal => {
958 self.scal_ref = self.cur_frame;
959 },
960 _ => {},
961 };
962
963 Ok(buftype)
964 }
965
966 pub fn decode_frame(&mut self, dec: &mut dyn IndeoXParser, br: &mut BitReader) -> DecoderResult<NABufferType> {
967 let res = self.decode_single_frame(dec, br)?;
968 if (self.ftype == IVIFrameType::Intra) && (br.left() > 16) {
969 loop {
970 if br.left() < 8 { break; }
971 if br.read(8)? == 0 { break; }
972 }
973 loop {
974 if br.left() < 8 { break; }
975 if br.peek(8) != 0 { break; }
976 br.skip(8)?;
977 }
978 if br.left() > 24 {
979 let seq = br.peek(21);
980 if seq == 0xBFFF8 {
981 let res2 = self.decode_single_frame(dec, br);
982 if let Ok(res) = res2 {
983 self.bref = Some(res);
984 }
985 }
986 self.ftype = IVIFrameType::Intra;
987 }
988 }
989 if self.bref.is_some() && self.ftype == IVIFrameType::Inter {
990 let mut bref: Option<NABufferType> = Some(res);
991 mem::swap(&mut bref, &mut self.bref);
992 return Ok(bref.unwrap());
993 }
994 if let NABufferType::None = res {
995 if self.bref.is_some() {
996 let mut bref: Option<NABufferType> = None;
997 mem::swap(&mut bref, &mut self.bref);
998 self.ftype = IVIFrameType::Inter;
999 return Ok(bref.unwrap());
1000 }
1001 }
1002 Ok(res)
1003 }
1004
1005 pub fn flush(&mut self) {
1006 self.prev_frame = MISSING_REF;
1007 self.next_frame = MISSING_REF;
1008 self.iref_0 = MISSING_REF;
1009 self.iref_1 = MISSING_REF;
1010 self.scal_ref = MISSING_REF;
1011 }
1012
1013 pub fn is_intra(&self) -> bool {
1014 self.ftype.is_intra()
1015 }
1016 pub fn get_frame_type(&self) -> FrameType {
1017 match self.ftype {
1018 IVIFrameType::Intra => { FrameType::I },
1019 IVIFrameType::Intra1 => { FrameType::I },
1020 IVIFrameType::Inter => { FrameType::P },
1021 IVIFrameType::InterDroppable => { FrameType::P },
1022 IVIFrameType::InterScal => { FrameType::P },
1023 IVIFrameType::Bidir => { FrameType::B },
1024 _ => { FrameType::Skip },
1025 }
1026 }
1027}
1028
1029pub struct RVMap {
1030 pub eob_sym: u32,
1031 pub esc_sym: u32,
1032 pub runtab: [u8; 256],
1033 pub valtab: [i8; 256],
1034}
1035
1036impl Clone for RVMap {
1037 fn clone(&self) -> RVMap {
1038 let mut runtab: [u8; 256] = [0; 256];
1039 let mut valtab: [i8; 256] = [0; 256];
1040 runtab.copy_from_slice(&self.runtab);
1041 valtab.copy_from_slice(&self.valtab);
1042 RVMap { eob_sym: self.eob_sym, esc_sym: self.esc_sym, runtab, valtab }
1043 }
1044}
1045
1046pub const IVI_ZERO_RVMAP: RVMap = RVMap { eob_sym: 0, esc_sym: 0, runtab: [0; 256], valtab: [0; 256] };
1047
1048pub static IVI_RVMAPS: [RVMap; 9] = [
1049 RVMap { eob_sym: 5, esc_sym: 2, runtab: [
1050 1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3,
1051 1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5,
1052 1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1,
1053 8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9,
1054 9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3,
1055 2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12,
1056 8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13,
1057 2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8,
1058 1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8,
1059 6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21,
1060 22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8,
1061 4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6,
1062 1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28,
1063 1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41,
1064 6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1,
1065 30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38 ],
1066 valtab: [
1067 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1,
1068 6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1,
1069 10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13,
1070 1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1,
1071 -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4,
1072 7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1,
1073 2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1,
1074 9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3,
1075 28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4,
1076 3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1,
1077 -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5,
1078 5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4,
1079 -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1,
1080 37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1,
1081 5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40,
1082 -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1 ],
1083 },
1084 RVMap { eob_sym: 0, esc_sym: 38, runtab: [
1085 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7,
1086 7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16,
1087 14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
1088 25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27,
1089 33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34,
1090 37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38,
1091 40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44,
1092 57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1,
1093 52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64,
1094 60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13,
1095 12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4,
1096 1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25,
1097 21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33,
1098 29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3,
1099 28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41,
1100 2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5 ],
1101 valtab: [
1102 0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1,
1103 -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1,
1104 -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1,
1105 1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1,
1106 1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1,
1107 1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1,
1108 -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1,
1109 -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4,
1110 1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1,
1111 1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2,
1112 2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3,
1113 6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2,
1114 2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2,
1115 2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4,
1116 -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2,
1117 -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4 ],
1118 },
1119 RVMap { eob_sym: 2, esc_sym: 11, runtab: [
1120 1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5,
1121 2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2,
1122 2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13,
1123 3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7,
1124 1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3,
1125 9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22,
1126 23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32,
1127 28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31,
1128 49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3,
1129 3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57,
1130 1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2,
1131 50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1,
1132 45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17,
1133 17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55,
1134 7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4,
1135 8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62 ],
1136 valtab: [
1137 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1,
1138 2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3,
1139 -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1,
1140 3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2,
1141 7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4,
1142 2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1,
1143 1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1,
1144 1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1,
1145 1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5,
1146 -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1,
1147 -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7,
1148 -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13,
1149 1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2,
1150 -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1,
1151 -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6,
1152 -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1 ]
1153 },
1154 RVMap { eob_sym: 0, esc_sym: 35, runtab: [
1155 0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7,
1156 7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3,
1157 3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1,
1158 5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20,
1159 21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26,
1160 9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32,
1161 2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41,
1162 35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40,
1163 12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16,
1164 43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48,
1165 57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51,
1166 8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59,
1167 59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60,
1168 60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4,
1169 25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1,
1170 20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16 ],
1171 valtab: [
1172 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1,
1173 -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2,
1174 -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4,
1175 2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1,
1176 1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1,
1177 2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1,
1178 4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1,
1179 -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1,
1180 2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2,
1181 1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1,
1182 -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1,
1183 -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1,
1184 -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1,
1185 1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5,
1186 -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12,
1187 -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3 ]
1188 },
1189 RVMap { eob_sym: 0, esc_sym: 34, runtab: [
1190 0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5,
1191 2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1,
1192 2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1,
1193 9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4,
1194 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1,
1195 2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1196 2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12,
1197 3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1,
1198 4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1,
1199 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5,
1200 1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1,
1201 5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1,
1202 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1,
1203 3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1,
1204 1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8,
1205 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1 ],
1206 valtab: [
1207 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1,
1208 2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9,
1209 3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13,
1210 1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2,
1211 18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23,
1212 -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29,
1213 6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1,
1214 4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39,
1215 3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47,
1216 -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3,
1217 -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63,
1218 -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67,
1219 -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70,
1220 6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79,
1221 75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2,
1222 83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89 ]
1223 },
1224 RVMap { eob_sym: 2, esc_sym: 33, runtab: [
1225 1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1,
1226 1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1,
1227 1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1,
1228 12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2,
1229 6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3,
1230 8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2,
1231 1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4,
1232 4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1,
1233 1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2,
1234 2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13,
1235 1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31,
1236 3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2,
1237 1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8,
1238 36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1,
1239 1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4,
1240 40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7 ],
1241 valtab: [
1242 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4,
1243 -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6,
1244 -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8,
1245 1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5,
1246 2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4,
1247 2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7,
1248 15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4,
1249 -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18,
1250 -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9,
1251 -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2,
1252 22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1,
1253 7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11,
1254 26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4,
1255 -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29,
1256 30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7,
1257 -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5 ]
1258 },
1259 RVMap { eob_sym: 2, esc_sym: 13, runtab: [
1260 1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2,
1261 4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1,
1262 3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9,
1263 4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2,
1264 1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1,
1265 6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7,
1266 15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1,
1267 2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1,
1268 17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1,
1269 6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1,
1270 4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2,
1271 1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1,
1272 1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1,
1273 12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6,
1274 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25,
1275 14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2 ],
1276 valtab: [
1277 -20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2,
1278 1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8,
1279 2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1,
1280 2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5,
1281 -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18,
1282 2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2,
1283 -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25,
1284 -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29,
1285 1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33,
1286 -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37,
1287 -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11,
1288 -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44,
1289 45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48,
1290 -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4,
1291 6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1,
1292 2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14 ]
1293 },
1294 RVMap { eob_sym: 2, esc_sym: 38, runtab: [
1295 1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6,
1296 6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1,
1297 1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5,
1298 14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7,
1299 8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20,
1300 19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23,
1301 24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7,
1302 26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2,
1303 28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30,
1304 32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14,
1305 6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9,
1306 37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5,
1307 3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6,
1308 1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1,
1309 8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45,
1310 12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49 ],
1311 valtab: [
1312 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1,
1313 -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5,
1314 -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2,
1315 1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2,
1316 2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1,
1317 -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1,
1318 -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3,
1319 1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7,
1320 -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1,
1321 -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2,
1322 -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3,
1323 -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5,
1324 -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5,
1325 20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21,
1326 5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1,
1327 3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1 ]
1328 },
1329 RVMap { eob_sym: 4, esc_sym: 11, runtab: [
1330 1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2,
1331 4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1,
1332 7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9,
1333 2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4,
1334 4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8,
1335 2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4,
1336 1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21,
1337 25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1,
1338 1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2,
1339 4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30,
1340 6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1,
1341 37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41,
1342 13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42,
1343 3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15,
1344 44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7,
1345 50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1 ],
1346 valtab: [
1347 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2,
1348 1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7,
1349 1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1,
1350 5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3,
1351 -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2,
1352 7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4,
1353 15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1,
1354 1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17,
1355 -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9,
1356 -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1,
1357 4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20,
1358 1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1,
1359 -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1,
1360 8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2,
1361 1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5,
1362 1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26 ]
1363 }
1364];