2 use nihav_core::io::bitreader::*;
4 use nihav_core::codecs::*;
5 use nihav_core::frame::NABufferRef;
9 pub fn scale_mv(val: i32, scale: u8) -> i32 {
10 (val + (if val > 0 { 1 } else { 0 }) + i32::from(scale) - 1) >> scale
14 pub struct IVICodebook {
21 pub fn init(&self) -> Self {
23 let mut base: u32 = 0;
26 base += 1 << cb.bits[i];
32 pub const IVI_CB_ZERO: IVICodebook = IVICodebook { len: 0, bits: [0; 16], offs: [0; 16] };
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];
44 const IVI_REVS: [&[u32]; 9] = [ &IVI_REV0, &IVI_REV1, &IVI_REV2, &IVI_REV3, &IVI_REV4, &IVI_REV5, &IVI_REV6, &IVI_REV7, &IVI_REV8];
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>;
52 impl<'a> IVICodebookReader for BitReader<'a> {
53 fn read_ivi_codebook_desc(&mut self, mb_cb: bool, desc_coded: bool) -> DecoderResult<IVICodebook> {
56 Ok(IVI_MB_CB[7].init())
58 Ok(IVI_BLK_CB[7].init())
61 let idx = self.read(3)? as usize;
64 Ok(IVI_MB_CB[idx].init())
66 Ok(IVI_BLK_CB[idx].init())
69 let mut cb = IVI_CB_ZERO;
70 cb.len = self.read(4)? as usize;
71 if cb.len == 0 { return Err(DecoderError::InvalidData); }
73 cb.bits[i] = self.read(4)? as u8;
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);
89 let len = (!self.peek(16)).trailing_zeros() as usize;
91 if len >= cb.len - 1 {
93 self.skip((cb.len - 1) as u32)?;
96 self.skip((len + 1) as u32)?;
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];
104 let nbits = cb.bits[0];
105 Ok(IVI_REVS[nbits as usize][self.read(nbits)? as usize])
109 fn read_ivi_cb_s(&mut self, cb: &IVICodebook) -> BitReaderResult<i32> {
110 let v = self.read_ivi_cb(cb)?;
114 let sign = (v & 1) == 1;
115 let val = (v >> 1) as i32;
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] }
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] }
147 #[allow(clippy::many_single_char_names)]
148 fn read_trans_band_header(br: &mut BitReader, w: usize, h: usize, dst: &mut [i16], dstride: usize) -> DecoderResult<()> {
149 let _color_plane = br.read(2)?;
150 let _bit_depth = br.read(3)?;
151 let dirty_rects = br.read(8)? as usize;
152 for _ in 0..dirty_rects {
153 let _x = br.read(16)?;
154 let _y = br.read(16)?;
155 let _l = br.read(16)?;
156 let _r = br.read(16)?;
158 let has_trans_color = br.read_bool()?;
160 let _r = br.read(8)?;
161 let _g = br.read(8)?;
162 let _b = br.read(8)?;
167 let mut cb = IVI_CB_ZERO;
168 cb.len = br.read(4)? as usize;
169 if cb.len == 0 { return Err(DecoderError::InvalidData); }
171 cb.bits[i] = br.read(4)? as u8;
176 let tile_start = br.tell();
177 let empty = br.read_bool()?;
180 let mut len = br.read(8)? as usize;
182 len = br.read(24)? as usize;
185 let tile_end = tile_start + len * 8;
187 let first_val = br.read_bool()?;
189 let mut _dec_size = 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;
199 if (x < w) && (y < h) {
200 dst[x + y * dstride] = fill;
211 if (x < w) && (y < h) {
212 dst[x + y * dstride] = fill;
230 #[allow(clippy::collapsible_else_if)]
231 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<()> {
232 let mut idx: isize = -1;
233 let quant_mat = if is_intra { tables.quant_intra } else { tables.quant_inter };
235 let c = br.read_ivi_cb(blk_cb)?;
236 if c == rvmap.eob_sym { break; }
239 if c != rvmap.esc_sym {
241 run = rvmap.runtab[c as usize] as isize;
242 val = rvmap.valtab[c as usize] as i32;
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;
249 val = 0; // should not happen but still...
251 let vv = (v >> 1) as i32;
260 validate!((0..64).contains(&idx));
262 let spos = tables.scan[idx as usize];
263 let q = (u32::from(quant_mat[spos]) * u32::from(quant)) >> 9;
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; }
274 if is_intra && is_2d {
275 *prev_dc += coeffs[0];
276 coeffs[0] = *prev_dc;
282 #[allow(clippy::collapsible_else_if)]
283 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<()> {
284 let mut idx: isize = -1;
285 let quant_mat = if is_intra { tables.quant_intra } else { tables.quant_inter };
287 let c = br.read_ivi_cb(blk_cb)?;
288 if c == rvmap.eob_sym { break; }
291 if c != rvmap.esc_sym {
293 run = rvmap.runtab[c as usize] as isize;
294 val = rvmap.valtab[c as usize] as i32;
296 run = (br.read_ivi_cb(blk_cb)? as isize) + 1;
297 let lo = br.read_ivi_cb(blk_cb)?;
298 let hi = br.read_ivi_cb(blk_cb)?;
299 let v = (hi << 6) + lo;
301 val = 0; // should not happen but still...
304 val = ((v >> 1) as i32) + 1;
306 val = -((v >> 1) as i32);
311 validate!((0..16).contains(&idx));
313 let spos = tables.scan[idx as usize];
314 let q = (u32::from(quant_mat[spos]) * u32::from(quant)) >> 9;
317 let bias = (((q ^ 1) - 1) >> 1) as i32;
318 coeffs[spos] = val * qq;
319 if val > 0 { coeffs[spos] += bias; }
320 else { coeffs[spos] -= bias; }
325 if is_intra && is_2d {
326 *prev_dc += coeffs[0];
327 coeffs[0] = *prev_dc;
333 fn put_block(frame: &mut [i16], offs: usize, stride: usize, blk: &[i32], blk_size: usize) {
335 let mut dptr = frame.as_mut_ptr().add(offs);
336 for y in 0..blk_size {
337 for x in 0..blk_size {
338 *dptr.add(x) = blk[x + y * blk_size] as i16;
340 dptr = dptr.add(stride);
345 fn add_block(frame: &mut [i16], offs: usize, stride: usize, blk: &[i32], blk_size: usize) {
347 let mut dptr = frame.as_mut_ptr().add(offs);
348 for y in 0..blk_size {
349 for x in 0..blk_size {
350 *dptr.add(x) = (*dptr.add(x)).wrapping_add(blk[x + y * blk_size] as i16);
352 dptr = dptr.add(stride);
358 plane_buf: [Vec<i16>; 4],
359 plane_stride: [usize; 4],
360 pic_hdr: PictureHeader,
363 fn align(val: usize, bits: u8) -> usize {
364 let mask = (1 << bits) - 1;
369 fn new() -> NABufferRef<Self> {
370 NABufferRef::new(FrameData {
371 plane_buf: [Vec::new(), Vec::new(), Vec::new(), Vec::new()],
372 plane_stride: [0, 0, 0, 0],
373 pic_hdr: PictureHeader::new_null(IVIFrameType::Intra),
376 fn realloc(&mut self, pic_hdr: &PictureHeader) -> DecoderResult<()> {
377 let width = align(pic_hdr.width, 6);
378 let height = align(pic_hdr.height, 6);
381 self.plane_buf[0].resize(stride * height, 0);
382 self.plane_stride[0] = stride;
384 self.plane_buf[plane].resize((stride >> 1) * (height >> 1), 0);
385 self.plane_stride[plane] = stride >> 1;
387 if pic_hdr.transparent {
388 self.plane_buf[3].resize(stride * height, 0);
389 self.plane_stride[3] = stride;
391 self.pic_hdr = *pic_hdr;
394 fn fill_plane(&mut self, vb: &mut NAVideoBuffer<u8>, plane: usize) {
395 let dplane = if (plane == 1) || (plane == 2) { plane ^ 3 } else { plane };
396 let (w, h) = vb.get_dimensions(dplane);
397 let mut didx = vb.get_offset(dplane);
398 let dstride = vb.get_stride(dplane);
399 let dst = vb.get_data_mut().unwrap();
400 let src = &self.plane_buf[plane];
402 let sstride = self.plane_stride[plane];
405 dst[didx + x] = clip8(src[sidx + x] + 128);
413 #[allow(clippy::many_single_char_names)]
414 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) {
415 let (xoff, yoff, mv_mode) = if is_hpel {
416 (mv_x >> 1, mv_y >> 1, ((mv_x & 1) + (mv_y & 1) * 2) as u8)
420 let xpos = (x as isize) + (xoff as isize);
421 let ypos = (y as isize) + (yoff as isize);
422 if (xpos < (l as isize)) || ((xpos as usize) + blk_size + ((mv_mode & 1) as usize) > r) ||
423 (ypos < (t as isize)) || ((ypos as usize) + blk_size + ((mv_mode >> 1) as usize) > b) {
424 //println!(" copy from {},{} of {}-{},{}-{} {}x{}!", xpos, ypos, l,r,t,b,blk_size,blk_size);
427 let sidx = (xpos as usize) + (ypos as usize) * sstride;
429 ivi_mc_put(dst, dstride, &src[sidx..], sstride, mv_mode, 8, 8);
431 ivi_mc_put(dst, dstride, &src[sidx..], sstride, mv_mode, 4, 4);
435 #[allow(clippy::many_single_char_names)]
436 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) {
437 let (xoff1, yoff1, mv_mode1) = if is_hpel {
438 (mv_x >> 1, mv_y >> 1, ((mv_x & 1) + (mv_y & 1) * 2) as u8)
442 let xpos1 = (x as isize) + (xoff1 as isize);
443 let ypos1 = (y as isize) + (yoff1 as isize);
444 if (xpos1 < (l as isize)) || ((xpos1 as usize) + blk_size + ((mv_mode1 & 1) as usize) > r) ||
445 (ypos1 < (t as isize)) || ((ypos1 as usize) + blk_size + ((mv_mode1 >> 1) as usize) > b) {
448 let sidx1 = (xpos1 as usize) + (ypos1 as usize) * sstride1;
449 let (xoff2, yoff2, mv_mode2) = if is_hpel {
450 (mv2_x >> 1, mv2_y >> 1, ((mv2_x & 1) + (mv2_y & 1) * 2) as u8)
454 let xpos2 = (x as isize) + (xoff2 as isize);
455 let ypos2 = (y as isize) + (yoff2 as isize);
456 if (xpos2 < (l as isize)) || ((xpos2 as usize) + blk_size + ((mv_mode2 & 1) as usize) > r) ||
457 (ypos2 < (t as isize)) || ((ypos2 as usize) + blk_size + ((mv_mode2 >> 1) as usize) > b) {
460 let sidx2 = (xpos2 as usize) + (ypos2 as usize) * sstride2;
461 ivi_mc_avg(dst, dstride, &src1[sidx1..], sstride1, mv_mode1, &src2[sidx2..], sstride2, mv_mode2, blk_size, blk_size);
464 pub trait IndeoXParser {
465 fn decode_picture_header(&mut self, br: &mut BitReader) -> DecoderResult<PictureHeader>;
466 fn decode_band_header(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, plane: usize, band: usize) -> DecoderResult<BandHeader>;
467 fn decode_mb_info(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, band_hdr: &BandHeader, tile: &mut IVITile, ref_tile: Option<&IVITile>, mv_scale: u8) -> DecoderResult<()>;
468 fn recombine_plane(&mut self, src: &[i16], sstride: usize, dst: &mut [u8], dstride: usize, w: usize, h: usize);
471 const MISSING_REF: usize = 42;
473 pub struct IVIDecoder {
475 frames: [NABufferRef<FrameData>; 4],
484 bref: Option<NABufferType>,
486 bands: Vec<BandHeader>,
489 num_tiles: [[usize; 4]; 4],
490 tile_start: [[usize; 4]; 4],
496 pub fn new(scalable: bool) -> Self {
497 let mut bands: Vec<BandHeader> = Vec::with_capacity(12);
498 bands.resize(12, BandHeader::new_empty(42, 42));
500 ftype: IVIFrameType::NULL,
501 frames: [FrameData::new(), FrameData::new(), FrameData::new(), FrameData::new()],
502 cur_frame: 0, prev_frame: MISSING_REF, next_frame: MISSING_REF,
503 iref_0: MISSING_REF, iref_1: MISSING_REF, scal_ref: MISSING_REF,
504 vinfo: NAVideoInfo::new(0, 0, false, YUV410_FORMAT),
505 vinfoa: NAVideoInfo::new(0, 0, false, YUVA410_FORMAT),
510 tiles: Vec::new(), tile_start: [[0; 4]; 4], num_tiles: [[0; 4]; 4],
516 fn realloc(&mut self, pic_hdr: &PictureHeader) -> DecoderResult<()> {
517 let planes = if pic_hdr.transparent { 4 } else { 3 };
519 //self.bands.clear();
521 self.num_tiles = [[0; 4]; 4];
522 self.tile_start = [[0; 4]; 4];
523 let mut tstart: usize = 0;
524 for plane in 0..planes {
525 let is_luma = (plane != 1) && (plane != 2);
526 let bands = if is_luma { pic_hdr.luma_bands } else { pic_hdr.chroma_bands };
527 let mut band_w = if is_luma { pic_hdr.width } else { (pic_hdr.width + 3) >> 2 };
528 let mut band_h = if is_luma { pic_hdr.height } else { (pic_hdr.height + 3) >> 2 };
529 let mut tile_w = if is_luma { pic_hdr.slice_w } else { (pic_hdr.slice_w + 3) >> 2 };
530 let mut tile_h = if is_luma { pic_hdr.slice_h } else { (pic_hdr.slice_h + 3) >> 2 };
532 band_w = (band_w + 1) >> 1;
533 band_h = (band_h + 1) >> 1;
535 tile_w = (tile_w + 1) >> 1;
536 tile_h = (tile_h + 1) >> 1;
540 self.band_tiles = ((band_w + tile_w - 1) / tile_w) * ((band_h + tile_h - 1) / tile_h);
542 for band in 0..bands {
543 self.tile_start[plane][band] = tstart;
544 let band_xoff = if (band & 1) == 1 { band_w } else { 0 };
545 let band_yoff = if (band & 2) == 2 { band_h } else { 0 };
548 let cur_h = if y + tile_h <= band_h { tile_h } else { band_h - y };
551 let cur_w = if x + tile_w <= band_w { tile_w } else { band_w - x };
552 let tile = IVITile::new(band_xoff + x, band_yoff + y, cur_w, cur_h);
553 self.tiles.push(tile);
554 self.num_tiles[plane][band] += 1;
564 fn decode_band(&mut self, pic_hdr: &PictureHeader, dec: &mut dyn IndeoXParser, br: &mut BitReader, plane_no: usize, band_no: usize) -> DecoderResult<()> {
565 let bidx = match plane_no {
567 _ => { pic_hdr.luma_bands + plane_no - 1 },
569 let prev_band = if bidx >= self.bands.len() { BandHeader::new_empty(plane_no, band_no) } else { self.bands[bidx].clone() };
570 let mut band = dec.decode_band_header(br, pic_hdr, plane_no, band_no)?;
571 if let TxType::None = band.ttype {
572 validate!(band.plane_no == prev_band.plane_no);
573 validate!(band.band_no == prev_band.band_no);
574 validate!(band.blk_size == prev_band.blk_size);
575 band.tr = prev_band.tr;
576 band.ttype = prev_band.ttype;
579 let tstart = self.tile_start[band.plane_no][band.band_no];
580 let tend = tstart + self.num_tiles[band.plane_no][band.band_no];
581 let mb_size = band.mb_size;
582 let (tr, tr_dc) = match band.ttype {
583 TxType::Transform4(_) => { ivi_get_transform4x4_funcs(band.tr) },
584 TxType::Transform8(_) => { ivi_get_transform8x8_funcs(band.tr) },
585 _ => { ivi_get_transform4x4_funcs(band.tr) },
587 for tile_no in tstart..tend {
589 let tile = &mut self.tiles[tile_no];
590 let mb_w = (tile.w + mb_size - 1) / mb_size;
591 let mb_h = (tile.h + mb_size - 1) / mb_size;
595 tile.mb.resize(mb_w * mb_h, MB::new(0, 0));
598 let tile_start = br.tell();
599 if !br.read_bool()? {
600 let res = br.read_bool()?;
602 let mut len = br.read(8)? as usize;
604 len = br.read(24)? as usize;
608 let tile_end = (tile_start & !7) + len * 8;
609 validate!(tile_end > br.tell());
610 validate!(tile_end <= br.tell() + (br.left() as usize));
612 let ref_tile: Option<&IVITile>;
613 let mv_scale = if (plane_no == 0) && (band_no == 0) { 0 } else {
614 (((self.bands[0].mb_size >> 3) as i8) - ((band.mb_size >> 3) as i8)) as u8
616 let (ref_tiles, cur_tiles) = self.tiles.split_at_mut(tile_no);
617 let tile = &mut cur_tiles[0];
618 if plane_no != 0 || band_no != 0 {
619 let rtile = &ref_tiles[tile_no % self.band_tiles];
620 if (tile.mb_w != rtile.mb_w) || (tile.mb_h != rtile.mb_h) {
623 ref_tile = Some(rtile);
628 dec.decode_mb_info(br, pic_hdr, &band, tile, ref_tile, mv_scale)?;
631 self.decode_tile(br, &band, tile_no, tr, tr_dc)?;
633 let skip_part = tile_end - br.tell();
634 br.skip(skip_part as u32)?;
637 let ref_tile: Option<&IVITile>;
638 let mv_scale = if (plane_no == 0) && (band_no == 0) { 0 } else {
639 (((self.bands[0].mb_size >> 3) as i8) - ((band.mb_size >> 3) as i8)) as u8
641 let (ref_tiles, cur_tiles) = self.tiles.split_at_mut(tile_no);
642 let tile = &mut cur_tiles[0];
643 if plane_no != 0 || band_no != 0 {
644 let rtile = &ref_tiles[0];
645 if (tile.mb_w != rtile.mb_w) || (tile.mb_h != rtile.mb_h) {
648 ref_tile = Some(rtile);
654 for mb_y in 0..tile.mb_h {
655 for mb_x in 0..tile.mb_w {
656 let mut mb = MB::new(tile.pos_x + mb_x * band.mb_size, tile.pos_y + mb_y * band.mb_size);
657 mb.mtype = MBType::Inter;
660 if let Some(tileref) = ref_tile {
661 let mx = tileref.mb[mb_idx].mv_x;
662 let my = tileref.mb[mb_idx].mv_y;
663 mb.mv_x = scale_mv(mx, mv_scale);
664 mb.mv_y = scale_mv(my, mv_scale);
667 tile.mb[mb_idx] = mb;
672 self.decode_tile(br, &band, tile_no, tr, tr_dc)?;
675 self.bands[bidx] = band;
679 #[allow(clippy::collapsible_else_if)]
680 fn decode_tile(&mut self, br: &mut BitReader, band: &BandHeader, tile_no: usize, tr: TrFunc, transform_dc: TrFuncDC) -> DecoderResult<()> {
682 let mut prev_dc: i32 = 0;
683 let tile = &mut self.tiles[tile_no];
684 let mut frame = self.frames[self.cur_frame].clone();
686 let stride = frame.plane_stride[band.plane_no];
687 let mut dstidx = tile.pos_x + tile.pos_y * stride;
688 let dst = &mut frame.plane_buf[band.plane_no];
689 let pos_x = tile.pos_x;
690 let pos_y = tile.pos_y;
691 let tile_w = (tile.w + 15) & !15;
692 let tile_h = (tile.h + 15) & !15;
693 for mb_y in 0..tile.mb_h {
694 for mb_x in 0..tile.mb_w {
695 let mb = &mut tile.mb[mb_idx];
697 let is_intra = mb.mtype == MBType::Intra;
699 if band.mb_size != band.blk_size {
700 let mut cbp = mb.cbp;
702 let mut blk: [i32; 64] = [0; 64];
703 let boff = (blk_no & 1) * band.blk_size + (blk_no >> 1) * band.blk_size * stride + mb_x * band.mb_size;
705 if mb.mtype != MBType::Bidir {
706 let idx = if mb.mtype != MBType::Backward { self.prev_frame } else { self.next_frame };
707 let pf = &self.frames[idx];
708 do_mc(&mut dst[dstidx + boff..], stride,
709 &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no],
710 pos_x + mb_x * band.mb_size + (blk_no & 1) * band.blk_size,
711 pos_y + mb_y * band.mb_size + (blk_no >> 1) * band.blk_size,
712 pos_x, pos_x + tile_w, pos_y, pos_y + tile_h,
713 mb.mv_x, mb.mv_y, band.halfpel, band.blk_size);
715 let pf = &self.frames[self.prev_frame];
716 let nf = &self.frames[self.next_frame];
717 do_mc_b(&mut dst[dstidx + boff..], stride,
718 &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no],
719 &nf.plane_buf[band.plane_no], nf.plane_stride[band.plane_no],
720 pos_x + mb_x * band.mb_size + (blk_no & 1) * band.blk_size,
721 pos_y + mb_y * band.mb_size + (blk_no >> 1) * band.blk_size,
722 pos_x, pos_x + tile_w, pos_y, pos_y + tile_h,
723 mb.mv_x, mb.mv_y, mb.mv2_x, mb.mv2_y, band.halfpel,
728 if let TxType::Transform8(ref params) = band.ttype {
729 decode_block8x8(br, &band.blk_cb, &band.rvmap, params, is_intra, band.tr.is_2d(), &mut prev_dc, mb.q, &mut blk, tr)?;
731 put_block(dst, dstidx + boff, stride, &blk, 8);
733 add_block(dst, dstidx + boff, stride, &blk, 8);
736 if let TxType::Transform4(ref params) = band.ttype {
737 decode_block4x4(br, &band.blk_cb, &band.rvmap, params, is_intra, band.tr.is_2d(), &mut prev_dc, mb.q, &mut blk, tr)?;
739 put_block(dst, dstidx + boff, stride, &blk, 4);
741 add_block(dst, dstidx + boff, stride, &blk, 4);
746 (transform_dc)(&mut blk, prev_dc);
747 put_block(dst, dstidx + boff, stride, &blk, band.blk_size);
753 let mut blk: [i32; 64] = [0; 64];
755 if mb.mtype != MBType::Bidir {
756 let idx = if mb.mtype != MBType::Backward { self.prev_frame } else { self.next_frame };
757 let pf = &self.frames[idx];
758 do_mc(&mut dst[dstidx + mb_x * band.blk_size..], stride,
759 &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no],
760 pos_x + mb_x * band.mb_size,
761 pos_y + mb_y * band.mb_size,
762 pos_x, pos_x + tile_w, pos_y, pos_y + tile_h,
763 mb.mv_x, mb.mv_y, band.halfpel, band.blk_size);
765 let pf = &self.frames[self.prev_frame];
766 let nf = &self.frames[self.next_frame];
767 do_mc_b(&mut dst[dstidx + mb_x * band.blk_size..], stride,
768 &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no],
769 &nf.plane_buf[band.plane_no], nf.plane_stride[band.plane_no],
770 pos_x + mb_x * band.mb_size,
771 pos_y + mb_y * band.mb_size,
772 pos_x, pos_x + tile_w, pos_y, pos_y + tile_h,
773 mb.mv_x, mb.mv_y, mb.mv2_x, mb.mv2_y, band.halfpel,
778 if let TxType::Transform8(ref params) = band.ttype {
779 decode_block8x8(br, &band.blk_cb, &band.rvmap, params, is_intra, band.tr.is_2d(), &mut prev_dc, mb.q, &mut blk, tr)?;
781 if let TxType::Transform4(ref params) = band.ttype {
782 decode_block4x4(br, &band.blk_cb, &band.rvmap, params, is_intra, band.tr.is_2d(), &mut prev_dc, mb.q, &mut blk, tr)?;
785 if band.blk_size == 8 {
786 put_block(dst, dstidx + mb_x * band.blk_size, stride, &blk, 8);
788 put_block(dst, dstidx + mb_x * band.blk_size, stride, &blk, 4);
791 if band.blk_size == 8 {
792 add_block(dst, dstidx + mb_x * band.blk_size, stride, &blk, 8);
794 add_block(dst, dstidx + mb_x * band.blk_size, stride, &blk, 4);
799 (transform_dc)(&mut blk, prev_dc);
800 if band.blk_size == 8 {
801 put_block(dst, dstidx + mb_x * band.blk_size, stride, &blk, 8);
803 put_block(dst, dstidx + mb_x * band.blk_size, stride, &blk, 4);
810 dstidx += stride * band.mb_size;
815 fn find_unused_frame(&self) -> usize {
817 if (fno != self.iref_0) && (fno != self.iref_1) && (fno != self.scal_ref) {
824 fn decode_single_frame(&mut self, dec: &mut dyn IndeoXParser, br: &mut BitReader) -> DecoderResult<NABufferType> {
825 let pic_hdr = dec.decode_picture_header(br)?;
826 self.ftype = pic_hdr.ftype;
827 if pic_hdr.ftype.is_null() {
828 return Ok(NABufferType::None);
831 self.cur_frame = self.find_unused_frame();
833 IVIFrameType::Inter => {
834 self.prev_frame = self.iref_0;
835 if self.prev_frame == MISSING_REF {
836 return Err(DecoderError::MissingReference);
839 IVIFrameType::InterDroppable => {
840 self.prev_frame = self.scal_ref;
841 if self.prev_frame == MISSING_REF {
842 return Err(DecoderError::MissingReference);
845 IVIFrameType::InterScal => {
846 self.prev_frame = self.scal_ref;
847 if self.prev_frame == MISSING_REF {
848 return Err(DecoderError::MissingReference);
851 IVIFrameType::Bidir => {
852 self.prev_frame = self.iref_1;
853 self.next_frame = self.iref_0;
854 if (self.prev_frame == MISSING_REF) || (self.next_frame == MISSING_REF) {
855 return Err(DecoderError::MissingReference);
861 let mut vinfo = if pic_hdr.transparent { self.vinfoa } else { self.vinfo };
862 vinfo.set_width(pic_hdr.width);
863 vinfo.set_height(pic_hdr.height);
864 let mut buftype = alloc_video_buffer(vinfo, 0)?;
865 self.realloc(&pic_hdr)?;
866 self.frames[self.cur_frame].realloc(&pic_hdr)?;
870 let num_bands = if plane == 0 { pic_hdr.luma_bands } else { pic_hdr.chroma_bands };
871 for band in 0..num_bands {
872 self.decode_band(&pic_hdr, dec, br, plane, band)?;
874 if let NABufferType::Video(ref mut vb) = buftype {
875 let mut frame = self.frames[self.cur_frame].clone();
877 frame.fill_plane(vb, plane);
879 let dplane = if (plane == 1) || (plane == 2) { plane ^ 3 } else { plane };
880 let (w, h) = vb.get_dimensions(dplane);
881 let dstride = vb.get_stride(dplane);
882 let off = vb.get_offset(dplane);
883 let dst = vb.get_data_mut().unwrap();
884 dec.recombine_plane(&frame.plane_buf[plane], frame.plane_stride[plane], &mut dst[off..], dstride, w, h);
889 let mut bands_decoded = [[false; 10]; 3];
890 let mut num_decoded = 0;
892 let num_bands = [ pic_hdr.luma_bands, pic_hdr.chroma_bands, pic_hdr.chroma_bands ];
895 for band in 0..num_bands[plane] {
896 if br.peek(8) == 0x01 { // skipped scalable bands
900 self.decode_band(&pic_hdr, dec, br, plane, band)?;
901 bands_decoded[plane][band] = true;
905 if (num_decoded < num_bands[0] + num_bands[1] + num_bands[2]) && (br.left() > 0) {
906 validate!(br.read(8)? == 0x00);
907 while br.peek(8) == 0x00 {
908 if br.skip(8).is_err() { // happens at the end of data
912 validate!((br.tell() & 31) == 0);
914 for (plane, &nbands) in num_bands.iter().enumerate() {
915 for (band, band_decoded) in bands_decoded[plane][..nbands].iter_mut().enumerate() {
916 if *band_decoded || br.left() == 0 {
919 self.decode_band(&pic_hdr, dec, br, plane, band)?;
920 *band_decoded = true;
926 if let NABufferType::Video(ref mut vb) = buftype {
927 for (plane, &nbands) in num_bands.iter().enumerate() {
928 let mut frame = self.frames[self.cur_frame].clone();
930 frame.fill_plane(vb, plane);
932 let dplane = if (plane == 1) || (plane == 2) { plane ^ 3 } else { plane };
933 let (w, h) = vb.get_dimensions(dplane);
934 let dstride = vb.get_stride(dplane);
935 let off = vb.get_offset(dplane);
936 let dst = vb.get_data_mut().unwrap();
937 dec.recombine_plane(&frame.plane_buf[plane], frame.plane_stride[plane], &mut dst[off..], dstride, w, h);
942 if pic_hdr.transparent {
943 let mut frame = self.frames[self.cur_frame].clone();
944 let stride = frame.plane_stride[3];
945 read_trans_band_header(br, pic_hdr.width, pic_hdr.height, &mut frame.plane_buf[3], stride)?;
946 if let NABufferType::Video(ref mut vb) = buftype {
947 frame.fill_plane(vb, 3);
952 IVIFrameType::Intra | IVIFrameType::Intra1 | IVIFrameType::Inter => {
953 self.iref_1 = self.iref_0;
954 self.iref_0 = self.cur_frame;
955 self.scal_ref = self.cur_frame;
957 IVIFrameType::InterScal => {
958 self.scal_ref = self.cur_frame;
966 pub fn decode_frame(&mut self, dec: &mut dyn IndeoXParser, br: &mut BitReader) -> DecoderResult<NABufferType> {
967 let res = self.decode_single_frame(dec, br)?;
968 if (self.ftype == IVIFrameType::Intra) && (br.left() > 16) {
970 if br.left() < 8 { break; }
971 if br.read(8)? == 0 { break; }
974 if br.left() < 8 { break; }
975 if br.peek(8) != 0 { break; }
979 let seq = br.peek(21);
981 let res2 = self.decode_single_frame(dec, br);
982 if let Ok(res) = res2 {
983 self.bref = Some(res);
986 self.ftype = IVIFrameType::Intra;
989 if self.bref.is_some() && self.ftype == IVIFrameType::Inter {
990 let mut bref: Option<NABufferType> = Some(res);
991 mem::swap(&mut bref, &mut self.bref);
992 return Ok(bref.unwrap());
994 if let NABufferType::None = res {
995 if self.bref.is_some() {
996 let mut bref: Option<NABufferType> = None;
997 mem::swap(&mut bref, &mut self.bref);
998 self.ftype = IVIFrameType::Inter;
999 return Ok(bref.unwrap());
1005 pub fn flush(&mut self) {
1006 self.prev_frame = MISSING_REF;
1007 self.next_frame = MISSING_REF;
1008 self.iref_0 = MISSING_REF;
1009 self.iref_1 = MISSING_REF;
1010 self.scal_ref = MISSING_REF;
1013 pub fn is_intra(&self) -> bool {
1014 self.ftype.is_intra()
1016 pub fn get_frame_type(&self) -> FrameType {
1018 IVIFrameType::Intra => { FrameType::I },
1019 IVIFrameType::Intra1 => { FrameType::I },
1020 IVIFrameType::Inter => { FrameType::P },
1021 IVIFrameType::InterDroppable => { FrameType::P },
1022 IVIFrameType::InterScal => { FrameType::P },
1023 IVIFrameType::Bidir => { FrameType::B },
1024 _ => { FrameType::Skip },
1032 pub runtab: [u8; 256],
1033 pub valtab: [i8; 256],
1036 impl Clone for RVMap {
1037 fn clone(&self) -> RVMap {
1038 let mut runtab: [u8; 256] = [0; 256];
1039 let mut valtab: [i8; 256] = [0; 256];
1040 runtab.copy_from_slice(&self.runtab);
1041 valtab.copy_from_slice(&self.valtab);
1042 RVMap { eob_sym: self.eob_sym, esc_sym: self.esc_sym, runtab, valtab }
1046 pub const IVI_ZERO_RVMAP: RVMap = RVMap { eob_sym: 0, esc_sym: 0, runtab: [0; 256], valtab: [0; 256] };
1048 pub static IVI_RVMAPS: [RVMap; 9] = [
1049 RVMap { eob_sym: 5, esc_sym: 2, runtab: [
1050 1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3,
1051 1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5,
1052 1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1,
1053 8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9,
1054 9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3,
1055 2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12,
1056 8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13,
1057 2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8,
1058 1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8,
1059 6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21,
1060 22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8,
1061 4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6,
1062 1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28,
1063 1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41,
1064 6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1,
1065 30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38 ],
1067 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1,
1068 6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1,
1069 10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13,
1070 1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1,
1071 -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4,
1072 7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1,
1073 2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1,
1074 9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3,
1075 28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4,
1076 3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1,
1077 -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5,
1078 5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4,
1079 -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1,
1080 37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1,
1081 5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40,
1082 -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1 ],
1084 RVMap { eob_sym: 0, esc_sym: 38, runtab: [
1085 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7,
1086 7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16,
1087 14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
1088 25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27,
1089 33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34,
1090 37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38,
1091 40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44,
1092 57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1,
1093 52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64,
1094 60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13,
1095 12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4,
1096 1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25,
1097 21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33,
1098 29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3,
1099 28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41,
1100 2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5 ],
1102 0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1,
1103 -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1,
1104 -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1,
1105 1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1,
1106 1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1,
1107 1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1,
1108 -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1,
1109 -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4,
1110 1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1,
1111 1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2,
1112 2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3,
1113 6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2,
1114 2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2,
1115 2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4,
1116 -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2,
1117 -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4 ],
1119 RVMap { eob_sym: 2, esc_sym: 11, runtab: [
1120 1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5,
1121 2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2,
1122 2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13,
1123 3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7,
1124 1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3,
1125 9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22,
1126 23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32,
1127 28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31,
1128 49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3,
1129 3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57,
1130 1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2,
1131 50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1,
1132 45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17,
1133 17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55,
1134 7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4,
1135 8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62 ],
1137 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1,
1138 2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3,
1139 -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1,
1140 3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2,
1141 7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4,
1142 2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1,
1143 1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1,
1144 1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1,
1145 1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5,
1146 -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1,
1147 -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7,
1148 -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13,
1149 1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2,
1150 -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1,
1151 -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6,
1152 -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1 ]
1154 RVMap { eob_sym: 0, esc_sym: 35, runtab: [
1155 0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7,
1156 7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3,
1157 3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1,
1158 5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20,
1159 21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26,
1160 9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32,
1161 2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41,
1162 35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40,
1163 12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16,
1164 43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48,
1165 57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51,
1166 8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59,
1167 59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60,
1168 60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4,
1169 25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1,
1170 20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16 ],
1172 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1,
1173 -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2,
1174 -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4,
1175 2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1,
1176 1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1,
1177 2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1,
1178 4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1,
1179 -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1,
1180 2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2,
1181 1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1,
1182 -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1,
1183 -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1,
1184 -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1,
1185 1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5,
1186 -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12,
1187 -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3 ]
1189 RVMap { eob_sym: 0, esc_sym: 34, runtab: [
1190 0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5,
1191 2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1,
1192 2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1,
1193 9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4,
1194 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1,
1195 2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1196 2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12,
1197 3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1,
1198 4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1,
1199 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5,
1200 1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1,
1201 5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1,
1202 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1,
1203 3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1,
1204 1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8,
1205 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1 ],
1207 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1,
1208 2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9,
1209 3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13,
1210 1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2,
1211 18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23,
1212 -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29,
1213 6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1,
1214 4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39,
1215 3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47,
1216 -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3,
1217 -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63,
1218 -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67,
1219 -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70,
1220 6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79,
1221 75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2,
1222 83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89 ]
1224 RVMap { eob_sym: 2, esc_sym: 33, runtab: [
1225 1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1,
1226 1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1,
1227 1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1,
1228 12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2,
1229 6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3,
1230 8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2,
1231 1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4,
1232 4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1,
1233 1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2,
1234 2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13,
1235 1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31,
1236 3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2,
1237 1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8,
1238 36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1,
1239 1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4,
1240 40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7 ],
1242 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4,
1243 -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6,
1244 -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8,
1245 1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5,
1246 2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4,
1247 2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7,
1248 15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4,
1249 -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18,
1250 -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9,
1251 -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2,
1252 22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1,
1253 7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11,
1254 26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4,
1255 -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29,
1256 30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7,
1257 -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5 ]
1259 RVMap { eob_sym: 2, esc_sym: 13, runtab: [
1260 1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2,
1261 4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1,
1262 3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9,
1263 4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2,
1264 1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1,
1265 6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7,
1266 15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1,
1267 2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1,
1268 17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1,
1269 6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1,
1270 4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2,
1271 1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1,
1272 1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1,
1273 12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6,
1274 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25,
1275 14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2 ],
1277 -20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2,
1278 1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8,
1279 2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1,
1280 2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5,
1281 -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18,
1282 2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2,
1283 -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25,
1284 -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29,
1285 1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33,
1286 -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37,
1287 -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11,
1288 -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44,
1289 45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48,
1290 -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4,
1291 6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1,
1292 2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14 ]
1294 RVMap { eob_sym: 2, esc_sym: 38, runtab: [
1295 1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6,
1296 6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1,
1297 1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5,
1298 14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7,
1299 8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20,
1300 19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23,
1301 24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7,
1302 26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2,
1303 28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30,
1304 32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14,
1305 6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9,
1306 37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5,
1307 3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6,
1308 1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1,
1309 8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45,
1310 12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49 ],
1312 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1,
1313 -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5,
1314 -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2,
1315 1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2,
1316 2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1,
1317 -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1,
1318 -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3,
1319 1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7,
1320 -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1,
1321 -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2,
1322 -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3,
1323 -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5,
1324 -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5,
1325 20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21,
1326 5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1,
1327 3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1 ]
1329 RVMap { eob_sym: 4, esc_sym: 11, runtab: [
1330 1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2,
1331 4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1,
1332 7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9,
1333 2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4,
1334 4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8,
1335 2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4,
1336 1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21,
1337 25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1,
1338 1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2,
1339 4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30,
1340 6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1,
1341 37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41,
1342 13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42,
1343 3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15,
1344 44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7,
1345 50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1 ],
1347 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2,
1348 1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7,
1349 1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1,
1350 5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3,
1351 -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2,
1352 7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4,
1353 15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1,
1354 1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17,
1355 -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9,
1356 -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1,
1357 4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20,
1358 1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1,
1359 -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1,
1360 8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2,
1361 1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5,
1362 1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26 ]