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