Statistics
| Branch: | Revision:

ffmpeg / libavcodec / ivi_common.c @ 4982a77e

History | View | Annotate | Download (43.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
extern const IVIHuffDesc ff_ivi_mb_huff_desc[8];  ///< static macroblock huffman tables
37
extern const IVIHuffDesc ff_ivi_blk_huff_desc[8]; ///< static block huffman tables
38

    
39
VLC ff_ivi_mb_vlc_tabs [8];
40
VLC 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
 */
46
static 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

    
58
int 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

    
92
void 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

    
111
int ff_ivi_dec_huff_desc(GetBitContext *gb, IVIHuffDesc *desc)
112
{
113
    int tab_sel, i;
114

    
115
    tab_sel = get_bits(gb, 3);
116
    if (tab_sel == 7) {
117
        /* custom huffman table (explicitly encoded) */
118
        desc->num_rows = get_bits(gb, 4);
119

    
120
        for (i = 0; i < desc->num_rows; i++)
121
            desc->xbits[i] = get_bits(gb, 4);
122
    }
123

    
124
    return tab_sel;
125
}
126

    
127
int ff_ivi_huff_desc_cmp(const IVIHuffDesc *desc1, const IVIHuffDesc *desc2)
128
{
129
    return    desc1->num_rows != desc2->num_rows
130
           || memcmp(desc1->xbits, desc2->xbits, desc1->num_rows);
131
}
132

    
133
void ff_ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src)
134
{
135
    dst->num_rows = src->num_rows;
136
    memcpy(dst->xbits, src->xbits, src->num_rows);
137
}
138

    
139
int av_cold ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg)
140
{
141
    int         p, b;
142
    uint32_t    b_width, b_height, align_fac, width_aligned, height_aligned, buf_size;
143
    IVIBandDesc *band;
144

    
145
    ff_ivi_free_buffers(planes);
146

    
147
    /* fill in the descriptor of the luminance plane */
148
    planes[0].width     = cfg->pic_width;
149
    planes[0].height    = cfg->pic_height;
150
    planes[0].num_bands = cfg->luma_bands;
151

    
152
    /* fill in the descriptors of the chrominance planes */
153
    planes[1].width     = planes[2].width     = (cfg->pic_width  + 3) >> 2;
154
    planes[1].height    = planes[2].height    = (cfg->pic_height + 3) >> 2;
155
    planes[1].num_bands = planes[2].num_bands = cfg->chroma_bands;
156

    
157
    for (p = 0; p < 3; p++) {
158
        planes[p].bands = av_mallocz(planes[p].num_bands * sizeof(IVIBandDesc));
159
        if (!planes[p].bands)
160
            return AVERROR(ENOMEM);
161

    
162
        /* select band dimensions: if there is only one band then it
163
         *  has the full size, if there are several bands each of them
164
         *  has only half size */
165
        b_width  = planes[p].num_bands == 1 ? planes[p].width  : (planes[p].width  + 1) >> 1;
166
        b_height = planes[p].num_bands == 1 ? planes[p].height : (planes[p].height + 1) >> 1;
167

    
168
        /* luma   band buffers will be aligned on 16x16 (max macroblock size) */
169
        /* chroma band buffers will be aligned on   8x8 (max macroblock size) */
170
        align_fac       = p ? 8 : 16;
171
        width_aligned   = FFALIGN(b_width , align_fac);
172
        height_aligned  = FFALIGN(b_height, align_fac);
173
        buf_size        = width_aligned * height_aligned * sizeof(int16_t);
174

    
175
        for (b = 0; b < planes[p].num_bands; b++) {
176
            band = &planes[p].bands[b]; /* select appropriate plane/band */
177
            band->plane    = p;
178
            band->band_num = b;
179
            band->width    = b_width;
180
            band->height   = b_height;
181
            band->pitch    = width_aligned;
182
            band->bufs[0]  = av_malloc(buf_size);
183
            band->bufs[1]  = av_malloc(buf_size);
184
            if (!band->bufs[0] || !band->bufs[1])
185
                return AVERROR(ENOMEM);
186

    
187
            /* allocate the 3rd band buffer for scalability mode */
188
            if (cfg->luma_bands > 1) {
189
                band->bufs[2] = av_malloc(buf_size);
190
                if (!band->bufs[2])
191
                    return AVERROR(ENOMEM);
192
            }
193

    
194
            planes[p].bands[0].huff_desc.num_rows = 0; /* reset custom vlc */
195
        }
196
    }
197

    
198
    return 0;
199
}
200

    
201
void av_cold ff_ivi_free_buffers(IVIPlaneDesc *planes)
202
{
203
    int p, b, t;
204

    
205
    for (p = 0; p < 3; p++) {
206
        for (b = 0; b < planes[p].num_bands; b++) {
207
            av_freep(&planes[p].bands[b].bufs[0]);
208
            av_freep(&planes[p].bands[b].bufs[1]);
209
            av_freep(&planes[p].bands[b].bufs[2]);
210

    
211
            if (planes[p].bands[b].blk_vlc_cust.table)
212
                free_vlc(&planes[p].bands[b].blk_vlc_cust);
213
            for (t = 0; t < planes[p].bands[b].num_tiles; t++)
214
                av_freep(&planes[p].bands[b].tiles[t].mbs);
215
            av_freep(&planes[p].bands[b].tiles);
216
        }
217
        av_freep(&planes[p].bands);
218
    }
219
}
220

    
221
int av_cold ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height)
222
{
223
    int         p, b, x, y, x_tiles, y_tiles, t_width, t_height;
224
    IVIBandDesc *band;
225
    IVITile     *tile, *ref_tile;
226

    
227
    for (p = 0; p < 3; p++) {
228
        t_width  = !p ? tile_width  : (tile_width  + 3) >> 2;
229
        t_height = !p ? tile_height : (tile_height + 3) >> 2;
230

    
231
        for (b = 0; b < planes[p].num_bands; b++) {
232
            band = &planes[p].bands[b];
233
            x_tiles = IVI_NUM_TILES(band->width, t_width);
234
            y_tiles = IVI_NUM_TILES(band->height, t_height);
235
            band->num_tiles = x_tiles * y_tiles;
236

    
237
            av_freep(&band->tiles);
238
            band->tiles = av_mallocz(band->num_tiles * sizeof(IVITile));
239
            if (!band->tiles)
240
                return AVERROR(ENOMEM);
241

    
242
            tile = band->tiles;
243

    
244
            /* use the first luma band as reference for motion vectors
245
             * and quant */
246
            ref_tile = planes[0].bands[0].tiles;
247

    
248
            for (y = 0; y < band->height; y += t_height) {
249
                for (x = 0; x < band->width; x += t_width) {
250
                    tile->xpos     = x;
251
                    tile->ypos     = y;
252
                    tile->width    = FFMIN(band->width - x,  t_width);
253
                    tile->height   = FFMIN(band->height - y, t_height);
254
                    tile->is_empty = tile->data_size = 0;
255
                    /* calculate number of macroblocks */
256
                    tile->num_MBs  = IVI_MBs_PER_TILE(tile->width, tile->height,
257
                                                      band->mb_size);
258

    
259
                    av_freep(&tile->mbs);
260
                    tile->mbs = av_malloc(tile->num_MBs * sizeof(IVIMbInfo));
261
                    if (!tile->mbs)
262
                        return AVERROR(ENOMEM);
263

    
264
                    tile->ref_mbs = 0;
265
                    if (p || b) {
266
                        tile->ref_mbs = ref_tile->mbs;
267
                        ref_tile++;
268
                    }
269

    
270
                    tile++;
271
                }
272
            }
273

    
274
        }// for b
275
    }// for p
276

    
277
    return 0;
278
}
279

    
280
int ff_ivi_dec_tile_data_size(GetBitContext *gb)
281
{
282
    int    len;
283

    
284
    len = 0;
285
    if (get_bits1(gb)) {
286
        len = get_bits(gb, 8);
287
        if (len == 255)
288
            len = get_bits_long(gb, 24);
289
    }
290

    
291
    /* align the bitstream reader on the byte boundary */
292
    align_get_bits(gb);
293

    
294
    return len;
295
}
296

    
297
int ff_ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile)
298
{
299
    int         mbn, blk, num_blocks, num_coeffs, blk_size, scan_pos, run, val,
300
                pos, is_intra, mc_type, mv_x, mv_y, col_mask;
301
    uint8_t     col_flags[8];
302
    int32_t     prev_dc, trvec[64];
303
    uint32_t    cbp, sym, lo, hi, quant, buf_offs, q;
304
    IVIMbInfo   *mb;
305
    RVMapDesc   *rvmap = band->rv_map;
306
    void (*mc_with_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
307
    void (*mc_no_delta_func)  (int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
308
    const uint8_t   *base_tab, *scale_tab;
309

    
310
    prev_dc = 0; /* init intra prediction for the DC coefficient */
311

    
312
    blk_size   = band->blk_size;
313
    col_mask   = blk_size - 1; /* column mask for tracking non-zero coeffs */
314
    num_blocks = (band->mb_size != blk_size) ? 4 : 1; /* number of blocks per mb */
315
    num_coeffs = blk_size * blk_size;
316
    if (blk_size == 8) {
317
        mc_with_delta_func = ff_ivi_mc_8x8_delta;
318
        mc_no_delta_func   = ff_ivi_mc_8x8_no_delta;
319
    } else {
320
        mc_with_delta_func = ff_ivi_mc_4x4_delta;
321
        mc_no_delta_func   = ff_ivi_mc_4x4_no_delta;
322
    }
323

    
324
    for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
325
        is_intra = !mb->type;
326
        cbp      = mb->cbp;
327
        buf_offs = mb->buf_offs;
328

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

    
331
        base_tab  = is_intra ? band->intra_base  : band->inter_base;
332
        scale_tab = is_intra ? band->intra_scale : band->inter_scale;
333

    
334
        if (!is_intra) {
335
            mv_x = mb->mv_x;
336
            mv_y = mb->mv_y;
337
            if (!band->is_halfpel) {
338
                mc_type = 0; /* we have only fullpel vectors */
339
            } else {
340
                mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
341
                mv_x >>= 1;
342
                mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
343
            }
344
        }
345

    
346
        for (blk = 0; blk < num_blocks; blk++) {
347
            /* adjust block position in the buffer according to its number */
348
            if (blk & 1) {
349
                buf_offs += blk_size;
350
            } else if (blk == 2) {
351
                buf_offs -= blk_size;
352
                buf_offs += blk_size * band->pitch;
353
            }
354

    
355
            if (cbp & 1) { /* block coded ? */
356
                scan_pos = -1;
357
                memset(trvec, 0, num_coeffs*sizeof(trvec[0])); /* zero transform vector */
358
                memset(col_flags, 0, sizeof(col_flags));      /* zero column flags */
359

    
360
                while (scan_pos <= num_coeffs) {
361
                    sym = get_vlc2(gb, band->blk_vlc->table, IVI_VLC_BITS, 1);
362
                    if (sym == rvmap->eob_sym)
363
                        break; /* End of block */
364

    
365
                    if (sym == rvmap->esc_sym) { /* Escape - run/val explicitly coded using 3 vlc codes */
366
                        run = get_vlc2(gb, band->blk_vlc->table, IVI_VLC_BITS, 1) + 1;
367
                        lo  = get_vlc2(gb, band->blk_vlc->table, IVI_VLC_BITS, 1);
368
                        hi  = get_vlc2(gb, band->blk_vlc->table, IVI_VLC_BITS, 1);
369
                        val = IVI_TOSIGNED((hi << 6) | lo); /* merge them and convert into signed val */
370
                    } else {
371
                        run = rvmap->runtab[sym];
372
                        val = rvmap->valtab[sym];
373
                    }
374

    
375
                    /* de-zigzag and dequantize */
376
                    scan_pos += run;
377
                    if (scan_pos >= num_coeffs)
378
                        break;
379
                    pos = band->scan[scan_pos];
380

    
381
                    if (IVI_DEBUG && !val)
382
                        av_log(NULL, AV_LOG_ERROR, "Val = 0 encountered!\n");
383

    
384
                    q = (base_tab[pos] * scale_tab[quant]) >> 8;
385
                    if (q > 1)
386
                        val = val * q + FFSIGN(val) * ((q >> 1) - (q & 1));
387
                    trvec[pos] = val;
388
                    col_flags[pos & col_mask] |= val; /* track columns containing non-zero coeffs */
389
                }// while
390

    
391
                if (scan_pos >= num_coeffs && sym != rvmap->eob_sym)
392
                    return -1; /* corrupt block data */
393

    
394
                /* undoing DC coeff prediction for intra-blocks */
395
                if (is_intra && band->is_2d_trans) {
396
                    prev_dc      += trvec[0];
397
                    trvec[0]      = prev_dc;
398
                    col_flags[0] |= !!prev_dc;
399
                }
400

    
401
                /* apply inverse transform */
402
                band->inv_transform(trvec, band->buf + buf_offs,
403
                                    band->pitch, col_flags);
404

    
405
                /* apply motion compensation */
406
                if (!is_intra)
407
                    mc_with_delta_func(band->buf + buf_offs,
408
                                       band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
409
                                       band->pitch, mc_type);
410
            } else {
411
                /* block not coded */
412
                /* for intra blocks apply the dc slant transform */
413
                /* for inter - perform the motion compensation without delta */
414
                if (is_intra && band->dc_transform) {
415
                    band->dc_transform(&prev_dc, band->buf + buf_offs,
416
                                       band->pitch, blk_size);
417
                } else
418
                    mc_no_delta_func(band->buf + buf_offs,
419
                                     band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
420
                                     band->pitch, mc_type);
421
            }
422

    
423
            cbp >>= 1;
424
        }// for blk
425
    }// for mbn
426

    
427
    align_get_bits(gb);
428

    
429
    return 0;
430
}
431

    
432
void ff_ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
433
                               IVITile *tile, int32_t mv_scale)
