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