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