434
{
435
    int             x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
436
    int             offs, mb_offset, row_offset;
437
    IVIMbInfo       *mb, *ref_mb;
438
    const int16_t   *src;
439
    int16_t         *dst;
440
    void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch,
441
                             int mc_type);
442

    
443
    offs       = tile->ypos * band->pitch + tile->xpos;
444
    mb         = tile->mbs;
445
    ref_mb     = tile->ref_mbs;
446
    row_offset = band->mb_size * band->pitch;
447
    need_mc    = 0; /* reset the mc tracking flag */
448

    
449
    for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
450
        mb_offset = offs;
451

    
452
        for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
453
            mb->xpos     = x;
454
            mb->ypos     = y;
455
            mb->buf_offs = mb_offset;
456

    
457
            mb->type = 1; /* set the macroblocks type = INTER */
458
            mb->cbp  = 0; /* all blocks are empty */
459

    
460
            if (!band->qdelta_present && !band->plane && !band->band_num) {
461
                mb->q_delta = band->glob_quant;
462
                mb->mv_x    = 0;
463
                mb->mv_y    = 0;
464
            }
465

    
466
            if (band->inherit_qdelta && ref_mb)
467
                mb->q_delta = ref_mb->q_delta;
468

    
469
            if (band->inherit_mv) {
470
                /* motion vector inheritance */
471
                if (mv_scale) {
472
                    mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
473
                    mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
474
                } else {
475
                    mb->mv_x = ref_mb->mv_x;
476
                    mb->mv_y = ref_mb->mv_y;
477
                }
478
                need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
479
            }
