Statistics
| Branch: | Revision:

ffmpeg / libavcodec / ivi_common.c @ 1cf31685

History | View | Annotate | Download (42.7 KB)

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 libavcodec/ivi_common.c
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

    
36
/**
37
 *  Reverses "nbits" bits of the value "val" and returns the result
38
 *  in the least significant bits.
39
 */
40
static uint16_t inv_bits(uint16_t val, int nbits)
41
{
42
    uint16_t res;
43

    
44
    if (nbits <= 8) {
45
        res = av_reverse[val] >> (8-nbits);
46
    } else
47
        res = ((av_reverse[val & 0xFF] << 8) + (av_reverse[val >> 8])) >> (16-nbits);
48

    
49
    return res;
50
}
51

    
52
int ff_ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag)
53
{
54
    int         pos, i, j, codes_per_row, prefix, not_last_row;
55
    uint16_t    codewords[256]; /* FIXME: move this temporal storage out? */
56
    uint8_t     bits[256];
57

    
58
    pos = 0; /* current position = 0 */
59

    
60
    for (i = 0; i < cb->num_rows; i++) {
61
        codes_per_row = 1 << cb->xbits[i];
62
        not_last_row  = (i != cb->num_rows - 1);
63
        prefix        = ((1 << i) - 1) << (cb->xbits[i] + not_last_row);
64

    
65
        for (j = 0; j < codes_per_row; j++) {
66
            if (pos >= 256) /* Some Indeo5 codebooks can have more than 256 */
67
                break;      /* elements, but only 256 codes are allowed! */
68

    
69
            bits[pos] = i + cb->xbits[i] + not_last_row;
70
            if (bits[pos] > IVI_VLC_BITS)
71
                return -1; /* invalid descriptor */
72

    
73
            codewords[pos] = inv_bits((prefix | j), bits[pos]);
74
            if (!bits[pos])
75
                bits[pos] = 1;
76

    
77
            pos++;
78
        }//for j
79
    }//for i
80

    
81
    /* number of codewords = pos */
82
    return init_vlc(vlc, IVI_VLC_BITS, pos, bits, 1, 1, codewords, 2, 2,
83
                    (flag & 1) | INIT_VLC_LE);
84
}
85

    
86
int ff_ivi_dec_huff_desc(GetBitContext *gb, IVIHuffDesc *desc)
87
{
88
    int tab_sel, i;
89

    
90
    tab_sel = get_bits(gb, 3);
91
    if (tab_sel == 7) {
92
        /* custom huffman table (explicitly encoded) */
93
        desc->num_rows = get_bits(gb, 4);
94

    
95
        for (i = 0; i < desc->num_rows; i++)
96
            desc->xbits[i] = get_bits(gb, 4);
97
    }
98

    
99
    return tab_sel;
100
}
101

    
102
int ff_ivi_huff_desc_cmp(const IVIHuffDesc *desc1, const IVIHuffDesc *desc2)
103
{
104
    return    desc1->num_rows != desc2->num_rows
105
           || memcmp(desc1->xbits, desc2->xbits, desc1->num_rows);
106
}
107

    
108
void ff_ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src)
109
{
110
    dst->num_rows = src->num_rows;
111
    memcpy(dst->xbits, src->xbits, src->num_rows);
112
}
113

    
114
int av_cold ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg)
115
{
116
    int         p, b;
117
    uint32_t    b_width, b_height, align_fac, width_aligned, height_aligned, buf_size;
118
    IVIBandDesc *band;
119

    
120
    ff_ivi_free_buffers(planes);
121

    
122
    /* fill in the descriptor of the luminance plane */
123
    planes[0].width     = cfg->pic_width;
124
    planes[0].height    = cfg->pic_height;
125
    planes[0].num_bands = cfg->luma_bands;
126

    
127
    /* fill in the descriptors of the chrominance planes */
128
    planes[1].width     = planes[2].width     = (cfg->pic_width  + 3) >> 2;
129
    planes[1].height    = planes[2].height    = (cfg->pic_height + 3) >> 2;
130
    planes[1].num_bands = planes[2].num_bands = cfg->chroma_bands;
131

    
132
    for (p = 0; p < 3; p++) {
133
        planes[p].bands = av_mallocz(planes[p].num_bands * sizeof(IVIBandDesc));
134
        if (!planes[p].bands)
135
            return AVERROR(ENOMEM);
136

    
137
        /* select band dimensions: if there is only one band then it
138
         *  has the full size, if there are several bands each of them
139
         *  has only half size */
140
        b_width  = planes[p].num_bands == 1 ? planes[p].width  : (planes[p].width  + 1) >> 1;
141
        b_height = planes[p].num_bands == 1 ? planes[p].height : (planes[p].height + 1) >> 1;
142

    
143
        /* luma   band buffers will be aligned on 16x16 (max macroblock size) */
144
        /* chroma band buffers will be aligned on   8x8 (max macroblock size) */
145
        align_fac       = p ? 8 : 16;
146
        width_aligned   = FFALIGN(b_width , align_fac);
147
        height_aligned  = FFALIGN(b_height, align_fac);
148
        buf_size        = width_aligned * height_aligned * sizeof(int16_t);
149

    
150
        for (b = 0; b < planes[p].num_bands; b++) {
151
            band = &planes[p].bands[b]; /* select appropriate plane/band */
152
            band->plane    = p;
153
            band->band_num = b;
154
            band->width    = b_width;
155
            band->height   = b_height;
156
            band->pitch    = width_aligned;
157
            band->bufs[0]  = av_malloc(buf_size);
158
            band->bufs[1]  = av_malloc(buf_size);
159
            if (!band->bufs[0] || !band->bufs[1])
160
                return AVERROR(ENOMEM);
161

    
162
            /* allocate the 3rd band buffer for scalability mode */
163
            if (cfg->luma_bands > 1) {
164
                band->bufs[2] = av_malloc(buf_size);
165
                if (!band->bufs[2])
166
                    return AVERROR(ENOMEM);
167
            }
168

    
169
            planes[p].bands[0].huff_desc.num_rows = 0; /* reset custom vlc */
170
        }
171
    }
172

    
173
    return 0;
174
}
175

    
176
void av_cold ff_ivi_free_buffers(IVIPlaneDesc *planes)
177
{
178
    int p, b, t;
179

    
180
    for (p = 0; p < 3; p++) {
181
        for (b = 0; b < planes[p].num_bands; b++) {
182
            av_freep(&planes[p].bands[b].bufs[0]);
183
            av_freep(&planes[p].bands[b].bufs[1]);
184
            av_freep(&planes[p].bands[b].bufs[2]);
185

    
186
            for (t = 0; t < planes[p].bands[b].num_tiles; t++)
187
                av_freep(&planes[p].bands[b].tiles[t].mbs);
188
            av_freep(&planes[p].bands[b].tiles);
189
        }
190
        av_freep(&planes[p].bands);
191
    }
192
}
193

    
194
int av_cold ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height)
195
{
196
    int         p, b, x, y, x_tiles, y_tiles, t_width, t_height;
197
    IVIBandDesc *band;
198
    IVITile     *tile, *ref_tile;
199

    
200
    for (p = 0; p < 3; p++) {
201
        t_width  = !p ? tile_width  : (tile_width  + 3) >> 2;
202
        t_height = !p ? tile_height : (tile_height + 3) >> 2;
203

    
204
        for (b = 0; b < planes[p].num_bands; b++) {
205
            band = &planes[p].bands[b];
206
            x_tiles = IVI_NUM_TILES(band->width, t_width);
207
            y_tiles = IVI_NUM_TILES(band->height, t_height);
208
            band->num_tiles = x_tiles * y_tiles;
209

    
210
            av_freep(&band->tiles);
211
            band->tiles = av_mallocz(band->num_tiles * sizeof(IVITile));
212
            if (!band->tiles)
213
                return AVERROR(ENOMEM);
214

    
215
            tile = band->tiles;
216

    
217
            /* use the first luma band as reference for motion vectors
218
             * and quant */
219
            ref_tile = planes[0].bands[0].tiles;
220

    
221
            for (y = 0; y < band->height; y += t_height) {
222
                for (x = 0; x < band->width; x += t_width) {
223
                    tile->xpos     = x;
224
                    tile->ypos     = y;
225
                    tile->width    = FFMIN(band->width - x,  t_width);
226
                    tile->height   = FFMIN(band->height - y, t_height);
227
                    tile->is_empty = tile->data_size = 0;
228
                    /* calculate number of macroblocks */
229
                    tile->num_MBs  = IVI_MBs_PER_TILE(tile->width, tile->height,
230
                                                      band->mb_size);
231

    
232
                    av_freep(&tile->mbs);
233
                    tile->mbs = av_malloc(tile->num_MBs * sizeof(IVIMbInfo));
234
                    if (!tile->mbs)
235
                        return AVERROR(ENOMEM);
236

    
237
                    tile->ref_mbs = 0;
238
                    if (p || b) {
239
                        tile->ref_mbs = ref_tile->mbs;
240
                        ref_tile++;
241
                    }
242

    
243
                    tile++;
244
                }
245
            }
246

    
247
        }// for b
248
    }// for p
249

    
250
    return 0;
251
}
252

    
253
int ff_ivi_dec_tile_data_size(GetBitContext *gb)
254
{
255
    int    len;
256

    
257
    len = 0;
258
    if (get_bits1(gb)) {
259
        len = get_bits(gb, 8);
260
        if (len == 255)
261
            len = get_bits_long(gb, 24);
262
    }
263

    
264
    /* align the bitstream reader on the byte boundary */
265
    align_get_bits(gb);
266

    
267
    return len;
268
}
269

    
270
int ff_ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile)
271
{
272
    int         mbn, blk, num_blocks, num_coeffs, blk_size, scan_pos, run, val,
273
                pos, is_intra, mc_type, mv_x, mv_y, col_mask;
274
    uint8_t     col_flags[8];
275
    int32_t     prev_dc, trvec[64];
276
    uint32_t    cbp, sym, lo, hi, quant, buf_offs, q;
277
    IVIMbInfo   *mb;
278
    RVMapDesc   *rvmap = band->rv_map;
279
    void (*mc_with_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
280
    void (*mc_no_delta_func)  (int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
281
    const uint8_t   *base_tab, *scale_tab;
282

    
283
    prev_dc = 0; /* init intra prediction for the DC coefficient */
284

    
285
    blk_size   = band->blk_size;
286
    col_mask   = blk_size - 1; /* column mask for tracking non-zero coeffs */
287
    num_blocks = (band->mb_size != blk_size) ? 4 : 1; /* number of blocks per mb */
288
    num_coeffs = blk_size * blk_size;
289
    if (blk_size == 8) {
290
        mc_with_delta_func = ff_ivi_mc_8x8_delta;
291
        mc_no_delta_func   = ff_ivi_mc_8x8_no_delta;
292
    } else {
293
        mc_with_delta_func = ff_ivi_mc_4x4_delta;
294
        mc_no_delta_func   = ff_ivi_mc_4x4_no_delta;
295
    }
296

    
297
    for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
298
        is_intra = !mb->type;
299
        cbp      = mb->cbp;
300
        buf_offs = mb->buf_offs;
301

    
302
        quant = av_clip(band->glob_quant + mb->q_delta, 0, 23);
303

    
304
        base_tab  = is_intra ? band->intra_base  : band->inter_base;
305
        scale_tab = is_intra ? band->intra_scale : band->inter_scale;
306

    
307
        if (!is_intra) {
308
            mv_x = mb->mv_x;
309
            mv_y = mb->mv_y;
310
            if (!band->is_halfpel) {
311
                mc_type = 0; /* we have only fullpel vectors */
312
            } else {
313
                mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
314
                mv_x >>= 1;
315
                mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
316
            }
317
        }
318

    
319
        for (blk = 0; blk < num_blocks; blk++) {
320
            /* adjust block position in the buffer according to its number */
321
            if (blk & 1) {
322
                buf_offs += blk_size;
323
            } else if (blk == 2) {
324
                buf_offs -= blk_size;
325
                buf_offs += blk_size * band->pitch;
326
            }
327

    
328
            if (cbp & 1) { /* block coded ? */
329
                scan_pos = -1;
330
                memset(trvec, 0, num_coeffs*sizeof(trvec[0])); /* zero transform vector */
331
                memset(col_flags, 0, sizeof(col_flags));      /* zero column flags */
332

    
333
                while (scan_pos <= num_coeffs) {
334
                    sym = get_vlc2(gb, band->blk_vlc->table, IVI_VLC_BITS, 1);
335
                    if (sym == rvmap->eob_sym)
336
                        break; /* End of block */
337

    
338
                    if (sym == rvmap->esc_sym) { /* Escape - run/val explicitly coded using 3 vlc codes */
339
                        run = get_vlc2(gb, band->blk_vlc->table, IVI_VLC_BITS, 1) + 1;
340
                        lo  = get_vlc2(gb, band->blk_vlc->table, IVI_VLC_BITS, 1);
341
                        hi  = get_vlc2(gb, band->blk_vlc->table, IVI_VLC_BITS, 1);
342
                        val = IVI_TOSIGNED((hi << 6) | lo); /* merge them and convert into signed val */
343
                    } else {
344
                        run = rvmap->runtab[sym];
345
                        val = rvmap->valtab[sym];
346
                    }
347

    
348
                    /* de-zigzag and dequantize */
349
                    scan_pos += run;
350
                    if (scan_pos >= num_coeffs)
351
                        break;
352
                    pos = band->scan[scan_pos];
353

    
354
                    if (IVI_DEBUG && !val)
355
                        av_log(NULL, AV_LOG_ERROR, "Val = 0 encountered!\n");
356

    
357
                    q = (base_tab[pos] * scale_tab[quant]) >> 8;
358
                    if (q > 1)
359
                        val = val * q + FFSIGN(val) * ((q >> 1) - (q & 1));
360
                    trvec[pos] = val;
361
                    col_flags[pos & col_mask] |= val; /* track columns containing non-zero coeffs */
362
                }// while
363

    
364
                if (scan_pos >= num_coeffs && sym != rvmap->eob_sym)
365
                    return -1; /* corrupt block data */
366

    
367
                /* undoing DC coeff prediction for intra-blocks */
368
                if (is_intra && band->is_2d_trans) {
369
                    prev_dc      += trvec[0];
370
                    trvec[0]      = prev_dc;
371
                    col_flags[0] |= !!prev_dc;
372
                }
373

    
374
                /* apply inverse transform */
375
                band->inv_transform(trvec, band->buf + buf_offs,
376
                                    band->pitch, col_flags);
377

    
378
                /* apply motion compensation */
379
                if (!is_intra)
380
                    mc_with_delta_func(band->buf + buf_offs,
381
                                       band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
382
                                       band->pitch, mc_type);
383
            } else {
384
                /* block not coded */
385
                /* for intra blocks apply the dc slant transform */
386
                /* for inter - perform the motion compensation without delta */
387
                if (is_intra && band->dc_transform) {
388
                    band->dc_transform(&prev_dc, band->buf + buf_offs,
389
                                       band->pitch, blk_size);
390
                } else
391
                    mc_no_delta_func(band->buf + buf_offs,
392
                                     band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
393
                                     band->pitch, mc_type);
394
            }
395

    
396
            cbp >>= 1;
397
        }// for blk
398
    }// for mbn
399

    
400
    align_get_bits(gb);
401

    
402
    return 0;
403
}
404

    
405
void ff_ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
406
                               IVITile *tile, int32_t mv_scale)
