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