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