]> git.sesse.net Git - ffmpeg/blob - libavcodec/ivi_common.c
Merge commit 'a1e05b0487a1939334c2920fc7f9936bc9efe876'
[ffmpeg] / 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
25  * This file contains functions and data shared by both Indeo4 and
26  * Indeo5 decoders.
27  */
28
29 #define BITSTREAM_READER_LE
30 #include "libavutil/attributes.h"
31 #include "avcodec.h"
32 #include "get_bits.h"
33 #include "internal.h"
34 #include "mathops.h"
35 #include "ivi_common.h"
36 #include "ivi_dsp.h"
37
38 extern const IVIHuffDesc ff_ivi_mb_huff_desc[8];  ///< static macroblock huffman tables
39 extern const IVIHuffDesc ff_ivi_blk_huff_desc[8]; ///< static block huffman tables
40
41 static VLC ivi_mb_vlc_tabs [8]; ///< static macroblock Huffman tables
42 static VLC ivi_blk_vlc_tabs[8]; ///< static block Huffman tables
43
44 /**
45  *  Reverse "nbits" bits of the value "val" and return the result
46  *  in the least significant bits.
47  */
48 static uint16_t inv_bits(uint16_t val, int nbits)
49 {
50     uint16_t res;
51
52     if (nbits <= 8) {
53         res = ff_reverse[val] >> (8-nbits);
54     } else
55         res = ((ff_reverse[val & 0xFF] << 8) + (ff_reverse[val >> 8])) >> (16-nbits);
56
57     return res;
58 }
59
60 /*
61  *  Generate a huffman codebook from the given descriptor
62  *  and convert it into the FFmpeg VLC table.
63  *
64  *  @param[in]   cb    pointer to codebook descriptor
65  *  @param[out]  vlc   where to place the generated VLC table
66  *  @param[in]   flag  flag: 1 - for static or 0 for dynamic tables
67  *  @return     result code: 0 - OK, -1 = error (invalid codebook descriptor)
68  */
69 static int ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag)
70 {
71     int         pos, i, j, codes_per_row, prefix, not_last_row;
72     uint16_t    codewords[256]; /* FIXME: move this temporal storage out? */
73     uint8_t     bits[256];
74
75     pos = 0; /* current position = 0 */
76
77     for (i = 0; i < cb->num_rows; i++) {
78         codes_per_row = 1 << cb->xbits[i];
79         not_last_row  = (i != cb->num_rows - 1);
80         prefix        = ((1 << i) - 1) << (cb->xbits[i] + not_last_row);
81
82         for (j = 0; j < codes_per_row; j++) {
83             if (pos >= 256) /* Some Indeo5 codebooks can have more than 256 */
84                 break;      /* elements, but only 256 codes are allowed! */
85
86             bits[pos] = i + cb->xbits[i] + not_last_row;
87             if (bits[pos] > IVI_VLC_BITS)
88                 return -1; /* invalid descriptor */
89
90             codewords[pos] = inv_bits((prefix | j), bits[pos]);
91             if (!bits[pos])
92                 bits[pos] = 1;
93
94             pos++;
95         }//for j
96     }//for i
97
98     /* number of codewords = pos */
99     return init_vlc(vlc, IVI_VLC_BITS, pos, bits, 1, 1, codewords, 2, 2,
100                     (flag ? INIT_VLC_USE_NEW_STATIC : 0) | INIT_VLC_LE);
101 }
102
103 void ff_ivi_init_static_vlc(void)
104 {
105     int i;
106     static VLC_TYPE table_data[8192 * 16][2];
107     static int initialized_vlcs = 0;
108
109     if (initialized_vlcs)
110         return;
111     for (i = 0; i < 8; i++) {
112         ivi_mb_vlc_tabs[i].table = table_data + i * 2 * 8192;
113         ivi_mb_vlc_tabs[i].table_allocated = 8192;
114         ivi_create_huff_from_desc(&ff_ivi_mb_huff_desc[i],  &ivi_mb_vlc_tabs[i],  1);
115         ivi_blk_vlc_tabs[i].table = table_data + (i * 2 + 1) * 8192;
116         ivi_blk_vlc_tabs[i].table_allocated = 8192;
117         ivi_create_huff_from_desc(&ff_ivi_blk_huff_desc[i], &ivi_blk_vlc_tabs[i], 1);
118     }
119     initialized_vlcs = 1;
120 }
121
122 /*
123  *  Copy huffman codebook descriptors.
124  *
125  *  @param[out]  dst  ptr to the destination descriptor
126  *  @param[in]   src  ptr to the source descriptor
127  */
128 static void ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src)
129 {
130     dst->num_rows = src->num_rows;
131     memcpy(dst->xbits, src->xbits, src->num_rows);
132 }
133
134 /*
135  *  Compare two huffman codebook descriptors.
136  *
137  *  @param[in]  desc1  ptr to the 1st descriptor to compare
138  *  @param[in]  desc2  ptr to the 2nd descriptor to compare
139  *  @return         comparison result: 0 - equal, 1 - not equal
140  */
141 static int ivi_huff_desc_cmp(const IVIHuffDesc *desc1, const IVIHuffDesc *desc2)
142 {
143     return    desc1->num_rows != desc2->num_rows
144            || memcmp(desc1->xbits, desc2->xbits, desc1->num_rows);
145 }
146
147 int ff_ivi_dec_huff_desc(GetBitContext *gb, int desc_coded, int which_tab,
148                          IVIHuffTab *huff_tab, AVCodecContext *avctx)
149 {
150     int         i, result;
151     IVIHuffDesc new_huff;
152
153     if (!desc_coded) {
154         /* select default table */
155         huff_tab->tab = (which_tab) ? &ivi_blk_vlc_tabs[7]
156             : &ivi_mb_vlc_tabs [7];
157     } else {
158         huff_tab->tab_sel = get_bits(gb, 3);
159         if (huff_tab->tab_sel == 7) {
160             /* custom huffman table (explicitly encoded) */
161             new_huff.num_rows = get_bits(gb, 4);
162             if (!new_huff.num_rows) {
163                 av_log(avctx, AV_LOG_ERROR, "Empty custom Huffman table!\n");
164                 return AVERROR_INVALIDDATA;
165             }
166
167             for (i = 0; i < new_huff.num_rows; i++)
168                 new_huff.xbits[i] = get_bits(gb, 4);
169
170             /* Have we got the same custom table? Rebuild if not. */
171             if (ivi_huff_desc_cmp(&new_huff, &huff_tab->cust_desc) || !huff_tab->cust_tab.table) {
172                 ivi_huff_desc_copy(&huff_tab->cust_desc, &new_huff);
173
174                 if (huff_tab->cust_tab.table)
175                     ff_free_vlc(&huff_tab->cust_tab);
176                 result = ivi_create_huff_from_desc(&huff_tab->cust_desc,
177                         &huff_tab->cust_tab, 0);
178                 if (result) {
179                     huff_tab->cust_desc.num_rows = 0; // reset faulty description
180                     av_log(avctx, AV_LOG_ERROR,
181                            "Error while initializing custom vlc table!\n");
182                     return result;
183                 }
184             }
185             huff_tab->tab = &huff_tab->cust_tab;
186         } else {
187             /* select one of predefined tables */
188             huff_tab->tab = (which_tab) ? &ivi_blk_vlc_tabs[huff_tab->tab_sel]
189                 : &ivi_mb_vlc_tabs [huff_tab->tab_sel];
190         }
191     }
192
193     return 0;
194 }
195
196 /*
197  *  Free planes, bands and macroblocks buffers.
198  *
199  *  @param[in]  planes  pointer to the array of the plane descriptors
200  */
201 static av_cold void ivi_free_buffers(IVIPlaneDesc *planes)
202 {
203     int p, b, t;
204
205     for (p = 0; p < 3; p++) {
206         if (planes[p].bands)
207         for (b = 0; b < planes[p].num_bands; b++) {
208             av_freep(&planes[p].bands[b].bufs[0]);
209             av_freep(&planes[p].bands[b].bufs[1]);
210             av_freep(&planes[p].bands[b].bufs[2]);
211
212             if (planes[p].bands[b].blk_vlc.cust_tab.table)
213                 ff_free_vlc(&planes[p].bands[b].blk_vlc.cust_tab);
214             for (t = 0; t < planes[p].bands[b].num_tiles; t++)
215                 av_freep(&planes[p].bands[b].tiles[t].mbs);
216             av_freep(&planes[p].bands[b].tiles);
217         }
218         av_freep(&planes[p].bands);
219     }
220 }
221
222 av_cold int ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg)
223 {
224     int         p, b;
225     uint32_t    b_width, b_height, align_fac, width_aligned, height_aligned, buf_size;
226     IVIBandDesc *band;
227
228     ivi_free_buffers(planes);
229
230     /* fill in the descriptor of the luminance plane */
231     planes[0].width     = cfg->pic_width;
232     planes[0].height    = cfg->pic_height;
233     planes[0].num_bands = cfg->luma_bands;
234
235     /* fill in the descriptors of the chrominance planes */
236     planes[1].width     = planes[2].width     = (cfg->pic_width  + 3) >> 2;
237     planes[1].height    = planes[2].height    = (cfg->pic_height + 3) >> 2;
238     planes[1].num_bands = planes[2].num_bands = cfg->chroma_bands;
239
240     for (p = 0; p < 3; p++) {
241         planes[p].bands = av_mallocz(planes[p].num_bands * sizeof(IVIBandDesc));
242         if (!planes[p].bands)
243             return AVERROR(ENOMEM);
244
245         /* select band dimensions: if there is only one band then it
246          *  has the full size, if there are several bands each of them
247          *  has only half size */
248         b_width  = planes[p].num_bands == 1 ? planes[p].width  : (planes[p].width  + 1) >> 1;
249         b_height = planes[p].num_bands == 1 ? planes[p].height : (planes[p].height + 1) >> 1;
250
251         /* luma   band buffers will be aligned on 16x16 (max macroblock size) */
252         /* chroma band buffers will be aligned on   8x8 (max macroblock size) */
253         align_fac       = p ? 8 : 16;
254         width_aligned   = FFALIGN(b_width , align_fac);
255         height_aligned  = FFALIGN(b_height, align_fac);
256         buf_size        = width_aligned * height_aligned * sizeof(int16_t);
257
258         for (b = 0; b < planes[p].num_bands; b++) {
259             band = &planes[p].bands[b]; /* select appropriate plane/band */
260             band->plane    = p;
261             band->band_num = b;
262             band->width    = b_width;
263             band->height   = b_height;
264             band->pitch    = width_aligned;
265             band->aheight  = height_aligned;
266             band->bufs[0]  = av_mallocz(buf_size);
267             band->bufs[1]  = av_mallocz(buf_size);
268             band->bufsize  = buf_size/2;
269             if (!band->bufs[0] || !band->bufs[1])
270                 return AVERROR(ENOMEM);
271
272             /* allocate the 3rd band buffer for scalability mode */
273             if (cfg->luma_bands > 1) {
274                 band->bufs[2] = av_mallocz(buf_size);
275                 if (!band->bufs[2])
276                     return AVERROR(ENOMEM);
277             }
278
279             planes[p].bands[0].blk_vlc.cust_desc.num_rows = 0; /* reset custom vlc */
280         }
281     }
282
283     return 0;
284 }
285
286 av_cold int ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height)
287 {
288     int         p, b, x, y, x_tiles, y_tiles, t_width, t_height;
289     IVIBandDesc *band;
290     IVITile     *tile, *ref_tile;
291
292     for (p = 0; p < 3; p++) {
293         t_width  = !p ? tile_width  : (tile_width  + 3) >> 2;
294         t_height = !p ? tile_height : (tile_height + 3) >> 2;
295
296         if (!p && planes[0].num_bands == 4) {
297             t_width  >>= 1;
298             t_height >>= 1;
299         }
300         if(t_width<=0 || t_height<=0)
301             return AVERROR(EINVAL);
302
303         for (b = 0; b < planes[p].num_bands; b++) {
304             band = &planes[p].bands[b];
305             x_tiles = IVI_NUM_TILES(band->width, t_width);
306             y_tiles = IVI_NUM_TILES(band->height, t_height);
307             band->num_tiles = x_tiles * y_tiles;
308
309             av_freep(&band->tiles);
310             band->tiles = av_mallocz(band->num_tiles * sizeof(IVITile));
311             if (!band->tiles)
312                 return AVERROR(ENOMEM);
313
314             tile = band->tiles;
315
316             /* use the first luma band as reference for motion vectors
317              * and quant */
318             ref_tile = planes[0].bands[0].tiles;
319
320             for (y = 0; y < band->height; y += t_height) {
321                 for (x = 0; x < band->width; x += t_width) {
322                     tile->xpos     = x;
323                     tile->ypos     = y;
324                     tile->mb_size  = band->mb_size;
325                     tile->width    = FFMIN(band->width - x,  t_width);
326                     tile->height   = FFMIN(band->height - y, t_height);
327                     tile->is_empty = tile->data_size = 0;
328                     /* calculate number of macroblocks */
329                     tile->num_MBs  = IVI_MBs_PER_TILE(tile->width, tile->height,
330                                                       band->mb_size);
331
332                     av_freep(&tile->mbs);
333                     tile->mbs = av_malloc(tile->num_MBs * sizeof(IVIMbInfo));
334                     if (!tile->mbs)
335                         return AVERROR(ENOMEM);
336
337                     tile->ref_mbs = 0;
338                     if (p || b) {
339                         if (tile->num_MBs <= ref_tile->num_MBs) {
340                             tile->ref_mbs = ref_tile->mbs;
341                         }else
342                             av_log(NULL, AV_LOG_DEBUG, "Cannot use ref_tile, too few mbs\n");
343                         ref_tile++;
344                     }
345
346                     tile++;
347                 }
348             }
349
350         }// for b
351     }// for p
352
353     return 0;
354 }
355
356 /*
357  *  Decode size of the tile data.
358  *  The size is stored as a variable-length field having the following format:
359  *  if (tile_data_size < 255) than this field is only one byte long
360  *  if (tile_data_size >= 255) than this field four is byte long: 0xFF X1 X2 X3
361  *  where X1-X3 is size of the tile data
362  *
363  *  @param[in,out]  gb  the GetBit context
364  *  @return     size of the tile data in bytes
365  */
366 static int ivi_dec_tile_data_size(GetBitContext *gb)
367 {
368     int    len;
369
370     len = 0;
371     if (get_bits1(gb)) {
372         len = get_bits(gb, 8);
373         if (len == 255)
374             len = get_bits_long(gb, 24);
375     }
376
377     /* align the bitstream reader on the byte boundary */
378     align_get_bits(gb);
379
380     return len;
381 }
382
383 /*
384  *  Decode block data:
385  *  extract huffman-coded transform coefficients from the bitstream,
386  *  dequantize them, apply inverse transform and motion compensation
387  *  in order to reconstruct the picture.
388  *
389  *  @param[in,out]  gb    the GetBit context
390  *  @param[in]      band  pointer to the band descriptor
391  *  @param[in]      tile  pointer to the tile descriptor
392  *  @return     result code: 0 - OK, -1 = error (corrupted blocks data)
393  */
394 static int ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile,
395                              AVCodecContext *avctx)
396 {
397     int         mbn, blk, num_blocks, num_coeffs, blk_size, scan_pos, run, val,
398                 pos, is_intra, mc_type = 0, av_uninit(mv_x), av_uninit(mv_y), col_mask;
399     uint8_t     col_flags[8];
400     int32_t     prev_dc, trvec[64];
401     uint32_t    cbp, av_uninit(sym), lo, hi, quant, buf_offs, q;
402     IVIMbInfo   *mb;
403     RVMapDesc   *rvmap = band->rv_map;
404     void (*mc_with_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
405     void (*mc_no_delta_func)  (int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
406     const uint16_t  *base_tab;
407     const uint8_t   *scale_tab;
408
409     prev_dc = 0; /* init intra prediction for the DC coefficient */
410
411     blk_size   = band->blk_size;
412     col_mask   = blk_size - 1; /* column mask for tracking non-zero coeffs */
413     num_blocks = (band->mb_size != blk_size) ? 4 : 1; /* number of blocks per mb */
414     num_coeffs = blk_size * blk_size;
415     if (blk_size == 8) {
416         mc_with_delta_func = ff_ivi_mc_8x8_delta;
417         mc_no_delta_func   = ff_ivi_mc_8x8_no_delta;
418     } else {
419         mc_with_delta_func = ff_ivi_mc_4x4_delta;
420         mc_no_delta_func   = ff_ivi_mc_4x4_no_delta;
421     }
422
423     for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
424         is_intra = !mb->type;
425         cbp      = mb->cbp;
426         buf_offs = mb->buf_offs;
427
428         quant = av_clip(band->glob_quant + mb->q_delta, 0, 23);
429
430         base_tab  = is_intra ? band->intra_base  : band->inter_base;
431         scale_tab = is_intra ? band->intra_scale : band->inter_scale;
432         if (scale_tab)
433             quant = scale_tab[quant];
434
435         if (!is_intra) {
436             mv_x = mb->mv_x;
437             mv_y = mb->mv_y;
438             if (band->is_halfpel) {
439                 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
440                 mv_x >>= 1;
441                 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
442             }
443             if (mb->type) {
444                 int dmv_x, dmv_y, cx, cy;
445
446                 dmv_x = mb->mv_x >> band->is_halfpel;
447                 dmv_y = mb->mv_y >> band->is_halfpel;
448                 cx    = mb->mv_x &  band->is_halfpel;
449                 cy    = mb->mv_y &  band->is_halfpel;
450
451                 if (   mb->xpos + dmv_x < 0
452                     || mb->xpos + dmv_x + band->mb_size + cx > band->pitch
453                     || mb->ypos + dmv_y < 0
454                     || mb->ypos + dmv_y + band->mb_size + cy > band->aheight) {
455                     return AVERROR_INVALIDDATA;
456                 }
457             }
458         }
459
460         for (blk = 0; blk < num_blocks; blk++) {
461             /* adjust block position in the buffer according to its number */
462             if (blk & 1) {
463                 buf_offs += blk_size;
464             } else if (blk == 2) {
465                 buf_offs -= blk_size;
466                 buf_offs += blk_size * band->pitch;
467             }
468
469             if (cbp & 1) { /* block coded ? */
470                 if (!band->scan) {
471                     av_log(avctx, AV_LOG_ERROR, "Scan pattern is not set.\n");
472                     return AVERROR_INVALIDDATA;
473                 }
474
475                 scan_pos = -1;
476                 memset(trvec, 0, num_coeffs*sizeof(trvec[0])); /* zero transform vector */
477                 memset(col_flags, 0, sizeof(col_flags));      /* zero column flags */
478
479                 while (scan_pos <= num_coeffs) {
480                     sym = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
481                     if (sym == rvmap->eob_sym)
482                         break; /* End of block */
483
484                     if (sym == rvmap->esc_sym) { /* Escape - run/val explicitly coded using 3 vlc codes */
485                         run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1;
486                         lo  = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
487                         hi  = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
488                         val = IVI_TOSIGNED((hi << 6) | lo); /* merge them and convert into signed val */
489                     } else {
490                         if (sym >= 256U) {
491                             av_log(avctx, AV_LOG_ERROR, "Invalid sym encountered: %d.\n", sym);
492                             return -1;
493                         }
494                         run = rvmap->runtab[sym];
495                         val = rvmap->valtab[sym];
496                     }
497
498                     /* de-zigzag and dequantize */
499                     scan_pos += run;
500                     if (scan_pos >= (unsigned)num_coeffs)
501                         break;
502                     pos = band->scan[scan_pos];
503
504                     if (!val)
505                         av_dlog(avctx, "Val = 0 encountered!\n");
506
507                     q = (base_tab[pos] * quant) >> 9;
508                     if (q > 1)
509                         val = val * q + FFSIGN(val) * (((q ^ 1) - 1) >> 1);
510                     trvec[pos] = val;
511                     col_flags[pos & col_mask] |= !!val; /* track columns containing non-zero coeffs */
512                 }// while
513
514                 if (scan_pos >= num_coeffs && sym != rvmap->eob_sym)
515                     return -1; /* corrupt block data */
516
517                 /* undoing DC coeff prediction for intra-blocks */
518                 if (is_intra && band->is_2d_trans) {
519                     prev_dc      += trvec[0];
520                     trvec[0]      = prev_dc;
521                     col_flags[0] |= !!prev_dc;
522                 }
523                 if(band->transform_size > band->blk_size){
524                     av_log(NULL, AV_LOG_ERROR, "Too large transform\n");
525                     return AVERROR_INVALIDDATA;
526                 }
527                 /* apply inverse transform */
528                 band->inv_transform(trvec, band->buf + buf_offs,
529                                     band->pitch, col_flags);
530
531                 /* apply motion compensation */
532                 if (!is_intra)
533                     mc_with_delta_func(band->buf + buf_offs,
534                                        band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
535                                        band->pitch, mc_type);
536             } else {
537                 /* block not coded */
538                 /* for intra blocks apply the dc slant transform */
539                 /* for inter - perform the motion compensation without delta */
540                 if (is_intra) {
541                         band->dc_transform(&prev_dc, band->buf + buf_offs,
542                                            band->pitch, blk_size);
543                 } else
544                     mc_no_delta_func(band->buf + buf_offs,
545                                      band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
546                                      band->pitch, mc_type);
547             }
548
549             cbp >>= 1;
550         }// for blk
551     }// for mbn
552
553     align_get_bits(gb);
554
555     return 0;
556 }
557
558 /**
559  *  Handle empty tiles by performing data copying and motion
560  *  compensation respectively.
561  *
562  *  @param[in]  avctx     ptr to the AVCodecContext
563  *  @param[in]  band      pointer to the band descriptor
564  *  @param[in]  tile      pointer to the tile descriptor
565  *  @param[in]  mv_scale  scaling factor for motion vectors
566  */
567 static int ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
568                                   IVITile *tile, int32_t mv_scale)
569 {
570     int             x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
571     int             offs, mb_offset, row_offset;
572     IVIMbInfo       *mb, *ref_mb;
573     const int16_t   *src;
574     int16_t         *dst;
575     void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch,
576                              int mc_type);
577
578     if (tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size)) {
579         av_log(avctx, AV_LOG_ERROR, "Allocated tile size %d mismatches "
580                "parameters %d in ivi_process_empty_tile()\n",
581                tile->num_MBs, IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size));
582         return AVERROR_INVALIDDATA;
583     }
584
585     offs       = tile->ypos * band->pitch + tile->xpos;
586     mb         = tile->mbs;
587     ref_mb     = tile->ref_mbs;
588     row_offset = band->mb_size * band->pitch;
589     need_mc    = 0; /* reset the mc tracking flag */
590
591     for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
592         mb_offset = offs;
593
594         for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
595             mb->xpos     = x;
596             mb->ypos     = y;
597             mb->buf_offs = mb_offset;
598
599             mb->type = 1; /* set the macroblocks type = INTER */
600             mb->cbp  = 0; /* all blocks are empty */
601
602             if (!band->qdelta_present && !band->plane && !band->band_num) {
603                 mb->q_delta = band->glob_quant;
604                 mb->mv_x    = 0;
605                 mb->mv_y    = 0;
606             }
607
608             if (band->inherit_qdelta && ref_mb)
609                 mb->q_delta = ref_mb->q_delta;
610
611             if (band->inherit_mv && ref_mb) {
612                 /* motion vector inheritance */
613                 if (mv_scale) {
614                     mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
615                     mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
616                 } else {
617                     mb->mv_x = ref_mb->mv_x;
618                     mb->mv_y = ref_mb->mv_y;
619                 }
620                 need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
621                 {
622                     int dmv_x, dmv_y, cx, cy;
623
624                     dmv_x = mb->mv_x >> band->is_halfpel;
625                     dmv_y = mb->mv_y >> band->is_halfpel;
626                     cx    = mb->mv_x &  band->is_halfpel;
627                     cy    = mb->mv_y &  band->is_halfpel;
628
629                     if (   mb->xpos + dmv_x < 0
630                         || mb->xpos + dmv_x + band->mb_size + cx > band->pitch
631                         || mb->ypos + dmv_y < 0
632                         || mb->ypos + dmv_y + band->mb_size + cy > band->aheight) {
633                         av_log(avctx, AV_LOG_ERROR, "MV out of bounds\n");
634                         return AVERROR_INVALIDDATA;
635                     }
636                 }
637             }
638
639             mb++;
640             if (ref_mb)
641                 ref_mb++;
642             mb_offset += band->mb_size;
643         } // for x
644         offs += row_offset;
645     } // for y
646
647     if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */
648         num_blocks = (band->mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */
649         mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
650                                                  : ff_ivi_mc_4x4_no_delta;
651
652         for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
653             mv_x = mb->mv_x;
654             mv_y = mb->mv_y;
655             if (!band->is_halfpel) {
656                 mc_type = 0; /* we have only fullpel vectors */
657             } else {
658                 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
659                 mv_x >>= 1;
660                 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
661             }
662
663             for (blk = 0; blk < num_blocks; blk++) {
664                 /* adjust block position in the buffer according with its number */
665                 offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
666                 mc_no_delta_func(band->buf + offs,
667                                  band->ref_buf + offs + mv_y * band->pitch + mv_x,
668                                  band->pitch, mc_type);
669             }
670         }
671     } else {
672         /* copy data from the reference tile into the current one */
673         src = band->ref_buf + tile->ypos * band->pitch + tile->xpos;
674         dst = band->buf     + tile->ypos * band->pitch + tile->xpos;
675         for (y = 0; y < tile->height; y++) {
676             memcpy(dst, src, tile->width*sizeof(band->buf[0]));
677             src += band->pitch;
678             dst += band->pitch;
679         }
680     }
681
682     return 0;
683 }
684
685
686 #ifdef DEBUG
687 static uint16_t ivi_calc_band_checksum(IVIBandDesc *band)
688 {
689     int         x, y;
690     int16_t     *src, checksum;
691
692     src = band->buf;
693     checksum = 0;
694
695     for (y = 0; y < band->height; src += band->pitch, y++)
696         for (x = 0; x < band->width; x++)
697             checksum += src[x];
698
699     return checksum;
700 }
701 #endif
702
703 /*
704  *  Convert and output the current plane.
705  *  This conversion is done by adding back the bias value of 128
706  *  (subtracted in the encoder) and clipping the result.
707  *
708  *  @param[in]   plane      pointer to the descriptor of the plane being processed
709  *  @param[out]  dst        pointer to the buffer receiving converted pixels
710  *  @param[in]   dst_pitch  pitch for moving to the next y line
711  */
712 static void ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch)
713 {
714     int             x, y;
715     const int16_t   *src  = plane->bands[0].buf;
716     uint32_t        pitch = plane->bands[0].pitch;
717
718     if (!src)
719         return;
720
721     for (y = 0; y < plane->height; y++) {
722         for (x = 0; x < plane->width; x++)
723             dst[x] = av_clip_uint8(src[x] + 128);
724         src += pitch;
725         dst += dst_pitch;
726     }
727 }
728
729 /**
730  *  Decode an Indeo 4 or 5 band.
731  *
732  *  @param[in,out]  ctx    ptr to the decoder context
733  *  @param[in,out]  band   ptr to the band descriptor
734  *  @param[in]      avctx  ptr to the AVCodecContext
735  *  @return         result code: 0 = OK, -1 = error
736  */
737 static int decode_band(IVI45DecContext *ctx,
738                        IVIBandDesc *band, AVCodecContext *avctx)
739 {
740     int         result, i, t, idx1, idx2, pos;
741     IVITile     *tile;
742
743     band->buf     = band->bufs[ctx->dst_buf];
744     if (!band->buf) {
745         av_log(avctx, AV_LOG_ERROR, "Band buffer points to no data!\n");
746         return AVERROR_INVALIDDATA;
747     }
748     band->ref_buf = band->bufs[ctx->ref_buf];
749     band->data_ptr = ctx->frame_data + (get_bits_count(&ctx->gb) >> 3);
750
751     result = ctx->decode_band_hdr(ctx, band, avctx);
752     if (result) {
753         av_log(avctx, AV_LOG_ERROR, "Error while decoding band header: %d\n",
754                result);
755         return result;
756     }
757
758     if (band->is_empty) {
759         av_log(avctx, AV_LOG_ERROR, "Empty band encountered!\n");
760         return AVERROR_INVALIDDATA;
761     }
762
763     band->rv_map = &ctx->rvmap_tabs[band->rvmap_sel];
764
765     /* apply corrections to the selected rvmap table if present */
766     for (i = 0; i < band->num_corr; i++) {
767         idx1 = band->corr[i * 2];
768         idx2 = band->corr[i * 2 + 1];
769         FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
770         FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
771         if (idx1 == band->rv_map->eob_sym || idx2 == band->rv_map->eob_sym)
772             band->rv_map->eob_sym ^= idx1 ^ idx2;
773         if (idx1 == band->rv_map->esc_sym || idx2 == band->rv_map->esc_sym)
774             band->rv_map->esc_sym ^= idx1 ^ idx2;
775     }
776
777     pos = get_bits_count(&ctx->gb);
778
779     for (t = 0; t < band->num_tiles; t++) {
780         tile = &band->tiles[t];
781
782         if (tile->mb_size != band->mb_size) {
783             av_log(avctx, AV_LOG_ERROR, "MB sizes mismatch: %d vs. %d\n",
784                    band->mb_size, tile->mb_size);
785             return AVERROR_INVALIDDATA;
786         }
787         tile->is_empty = get_bits1(&ctx->gb);
788         if (tile->is_empty) {
789             result = ivi_process_empty_tile(avctx, band, tile,
790                                       (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3));
791             if (result < 0)
792                 break;
793             av_dlog(avctx, "Empty tile encountered!\n");
794         } else {
795             tile->data_size = ivi_dec_tile_data_size(&ctx->gb);
796             if (!tile->data_size) {
797                 av_log(avctx, AV_LOG_ERROR, "Tile data size is zero!\n");
798                 result = AVERROR_INVALIDDATA;
799                 break;
800             }
801
802             result = ctx->decode_mb_info(ctx, band, tile, avctx);
803             if (result < 0)
804                 break;
805
806             result = ivi_decode_blocks(&ctx->gb, band, tile, avctx);
807             if (result < 0 || ((get_bits_count(&ctx->gb) - pos) >> 3) != tile->data_size) {
808                 av_log(avctx, AV_LOG_ERROR, "Corrupted tile data encountered!\n");
809                 break;
810             }
811
812             pos += tile->data_size << 3; // skip to next tile
813         }
814     }
815
816     /* restore the selected rvmap table by applying its corrections in reverse order */
817     for (i = band->num_corr-1; i >= 0; i--) {
818         idx1 = band->corr[i*2];
819         idx2 = band->corr[i*2+1];
820         FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
821         FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
822         if (idx1 == band->rv_map->eob_sym || idx2 == band->rv_map->eob_sym)
823             band->rv_map->eob_sym ^= idx1 ^ idx2;
824         if (idx1 == band->rv_map->esc_sym || idx2 == band->rv_map->esc_sym)
825             band->rv_map->esc_sym ^= idx1 ^ idx2;
826     }
827
828 #ifdef DEBUG
829     if (band->checksum_present) {
830         uint16_t chksum = ivi_calc_band_checksum(band);
831         if (chksum != band->checksum) {
832             av_log(avctx, AV_LOG_ERROR,
833                    "Band checksum mismatch! Plane %d, band %d, received: %x, calculated: %x\n",
834                    band->plane, band->band_num, band->checksum, chksum);
835         }
836     }
837 #endif
838
839     align_get_bits(&ctx->gb);
840
841     return result;
842 }
843
844 int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
845                         AVPacket *avpkt)
846 {
847     IVI45DecContext *ctx = avctx->priv_data;
848     const uint8_t   *buf = avpkt->data;
849     AVFrame       *frame = data;
850     int             buf_size = avpkt->size;
851     int             result, p, b;
852
853     init_get_bits(&ctx->gb, buf, buf_size * 8);
854     ctx->frame_data = buf;
855     ctx->frame_size = buf_size;
856
857     result = ctx->decode_pic_hdr(ctx, avctx);
858     if (result) {
859         av_log(avctx, AV_LOG_ERROR,
860                "Error while decoding picture header: %d\n", result);
861         return -1;
862     }
863     if (ctx->gop_invalid)
864         return AVERROR_INVALIDDATA;
865
866     if (ctx->gop_flags & IVI5_IS_PROTECTED) {
867         av_log(avctx, AV_LOG_ERROR, "Password-protected clip!\n");
868         return -1;
869     }
870
871     ctx->switch_buffers(ctx);
872
873     //{ START_TIMER;
874
875     if (ctx->is_nonnull_frame(ctx)) {
876         ctx->buf_invalid[ctx->dst_buf] = 1;
877         for (p = 0; p < 3; p++) {
878             for (b = 0; b < ctx->planes[p].num_bands; b++) {
879                 result = decode_band(ctx, &ctx->planes[p].bands[b], avctx);
880                 if (result) {
881                     av_log(avctx, AV_LOG_ERROR,
882                            "Error while decoding band: %d, plane: %d\n", b, p);
883                     return -1;
884                 }
885             }
886         }
887         ctx->buf_invalid[ctx->dst_buf] = 0;
888     }
889     if (ctx->buf_invalid[ctx->dst_buf])
890         return -1;
891
892     //STOP_TIMER("decode_planes"); }
893
894     /* If the bidirectional mode is enabled, next I and the following P frame will */
895     /* be sent together. Unfortunately the approach below seems to be the only way */
896     /* to handle the B-frames mode. That's exactly the same Intel decoders do.     */
897     if (avctx->codec_id == AV_CODEC_ID_INDEO4 && ctx->frame_type == 0/*FRAMETYPE_INTRA*/) {
898         while (get_bits(&ctx->gb, 8)); // skip version string
899         skip_bits_long(&ctx->gb, 64);  // skip padding, TODO: implement correct 8-bytes alignment
900         if (get_bits_left(&ctx->gb) > 18 && show_bits(&ctx->gb, 18) == 0x3FFF8)
901             av_log(avctx, AV_LOG_ERROR, "Buffer contains IP frames!\n");
902     }
903
904     if (!ctx->is_nonnull_frame(ctx))
905         return buf_size;
906
907     avcodec_set_dimensions(avctx, ctx->planes[0].width, ctx->planes[0].height);
908     if ((result = ff_get_buffer(avctx, frame, 0)) < 0)
909         return result;
910
911     if (ctx->is_scalable) {
912         if (avctx->codec_id == AV_CODEC_ID_INDEO4)
913             ff_ivi_recompose_haar(&ctx->planes[0], frame->data[0], frame->linesize[0]);
914         else
915             ff_ivi_recompose53   (&ctx->planes[0], frame->data[0], frame->linesize[0]);
916     } else {
917         ivi_output_plane(&ctx->planes[0], frame->data[0], frame->linesize[0]);
918     }
919
920     ivi_output_plane(&ctx->planes[2], frame->data[1], frame->linesize[1]);
921     ivi_output_plane(&ctx->planes[1], frame->data[2], frame->linesize[2]);
922
923     *got_frame = 1;
924
925     return buf_size;
926 }
927
928 /**
929  *  Close Indeo5 decoder and clean up its context.
930  */
931 av_cold int ff_ivi_decode_close(AVCodecContext *avctx)
932 {
933     IVI45DecContext *ctx = avctx->priv_data;
934
935     ivi_free_buffers(&ctx->planes[0]);
936
937     if (ctx->mb_vlc.cust_tab.table)
938         ff_free_vlc(&ctx->mb_vlc.cust_tab);
939
940 #if IVI4_STREAM_ANALYSER
941     if (avctx->codec_id == AV_CODEC_ID_INDEO4) {
942     if (ctx->is_scalable)
943         av_log(avctx, AV_LOG_ERROR, "This video uses scalability mode!\n");
944     if (ctx->uses_tiling)
945         av_log(avctx, AV_LOG_ERROR, "This video uses local decoding!\n");
946     if (ctx->has_b_frames)
947         av_log(avctx, AV_LOG_ERROR, "This video contains B-frames!\n");
948     if (ctx->has_transp)
949         av_log(avctx, AV_LOG_ERROR, "Transparency mode is enabled!\n");
950     if (ctx->uses_haar)
951         av_log(avctx, AV_LOG_ERROR, "This video uses Haar transform!\n");
952     if (ctx->uses_fullpel)
953         av_log(avctx, AV_LOG_ERROR, "This video uses fullpel motion vectors!\n");
954     }
955 #endif
956
957     return 0;
958 }
959
960
961 /**
962  * These are 2x8 predefined Huffman codebooks for coding macroblock/block
963  * signals. They are specified using "huffman descriptors" in order to
964  * avoid huge static tables. The decoding tables will be generated at
965  * startup from these descriptors.
966  */
967 const IVIHuffDesc ff_ivi_mb_huff_desc[8] = {
968     {8,  {0, 4, 5, 4, 4, 4, 6, 6}},
969     {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
970     {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
971     {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
972     {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
973     {9,  {0, 4, 4, 4, 4, 3, 3, 3, 2}},
974     {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
975     {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
976 };
977
978 const IVIHuffDesc ff_ivi_blk_huff_desc[8] = {
979     {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
980     {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
981     {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
982     {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
983     {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
984     {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
985     {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
986     {9,  {3, 4, 4, 5, 5, 5, 6, 5, 5}}
987 };
988
989
990 /**
991  *  Scan patterns shared between indeo4 and indeo5
992  */
993 const uint8_t ff_ivi_vertical_scan_8x8[64] = {
994     0,  8, 16, 24, 32, 40, 48, 56,
995     1,  9, 17, 25, 33, 41, 49, 57,
996     2, 10, 18, 26, 34, 42, 50, 58,
997     3, 11, 19, 27, 35, 43, 51, 59,
998     4, 12, 20, 28, 36, 44, 52, 60,
999     5, 13, 21, 29, 37, 45, 53, 61,
1000     6, 14, 22, 30, 38, 46, 54, 62,
1001     7, 15, 23, 31, 39, 47, 55, 63
1002 };
1003
1004 const uint8_t ff_ivi_horizontal_scan_8x8[64] = {
1005      0,  1,  2,  3,  4,  5,  6,  7,
1006      8,  9, 10, 11, 12, 13, 14, 15,
1007     16, 17, 18, 19, 20, 21, 22, 23,
1008     24, 25, 26, 27, 28, 29, 30, 31,
1009     32, 33, 34, 35, 36, 37, 38, 39,
1010     40, 41, 42, 43, 44, 45, 46, 47,
1011     48, 49, 50, 51, 52, 53, 54, 55,
1012     56, 57, 58, 59, 60, 61, 62, 63
1013 };
1014
1015 const uint8_t ff_ivi_direct_scan_4x4[16] = {
1016     0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15
1017 };
1018
1019
1020 /**
1021  *  Run-value (RLE) tables.
1022  */
1023 const RVMapDesc ff_ivi_rvmap_tabs[9] = {
1024 {   /* MapTab0 */
1025     5, /* eob_sym */
1026     2, /* esc_sym */
1027     /* run table */
1028     {1,  1,  0,  1,  1,  0,  1,  1,  2,  2,  1,  1,  1,  1,  3,  3,
1029      1,  1,  2,  2,  1,  1,  4,  4,  1,  1,  1,  1,  2,  2,  5,  5,
1030      1,  1,  3,  3,  1,  1,  6,  6,  1,  2,  1,  2,  7,  7,  1,  1,
1031      8,  8,  1,  1,  4,  2,  1,  4,  2,  1,  3,  3,  1,  1,  1,  9,
1032      9,  1,  2,  1,  2,  1,  5,  5,  1,  1, 10, 10,  1,  1,  3,  3,
1033      2,  2,  1,  1, 11, 11,  6,  4,  4,  1,  6,  1,  2,  1,  2, 12,
1034      8,  1, 12,  7,  8,  7,  1, 16,  1, 16,  1,  3,  3, 13,  1, 13,
1035      2,  2,  1, 15,  1,  5, 14, 15,  1,  5, 14,  1, 17,  8, 17,  8,
1036      1,  4,  4,  2,  2,  1, 25, 25, 24, 24,  1,  3,  1,  3,  1,  8,
1037      6,  7,  6,  1, 18,  8, 18,  1,  7, 23,  2,  2, 23,  1,  1, 21,
1038     22,  9,  9, 22, 19,  1, 21,  5, 19,  5,  1, 33, 20, 33, 20,  8,
1039      4,  4,  1, 32,  2,  2,  8,  3, 32, 26,  3,  1,  7,  7, 26,  6,
1040      1,  6,  1,  1, 16,  1, 10,  1, 10,  2, 16, 29, 28,  2, 29, 28,
1041      1, 27,  5,  8,  5, 27,  1,  8,  3,  7,  3, 31, 41, 31,  1, 41,
1042      6,  1,  6,  7,  4,  4,  1,  1,  2,  1,  2, 11, 34, 30, 11,  1,
1043     30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
1044
1045     /* value table */
1046     { 1,  -1,   0,   2,  -2,   0,   3,  -3,   1,  -1,   4,  -4,   5,  -5,   1,  -1,
1047       6,  -6,   2,  -2,   7,  -7,   1,  -1,   8,  -8,   9,  -9,   3,  -3,   1,  -1,
1048      10, -10,   2,  -2,  11, -11,   1,  -1,  12,   4, -12,  -4,   1,  -1,  13, -13,
1049       1,  -1,  14, -14,   2,   5,  15,  -2,  -5, -15,  -3,   3,  16, -16,  17,   1,
1050      -1, -17,   6,  18,  -6, -18,   2,  -2,  19, -19,   1,  -1,  20, -20,   4,  -4,
1051       7,  -7,  21, -21,   1,  -1,   2,   3,  -3,  22,  -2, -22,   8,  23,  -8,   1,
1052       2, -23,  -1,   2,  -2,  -2,  24,   1, -24,  -1,  25,   5,  -5,   1, -25,  -1,
1053       9,  -9,  26,   1, -26,   3,   1,  -1,  27,  -3,  -1, -27,   1,   3,  -1,  -3,
1054      28,  -4,   4,  10, -10, -28,   1,  -1,   1,  -1,  29,   6, -29,  -6,  30,  -4,
1055       3,   3,  -3, -30,   1,   4,  -1,  31,  -3,   1,  11, -11,  -1, -31,  32,  -1,
1056      -1,   2,  -2,   1,   1, -32,   1,   4,  -1,  -4,  33,  -1,   1,   1,  -1,   5,
1057       5,  -5, -33,  -1, -12,  12,  -5,  -7,   1,   1,   7,  34,   4,  -4,  -1,   4,
1058     -34,  -4,  35,  36,  -2, -35,  -2, -36,   2,  13,   2,  -1,   1, -13,   1,  -1,
1059      37,   1,  -5,   6,   5,  -1,  38,  -6,  -8,   5,   8,  -1,   1,   1, -37,  -1,
1060       5,  39,  -5,  -5,   6,  -6, -38, -39, -14,  40,  14,   2,   1,   1,  -2, -40,
1061      -1,  -2,   2,  -1,  -1,  -1,   1,   1,   1,  -1,   1,  -1,   1,  -1,   1,  -1}
1062 },{
1063     /* MapTab1 */
1064     0,  /* eob_sym */
1065     38, /* esc_sym */
1066     /* run table */
1067     {0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  8,  6,  8,  7,
1068      7,  9,  9, 10, 10, 11, 11,  1, 12,  1, 12, 13, 13, 16, 14, 16,
1069     14, 15, 15, 17, 17, 18,  0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
1070     25, 24,  2, 25, 24, 23, 23,  2, 26, 28, 26, 28, 29, 27, 29, 27,
1071     33, 33,  1, 32,  1,  3, 32, 30, 36,  3, 36, 30, 31, 31, 35, 34,
1072     37, 41, 34, 35, 37,  4, 41,  4, 49,  8,  8, 49, 40, 38,  5, 38,
1073     40, 39,  5, 39, 42, 43, 42,  7, 57,  6, 43, 44,  6, 50,  7, 44,
1074     57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58,  1, 51, 58,  1,
1075     52, 59, 53,  9, 52, 55, 55, 59, 53, 56, 54, 56, 54,  9, 64, 64,
1076     60, 63, 60, 63, 61, 62, 61, 62,  2, 10,  2, 10, 11,  1, 11, 13,
1077     12,  1, 12, 13, 16, 16,  8,  8, 14,  3,  3, 15, 14, 15,  4,  4,
1078      1, 17, 17,  5,  1,  7,  7,  5,  6,  1,  2,  2,  6, 22,  1, 25,
1079     21, 22,  8, 24,  1, 21, 25, 24,  8, 18, 18, 23,  9, 20, 23, 33,
1080     29, 33, 20,  1, 19,  1, 29, 36,  9, 36, 19, 41, 28, 57, 32,  3,
1081     28,  3,  1, 27, 49, 49,  1, 32, 26, 26,  2,  4,  4,  7, 57, 41,
1082      2,  7, 10,  5, 37, 16, 10, 27,  8,  8, 13, 16, 37, 13,  1,  5},
1083
1084     /* value table */
1085     {0,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,   1,  -1,  -1,   1,
1086     -1,   1,  -1,   1,  -1,   1,  -1,   2,   1,  -2,  -1,   1,  -1,   1,   1,  -1,
1087     -1,   1,  -1,   1,  -1,   1,   0,  -1,   1,   1,   1,  -1,   1,  -1,  -1,  -1,
1088      1,   1,   2,  -1,  -1,   1,  -1,  -2,   1,   1,  -1,  -1,   1,   1,  -1,  -1,
1089      1,  -1,   3,   1,  -3,   2,  -1,   1,   1,  -2,  -1,  -1,  -1,   1,   1,   1,
1090      1,   1,  -1,  -1,  -1,   2,  -1,  -2,   1,   2,  -2,  -1,   1,   1,   2,  -1,
1091     -1,   1,  -2,  -1,   1,   1,  -1,   2,   1,   2,  -1,   1,  -2,  -1,  -2,  -1,
1092     -1,   1,   1,  -1,   1,  -1,   1,   1,   1,  -1,  -1,   1,   4,  -1,  -1,  -4,
1093      1,   1,   1,   2,  -1,  -1,   1,  -1,  -1,   1,  -1,  -1,   1,  -2,   1,  -1,
1094      1,   1,  -1,  -1,   1,   1,  -1,  -1,   3,   2,  -3,  -2,   2,   5,  -2,   2,
1095      2,  -5,  -2,  -2,  -2,   2,  -3,   3,   2,   3,  -3,   2,  -2,  -2,   3,  -3,
1096      6,   2,  -2,   3,  -6,   3,  -3,  -3,   3,   7,  -4,   4,  -3,   2,  -7,   2,
1097      2,  -2,  -4,   2,   8,  -2,  -2,  -2,   4,   2,  -2,   2,   3,   2,  -2,  -2,
1098      2,   2,  -2,  -8,  -2,   9,  -2,   2,  -3,  -2,   2,  -2,   2,   2,   2,   4,
1099     -2,  -4,  10,   2,   2,  -2,  -9,  -2,   2,  -2,   5,   4,  -4,   4,  -2,   2,
1100     -5,  -4,  -3,   4,   2,  -3,   3,  -2,  -5,   5,   3,   3,  -2,  -3, -10,  -4}
1101 },{
1102     /* MapTab2 */
1103     2,  /* eob_sym */
1104     11, /* esc_sym */
1105     /* run table */
1106     {1,  1,  0,  2,  2,  1,  1,  3,  3,  4,  4,  0,  1,  1,  5,  5,
1107      2,  2,  6,  6,  7,  7,  1,  8,  1,  8,  3,  3,  9,  9,  1,  2,
1108      2,  1,  4, 10,  4, 10, 11, 11,  1,  5, 12, 12,  1,  5, 13, 13,
1109      3,  3,  6,  6,  2,  2, 14, 14, 16, 16, 15,  7, 15,  8,  8,  7,
1110      1,  1, 17, 17,  4,  4,  1,  1, 18, 18,  2,  2,  5,  5, 25,  3,
1111      9,  3, 25,  9, 19, 24, 19, 24,  1, 21, 20,  1, 21, 22, 20, 22,
1112     23, 23,  8,  6, 33,  6,  8, 33,  7,  7, 26, 26,  1, 32,  1, 32,
1113     28,  4, 28, 10, 29, 27, 27, 10, 41,  4, 29,  2,  2, 41, 36, 31,
1114     49, 31, 34, 30, 34, 36, 30, 35,  1, 49, 11,  5, 35, 11,  1,  3,
1115      3,  5, 37, 37,  8, 40,  8, 40, 12, 12, 42, 42,  1, 38, 16, 57,
1116      1,  6, 16, 39, 38,  6,  7,  7, 13, 13, 39, 43,  2, 43, 57,  2,
1117     50,  9, 44,  9, 50,  4, 15, 48, 44,  4,  1, 15, 48, 14, 14,  1,
1118     45, 45,  8,  3,  5,  8, 51, 47,  3, 46, 46, 47,  5, 51,  1, 17,
1119     17, 58,  1, 58,  2, 52, 52,  2, 53,  7, 59,  6,  6, 56, 53, 55,
1120      7, 55,  1, 54, 59, 56, 54, 10,  1, 10,  4, 60,  1, 60,  8,  4,
1121      8, 64, 64, 61,  1, 63,  3, 63, 62, 61,  5, 11,  5,  3, 11, 62},
1122
1123     /* value table */
1124     { 1,  -1,   0,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   0,   3,  -3,   1,  -1,
1125       2,  -2,   1,  -1,   1,  -1,   4,   1,  -4,  -1,   2,  -2,   1,  -1,   5,   3,
1126      -3,  -5,   2,   1,  -2,  -1,   1,  -1,   6,   2,   1,  -1,  -6,  -2,   1,  -1,
1127       3,  -3,   2,  -2,   4,  -4,   1,  -1,   1,  -1,   1,   2,  -1,   2,  -2,  -2,
1128       7,  -7,   1,  -1,   3,  -3,   8,  -8,   1,  -1,   5,  -5,   3,  -3,   1,   4,
1129       2,  -4,  -1,  -2,   1,   1,  -1,  -1,   9,   1,   1,  -9,  -1,   1,  -1,  -1,
1130       1,  -1,   3,  -3,   1,   3,  -3,  -1,   3,  -3,   1,  -1,  10,   1, -10,  -1,
1131       1,   4,  -1,   2,   1,  -1,   1,  -2,   1,  -4,  -1,   6,  -6,  -1,   1,   1,
1132       1,  -1,   1,   1,  -1,  -1,  -1,   1,  11,  -1,  -2,   4,  -1,   2, -11,   5,
1133      -5,  -4,  -1,   1,   4,   1,  -4,  -1,  -2,   2,   1,  -1,  12,   1,  -2,   1,
1134     -12,   4,   2,   1,  -1,  -4,   4,  -4,   2,  -2,  -1,   1,   7,  -1,  -1,  -7,
1135      -1,  -3,   1,   3,   1,   5,   2,   1,  -1,  -5,  13,  -2,  -1,   2,  -2, -13,
1136       1,  -1,   5,   6,   5,  -5,   1,   1,  -6,   1,  -1,  -1,  -5,  -1,  14,   2,
1137      -2,   1, -14,  -1,   8,   1,  -1,  -8,   1,   5,   1,   5,  -5,   1,  -1,   1,
1138      -5,  -1,  15,   1,  -1,  -1,  -1,   3, -15,  -3,   6,   1,  16,  -1,   6,  -6,
1139      -6,   1,  -1,   1, -16,   1,   7,  -1,   1,  -1,  -6,  -3,   6,  -7,   3,  -1}
1140 },{
1141     /* MapTab3 */
1142     0,  /* eob_sym */
1143     35, /* esc_sym */
1144     /* run table */
1145     {0,  1,  1,  2,  2,  3,  3,  4,  4,  1,  1,  5,  5,  6,  6,  7,
1146      7,  8,  8,  9,  9,  2,  2, 10, 10,  1,  1, 11, 11, 12, 12,  3,
1147      3, 13, 13,  0, 14, 14, 16, 15, 16, 15,  4,  4, 17,  1, 17,  1,
1148      5,  5, 18, 18,  2,  2,  6,  6,  8, 19,  7,  8,  7, 19, 20, 20,
1149     21, 21, 22, 24, 22, 24, 23, 23,  1,  1, 25, 25,  3,  3, 26, 26,
1150      9,  9, 27, 27, 28, 28, 33, 29,  4, 33, 29,  1,  4,  1, 32, 32,
1151      2,  2, 31, 10, 30, 10, 30, 31, 34, 34,  5,  5, 36, 36, 35, 41,
1152     35, 11, 41, 11, 37,  1,  8,  8, 37,  6,  1,  6, 40,  7,  7, 40,
1153     12, 38, 12, 39, 39, 38, 49, 13, 49, 13,  3, 42,  3, 42, 16, 16,
1154     43, 43, 14, 14,  1,  1, 44, 15, 44, 15,  2,  2, 57, 48, 50, 48,
1155     57, 50,  4, 45, 45,  4, 46, 47, 47, 46,  1, 51,  1, 17, 17, 51,
1156      8,  9,  9,  5, 58,  8, 58,  5, 52, 52, 55, 56, 53, 56, 55, 59,
1157     59, 53, 54,  1,  6, 54,  7,  7,  6,  1,  2,  3,  2,  3, 64, 60,
1158     60, 10, 10, 64, 61, 62, 61, 63,  1, 63, 62,  1, 18, 24, 18,  4,
1159     25,  4,  8, 21, 21,  1, 24, 22, 25, 22,  8, 11, 19, 11, 23,  1,
1160     20, 23, 19, 20,  5, 12,  5,  1, 16,  2, 12, 13,  2, 13,  1, 16},
1161
1162     /* value table */
1163     { 0,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   1,
1164      -1,   1,  -1,   1,  -1,   2,  -2,   1,  -1,   3,  -3,   1,  -1,   1,  -1,   2,
1165      -2,   1,  -1,   0,   1,  -1,   1,   1,  -1,  -1,   2,  -2,   1,   4,  -1,  -4,
1166       2,  -2,   1,  -1,  -3,   3,   2,  -2,   2,   1,   2,  -2,  -2,  -1,   1,  -1,
1167       1,  -1,   1,   1,  -1,  -1,   1,  -1,   5,  -5,   1,  -1,   3,  -3,   1,  -1,
1168       2,  -2,   1,  -1,   1,  -1,   1,   1,   3,  -1,  -1,   6,  -3,  -6,  -1,   1,
1169       4,  -4,   1,   2,   1,  -2,  -1,  -1,   1,  -1,   3,  -3,   1,  -1,   1,   1,
1170      -1,   2,  -1,  -2,   1,   7,  -3,   3,  -1,   3,  -7,  -3,   1,  -3,   3,  -1,
1171       2,   1,  -2,   1,  -1,  -1,   1,   2,  -1,  -2,  -4,  -1,   4,   1,   2,  -2,
1172       1,  -1,  -2,   2,   8,  -8,  -1,   2,   1,  -2,  -5,   5,   1,  -1,  -1,   1,
1173      -1,   1,   4,  -1,   1,  -4,  -1,  -1,   1,   1,   9,   1,  -9,   2,  -2,  -1,
1174      -4,   3,  -3,  -4,  -1,   4,   1,   4,   1,  -1,   1,  -1,   1,   1,  -1,   1,
1175      -1,  -1,  -1,  10,   4,   1,   4,  -4,  -4, -10,   6,   5,  -6,  -5,   1,  -1,
1176       1,   3,  -3,  -1,   1,  -1,  -1,  -1,  11,   1,   1, -11,  -2,  -2,   2,   5,
1177      -2,  -5,  -5,   2,  -2,  12,   2,  -2,   2,   2,   5,  -3,  -2,   3,  -2, -12,
1178      -2,   2,   2,   2,  -5,   3,   5,  13,  -3,   7,  -3,  -3,  -7,   3, -13,   3}
1179 },{
1180     /* MapTab4 */
1181     0,  /* eob_sym */
1182     34, /* esc_sym */
1183     /* run table */
1184     {0,  1,  1,  1,  2,  2,  1,  3,  3,  1,  1,  1,  4,  4,  1,  5,
1185      2,  1,  5,  2,  1,  1,  6,  6,  1,  1,  1,  1,  1,  7,  3,  1,
1186      2,  3,  0,  1,  2,  7,  1,  1,  1,  8,  1,  1,  8,  1,  1,  1,
1187      9,  1,  9,  1,  2,  1,  1,  2,  1,  1, 10,  4,  1, 10,  1,  4,
1188      1,  1,  1,  1,  1,  3,  1,  1,  1,  3,  2,  1,  5,  1,  1,  1,
1189      2,  5,  1, 11,  1, 11,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
1190      2,  1,  6,  1,  6,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1, 12,
1191      3,  1, 12,  1,  1,  1,  2,  1,  1,  3,  1,  1,  1,  1,  1,  1,
1192      4,  1,  1,  1,  2,  1,  1,  4,  1,  1,  1,  1,  1,  1,  2,  1,
1193      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  3,  1,  2,  1,  1,  5,
1194      1,  1,  1,  1,  1,  7,  1,  7,  1,  1,  2,  3,  1,  1,  1,  1,
1195      5,  1,  1,  1,  1,  1,  1,  2, 13,  1,  1,  1,  1,  1,  1,  1,
1196      1,  1,  1,  1,  1,  1,  1,  1, 13,  2,  1,  1,  4,  1,  1,  1,
1197      3,  1,  6,  1,  1,  1, 14,  1,  1,  1,  1,  1, 14,  6,  1,  1,
1198      1,  1, 15,  2,  4,  1,  2,  3, 15,  1,  1,  1,  8,  1,  1,  8,
1199      1,  1,  1,  1,  1,  1,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1},
1200
1201     /* value table */
1202     { 0,   1,  -1,   2,   1,  -1,  -2,   1,  -1,   3,  -3,   4,   1,  -1,  -4,   1,
1203       2,   5,  -1,  -2,  -5,   6,   1,  -1,  -6,   7,  -7,   8,  -8,   1,   2,   9,
1204       3,  -2,   0,  -9,  -3,  -1,  10, -10,  11,   1, -11,  12,  -1, -12,  13, -13,
1205       1,  14,  -1, -14,   4,  15, -15,  -4,  16, -16,   1,   2,  17,  -1, -17,  -2,
1206      18, -18,  19, -19,  20,   3, -20,  21, -21,  -3,   5,  22,   2, -22, -23,  23,
1207      -5,  -2,  24,   1, -24,  -1,  25, -25,  26, -26, -27,  27,  28,  29, -28, -29,
1208       6,  30,   2, -31,  -2, -30,  31,  -6, -32,  32,  33, -33,  34, -35, -34,   1,
1209       4, -36,  -1,  35,  37,  36,   7, -37,  38,  -4, -38,  39,  41,  40, -40, -39,
1210       3,  42, -43, -41,  -7, -42,  43,  -3,  44, -44,  45, -45,  46,  47,   8, -47,
1211     -48, -46,  50, -50,  48,  49,  51, -49,  52, -52,   5, -51,  -8, -53,  53,   3,
1212     -56,  56,  55,  54, -54,   2,  60,  -2, -55,  58,   9,  -5,  59,  57, -57, -63,
1213      -3, -58, -60, -61,  61, -59, -62,  -9,   1,  64,  62,  69, -64,  63,  65, -67,
1214     -68,  66, -65,  68, -66, -69,  67, -70,  -1,  10,  71, -71,   4,  73,  72,  70,
1215       6, -76,  -3,  74, -78, -74,   1,  78,  80, -72, -75,  76,  -1,   3, -73,  79,
1216      75,  77,   1,  11,  -4, -79, -10,  -6,  -1, -77, -83, -80,   2,  81, -84,  -2,
1217      83, -81,  82, -82,  84, -87, -86,  85, -11, -85,  86, -89,  87, -88,  88,  89}
1218 },{
1219     /* MapTab5 */
1220     2,  /* eob_sym */
1221     33, /* esc_sym */
1222     /* run table */
1223     {1,  1,  0,  2,  1,  2,  1,  3,  3,  1,  1,  4,  4,  2,  2,  1,
1224      1,  5,  5,  6,  1,  6,  1,  7,  7,  3,  3,  2,  8,  2,  8,  1,
1225      1,  0,  9,  9,  1,  1, 10,  4, 10,  4, 11, 11,  2,  1,  2,  1,
1226     12, 12,  3,  3,  1,  1, 13,  5,  5, 13, 14,  1,  1, 14,  2,  2,
1227      6,  6, 15,  1,  1, 15, 16,  4,  7, 16,  4,  7,  1,  1,  3,  3,
1228      8,  8,  2,  2,  1,  1, 17, 17,  1,  1, 18, 18,  5,  5,  2,  2,
1229      1,  1,  9, 19,  9, 19, 20,  3,  3, 20,  1, 10, 21,  1, 10,  4,
1230      4, 21, 22,  6,  6, 22,  1,  1, 23, 24,  2,  2, 23, 24, 11,  1,
1231      1, 11,  7, 25,  7,  1,  1, 25,  8,  8,  3, 26,  3,  1, 12,  2,
1232      2, 26,  1, 12,  5,  5, 27,  4,  1,  4,  1, 27, 28,  1, 28, 13,
1233      1, 13,  2, 29,  2,  1, 32,  6,  1, 30, 14, 29, 14,  6,  3, 31,
1234      3,  1, 30,  1, 32, 31, 33,  9, 33,  1,  1,  7,  9,  7,  2,  2,
1235      1,  1,  4, 36, 34,  4,  5, 10, 10,  5, 34,  1,  1, 35,  8,  8,
1236     36,  3, 35,  1, 15,  3,  2,  1, 16, 15, 16,  2, 37,  1, 37,  1,
1237      1,  1,  6,  6, 38,  1, 38, 11,  1, 39, 39, 40, 11,  2, 41,  4,
1238     40,  1,  2,  4,  1,  1,  1, 41,  3,  1,  3,  1,  5,  7,  5,  7},
1239
1240     /* value table */
1241     { 1,  -1,   0,   1,   2,  -1,  -2,   1,  -1,   3,  -3,   1,  -1,   2,  -2,   4,
1242      -4,   1,  -1,   1,   5,  -1,  -5,   1,  -1,   2,  -2,   3,   1,  -3,  -1,   6,
1243      -6,   0,   1,  -1,   7,  -7,   1,   2,  -1,  -2,   1,  -1,   4,   8,  -4,  -8,
1244       1,  -1,   3,  -3,   9,  -9,   1,   2,  -2,  -1,   1,  10, -10,  -1,   5,  -5,
1245       2,  -2,   1,  11, -11,  -1,   1,   3,   2,  -1,  -3,  -2,  12, -12,   4,  -4,
1246       2,  -2,  -6,   6,  13, -13,   1,  -1,  14, -14,   1,  -1,   3,  -3,   7,  -7,
1247      15, -15,   2,   1,  -2,  -1,   1,   5,  -5,  -1, -16,   2,   1,  16,  -2,   4,
1248      -4,  -1,   1,   3,  -3,  -1,  17, -17,   1,   1,  -8,   8,  -1,  -1,   2,  18,
1249     -18,  -2,   3,   1,  -3,  19, -19,  -1,   3,  -3,   6,   1,  -6,  20,   2,   9,
1250      -9,  -1, -20,  -2,   4,  -4,   1,  -5,  21,   5, -21,  -1,   1, -22,  -1,   2,
1251      22,  -2,  10,   1, -10,  23,   1,   4, -23,   1,   2,  -1,  -2,  -4,  -7,   1,
1252       7, -24,  -1,  24,  -1,  -1,   1,   3,  -1, -25,  25,   4,  -3,  -4,  11, -11,
1253      26, -26,   6,   1,   1,  -6,  -5,  -3,   3,   5,  -1, -27,  27,   1,   4,  -4,
1254      -1,  -8,  -1,  28,   2,   8, -12, -28,  -2,  -2,   2,  12,  -1,  29,   1, -29,
1255      30, -30,   5,  -5,   1, -31,  -1,   3,  31,  -1,   1,   1,  -3, -13,   1,  -7,
1256      -1, -32,  13,   7,  32,  33, -33,  -1,  -9, -34,   9,  34,  -6,   5,   6,  -5}
1257 },{
1258     /* MapTab6 */
1259     2,  /* eob_sym */
1260     13, /* esc_sym */
1261     /* run table */
1262     {1,  1,  0,  1,  1,  2,  2,  1,  1,  3,  3,  1,  1,  0,  2,  2,
1263      4,  1,  4,  1,  1,  1,  5,  5,  1,  1,  6,  6,  2,  2,  1,  1,
1264      3,  3,  7,  7,  1,  1,  8,  8,  1,  1,  2,  2,  1,  9,  1,  9,
1265      4,  4, 10,  1,  1, 10,  1,  1, 11, 11,  3,  3,  1,  2,  1,  2,
1266      1,  1, 12, 12,  5,  5,  1,  1, 13,  1,  1, 13,  2,  2,  1,  1,
1267      6,  6,  1,  1,  4, 14,  4, 14,  3,  1,  3,  1,  1,  1, 15,  7,
1268     15,  2,  2,  7,  1,  1,  1,  8,  1,  8, 16, 16,  1,  1,  1,  1,
1269      2,  1,  1,  2,  1,  1,  3,  5,  5,  3,  4,  1,  1,  4,  1,  1,
1270     17, 17,  9,  1,  1,  9,  2,  2,  1,  1, 10, 10,  1,  6,  1,  1,
1271      6, 18,  1,  1, 18,  1,  1,  1,  2,  2,  3,  1,  3,  1,  1,  1,
1272      4,  1, 19,  1, 19,  7,  1,  1, 20,  1,  4, 20,  1,  7, 11,  2,
1273      1, 11, 21,  2,  8,  5,  1,  8,  1,  5, 21,  1,  1,  1, 22,  1,
1274      1, 22,  1,  1,  3,  3,  1, 23,  2, 12, 24,  1,  1,  2,  1,  1,
1275     12, 23,  1,  1, 24,  1,  1,  1,  4,  1,  1,  1,  2,  1,  6,  6,
1276      4,  2,  1,  1,  1,  1,  1,  1,  1, 14, 13,  3,  1, 25,  9, 25,
1277     14,  1,  9,  3, 13,  1,  1,  1,  1,  1, 10,  1,  1,  2, 10,  2},
1278
1279     /* value table */
1280     {-20,  -1,   0,   2,  -2,   1,  -1,   3,  -3,   1,  -1,   4,  -4,   0,   2,  -2,
1281        1,   5,  -1,  -5,   6,  -6,   1,  -1,   7,  -7,   1,  -1,   3,  -3,   8,  -8,
1282        2,  -2,   1,  -1,   9,  -9,   1,  -1,  10, -10,   4,  -4,  11,   1, -11,  -1,
1283        2,  -2,   1,  12, -12,  -1,  13, -13,   1,  -1,   3,  -3,  14,   5, -14,  -5,
1284      -15,  15,  -1,   1,   2,  -2,  16, -16,   1,  17, -17,  -1,   6,  -6,  18, -18,
1285        2,  -2, -19,  19,  -3,   1,   3,  -1,   4,  20,  -4,   1, -21,  21,   1,   2,
1286       -1,  -7,   7,  -2,  22, -22,  23,   2, -23,  -2,   1,  -1, -24,  24, -25,  25,
1287       -8, -26,  26,   8, -27,  27,   5,   3,  -3,  -5,  -4,  28, -28,   4,  29, -29,
1288        1,  -1,  -2, -30,  30,   2,   9,  -9, -31,  31,   2,  -2, -32,   3,  32, -33,
1289       -3,   1,  33, -34,  -1,  34, -35,  35, -10,  10,  -6,  36,   6, -36,  37, -37,
1290       -5,  38,   1, -38,  -1,   3,  39, -39,  -1,  40,   5,   1, -40,  -3,   2, -11,
1291      -41,  -2,   1,  11,  -3,  -4,  41,   3,  42,   4,  -1, -43, -42,  43,   1, -44,
1292       45,  -1,  44, -45,  -7,   7, -46,   1, -12,   2,   1, -47,  46,  12,  47,  48,
1293       -2,  -1, -48,  49,  -1, -50, -49,  50,  -6, -51,  51,  52, -13,  53,  -4,   4,
1294        6,  13, -53, -52, -54,  55,  54, -55, -56,  -2,   2,  -8,  56,   1,  -3,  -1,
1295        2,  58,   3,   8,  -2,  57, -58, -60, -59, -57,  -3,  60,  59, -14,   3,  14}
1296 },{
1297     /* MapTab7 */
1298     2,  /* eob_sym */
1299     38, /* esc_sym */
1300     /* run table */
1301     {1,  1,  0,  2,  2,  1,  1,  3,  3,  4,  4,  5,  5,  1,  1,  6,
1302      6,  2,  2,  7,  7,  8,  8,  1,  1,  3,  3,  9,  9, 10, 10,  1,
1303      1,  2,  2,  4,  4, 11,  0, 11, 12, 12, 13, 13,  1,  1,  5,  5,
1304     14, 14, 15, 16, 15, 16,  3,  3,  1,  6,  1,  6,  2,  2,  7,  7,
1305      8,  8, 17, 17,  1,  1,  4,  4, 18, 18,  2,  2,  1, 19,  1, 20,
1306     19, 20, 21, 21,  3,  3, 22, 22,  5,  5, 24,  1,  1, 23,  9, 23,
1307     24,  9,  2,  2, 10,  1,  1, 10,  6,  6, 25,  4,  4, 25,  7,  7,
1308     26,  8,  1,  8,  3,  1, 26,  3, 11, 11, 27, 27,  2, 28,  1,  2,
1309     28,  1, 12, 12,  5,  5, 29, 13, 13, 29, 32,  1,  1, 33, 31, 30,
1310     32,  4, 30, 33,  4, 31,  3, 14,  1,  1,  3, 34, 34,  2,  2, 14,
1311      6,  6, 35, 36, 35, 36,  1, 15,  1, 16, 16, 15,  7,  9,  7,  9,
1312     37,  8,  8, 37,  1,  1, 39,  2, 38, 39,  2, 40,  5, 38, 40,  5,
1313      3,  3,  4,  4, 10, 10,  1,  1,  1,  1, 41,  2, 41,  2,  6,  6,
1314      1,  1, 11, 42, 11, 43,  3, 42,  3, 17,  4, 43,  1, 17,  7,  1,
1315      8, 44,  4,  7, 44,  5,  8,  2,  5,  1,  2, 48, 45,  1, 12, 45,
1316     12, 48, 13, 13,  1,  9,  9, 46,  1, 46, 47, 47, 49, 18, 18, 49},
1317
1318     /* value table */
1319     { 1,  -1,   0,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   1,  -1,   3,  -3,   1,
1320      -1,  -2,   2,   1,  -1,   1,  -1,   4,  -4,  -2,   2,   1,  -1,   1,  -1,   5,
1321      -5,  -3,   3,   2,  -2,   1,   0,  -1,   1,  -1,   1,  -1,   6,  -6,   2,  -2,
1322       1,  -1,   1,   1,  -1,  -1,  -3,   3,   7,   2,  -7,  -2,  -4,   4,   2,  -2,
1323       2,  -2,   1,  -1,   8,  -8,   3,  -3,   1,  -1,  -5,   5,   9,   1,  -9,   1,
1324      -1,  -1,   1,  -1,  -4,   4,   1,  -1,   3,  -3,   1, -10,  10,   1,   2,  -1,
1325      -1,  -2,   6,  -6,   2,  11, -11,  -2,   3,  -3,   1,  -4,   4,  -1,   3,  -3,
1326       1,   3,  12,  -3,  -5, -12,  -1,   5,   2,  -2,   1,  -1,  -7,   1,  13,   7,
1327      -1, -13,   2,  -2,   4,  -4,   1,   2,  -2,  -1,   1,  14, -14,   1,   1,   1,
1328      -1,  -5,  -1,  -1,   5,  -1,  -6,   2, -15,  15,   6,   1,  -1,  -8,   8,  -2,
1329      -4,   4,   1,   1,  -1,  -1,  16,   2, -16,  -2,   2,  -2,   4,   3,  -4,  -3,
1330      -1,  -4,   4,   1, -17,  17,  -1,  -9,   1,   1,   9,   1,  -5,  -1,  -1,   5,
1331      -7,   7,   6,  -6,   3,  -3,  18, -18,  19, -19,   1, -10,  -1,  10,  -5,   5,
1332      20, -20,  -3,   1,   3,   1,   8,  -1,  -8,   2,   7,  -1, -21,  -2,   5,  21,
1333       5,  -1,  -7,  -5,   1,  -6,  -5, -11,   6,  22,  11,   1,   1, -22,  -3,  -1,
1334       3,  -1,   3,  -3, -23,   4,  -4,   1,  23,  -1,   1,  -1,   1,  -2,   2,  -1}
1335 },{
1336     /* MapTab8 */
1337     4,  /* eob_sym */
1338     11, /* esc_sym */
1339     /* run table */
1340     {1,  1,  1,  1,  0,  2,  2,  1,  1,  3,  3,  0,  1,  1,  2,  2,
1341      4,  4,  1,  1,  5,  5,  1,  1,  2,  2,  3,  3,  6,  6,  1,  1,
1342      7,  7,  8,  1,  8,  2,  2,  1,  4,  4,  1,  3,  1,  3,  9,  9,
1343      2,  2,  1,  5,  1,  5, 10, 10,  1,  1, 11, 11,  3,  6,  3,  4,
1344      4,  6,  2,  2,  1, 12,  1, 12,  7, 13,  7, 13,  1,  1,  8,  8,
1345      2,  2, 14, 14, 16, 15, 16,  5,  5,  1,  3, 15,  1,  3,  4,  4,
1346      1,  1, 17, 17,  2,  2,  6,  6,  1, 18,  1, 18, 22, 21, 22, 21,
1347     25, 24, 25, 19,  9, 20,  9, 23, 19, 24, 20,  3, 23,  7,  3,  1,
1348      1,  7, 28, 26, 29,  5, 28, 26,  5,  8, 29,  4,  8, 27,  2,  2,
1349      4, 27,  1,  1, 10, 36, 10, 33, 33, 36, 30,  1, 32, 32,  1, 30,
1350      6, 31, 31, 35,  3,  6, 11, 11,  3,  2, 35,  2, 34,  1, 34,  1,
1351     37, 37, 12,  7, 12,  5, 41,  5,  4,  7,  1,  8, 13,  4,  1, 41,
1352     13, 38,  8, 38,  9,  1, 40, 40,  9,  1, 39,  2,  2, 49, 39, 42,
1353      3,  3, 14, 16, 49, 14, 16, 42, 43, 43,  6,  6, 15,  1,  1, 15,
1354     44, 44,  1,  1, 50, 48,  4,  5,  4,  7,  5,  2, 10, 10, 48,  7,
1355     50, 45,  2,  1, 45,  8,  8,  1, 46, 46,  3, 47, 47,  3,  1,  1},
1356
1357     /* value table */
1358     { 1,  -1,   2,  -2,   0,   1,  -1,   3,  -3,   1,  -1,   0,   4,  -4,   2,  -2,
1359       1,  -1,   5,  -5,   1,  -1,   6,  -6,   3,  -3,   2,  -2,   1,  -1,   7,  -7,
1360       1,  -1,   1,   8,  -1,   4,  -4,  -8,   2,  -2,   9,   3,  -9,  -3,   1,  -1,
1361       5,  -5,  10,   2, -10,  -2,   1,  -1,  11, -11,   1,  -1,  -4,   2,   4,   3,
1362      -3,  -2,   6,  -6,  12,   1, -12,  -1,   2,   1,  -2,  -1,  13, -13,   2,  -2,
1363       7,  -7,   1,  -1,   1,   1,  -1,   3,  -3,  14,   5,  -1, -14,  -5,   4,  -4,
1364      15, -15,   1,  -1,   8,  -8,  -3,   3,  16,   1, -16,  -1,   1,   1,  -1,  -1,
1365       1,   1,  -1,   1,   2,   1,  -2,   1,  -1,  -1,  -1,   6,  -1,   3,  -6,  17,
1366     -17,  -3,   1,   1,   1,   4,  -1,  -1,  -4,   3,  -1,   5,  -3,  -1,  -9,   9,
1367      -5,   1,  18, -18,   2,   1,  -2,   1,  -1,  -1,   1,  19,  -1,   1, -19,  -1,
1368       4,   1,  -1,   1,   7,  -4,  -2,   2,  -7,  10,  -1, -10,   1,  20,  -1, -20,
1369       1,  -1,   2,   4,  -2,   5,   1,  -5,   6,  -4,  21,   4,   2,  -6, -21,  -1,
1370      -2,   1,  -4,  -1,  -3,  22,  -1,   1,   3, -22,  -1,  11, -11,   1,   1,   1,
1371       8,  -8,   2,   2,  -1,  -2,  -2,  -1,   1,  -1,  -5,   5,   2,  23, -23,  -2,
1372       1,  -1,  24, -24,  -1,  -1,   7,   6,  -7,   5,  -6,  12,  -3,   3,   1,  -5,
1373       1,   1, -12,  25,  -1,  -5,   5, -25,  -1,   1,   9,   1,  -1,  -9,  26, -26}
1374 }
1375 };