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