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 FFmpeg.
7 *
8 * FFmpeg 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 * FFmpeg 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 FFmpeg; 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 ALT_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
42/**
43 *  Reverses "nbits" bits of the value "val" and returns the result
44 *  in the least significant bits.
45 */
46static uint16_t inv_bits(uint16_t val, int nbits)
47{
48    uint16_t res;
49
50    if (nbits <= 8) {
51        res = av_reverse[val] >> (8-nbits);
52    } else
53        res = ((av_reverse[val & 0xFF] << 8) + (av_reverse[val >> 8])) >> (16-nbits);
54
55    return res;
56}
57
58int ff_ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag)
59{
60    int         pos, i, j, codes_per_row, prefix, not_last_row;
61    uint16_t    codewords[256]; /* FIXME: move this temporal storage out? */
62    uint8_t     bits[256];
63
64    pos = 0; /* current position = 0 */
65
66    for (i = 0; i < cb->num_rows; i++) {
67        codes_per_row = 1 << cb->xbits[i];
68        not_last_row  = (i != cb->num_rows - 1);
69        prefix        = ((1 << i) - 1) << (cb->xbits[i] + not_last_row);
70
71        for (j = 0; j < codes_per_row; j++) {
72            if (pos >= 256) /* Some Indeo5 codebooks can have more than 256 */
73                break;      /* elements, but only 256 codes are allowed! */
74
75            bits[pos] = i + cb->xbits[i] + not_last_row;
76            if (bits[pos] > IVI_VLC_BITS)
77                return -1; /* invalid descriptor */
78
79            codewords[pos] = inv_bits((prefix | j), bits[pos]);
80            if (!bits[pos])
81                bits[pos] = 1;
82
83            pos++;
84        }//for j
85    }//for i
86
87    /* number of codewords = pos */
88    return init_vlc(vlc, IVI_VLC_BITS, pos, bits, 1, 1, codewords, 2, 2,
89                    (flag ? INIT_VLC_USE_NEW_STATIC : 0) | INIT_VLC_LE);
90}
91
92void ff_ivi_init_static_vlc(void)
93{
94    int i;
95    static VLC_TYPE table_data[8192 * 16][2];
96    static int initialized_vlcs = 0;
97
98    if (initialized_vlcs)
99        return;
100    for (i = 0; i < 8; i++) {
101        ff_ivi_mb_vlc_tabs[i].table = table_data + i * 2 * 8192;
102        ff_ivi_mb_vlc_tabs[i].table_allocated = 8192;
103        ff_ivi_create_huff_from_desc(&ff_ivi_mb_huff_desc[i],  &ff_ivi_mb_vlc_tabs[i],  1);
104        ff_ivi_blk_vlc_tabs[i].table = table_data + (i * 2 + 1) * 8192;
105        ff_ivi_blk_vlc_tabs[i].table_allocated = 8192;
106        ff_ivi_create_huff_from_desc(&ff_ivi_blk_huff_desc[i], &ff_ivi_blk_vlc_tabs[i], 1);
107    }
108    initialized_vlcs = 1;
109}
110
111int ff_ivi_dec_huff_desc(GetBitContext *gb, int desc_coded, int which_tab,
112                         IVIHuffTab *huff_tab, AVCodecContext *avctx)
113{
114    int         i, result;
115    IVIHuffDesc new_huff;
116
117    if (!desc_coded) {
118        /* select default table */
119        huff_tab->tab = (which_tab) ? &ff_ivi_blk_vlc_tabs[7]
120            : &ff_ivi_mb_vlc_tabs [7];
121    } else {
122        huff_tab->tab_sel = get_bits(gb, 3);
123        if (huff_tab->tab_sel == 7) {
124            /* custom huffman table (explicitly encoded) */
125            new_huff.num_rows = get_bits(gb, 4);
126
127            for (i = 0; i < new_huff.num_rows; i++)
128                new_huff.xbits[i] = get_bits(gb, 4);
129
130            /* Have we got the same custom table? Rebuild if not. */
131            if (ff_ivi_huff_desc_cmp(&new_huff, &huff_tab->cust_desc)) {
132                ff_ivi_huff_desc_copy(&huff_tab->cust_desc, &new_huff);
133
134                if (huff_tab->cust_tab.table)
135                    free_vlc(&huff_tab->cust_tab);
136                result = ff_ivi_create_huff_from_desc(&huff_tab->cust_desc,
137                        &huff_tab->cust_tab, 0);
138                if (result) {
139                    av_log(avctx, AV_LOG_ERROR,
140                           "Error while initializing custom vlc table!\n");
141                    return -1;
142                }
143            }
144            huff_tab->tab = &huff_tab->cust_tab;
145        } else {
146            /* select one of predefined tables */
147            huff_tab->tab = (which_tab) ? &ff_ivi_blk_vlc_tabs[huff_tab->tab_sel]
148                : &ff_ivi_mb_vlc_tabs [huff_tab->tab_sel];
149        }
150    }
151
152    return 0;
153}
154
155int ff_ivi_huff_desc_cmp(const IVIHuffDesc *desc1, const IVIHuffDesc *desc2)
156{
157    return    desc1->num_rows != desc2->num_rows
158           || memcmp(desc1->xbits, desc2->xbits, desc1->num_rows);
159}
160
161void ff_ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src)
162{
163    dst->num_rows = src->num_rows;
164    memcpy(dst->xbits, src->xbits, src->num_rows);
165}
166
167int av_cold ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg)
168{
169    int         p, b;
170    uint32_t    b_width, b_height, align_fac, width_aligned, height_aligned, buf_size;
171    IVIBandDesc *band;
172
173    ff_ivi_free_buffers(planes);
174
175    /* fill in the descriptor of the luminance plane */
176    planes[0].width     = cfg->pic_width;
177    planes[0].height    = cfg->pic_height;
178    planes[0].num_bands = cfg->luma_bands;
179
180    /* fill in the descriptors of the chrominance planes */
181    planes[1].width     = planes[2].width     = (cfg->pic_width  + 3) >> 2;
182    planes[1].height    = planes[2].height    = (cfg->pic_height + 3) >> 2;
183    planes[1].num_bands = planes[2].num_bands = cfg->chroma_bands;
184
185    for (p = 0; p < 3; p++) {
186        planes[p].bands = av_mallocz(planes[p].num_bands * sizeof(IVIBandDesc));
187        if (!planes[p].bands)
188            return AVERROR(ENOMEM);
189
190        /* select band dimensions: if there is only one band then it
191         *  has the full size, if there are several bands each of them
192         *  has only half size */
193        b_width  = planes[p].num_bands == 1 ? planes[p].width  : (planes[p].width  + 1) >> 1;
194        b_height = planes[p].num_bands == 1 ? planes[p].height : (planes[p].height + 1) >> 1;
195
196        /* luma   band buffers will be aligned on 16x16 (max macroblock size) */
197        /* chroma band buffers will be aligned on   8x8 (max macroblock size) */
198        align_fac       = p ? 8 : 16;
199        width_aligned   = FFALIGN(b_width , align_fac);
200        height_aligned  = FFALIGN(b_height, align_fac);
201        buf_size        = width_aligned * height_aligned * sizeof(int16_t);
202
203        for (b = 0; b < planes[p].num_bands; b++) {
204            band = &planes[p].bands[b]; /* select appropriate plane/band */
205            band->plane    = p;
206            band->band_num = b;
207            band->width    = b_width;
208            band->height   = b_height;
209            band->pitch    = width_aligned;
210            band->bufs[0]  = av_malloc(buf_size);
211            band->bufs[1]  = av_malloc(buf_size);
212            if (!band->bufs[0] || !band->bufs[1])
213                return AVERROR(ENOMEM);
214
215            /* allocate the 3rd band buffer for scalability mode */
216            if (cfg->luma_bands > 1) {
217                band->bufs[2] = av_malloc(buf_size);
218                if (!band->bufs[2])
219                    return AVERROR(ENOMEM);
220            }
221
222            planes[p].bands[0].blk_vlc.cust_desc.num_rows = 0; /* reset custom vlc */
223        }
224    }
225
226    return 0;
227}
228
229void av_cold ff_ivi_free_buffers(IVIPlaneDesc *planes)
230{
231    int p, b, t;
232
233    for (p = 0; p < 3; p++) {
234        for (b = 0; b < planes[p].num_bands; b++) {
235            av_freep(&planes[p].bands[b].bufs[0]);
236            av_freep(&planes[p].bands[b].bufs[1]);
237            av_freep(&planes[p].bands[b].bufs[2]);
238
239            if (planes[p].bands[b].blk_vlc.cust_tab.table)
240                free_vlc(&planes[p].bands[b].blk_vlc.cust_tab);
241            for (t = 0; t < planes[p].bands[b].num_tiles; t++)
242                av_freep(&planes[p].bands[b].tiles[t].mbs);
243            av_freep(&planes[p].bands[b].tiles);
244        }
245        av_freep(&planes[p].bands);
246    }
247}
248
249int av_cold ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height)
250{
251    int         p, b, x, y, x_tiles, y_tiles, t_width, t_height;
252    IVIBandDesc *band;
253    IVITile     *tile, *ref_tile;
254
255    for (p = 0; p < 3; p++) {
256        t_width  = !p ? tile_width  : (tile_width  + 3) >> 2;
257        t_height = !p ? tile_height : (tile_height + 3) >> 2;
258
259        if (!p && planes[0].num_bands == 4) {
260            t_width  >>= 1;
261            t_height >>= 1;
262        }
263
264        for (b = 0; b < planes[p].num_bands; b++) {
265            band = &planes[p].bands[b];
266            x_tiles = IVI_NUM_TILES(band->width, t_width);
267            y_tiles = IVI_NUM_TILES(band->height, t_height);
268            band->num_tiles = x_tiles * y_tiles;
269
270            av_freep(&band->tiles);
271            band->tiles = av_mallocz(band->num_tiles * sizeof(IVITile));
272            if (!band->tiles)
273                return AVERROR(ENOMEM);
274
275            tile = band->tiles;
276
277            /* use the first luma band as reference for motion vectors
278             * and quant */
279            ref_tile = planes[0].bands[0].tiles;
280
281            for (y = 0; y < band->height; y += t_height) {
282                for (x = 0; x < band->width; x += t_width) {
283                    tile->xpos     = x;
284                    tile->ypos     = y;
285                    tile->width    = FFMIN(band->width - x,  t_width);
286                    tile->height   = FFMIN(band->height - y, t_height);
287                    tile->is_empty = tile->data_size = 0;
288                    /* calculate number of macroblocks */
289                    tile->num_MBs  = IVI_MBs_PER_TILE(tile->width, tile->height,
290                                                      band->mb_size);
291
292                    av_freep(&tile->mbs);
293                    tile->mbs = av_malloc(tile->num_MBs * sizeof(IVIMbInfo));
294                    if (!tile->mbs)
295                        return AVERROR(ENOMEM);
296
297                    tile->ref_mbs = 0;
298                    if (p || b) {
299                        tile->ref_mbs = ref_tile->mbs;
300                        ref_tile++;
301                    }
302
303                    tile++;
304                }
305            }
306
307        }// for b
308    }// for p
309
310    return 0;
311}
312
313int ff_ivi_dec_tile_data_size(GetBitContext *gb)
314{
315    int    len;
316
317    len = 0;
318    if (get_bits1(gb)) {
319        len = get_bits(gb, 8);
320        if (len == 255)
321            len = get_bits_long(gb, 24);
322    }
323
324    /* align the bitstream reader on the byte boundary */
325    align_get_bits(gb);
326
327    return len;
328}
329
330int ff_ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile)
331{
332    int         mbn, blk, num_blocks, num_coeffs, blk_size, scan_pos, run, val,
333                pos, is_intra, mc_type, mv_x, mv_y, col_mask;
334    uint8_t     col_flags[8];
335    int32_t     prev_dc, trvec[64];
336    uint32_t    cbp, sym, lo, hi, quant, buf_offs, q;
337    IVIMbInfo   *mb;
338    RVMapDesc   *rvmap = band->rv_map;
339    void (*mc_with_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
340    void (*mc_no_delta_func)  (int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
341    const uint8_t   *base_tab, *scale_tab;
342
343    prev_dc = 0; /* init intra prediction for the DC coefficient */
344
345    blk_size   = band->blk_size;
346    col_mask   = blk_size - 1; /* column mask for tracking non-zero coeffs */
347    num_blocks = (band->mb_size != blk_size) ? 4 : 1; /* number of blocks per mb */
348    num_coeffs = blk_size * blk_size;
349    if (blk_size == 8) {
350        mc_with_delta_func = ff_ivi_mc_8x8_delta;
351        mc_no_delta_func   = ff_ivi_mc_8x8_no_delta;
352    } else {
353        mc_with_delta_func = ff_ivi_mc_4x4_delta;
354        mc_no_delta_func   = ff_ivi_mc_4x4_no_delta;
355    }
356
357    for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
358        is_intra = !mb->type;
359        cbp      = mb->cbp;
360        buf_offs = mb->buf_offs;
361
362        quant = av_clip(band->glob_quant + mb->q_delta, 0, 23);
363
364        base_tab  = is_intra ? band->intra_base  : band->inter_base;
365        scale_tab = is_intra ? band->intra_scale : band->inter_scale;
366
367        if (!is_intra) {
368            mv_x = mb->mv_x;
369            mv_y = mb->mv_y;
370            if (!band->is_halfpel) {
371                mc_type = 0; /* we have only fullpel vectors */
372            } else {
373                mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
374                mv_x >>= 1;
375                mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
376            }
377        }
378
379        for (blk = 0; blk < num_blocks; blk++) {
380            /* adjust block position in the buffer according to its number */
381            if (blk & 1) {
382                buf_offs += blk_size;
383            } else if (blk == 2) {
384                buf_offs -= blk_size;
385                buf_offs += blk_size * band->pitch;
386            }
387
388            if (cbp & 1) { /* block coded ? */
389                scan_pos = -1;
390                memset(trvec, 0, num_coeffs*sizeof(trvec[0])); /* zero transform vector */
391                memset(col_flags, 0, sizeof(col_flags));      /* zero column flags */
392
393                while (scan_pos <= num_coeffs) {
394                    sym = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
395                    if (sym == rvmap->eob_sym)
396                        break; /* End of block */
397
398                    if (sym == rvmap->esc_sym) { /* Escape - run/val explicitly coded using 3 vlc codes */
399                        run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1;
400                        lo  = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
401                        hi  = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
402                        val = IVI_TOSIGNED((hi << 6) | lo); /* merge them and convert into signed val */
403                    } else {
404                        run = rvmap->runtab[sym];
405                        val = rvmap->valtab[sym];
406                    }
407
408                    /* de-zigzag and dequantize */
409                    scan_pos += run;
410                    if (scan_pos >= num_coeffs)
411                        break;
412                    pos = band->scan[scan_pos];
413
414                    if (IVI_DEBUG && !val)
415                        av_log(NULL, AV_LOG_ERROR, "Val = 0 encountered!\n");
416
417                    q = (base_tab[pos] * scale_tab[quant]) >> 8;
418                    if (q > 1)
419                        val = val * q + FFSIGN(val) * ((q >> 1) - (q & 1));
420                    trvec[pos] = val;
421                    col_flags[pos & col_mask] |= !!val; /* track columns containing non-zero coeffs */
422                }// while
423
424                if (scan_pos >= num_coeffs && sym != rvmap->eob_sym)
425                    return -1; /* corrupt block data */
426
427                /* undoing DC coeff prediction for intra-blocks */
428                if (is_intra && band->is_2d_trans) {
429                    prev_dc      += trvec[0];
430                    trvec[0]      = prev_dc;
431                    col_flags[0] |= !!prev_dc;
432                }
433
434                /* apply inverse transform */
435                band->inv_transform(trvec, band->buf + buf_offs,
436                                    band->pitch, col_flags);
437
438                /* apply motion compensation */
439                if (!is_intra)
440                    mc_with_delta_func(band->buf + buf_offs,
441                                       band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
442                                       band->pitch, mc_type);
443            } else {
444                /* block not coded */
445                /* for intra blocks apply the dc slant transform */
446                /* for inter - perform the motion compensation without delta */
447                if (is_intra && band->dc_transform) {
448                    band->dc_transform(&prev_dc, band->buf + buf_offs,
449                                       band->pitch, blk_size);
450                } else
451                    mc_no_delta_func(band->buf + buf_offs,
452                                     band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
453                                     band->pitch, mc_type);
454            }
455
456            cbp >>= 1;
457        }// for blk
458    }// for mbn
459
460    align_get_bits(gb);
461
462    return 0;
463}
464
465void ff_ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
466                               IVITile *tile, int32_t mv_scale)
467{
468    int             x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
469    int             offs, mb_offset, row_offset;
470    IVIMbInfo       *mb, *ref_mb;
471    const int16_t   *src;
472    int16_t         *dst;
473    void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch,
474                             int mc_type);
475
476    offs       = tile->ypos * band->pitch + tile->xpos;
477    mb         = tile->mbs;
478    ref_mb     = tile->ref_mbs;
479    row_offset = band->mb_size * band->pitch;
480    need_mc    = 0; /* reset the mc tracking flag */
481
482    for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
483        mb_offset = offs;
484
485        for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
486            mb->xpos     = x;
487            mb->ypos     = y;
488            mb->buf_offs = mb_offset;
489
490            mb->type = 1; /* set the macroblocks type = INTER */
491            mb->cbp  = 0; /* all blocks are empty */
492
493            if (!band->qdelta_present && !band->plane && !band->band_num) {
494                mb->q_delta = band->glob_quant;
495                mb->mv_x    = 0;
496                mb->mv_y    = 0;
497            }
498
499            if (band->inherit_qdelta && ref_mb)
500                mb->q_delta = ref_mb->q_delta;
501
502            if (band->inherit_mv) {
503                /* motion vector inheritance */
504                if (mv_scale) {
505                    mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
506                    mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
507                } else {
508                    mb->mv_x = ref_mb->mv_x;
509                    mb->mv_y = ref_mb->mv_y;
510                }
511                need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
512            }
513
514            mb++;
515            if (ref_mb)
516                ref_mb++;
517            mb_offset += band->mb_size;
518        } // for x
519        offs += row_offset;
520    } // for y
521
522    if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */
523        num_blocks = (band->mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */
524        mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
525                                                 : ff_ivi_mc_4x4_no_delta;
526
527        for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
528            mv_x = mb->mv_x;
529            mv_y = mb->mv_y;
530            if (!band->is_halfpel) {
531                mc_type = 0; /* we have only fullpel vectors */
532            } else {
533                mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
534                mv_x >>= 1;
535                mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
536            }
537
538            for (blk = 0; blk < num_blocks; blk++) {
539                /* adjust block position in the buffer according with its number */
540                offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
541                mc_no_delta_func(band->buf + offs,
542                                 band->ref_buf + offs + mv_y * band->pitch + mv_x,
543                                 band->pitch, mc_type);
544            }
545        }
546    } else {
547        /* copy data from the reference tile into the current one */
548        src = band->ref_buf + tile->ypos * band->pitch + tile->xpos;
549        dst = band->buf     + tile->ypos * band->pitch + tile->xpos;
550        for (y = 0; y < tile->height; y++) {
551            memcpy(dst, src, tile->width*sizeof(band->buf[0]));
552            src += band->pitch;
553            dst += band->pitch;
554        }
555    }
556}
557
558
559#if IVI_DEBUG
560uint16_t ivi_calc_band_checksum (IVIBandDesc *band)
561{
562    int         x, y;
563    int16_t     *src, checksum;
564
565    src = band->buf;
566    checksum = 0;
567
568    for (y = 0; y < band->height; src += band->pitch, y++)
569        for (x = 0; x < band->width; x++)
570            checksum += src[x];
571
572    return checksum;
573}
574
575int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch)
576{
577    int         x, y, result;
578    uint8_t     t1, t2;
579    int16_t    *src;
580
581    src = band->buf;
582    result = 0;
583
584    for (y = 0; y < band->height; src += band->pitch, y++) {
585        for (x = 0; x < band->width; x++) {
586            t1 = av_clip(src[x] + 128, 0, 255);
587            t2 = ref[x];
588            if (t1 != t2) {
589                av_log(NULL, AV_LOG_ERROR, "Data mismatch: row %d, column %d\n",
590                       y / band->blk_size, x / band->blk_size);
591                result = -1;
592            }
593        }
594        ref += pitch;
595    }
596
597    return result;
598}
599#endif
600
601void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch)
602{
603    int             x, y;
604    const int16_t   *src  = plane->bands[0].buf;
605    uint32_t        pitch = plane->bands[0].pitch;
606
607    for (y = 0; y < plane->height; y++) {
608        for (x = 0; x < plane->width; x++)
609            dst[x] = av_clip_uint8(src[x] + 128);
610        src += pitch;
611        dst += dst_pitch;
612    }
613}
614
615
616/**
617 * These are 2x8 predefined Huffman codebooks for coding macroblock/block
618 * signals. They are specified using "huffman descriptors" in order to
619 * avoid huge static tables. The decoding tables will be generated at
620 * startup from these descriptors.
621 */
622const IVIHuffDesc ff_ivi_mb_huff_desc[8] = {
623    {8,  {0, 4, 5, 4, 4, 4, 6, 6}},
624    {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
625    {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
626    {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
627    {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
628    {9,  {0, 4, 4, 4, 4, 3, 3, 3, 2}},
629    {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
630    {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
631};
632
633const IVIHuffDesc ff_ivi_blk_huff_desc[8] = {
634    {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
635    {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
636    {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
637    {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
638    {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
639    {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
640    {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
641    {9,  {3, 4, 4, 5, 5, 5, 6, 5, 5}}
642};
643
644
645/**
646 *  Run-value (RLE) tables.
647 */
648const RVMapDesc ff_ivi_rvmap_tabs[9] = {
649{   /* MapTab0 */
650    5, /* eob_sym */
651    2, /* esc_sym */
652    /* run table */
653    {1,  1,  0,  1,  1,  0,  1,  1,  2,  2,  1,  1,  1,  1,  3,  3,
654     1,  1,  2,  2,  1,  1,  4,  4,  1,  1,  1,  1,  2,  2,  5,  5,
655     1,  1,  3,  3,  1,  1,  6,  6,  1,  2,  1,  2,  7,  7,  1,  1,
656     8,  8,  1,  1,  4,  2,  1,  4,  2,  1,  3,  3,  1,  1,  1,  9,
657     9,  1,  2,  1,  2,  1,  5,  5,  1,  1, 10, 10,  1,  1,  3,  3,
658     2,  2,  1,  1, 11, 11,  6,  4,  4,  1,  6,  1,  2,  1,  2, 12,
659     8,  1, 12,  7,  8,  7,  1, 16,  1, 16,  1,  3,  3, 13,  1, 13,
660     2,  2,  1, 15,  1,  5, 14, 15,  1,  5, 14,  1, 17,  8, 17,  8,
661     1,  4,  4,  2,  2,  1, 25, 25, 24, 24,  1,  3,  1,  3,  1,  8,
662     6,  7,  6,  1, 18,  8, 18,  1,  7, 23,  2,  2, 23,  1,  1, 21,
663    22,  9,  9, 22, 19,  1, 21,  5, 19,  5,  1, 33, 20, 33, 20,  8,
664     4,  4,  1, 32,  2,  2,  8,  3, 32, 26,  3,  1,  7,  7, 26,  6,
665     1,  6,  1,  1, 16,  1, 10,  1, 10,  2, 16, 29, 28,  2, 29, 28,
666     1, 27,  5,  8,  5, 27,  1,  8,  3,  7,  3, 31, 41, 31,  1, 41,
667     6,  1,  6,  7,  4,  4,  1,  1,  2,  1,  2, 11, 34, 30, 11,  1,
668    30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
669
670    /* value table */
671    { 1,  -1,   0,   2,  -2,   0,   3,  -3,   1,  -1,   4,  -4,   5,  -5,   1,  -1,
672      6,  -6,   2,  -2,   7,  -7,   1,  -1,   8,  -8,   9,  -9,   3,  -3,   1,  -1,
673     10, -10,   2,  -2,  11, -11,   1,  -1,  12,   4, -12,  -4,   1,  -1,  13, -13,
674      1,  -1,  14, -14,   2,   5,  15,  -2,  -5, -15,  -3,   3,  16, -16,  17,   1,
675     -1, -17,   6,  18,  -6, -18,   2,  -2,  19, -19,   1,  -1,  20, -20,   4,  -4,
676      7,  -7,  21, -21,   1,  -1,   2,   3,  -3,  22,  -2, -22,   8,  23,  -8,   1,
677      2, -23,  -1,   2,  -2,  -2,  24,   1, -24,  -1,  25,   5,  -5,   1, -25,  -1,
678      9,  -9,  26,   1, -26,   3,   1,  -1,  27,  -3,  -1, -27,   1,   3,  -1,  -3,
679     28,  -4,   4,  10, -10, -28,   1,  -1,   1,  -1,  29,   6, -29,  -6,  30,  -4,
680      3,   3,  -3, -30,   1,   4,  -1,  31,  -3,   1,  11, -11,  -1, -31,  32,  -1,
681     -1,   2,  -2,   1,   1, -32,   1,   4,  -1,  -4,  33,  -1,   1,   1,  -1,   5,
682      5,  -5, -33,  -1, -12,  12,  -5,  -7,   1,   1,   7,  34,   4,  -4,  -1,   4,
683    -34,  -4,  35,  36,  -2, -35,  -2, -36,   2,  13,   2,  -1,   1, -13,   1,  -1,
684     37,   1,  -5,   6,   5,  -1,  38,  -6,  -8,   5,   8,  -1,   1,   1, -37,  -1,
685      5,  39,  -5,  -5,   6,  -6, -38, -39, -14,  40,  14,   2,   1,   1,  -2, -40,
686     -1,  -2,   2,  -1,  -1,  -1,   1,   1,   1,  -1,   1,  -1,   1,  -1,   1,  -1}
687},{
688    /* MapTab1 */
689    0,  /* eob_sym */
690    38, /* esc_sym */
691    /* run table */
692    {0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  8,  6,  8,  7,
693     7,  9,  9, 10, 10, 11, 11,  1, 12,  1, 12, 13, 13, 16, 14, 16,
694    14, 15, 15, 17, 17, 18,  0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
695    25, 24,  2, 25, 24, 23, 23,  2, 26, 28, 26, 28, 29, 27, 29, 27,
696    33, 33,  1, 32,  1,  3, 32, 30, 36,  3, 36, 30, 31, 31, 35, 34,
697    37, 41, 34, 35, 37,  4, 41,  4, 49,  8,  8, 49, 40, 38,  5, 38,
698    40, 39,  5, 39, 42, 43, 42,  7, 57,  6, 43, 44,  6, 50,  7, 44,
699    57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58,  1, 51, 58,  1,
700    52, 59, 53,  9, 52, 55, 55, 59, 53, 56, 54, 56, 54,  9, 64, 64,
701    60, 63, 60, 63, 61, 62, 61, 62,  2, 10,  2, 10, 11,  1, 11, 13,
702    12,  1, 12, 13, 16, 16,  8,  8, 14,  3,  3, 15, 14, 15,  4,  4,
703     1, 17, 17,  5,  1,  7,  7,  5,  6,  1,  2,  2,  6, 22,  1, 25,
704    21, 22,  8, 24,  1, 21, 25, 24,  8, 18, 18, 23,  9, 20, 23, 33,
705    29, 33, 20,  1, 19,  1, 29, 36,  9, 36, 19, 41, 28, 57, 32,  3,
706    28,  3,  1, 27, 49, 49,  1, 32, 26, 26,  2,  4,  4,  7, 57, 41,
707     2,  7, 10,  5, 37, 16, 10, 27,  8,  8, 13, 16, 37, 13,  1,  5},
708
709    /* value table */
710    {0,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,   1,  -1,  -1,   1,
711    -1,   1,  -1,   1,  -1,   1,  -1,   2,   1,  -2,  -1,   1,  -1,   1,   1,  -1,
712    -1,   1,  -1,   1,  -1,   1,   0,  -1,   1,   1,   1,  -1,   1,  -1,  -1,  -1,
713     1,   1,   2,  -1,  -1,   1,  -1,  -2,   1,   1,  -1,  -1,   1,   1,  -1,  -1,
714     1,  -1,   3,   1,  -3,   2,  -1,   1,   1,  -2,  -1,  -1,  -1,   1,   1,   1,
715     1,   1,  -1,  -1,  -1,   2,  -1,  -2,   1,   2,  -2,  -1,   1,   1,   2,  -1,
716    -1,   1,  -2,  -1,   1,   1,  -1,   2,   1,   2,  -1,   1,  -2,  -1,  -2,  -1,
717    -1,   1,   1,  -1,   1,  -1,   1,   1,   1,  -1,  -1,   1,   4,  -1,  -1,  -4,
718     1,   1,   1,   2,  -1,  -1,   1,  -1,  -1,   1,  -1,  -1,   1,  -2,   1,  -1,
719     1,   1,  -1,  -1,   1,   1,  -1,  -1,   3,   2,  -3,  -2,   2,   5,  -2,   2,
720     2,  -5,  -2,  -2,  -2,   2,  -3,   3,   2,   3,  -3,   2,  -2,  -2,   3,  -3,
721     6,   2,  -2,   3,  -6,   3,  -3,  -3,   3,   7,  -4,   4,  -3,   2,  -7,   2,
722     2,  -2,  -4,   2,   8,  -2,  -2,  -2,   4,   2,  -2,   2,   3,   2,  -2,  -2,
723     2,   2,  -2,  -8,  -2,   9,  -2,   2,  -3,  -2,   2,  -2,   2,   2,   2,   4,
724    -2,  -4,  10,   2,   2,  -2,  -9,  -2,   2,  -2,   5,   4,  -4,   4,  -2,   2,
725    -5,  -4,  -3,   4,   2,  -3,   3,  -2,  -5,   5,   3,   3,  -2,  -3, -10,  -4}
726},{
727    /* MapTab2 */
728    2,  /* eob_sym */
729    11, /* esc_sym */
730    /* run table */
731    {1,  1,  0,  2,  2,  1,  1,  3,  3,  4,  4,  0,  1,  1,  5,  5,
732     2,  2,  6,  6,  7,  7,  1,  8,  1,  8,  3,  3,  9,  9,  1,  2,
733     2,  1,  4, 10,  4, 10, 11, 11,  1,  5, 12, 12,  1,  5, 13, 13,
734     3,  3,  6,  6,  2,  2, 14, 14, 16, 16, 15,  7, 15,  8,  8,  7,
735     1,  1, 17, 17,  4,  4,  1,  1, 18, 18,  2,  2,  5,  5, 25,  3,
736     9,  3, 25,  9, 19, 24, 19, 24,  1, 21, 20,  1, 21, 22, 20, 22,
737    23, 23,  8,  6, 33,  6,  8, 33,  7,  7, 26, 26,  1, 32,  1, 32,
738    28,  4, 28, 10, 29, 27, 27, 10, 41,  4, 29,  2,  2, 41, 36, 31,
739    49, 31, 34, 30, 34, 36, 30, 35,  1, 49, 11,  5, 35, 11,  1,  3,
740     3,  5, 37, 37,  8, 40,  8, 40, 12, 12, 42, 42,  1, 38, 16, 57,
741     1,  6, 16, 39, 38,  6,  7,  7, 13, 13, 39, 43,  2, 43, 57,  2,
742    50,  9, 44,  9, 50,  4, 15, 48, 44,  4,  1, 15, 48, 14, 14,  1,
743    45, 45,  8,  3,  5,  8, 51, 47,  3, 46, 46, 47,  5, 51,  1, 17,
744    17, 58,  1, 58,  2, 52, 52,  2, 53,  7, 59,  6,  6, 56, 53, 55,
745     7, 55,  1, 54, 59, 56, 54, 10,  1, 10,  4, 60,  1, 60,  8,  4,
746     8, 64, 64, 61,  1, 63,  3, 63, 62, 61,  5, 11,  5,  3, 11, 62},
747
748    /* value table */
749    { 1,  -1,   0,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   0,   3,  -3,   1,  -1,
750      2,  -2,   1,  -1,   1,  -1,   4,   1,  -4,  -1,   2,  -2,   1,  -1,   5,   3,
751     -3,  -5,   2,   1,  -2,  -1,   1,  -1,   6,   2,   1,  -1,  -6,  -2,   1,  -1,
752      3,  -3,   2,  -2,   4,  -4,   1,  -1,   1,  -1,   1,   2,  -1,   2,  -2,  -2,
753      7,  -7,   1,  -1,   3,  -3,   8,  -8,   1,  -1,   5,  -5,   3,  -3,   1,   4,
754      2,  -4,  -1,  -2,   1,   1,  -1,  -1,   9,   1,   1,  -9,  -1,   1,  -1,  -1,
755      1,  -1,   3,  -3,   1,   3,  -3,  -1,   3,  -3,   1,  -1,  10,   1, -10,  -1,
756      1,   4,  -1,   2,   1,  -1,   1,  -2,   1,  -4,  -1,   6,  -6,  -1,   1,   1,
757      1,  -1,   1,   1,  -1,  -1,  -1,   1,  11,  -1,  -2,   4,  -1,   2, -11,   5,
758     -5,  -4,  -1,   1,   4,   1,  -4,  -1,  -2,   2,   1,  -1,  12,   1,  -2,   1,
759    -12,   4,   2,   1,  -1,  -4,   4,  -4,   2,  -2,  -1,   1,   7,  -1,  -1,  -7,
760     -1,  -3,   1,   3,   1,   5,   2,   1,  -1,  -5,  13,  -2,  -1,   2,  -2, -13,
761      1,  -1,   5,   6,   5,  -5,   1,   1,  -6,   1,  -1,  -1,  -5,  -1,  14,   2,
762     -2,   1, -14,  -1,   8,   1,  -1,  -8,   1,   5,   1,   5,  -5,   1,  -1,   1,
763     -5,  -1,  15,   1,  -1,  -1,  -1,   3, -15,  -3,   6,   1,  16,  -1,   6,  -6,
764     -6,   1,  -1,   1, -16,   1,   7,  -1,   1,  -1,  -6,  -3,   6,  -7,   3,  -1}
765},{
766    /* MapTab3 */
767    0,  /* eob_sym */
768    35, /* esc_sym */
769    /* run table */
770    {0,  1,  1,  2,  2,  3,  3,  4,  4,  1,  1,  5,  5,  6,  6,  7,
771     7,  8,  8,  9,  9,  2,  2, 10, 10,  1,  1, 11, 11, 12, 12,  3,
772     3, 13, 13,  0, 14, 14, 16, 15, 16, 15,  4,  4, 17,  1, 17,  1,
773     5,  5, 18, 18,  2,  2,  6,  6,  8, 19,  7,  8,  7, 19, 20, 20,
774    21, 21, 22, 24, 22, 24, 23, 23,  1,  1, 25, 25,  3,  3, 26, 26,
775     9,  9, 27, 27, 28, 28, 33, 29,  4, 33, 29,  1,  4,  1, 32, 32,
776     2,  2, 31, 10, 30, 10, 30, 31, 34, 34,  5,  5, 36, 36, 35, 41,
777    35, 11, 41, 11, 37,  1,  8,  8, 37,  6,  1,  6, 40,  7,  7, 40,
778    12, 38, 12, 39, 39, 38, 49, 13, 49, 13,  3, 42,  3, 42, 16, 16,
779    43, 43, 14, 14,  1,  1, 44, 15, 44, 15,  2,  2, 57, 48, 50, 48,
780    57, 50,  4, 45, 45,  4, 46, 47, 47, 46,  1, 51,  1, 17, 17, 51,
781     8,  9,  9,  5, 58,  8, 58,  5, 52, 52, 55, 56, 53, 56, 55, 59,
782    59, 53, 54,  1,  6, 54,  7,  7,  6,  1,  2,  3,  2,  3, 64, 60,
783    60, 10, 10, 64, 61, 62, 61, 63,  1, 63, 62,  1, 18, 24, 18,  4,
784    25,  4,  8, 21, 21,  1, 24, 22, 25, 22,  8, 11, 19, 11, 23,  1,
785    20, 23, 19, 20,  5, 12,  5,  1, 16,  2, 12, 13,  2, 13,  1, 16},
786
787    /* value table */
788    { 0,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   1,
789     -1,   1,  -1,   1,  -1,   2,  -2,   1,  -1,   3,  -3,   1,  -1,   1,  -1,   2,
790     -2,   1,  -1,   0,   1,  -1,   1,   1,  -1,  -1,   2,  -2,   1,   4,  -1,  -4,
791      2,  -2,   1,  -1,  -3,   3,   2,  -2,   2,   1,   2,  -2,  -2,  -1,   1,  -1,
792      1,  -1,   1,   1,  -1,  -1,   1,  -1,   5,  -5,   1,  -1,   3,  -3,   1,  -1,
793      2,  -2,   1,  -1,   1,  -1,   1,   1,   3,  -1,  -1,   6,  -3,  -6,  -1,   1,
794      4,  -4,   1,   2,   1,  -2,  -1,  -1,   1,  -1,   3,  -3,   1,  -1,   1,   1,
795     -1,   2,  -1,  -2,   1,   7,  -3,   3,  -1,   3,  -7,  -3,   1,  -3,   3,  -1,
796      2,   1,  -2,   1,  -1,  -1,   1,   2,  -1,  -2,  -4,  -1,   4,   1,   2,  -2,
797      1,  -1,  -2,   2,   8,  -8,  -1,   2,   1,  -2,  -5,   5,   1,  -1,  -1,   1,
798     -1,   1,   4,  -1,   1,  -4,  -1,  -1,   1,   1,   9,   1,  -9,   2,  -2,  -1,
799     -4,   3,  -3,  -4,  -1,   4,   1,   4,   1,  -1,   1,  -1,   1,   1,  -1,   1,
800     -1,  -1,  -1,  10,   4,   1,   4,  -4,  -4, -10,   6,   5,  -6,  -5,   1,  -1,
801      1,   3,  -3,  -1,   1,  -1,  -1,  -1,  11,   1,   1, -11,  -2,  -2,   2,   5,
802     -2,  -5,  -5,   2,  -2,  12,   2,  -2,   2,   2,   5,  -3,  -2,   3,  -2, -12,
803     -2,   2,   2,   2,  -5,   3,   5,  13,  -3,   7,  -3,  -3,  -7,   3, -13,   3}
804},{
805    /* MapTab4 */
806    0,  /* eob_sym */
807    34, /* esc_sym */
808    /* run table */
809    {0,  1,  1,  1,  2,  2,  1,  3,  3,  1,  1,  1,  4,  4,  1,  5,
810     2,  1,  5,  2,  1,  1,  6,  6,  1,  1,  1,  1,  1,  7,  3,  1,
811     2,  3,  0,  1,  2,  7,  1,  1,  1,  8,  1,  1,  8,  1,  1,  1,
812     9,  1,  9,  1,  2,  1,  1,  2,  1,  1, 10,  4,  1, 10,  1,  4,
813     1,  1,  1,  1,  1,  3,  1,  1,  1,  3,  2,  1,  5,  1,  1,  1,
814     2,  5,  1, 11,  1, 11,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
815     2,  1,  6,  1,  6,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1, 12,
816     3,  1, 12,  1,  1,  1,  2,  1,  1,  3,  1,  1,  1,  1,  1,  1,
817     4,  1,  1,  1,  2,  1,  1,  4,  1,  1,  1,  1,  1,  1,  2,  1,
818     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  3,  1,  2,  1,  1,  5,
819     1,  1,  1,  1,  1,  7,  1,  7,  1,  1,  2,  3,  1,  1,  1,  1,
820     5,  1,  1,  1,  1,  1,  1,  2, 13,  1,  1,  1,  1,  1,  1,  1,
821     1,  1,  1,  1,  1,  1,  1,  1, 13,  2,  1,  1,  4,  1,  1,  1,
822     3,  1,  6,  1,  1,  1, 14,  1,  1,  1,  1,  1, 14,  6,  1,  1,
823     1,  1, 15,  2,  4,  1,  2,  3, 15,  1,  1,  1,  8,  1,  1,  8,
824     1,  1,  1,  1,  1,  1,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1},
825
826    /* value table */
827    { 0,   1,  -1,   2,   1,  -1,  -2,   1,  -1,   3,  -3,   4,   1,  -1,  -4,   1,
828      2,   5,  -1,  -2,  -5,   6,   1,  -1,  -6,   7,  -7,   8,  -8,   1,   2,   9,
829      3,  -2,   0,  -9,  -3,  -1,  10, -10,  11,   1, -11,  12,  -1, -12,  13, -13,
830      1,  14,  -1, -14,   4,  15, -15,  -4,  16, -16,   1,   2,  17,  -1, -17,  -2,
831     18, -18,  19, -19,  20,   3, -20,  21, -21,  -3,   5,  22,   2, -22, -23,  23,
832     -5,  -2,  24,   1, -24,  -1,  25, -25,  26, -26, -27,  27,  28,  29, -28, -29,
833      6,  30,   2, -31,  -2, -30,  31,  -6, -32,  32,  33, -33,  34, -35, -34,   1,
834      4, -36,  -1,  35,  37,  36,   7, -37,  38,  -4, -38,  39,  41,  40, -40, -39,
835      3,  42, -43, -41,  -7, -42,  43,  -3,  44, -44,  45, -45,  46,  47,   8, -47,
836    -48, -46,  50, -50,  48,  49,  51, -49,  52, -52,   5, -51,  -8, -53,  53,   3,
837    -56,  56,  55,  54, -54,   2,  60,  -2, -55,  58,   9,  -5,  59,  57, -57, -63,
838     -3, -58, -60, -61,  61, -59, -62,  -9,   1,  64,  62,  69, -64,  63,  65, -67,
839    -68,  66, -65,  68, -66, -69,  67, -70,  -1,  10,  71, -71,   4,  73,  72,  70,
840      6, -76,  -3,  74, -78, -74,   1,  78,  80, -72, -75,  76,  -1,   3, -73,  79,
841     75,  77,   1,  11,  -4, -79, -10,  -6,  -1, -77, -83, -80,   2,  81, -84,  -2,
842     83, -81,  82, -82,  84, -87, -86,  85, -11, -85,  86, -89,  87, -88,  88,  89}
843},{
844    /* MapTab5 */
845    2,  /* eob_sym */
846    33, /* esc_sym */
847    /* run table */
848    {1,  1,  0,  2,  1,  2,  1,  3,  3,  1,  1,  4,  4,  2,  2,  1,
849     1,  5,  5,  6,  1,  6,  1,  7,  7,  3,  3,  2,  8,  2,  8,  1,
850     1,  0,  9,  9,  1,  1, 10,  4, 10,  4, 11, 11,  2,  1,  2,  1,
851    12, 12,  3,  3,  1,  1, 13,  5,  5, 13, 14,  1,  1, 14,  2,  2,
852     6,  6, 15,  1,  1, 15, 16,  4,  7, 16,  4,  7,  1,  1,  3,  3,
853     8,  8,  2,  2,  1,  1, 17, 17,  1,  1, 18, 18,  5,  5,  2,  2,
854     1,  1,  9, 19,  9, 19, 20,  3,  3, 20,  1, 10, 21,  1, 10,  4,
855     4, 21, 22,  6,  6, 22,  1,  1, 23, 24,  2,  2, 23, 24, 11,  1,
856     1, 11,  7, 25,  7,  1,  1, 25,  8,  8,  3, 26,  3,  1, 12,  2,
857     2, 26,  1, 12,  5,  5, 27,  4,  1,  4,  1, 27, 28,  1, 28, 13,
858     1, 13,  2, 29,  2,  1, 32,  6,  1, 30, 14, 29, 14,  6,  3, 31,
859     3,  1, 30,  1, 32, 31, 33,  9, 33,  1,  1,  7,  9,  7,  2,  2,
860     1,  1,  4, 36, 34,  4,  5, 10, 10,  5, 34,  1,  1, 35,  8,  8,
861    36,  3, 35,  1, 15,  3,  2,  1, 16, 15, 16,  2, 37,  1, 37,  1,
862     1,  1,  6,  6, 38,  1, 38, 11,  1, 39, 39, 40, 11,  2, 41,  4,
863    40,  1,  2,  4,  1,  1,  1, 41,  3,  1,  3,  1,  5,  7,  5,  7},
864
865    /* value table */
866    { 1,  -1,   0,   1,   2,  -1,  -2,   1,  -1,   3,  -3,   1,  -1,   2,  -2,   4,
867     -4,   1,  -1,   1,   5,  -1,  -5,   1,  -1,   2,  -2,   3,   1,  -3,  -1,   6,
868     -6,   0,   1,  -1,   7,  -7,   1,   2,  -1,  -2,   1,  -1,   4,   8,  -4,  -8,
869      1,  -1,   3,  -3,   9,  -9,   1,   2,  -2,  -1,   1,  10, -10,  -1,   5,  -5,
870      2,  -2,   1,  11, -11,  -1,   1,   3,   2,  -1,  -3,  -2,  12, -12,   4,  -4,
871      2,  -2,  -6,   6,  13, -13,   1,  -1,  14, -14,   1,  -1,   3,  -3,   7,  -7,
872     15, -15,   2,   1,  -2,  -1,   1,   5,  -5,  -1, -16,   2,   1,  16,  -2,   4,
873     -4,  -1,   1,   3,  -3,  -1,  17, -17,   1,   1,  -8,   8,  -1,  -1,   2,  18,
874    -18,  -2,   3,   1,  -3,  19, -19,  -1,   3,  -3,   6,   1,  -6,  20,   2,   9,
875     -9,  -1, -20,  -2,   4,  -4,   1,  -5,  21,   5, -21,  -1,   1, -22,  -1,   2,
876     22,  -2,  10,   1, -10,  23,   1,   4, -23,   1,   2,  -1,  -2,  -4,  -7,   1,
877      7, -24,  -1,  24,  -1,  -1,   1,   3,  -1, -25,  25,   4,  -3,  -4,  11, -11,
878     26, -26,   6,   1,   1,  -6,  -5,  -3,   3,   5,  -1, -27,  27,   1,   4,  -4,
879     -1,  -8,  -1,  28,   2,   8, -12, -28,  -2,  -2,   2,  12,  -1,  29,   1, -29,
880     30, -30,   5,  -5,   1, -31,  -1,   3,  31,  -1,   1,   1,  -3, -13,   1,  -7,
881     -1, -32,  13,   7,  32,  33, -33,  -1,  -9, -34,   9,  34,  -6,   5,   6,  -5}
882},{
883    /* MapTab6 */
884    2,  /* eob_sym */
885    13, /* esc_sym */
886    /* run table */
887    {1,  1,  0,  1,  1,  2,  2,  1,  1,  3,  3,  1,  1,  0,  2,  2,
888     4,  1,  4,  1,  1,  1,  5,  5,  1,  1,  6,  6,  2,  2,  1,  1,
889     3,  3,  7,  7,  1,  1,  8,  8,  1,  1,  2,  2,  1,  9,  1,  9,
890     4,  4, 10,  1,  1, 10,  1,  1, 11, 11,  3,  3,  1,  2,  1,  2,
891     1,  1, 12, 12,  5,  5,  1,  1, 13,  1,  1, 13,  2,  2,  1,  1,
892     6,  6,  1,  1,  4, 14,  4, 14,  3,  1,  3,  1,  1,  1, 15,  7,
893    15,  2,  2,  7,  1,  1,  1,  8,  1,  8, 16, 16,  1,  1,  1,  1,
894     2,  1,  1,  2,  1,  1,  3,  5,  5,  3,  4,  1,  1,  4,  1,  1,
895    17, 17,  9,  1,  1,  9,  2,  2,  1,  1, 10, 10,  1,  6,  1,  1,
896     6, 18,  1,  1, 18,  1,  1,  1,  2,  2,  3,  1,  3,  1,  1,  1,
897     4,  1, 19,  1, 19,  7,  1,  1, 20,  1,  4, 20,  1,  7, 11,  2,
898     1, 11, 21,  2,  8,  5,  1,  8,  1,  5, 21,  1,  1,  1, 22,  1,
899     1, 22,  1,  1,  3,  3,  1, 23,  2, 12, 24,  1,  1,  2,  1,  1,
900    12, 23,  1,  1, 24,  1,  1,  1,  4,  1,  1,  1,  2,  1,  6,  6,
901     4,  2,  1,  1,  1,  1,  1,  1,  1, 14, 13,  3,  1, 25,  9, 25,
902    14,  1,  9,  3, 13,  1,  1,  1,  1,  1, 10,  1,  1,  2, 10,  2},
903
904    /* value table */
905    {-20,  -1,   0,   2,  -2,   1,  -1,   3,  -3,   1,  -1,   4,  -4,   0,   2,  -2,
906       1,   5,  -1,  -5,   6,  -6,   1,  -1,   7,  -7,   1,  -1,   3,  -3,   8,  -8,
907       2,  -2,   1,  -1,   9,  -9,   1,  -1,  10, -10,   4,  -4,  11,   1, -11,  -1,
908       2,  -2,   1,  12, -12,  -1,  13, -13,   1,  -1,   3,  -3,  14,   5, -14,  -5,
909     -15,  15,  -1,   1,   2,  -2,  16, -16,   1,  17, -17,  -1,   6,  -6,  18, -18,
910       2,  -2, -19,  19,  -3,   1,   3,  -1,   4,  20,  -4,   1, -21,  21,   1,   2,
911      -1,  -7,   7,  -2,  22, -22,  23,   2, -23,  -2,   1,  -1, -24,  24, -25,  25,
912      -8, -26,  26,   8, -27,  27,   5,   3,  -3,  -5,  -4,  28, -28,   4,  29, -29,
913       1,  -1,  -2, -30,  30,   2,   9,  -9, -31,  31,   2,  -2, -32,   3,  32, -33,
914      -3,   1,  33, -34,  -1,  34, -35,  35, -10,  10,  -6,  36,   6, -36,  37, -37,
915      -5,  38,   1, -38,  -1,   3,  39, -39,  -1,  40,   5,   1, -40,  -3,   2, -11,
916     -41,  -2,   1,  11,  -3,  -4,  41,   3,  42,   4,  -1, -43, -42,  43,   1, -44,
917      45,  -1,  44, -45,  -7,   7, -46,   1, -12,   2,   1, -47,  46,  12,  47,  48,
918      -2,  -1, -48,  49,  -1, -50, -49,  50,  -6, -51,  51,  52, -13,  53,  -4,   4,
919       6,  13, -53, -52, -54,  55,  54, -55, -56,  -2,   2,  -8,  56,   1,  -3,  -1,
920       2,  58,   3,   8,  -2,  57, -58, -60, -59, -57,  -3,  60,  59, -14,   3,  14}
921},{
922    /* MapTab7 */
923    2,  /* eob_sym */
924    38, /* esc_sym */
925    /* run table */
926    {1,  1,  0,  2,  2,  1,  1,  3,  3,  4,  4,  5,  5,  1,  1,  6,
927     6,  2,  2,  7,  7,  8,  8,  1,  1,  3,  3,  9,  9, 10, 10,  1,
928     1,  2,  2,  4,  4, 11,  0, 11, 12, 12, 13, 13,  1,  1,  5,  5,
929    14, 14, 15, 16, 15, 16,  3,  3,  1,  6,  1,  6,  2,  2,  7,  7,
930     8,  8, 17, 17,  1,  1,  4,  4, 18, 18,  2,  2,  1, 19,  1, 20,
931    19, 20, 21, 21,  3,  3, 22, 22,  5,  5, 24,  1,  1, 23,  9, 23,
932    24,  9,  2,  2, 10,  1,  1, 10,  6,  6, 25,  4,  4, 25,  7,  7,
933    26,  8,  1,  8,  3,  1, 26,  3, 11, 11, 27, 27,  2, 28,  1,  2,
934    28,  1, 12, 12,  5,  5, 29, 13, 13, 29, 32,  1,  1, 33, 31, 30,
935    32,  4, 30, 33,  4, 31,  3, 14,  1,  1,  3, 34, 34,  2,  2, 14,
936     6,  6, 35, 36, 35, 36,  1, 15,  1, 16, 16, 15,  7,  9,  7,  9,
937    37,  8,  8, 37,  1,  1, 39,  2, 38, 39,  2, 40,  5, 38, 40,  5,
938     3,  3,  4,  4, 10, 10,  1,  1,  1,  1, 41,  2, 41,  2,  6,  6,
939     1,  1, 11, 42, 11, 43,  3, 42,  3, 17,  4, 43,  1, 17,  7,  1,
940     8, 44,  4,  7, 44,  5,  8,  2,  5,  1,  2, 48, 45,  1, 12, 45,
941    12, 48, 13, 13,  1,  9,  9, 46,  1, 46, 47, 47, 49, 18, 18, 49},
942
943    /* value table */
944    { 1,  -1,   0,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   1,  -1,   3,  -3,   1,
945     -1,  -2,   2,   1,  -1,   1,  -1,   4,  -4,  -2,   2,   1,  -1,   1,  -1,   5,
946     -5,  -3,   3,   2,  -2,   1,   0,  -1,   1,  -1,   1,  -1,   6,  -6,   2,  -2,
947      1,  -1,   1,   1,  -1,  -1,  -3,   3,   7,   2,  -7,  -2,  -4,   4,   2,  -2,
948      2,  -2,   1,  -1,   8,  -8,   3,  -3,   1,  -1,  -5,   5,   9,   1,  -9,   1,
949     -1,  -1,   1,  -1,  -4,   4,   1,  -1,   3,  -3,   1, -10,  10,   1,   2,  -1,
950     -1,  -2,   6,  -6,   2,  11, -11,  -2,   3,  -3,   1,  -4,   4,  -1,   3,  -3,
951      1,   3,  12,  -3,  -5, -12,  -1,   5,   2,  -2,   1,  -1,  -7,   1,  13,   7,
952     -1, -13,   2,  -2,   4,  -4,   1,   2,  -2,  -1,   1,  14, -14,   1,   1,   1,
953     -1,  -5,  -1,  -1,   5,  -1,  -6,   2, -15,  15,   6,   1,  -1,  -8,   8,  -2,
954     -4,   4,   1,   1,  -1,  -1,  16,   2, -16,  -2,   2,  -2,   4,   3,  -4,  -3,
955     -1,  -4,   4,   1, -17,  17,  -1,  -9,   1,   1,   9,   1,  -5,  -1,  -1,   5,
956     -7,   7,   6,  -6,   3,  -3,  18, -18,  19, -19,   1, -10,  -1,  10,  -5,   5,
957     20, -20,  -3,   1,   3,   1,   8,  -1,  -8,   2,   7,  -1, -21,  -2,   5,  21,
958      5,  -1,  -7,  -5,   1,  -6,  -5, -11,   6,  22,  11,   1,   1, -22,  -3,  -1,
959      3,  -1,   3,  -3, -23,   4,  -4,   1,  23,  -1,   1,  -1,   1,  -2,   2,  -1}
960},{
961    /* MapTab8 */
962    4,  /* eob_sym */
963    11, /* esc_sym */
964    /* run table */
965    {1,  1,  1,  1,  0,  2,  2,  1,  1,  3,  3,  0,  1,  1,  2,  2,
966     4,  4,  1,  1,  5,  5,  1,  1,  2,  2,  3,  3,  6,  6,  1,  1,
967     7,  7,  8,  1,  8,  2,  2,  1,  4,  4,  1,  3,  1,  3,  9,  9,
968     2,  2,  1,  5,  1,  5, 10, 10,  1,  1, 11, 11,  3,  6,  3,  4,
969     4,  6,  2,  2,  1, 12,  1, 12,  7, 13,  7, 13,  1,  1,  8,  8,
970     2,  2, 14, 14, 16, 15, 16,  5,  5,  1,  3, 15,  1,  3,  4,  4,
971     1,  1, 17, 17,  2,  2,  6,  6,  1, 18,  1, 18, 22, 21, 22, 21,
972    25, 24, 25, 19,  9, 20,  9, 23, 19, 24, 20,  3, 23,  7,  3,  1,
973     1,  7, 28, 26, 29,  5, 28, 26,  5,  8, 29,  4,  8, 27,  2,  2,
974     4, 27,  1,  1, 10, 36, 10, 33, 33, 36, 30,  1, 32, 32,  1, 30,
975     6, 31, 31, 35,  3,  6, 11, 11,  3,  2, 35,  2, 34,  1, 34,  1,
976    37, 37, 12,  7, 12,  5, 41,  5,  4,  7,  1,  8, 13,  4,  1, 41,
977    13, 38,  8, 38,  9,  1, 40, 40,  9,  1, 39,  2,  2, 49, 39, 42,
978     3,  3, 14, 16, 49, 14, 16, 42, 43, 43,  6,  6, 15,  1,  1, 15,
979    44, 44,  1,  1, 50, 48,  4,  5,  4,  7,  5,  2, 10, 10, 48,  7,
980    50, 45,  2,  1, 45,  8,  8,  1, 46, 46,  3, 47, 47,  3,  1,  1},
981
982    /* value table */
983    { 1,  -1,   2,  -2,   0,   1,  -1,   3,  -3,   1,  -1,   0,   4,  -4,   2,  -2,
984      1,  -1,   5,  -5,   1,  -1,   6,  -6,   3,  -3,   2,  -2,   1,  -1,   7,  -7,
985      1,  -1,   1,   8,  -1,   4,  -4,  -8,   2,  -2,   9,   3,  -9,  -3,   1,  -1,
986      5,  -5,  10,   2, -10,  -2,   1,  -1,  11, -11,   1,  -1,  -4,   2,   4,   3,
987     -3,  -2,   6,  -6,  12,   1, -12,  -1,   2,   1,  -2,  -1,  13, -13,   2,  -2,
988      7,  -7,   1,  -1,   1,   1,  -1,   3,  -3,  14,   5,  -1, -14,  -5,   4,  -4,
989     15, -15,   1,  -1,   8,  -8,  -3,   3,  16,   1, -16,  -1,   1,   1,  -1,  -1,
990      1,   1,  -1,   1,   2,   1,  -2,   1,  -1,  -1,  -1,   6,  -1,   3,  -6,  17,
991    -17,  -3,   1,   1,   1,   4,  -1,  -1,  -4,   3,  -1,   5,  -3,  -1,  -9,   9,
992     -5,   1,  18, -18,   2,   1,  -2,   1,  -1,  -1,   1,  19,  -1,   1, -19,  -1,
993      4,   1,  -1,   1,   7,  -4,  -2,   2,  -7,  10,  -1, -10,   1,  20,  -1, -20,
994      1,  -1,   2,   4,  -2,   5,   1,  -5,   6,  -4,  21,   4,   2,  -6, -21,  -1,
995     -2,   1,  -4,  -1,  -3,  22,  -1,   1,   3, -22,  -1,  11, -11,   1,   1,   1,
996      8,  -8,   2,   2,  -1,  -2,  -2,  -1,   1,  -1,  -5,   5,   2,  23, -23,  -2,
997      1,  -1,  24, -24,  -1,  -1,   7,   6,  -7,   5,  -6,  12,  -3,   3,   1,  -5,
998      1,   1, -12,  25,  -1,  -5,   5, -25,  -1,   1,   9,   1,  -1,  -9,  26, -26}
999}
1000};
1001