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