480

    
481
            mb++;
482
            if (ref_mb)
483
                ref_mb++;
484
            mb_offset += band->mb_size;
485
        } // for x
486
        offs += row_offset;
487
    } // for y
488

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

    
494
        for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
495
            mv_x = mb->mv_x;
496
            mv_y = mb->mv_y;
497
            if (!band->is_halfpel) {
498
                mc_type = 0; /* we have only fullpel vectors */
499
            } else {
500
                mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
501
                mv_x >>= 1;
502
                mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
503
            }
504

    
505
            for (blk = 0; blk < num_blocks; blk++) {
506
                /* adjust block position in the buffer according with its number */
507
                offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
508
                mc_no_delta_func(band->buf + offs,
509
                                 band->ref_buf + offs + mv_y * band->pitch + mv_x,
510
                                 band->pitch, mc_type);
511
            }
512
        }
513
    } else {
514
        /* copy data from the reference tile into the current one */
515
        src = band->ref_buf + tile->ypos * band->pitch + tile->xpos;
516
        dst = band->buf     + tile->ypos * band->pitch + tile->xpos;
517
        for (y = 0; y < tile->height; y++) {
518
            memcpy(dst, src, tile->width*sizeof(band->buf[0]));
519
            src += band->pitch;
520
            dst += band->pitch;
521
        }
522
    }
523
}
524

    
525

    
526
#if IVI_DEBUG
527
uint16_t ivi_calc_band_checksum (IVIBandDesc *band)
528
{
529
    int         x, y;
530
    int16_t     *src, checksum;
531

    
532
    src = band->buf;
533
    checksum = 0;
534

    
535
    for (y = 0; y < band->height; src += band->pitch, y++)
536
        for (x = 0; x < band->width; x++)
537
            checksum += src[x];
538

    
539
    return checksum;
540
}
541

    
542
int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch)
543
{
544
    int         x, y, result;
545
    uint8_t     t1, t2;
546
    int16_t    *src;
547

    
548
    src = band->buf;
549
    result = 0;
550

    
551
    for (y = 0; y < band->height; src += band->pitch, y++) {
552
        for (x = 0; x < band->width; x++) {
553
            t1 = av_clip(src[x] + 128, 0, 255);
554
            t2 = ref[x];
555
            if (t1 != t2) {
556
                av_log(NULL, AV_LOG_ERROR, "Data mismatch: row %d, column %d\n",
557
                       y / band->blk_size, x / band->blk_size);
558
                result = -1;
559
            }
560
        }
561
        ref += pitch;
562
    }
563

    
564
    return result;
565
}
566
#endif
567

    
568
void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch)
569
{
570
    int             x, y;
571
    const int16_t   *src  = plane->bands[0].buf;
572
    uint32_t        pitch = plane->bands[0].pitch;
573

    
574
    for (y = 0; y < plane->height; y++) {
575
        for (x = 0; x < plane->width; x++)
576
            dst[x] = av_clip_uint8(src[x] + 128);
577
        src += pitch;
578
        dst += dst_pitch;
579
    }
580
}
581

    
582

    
583
/**
584
 * These are 2x8 predefined Huffman codebooks for coding macroblock/block
585
 * signals. They are specified using "huffman descriptors" in order to
586
 * avoid huge static tables. The decoding tables will be generated at
587
 * startup from these descriptors.
588
 */
