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