407
{
408
    int             x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
409
    int             offs, mb_offset, row_offset;
410
    IVIMbInfo       *mb, *ref_mb;
411
    const int16_t   *src;
412
    int16_t         *dst;
413
    void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch,
414
                             int mc_type);
415

    
416
    offs       = tile->ypos * band->pitch + tile->xpos;
417
    mb         = tile->mbs;
418
    ref_mb     = tile->ref_mbs;
419
    row_offset = band->mb_size * band->pitch;
420
    need_mc    = 0; /* reset the mc tracking flag */
421

    
422
    for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
423
        mb_offset = offs;
424

    
425
        for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
426
            mb->xpos     = x;
427
            mb->ypos     = y;
428
            mb->buf_offs = mb_offset;
429

    
430
            mb->type = 1; /* set the macroblocks type = INTER */
431
            mb->cbp  = 0; /* all blocks are empty */
432

    
433
            if (!band->qdelta_present && !band->plane && !band->band_num) {
434
                mb->q_delta = band->glob_quant;
435
                mb->mv_x    = 0;
436
                mb->mv_y    = 0;
437
            }
438

    
439
            if (band->inherit_qdelta && ref_mb)
440
                mb->q_delta = ref_mb->q_delta;
441

    
442
            if (band->inherit_mv) {
443
                /* motion vector inheritance */
444
                if (mv_scale) {
445
                    mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
446
                    mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
447
                } else {
448
                    mb->mv_x = ref_mb->mv_x;
449
                    mb->mv_y = ref_mb->mv_y;
450
                }
451
                need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
452
            }
