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