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