453

    
454
            mb++;
455
            if (ref_mb)
456
                ref_mb++;
457
            mb_offset += band->mb_size;
458
        } // for x
459
        offs += row_offset;
460
    } // for y
461

    
462
    if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */
463
        num_blocks = (band->mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */
464
        mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
465
                                                 : ff_ivi_mc_4x4_no_delta;
466

    
467
        for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
468
            mv_x = mb->mv_x;
469
            mv_y = mb->mv_y;
470
            if (!band->is_halfpel) {
471
                mc_type = 0; /* we have only fullpel vectors */
472
            } else {
473
                mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
474
                mv_x >>= 1;
475
                mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
476
            }
477

    
478
            for (blk = 0; blk < num_blocks; blk++) {
479
                /* adjust block position in the buffer according with its number */
480
                offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
481
                mc_no_delta_func(band->buf + offs,
482
                                 band->ref_buf + offs + mv_y * band->pitch + mv_x,
483
                                 band->pitch, mc_type);
484
            }
485
        }
486
    } else {
487
        /* copy data from the reference tile into the current one */
488
        src = band->ref_buf + tile->ypos * band->pitch + tile->xpos;
489
        dst = band->buf     + tile->ypos * band->pitch + tile->xpos;
490
        for (y = 0; y < tile->height; y++) {
491
            memcpy(dst, src, tile->width*sizeof(band->buf[0]));
492
            src += band->pitch;
493
            dst += band->pitch;
494
        }
495
    }
496
}
497

    
498

    
499
#if IVI_DEBUG
500
uint16_t ivi_calc_band_checksum (IVIBandDesc *band)
501
{
502
    int         x, y;
503
    int16_t     *src, checksum;
504

    
505
    src = band->buf;
506
    checksum = 0;
507

    
508
    for (y = 0; y < band->height; src += band->pitch, y++)
509
        for (x = 0; x < band->width; x++)
510
            checksum += src[x];
511

    
512
    return checksum;
513
}
514

    
515
int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch)
516
{
517
    int         x, y, result;
518
    uint8_t     t1, t2;
519
    int16_t    *src;
520

    
521
    src = band->buf;
522
    result = 0;
523

    
524
    for (y = 0; y < band->height; src += band->pitch, y++) {
525
        for (x = 0; x < band->width; x++) {
526
            t1 = av_clip(src[x] + 128, 0, 255);
527
            t2 = ref[x];
528
            if (t1 != t2) {
529
                av_log(NULL, AV_LOG_ERROR, "Data mismatch: row %d, column %d\n",
530
                       y / band->blk_size, x / band->blk_size);
531
                result = -1;
532
            }
533
        }
534
        ref += pitch;
535
    }
536

    
537
    return result;
538
}
539
#endif
540

    
541
void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch)
542
{
543
    int             x, y;
544
    const int16_t   *src  = plane->bands[0].buf;
545
    uint32_t        pitch = plane->bands[0].pitch;
546

    
547
    for (y = 0; y < plane->height; y++) {
548
        for (x = 0; x < plane->width; x++)
549
            dst[x] = av_clip_uint8(src[x] + 128);
550
        src += pitch;
551
        dst += dst_pitch;
552
    }
553
}
554

    
555

    
556
/**
557
 * These are 2x8 predefined Huffman codebooks for coding macroblock/block
558
 * signals. They are specified using "huffman descriptors" in order to
559
 * avoid huge static tables. The decoding tables will be generated at
560
 * startup from these descriptors.
561
 */
