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