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