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