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