562
const IVIHuffDesc ff_ivi_mb_huff_desc[8] = {
563
    {8,  {0, 4, 5, 4, 4, 4, 6, 6}},
564
    {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
565
    {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
566
    {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
567
    {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
568
    {9,  {0, 4, 4, 4, 4, 3, 3, 3, 2}},
569
    {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
570
    {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
571
};
572

    
573
const IVIHuffDesc ff_ivi_blk_huff_desc[8] = {
574
    {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
575
    {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
576
    {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
577
    {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
578
    {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
579
    {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
580
    {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
581
    {9,  {3, 4, 4, 5, 5, 5, 6, 5, 5}}
582
};
583

    
584

    
585
/**
586
 *  Run-value (RLE) tables.
587
 */
588
const RVMapDesc ff_ivi_rvmap_tabs[9] = {
589
{   /* MapTab0 */
590
    5, /* eob_sym */
591
    2, /* esc_sym */
592
    /* run table */
593
    {1,  1,  0,  1,  1,  0,  1,  1,  2,  2,  1,  1,  1,  1,  3,  3,
594
     1,  1,  2,  2,  1,  1,  4,  4,  1,  1,  1,  1,  2,  2,  5,  5,
595
     1,  1,  3,  3,  1,  1,  6,  6,  1,  2,  1,  2,  7,  7,  1,  1,
596
     8,  8,  1,  1,  4,  2,  1,  4,  2,  1,  3,  3,  1,  1,  1,  9,
597
     9,  1,  2,  1,  2,  1,  5,  5,  1,  1, 10, 10,  1,  1,  3,  3,
598
     2,  2,  1,  1, 11, 11,  6,  4,  4,  1,  6,  1,  2,  1,  2, 12,
599
     8,  1, 12,  7,  8,  7,  1, 16,  1, 16,  1,  3,  3, 13,  1, 13,
600
     2,  2,  1, 15,  1,  5, 14, 15,  1,  5, 14,  1, 17,  8, 17,  8,
601
     1,  4,  4,  2,  2,  1, 25, 25, 24, 24,  1,  3,  1,  3,  1,  8,
602
     6,  7,  6,  1, 18,  8, 18,  1,  7, 23,  2,  2, 23,  1,  1, 21,
603
    22,  9,  9, 22, 19,  1, 21,  5, 19,  5,  1, 33, 20, 33, 20,  8,
604
     4,  4,  1, 32,  2,  2,  8,  3, 32, 26,  3,  1,  7,  7, 26,  6,
605
     1,  6,  1,  1, 16,  1, 10,  1, 10,  2, 16, 29, 28,  2, 29, 28,
606
     1, 27,  5,  8,  5, 27,  1,  8,  3,  7,  3, 31, 41, 31,  1, 41,
607
     6,  1,  6,  7,  4,  4,  1,  1,  2,  1,  2, 11, 34, 30, 11,  1,
608
    30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
609

    
610
    /* value table */
611
    { 1,  -1,   0,   2,  -2,   0,   3,  -3,   1,  -1,   4,  -4,   5,  -5,   1,  -1,
612
      6,  -6,   2,  -2,   7,  -7,   1,  -1,   8,  -8,   9,  -9,   3,  -3,   1,  -1,
613
     10, -10,   2,  -2,  11, -11,   1,  -1,  12,   4, -12,  -4,   1,  -1,  13, -13,
614
      1,  -1,  14, -14,   2,   5,  15,  -2,  -5, -15,  -3,   3,  16, -16,  17,   1,
615
     -1, -17,   6,  18,  -6, -18,   2,  -2,  19, -19,   1,  -1,  20, -20,   4,  -4,
616
      7,  -7,  21, -21,   1,  -1,   2,   3,  -3,  22,  -2, -22,   8,  23,  -8,   1,
617
      2, -23,  -1,   2,  -2,  -2,  24,   1, -24,  -1,  25,   5,  -5,   1, -25,  -1,
618
      9,  -9,  26,   1, -26,   3,   1,  -1,  27,  -3,  -1, -27,   1,   3,  -1,  -3,
619
     28,  -4,   4,  10, -10, -28,   1,  -1,   1,  -1,  29,   6, -29,  -6,  30,  -4,
620
      3,   3,  -3, -30,   1,   4,  -1,  31,  -3,   1,  11, -11,  -1, -31,  32,  -1,
621
     -1,   2,  -2,   1,   1, -32,   1,   4,  -1,  -4,  33,  -1,   1,   1,  -1,   5,
622
      5,  -5, -33,  -1, -12,  12,  -5,  -7,   1,   1,   7,  34,   4,  -4,  -1,   4,
623
    -34,  -4,  35,  36,  -2, -35,  -2, -36,   2,  13,   2,  -1,   1, -13,   1,  -1,
624
     37,   1,  -5,   6,   5,  -1,  38,  -6,  -8,   5,   8,  -1,   1,   1, -37,  -1,
625
      5,  39,  -5,  -5,   6,  -6, -38, -39, -14,  40,  14,   2,   1,   1,  -2, -40,
626
     -1,  -2,   2,  -1,  -1,  -1,   1,   1,   1,  -1,   1,  -1,   1,  -1,   1,  -1}
627
},{
628
    /* MapTab1 */
629
    0,  /* eob_sym */
630
    38, /* esc_sym */
631
    /* run table */
632
    {0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  8,  6,  8,  7,
633
     7,  9,  9, 10, 10, 11, 11,  1, 12,  1, 12, 13, 13, 16, 14, 16,
634
    14, 15, 15, 17, 17, 18,  0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
635
    25, 24,  2, 25, 24, 23, 23,  2, 26, 28, 26, 28, 29, 27, 29, 27,
636
    33, 33,  1, 32,  1,  3, 32, 30, 36,  3, 36, 30, 31, 31, 35, 34,
637
    37, 41, 34, 35, 37,  4, 41,  4, 49,  8,  8, 49, 40, 38,  5, 38,
638
    40, 39,  5, 39, 42, 43, 42,  7, 57,  6, 43, 44,  6, 50,  7, 44,
639
    57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58,  1, 51, 58,  1,
640
    52, 59, 53,  9, 52, 55, 55, 59, 53, 56, 54, 56, 54,  9, 64, 64,
641
    60, 63, 60, 63, 61, 62, 61, 62,  2, 10,  2, 10, 11,  1, 11, 13,
642
    12,  1, 12, 13, 16, 16,  8,  8, 14,  3,  3, 15, 14, 15,  4,  4,
643
     1, 17, 17,  5,  1,  7,  7,  5,  6,  1,  2,  2,  6, 22,  1, 25,
644
    21, 22,  8, 24,  1, 21, 25, 24,  8, 18, 18, 23,  9, 20, 23, 33,
645
    29, 33, 20,  1, 19,  1, 29, 36,  9, 36, 19, 41, 28, 57, 32,  3,
646
    28,  3,  1, 27, 49, 49,  1, 32, 26, 26,  2,  4,  4,  7, 57, 41,
647
     2,  7, 10,  5, 37, 16, 10, 27,  8,  8, 13, 16, 37, 13,  1,  5},
648

    
649
    /* value table */
650
    {0,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,   1,  -1,  -1,   1,
651
    -1,   1,  -1,   1,  -1,   1,  -1,   2,   1,  -2,  -1,   1,  -1,   1,   1,  -1,
652
    -1,   1,  -1,   1,  -1,   1,   0,  -1,   1,   1,   1,  -1,   1,  -1,  -1,  -1,
653
     1,   1,   2,  -1,  -1,   1,  -1,  -2,   1,   1,  -1,  -1,   1,   1,  -1,  -1,
654
     1,  -1,   3,   1,  -3,   2,  -1,   1,   1,  -2,  -1,  -1,  -1,   1,   1,   1,
655
     1,   1,  -1,  -1,  -1,   2,  -1,  -2,   1,   2,  -2,  -1,   1,   1,   2,  -1,
656
    -1,   1,  -2,  -1,   1,   1,  -1,   2,   1,   2,  -1,   1,  -2,  -1,  -2,  -1,
657
    -1,   1,   1,  -1,   1,  -1,   1,   1,   1,  -1,  -1,   1,   4,  -1,  -1,  -4,
658
     1,   1,   1,   2,  -1,  -1,   1,  -1,  -1,   1,  -1,  -1,   1,  -2,   1,  -1,
659
     1,   1,  -1,  -1,   1,   1,  -1,  -1,   3,   2,  -3,  -2,   2,   5,  -2,   2,
660
     2,  -5,  -2,  -2,  -2,   2,  -3,   3,   2,   3,  -3,   2,  -2,  -2,   3,  -3,
661
     6,   2,  -2,   3,  -6,   3,  -3,  -3,   3,   7,  -4,   4,  -3,   2,  -7,   2,
662
     2,  -2,  -4,   2,   8,  -2,  -2,  -2,   4,   2,  -2,   2,   3,   2,  -2,  -2,
663
     2,   2,  -2,  -8,  -2,   9,  -2,   2,  -3,  -2,   2,  -2,   2,   2,   2,   4,
664
    -2,  -4,  10,   2,   2,  -2,  -9,  -2,   2,  -2,   5,   4,  -4,   4,  -2,   2,
665
    -5,  -4,  -3,   4,   2,  -3,   3,  -2,  -5,   5,   3,   3,  -2,  -3, -10,  -4}
666
},{
667
    /* MapTab2 */
668
    2,  /* eob_sym */
669
    11, /* esc_sym */
670
    /* run table */
671
    {1,  1,  0,  2,  2,  1,  1,  3,  3,  4,  4,  0,  1,  1,  5,  5,
672
     2,  2,  6,  6,  7,  7,  1,  8,  1,  8,  3,  3,  9,  9,  1,  2,
673
     2,  1,  4, 10,  4, 10, 11, 11,  1,  5, 12, 12,  1,  5, 13, 13,
674
     3,  3,  6,  6,  2,  2, 14, 14, 16, 16, 15,  7, 15,  8,  8,  7,
675
     1,  1, 17, 17,  4,  4,  1,  1, 18, 18,  2,  2,  5,  5, 25,  3,
676
     9,  3, 25,  9, 19, 24, 19, 24,  1, 21, 20,  1, 21, 22, 20, 22,
677
    23, 23,  8,  6, 33,  6,  8, 33,  7,  7, 26, 26,  1, 32,  1, 32,
678
    28,  4, 28, 10, 29, 27, 27, 10, 41,  4, 29,  2,  2, 41, 36, 31,
679
    49, 31, 34, 30, 34, 36, 30, 35,  1, 49, 11,  5, 35, 11,  1,  3,
680
     3,  5, 37, 37,  8, 40,  8, 40, 12, 12, 42, 42,  1, 38, 16, 57,
681
     1,  6, 16, 39, 38,  6,  7,  7, 13, 13, 39, 43,  2, 43, 57,  2,
682
    50,  9, 44,  9, 50,  4, 15, 48, 44,  4,  1, 15, 48, 14, 14,  1,
683
    45, 45,  8,  3,  5,  8, 51, 47,  3, 46, 46, 47,  5, 51,  1, 17,
684
    17, 58,  1, 58,  2, 52, 52,  2, 53,  7, 59,  6,  6, 56, 53, 55,
685
     7, 55,  1, 54, 59, 56, 54, 10,  1, 10,  4, 60,  1, 60,  8,  4,
686
     8, 64, 64, 61,  1, 63,  3, 63, 62, 61,  5, 11,  5,  3, 11, 62},
687

    
688
    /* value table */
689
    { 1,  -1,   0,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   0,   3,  -3,   1,  -1,
690
      2,  -2,   1,  -1,   1,  -1,   4,   1,  -4,  -1,   2,  -2,   1,  -1,   5,   3,
691
     -3,  -5,   2,   1,  -2,  -1,   1,  -1,   6,   2,   1,  -1,  -6,  -2,   1,  -1,
692
      3,  -3,   2,  -2,   4,  -4,   1,  -1,   1,  -1,   1,   2,  -1,   2,  -2,  -2,
693
      7,  -7,   1,  -1,   3,  -3,   8,  -8,   1,  -1,   5,  -5,   3,  -3,   1,   4,
694
      2,  -4,  -1,  -2,   1,   1,  -1,  -1,   9,   1,   1,  -9,  -1,   1,  -1,  -1,
695
      1,  -1,   3,  -3,   1,   3,  -3,  -1,   3,  -3,   1,  -1,  10,   1, -10,  -1,
696
      1,   4,  -1,   2,   1,  -1,   1,  -2,   1,  -4,  -1,   6,  -6,  -1,   1,   1,
697
      1,  -1,   1,   1,  -1,  -1,  -1,   1,  11,  -1,  -2,   4,  -1,   2, -11,   5,
698
     -5,  -4,  -1,   1,   4,   1,  -4,  -1,  -2,   2,   1,  -1,  12,   1,  -2,   1,
699
    -12,   4,   2,   1,  -1,  -4,   4,  -4,   2,  -2,  -1,   1,   7,  -1,  -1,  -7,
700
     -1,  -3,   1,   3,   1,   5,   2,   1,  -1,  -5,  13,  -2,  -1,   2,  -2, -13,
701
      1,  -1,   5,   6,   5,  -5,   1,   1,  -6,   1,  -1,  -1,  -5,  -1,  14,   2,
702
     -2,   1, -14,  -1,   8,   1,  -1,  -8,   1,   5,   1,   5,  -5,   1,  -1,   1,
703
     -5,  -1,  15,   1,  -1,  -1,  -1,   3, -15,  -3,   6,   1,  16,  -1,   6,  -6,
704
     -6,   1,  -1,   1, -16,   1,   7,  -1,   1,  -1,  -6,  -3,   6,  -7,   3,  -1}
705
},{
706
    /* MapTab3 */
707
    0,  /* eob_sym */
708
    35, /* esc_sym */
709
    /* run table */
710
    {0,  1,  1,  2,  2,  3,  3,  4,  4,  1,  1,  5,  5,  6,  6,  7,
711
     7,  8,  8,  9,  9,  2,  2, 10, 10,  1,  1, 11, 11, 12, 12,  3,
712
     3, 13, 13,  0, 14, 14, 16, 15, 16, 15,  4,  4, 17,  1, 17,  1,
713
     5,  5, 18, 18,  2,  2,  6,  6,  8, 19,  7,  8,  7, 19, 20, 20,
714
    21, 21, 22, 24, 22, 24, 23, 23,  1,  1, 25, 25,  3,  3, 26, 26,
715
     9,  9, 27, 27, 28, 28, 33, 29,  4, 33, 29,  1,  4,  1, 32, 32,
716
     2,  2, 31, 10, 30, 10, 30, 31, 34, 34,  5,  5, 36, 36, 35, 41,
717
    35, 11, 41, 11, 37,  1,  8,  8, 37,  6,  1,  6, 40,  7,  7, 40,
718
    12, 38, 12, 39, 39, 38, 49, 13, 49, 13,  3, 42,  3, 42, 16, 16,
719
    43, 43, 14, 14,  1,  1, 44, 15, 44, 15,  2,  2, 57, 48, 50, 48,
720
    57, 50,  4, 45, 45,  4, 46, 47, 47, 46,  1, 51,  1, 17, 17, 51,
721
     8,  9,  9,  5, 58,  8, 58,  5, 52, 52, 55, 56, 53, 56, 55, 59,
722
    59, 53, 54,  1,  6, 54,  7,  7,  6,  1,  2,  3,  2,  3, 64, 60,
723
    60, 10, 10, 64, 61, 62, 61, 63,  1, 63, 62,  1, 18, 24, 18,  4,
724
    25,  4,  8, 21, 21,  1, 24, 22, 25, 22,  8, 11, 19, 11, 23,  1,
725
    20, 23, 19, 20,  5, 12,  5,  1, 16,  2, 12, 13,  2, 13,  1, 16},
726

    
727
    /* value table */
728
    { 0,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   1,
729
     -1,   1,  -1,   1,  -1,   2,  -2,   1,  -1,   3,  -3,   1,  -1,   1,  -1,   2,
730
     -2,   1,  -1,   0,   1,  -1,   1,   1,  -1,  -1,   2,  -2,   1,   4,  -1,  -4,
731
      2,  -2,   1,  -1,  -3,   3,   2,  -2,   2,   1,   2,  -2,  -2,  -1,   1,  -1,
732
      1,  -1,   1,   1,  -1,  -1,   1,  -1,   5,  -5,   1,  -1,   3,  -3,   1,  -1,
733
      2,  -2,   1,  -1,   1,  -1,   1,   1,   3,  -1,  -1,   6,  -3,  -6,  -1,   1,
734
      4,  -4,   1,   2,   1,  -2,  -1,  -1,   1,  -1,   3,  -3,   1,  -1,   1,   1,
735
     -1,   2,  -1,  -2,   1,   7,  -3,   3,  -1,   3,  -7,  -3,   1,  -3,   3,  -1,
736
      2,   1,  -2,   1,  -1,  -1,   1,   2,  -1,  -2,  -4,  -1,   4,   1,   2,  -2,
737
      1,  -1,  -2,   2,   8,  -8,  -1,   2,   1,  -2,  -5,   5,   1,  -1,  -1,   1,
738
     -1,   1,   4,  -1,   1,  -4,  -1,  -1,   1,   1,   9,   1,  -9,   2,  -2,  -1,
739
     -4,   3,  -3,  -4,  -1,   4,   1,   4,   1,  -1,   1,  -1,   1,   1,  -1,   1,
740
     -1,  -1,  -1,  10,   4,   1,   4,  -4,  -4, -10,   6,   5,  -6,  -5,   1,  -1,
741
      1,   3,  -3,  -1,   1,  -1,  -1,  -1,  11,   1,   1, -11,  -2,  -2,   2,   5,
742
     -2,  -5,  -5,   2,  -2,  12,   2,  -2,   2,   2,   5,  -3,  -2,   3,  -2, -12,
743
     -2,   2,   2,   2,  -5,   3,   5,  13,  -3,   7,  -3,  -3,  -7,   3, -13,   3}
744
},{
745
    /* MapTab4 */
746
    0,  /* eob_sym */
747
    34, /* esc_sym */
748
    /* run table */
749
    {0,  1,  1,  1,  2,  2,  1,  3,  3,  1,  1,  1,  4,  4,  1,  5,
750
     2,  1,  5,  2,  1,  1,  6,  6,  1,  1,  1,  1,  1,  7,  3,  1,
751
     2,  3,  0,  1,  2,  7,  1,  1,  1,  8,  1,  1,  8,  1,  1,  1,
752
     9,  1,  9,  1,  2,  1,  1,  2,  1,  1, 10,  4,  1, 10,  1,  4,
753
     1,  1,  1,  1,  1,  3,  1,  1,  1,  3,  2,  1,  5,  1,  1,  1,
754
     2,  5,  1, 11,  1, 11,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
755
     2,  1,  6,  1,  6,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1, 12,
756
     3,  1, 12,  1,  1,  1,  2,  1,  1,  3,  1,  1,  1,  1,  1,  1,
757
     4,  1,  1,  1,  2,  1,  1,  4,  1,  1,  1,  1,  1,  1,  2,  1,
758
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  3,  1,  2,  1,  1,  5,
759
     1,  1,  1,  1,  1,  7,  1,  7,  1,  1,  2,  3,  1,  1,  1,  1,
760
     5,  1,  1,  1,  1,  1,  1,  2, 13,  1,  1,  1,  1,  1,  1,  1,
761
     1,  1,  1,  1,  1,  1,  1,  1, 13,  2,  1,  1,  4,  1,  1,  1,
762
     3,  1,  6,  1,  1,  1, 14,  1,  1,  1,  1,  1, 14,  6,  1,  1,
763
     1,  1, 15,  2,  4,  1,  2,  3, 15,  1,  1,  1,  8,  1,  1,  8,
764
     1,  1,  1,  1,  1,  1,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1},
765

    
766
    /* value table */
767
    { 0,   1,  -1,   2,   1,  -1,  -2,   1,  -1,   3,  -3,   4,   1,  -1,  -4,   1,
768
      2,   5,  -1,  -2,  -5,   6,   1,  -1,  -6,   7,  -7,   8,  -8,   1,   2,   9,
769
      3,  -2,   0,  -9,  -3,  -1,  10, -10,  11,   1, -11,  12,  -1, -12,  13, -13,
770
      1,  14,  -1, -14,   4,  15, -15,  -4,  16, -16,   1,   2,  17,  -1, -17,  -2,
771
     18, -18,  19, -19,  20,   3, -20,  21, -21,  -3,   5,  22,   2, -22, -23,  23,
772
     -5,  -2,  24,   1, -24,  -1,  25, -25,  26, -26, -27,  27,  28,  29, -28, -29,
773
      6,  30,   2, -31,  -2, -30,  31,  -6, -32,  32,  33, -33,  34, -35, -34,   1,
774
      4, -36,  -1,  35,  37,  36,   7, -37,  38,  -4, -38,  39,  41,  40, -40, -39,
775
      3,  42, -43, -41,  -7, -42,  43,  -3,  44, -44,  45, -45,  46,  47,   8, -47,
776
    -48, -46,  50, -50,  48,  49,  51, -49,  52, -52,   5, -51,  -8, -53,  53,   3,
777
    -56,  56,  55,  54, -54,   2,  60,  -2, -55,  58,   9,  -5,  59,  57, -57, -63,
778
     -3, -58, -60, -61,  61, -59, -62,  -9,   1,  64,  62,  69, -64,  63,  65, -67,
779
    -68,  66, -65,  68, -66, -69,  67, -70,  -1,  10,  71, -71,   4,  73,  72,  70,
780
      6, -76,  -3,  74, -78, -74,   1,  78,  80, -72, -75,  76,  -1,   3, -73,  79,
781
     75,  77,   1,  11,  -4, -79, -10,  -6,  -1, -77, -83, -80,   2,  81, -84,  -2,
782
     83, -81,  82, -82,  84, -87, -86,  85, -11, -85,  86, -89,  87, -88,  88,  89}
783
},{
784
    /* MapTab5 */
785
    2,  /* eob_sym */
786
    33, /* esc_sym */
787
    /* run table */
788
    {1,  1,  0,  2,  1,  2,  1,  3,  3,  1,  1,  4,  4,  2,  2,  1,
789
     1,  5,  5,  6,  1,  6,  1,  7,  7,  3,  3,  2,  8,  2,  8,  1,
790
     1,  0,  9,  9,  1,  1, 10,  4, 10,  4, 11, 11,  2,  1,  2,  1,
791
    12, 12,  3,  3,  1,  1, 13,  5,  5, 13, 14,  1,  1, 14,  2,  2,
792
     6,  6, 15,  1,  1, 15, 16,  4,  7, 16,  4,  7,  1,  1,  3,  3,
793
     8,  8,  2,  2,  1,  1, 17, 17,  1,  1, 18, 18,  5,  5,  2,  2,
794
     1,  1,  9, 19,  9, 19, 20,  3,  3, 20,  1, 10, 21,  1, 10,  4,
795
     4, 21, 22,  6,  6, 22,  1,  1, 23, 24,  2,  2, 23, 24, 11,  1,
796
     1, 11,  7, 25,  7,  1,  1, 25,  8,  8,  3, 26,  3,  1, 12,  2,
797
     2, 26,  1, 12,  5,  5, 27,  4,  1,  4,  1, 27, 28,  1, 28, 13,
798
     1, 13,  2, 29,  2,  1, 32,  6,  1, 30, 14, 29, 14,  6,  3, 31,
799
     3,  1, 30,  1, 32, 31, 33,  9, 33,  1,  1,  7,  9,  7,  2,  2,
800
     1,  1,  4, 36, 34,  4,  5, 10, 10,  5, 34,  1,  1, 35,  8,  8,
801
    36,  3, 35,  1, 15,  3,  2,  1, 16, 15, 16,  2, 37,  1, 37,  1,
802
     1,  1,  6,  6, 38,  1, 38, 11,  1, 39, 39, 40, 11,  2, 41,  4,
803
    40,  1,  2,  4,  1,  1,  1, 41,  3,  1,  3,  1,  5,  7,  5,  7},
804

    
805
    /* value table */
806
    { 1,  -1,   0,   1,   2,  -1,  -2,   1,  -1,   3,  -3,   1,  -1,   2,  -2,   4,
807
     -4,   1,  -1,   1,   5,  -1,  -5,   1,  -1,   2,  -2,   3,   1,  -3,  -1,   6,
808
     -6,   0,   1,  -1,   7,  -7,   1,   2,  -1,  -2,   1,  -1,   4,   8,  -4,  -8,
809
      1,  -1,   3,  -3,   9,  -9,   1,   2,  -2,  -1,   1,  10, -10,  -1,   5,  -5,
810
      2,  -2,   1,  11, -11,  -1,   1,   3,   2,  -1,  -3,  -2,  12, -12,   4,  -4,
811
      2,  -2,  -6,   6,  13, -13,   1,  -1,  14, -14,   1,  -1,   3,  -3,   7,  -7,
812
     15, -15,   2,   1,  -2,  -1,   1,   5,  -5,  -1, -16,   2,   1,  16,  -2,   4,
813
     -4,  -1,   1,   3,  -3,  -1,  17, -17,   1,   1,  -8,   8,  -1,  -1,   2,  18,
814
    -18,  -2,   3,   1,  -3,  19, -19,  -1,   3,  -3,   6,   1,  -6,  20,   2,   9,
815
     -9,  -1, -20,  -2,   4,  -4,   1,  -5,  21,   5, -21,  -1,   1, -22,  -1,   2,
816
     22,  -2,  10,   1, -10,  23,   1,   4, -23,   1,   2,  -1,  -2,  -4,  -7,   1,
817
      7, -24,  -1,  24,  -1,  -1,   1,   3,  -1, -25,  25,   4,  -3,  -4,  11, -11,
818
     26, -26,   6,   1,   1,  -6,  -5,  -3,   3,   5,  -1, -27,  27,   1,   4,  -4,
819
     -1,  -8,  -1,  28,   2,   8, -12, -28,  -2,  -2,   2,  12,  -1,  29,   1, -29,
820
     30, -30,   5,  -5,   1, -31,  -1,   3,  31,  -1,   1,   1,  -3, -13,   1,  -7,
821
     -1, -32,  13,   7,  32,  33, -33,  -1,  -9, -34,   9,  34,  -6,   5,   6,  -5}
822
},{
823
    /* MapTab6 */
824
    2,  /* eob_sym */
825
    13, /* esc_sym */
826
    /* run table */
827
    {1,  1,  0,  1,  1,  2,  2,  1,  1,  3,  3,  1,  1,  0,  2,  2,
828
     4,  1,  4,  1,  1,  1,  5,  5,  1,  1,  6,  6,  2,  2,  1,  1,
829
     3,  3,  7,  7,  1,  1,  8,  8,  1,  1,  2,  2,  1,  9,  1,  9,
830
     4,  4, 10,  1,  1, 10,  1,  1, 11, 11,  3,  3,  1,  2,  1,  2,
831
     1,  1, 12, 12,  5,  5,  1,  1, 13,  1,  1, 13,  2,  2,  1,  1,
832
     6,  6,  1,  1,  4, 14,  4, 14,  3,  1,  3,  1,  1,  1, 15,  7,
833
    15,  2,  2,  7,  1,  1,  1,  8,  1,  8, 16, 16,  1,  1,  1,  1,
834
     2,  1,  1,  2,  1,  1,  3,  5,  5,  3,  4,  1,  1,  4,  1,  1,
835
    17, 17,  9,  1,  1,  9,  2,  2,  1,  1, 10, 10,  1,  6,  1,  1,
836
     6, 18,  1,  1, 18,  1,  1,  1,  2,  2,  3,  1,  3,  1,  1,  1,
837
     4,  1, 19,  1, 19,  7,  1,  1, 20,  1,  4, 20,  1,  7, 11,  2,
838
     1, 11, 21,  2,  8,  5,  1,  8,  1,  5, 21,  1,  1,  1, 22,  1,
839
     1, 22,  1,  1,  3,  3,  1, 23,  2, 12, 24,  1,  1,  2,  1,  1,
840
    12, 23,  1,  1, 24,  1,  1,  1,  4,  1,  1,  1,  2,  1,  6,  6,
841
     4,  2,  1,  1,  1,  1,  1,  1,  1, 14, 13,  3,  1, 25,  9, 25,
842
    14,  1,  9,  3, 13,  1,  1,  1,  1,  1, 10,  1,  1,  2, 10,  2},
843

    
844
    /* value table */
845
    {-20,  -1,   0,   2,  -2,   1,  -1,   3,  -3,   1,  -1,   4,  -4,   0,   2,  -2,
846
       1,   5,  -1,  -5,   6,  -6,   1,  -1,   7,  -7,   1,  -1,   3,  -3,   8,  -8,
847
       2,  -2,   1,  -1,   9,  -9,   1,  -1,  10, -10,   4,  -4,  11,   1, -11,  -1,
848
       2,  -2,   1,  12, -12,  -1,  13, -13,   1,  -1,   3,  -3,  14,   5, -14,  -5,
849
     -15,  15,  -1,   1,   2,  -2,  16, -16,   1,  17, -17,  -1,   6,  -6,  18, -18,
850
       2,  -2, -19,  19,  -3,   1,   3,  -1,   4,  20,  -4,   1, -21,  21,   1,   2,
851
      -1,  -7,   7,  -2,  22, -22,  23,   2, -23,  -2,   1,  -1, -24,  24, -25,  25,
852
      -8, -26,  26,   8, -27,  27,   5,   3,  -3,  -5,  -4,  28, -28,   4,  29, -29,
853
       1,  -1,  -2, -30,  30,   2,   9,  -9, -31,  31,   2,  -2, -32,   3,  32, -33,
854
      -3,   1,  33, -34,  -1,  34, -35,  35, -10,  10,  -6,  36,   6, -36,  37, -37,
855
      -5,  38,   1, -38,  -1,   3,  39, -39,  -1,  40,   5,   1, -40,  -3,   2, -11,
856
     -41,  -2,   1,  11,  -3,  -4,  41,   3,  42,   4,  -1, -43, -42,  43,   1, -44,
857
      45,  -1,  44, -45,  -7,   7, -46,   1, -12,   2,   1, -47,  46,  12,  47,  48,
858
      -2,  -1, -48,  49,  -1, -50, -49,  50,  -6, -51,  51,  52, -13,  53,  -4,   4,
859
       6,  13, -53, -52, -54,  55,  54, -55, -56,  -2,   2,  -8,  56,   1,  -3,  -1,
860
       2,  58,   3,   8,  -2,  57, -58, -60, -59, -57,  -3,  60,  59, -14,   3,  14}
861
},{
862
    /* MapTab7 */
863
    2,  /* eob_sym */
864
    38, /* esc_sym */
865
    /* run table */
866
    {1,  1,  0,  2,  2,  1,  1,  3,  3,  4,  4,  5,  5,  1,  1,  6,
867
     6,  2,  2,  7,  7,  8,  8,  1,  1,  3,  3,  9,  9, 10, 10,  1,
868
     1,  2,  2,  4,  4, 11,  0, 11, 12, 12, 13, 13,  1,  1,  5,  5,
869
    14, 14, 15, 16, 15, 16,  3,  3,  1,  6,  1,  6,  2,  2,  7,  7,
870
     8,  8, 17, 17,  1,  1,  4,  4, 18, 18,  2,  2,  1, 19,  1, 20,
871
    19, 20, 21, 21,  3,  3, 22, 22,  5,  5, 24,  1,  1, 23,  9, 23,
872
    24,  9,  2,  2, 10,  1,  1, 10,  6,  6, 25,  4,  4, 25,  7,  7,
873
    26,  8,  1,  8,  3,  1, 26,  3, 11, 11, 27, 27,  2, 28,  1,  2,
874
    28,  1, 12, 12,  5,  5, 29, 13, 13, 29, 32,  1,  1, 33, 31, 30,
875
    32,  4, 30, 33,  4, 31,  3, 14,  1,  1,  3, 34, 34,  2,  2, 14,
876
     6,  6, 35, 36, 35, 36,  1, 15,  1, 16, 16, 15,  7,  9,  7,  9,
877
    37,  8,  8, 37,  1,  1, 39,  2, 38, 39,  2, 40,  5, 38, 40,  5,
878
     3,  3,  4,  4, 10, 10,  1,  1,  1,  1, 41,  2, 41,  2,  6,  6,
879
     1,  1, 11, 42, 11, 43,  3, 42,  3, 17,  4, 43,  1, 17,  7,  1,
880
     8, 44,  4,  7, 44,  5,  8,  2,  5,  1,  2, 48, 45,  1, 12, 45,
881
    12, 48, 13, 13,  1,  9,  9, 46,  1, 46, 47, 47, 49, 18, 18, 49},
882

    
883
    /* value table */
884
    { 1,  -1,   0,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   1,  -1,   3,  -3,   1,
885
     -1,  -2,   2,   1,  -1,   1,  -1,   4,  -4,  -2,   2,   1,  -1,   1,  -1,   5,
886
     -5,  -3,   3,   2,  -2,   1,   0,  -1,   1,  -1,   1,  -1,   6,  -6,   2,  -2,
887
      1,  -1,   1,   1,  -1,  -1,  -3,   3,   7,   2,  -7,  -2,  -4,   4,   2,  -2,
888
      2,  -2,   1,  -1,   8,  -8,   3,  -3,   1,  -1,  -5,   5,   9,   1,  -9,   1,
889
     -1,  -1,   1,  -1,  -4,   4,   1,  -1,   3,  -3,   1, -10,  10,   1,   2,  -1,
890
     -1,  -2,   6,  -6,   2,  11, -11,  -2,   3,  -3,   1,  -4,   4,  -1,   3,  -3,
891
      1,   3,  12,  -3,  -5, -12,  -1,   5,   2,  -2,   1,  -1,  -7,   1,  13,   7,
892
     -1, -13,   2,  -2,   4,  -4,   1,   2,  -2,  -1,   1,  14, -14,   1,   1,   1,
893
     -1,  -5,  -1,  -1,   5,  -1,  -6,   2, -15,  15,   6,   1,  -1,  -8,   8,  -2,
894
     -4,   4,   1,   1,  -1,  -1,  16,   2, -16,  -2,   2,  -2,   4,   3,  -4,  -3,
895
     -1,  -4,   4,   1, -17,  17,  -1,  -9,   1,   1,   9,   1,  -5,  -1,  -1,   5,
896
     -7,   7,   6,  -6,   3,  -3,  18, -18,  19, -19,   1, -10,  -1,  10,  -5,   5,
897
     20, -20,  -3,   1,   3,   1,   8,  -1,  -8,   2,   7,  -1, -21,  -2,   5,  21,
898
      5,  -1,  -7,  -5,   1,  -6,  -5, -11,   6,  22,  11,   1,   1, -22,  -3,  -1,
899
      3,  -1,   3,  -3, -23,   4,  -4,   1,  23,  -1,   1,  -1,   1,  -2,   2,  -1}
900
},{
901
    /* MapTab8 */
902
    4,  /* eob_sym */
903
    11, /* esc_sym */
904
    /* run table */
905
    {1,  1,  1,  1,  0,  2,  2,  1,  1,  3,  3,  0,  1,  1,  2,  2,
906
     4,  4,  1,  1,  5,  5,  1,  1,  2,  2,  3,  3,  6,  6,  1,  1,
907
     7,  7,  8,  1,  8,  2,  2,  1,  4,  4,  1,  3,  1,  3,  9,  9,
908
     2,  2,  1,  5,  1,  5, 10, 10,  1,  1, 11, 11,  3,  6,  3,  4,
909
     4,  6,  2,  2,  1, 12,  1, 12,  7, 13,  7, 13,  1,  1,  8,  8,
910
     2,  2, 14, 14, 16, 15, 16,  5,  5,  1,  3, 15,  1,  3,  4,  4,
911
     1,  1, 17, 17,  2,  2,  6,  6,  1, 18,  1, 18, 22, 21, 22, 21,
912
    25, 24, 25, 19,  9, 20,  9, 23, 19, 24, 20,  3, 23,  7,  3,  1,
913
     1,  7, 28, 26, 29,  5, 28, 26,  5,  8, 29,  4,  8, 27,  2,  2,
914
     4, 27,  1,  1, 10, 36, 10, 33, 33, 36, 30,  1, 32, 32,  1, 30,
915
     6, 31, 31, 35,  3,  6, 11, 11,  3,  2, 35,  2, 34,  1, 34,  1,
916
    37, 37, 12,  7, 12,  5, 41,  5,  4,  7,  1,  8, 13,  4,  1, 41,
917
    13, 38,  8, 38,  9,  1, 40, 40,  9,  1, 39,  2,  2, 49, 39, 42,
918
     3,  3, 14, 16, 49, 14, 16, 42, 43, 43,  6,  6, 15,  1,  1, 15,
919
    44, 44,  1,  1, 50, 48,  4,  5,  4,  7,  5,  2, 10, 10, 48,  7,
920
    50, 45,  2,  1, 45,  8,  8,  1, 46, 46,  3, 47, 47,  3,  1,  1},
921

    
922
    /* value table */
923
    { 1,  -1,   2,  -2,   0,   1,  -1,   3,  -3,   1,  -1,   0,   4,  -4,   2,  -2,
924
      1,  -1,   5,  -5,   1,  -1,   6,  -6,   3,  -3,   2,  -2,   1,  -1,   7,  -7,
925
      1,  -1,   1,   8,  -1,   4,  -4,  -8,   2,  -2,   9,   3,  -9,  -3,   1,  -1,
926
      5,  -5,  10,   2, -10,  -2,   1,  -1,  11, -11,   1,  -1,  -4,   2,   4,   3,
927
     -3,  -2,   6,  -6,  12,   1, -12,  -1,   2,   1,  -2,  -1,  13, -13,   2,  -2,
928
      7,  -7,   1,  -1,   1,   1,  -1,   3,  -3,  14,   5,  -1, -14,  -5,   4,  -4,
929
     15, -15,   1,  -1,   8,  -8,  -3,   3,  16,   1, -16,  -1,   1,   1,  -1,  -1,
930
      1,   1,  -1,   1,   2,   1,  -2,   1,  -1,  -1,  -1,   6,  -1,   3,  -6,  17,
931
    -17,  -3,   1,   1,   1,   4,  -1,  -1,  -4,   3,  -1,   5,  -3,  -1,  -9,   9,
932
     -5,   1,  18, -18,   2,   1,  -2,   1,  -1,  -1,   1,  19,  -1,   1, -19,  -1,
933
      4,   1,  -1,   1,   7,  -4,  -2,   2,  -7,  10,  -1, -10,   1,  20,  -1, -20,
934
      1,  -1,   2,   4,  -2,   5,   1,  -5,   6,  -4,  21,   4,   2,  -6, -21,  -1,
935
     -2,   1,  -4,  -1,  -3,  22,  -1,   1,   3, -22,  -1,  11, -11,   1,   1,   1,
936
      8,  -8,   2,   2,  -1,  -2,  -2,  -1,   1,  -1,  -5,   5,   2,  23, -23,  -2,
937
      1,  -1,  24, -24,  -1,  -1,   7,   6,  -7,   5,  -6,  12,  -3,   3,   1,  -5,
938
      1,   1, -12,  25,  -1,  -5,   5, -25,  -1,   1,   9,   1,  -1,  -9,  26, -26}
939
}
940
};