589
const IVIHuffDesc ff_ivi_mb_huff_desc[8] = {
590
    {8,  {0, 4, 5, 4, 4, 4, 6, 6}},
591
    {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
592
    {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
593
    {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
594
    {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
595
    {9,  {0, 4, 4, 4, 4, 3, 3, 3, 2}},
596
    {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
597
    {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
598
};
599

    
600
const IVIHuffDesc ff_ivi_blk_huff_desc[8] = {
601
    {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
602
    {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
603
    {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
604
    {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
605
    {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
606
    {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
607
    {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
608
    {9,  {3, 4, 4, 5, 5, 5, 6, 5, 5}}
609
};
610

    
611

    
612
/**
613
 *  Run-value (RLE) tables.
614
 */
615
const RVMapDesc ff_ivi_rvmap_tabs[9] = {
616
{   /* MapTab0 */
617
    5, /* eob_sym */
618
    2, /* esc_sym */
619
    /* run table */
620
    {1,  1,  0,  1,  1,  0,  1,  1,  2,  2,  1,  1,  1,  1,  3,  3,
621
     1,  1,  2,  2,  1,  1,  4,  4,  1,  1,  1,  1,  2,  2,  5,  5,
622
     1,  1,  3,  3,  1,  1,  6,  6,  1,  2,  1,  2,  7,  7,  1,  1,
623
     8,  8,  1,  1,  4,  2,  1,  4,  2,  1,  3,  3,  1,  1,  1,  9,
624
     9,  1,  2,  1,  2,  1,  5,  5,  1,  1, 10, 10,  1,  1,  3,  3,
625
     2,  2,  1,  1, 11, 11,  6,  4,  4,  1,  6,  1,  2,  1,  2, 12,
626
     8,  1, 12,  7,  8,  7,  1, 16,  1, 16,  1,  3,  3, 13,  1, 13,
627
     2,  2,  1, 15,  1,  5, 14, 15,  1,  5, 14,  1, 17,  8, 17,  8,
628
     1,  4,  4,  2,  2,  1, 25, 25, 24, 24,  1,  3,  1,  3,  1,  8,
629
     6,  7,  6,  1, 18,  8, 18,  1,  7, 23,  2,  2, 23,  1,  1, 21,
630
    22,  9,  9, 22, 19,  1, 21,  5, 19,  5,  1, 33, 20, 33, 20,  8,
631
     4,  4,  1, 32,  2,  2,  8,  3, 32, 26,  3,  1,  7,  7, 26,  6,
632
     1,  6,  1,  1, 16,  1, 10,  1, 10,  2, 16, 29, 28,  2, 29, 28,
633
     1, 27,  5,  8,  5, 27,  1,  8,  3,  7,  3, 31, 41, 31,  1, 41,
634
     6,  1,  6,  7,  4,  4,  1,  1,  2,  1,  2, 11, 34, 30, 11,  1,
635
    30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
636

    
637
    /* value table */
638
    { 1,  -1,   0,   2,  -2,   0,   3,  -3,   1,  -1,   4,  -4,   5,  -5,   1,  -1,
639
      6,  -6,   2,  -2,   7,  -7,   1,  -1,   8,  -8,   9,  -9,   3,  -3,   1,  -1,
640
     10, -10,   2,  -2,  11, -11,   1,  -1,  12,   4, -12,  -4,   1,  -1,  13, -13,
641
      1,  -1,  14, -14,   2,   5,  15,  -2,  -5, -15,  -3,   3,  16, -16,  17,   1,
642
     -1, -17,   6,  18,  -6, -18,   2,  -2,  19, -19,   1,  -1,  20, -20,   4,  -4,
643
      7,  -7,  21, -21,   1,  -1,   2,   3,  -3,  22,  -2, -22,   8,  23,  -8,   1,
644
      2, -23,  -1,   2,  -2,  -2,  24,   1, -24,  -1,  25,   5,  -5,   1, -25,  -1,
645
      9,  -9,  26,   1, -26,   3,   1,  -1,  27,  -3,  -1, -27,   1,   3,  -1,  -3,
646
     28,  -4,   4,  10, -10, -28,   1,  -1,   1,  -1,  29,   6, -29,  -6,  30,  -4,
647
      3,   3,  -3, -30,   1,   4,  -1,  31,  -3,   1,  11, -11,  -1, -31,  32,  -1,
648
     -1,   2,  -2,   1,   1, -32,   1,   4,  -1,  -4,  33,  -1,   1,   1,  -1,   5,
649
      5,  -5, -33,  -1, -12,  12,  -5,  -7,   1,   1,   7,  34,   4,  -4,  -1,   4,
650
    -34,  -4,  35,  36,  -2, -35,  -2, -36,   2,  13,   2,  -1,   1, -13,   1,  -1,
651
     37,   1,  -5,   6,   5,  -1,  38,  -6,  -8,   5,   8,  -1,   1,   1, -37,  -1,
652
      5,  39,  -5,  -5,   6,  -6, -38, -39, -14,  40,  14,   2,   1,   1,  -2, -40,
653
     -1,  -2,   2,  -1,  -1,  -1,   1,   1,   1,  -1,   1,  -1,   1,  -1,   1,  -1}
654
},{
655
    /* MapTab1 */
656
    0,  /* eob_sym */
657
    38, /* esc_sym */
658
    /* run table */
659
    {0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  8,  6,  8,  7,
660
     7,  9,  9, 10, 10, 11, 11,  1, 12,  1, 12, 13, 13, 16, 14, 16,
661
    14, 15, 15, 17, 17, 18,  0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
662
    25, 24,  2, 25, 24, 23, 23,  2, 26, 28, 26, 28, 29, 27, 29, 27,
663
    33, 33,  1, 32,  1,  3, 32, 30, 36,  3, 36, 30, 31, 31, 35, 34,
664
    37, 41, 34, 35, 37,  4, 41,  4, 49,  8,  8, 49, 40, 38,  5, 38,
665
    40, 39,  5, 39, 42, 43, 42,  7, 57,  6, 43, 44,  6, 50,  7, 44,
666
    57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58,  1, 51, 58,  1,
667
    52, 59, 53,  9, 52, 55, 55, 59, 53, 56, 54, 56, 54,  9, 64, 64,
668
    60, 63, 60, 63, 61, 62, 61, 62,  2, 10,  2, 10, 11,  1, 11, 13,
669
    12,  1, 12, 13, 16, 16,  8,  8, 14,  3,  3, 15, 14, 15,  4,  4,
670
     1, 17, 17,  5,  1,  7,  7,  5,  6,  1,  2,  2,  6, 22,  1, 25,
671
    21, 22,  8, 24,  1, 21, 25, 24,  8, 18, 18, 23,  9, 20, 23, 33,
672
    29, 33, 20,  1, 19,  1, 29, 36,  9, 36, 19, 41, 28, 57, 32,  3,
673
    28,  3,  1, 27, 49, 49,  1, 32, 26, 26,  2,  4,  4,  7, 57, 41,
674
     2,  7, 10,  5, 37, 16, 10, 27,  8,  8, 13, 16, 37, 13,  1,  5},
675

    
676
    /* value table */
677
    {0,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,   1,  -1,  -1,   1,
678
    -1,   1,  -1,   1,  -1,   1,  -1,   2,   1,  -2,  -1,   1,  -1,   1,   1,  -1,
679
    -1,   1,  -1,   1,  -1,   1,   0,  -1,   1,   1,   1,  -1,   1,  -1,  -1,  -1,
680
     1,   1,   2,  -1,  -1,   1,  -1,  -2,   1,   1,  -1,  -1,   1,   1,  -1,  -1,
681
     1,  -1,   3,   1,  -3,   2,  -1,   1,   1,  -2,  -1,  -1,  -1,   1,   1,   1,
682
     1,   1,  -1,  -1,  -1,   2,  -1,  -2,   1,   2,  -2,  -1,   1,   1,   2,  -1,
683
    -1,   1,  -2,  -1,   1,   1,  -1,   2,   1,   2,  -1,   1,  -2,  -1,  -2,  -1,
684
    -1,   1,   1,  -1,   1,  -1,   1,   1,   1,  -1,  -1,   1,   4,  -1,  -1,  -4,
685
     1,   1,   1,   2,  -1,  -1,   1,  -1,  -1,   1,  -1,  -1,   1,  -2,   1,  -1,
686
     1,   1,  -1,  -1,   1,   1,  -1,  -1,   3,   2,  -3,  -2,   2,   5,  -2,   2,
687
     2,  -5,  -2,  -2,  -2,   2,  -3,   3,   2,   3,  -3,   2,  -2,  -2,   3,  -3,
688
     6,   2,  -2,   3,  -6,   3,  -3,  -3,   3,   7,  -4,   4,  -3,   2,  -7,   2,
689
     2,  -2,  -4,   2,   8,  -2,  -2,  -2,   4,   2,  -2,   2,   3,   2,  -2,  -2,
690
     2,   2,  -2,  -8,  -2,   9,  -2,   2,  -3,  -2,   2,  -2,   2,   2,   2,   4,
691
    -2,  -4,  10,   2,   2,  -2,  -9,  -2,   2,  -2,   5,   4,  -4,   4,  -2,   2,
692
    -5,  -4,  -3,   4,   2,  -3,   3,  -2,  -5,   5,   3,   3,  -2,  -3, -10,  -4}
693
},{
694
    /* MapTab2 */
695
    2,  /* eob_sym */
696
    11, /* esc_sym */
697
    /* run table */
698
    {1,  1,  0,  2,  2,  1,  1,  3,  3,  4,  4,  0,  1,  1,  5,  5,
699
     2,  2,  6,  6,  7,  7,  1,  8,  1,  8,  3,  3,  9,  9,  1,  2,
700
     2,  1,  4, 10,  4, 10, 11, 11,  1,  5, 12, 12,  1,  5, 13, 13,
701
     3,  3,  6,  6,  2,  2, 14, 14, 16, 16, 15,  7, 15,  8,  8,  7,
702
     1,  1, 17, 17,  4,  4,  1,  1, 18, 18,  2,  2,  5,  5, 25,  3,
703
     9,  3, 25,  9, 19, 24, 19, 24,  1, 21, 20,  1, 21, 22, 20, 22,
704
    23, 23,  8,  6, 33,  6,  8, 33,  7,  7, 26, 26,  1, 32,  1, 32,
705
    28,  4, 28, 10, 29, 27, 27, 10, 41,  4, 29,  2,  2, 41, 36, 31,
706
    49, 31, 34, 30, 34, 36, 30, 35,  1, 49, 11,  5, 35, 11,  1,  3,
707
     3,  5, 37, 37,  8, 40,  8, 40, 12, 12, 42, 42,  1, 38, 16, 57,
708
     1,  6, 16, 39, 38,  6,  7,  7, 13, 13, 39, 43,  2, 43, 57,  2,
709
    50,  9, 44,  9, 50,  4, 15, 48, 44,  4,  1, 15, 48, 14, 14,  1,
710
    45, 45,  8,  3,  5,  8, 51, 47,  3, 46, 46, 47,  5, 51,  1, 17,
711
    17, 58,  1, 58,  2, 52, 52,  2, 53,  7, 59,  6,  6, 56, 53, 55,
712
     7, 55,  1, 54, 59, 56, 54, 10,  1, 10,  4, 60,  1, 60,  8,  4,
713
     8, 64, 64, 61,  1, 63,  3, 63, 62, 61,  5, 11,  5,  3, 11, 62},
714

    
715
    /* value table */
716
    { 1,  -1,   0,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   0,   3,  -3,   1,  -1,
717
      2,  -2,   1,  -1,   1,  -1,   4,   1,  -4,  -1,   2,  -2,   1,  -1,   5,   3,
718
     -3,  -5,   2,   1,  -2,  -1,   1,  -1,   6,   2,   1,  -1,  -6,  -2,   1,  -1,
719
      3,  -3,   2,  -2,   4,  -4,   1,  -1,   1,  -1,   1,   2,  -1,   2,  -2,  -2,
720
      7,  -7,   1,  -1,   3,  -3,   8,  -8,   1,  -1,   5,  -5,   3,  -3,   1,   4,
721
      2,  -4,  -1,  -2,   1,   1,  -1,  -1,   9,   1,   1,  -9,  -1,   1,  -1,  -1,
722
      1,  -1,   3,  -3,   1,   3,  -3,  -1,   3,  -3,   1,  -1,  10,   1, -10,  -1,
723
      1,   4,  -1,   2,   1,  -1,   1,  -2,   1,  -4,  -1,   6,  -6,  -1,   1,   1,
724
      1,  -1,   1,   1,  -1,  -1,  -1,   1,  11,  -1,  -2,   4,  -1,   2, -11,   5,
725
     -5,  -4,  -1,   1,   4,   1,  -4,  -1,  -2,   2,   1,  -1,  12,   1,  -2,   1,
726
    -12,   4,   2,   1,  -1,  -4,   4,  -4,   2,  -2,  -1,   1,   7,  -1,  -1,  -7,
727
     -1,  -3,   1,   3,   1,   5,   2,   1,  -1,  -5,  13,  -2,  -1,   2,  -2, -13,
728
      1,  -1,   5,   6,   5,  -5,   1,   1,  -6,   1,  -1,  -1,  -5,  -1,  14,   2,
729
     -2,   1, -14,  -1,   8,   1,  -1,  -8,   1,   5,   1,   5,  -5,   1,  -1,   1,
730
     -5,  -1,  15,   1,  -1,  -1,  -1,   3, -15,  -3,   6,   1,  16,  -1,   6,  -6,
731
     -6,   1,  -1,   1, -16,   1,   7,  -1,   1,  -1,  -6,  -3,   6,  -7,   3,  -1}
732
},{
733
    /* MapTab3 */
734
    0,  /* eob_sym */
735
    35, /* esc_sym */
736
    /* run table */
737
    {0,  1,  1,  2,  2,  3,  3,  4,  4,  1,  1,  5,  5,  6,  6,  7,
738
     7,  8,  8,  9,  9,  2,  2, 10, 10,  1,  1, 11, 11, 12, 12,  3,
739
     3, 13, 13,  0, 14, 14, 16, 15, 16, 15,  4,  4, 17,  1, 17,  1,
740
     5,  5, 18, 18,  2,  2,  6,  6,  8, 19,  7,  8,  7, 19, 20, 20,
741
    21, 21, 22, 24, 22, 24, 23, 23,  1,  1, 25, 25,  3,  3, 26, 26,
742
     9,  9, 27, 27, 28, 28, 33, 29,  4, 33, 29,  1,  4,  1, 32, 32,
743
     2,  2, 31, 10, 30, 10, 30, 31, 34, 34,  5,  5, 36, 36, 35, 41,
744
    35, 11, 41, 11, 37,  1,  8,  8, 37,  6,  1,  6, 40,  7,  7, 40,
745
    12, 38, 12, 39, 39, 38, 49, 13, 49, 13,  3, 42,  3, 42, 16, 16,
746
    43, 43, 14, 14,  1,  1, 44, 15, 44, 15,  2,  2, 57, 48, 50, 48,
747
    57, 50,  4, 45, 45,  4, 46, 47, 47, 46,  1, 51,  1, 17, 17, 51,
748
     8,  9,  9,  5, 58,  8, 58,  5, 52, 52, 55, 56, 53, 56, 55, 59,
749
    59, 53, 54,  1,  6, 54,  7,  7,  6,  1,  2,  3,  2,  3, 64, 60,
750
    60, 10, 10, 64, 61, 62, 61, 63,  1, 63, 62,  1, 18, 24, 18,  4,
751
    25,  4,  8, 21, 21,  1, 24, 22, 25, 22,  8, 11, 19, 11, 23,  1,
752
    20, 23, 19, 20,  5, 12,  5,  1, 16,  2, 12, 13,  2, 13,  1, 16},
753

    
754
    /* value table */
755
    { 0,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   1,
756
     -1,   1,  -1,   1,  -1,   2,  -2,   1,  -1,   3,  -3,   1,  -1,   1,  -1,   2,
757
     -2,   1,  -1,   0,   1,  -1,   1,   1,  -1,  -1,   2,  -2,   1,   4,  -1,  -4,
758
      2,  -2,   1,  -1,  -3,   3,   2,  -2,   2,   1,   2,  -2,  -2,  -1,   1,  -1,
759
      1,  -1,   1,   1,  -1,  -1,   1,  -1,   5,  -5,   1,  -1,   3,  -3,   1,  -1,
760
      2,  -2,   1,  -1,   1,  -1,   1,   1,   3,  -1,  -1,   6,  -3,  -6,  -1,   1,
761
      4,  -4,   1,   2,   1,  -2,  -1,  -1,   1,  -1,   3,  -3,   1,  -1,   1,   1,
762
     -1,   2,  -1,  -2,   1,   7,  -3,   3,  -1,   3,  -7,  -3,   1,  -3,   3,  -1,
763
      2,   1,  -2,   1,  -1,  -1,   1,   2,  -1,  -2,  -4,  -1,   4,   1,   2,  -2,
764
      1,  -1,  -2,   2,   8,  -8,  -1,   2,   1,  -2,  -5,   5,   1,  -1,  -1,   1,
765
     -1,   1,   4,  -1,   1,  -4,  -1,  -1,   1,   1,   9,   1,  -9,   2,  -2,  -1,
766
     -4,   3,  -3,  -4,  -1,   4,   1,   4,   1,  -1,   1,  -1,   1,   1,  -1,   1,
767
     -1,  -1,  -1,  10,   4,   1,   4,  -4,  -4, -10,   6,   5,  -6,  -5,   1,  -1,
768
      1,   3,  -3,  -1,   1,  -1,  -1,  -1,  11,   1,   1, -11,  -2,  -2,   2,   5,
769
     -2,  -5,  -5,   2,  -2,  12,   2,  -2,   2,   2,   5,  -3,  -2,   3,  -2, -12,
770
     -2,   2,   2,   2,  -5,   3,   5,  13,  -3,   7,  -3,  -3,  -7,   3, -13,   3}
771
},{
772
    /* MapTab4 */
773
    0,  /* eob_sym */
774
    34, /* esc_sym */
775
    /* run table */
776
    {0,  1,  1,  1,  2,  2,  1,  3,  3,  1,  1,  1,  4,  4,  1,  5,
777
     2,  1,  5,  2,  1,  1,  6,  6,  1,  1,  1,  1,  1,  7,  3,  1,
778
     2,  3,  0,  1,  2,  7,  1,  1,  1,  8,  1,  1,  8,  1,  1,  1,
779
     9,  1,  9,  1,  2,  1,  1,  2,  1,  1, 10,  4,  1, 10,  1,  4,
780
     1,  1,  1,  1,  1,  3,  1,  1,  1,  3,  2,  1,  5,  1,  1,  1,
781
     2,  5,  1, 11,  1, 11,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
782
     2,  1,  6,  1,  6,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1, 12,
783
     3,  1, 12,  1,  1,  1,  2,  1,  1,  3,  1,  1,  1,  1,  1,  1,
784
     4,  1,  1,  1,  2,  1,  1,  4,  1,  1,  1,  1,  1,  1,  2,  1,
785
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  3,  1,  2,  1,  1,  5,
786
     1,  1,  1,  1,  1,  7,  1,  7,  1,  1,  2,  3,  1,  1,  1,  1,
787
     5,  1,  1,  1,  1,  1,  1,  2, 13,  1,  1,  1,  1,  1,  1,  1,
788
     1,  1,  1,  1,  1,  1,  1,  1, 13,  2,  1,  1,  4,  1,  1,  1,
789
     3,  1,  6,  1,  1,  1, 14,  1,  1,  1,  1,  1, 14,  6,  1,  1,
790
     1,  1, 15,  2,  4,  1,  2,  3, 15,  1,  1,  1,  8,  1,  1,  8,
791
     1,  1,  1,  1,  1,  1,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1},
792

    
793
    /* value table */
794
    { 0,   1,  -1,   2,   1,  -1,  -2,   1,  -1,   3,  -3,   4,   1,  -1,  -4,   1,
795
      2,   5,  -1,  -2,  -5,   6,   1,  -1,  -6,   7,  -7,   8,  -8,   1,   2,   9,
796
      3,  -2,   0,  -9,  -3,  -1,  10, -10,  11,   1, -11,  12,  -1, -12,  13, -13,
797
      1,  14,  -1, -14,   4,  15, -15,  -4,  16, -16,   1,   2,  17,  -1, -17,  -2,
798
     18, -18,  19, -19,  20,   3, -20,  21, -21,  -3,   5,  22,   2, -22, -23,  23,
799
     -5,  -2,  24,   1, -24,  -1,  25, -25,  26, -26, -27,  27,  28,  29, -28, -29,
800
      6,  30,   2, -31,  -2, -30,  31,  -6, -32,  32,  33, -33,  34, -35, -34,   1,
801
      4, -36,  -1,  35,  37,  36,   7, -37,  38,  -4, -38,  39,  41,  40, -40, -39,
802
      3,  42, -43, -41,  -7, -42,  43,  -3,  44, -44,  45, -45,  46,  47,   8, -47,
803
    -48, -46,  50, -50,  48,  49,  51, -49,  52, -52,   5, -51,  -8, -53,  53,   3,
804
    -56,  56,  55,  54, -54,   2,  60,  -2, -55,  58,   9,  -5,  59,  57, -57, -63,
805
     -3, -58, -60, -61,  61, -59, -62,  -9,   1,  64,  62,  69, -64,  63,  65, -67,
806
    -68,  66, -65,  68, -66, -69,  67, -70,  -1,  10,  71, -71,   4,  73,  72,  70,
807
      6, -76,  -3,  74, -78, -74,   1,  78,  80, -72, -75,  76,  -1,   3, -73,  79,
808
     75,  77,   1,  11,  -4, -79, -10,  -6,  -1, -77, -83, -80,   2,  81, -84,  -2,
809
     83, -81,  82, -82,  84, -87, -86,  85, -11, -85,  86, -89,  87, -88,  88,  89}
810
},{
811
    /* MapTab5 */
812
    2,  /* eob_sym */
813
    33, /* esc_sym */
814
    /* run table */
815
    {1,  1,  0,  2,  1,  2,  1,  3,  3,  1,  1,  4,  4,  2,  2,  1,
816
     1,  5,  5,  6,  1,  6,  1,  7,  7,  3,  3,  2,  8,  2,  8,  1,
817
     1,  0,  9,  9,  1,  1, 10,  4, 10,  4, 11, 11,  2,  1,  2,  1,
818
    12, 12,  3,  3,  1,  1, 13,  5,  5, 13, 14,  1,  1, 14,  2,  2,
819
     6,  6, 15,  1,  1, 15, 16,  4,  7, 16,  4,  7,  1,  1,  3,  3,
820
     8,  8,  2,  2,  1,  1, 17, 17,  1,  1, 18, 18,  5,  5,  2,  2,
821
     1,  1,  9, 19,  9, 19, 20,  3,  3, 20,  1, 10, 21,  1, 10,  4,
822
     4, 21, 22,  6,  6, 22,  1,  1, 23, 24,  2,  2, 23, 24, 11,  1,
823
     1, 11,  7, 25,  7,  1,  1, 25,  8,  8,  3, 26,  3,  1, 12,  2,
824
     2, 26,  1, 12,  5,  5, 27,  4,  1,  4,  1, 27, 28,  1, 28, 13,
825
     1, 13,  2, 29,  2,  1, 32,  6,  1, 30, 14, 29, 14,  6,  3, 31,
826
     3,  1, 30,  1, 32, 31, 33,  9, 33,  1,  1,  7,  9,  7,  2,  2,
827
     1,  1,  4, 36, 34,  4,  5, 10, 10,  5, 34,  1,  1, 35,  8,  8,
828
    36,  3, 35,  1, 15,  3,  2,  1, 16, 15, 16,  2, 37,  1, 37,  1,
829
     1,  1,  6,  6, 38,  1, 38, 11,  1, 39, 39, 40, 11,  2, 41,  4,
830
    40,  1,  2,  4,  1,  1,  1, 41,  3,  1,  3,  1,  5,  7,  5,  7},
831

    
832
    /* value table */
833
    { 1,  -1,   0,   1,   2,  -1,  -2,   1,  -1,   3,  -3,   1,  -1,   2,  -2,   4,
834
     -4,   1,  -1,   1,   5,  -1,  -5,   1,  -1,   2,  -2,   3,   1,  -3,  -1,   6,
835
     -6,   0,   1,  -1,   7,  -7,   1,   2,  -1,  -2,   1,  -1,   4,   8,  -4,  -8,
836
      1,  -1,   3,  -3,   9,  -9,   1,   2,  -2,  -1,   1,  10, -10,  -1,   5,  -5,
837
      2,  -2,   1,  11, -11,  -1,   1,   3,   2,  -1,  -3,  -2,  12, -12,   4,  -4,
838
      2,  -2,  -6,   6,  13, -13,   1,  -1,  14, -14,   1,  -1,   3,  -3,   7,  -7,
839
     15, -15,   2,   1,  -2,  -1,   1,   5,  -5,  -1, -16,   2,   1,  16,  -2,   4,
840
     -4,  -1,   1,   3,  -3,  -1,  17, -17,   1,   1,  -8,   8,  -1,  -1,   2,  18,
841
    -18,  -2,   3,   1,  -3,  19, -19,  -1,   3,  -3,   6,   1,  -6,  20,   2,   9,
842
     -9,  -1, -20,  -2,   4,  -4,   1,  -5,  21,   5, -21,  -1,   1, -22,  -1,   2,
843
     22,  -2,  10,   1, -10,  23,   1,   4, -23,   1,   2,  -1,  -2,  -4,  -7,   1,
844
      7, -24,  -1,  24,  -1,  -1,   1,   3,  -1, -25,  25,   4,  -3,  -4,  11, -11,
845
     26, -26,   6,   1,   1,  -6,  -5,  -3,   3,   5,  -1, -27,  27,   1,   4,  -4,
846
     -1,  -8,  -1,  28,   2,   8, -12, -28,  -2,  -2,   2,  12,  -1,  29,   1, -29,
847
     30, -30,   5,  -5,   1, -31,  -1,   3,  31,  -1,   1,   1,  -3, -13,   1,  -7,
848
     -1, -32,  13,   7,  32,  33, -33,  -1,  -9, -34,   9,  34,  -6,   5,   6,  -5}
849
},{
850
    /* MapTab6 */
851
    2,  /* eob_sym */
852
    13, /* esc_sym */
853
    /* run table */
854
    {1,  1,  0,  1,  1,  2,  2,  1,  1,  3,  3,  1,  1,  0,  2,  2,
855
     4,  1,  4,  1,  1,  1,  5,  5,  1,  1,  6,  6,  2,  2,  1,  1,
856
     3,  3,  7,  7,  1,  1,  8,  8,  1,  1,  2,  2,  1,  9,  1,  9,
857
     4,  4, 10,  1,  1, 10,  1,  1, 11, 11,  3,  3,  1,  2,  1,  2,
858
     1,  1, 12, 12,  5,  5,  1,  1, 13,  1,  1, 13,  2,  2,  1,  1,
859
     6,  6,  1,  1,  4, 14,  4, 14,  3,  1,  3,  1,  1,  1, 15,  7,
860
    15,  2,  2,  7,  1,  1,  1,  8,  1,  8, 16, 16,  1,  1,  1,  1,
861
     2,  1,  1,  2,  1,  1,  3,  5,  5,  3,  4,  1,  1,  4,  1,  1,
862
    17, 17,  9,  1,  1,  9,  2,  2,  1,  1, 10, 10,  1,  6,  1,  1,
863
     6, 18,  1,  1, 18,  1,  1,  1,  2,  2,  3,  1,  3,  1,  1,  1,
864
     4,  1, 19,  1, 19,  7,  1,  1, 20,  1,  4, 20,  1,  7, 11,  2,
865
     1, 11, 21,  2,  8,  5,  1,  8,  1,  5, 21,  1,  1,  1, 22,  1,
866
     1, 22,  1,  1,  3,  3,  1, 23,  2, 12, 24,  1,  1,  2,  1,  1,
867
    12, 23,  1,  1, 24,  1,  1,  1,  4,  1,  1,  1,  2,  1,  6,  6,
868
     4,  2,  1,  1,  1,  1,  1,  1,  1, 14, 13,  3,  1, 25,  9, 25,
869
    14,  1,  9,  3, 13,  1,  1,  1,  1,  1, 10,  1,  1,  2, 10,  2},
870

    
871
    /* value table */
872
    {-20,  -1,   0,   2,  -2,   1,  -1,   3,  -3,   1,  -1,   4,  -4,   0,   2,  -2,
873
       1,   5,  -1,  -5,   6,  -6,   1,  -1,   7,  -7,   1,  -1,   3,  -3,   8,  -8,
874
       2,  -2,   1,  -1,   9,  -9,   1,  -1,  10, -10,   4,  -4,  11,   1, -11,  -1,
875
       2,  -2,   1,  12, -12,  -1,  13, -13,   1,  -1,   3,  -3,  14,   5, -14,  -5,
876
     -15,  15,  -1,   1,   2,  -2,  16, -16,   1,  17, -17,  -1,   6,  -6,  18, -18,
877
       2,  -2, -19,  19,  -3,   1,   3,  -1,   4,  20,  -4,   1, -21,  21,   1,   2,
878
      -1,  -7,   7,  -2,  22, -22,  23,   2, -23,  -2,   1,  -1, -24,  24, -25,  25,
879
      -8, -26,  26,   8, -27,  27,   5,   3,  -3,  -5,  -4,  28, -28,   4,  29, -29,
880
       1,  -1,  -2, -30,  30,   2,   9,  -9, -31,  31,   2,  -2, -32,   3,  32, -33,
881
      -3,   1,  33, -34,  -1,  34, -35,  35, -10,  10,  -6,  36,   6, -36,  37, -37,
882
      -5,  38,   1, -38,  -1,   3,  39, -39,  -1,  40,   5,   1, -40,  -3,   2, -11,
883
     -41,  -2,   1,  11,  -3,  -4,  41,   3,  42,   4,  -1, -43, -42,  43,   1, -44,
884
      45,  -1,  44, -45,  -7,   7, -46,   1, -12,   2,   1, -47,  46,  12,  47,  48,
885
      -2,  -1, -48,  49,  -1, -50, -49,  50,  -6, -51,  51,  52, -13,  53,  -4,   4,
886
       6,  13, -53, -52, -54,  55,  54, -55, -56,  -2,   2,  -8,  56,   1,  -3,  -1,
887
       2,  58,   3,   8,  -2,  57, -58, -60, -59, -57,  -3,  60,  59, -14,   3,  14}
888
},{
889
    /* MapTab7 */
890
    2,  /* eob_sym */
891
    38, /* esc_sym */
892
    /* run table */
893
    {1,  1,  0,  2,  2,  1,  1,  3,  3,  4,  4,  5,  5,  1,  1,  6,
894
     6,  2,  2,  7,  7,  8,  8,  1,  1,  3,  3,  9,  9, 10, 10,  1,
895
     1,  2,  2,  4,  4, 11,  0, 11, 12, 12, 13, 13,  1,  1,  5,  5,
896
    14, 14, 15, 16, 15, 16,  3,  3,  1,  6,  1,  6,  2,  2,  7,  7,
897
     8,  8, 17, 17,  1,  1,  4,  4, 18, 18,  2,  2,  1, 19,  1, 20,
898
    19, 20, 21, 21,  3,  3, 22, 22,  5,  5, 24,  1,  1, 23,  9, 23,
899
    24,  9,  2,  2, 10,  1,  1, 10,  6,  6, 25,  4,  4, 25,  7,  7,
900
    26,  8,  1,  8,  3,  1, 26,  3, 11, 11, 27, 27,  2, 28,  1,  2,
901
    28,  1, 12, 12,  5,  5, 29, 13, 13, 29, 32,  1,  1, 33, 31, 30,
902
    32,  4, 30, 33,  4, 31,  3, 14,  1,  1,  3, 34, 34,  2,  2, 14,
903
     6,  6, 35, 36, 35, 36,  1, 15,  1, 16, 16, 15,  7,  9,  7,  9,
904
    37,  8,  8, 37,  1,  1, 39,  2, 38, 39,  2, 40,  5, 38, 40,  5,
905
     3,  3,  4,  4, 10, 10,  1,  1,  1,  1, 41,  2, 41,  2,  6,  6,
906
     1,  1, 11, 42, 11, 43,  3, 42,  3, 17,  4, 43,  1, 17,  7,  1,
907
     8, 44,  4,  7, 44,  5,  8,  2,  5,  1,  2, 48, 45,  1, 12, 45,
908
    12, 48, 13, 13,  1,  9,  9, 46,  1, 46, 47, 47, 49, 18, 18, 49},
909

    
910
    /* value table */
911
    { 1,  -1,   0,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   1,  -1,   3,  -3,   1,
912
     -1,  -2,   2,   1,  -1,   1,  -1,   4,  -4,  -2,   2,   1,  -1,   1,  -1,   5,
913
     -5,  -3,   3,   2,  -2,   1,   0,  -1,   1,  -1,   1,  -1,   6,  -6,   2,  -2,
914
      1,  -1,   1,   1,  -1,  -1,  -3,   3,   7,   2,  -7,  -2,  -4,   4,   2,  -2,
915
      2,  -2,   1,  -1,   8,  -8,   3,  -3,   1,  -1,  -5,   5,   9,   1,  -9,   1,
916
     -1,  -1,   1,  -1,  -4,   4,   1,  -1,   3,  -3,   1, -10,  10,   1,   2,  -1,
917
     -1,  -2,   6,  -6,   2,  11, -11,  -2,   3,  -3,   1,  -4,   4,  -1,   3,  -3,
918
      1,   3,  12,  -3,  -5, -12,  -1,   5,   2,  -2,   1,  -1,  -7,   1,  13,   7,
919
     -1, -13,   2,  -2,   4,  -4,   1,   2,  -2,  -1,   1,  14, -14,   1,   1,   1,
920
     -1,  -5,  -1,  -1,   5,  -1,  -6,   2, -15,  15,   6,   1,  -1,  -8,   8,  -2,
921
     -4,   4,   1,   1,  -1,  -1,  16,   2, -16,  -2,   2,  -2,   4,   3,  -4,  -3,
922
     -1,  -4,   4,   1, -17,  17,  -1,  -9,   1,   1,   9,   1,  -5,  -1,  -1,   5,
923
     -7,   7,   6,  -6,   3,  -3,  18, -18,  19, -19,   1, -10,  -1,  10,  -5,   5,
924
     20, -20,  -3,   1,   3,   1,   8,  -1,  -8,   2,   7,  -1, -21,  -2,   5,  21,
925
      5,  -1,  -7,  -5,   1,  -6,  -5, -11,   6,  22,  11,   1,   1, -22,  -3,  -1,
926
      3,  -1,   3,  -3, -23,   4,  -4,   1,  23,  -1,   1,  -1,   1,  -2,   2,  -1}
927
},{
928
    /* MapTab8 */
929
    4,  /* eob_sym */
930
    11, /* esc_sym */
931
    /* run table */
932
    {1,  1,  1,  1,  0,  2,  2,  1,  1,  3,  3,  0,  1,  1,  2,  2,
933
     4,  4,  1,  1,  5,  5,  1,  1,  2,  2,  3,  3,  6,  6,  1,  1,
934
     7,  7,  8,  1,  8,  2,  2,  1,  4,  4,  1,  3,  1,  3,  9,  9,
935
     2,  2,  1,  5,  1,  5, 10, 10,  1,  1, 11, 11,  3,  6,  3,  4,
936
     4,  6,  2,  2,  1, 12,  1, 12,  7, 13,  7, 13,  1,  1,  8,  8,
937
     2,  2, 14, 14, 16, 15, 16,  5,  5,  1,  3, 15,  1,  3,  4,  4,
938
     1,  1, 17, 17,  2,  2,  6,  6,  1, 18,  1, 18, 22, 21, 22, 21,
939
    25, 24, 25, 19,  9, 20,  9, 23, 19, 24, 20,  3, 23,  7,  3,  1,
940
     1,  7, 28, 26, 29,  5, 28, 26,  5,  8, 29,  4,  8, 27,  2,  2,
941
     4, 27,  1,  1, 10, 36, 10, 33, 33, 36, 30,  1, 32, 32,  1, 30,
942
     6, 31, 31, 35,  3,  6, 11, 11,  3,  2, 35,  2, 34,  1, 34,  1,
943
    37, 37, 12,  7, 12,  5, 41,  5,  4,  7,  1,  8, 13,  4,  1, 41,
944
    13, 38,  8, 38,  9,  1, 40, 40,  9,  1, 39,  2,  2, 49, 39, 42,
945
     3,  3, 14, 16, 49, 14, 16, 42, 43, 43,  6,  6, 15,  1,  1, 15,
946
    44, 44,  1,  1, 50, 48,  4,  5,  4,  7,  5,  2, 10, 10, 48,  7,
947
    50, 45,  2,  1, 45,  8,  8,  1, 46, 46,  3, 47, 47,  3,  1,  1},
948

    
949
    /* value table */
950
    { 1,  -1,   2,  -2,   0,   1,  -1,   3,  -3,   1,  -1,   0,   4,  -4,   2,  -2,
951
      1,  -1,   5,  -5,   1,  -1,   6,  -6,   3,  -3,   2,  -2,   1,  -1,   7,  -7,
952
      1,  -1,   1,   8,  -1,   4,  -4,  -8,   2,  -2,   9,   3,  -9,  -3,   1,  -1,
953
      5,  -5,  10,   2, -10,  -2,   1,  -1,  11, -11,   1,  -1,  -4,   2,   4,   3,
954
     -3,  -2,   6,  -6,  12,   1, -12,  -1,   2,   1,  -2,  -1,  13, -13,   2,  -2,
955
      7,  -7,   1,  -1,   1,   1,  -1,   3,  -3,  14,   5,  -1, -14,  -5,   4,  -4,
956
     15, -15,   1,  -1,   8,  -8,  -3,   3,  16,   1, -16,  -1,   1,   1,  -1,  -1,
957
      1,   1,  -1,   1,   2,   1,  -2,   1,  -1,  -1,  -1,   6,  -1,   3,  -6,  17,
958
    -17,  -3,   1,   1,   1,   4,  -1,  -1,  -4,   3,  -1,   5,  -3,  -1,  -9,   9,
959
     -5,   1,  18, -18,   2,   1,  -2,   1,  -1,  -1,   1,  19,  -1,   1, -19,  -1,
960
      4,   1,  -1,   1,   7,  -4,  -2,   2,  -7,  10,  -1, -10,   1,  20,  -1, -20,
961
      1,  -1,   2,   4,  -2,   5,   1,  -5,   6,  -4,  21,   4,   2,  -6, -21,  -1,
962
     -2,   1,  -4,  -1,  -3,  22,  -1,   1,   3, -22,  -1,  11, -11,   1,   1,   1,
963
      8,  -8,   2,   2,  -1,  -2,  -2,  -1,   1,  -1,  -5,   5,   2,  23, -23,  -2,
964
      1,  -1,  24, -24,  -1,  -1,   7,   6,  -7,   5,  -6,  12,  -3,   3,   1,  -5,
965
      1,   1, -12,  25,  -1,  -5,   5, -25,  -1,   1,   9,   1,  -1,  -9,  26, -26}
966
}
967
};