Declare indeo VLC table storage with correct type
[libav.git] / libavcodec / ivi_common.c
1 /*
2 * common functions for Indeo Video Interactive codecs (Indeo4 and Indeo5)
3 *
4 * Copyright (c) 2009 Maxim Poliakovski
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23 /**
24 * @file libavcodec/ivi_common.c
25 * This file contains functions and data shared by both Indeo4 and
26 * Indeo5 decoders.
27 */
28
29 #define ALT_BITSTREAM_READER_LE
30 #include "avcodec.h"
31 #include "get_bits.h"
32 #include "ivi_common.h"
33 #include "libavutil/common.h"
34 #include "ivi_dsp.h"
35
36 extern const IVIHuffDesc ff_ivi_mb_huff_desc[8]; ///< static macroblock huffman tables
37 extern const IVIHuffDesc ff_ivi_blk_huff_desc[8]; ///< static block huffman tables
38
39 VLC ff_ivi_mb_vlc_tabs [8];
40 VLC ff_ivi_blk_vlc_tabs[8];
41
42 /**
43 * Reverses "nbits" bits of the value "val" and returns the result
44 * in the least significant bits.
45 */
46 static uint16_t inv_bits(uint16_t val, int nbits)
47 {
48 uint16_t res;
49
50 if (nbits <= 8) {
51 res = av_reverse[val] >> (8-nbits);
52 } else
53 res = ((av_reverse[val & 0xFF] << 8) + (av_reverse[val >> 8])) >> (16-nbits);
54
55 return res;
56 }
57
58 int ff_ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag)
59 {
60 int pos, i, j, codes_per_row, prefix, not_last_row;
61 uint16_t codewords[256]; /* FIXME: move this temporal storage out? */
62 uint8_t bits[256];
63
64 pos = 0; /* current position = 0 */
65
66 for (i = 0; i < cb->num_rows; i++) {
67 codes_per_row = 1 << cb->xbits[i];
68 not_last_row = (i != cb->num_rows - 1);
69 prefix = ((1 << i) - 1) << (cb->xbits[i] + not_last_row);
70
71 for (j = 0; j < codes_per_row; j++) {
72 if (pos >= 256) /* Some Indeo5 codebooks can have more than 256 */
73 break; /* elements, but only 256 codes are allowed! */
74
75 bits[pos] = i + cb->xbits[i] + not_last_row;
76 if (bits[pos] > IVI_VLC_BITS)
77 return -1; /* invalid descriptor */
78
79 codewords[pos] = inv_bits((prefix | j), bits[pos]);
80 if (!bits[pos])
81 bits[pos] = 1;
82
83 pos++;
84 }//for j
85 }//for i
86
87 /* number of codewords = pos */
88 return init_vlc(vlc, IVI_VLC_BITS, pos, bits, 1, 1, codewords, 2, 2,
89 (flag ? INIT_VLC_USE_NEW_STATIC : 0) | INIT_VLC_LE);
90 }
91
92 void ff_ivi_init_static_vlc()
93 {
94 int i;
95 static VLC_TYPE table_data[8192 * 16][2];
96 static int initialized_vlcs = 0;
97
98 if (initialized_vlcs)
99 return;
100 for (i = 0; i < 8; i++) {
101 ff_ivi_mb_vlc_tabs[i].table = table_data + i * 2 * 8192;
102 ff_ivi_mb_vlc_tabs[i].table_allocated = 8192;
103 ff_ivi_create_huff_from_desc(&ff_ivi_mb_huff_desc[i], &ff_ivi_mb_vlc_tabs[i], 1);
104 ff_ivi_blk_vlc_tabs[i].table = table_data + (i * 2 + 1) * 8192;
105 ff_ivi_blk_vlc_tabs[i].table_allocated = 8192;
106 ff_ivi_create_huff_from_desc(&ff_ivi_blk_huff_desc[i], &ff_ivi_blk_vlc_tabs[i], 1);
107 }
108 initialized_vlcs = 1;
109 }
110
111 int ff_ivi_dec_huff_desc(GetBitContext *gb, IVIHuffDesc *desc)
112 {
113 int tab_sel, i;
114
115 tab_sel = get_bits(gb, 3);
116 if (tab_sel == 7) {
117 /* custom huffman table (explicitly encoded) */
118 desc->num_rows = get_bits(gb, 4);
119
120 for (i = 0; i < desc->num_rows; i++)
121 desc->xbits[i] = get_bits(gb, 4);
122 }
123
124 return tab_sel;
125 }
126
127 int ff_ivi_huff_desc_cmp(const IVIHuffDesc *desc1, const IVIHuffDesc *desc2)
128 {
129 return desc1->num_rows != desc2->num_rows
130 || memcmp(desc1->xbits, desc2->xbits, desc1->num_rows);
131 }
132
133 void ff_ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src)
134 {
135 dst->num_rows = src->num_rows;
136 memcpy(dst->xbits, src->xbits, src->num_rows);
137 }
138
139 int av_cold ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg)
140 {
141 int p, b;
142 uint32_t b_width, b_height, align_fac, width_aligned, height_aligned, buf_size;
143 IVIBandDesc *band;
144
145 ff_ivi_free_buffers(planes);
146
147 /* fill in the descriptor of the luminance plane */
148 planes[0].width = cfg->pic_width;
149 planes[0].height = cfg->pic_height;
150 planes[0].num_bands = cfg->luma_bands;
151
152 /* fill in the descriptors of the chrominance planes */
153 planes[1].width = planes[2].width = (cfg->pic_width + 3) >> 2;
154 planes[1].height = planes[2].height = (cfg->pic_height + 3) >> 2;
155 planes[1].num_bands = planes[2].num_bands = cfg->chroma_bands;
156
157 for (p = 0; p < 3; p++) {
158 planes[p].bands = av_mallocz(planes[p].num_bands * sizeof(IVIBandDesc));
159 if (!planes[p].bands)
160 return AVERROR(ENOMEM);
161
162 /* select band dimensions: if there is only one band then it
163 * has the full size, if there are several bands each of them
164 * has only half size */
165 b_width = planes[p].num_bands == 1 ? planes[p].width : (planes[p].width + 1) >> 1;
166 b_height = planes[p].num_bands == 1 ? planes[p].height : (planes[p].height + 1) >> 1;
167
168 /* luma band buffers will be aligned on 16x16 (max macroblock size) */
169 /* chroma band buffers will be aligned on 8x8 (max macroblock size) */
170 align_fac = p ? 8 : 16;
171 width_aligned = FFALIGN(b_width , align_fac);
172 height_aligned = FFALIGN(b_height, align_fac);
173 buf_size = width_aligned * height_aligned * sizeof(int16_t);
174
175 for (b = 0; b < planes[p].num_bands; b++) {
176 band = &planes[p].bands[b]; /* select appropriate plane/band */
177 band->plane = p;
178 band->band_num = b;
179 band->width = b_width;
180 band->height = b_height;
181 band->pitch = width_aligned;
182 band->bufs[0] = av_malloc(buf_size);
183 band->bufs[1] = av_malloc(buf_size);
184 if (!band->bufs[0] || !band->bufs[1])
185 return AVERROR(ENOMEM);
186
187 /* allocate the 3rd band buffer for scalability mode */
188 if (cfg->luma_bands > 1) {
189 band->bufs[2] = av_malloc(buf_size);
190 if (!band->bufs[2])
191 return AVERROR(ENOMEM);
192 }
193
194 planes[p].bands[0].huff_desc.num_rows = 0; /* reset custom vlc */
195 }
196 }
197
198 return 0;
199 }
200
201 void av_cold ff_ivi_free_buffers(IVIPlaneDesc *planes)
202 {
203 int p, b, t;
204
205 for (p = 0; p < 3; p++) {
206 for (b = 0; b < planes[p].num_bands; b++) {
207 av_freep(&planes[p].bands[b].bufs[0]);
208 av_freep(&planes[p].bands[b].bufs[1]);
209 av_freep(&planes[p].bands[b].bufs[2]);
210
211 for (t = 0; t < planes[p].bands[b].num_tiles; t++)
212 av_freep(&planes[p].bands[b].tiles[t].mbs);
213 av_freep(&planes[p].bands[b].tiles);
214 }
215 av_freep(&planes[p].bands);
216 }
217 }
218
219 int av_cold ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height)
220 {
221 int p, b, x, y, x_tiles, y_tiles, t_width, t_height;
222 IVIBandDesc *band;
223 IVITile *tile, *ref_tile;
224
225 for (p = 0; p < 3; p++) {
226 t_width = !p ? tile_width : (tile_width + 3) >> 2;
227 t_height = !p ? tile_height : (tile_height + 3) >> 2;
228
229 for (b = 0; b < planes[p].num_bands; b++) {
230 band = &planes[p].bands[b];
231 x_tiles = IVI_NUM_TILES(band->width, t_width);
232 y_tiles = IVI_NUM_TILES(band->height, t_height);
233 band->num_tiles = x_tiles * y_tiles;
234
235 av_freep(&band->tiles);
236 band->tiles = av_mallocz(band->num_tiles * sizeof(IVITile));
237 if (!band->tiles)
238 return AVERROR(ENOMEM);
239
240 tile = band->tiles;
241
242 /* use the first luma band as reference for motion vectors
243 * and quant */
244 ref_tile = planes[0].bands[0].tiles;
245
246 for (y = 0; y < band->height; y += t_height) {
247 for (x = 0; x < band->width; x += t_width) {
248 tile->xpos = x;
249 tile->ypos = y;
250 tile->width = FFMIN(band->width - x, t_width);
251 tile->height = FFMIN(band->height - y, t_height);
252 tile->is_empty = tile->data_size = 0;
253 /* calculate number of macroblocks */
254 tile->num_MBs = IVI_MBs_PER_TILE(tile->width, tile->height,
255 band->mb_size);
256
257 av_freep(&tile->mbs);
258 tile->mbs = av_malloc(tile->num_MBs * sizeof(IVIMbInfo));
259 if (!tile->mbs)
260 return AVERROR(ENOMEM);
261
262 tile->ref_mbs = 0;
263 if (p || b) {
264 tile->ref_mbs = ref_tile->mbs;
265 ref_tile++;
266 }
267
268 tile++;
269 }
270 }
271
272 }// for b
273 }// for p
274
275 return 0;
276 }
277
278 int ff_ivi_dec_tile_data_size(GetBitContext *gb)
279 {
280 int len;
281
282 len = 0;
283 if (get_bits1(gb)) {
284 len = get_bits(gb, 8);
285 if (len == 255)
286 len = get_bits_long(gb, 24);
287 }
288
289 /* align the bitstream reader on the byte boundary */
290 align_get_bits(gb);
291
292 return len;
293 }
294
295 int ff_ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile)
296 {
297 int mbn, blk, num_blocks, num_coeffs, blk_size, scan_pos, run, val,
298 pos, is_intra, mc_type, mv_x, mv_y, col_mask;
299 uint8_t col_flags[8];
300 int32_t prev_dc, trvec[64];
301 uint32_t cbp, sym, lo, hi, quant, buf_offs, q;
302 IVIMbInfo *mb;
303 RVMapDesc *rvmap = band->rv_map;
304 void (*mc_with_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
305 void (*mc_no_delta_func) (int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
306 const uint8_t *base_tab, *scale_tab;
307
308 prev_dc = 0; /* init intra prediction for the DC coefficient */
309
310 blk_size = band->blk_size;
311 col_mask = blk_size - 1; /* column mask for tracking non-zero coeffs */
312 num_blocks = (band->mb_size != blk_size) ? 4 : 1; /* number of blocks per mb */
313 num_coeffs = blk_size * blk_size;
314 if (blk_size == 8) {
315 mc_with_delta_func = ff_ivi_mc_8x8_delta;
316 mc_no_delta_func = ff_ivi_mc_8x8_no_delta;
317 } else {
318 mc_with_delta_func = ff_ivi_mc_4x4_delta;
319 mc_no_delta_func = ff_ivi_mc_4x4_no_delta;
320 }
321
322 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
323 is_intra = !mb->type;
324 cbp = mb->cbp;
325 buf_offs = mb->buf_offs;
326
327 quant = av_clip(band->glob_quant + mb->q_delta, 0, 23);
328
329 base_tab = is_intra ? band->intra_base : band->inter_base;
330 scale_tab = is_intra ? band->intra_scale : band->inter_scale;
331
332 if (!is_intra) {
333 mv_x = mb->mv_x;
334 mv_y = mb->mv_y;
335 if (!band->is_halfpel) {
336 mc_type = 0; /* we have only fullpel vectors */
337 } else {
338 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
339 mv_x >>= 1;
340 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
341 }
342 }
343
344 for (blk = 0; blk < num_blocks; blk++) {
345 /* adjust block position in the buffer according to its number */
346 if (blk & 1) {
347 buf_offs += blk_size;
348 } else if (blk == 2) {
349 buf_offs -= blk_size;
350 buf_offs += blk_size * band->pitch;
351 }
352
353 if (cbp & 1) { /* block coded ? */
354 scan_pos = -1;
355 memset(trvec, 0, num_coeffs*sizeof(trvec[0])); /* zero transform vector */
356 memset(col_flags, 0, sizeof(col_flags)); /* zero column flags */
357
358 while (scan_pos <= num_coeffs) {
359 sym = get_vlc2(gb, band->blk_vlc->table, IVI_VLC_BITS, 1);
360 if (sym == rvmap->eob_sym)
361 break; /* End of block */
362
363 if (sym == rvmap->esc_sym) { /* Escape - run/val explicitly coded using 3 vlc codes */
364 run = get_vlc2(gb, band->blk_vlc->table, IVI_VLC_BITS, 1) + 1;
365 lo = get_vlc2(gb, band->blk_vlc->table, IVI_VLC_BITS, 1);
366 hi = get_vlc2(gb, band->blk_vlc->table, IVI_VLC_BITS, 1);
367 val = IVI_TOSIGNED((hi << 6) | lo); /* merge them and convert into signed val */
368 } else {
369 run = rvmap->runtab[sym];
370 val = rvmap->valtab[sym];
371 }
372
373 /* de-zigzag and dequantize */
374 scan_pos += run;
375 if (scan_pos >= num_coeffs)
376 break;
377 pos = band->scan[scan_pos];
378
379 if (IVI_DEBUG && !val)
380 av_log(NULL, AV_LOG_ERROR, "Val = 0 encountered!\n");
381
382 q = (base_tab[pos] * scale_tab[quant]) >> 8;
383 if (q > 1)
384 val = val * q + FFSIGN(val) * ((q >> 1) - (q & 1));
385 trvec[pos] = val;
386 col_flags[pos & col_mask] |= val; /* track columns containing non-zero coeffs */
387 }// while
388
389 if (scan_pos >= num_coeffs && sym != rvmap->eob_sym)
390 return -1; /* corrupt block data */
391
392 /* undoing DC coeff prediction for intra-blocks */
393 if (is_intra && band->is_2d_trans) {
394 prev_dc += trvec[0];
395 trvec[0] = prev_dc;
396 col_flags[0] |= !!prev_dc;
397 }
398
399 /* apply inverse transform */
400 band->inv_transform(trvec, band->buf + buf_offs,
401 band->pitch, col_flags);
402
403 /* apply motion compensation */
404 if (!is_intra)
405 mc_with_delta_func(band->buf + buf_offs,
406 band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
407 band->pitch, mc_type);
408 } else {
409 /* block not coded */
410 /* for intra blocks apply the dc slant transform */
411 /* for inter - perform the motion compensation without delta */
412 if (is_intra && band->dc_transform) {
413 band->dc_transform(&prev_dc, band->buf + buf_offs,
414 band->pitch, blk_size);
415 } else
416 mc_no_delta_func(band->buf + buf_offs,
417 band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
418 band->pitch, mc_type);
419 }
420
421 cbp >>= 1;
422 }// for blk
423 }// for mbn
424
425 align_get_bits(gb);
426
427 return 0;
428 }
429
430 void ff_ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
431 IVITile *tile, int32_t mv_scale)
432 {
433 int x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
434 int offs, mb_offset, row_offset;
435 IVIMbInfo *mb, *ref_mb;
436 const int16_t *src;
437 int16_t *dst;
438 void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch,
439 int mc_type);
440
441 offs = tile->ypos * band->pitch + tile->xpos;
442 mb = tile->mbs;
443 ref_mb = tile->ref_mbs;
444 row_offset = band->mb_size * band->pitch;
445 need_mc = 0; /* reset the mc tracking flag */
446
447 for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
448 mb_offset = offs;
449
450 for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
451 mb->xpos = x;
452 mb->ypos = y;
453 mb->buf_offs = mb_offset;
454
455 mb->type = 1; /* set the macroblocks type = INTER */
456 mb->cbp = 0; /* all blocks are empty */
457
458 if (!band->qdelta_present && !band->plane && !band->band_num) {
459 mb->q_delta = band->glob_quant;
460 mb->mv_x = 0;
461 mb->mv_y = 0;
462 }
463
464 if (band->inherit_qdelta && ref_mb)
465 mb->q_delta = ref_mb->q_delta;
466
467 if (band->inherit_mv) {
468 /* motion vector inheritance */
469 if (mv_scale) {
470 mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
471 mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
472 } else {
473 mb->mv_x = ref_mb->mv_x;
474 mb->mv_y = ref_mb->mv_y;
475 }
476 need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
477 }
478
479 mb++;
480 if (ref_mb)
481 ref_mb++;
482 mb_offset += band->mb_size;
483 } // for x
484 offs += row_offset;
485 } // for y
486
487 if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */
488 num_blocks = (band->mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */
489 mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
490 : ff_ivi_mc_4x4_no_delta;
491
492 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
493 mv_x = mb->mv_x;
494 mv_y = mb->mv_y;
495 if (!band->is_halfpel) {
496 mc_type = 0; /* we have only fullpel vectors */
497 } else {
498 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
499 mv_x >>= 1;
500 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
501 }
502
503 for (blk = 0; blk < num_blocks; blk++) {
504 /* adjust block position in the buffer according with its number */
505 offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
506 mc_no_delta_func(band->buf + offs,
507 band->ref_buf + offs + mv_y * band->pitch + mv_x,
508 band->pitch, mc_type);
509 }
510 }
511 } else {
512 /* copy data from the reference tile into the current one */
513 src = band->ref_buf + tile->ypos * band->pitch + tile->xpos;
514 dst = band->buf + tile->ypos * band->pitch + tile->xpos;
515 for (y = 0; y < tile->height; y++) {
516 memcpy(dst, src, tile->width*sizeof(band->buf[0]));
517 src += band->pitch;
518 dst += band->pitch;
519 }
520 }
521 }
522
523
524 #if IVI_DEBUG
525 uint16_t ivi_calc_band_checksum (IVIBandDesc *band)
526 {
527 int x, y;
528 int16_t *src, checksum;
529
530 src = band->buf;
531 checksum = 0;
532
533 for (y = 0; y < band->height; src += band->pitch, y++)
534 for (x = 0; x < band->width; x++)
535 checksum += src[x];
536
537 return checksum;
538 }
539
540 int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch)
541 {
542 int x, y, result;
543 uint8_t t1, t2;
544 int16_t *src;
545
546 src = band->buf;
547 result = 0;
548
549 for (y = 0; y < band->height; src += band->pitch, y++) {
550 for (x = 0; x < band->width; x++) {
551 t1 = av_clip(src[x] + 128, 0, 255);
552 t2 = ref[x];
553 if (t1 != t2) {
554 av_log(NULL, AV_LOG_ERROR, "Data mismatch: row %d, column %d\n",
555 y / band->blk_size, x / band->blk_size);
556 result = -1;
557 }
558 }
559 ref += pitch;
560 }
561
562 return result;
563 }
564 #endif
565
566 void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch)
567 {
568 int x, y;
569 const int16_t *src = plane->bands[0].buf;
570 uint32_t pitch = plane->bands[0].pitch;
571
572 for (y = 0; y < plane->height; y++) {
573 for (x = 0; x < plane->width; x++)
574 dst[x] = av_clip_uint8(src[x] + 128);
575 src += pitch;
576 dst += dst_pitch;
577 }
578 }
579
580
581 /**
582 * These are 2x8 predefined Huffman codebooks for coding macroblock/block
583 * signals. They are specified using "huffman descriptors" in order to
584 * avoid huge static tables. The decoding tables will be generated at
585 * startup from these descriptors.
586 */
587 const IVIHuffDesc ff_ivi_mb_huff_desc[8] = {
588 {8, {0, 4, 5, 4, 4, 4, 6, 6}},
589 {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
590 {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
591 {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
592 {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
593 {9, {0, 4, 4, 4, 4, 3, 3, 3, 2}},
594 {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
595 {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
596 };
597
598 const IVIHuffDesc ff_ivi_blk_huff_desc[8] = {
599 {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
600 {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
601 {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
602 {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
603 {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
604 {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
605 {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
606 {9, {3, 4, 4, 5, 5, 5, 6, 5, 5}}
607 };
608
609
610 /**
611 * Run-value (RLE) tables.
612 */
613 const RVMapDesc ff_ivi_rvmap_tabs[9] = {
614 { /* MapTab0 */
615 5, /* eob_sym */
616 2, /* esc_sym */
617 /* run table */
618 {1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3,
619 1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5,
620 1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1,
621 8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9,
622 9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3,
623 2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12,
624 8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13,
625 2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8,
626 1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8,
627 6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21,
628 22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8,
629 4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6,
630 1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28,
631 1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41,
632 6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1,
633 30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
634
635 /* value table */
636 { 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1,
637 6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1,
638 10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13,
639 1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1,
640 -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4,
641 7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1,
642 2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1,
643 9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3,
644 28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4,
645 3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1,
646 -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5,
647 5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4,
648 -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1,
649 37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1,
650 5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40,
651 -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1}
652 },{
653 /* MapTab1 */
654 0, /* eob_sym */
655 38, /* esc_sym */
656 /* run table */
657 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7,
658 7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16,
659 14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
660 25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27,
661 33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34,
662 37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38,
663 40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44,
664 57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1,
665 52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64,
666 60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13,
667 12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4,
668 1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25,
669 21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33,
670 29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3,
671 28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41,
672 2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5},
673
674 /* value table */
675 {0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1,
676 -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1,
677 -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1,
678 1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1,
679 1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1,
680 1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1,
681 -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1,
682 -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4,
683 1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1,
684 1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2,
685 2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3,
686 6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2,
687 2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2,
688 2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4,
689 -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2,
690 -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4}
691 },{
692 /* MapTab2 */
693 2, /* eob_sym */
694 11, /* esc_sym */
695 /* run table */
696 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5,
697 2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2,
698 2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13,
699 3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7,
700 1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3,
701 9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22,
702 23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32,
703 28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31,
704 49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3,
705 3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57,
706 1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2,
707 50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1,
708 45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17,
709 17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55,
710 7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4,
711 8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62},
712
713 /* value table */
714 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1,
715 2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3,
716 -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1,
717 3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2,
718 7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4,
719 2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1,
720 1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1,
721 1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1,
722 1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5,
723 -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1,
724 -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7,
725 -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13,
726 1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2,
727 -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1,
728 -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6,
729 -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1}
730 },{
731 /* MapTab3 */
732 0, /* eob_sym */
733 35, /* esc_sym */
734 /* run table */
735 {0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7,
736 7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3,
737 3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1,
738 5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20,
739 21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26,
740 9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32,
741 2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41,
742 35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40,
743 12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16,
744 43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48,
745 57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51,
746 8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59,
747 59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60,
748 60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4,
749 25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1,
750 20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16},
751
752 /* value table */
753 { 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1,
754 -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2,
755 -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4,
756 2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1,
757 1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1,
758 2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1,
759 4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1,
760 -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1,
761 2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2,
762 1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1,
763 -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1,
764 -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1,
765 -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1,
766 1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5,
767 -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12,
768 -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3}
769 },{
770 /* MapTab4 */
771 0, /* eob_sym */
772 34, /* esc_sym */
773 /* run table */
774 {0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5,
775 2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1,
776 2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1,
777 9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4,
778 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1,
779 2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
780 2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12,
781 3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1,
782 4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1,
783 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5,
784 1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1,
785 5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1,
786 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1,
787 3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1,
788 1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8,
789 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1},
790
791 /* value table */
792 { 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1,
793 2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9,
794 3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13,
795 1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2,
796 18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23,
797 -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29,
798 6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1,
799 4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39,
800 3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47,
801 -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3,
802 -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63,
803 -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67,
804 -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70,
805 6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79,
806 75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2,
807 83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89}
808 },{
809 /* MapTab5 */
810 2, /* eob_sym */
811 33, /* esc_sym */
812 /* run table */
813 {1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1,
814 1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1,
815 1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1,
816 12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2,
817 6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3,
818 8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2,
819 1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4,
820 4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1,
821 1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2,
822 2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13,
823 1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31,
824 3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2,
825 1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8,
826 36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1,
827 1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4,
828 40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7},
829
830 /* value table */
831 { 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4,
832 -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6,
833 -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8,
834 1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5,
835 2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4,
836 2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7,
837 15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4,
838 -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18,
839 -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9,
840 -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2,
841 22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1,
842 7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11,
843 26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4,
844 -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29,
845 30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7,
846 -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5}
847 },{
848 /* MapTab6 */
849 2, /* eob_sym */
850 13, /* esc_sym */
851 /* run table */
852 {1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2,
853 4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1,
854 3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9,
855 4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2,
856 1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1,
857 6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7,
858 15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1,
859 2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1,
860 17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1,
861 6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1,
862 4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2,
863 1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1,
864 1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1,
865 12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6,
866 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25,
867 14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2},
868
869 /* value table */
870 {-20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2,
871 1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8,
872 2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1,
873 2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5,
874 -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18,
875 2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2,
876 -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25,
877 -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29,
878 1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33,
879 -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37,
880 -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11,
881 -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44,
882 45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48,
883 -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4,
884 6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1,
885 2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14}
886 },{
887 /* MapTab7 */
888 2, /* eob_sym */
889 38, /* esc_sym */
890 /* run table */
891 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6,
892 6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1,
893 1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5,
894 14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7,
895 8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20,
896 19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23,
897 24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7,
898 26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2,
899 28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30,
900 32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14,
901 6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9,
902 37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5,
903 3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6,
904 1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1,
905 8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45,
906 12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49},
907
908 /* value table */
909 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1,
910 -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5,
911 -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2,
912 1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2,
913 2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1,
914 -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1,
915 -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3,
916 1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7,
917 -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1,
918 -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2,
919 -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3,
920 -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5,
921 -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5,
922 20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21,
923 5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1,
924 3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1}
925 },{
926 /* MapTab8 */
927 4, /* eob_sym */
928 11, /* esc_sym */
929 /* run table */
930 {1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2,
931 4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1,
932 7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9,
933 2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4,
934 4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8,
935 2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4,
936 1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21,
937 25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1,
938 1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2,
939 4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30,
940 6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1,
941 37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41,
942 13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42,
943 3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15,
944 44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7,
945 50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1},
946
947 /* value table */
948 { 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2,
949 1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7,
950 1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1,
951 5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3,
952 -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2,
953 7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4,
954 15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1,
955 1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17,
956 -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9,
957 -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1,
958 4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20,
959 1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1,
960 -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1,
961 8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2,
962 1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5,
963 1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26}
964 }
965 };