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