3 use std::cell::{Ref,RefCell};
11 pub fn scale_mv(val: i32, scale: u8) -> i32 {
12 (val + (if val > 0 { 1 } else { 0 }) + (scale as i32) - 1) >> scale
16 pub struct IVICodebook {
23 pub fn init(&self) -> Self {
25 let mut base: u32 = 0;
28 base += 1 << cb.bits[i];
34 pub const IVI_CB_ZERO: IVICodebook = IVICodebook { len: 0, bits: [0; 16] };
36 pub 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>;
42 impl<'a> IVICodebookReader for BitReader<'a> {
43 fn read_ivi_codebook_desc(&mut self, mb_cb: bool, desc_coded: bool) -> DecoderResult<IVICodebook> {
51 let idx = self.read(3)? as usize;
59 let mut cb = IVI_CB_ZERO;
60 cb.len = self.read(4)? as usize;
61 if cb.len == 0 { return Err(DecoderError::InvalidData); }
63 cb.bits[i] = self.read(4)? as u8;
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);
79 fn read_ivi_cb_s(&mut self, cb: &IVICodebook) -> BitReaderResult<i32> {
80 let v = self.read_ivi_cb(cb)?;
84 let sign = (v & 1) == 1;
85 let val = (v >> 1) as i32;
95 pub 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 ] }
106 pub 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 ] }
117 #[allow(unused_variables)]
118 fn 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)?;
128 let has_trans_color = br.read_bool()?;
137 let mut cb = IVI_CB_ZERO;
138 cb.len = br.read(4)? as usize;
139 if cb.len == 0 { return Err(DecoderError::InvalidData); }
141 cb.bits[i] = br.read(4)? as u8;
145 let tile_start = br.tell();
146 let empty = br.read_bool()?;
149 let mut len = br.read(8)? as usize;
151 len = br.read(24)? as usize;
154 let tile_end = tile_start + len * 8;
156 let first_val = br.read_bool()?;
158 let mut dec_size = 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;
168 if (x < w) && (y < h) {
169 dst[x + y * dstride] = fill;
180 if (x < w) && (y < h) {
181 dst[x + y * dstride] = fill;
199 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<()> {
200 let mut idx: isize = -1;
201 let quant_mat = if is_intra { tables.quant_intra } else { tables.quant_inter };
203 let c = br.read_ivi_cb(blk_cb)?;
204 if c == rvmap.eob_sym { break; }
207 if c != rvmap.esc_sym {
209 run = rvmap.runtab[c as usize] as isize;
210 val = rvmap.valtab[c as usize] as i32;
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;
217 val = 0; // should not happen but still...
220 val = ((v >> 1) as i32) + 1;
222 val = -((v >> 1) as i32);
227 validate!((idx >= 0) && (idx < 64));
229 let spos = tables.scan[idx as usize];
230 let q = ((quant_mat[spos] as u32) * (quant as u32)) >> 9;
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; }
241 if is_intra && is_2d {
242 *prev_dc += coeffs[0];
243 coeffs[0] = *prev_dc;
248 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<()> {
249 let mut idx: isize = -1;
250 let quant_mat = if is_intra { tables.quant_intra } else { tables.quant_inter };
252 let c = br.read_ivi_cb(blk_cb)?;
253 if c == rvmap.eob_sym { break; }
256 if c != rvmap.esc_sym {
258 run = rvmap.runtab[c as usize] as isize;
259 val = rvmap.valtab[c as usize] as i32;
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)?;
264 let v = (hi << 6) + lo;
266 val = 0; // should not happen but still...
269 val = ((v >> 1) as i32) + 1;
271 val = -((v >> 1) as i32);
276 validate!((idx >= 0) && (idx < 16));
278 let spos = tables.scan[idx as usize];
279 let q = ((quant_mat[spos] as u32) * (quant as u32)) >> 9;
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; }
290 if is_intra && is_2d {
291 *prev_dc += coeffs[0];
292 coeffs[0] = *prev_dc;
298 fn put_block(frame: &mut [i16], mut offs: usize, stride: usize, blk: &[i32], blk_size: usize) {
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;
312 fn add_block(frame: &mut [i16], mut offs: usize, stride: usize, blk: &[i32], blk_size: usize) {
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;
327 plane_buf: [Vec<i16>; 4],
328 plane_stride: [usize; 4],
329 pic_hdr: PictureHeader,
332 fn align(val: usize, bits: u8) -> usize {
333 let mask = (1 << bits) - 1;
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),
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);
350 self.plane_buf[0].resize(stride * height, 0);
351 self.plane_stride[0] = stride;
353 self.plane_buf[plane].resize((stride >> 1) * (height >> 1), 0);
354 self.plane_stride[plane] = stride >> 1;
356 if pic_hdr.transparent {
357 self.plane_buf[3].resize(stride * height, 0);
358 self.plane_stride[3] = stride;
360 self.pic_hdr = *pic_hdr;
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];
370 let sstride = self.plane_stride[plane];
373 dst[didx + x] = clip8(src[sidx + x] + 128);
381 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) {
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)
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);
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);
398 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) {
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)
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) {
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)
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) {
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);
426 pub 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);
433 const MISSING_REF: usize = 42;
435 pub struct IVIDecoder {
437 frames: [Rc<RefCell<FrameData>>; 4],
446 bref: Option<NABufferType>,
448 bands: Vec<BandHeader>,
449 tiles: Vec<Rc<RefCell<IVITile>>>,
450 num_tiles: [[usize; 4]; 4],
451 tile_start: [[usize; 4]; 4],
455 pub fn new() -> Self {
456 let mut bands: Vec<BandHeader> = Vec::with_capacity(12);
457 bands.resize(12, BandHeader::new_empty(42, 42));
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),
468 tiles: Vec::new(), tile_start: [[0; 4]; 4], num_tiles: [[0; 4]; 4],
472 fn realloc(&mut self, pic_hdr: &PictureHeader) -> DecoderResult<()> {
473 let planes = if pic_hdr.transparent { 4 } else { 3 };
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 };
488 band_w = (band_w + 1) >> 1;
489 band_h = (band_h + 1) >> 1;
491 tile_w = (tile_w + 1) >> 1;
492 tile_h = (tile_h + 1) >> 1;
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 };
501 let cur_h = if y + tile_h <= band_h { tile_h } else { band_h - y };
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;
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 {
520 _ => { pic_hdr.luma_bands + plane_no - 1 },
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;
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) },
540 for tile_no in tstart..tend {
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;
548 tile.mb.resize(mb_w * mb_h, MB::new(0, 0));
551 let tile_start = br.tell();
552 if !br.read_bool()? {
553 let res = br.read_bool()?;
555 let mut len = br.read(8)? as usize;
557 len = br.read(24)? as usize;
561 let tile_end = tile_start + len * 8;
562 validate!(tile_end > br.tell());
563 validate!(tile_end <= br.tell() + (br.left() as usize));
565 let mut tile = self.tiles[tile_no].borrow_mut();
566 let ref_tile: Option<Ref<IVITile>>;
568 if (plane_no == 0) && (band_no == 0) {
571 mv_scale = (((self.bands[0].mb_size >> 3) as i8) - ((band.mb_size >> 3) as i8)) as u8;
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) {
578 ref_tile = Some(rtile);
583 dec.decode_mb_info(br, pic_hdr, &band, &mut tile, ref_tile, mv_scale)?;
586 self.decode_tile(br, &band, tile_no, &tr, &tr_dc)?;
587 let skip_part = tile_end - br.tell();
588 br.skip(skip_part as u32)?;
591 let mut tile = self.tiles[tile_no].borrow_mut();
592 let ref_tile: Option<Ref<IVITile>>;
594 if (plane_no == 0) && (band_no == 0) {
597 mv_scale = (((self.bands[0].mb_size >> 3) as i8) - ((band.mb_size >> 3) as i8)) as u8;
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) {
604 ref_tile = Some(rtile);
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;
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);
623 tile.mb[mb_idx] = mb;
628 self.decode_tile(br, &band, tile_no, &tr, &tr_dc)?;
631 self.bands[bidx] = band;
635 fn decode_tile(&mut self, br: &mut BitReader, band: &BandHeader, tile_no: usize, tr: &TrFunc, transform_dc: &TrFuncDC) -> DecoderResult<()> {
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();
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];
652 let is_intra = mb.mtype == MBType::Intra;
654 if band.mb_size != band.blk_size {
655 let mut cbp = mb.cbp;
657 let mut blk: [i32; 64] = [0; 64];
658 let boff = (blk_no & 1) * 8 + (blk_no & 2) * 4 * stride + mb_x * 16;
660 if mb.mtype != MBType::Bidir {
662 if mb.mtype != MBType::Backward {
663 idx = self.prev_frame;
665 idx = self.next_frame;
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);
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,
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)?;
691 put_block(&mut dst, dstidx + boff, stride, &blk, 8);
693 add_block(&mut dst, dstidx + boff, stride, &blk, 8);
698 (transform_dc)(&mut blk, prev_dc);
699 put_block(&mut dst, dstidx + boff, stride, &blk, 8);
705 let mut blk: [i32; 64] = [0; 64];
707 if mb.mtype != MBType::Bidir {
709 if mb.mtype != MBType::Backward {
710 idx = self.prev_frame;
712 idx = self.next_frame;
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);
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,
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)?;
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)?;
742 put_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, band.blk_size);
744 add_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, band.blk_size);
748 (transform_dc)(&mut blk, prev_dc);
749 put_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, band.blk_size);
755 dstidx += stride * band.mb_size;
761 fn find_unused_frame(&self) -> usize {
763 if (fno != self.iref_0) && (fno != self.iref_1) && (fno != self.scal_ref) {
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);
777 self.cur_frame = self.find_unused_frame();
779 IVIFrameType::Inter => {
780 self.prev_frame = self.iref_0;
781 if self.prev_frame == MISSING_REF {
782 return Err(DecoderError::MissingReference);
785 IVIFrameType::InterDroppable => {
786 self.prev_frame = self.scal_ref;
787 if self.prev_frame == MISSING_REF {
788 return Err(DecoderError::MissingReference);
791 IVIFrameType::InterScal => {
792 self.prev_frame = self.scal_ref;
793 if self.prev_frame == MISSING_REF {
794 return Err(DecoderError::MissingReference);
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);
808 if pic_hdr.transparent {
809 vinfo = self.vinfoa.clone();
811 vinfo = self.vinfo.clone();
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)?;
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)?;
824 if let NABufferType::Video(ref mut vb) = buftype {
825 let mut frame = self.frames[self.cur_frame].borrow_mut();
827 frame.fill_plane(vb, plane);
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);
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);
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;
852 IVIFrameType::InterScal => {
853 self.scal_ref = self.cur_frame;
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) {
866 if br.left() < 8 { break; }
867 if br.read(8)? == 0 { break; }
870 if br.left() < 8 { break; }
871 if br.peek(8) != 0 { break; }
875 let seq = br.peek(21);
877 let res2 = self.decode_single_frame(dec, br);
879 self.bref = Some(res2.unwrap());
882 self.ftype = IVIFrameType::Intra;
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());
896 pub fn is_intra(&mut self) -> bool {
897 self.ftype.is_intra()
899 pub fn get_frame_type(&mut self) -> FrameType {
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 },
915 pub runtab: [u8; 256],
916 pub valtab: [i8; 256],
919 impl 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 }
929 pub const IVI_ZERO_RVMAP: RVMap = RVMap { eob_sym: 0, esc_sym: 0, runtab: [0; 256], valtab: [0; 256] };
931 pub 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 ],
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 ],
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 ],
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 ],
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 ],
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 ]
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 ],
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 ]
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 ],
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 ]
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 ],
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 ]
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 ],
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 ]
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 ],
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 ]
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 ],
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 ]