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