Statistics
| Branch: | Revision:

ffmpeg / libavcodec / ivi_common.c @ 9c6b3b97

History | View | Annotate | Download (45.9 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
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, int desc_coded, int which_tab,
112
                         IVIHuffTab *huff_tab, AVCodecContext *avctx)
113
{
114
    int         i, result;
115
    IVIHuffDesc new_huff;
116

    
117
    if (!desc_coded) {
118
        /* select default table */
119
        huff_tab->tab = (which_tab) ? &ff_ivi_blk_vlc_tabs[7]
120
            : &ff_ivi_mb_vlc_tabs [7];
121
    } else {
122
        huff_tab->tab_sel = get_bits(gb, 3);
123
        if (huff_tab->tab_sel == 7) {
124
            /* custom huffman table (explicitly encoded) */
125
            new_huff.num_rows = get_bits(gb, 4);
126

    
127
            for (i = 0; i < new_huff.num_rows; i++)
128
                new_huff.xbits[i] = get_bits(gb, 4);
129

    
130
            /* Have we got the same custom table? Rebuild if not. */
131
            if (ff_ivi_huff_desc_cmp(&new_huff, &huff_tab->cust_desc)) {
132
                ff_ivi_huff_desc_copy(&huff_tab->cust_desc, &new_huff);
133

    
134
                if (huff_tab->cust_tab.table)
135
                    free_vlc(&huff_tab->cust_tab);
136
                result = ff_ivi_create_huff_from_desc(&huff_tab->cust_desc,
137
                        &huff_tab->cust_tab, 0);
138
                if (result) {
139
                    av_log(avctx, AV_LOG_ERROR,
140
                           "Error while initializing custom vlc table!\n");
141
                    return -1;
142
                }
143
            }
144
            huff_tab->tab = &huff_tab->cust_tab;
145
        } else {
146
            /* select one of predefined tables */
147
            huff_tab->tab = (which_tab) ? &ff_ivi_blk_vlc_tabs[huff_tab->tab_sel]
148
                : &ff_ivi_mb_vlc_tabs [huff_tab->tab_sel];
149
        }
150
    }
151

    
152
    return 0;
153
}
154

    
155
int ff_ivi_huff_desc_cmp(const IVIHuffDesc *desc1, const IVIHuffDesc *desc2)
156
{
157
    return    desc1->num_rows != desc2->num_rows
158
           || memcmp(desc1->xbits, desc2->xbits, desc1->num_rows);
159
}
160

    
161
void ff_ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src)
162
{
163
    dst->num_rows = src->num_rows;
164
    memcpy(dst->xbits, src->xbits, src->num_rows);
165
}
166

    
167
int av_cold ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg)
168
{
169
    int         p, b;
170
    uint32_t    b_width, b_height, align_fac, width_aligned, height_aligned, buf_size;
171
    IVIBandDesc *band;
172

    
173
    ff_ivi_free_buffers(planes);
174

    
175
    /* fill in the descriptor of the luminance plane */
176
    planes[0].width     = cfg->pic_width;
177
    planes[0].height    = cfg->pic_height;
178
    planes[0].num_bands = cfg->luma_bands;
179

    
180
    /* fill in the descriptors of the chrominance planes */
181
    planes[1].width     = planes[2].width     = (cfg->pic_width  + 3) >> 2;
182
    planes[1].height    = planes[2].height    = (cfg->pic_height + 3) >> 2;
183
    planes[1].num_bands = planes[2].num_bands = cfg->chroma_bands;
184

    
185
    for (p = 0; p < 3; p++) {
186
        planes[p].bands = av_mallocz(planes[p].num_bands * sizeof(IVIBandDesc));
187
        if (!planes[p].bands)
188
            return AVERROR(ENOMEM);
189

    
190
        /* select band dimensions: if there is only one band then it
191
         *  has the full size, if there are several bands each of them
192
         *  has only half size */
193
        b_width  = planes[p].num_bands == 1 ? planes[p].width  : (planes[p].width  + 1) >> 1;
194
        b_height = planes[p].num_bands == 1 ? planes[p].height : (planes[p].height + 1) >> 1;
195

    
196
        /* luma   band buffers will be aligned on 16x16 (max macroblock size) */
197
        /* chroma band buffers will be aligned on   8x8 (max macroblock size) */
198
        align_fac       = p ? 8 : 16;
199
        width_aligned   = FFALIGN(b_width , align_fac);
200
        height_aligned  = FFALIGN(b_height, align_fac);
201
        buf_size        = width_aligned * height_aligned * sizeof(int16_t);
202

    
203
        for (b = 0; b < planes[p].num_bands; b++) {
204
            band = &planes[p].bands[b]; /* select appropriate plane/band */
205
            band->plane    = p;
206
            band->band_num = b;
207
            band->width    = b_width;
208
            band->height   = b_height;
209
            band->pitch    = width_aligned;
210
            band->bufs[0]  = av_malloc(buf_size);
211
            band->bufs[1]  = av_malloc(buf_size);
212
            if (!band->bufs[0] || !band->bufs[1])
213
                return AVERROR(ENOMEM);
214

    
215
            /* allocate the 3rd band buffer for scalability mode */
216
            if (cfg->luma_bands > 1) {
217
                band->bufs[2] = av_malloc(buf_size);
218
                if (!band->bufs[2])
219
                    return AVERROR(ENOMEM);
220
            }
221

    
222
            planes[p].bands[0].blk_vlc.cust_desc.num_rows = 0; /* reset custom vlc */
223
        }
224
    }
225

    
226
    return 0;
227
}
228

    
229
void av_cold ff_ivi_free_buffers(IVIPlaneDesc *planes)
230
{
231
    int p, b, t;
232

    
233
    for (p = 0; p < 3; p++) {
234
        for (b = 0; b < planes[p].num_bands; b++) {
235
            av_freep(&planes[p].bands[b].bufs[0]);
236
            av_freep(&planes[p].bands[b].bufs[1]);
237
            av_freep(&planes[p].bands[b].bufs[2]);
238

    
239
            if (planes[p].bands[b].blk_vlc.cust_tab.table)
240
                free_vlc(&planes[p].bands[b].blk_vlc.cust_tab);
241
            for (t = 0; t < planes[p].bands[b].num_tiles; t++)
242
                av_freep(&planes[p].bands[b].tiles[t].mbs);
243
            av_freep(&planes[p].bands[b].tiles);
244
        }
245
        av_freep(&planes[p].bands);
246
    }
247
}
248

    
249
int av_cold ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height)
250
{
251
    int         p, b, x, y, x_tiles, y_tiles, t_width, t_height;
252
    IVIBandDesc *band;
253
    IVITile     *tile, *ref_tile;
254

    
255
    for (p = 0; p < 3; p++) {
256
        t_width  = !p ? tile_width  : (tile_width  + 3) >> 2;
257
        t_height = !p ? tile_height : (tile_height + 3) >> 2;
258

    
259
        if (!p && planes[0].num_bands == 4) {
260
            t_width  >>= 1;
261
            t_height >>= 1;
262
        }
263

    
264
        for (b = 0; b < planes[p].num_bands; b++) {
265
            band = &planes[p].bands[b];
266
            x_tiles = IVI_NUM_TILES(band->width, t_width);
267
            y_tiles = IVI_NUM_TILES(band->height, t_height);
268
            band->num_tiles = x_tiles * y_tiles;
269

    
270
            av_freep(&band->tiles);
271
            band->tiles = av_mallocz(band->num_tiles * sizeof(IVITile));
272
            if (!band->tiles)
273
                return AVERROR(ENOMEM);
274

    
275
            tile = band->tiles;
276

    
277
            /* use the first luma band as reference for motion vectors
278
             * and quant */
279
            ref_tile = planes[0].bands[0].tiles;
280

    
281
            for (y = 0; y < band->height; y += t_height) {
282
                for (x = 0; x < band->width; x += t_width) {
283
                    tile->xpos     = x;
284
                    tile->ypos     = y;
285
                    tile->width    = FFMIN(band->width - x,  t_width);
286
                    tile->height   = FFMIN(band->height - y, t_height);
287
                    tile->is_empty = tile->data_size = 0;
288
                    /* calculate number of macroblocks */
289
                    tile->num_MBs  = IVI_MBs_PER_TILE(tile->width, tile->height,
290
                                                      band->mb_size);
291

    
292
                    av_freep(&tile->mbs);
293
                    tile->mbs = av_malloc(tile->num_MBs * sizeof(IVIMbInfo));
294
                    if (!tile->mbs)
295
                        return AVERROR(ENOMEM);
296

    
297
                    tile->ref_mbs = 0;
298
                    if (p || b) {
299
                        tile->ref_mbs = ref_tile->mbs;
300
                        ref_tile++;
301
                    }
302

    
303
                    tile++;
304
                }
305
            }
306

    
307
        }// for b
308
    }// for p
309

    
310
    return 0;
311
}
312

    
313
int ff_ivi_dec_tile_data_size(GetBitContext *gb)
314
{
315
    int    len;
316

    
317
    len = 0;
318
    if (get_bits1(gb)) {
319
        len = get_bits(gb, 8);
320
        if (len == 255)
321
            len = get_bits_long(gb, 24);
322
    }
323

    
324
    /* align the bitstream reader on the byte boundary */
325
    align_get_bits(gb);
326

    
327
    return len;
328
}
329

    
330
int ff_ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile)
331
{
332
    int         mbn, blk, num_blocks, num_coeffs, blk_size, scan_pos, run, val,
333
                pos, is_intra, mc_type, mv_x, mv_y, col_mask;
334
    uint8_t     col_flags[8];
335
    int32_t     prev_dc, trvec[64];
336
    uint32_t    cbp, sym, lo, hi, quant, buf_offs, q;
337
    IVIMbInfo   *mb;
338
    RVMapDesc   *rvmap = band->rv_map;
339
    void (*mc_with_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
340
    void (*mc_no_delta_func)  (int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
341
    const uint8_t   *base_tab, *scale_tab;
342

    
343
    prev_dc = 0; /* init intra prediction for the DC coefficient */
344

    
345
    blk_size   = band->blk_size;
346
    col_mask   = blk_size - 1; /* column mask for tracking non-zero coeffs */
347
    num_blocks = (band->mb_size != blk_size) ? 4 : 1; /* number of blocks per mb */
348
    num_coeffs = blk_size * blk_size;
349
    if (blk_size == 8) {
350
        mc_with_delta_func = ff_ivi_mc_8x8_delta;
351
        mc_no_delta_func   = ff_ivi_mc_8x8_no_delta;
352
    } else {
353
        mc_with_delta_func = ff_ivi_mc_4x4_delta;
354
        mc_no_delta_func   = ff_ivi_mc_4x4_no_delta;
355
    }
356

    
357
    for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
358
        is_intra = !mb->type;
359
        cbp      = mb->cbp;
360
        buf_offs = mb->buf_offs;
361

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

    
364
        base_tab  = is_intra ? band->intra_base  : band->inter_base;
365
        scale_tab = is_intra ? band->intra_scale : band->inter_scale;
366

    
367
        if (!is_intra) {
368
            mv_x = mb->mv_x;
369
            mv_y = mb->mv_y;
370
            if (!band->is_halfpel) {
371
                mc_type = 0; /* we have only fullpel vectors */
372
            } else {
373
                mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
374
                mv_x >>= 1;
375
                mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
376
            }
377
        }
378

    
379
        for (blk = 0; blk < num_blocks; blk++) {
380
            /* adjust block position in the buffer according to its number */
381
            if (blk & 1) {
382
                buf_offs += blk_size;
383
            } else if (blk == 2) {
384
                buf_offs -= blk_size;
385
                buf_offs += blk_size * band->pitch;
386
            }
387

    
388
            if (cbp & 1) { /* block coded ? */
389
                scan_pos = -1;
390
                memset(trvec, 0, num_coeffs*sizeof(trvec[0])); /* zero transform vector */
391
                memset(col_flags, 0, sizeof(col_flags));      /* zero column flags */
392

    
393
                while (scan_pos <= num_coeffs) {
394
                    sym = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
395
                    if (sym == rvmap->eob_sym)
396
                        break; /* End of block */
397

    
398
                    if (sym == rvmap->esc_sym) { /* Escape - run/val explicitly coded using 3 vlc codes */
399
                        run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1;
400
                        lo  = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
401
                        hi  = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
402
                        val = IVI_TOSIGNED((hi << 6) | lo); /* merge them and convert into signed val */
403
                    } else {
404
                        run = rvmap->runtab[sym];
405
                        val = rvmap->valtab[sym];
406
                    }
407

    
408
                    /* de-zigzag and dequantize */
409
                    scan_pos += run;
410
                    if (scan_pos >= num_coeffs)
411
                        break;
412
                    pos = band->scan[scan_pos];
413

    
414
                    if (IVI_DEBUG && !val)
415
                        av_log(NULL, AV_LOG_ERROR, "Val = 0 encountered!\n");
416

    
417
                    q = (base_tab[pos] * scale_tab[quant]) >> 8;
418
                    if (q > 1)
419
                        val = val * q + FFSIGN(val) * ((q >> 1) - (q & 1));
420
                    trvec[pos] = val;
421
                    col_flags[pos & col_mask] |= !!val; /* track columns containing non-zero coeffs */
422
                }// while
423

    
424
                if (scan_pos >= num_coeffs && sym != rvmap->eob_sym)
425
                    return -1; /* corrupt block data */
426

    
427
                /* undoing DC coeff prediction for intra-blocks */
428
                if (is_intra && band->is_2d_trans) {
429
                    prev_dc      += trvec[0];
430
                    trvec[0]      = prev_dc;
431
                    col_flags[0] |= !!prev_dc;
432
                }
433

    
434
                /* apply inverse transform */
435
                band->inv_transform(trvec, band->buf + buf_offs,
436
                                    band->pitch, col_flags);
437

    
438
                /* apply motion compensation */
439
                if (!is_intra)
440
                    mc_with_delta_func(band->buf + buf_offs,
441
                                       band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
442
                                       band->pitch, mc_type);
443
            } else {
444
                /* block not coded */
445
                /* for intra blocks apply the dc slant transform */
446
                /* for inter - perform the motion compensation without delta */
447
                if (is_intra && band->dc_transform) {
448
                    band->dc_transform(&prev_dc, band->buf + buf_offs,
449
                                       band->pitch, blk_size);
450
                } else
451
                    mc_no_delta_func(band->buf + buf_offs,
452
                                     band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
453
                                     band->pitch, mc_type);
454
            }
455

    
456
            cbp >>= 1;
457
        }// for blk
458
    }// for mbn
459

    
460
    align_get_bits(gb);
461

    
462
    return 0;
463
}
464

    
465
void ff_ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
466
                               IVITile *tile, int32_t mv_scale)
467
{
468
    int             x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
469
    int             offs, mb_offset, row_offset;
470
    IVIMbInfo       *mb, *ref_mb;
471
    const int16_t   *src;
472
    int16_t         *dst;
473
    void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch,
474
                             int mc_type);
475

    
476
    offs       = tile->ypos * band->pitch + tile->xpos;
477
    mb         = tile->mbs;
478
    ref_mb     = tile->ref_mbs;
479
    row_offset = band->mb_size * band->pitch;
480
    need_mc    = 0; /* reset the mc tracking flag */
481

    
482
    for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
483
        mb_offset = offs;
484

    
485
        for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
486
            mb->xpos     = x;
487
            mb->ypos     = y;
488
            mb->buf_offs = mb_offset;
489

    
490
            mb->type = 1; /* set the macroblocks type = INTER */
491
            mb->cbp  = 0; /* all blocks are empty */
492

    
493
            if (!band->qdelta_present && !band->plane && !band->band_num) {
494
                mb->q_delta = band->glob_quant;
495
                mb->mv_x    = 0;
496
                mb->mv_y    = 0;
497
            }
498

    
499
            if (band->inherit_qdelta && ref_mb)
500
                mb->q_delta = ref_mb->q_delta;
501

    
502
            if (band->inherit_mv) {
503
                /* motion vector inheritance */
504
                if (mv_scale) {
505
                    mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
506
                    mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
507
                } else {
508
                    mb->mv_x = ref_mb->mv_x;
509
                    mb->mv_y = ref_mb->mv_y;
510
                }
511
                need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
512
            }
513

    
514
            mb++;
515
            if (ref_mb)
516
                ref_mb++;
517
            mb_offset += band->mb_size;
518
        } // for x
519
        offs += row_offset;
520
    } // for y
521

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

    
527
        for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
528
            mv_x = mb->mv_x;
529
            mv_y = mb->mv_y;
530
            if (!band->is_halfpel) {
531
                mc_type = 0; /* we have only fullpel vectors */
532
            } else {
533
                mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
534
                mv_x >>= 1;
535
                mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
536
            }
537

    
538
            for (blk = 0; blk < num_blocks; blk++) {
539
                /* adjust block position in the buffer according with its number */
540
                offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
541
                mc_no_delta_func(band->buf + offs,
542
                                 band->ref_buf + offs + mv_y * band->pitch + mv_x,
543
                                 band->pitch, mc_type);
544
            }
545
        }
546
    } else {
547
        /* copy data from the reference tile into the current one */
548
        src = band->ref_buf + tile->ypos * band->pitch + tile->xpos;
549
        dst = band->buf     + tile->ypos * band->pitch + tile->xpos;
550
        for (y = 0; y < tile->height; y++) {
551
            memcpy(dst, src, tile->width*sizeof(band->buf[0]));
552
            src += band->pitch;
553
            dst += band->pitch;
554
        }
555
    }
556
}
557

    
558

    
559
#if IVI_DEBUG
560
uint16_t ivi_calc_band_checksum (IVIBandDesc *band)
561
{
562
    int         x, y;
563
    int16_t     *src, checksum;
564

    
565
    src = band->buf;
566
    checksum = 0;
567

    
568
    for (y = 0; y < band->height; src += band->pitch, y++)
569
        for (x = 0; x < band->width; x++)
570
            checksum += src[x];
571

    
572
    return checksum;
573
}
574

    
575
int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch)
576
{
577
    int         x, y, result;
578
    uint8_t     t1, t2;
579
    int16_t    *src;
580

    
581
    src = band->buf;
582
    result = 0;
583

    
584
    for (y = 0; y < band->height; src += band->pitch, y++) {
585
        for (x = 0; x < band->width; x++) {
586
            t1 = av_clip(src[x] + 128, 0, 255);
587
            t2 = ref[x];
588
            if (t1 != t2) {
589
                av_log(NULL, AV_LOG_ERROR, "Data mismatch: row %d, column %d\n",
590
                       y / band->blk_size, x / band->blk_size);
591
                result = -1;
592
            }
593
        }
594
        ref += pitch;
595
    }
596

    
597
    return result;
598
}
599
#endif
600

    
601
void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch)
602
{
603
    int             x, y;
604
    const int16_t   *src  = plane->bands[0].buf;
605
    uint32_t        pitch = plane->bands[0].pitch;
606

    
607
    for (y = 0; y < plane->height; y++) {
608
        for (x = 0; x < plane->width; x++)
609
            dst[x] = av_clip_uint8(src[x] + 128);
610
        src += pitch;
611
        dst += dst_pitch;
612
    }
613
}
614

    
615

    
616
/**
617
 * These are 2x8 predefined Huffman codebooks for coding macroblock/block
618
 * signals. They are specified using "huffman descriptors" in order to
619
 * avoid huge static tables. The decoding tables will be generated at
620
 * startup from these descriptors.
621
 */
622
const IVIHuffDesc ff_ivi_mb_huff_desc[8] = {
623
    {8,  {0, 4, 5, 4, 4, 4, 6, 6}},
624
    {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
625
    {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
626
    {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
627
    {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
628
    {9,  {0, 4, 4, 4, 4, 3, 3, 3, 2}},
629
    {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
630
    {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
631
};
632

    
633
const IVIHuffDesc ff_ivi_blk_huff_desc[8] = {
634
    {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
635
    {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
636
    {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
637
    {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
638
    {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
639
    {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
640
    {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
641
    {9,  {3, 4, 4, 5, 5, 5, 6, 5, 5}}
642
};
643

    
644

    
645
/**
646
 *  Scan patterns shared between indeo4 and indeo5
647
 */
648
const uint8_t ff_ivi_vertical_scan_8x8[64] = {
649
    0,  8, 16, 24, 32, 40, 48, 56,
650
    1,  9, 17, 25, 33, 41, 49, 57,
651
    2, 10, 18, 26, 34, 42, 50, 58,
652
    3, 11, 19, 27, 35, 43, 51, 59,
653
    4, 12, 20, 28, 36, 44, 52, 60,
654
    5, 13, 21, 29, 37, 45, 53, 61,
655
    6, 14, 22, 30, 38, 46, 54, 62,
656
    7, 15, 23, 31, 39, 47, 55, 63
657
};
658

    
659
const uint8_t ff_ivi_horizontal_scan_8x8[64] = {
660
     0,  1,  2,  3,  4,  5,  6,  7,
661
     8,  9, 10, 11, 12, 13, 14, 15,
662
    16, 17, 18, 19, 20, 21, 22, 23,
663
    24, 25, 26, 27, 28, 29, 30, 31,
664
    32, 33, 34, 35, 36, 37, 38, 39,
665
    40, 41, 42, 43, 44, 45, 46, 47,
666
    48, 49, 50, 51, 52, 53, 54, 55,
667
    56, 57, 58, 59, 60, 61, 62, 63
668
};
669

    
670
const uint8_t ff_ivi_direct_scan_4x4[16] = {
671
    0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15
672
};
673

    
674

    
675
/**
676
 *  Run-value (RLE) tables.
677
 */
678
const RVMapDesc ff_ivi_rvmap_tabs[9] = {
679
{   /* MapTab0 */
680
    5, /* eob_sym */
681
    2, /* esc_sym */
682
    /* run table */
683
    {1,  1,  0,  1,  1,  0,  1,  1,  2,  2,  1,  1,  1,  1,  3,  3,
684
     1,  1,  2,  2,  1,  1,  4,  4,  1,  1,  1,  1,  2,  2,  5,  5,
685
     1,  1,  3,  3,  1,  1,  6,  6,  1,  2,  1,  2,  7,  7,  1,  1,
686
     8,  8,  1,  1,  4,  2,  1,  4,  2,  1,  3,  3,  1,  1,  1,  9,
687
     9,  1,  2,  1,  2,  1,  5,  5,  1,  1, 10, 10,  1,  1,  3,  3,
688
     2,  2,  1,  1, 11, 11,  6,  4,  4,  1,  6,  1,  2,  1,  2, 12,
689
     8,  1, 12,  7,  8,  7,  1, 16,  1, 16,  1,  3,  3, 13,  1, 13,
690
     2,  2,  1, 15,  1,  5, 14, 15,  1,  5, 14,  1, 17,  8, 17,  8,
691
     1,  4,  4,  2,  2,  1, 25, 25, 24, 24,  1,  3,  1,  3,  1,  8,
692
     6,  7,  6,  1, 18,  8, 18,  1,  7, 23,  2,  2, 23,  1,  1, 21,
693
    22,  9,  9, 22, 19,  1, 21,  5, 19,  5,  1, 33, 20, 33, 20,  8,
694
     4,  4,  1, 32,  2,  2,  8,  3, 32, 26,  3,  1,  7,  7, 26,  6,
695
     1,  6,  1,  1, 16,  1, 10,  1, 10,  2, 16, 29, 28,  2, 29, 28,
696
     1, 27,  5,  8,  5, 27,  1,  8,  3,  7,  3, 31, 41, 31,  1, 41,
697
     6,  1,  6,  7,  4,  4,  1,  1,  2,  1,  2, 11, 34, 30, 11,  1,
698
    30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
699

    
700
    /* value table */
701
    { 1,  -1,   0,   2,  -2,   0,   3,  -3,   1,  -1,   4,  -4,   5,  -5,   1,  -1,
702
      6,  -6,   2,  -2,   7,  -7,   1,  -1,   8,  -8,   9,  -9,   3,  -3,   1,  -1,
703
     10, -10,   2,  -2,  11, -11,   1,  -1,  12,   4, -12,  -4,   1,  -1,  13, -13,
704
      1,  -1,  14, -14,   2,   5,  15,  -2,  -5, -15,  -3,   3,  16, -16,  17,   1,
705
     -1, -17,   6,  18,  -6, -18,   2,  -2,  19, -19,   1,  -1,  20, -20,   4,  -4,
706
      7,  -7,  21, -21,   1,  -1,   2,   3,  -3,  22,  -2, -22,   8,  23,  -8,   1,
707
      2, -23,  -1,   2,  -2,  -2,  24,   1, -24,  -1,  25,   5,  -5,   1, -25,  -1,
708
      9,  -9,  26,   1, -26,   3,   1,  -1,  27,  -3,  -1, -27,   1,   3,  -1,  -3,
709
     28,  -4,   4,  10, -10, -28,   1,  -1,   1,  -1,  29,   6, -29,  -6,  30,  -4,
710
      3,   3,  -3, -30,   1,   4,  -1,  31,  -3,   1,  11, -11,  -1, -31,  32,  -1,
711
     -1,   2,  -2,   1,   1, -32,   1,   4,  -1,  -4,  33,  -1,   1,   1,  -1,   5,
712
      5,  -5, -33,  -1, -12,  12,  -5,  -7,   1,   1,   7,  34,   4,  -4,  -1,   4,
713
    -34,  -4,  35,  36,  -2, -35,  -2, -36,   2,  13,   2,  -1,   1, -13,   1,  -1,
714
     37,   1,  -5,   6,   5,  -1,  38,  -6,  -8,   5,   8,  -1,   1,   1, -37,  -1,
715
      5,  39,  -5,  -5,   6,  -6, -38, -39, -14,  40,  14,   2,   1,   1,  -2, -40,
716
     -1,  -2,   2,  -1,  -1,  -1,   1,   1,   1,  -1,   1,  -1,   1,  -1,   1,  -1}
717
},{
718
    /* MapTab1 */
719
    0,  /* eob_sym */
720
    38, /* esc_sym */
721
    /* run table */
722
    {0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  8,  6,  8,  7,
723
     7,  9,  9, 10, 10, 11, 11,  1, 12,  1, 12, 13, 13, 16, 14, 16,
724
    14, 15, 15, 17, 17, 18,  0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
725
    25, 24,  2, 25, 24, 23, 23,  2, 26, 28, 26, 28, 29, 27, 29, 27,
726
    33, 33,  1, 32,  1,  3, 32, 30, 36,  3, 36, 30, 31, 31, 35, 34,
727
    37, 41, 34, 35, 37,  4, 41,  4, 49,  8,  8, 49, 40, 38,  5, 38,
728
    40, 39,  5, 39, 42, 43, 42,  7, 57,  6, 43, 44,  6, 50,  7, 44,
729
    57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58,  1, 51, 58,  1,
730
    52, 59, 53,  9, 52, 55, 55, 59, 53, 56, 54, 56, 54,  9, 64, 64,
731
    60, 63, 60, 63, 61, 62, 61, 62,  2, 10,  2, 10, 11,  1, 11, 13,
732
    12,  1, 12, 13, 16, 16,  8,  8, 14,  3,  3, 15, 14, 15,  4,  4,
733
     1, 17, 17,  5,  1,  7,  7,  5,  6,  1,  2,  2,  6, 22,  1, 25,
734
    21, 22,  8, 24,  1, 21, 25, 24,  8, 18, 18, 23,  9, 20, 23, 33,
735
    29, 33, 20,  1, 19,  1, 29, 36,  9, 36, 19, 41, 28, 57, 32,  3,
736
    28,  3,  1, 27, 49, 49,  1, 32, 26, 26,  2,  4,  4,  7, 57, 41,
737
     2,  7, 10,  5, 37, 16, 10, 27,  8,  8, 13, 16, 37, 13,  1,  5},
738

    
739
    /* value table */
740
    {0,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,   1,  -1,  -1,   1,
741
    -1,   1,  -1,   1,  -1,   1,  -1,   2,   1,  -2,  -1,   1,  -1,   1,   1,  -1,
742
    -1,   1,  -1,   1,  -1,   1,   0,  -1,   1,   1,   1,  -1,   1,  -1,  -1,  -1,
743
     1,   1,   2,  -1,  -1,   1,  -1,  -2,   1,   1,  -1,  -1,   1,   1,  -1,  -1,
744
     1,  -1,   3,   1,  -3,   2,  -1,   1,   1,  -2,  -1,  -1,  -1,   1,   1,   1,
745
     1,   1,  -1,  -1,  -1,   2,  -1,  -2,   1,   2,  -2,  -1,   1,   1,   2,  -1,
746
    -1,   1,  -2,  -1,   1,   1,  -1,   2,   1,   2,  -1,   1,  -2,  -1,  -2,  -1,
747
    -1,   1,   1,  -1,   1,  -1,   1,   1,   1,  -1,  -1,   1,   4,  -1,  -1,  -4,
748
     1,   1,   1,   2,  -1,  -1,   1,  -1,  -1,   1,  -1,  -1,   1,  -2,   1,  -1,
749
     1,   1,  -1,  -1,   1,   1,  -1,  -1,   3,   2,  -3,  -2,   2,   5,  -2,   2,
750
     2,  -5,  -2,  -2,  -2,   2,  -3,   3,   2,   3,  -3,   2,  -2,  -2,   3,  -3,
751
     6,   2,  -2,   3,  -6,   3,  -3,  -3,   3,   7,  -4,   4,  -3,   2,  -7,   2,
752
     2,  -2,  -4,   2,   8,  -2,  -2,  -2,   4,   2,  -2,   2,   3,   2,  -2,  -2,
753
     2,   2,  -2,  -8,  -2,   9,  -2,   2,  -3,  -2,   2,  -2,   2,   2,   2,   4,
754
    -2,  -4,  10,   2,   2,  -2,  -9,  -2,   2,  -2,   5,   4,  -4,   4,  -2,   2,
755
    -5,  -4,  -3,   4,   2,  -3,   3,  -2,  -5,   5,   3,   3,  -2,  -3, -10,  -4}
756
},{
757
    /* MapTab2 */
758
    2,  /* eob_sym */
759
    11, /* esc_sym */
760
    /* run table */
761
    {1,  1,  0,  2,  2,  1,  1,  3,  3,  4,  4,  0,  1,  1,  5,  5,
762
     2,  2,  6,  6,  7,  7,  1,  8,  1,  8,  3,  3,  9,  9,  1,  2,
763
     2,  1,  4, 10,  4, 10, 11, 11,  1,  5, 12, 12,  1,  5, 13, 13,
764
     3,  3,  6,  6,  2,  2, 14, 14, 16, 16, 15,  7, 15,  8,  8,  7,
765
     1,  1, 17, 17,  4,  4,  1,  1, 18, 18,  2,  2,  5,  5, 25,  3,
766
     9,  3, 25,  9, 19, 24, 19, 24,  1, 21, 20,  1, 21, 22, 20, 22,
767
    23, 23,  8,  6, 33,  6,  8, 33,  7,  7, 26, 26,  1, 32,  1, 32,
768
    28,  4, 28, 10, 29, 27, 27, 10, 41,  4, 29,  2,  2, 41, 36, 31,
769
    49, 31, 34, 30, 34, 36, 30, 35,  1, 49, 11,  5, 35, 11,  1,  3,
770
     3,  5, 37, 37,  8, 40,  8, 40, 12, 12, 42, 42,  1, 38, 16, 57,
771
     1,  6, 16, 39, 38,  6,  7,  7, 13, 13, 39, 43,  2, 43, 57,  2,
772
    50,  9, 44,  9, 50,  4, 15, 48, 44,  4,  1, 15, 48, 14, 14,  1,
773
    45, 45,  8,  3,  5,  8, 51, 47,  3, 46, 46, 47,  5, 51,  1, 17,
774
    17, 58,  1, 58,  2, 52, 52,  2, 53,  7, 59,  6,  6, 56, 53, 55,
775
     7, 55,  1, 54, 59, 56, 54, 10,  1, 10,  4, 60,  1, 60,  8,  4,
776
     8, 64, 64, 61,  1, 63,  3, 63, 62, 61,  5, 11,  5,  3, 11, 62},
777

    
778
    /* value table */
779
    { 1,  -1,   0,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   0,   3,  -3,   1,  -1,
780
      2,  -2,   1,  -1,   1,  -1,   4,   1,  -4,  -1,   2,  -2,   1,  -1,   5,   3,
781
     -3,  -5,   2,   1,  -2,  -1,   1,  -1,   6,   2,   1,  -1,  -6,  -2,   1,  -1,
782
      3,  -3,   2,  -2,   4,  -4,   1,  -1,   1,  -1,   1,   2,  -1,   2,  -2,  -2,
783
      7,  -7,   1,  -1,   3,  -3,   8,  -8,   1,  -1,   5,  -5,   3,  -3,   1,   4,
784
      2,  -4,  -1,  -2,   1,   1,  -1,  -1,   9,   1,   1,  -9,  -1,   1,  -1,  -1,
785
      1,  -1,   3,  -3,   1,   3,  -3,  -1,   3,  -3,   1,  -1,  10,   1, -10,  -1,
786
      1,   4,  -1,   2,   1,  -1,   1,  -2,   1,  -4,  -1,   6,  -6,  -1,   1,   1,
787
      1,  -1,   1,   1,  -1,  -1,  -1,   1,  11,  -1,  -2,   4,  -1,   2, -11,   5,
788
     -5,  -4,  -1,   1,   4,   1,  -4,  -1,  -2,   2,   1,  -1,  12,   1,  -2,   1,
789
    -12,   4,   2,   1,  -1,  -4,   4,  -4,   2,  -2,  -1,   1,   7,  -1,  -1,  -7,
790
     -1,  -3,   1,   3,   1,   5,   2,   1,  -1,  -5,  13,  -2,  -1,   2,  -2, -13,
791
      1,  -1,   5,   6,   5,  -5,   1,   1,  -6,   1,  -1,  -1,  -5,  -1,  14,   2,
792
     -2,   1, -14,  -1,   8,   1,  -1,  -8,   1,   5,   1,   5,  -5,   1,  -1,   1,
793
     -5,  -1,  15,   1,  -1,  -1,  -1,   3, -15,  -3,   6,   1,  16,  -1,   6,  -6,
794
     -6,   1,  -1,   1, -16,   1,   7,  -1,   1,  -1,  -6,  -3,   6,  -7,   3,  -1}
795
},{
796
    /* MapTab3 */
797
    0,  /* eob_sym */
798
    35, /* esc_sym */
799
    /* run table */
800
    {0,  1,  1,  2,  2,  3,  3,  4,  4,  1,  1,  5,  5,  6,  6,  7,
801
     7,  8,  8,  9,  9,  2,  2, 10, 10,  1,  1, 11, 11, 12, 12,  3,
802
     3, 13, 13,  0, 14, 14, 16, 15, 16, 15,  4,  4, 17,  1, 17,  1,
803
     5,  5, 18, 18,  2,  2,  6,  6,  8, 19,  7,  8,  7, 19, 20, 20,
804
    21, 21, 22, 24, 22, 24, 23, 23,  1,  1, 25, 25,  3,  3, 26, 26,
805
     9,  9, 27, 27, 28, 28, 33, 29,  4, 33, 29,  1,  4,  1, 32, 32,
806
     2,  2, 31, 10, 30, 10, 30, 31, 34, 34,  5,  5, 36, 36, 35, 41,
807
    35, 11, 41, 11, 37,  1,  8,  8, 37,  6,  1,  6, 40,  7,  7, 40,
808
    12, 38, 12, 39, 39, 38, 49, 13, 49, 13,  3, 42,  3, 42, 16, 16,
809
    43, 43, 14, 14,  1,  1, 44, 15, 44, 15,  2,  2, 57, 48, 50, 48,
810
    57, 50,  4, 45, 45,  4, 46, 47, 47, 46,  1, 51,  1, 17, 17, 51,
811
     8,  9,  9,  5, 58,  8, 58,  5, 52, 52, 55, 56, 53, 56, 55, 59,
812
    59, 53, 54,  1,  6, 54,  7,  7,  6,  1,  2,  3,  2,  3, 64, 60,
813
    60, 10, 10, 64, 61, 62, 61, 63,  1, 63, 62,  1, 18, 24, 18,  4,
814
    25,  4,  8, 21, 21,  1, 24, 22, 25, 22,  8, 11, 19, 11, 23,  1,
815
    20, 23, 19, 20,  5, 12,  5,  1, 16,  2, 12, 13,  2, 13,  1, 16},
816

    
817
    /* value table */
818
    { 0,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   1,
819
     -1,   1,  -1,   1,  -1,   2,  -2,   1,  -1,   3,  -3,   1,  -1,   1,  -1,   2,
820
     -2,   1,  -1,   0,   1,  -1,   1,   1,  -1,  -1,   2,  -2,   1,   4,  -1,  -4,
821
      2,  -2,   1,  -1,  -3,   3,   2,  -2,   2,   1,   2,  -2,  -2,  -1,   1,  -1,
822
      1,  -1,   1,   1,  -1,  -1,   1,  -1,   5,  -5,   1,  -1,   3,  -3,   1,  -1,
823
      2,  -2,   1,  -1,   1,  -1,   1,   1,   3,  -1,  -1,   6,  -3,  -6,  -1,   1,
824
      4,  -4,   1,   2,   1,  -2,  -1,  -1,   1,  -1,   3,  -3,   1,  -1,   1,   1,
825
     -1,   2,  -1,  -2,   1,   7,  -3,   3,  -1,   3,  -7,  -3,   1,  -3,   3,  -1,
826
      2,   1,  -2,   1,  -1,  -1,   1,   2,  -1,  -2,  -4,  -1,   4,   1,   2,  -2,
827
      1,  -1,  -2,   2,   8,  -8,  -1,   2,   1,  -2,  -5,   5,   1,  -1,  -1,   1,
828
     -1,   1,   4,  -1,   1,  -4,  -1,  -1,   1,   1,   9,   1,  -9,   2,  -2,  -1,
829
     -4,   3,  -3,  -4,  -1,   4,   1,   4,   1,  -1,   1,  -1,   1,   1,  -1,   1,
830
     -1,  -1,  -1,  10,   4,   1,   4,  -4,  -4, -10,   6,   5,  -6,  -5,   1,  -1,
831
      1,   3,  -3,  -1,   1,  -1,  -1,  -1,  11,   1,   1, -11,  -2,  -2,   2,   5,
832
     -2,  -5,  -5,   2,  -2,  12,   2,  -2,   2,   2,   5,  -3,  -2,   3,  -2, -12,
833
     -2,   2,   2,   2,  -5,   3,   5,  13,  -3,   7,  -3,  -3,  -7,   3, -13,   3}
834
},{
835
    /* MapTab4 */
836
    0,  /* eob_sym */
837
    34, /* esc_sym */
838
    /* run table */
839
    {0,  1,  1,  1,  2,  2,  1,  3,  3,  1,  1,  1,  4,  4,  1,  5,
840
     2,  1,  5,  2,  1,  1,  6,  6,  1,  1,  1,  1,  1,  7,  3,  1,
841
     2,  3,  0,  1,  2,  7,  1,  1,  1,  8,  1,  1,  8,  1,  1,  1,
842
     9,  1,  9,  1,  2,  1,  1,  2,  1,  1, 10,  4,  1, 10,  1,  4,
843
     1,  1,  1,  1,  1,  3,  1,  1,  1,  3,  2,  1,  5,  1,  1,  1,
844
     2,  5,  1, 11,  1, 11,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
845
     2,  1,  6,  1,  6,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1, 12,
846
     3,  1, 12,  1,  1,  1,  2,  1,  1,  3,  1,  1,  1,  1,  1,  1,
847
     4,  1,  1,  1,  2,  1,  1,  4,  1,  1,  1,  1,  1,  1,  2,  1,
848
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  3,  1,  2,  1,  1,  5,
849
     1,  1,  1,  1,  1,  7,  1,  7,  1,  1,  2,  3,  1,  1,  1,  1,
850
     5,  1,  1,  1,  1,  1,  1,  2, 13,  1,  1,  1,  1,  1,  1,  1,
851
     1,  1,  1,  1,  1,  1,  1,  1, 13,  2,  1,  1,  4,  1,  1,  1,
852
     3,  1,  6,  1,  1,  1, 14,  1,  1,  1,  1,  1, 14,  6,  1,  1,
853
     1,  1, 15,  2,  4,  1,  2,  3, 15,  1,  1,  1,  8,  1,  1,  8,
854
     1,  1,  1,  1,  1,  1,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1},
855

    
856
    /* value table */
857
    { 0,   1,  -1,   2,   1,  -1,  -2,   1,  -1,   3,  -3,   4,   1,  -1,  -4,   1,
858
      2,   5,  -1,  -2,  -5,   6,   1,  -1,  -6,   7,  -7,   8,  -8,   1,   2,   9,
859
      3,  -2,   0,  -9,  -3,  -1,  10, -10,  11,   1, -11,  12,  -1, -12,  13, -13,
860
      1,  14,  -1, -14,   4,  15, -15,  -4,  16, -16,   1,   2,  17,  -1, -17,  -2,
861
     18, -18,  19, -19,  20,   3, -20,  21, -21,  -3,   5,  22,   2, -22, -23,  23,
862
     -5,  -2,  24,   1, -24,  -1,  25, -25,  26, -26, -27,  27,  28,  29, -28, -29,
863
      6,  30,   2, -31,  -2, -30,  31,  -6, -32,  32,  33, -33,  34, -35, -34,   1,
864
      4, -36,  -1,  35,  37,  36,   7, -37,  38,  -4, -38,  39,  41,  40, -40, -39,
865
      3,  42, -43, -41,  -7, -42,  43,  -3,  44, -44,  45, -45,  46,  47,   8, -47,
866
    -48, -46,  50, -50,  48,  49,  51, -49,  52, -52,   5, -51,  -8, -53,  53,   3,
867
    -56,  56,  55,  54, -54,   2,  60,  -2, -55,  58,   9,  -5,  59,  57, -57, -63,
868
     -3, -58, -60, -61,  61, -59, -62,  -9,   1,  64,  62,  69, -64,  63,  65, -67,
869
    -68,  66, -65,  68, -66, -69,  67, -70,  -1,  10,  71, -71,   4,  73,  72,  70,
870
      6, -76,  -3,  74, -78, -74,   1,  78,  80, -72, -75,  76,  -1,   3, -73,  79,
871
     75,  77,   1,  11,  -4, -79, -10,  -6,  -1, -77, -83, -80,   2,  81, -84,  -2,
872
     83, -81,  82, -82,  84, -87, -86,  85, -11, -85,  86, -89,  87, -88,  88,  89}
873
},{
874
    /* MapTab5 */
875
    2,  /* eob_sym */
876
    33, /* esc_sym */
877
    /* run table */
878
    {1,  1,  0,  2,  1,  2,  1,  3,  3,  1,  1,  4,  4,  2,  2,  1,
879
     1,  5,  5,  6,  1,  6,  1,  7,  7,  3,  3,  2,  8,  2,  8,  1,
880
     1,  0,  9,  9,  1,  1, 10,  4, 10,  4, 11, 11,  2,  1,  2,  1,
881
    12, 12,  3,  3,  1,  1, 13,  5,  5, 13, 14,  1,  1, 14,  2,  2,
882
     6,  6, 15,  1,  1, 15, 16,  4,  7, 16,  4,  7,  1,  1,  3,  3,
883
     8,  8,  2,  2,  1,  1, 17, 17,  1,  1, 18, 18,  5,  5,  2,  2,
884
     1,  1,  9, 19,  9, 19, 20,  3,  3, 20,  1, 10, 21,  1, 10,  4,
885
     4, 21, 22,  6,  6, 22,  1,  1, 23, 24,  2,  2, 23, 24, 11,  1,
886
     1, 11,  7, 25,  7,  1,  1, 25,  8,  8,  3, 26,  3,  1, 12,  2,
887
     2, 26,  1, 12,  5,  5, 27,  4,  1,  4,  1, 27, 28,  1, 28, 13,
888
     1, 13,  2, 29,  2,  1, 32,  6,  1, 30, 14, 29, 14,  6,  3, 31,
889
     3,  1, 30,  1, 32, 31, 33,  9, 33,  1,  1,  7,  9,  7,  2,  2,
890
     1,  1,  4, 36, 34,  4,  5, 10, 10,  5, 34,  1,  1, 35,  8,  8,
891
    36,  3, 35,  1, 15,  3,  2,  1, 16, 15, 16,  2, 37,  1, 37,  1,
892
     1,  1,  6,  6, 38,  1, 38, 11,  1, 39, 39, 40, 11,  2, 41,  4,
893
    40,  1,  2,  4,  1,  1,  1, 41,  3,  1,  3,  1,  5,  7,  5,  7},
894

    
895
    /* value table */
896
    { 1,  -1,   0,   1,   2,  -1,  -2,   1,  -1,   3,  -3,   1,  -1,   2,  -2,   4,
897
     -4,   1,  -1,   1,   5,  -1,  -5,   1,  -1,   2,  -2,   3,   1,  -3,  -1,   6,
898
     -6,   0,   1,  -1,   7,  -7,   1,   2,  -1,  -2,   1,  -1,   4,   8,  -4,  -8,
899
      1,  -1,   3,  -3,   9,  -9,   1,   2,  -2,  -1,   1,  10, -10,  -1,   5,  -5,
900
      2,  -2,   1,  11, -11,  -1,   1,   3,   2,  -1,  -3,  -2,  12, -12,   4,  -4,
901
      2,  -2,  -6,   6,  13, -13,   1,  -1,  14, -14,   1,  -1,   3,  -3,   7,  -7,
902
     15, -15,   2,   1,  -2,  -1,   1,   5,  -5,  -1, -16,   2,   1,  16,  -2,   4,
903
     -4,  -1,   1,   3,  -3,  -1,  17, -17,   1,   1,  -8,   8,  -1,  -1,   2,  18,
904
    -18,  -2,   3,   1,  -3,  19, -19,  -1,   3,  -3,   6,   1,  -6,  20,   2,   9,
905
     -9,  -1, -20,  -2,   4,  -4,   1,  -5,  21,   5, -21,  -1,   1, -22,  -1,   2,
906
     22,  -2,  10,   1, -10,  23,   1,   4, -23,   1,   2,  -1,  -2,  -4,  -7,   1,
907
      7, -24,  -1,  24,  -1,  -1,   1,   3,  -1, -25,  25,   4,  -3,  -4,  11, -11,
908
     26, -26,   6,   1,   1,  -6,  -5,  -3,   3,   5,  -1, -27,  27,   1,   4,  -4,
909
     -1,  -8,  -1,  28,   2,   8, -12, -28,  -2,  -2,   2,  12,  -1,  29,   1, -29,
910
     30, -30,   5,  -5,   1, -31,  -1,   3,  31,  -1,   1,   1,  -3, -13,   1,  -7,
911
     -1, -32,  13,   7,  32,  33, -33,  -1,  -9, -34,   9,  34,  -6,   5,   6,  -5}
912
},{
913
    /* MapTab6 */
914
    2,  /* eob_sym */
915
    13, /* esc_sym */
916
    /* run table */
917
    {1,  1,  0,  1,  1,  2,  2,  1,  1,  3,  3,  1,  1,  0,  2,  2,
918
     4,  1,  4,  1,  1,  1,  5,  5,  1,  1,  6,  6,  2,  2,  1,  1,
919
     3,  3,  7,  7,  1,  1,  8,  8,  1,  1,  2,  2,  1,  9,  1,  9,
920
     4,  4, 10,  1,  1, 10,  1,  1, 11, 11,  3,  3,  1,  2,  1,  2,
921
     1,  1, 12, 12,  5,  5,  1,  1, 13,  1,  1, 13,  2,  2,  1,  1,
922
     6,  6,  1,  1,  4, 14,  4, 14,  3,  1,  3,  1,  1,  1, 15,  7,
923
    15,  2,  2,  7,  1,  1,  1,  8,  1,  8, 16, 16,  1,  1,  1,  1,
924
     2,  1,  1,  2,  1,  1,  3,  5,  5,  3,  4,  1,  1,  4,  1,  1,
925
    17, 17,  9,  1,  1,  9,  2,  2,  1,  1, 10, 10,  1,  6,  1,  1,
926
     6, 18,  1,  1, 18,  1,  1,  1,  2,  2,  3,  1,  3,  1,  1,  1,
927
     4,  1, 19,  1, 19,  7,  1,  1, 20,  1,  4, 20,  1,  7, 11,  2,
928
     1, 11, 21,  2,  8,  5,  1,  8,  1,  5, 21,  1,  1,  1, 22,  1,
929
     1, 22,  1,  1,  3,  3,  1, 23,  2, 12, 24,  1,  1,  2,  1,  1,
930
    12, 23,  1,  1, 24,  1,  1,  1,  4,  1,  1,  1,  2,  1,  6,  6,
931
     4,  2,  1,  1,  1,  1,  1,  1,  1, 14, 13,  3,  1, 25,  9, 25,
932
    14,  1,  9,  3, 13,  1,  1,  1,  1,  1, 10,  1,  1,  2, 10,  2},
933

    
934
    /* value table */
935
    {-20,  -1,   0,   2,  -2,   1,  -1,   3,  -3,   1,  -1,   4,  -4,   0,   2,  -2,
936
       1,   5,  -1,  -5,   6,  -6,   1,  -1,   7,  -7,   1,  -1,   3,  -3,   8,  -8,
937
       2,  -2,   1,  -1,   9,  -9,   1,  -1,  10, -10,   4,  -4,  11,   1, -11,  -1,
938
       2,  -2,   1,  12, -12,  -1,  13, -13,   1,  -1,   3,  -3,  14,   5, -14,  -5,
939
     -15,  15,  -1,   1,   2,  -2,  16, -16,   1,  17, -17,  -1,   6,  -6,  18, -18,
940
       2,  -2, -19,  19,  -3,   1,   3,  -1,   4,  20,  -4,   1, -21,  21,   1,   2,
941
      -1,  -7,   7,  -2,  22, -22,  23,   2, -23,  -2,   1,  -1, -24,  24, -25,  25,
942
      -8, -26,  26,   8, -27,  27,   5,   3,  -3,  -5,  -4,  28, -28,   4,  29, -29,
943
       1,  -1,  -2, -30,  30,   2,   9,  -9, -31,  31,   2,  -2, -32,   3,  32, -33,
944
      -3,   1,  33, -34,  -1,  34, -35,  35, -10,  10,  -6,  36,   6, -36,  37, -37,
945
      -5,  38,   1, -38,  -1,   3,  39, -39,  -1,  40,   5,   1, -40,  -3,   2, -11,
946
     -41,  -2,   1,  11,  -3,  -4,  41,   3,  42,   4,  -1, -43, -42,  43,   1, -44,
947
      45,  -1,  44, -45,  -7,   7, -46,   1, -12,   2,   1, -47,  46,  12,  47,  48,
948
      -2,  -1, -48,  49,  -1, -50, -49,  50,  -6, -51,  51,  52, -13,  53,  -4,   4,
949
       6,  13, -53, -52, -54,  55,  54, -55, -56,  -2,   2,  -8,  56,   1,  -3,  -1,
950
       2,  58,   3,   8,  -2,  57, -58, -60, -59, -57,  -3,  60,  59, -14,   3,  14}
951
},{
952
    /* MapTab7 */
953
    2,  /* eob_sym */
954
    38, /* esc_sym */
955
    /* run table */
956
    {1,  1,  0,  2,  2,  1,  1,  3,  3,  4,  4,  5,  5,  1,  1,  6,
957
     6,  2,  2,  7,  7,  8,  8,  1,  1,  3,  3,  9,  9, 10, 10,  1,
958
     1,  2,  2,  4,  4, 11,  0, 11, 12, 12, 13, 13,  1,  1,  5,  5,
959
    14, 14, 15, 16, 15, 16,  3,  3,  1,  6,  1,  6,  2,  2,  7,  7,
960
     8,  8, 17, 17,  1,  1,  4,  4, 18, 18,  2,  2,  1, 19,  1, 20,
961
    19, 20, 21, 21,  3,  3, 22, 22,  5,  5, 24,  1,  1, 23,  9, 23,
962
    24,  9,  2,  2, 10,  1,  1, 10,  6,  6, 25,  4,  4, 25,  7,  7,
963
    26,  8,  1,  8,  3,  1, 26,  3, 11, 11, 27, 27,  2, 28,  1,  2,
964
    28,  1, 12, 12,  5,  5, 29, 13, 13, 29, 32,  1,  1, 33, 31, 30,
965
    32,  4, 30, 33,  4, 31,  3, 14,  1,  1,  3, 34, 34,  2,  2, 14,
966
     6,  6, 35, 36, 35, 36,  1, 15,  1, 16, 16, 15,  7,  9,  7,  9,
967
    37,  8,  8, 37,  1,  1, 39,  2, 38, 39,  2, 40,  5, 38, 40,  5,
968
     3,  3,  4,  4, 10, 10,  1,  1,  1,  1, 41,  2, 41,  2,  6,  6,
969
     1,  1, 11, 42, 11, 43,  3, 42,  3, 17,  4, 43,  1, 17,  7,  1,
970
     8, 44,  4,  7, 44,  5,  8,  2,  5,  1,  2, 48, 45,  1, 12, 45,
971
    12, 48, 13, 13,  1,  9,  9, 46,  1, 46, 47, 47, 49, 18, 18, 49},
972

    
973
    /* value table */
974
    { 1,  -1,   0,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   1,  -1,   3,  -3,   1,
975
     -1,  -2,   2,   1,  -1,   1,  -1,   4,  -4,  -2,   2,   1,  -1,   1,  -1,   5,
976
     -5,  -3,   3,   2,  -2,   1,   0,  -1,   1,  -1,   1,  -1,   6,  -6,   2,  -2,
977
      1,  -1,   1,   1,  -1,  -1,  -3,   3,   7,   2,  -7,  -2,  -4,   4,   2,  -2,
978
      2,  -2,   1,  -1,   8,  -8,   3,  -3,   1,  -1,  -5,   5,   9,   1,  -9,   1,
979
     -1,  -1,   1,  -1,  -4,   4,   1,  -1,   3,  -3,   1, -10,  10,   1,   2,  -1,
980
     -1,  -2,   6,  -6,   2,  11, -11,  -2,   3,  -3,   1,  -4,   4,  -1,   3,  -3,
981
      1,   3,  12,  -3,  -5, -12,  -1,   5,   2,  -2,   1,  -1,  -7,   1,  13,   7,
982
     -1, -13,   2,  -2,   4,  -4,   1,   2,  -2,  -1,   1,  14, -14,   1,   1,   1,
983
     -1,  -5,  -1,  -1,   5,  -1,  -6,   2, -15,  15,   6,   1,  -1,  -8,   8,  -2,
984
     -4,   4,   1,   1,  -1,  -1,  16,   2, -16,  -2,   2,  -2,   4,   3,  -4,  -3,
985
     -1,  -4,   4,   1, -17,  17,  -1,  -9,   1,   1,   9,   1,  -5,  -1,  -1,   5,
986
     -7,   7,   6,  -6,   3,  -3,  18, -18,  19, -19,   1, -10,  -1,  10,  -5,   5,
987
     20, -20,  -3,   1,   3,   1,   8,  -1,  -8,   2,   7,  -1, -21,  -2,   5,  21,
988
      5,  -1,  -7,  -5,   1,  -6,  -5, -11,   6,  22,  11,   1,   1, -22,  -3,  -1,
989
      3,  -1,   3,  -3, -23,   4,  -4,   1,  23,  -1,   1,  -1,   1,  -2,   2,  -1}
990
},{
991
    /* MapTab8 */
992
    4,  /* eob_sym */
993
    11, /* esc_sym */
994
    /* run table */
995
    {1,  1,  1,  1,  0,  2,  2,  1,  1,  3,  3,  0,  1,  1,  2,  2,
996
     4,  4,  1,  1,  5,  5,  1,  1,  2,  2,  3,  3,  6,  6,  1,  1,
997
     7,  7,  8,  1,  8,  2,  2,  1,  4,  4,  1,  3,  1,  3,  9,  9,
998
     2,  2,  1,  5,  1,  5, 10, 10,  1,  1, 11, 11,  3,  6,  3,  4,
999
     4,  6,  2,  2,  1, 12,  1, 12,  7, 13,  7, 13,  1,  1,  8,  8,
1000
     2,  2, 14, 14, 16, 15, 16,  5,  5,  1,  3, 15,  1,  3,  4,  4,
1001
     1,  1, 17, 17,  2,  2,  6,  6,  1, 18,  1, 18, 22, 21, 22, 21,
1002
    25, 24, 25, 19,  9, 20,  9, 23, 19, 24, 20,  3, 23,  7,  3,  1,
1003
     1,  7, 28, 26, 29,  5, 28, 26,  5,  8, 29,  4,  8, 27,  2,  2,
1004
     4, 27,  1,  1, 10, 36, 10, 33, 33, 36, 30,  1, 32, 32,  1, 30,
1005
     6, 31, 31, 35,  3,  6, 11, 11,  3,  2, 35,  2, 34,  1, 34,  1,
1006
    37, 37, 12,  7, 12,  5, 41,  5,  4,  7,  1,  8, 13,  4,  1, 41,
1007
    13, 38,  8, 38,  9,  1, 40, 40,  9,  1, 39,  2,  2, 49, 39, 42,
1008
     3,  3, 14, 16, 49, 14, 16, 42, 43, 43,  6,  6, 15,  1,  1, 15,
1009
    44, 44,  1,  1, 50, 48,  4,  5,  4,  7,  5,  2, 10, 10, 48,  7,
1010
    50, 45,  2,  1, 45,  8,  8,  1, 46, 46,  3, 47, 47,  3,  1,  1},
1011

    
1012
    /* value table */
1013
    { 1,  -1,   2,  -2,   0,   1,  -1,   3,  -3,   1,  -1,   0,   4,  -4,   2,  -2,
1014
      1,  -1,   5,  -5,   1,  -1,   6,  -6,   3,  -3,   2,  -2,   1,  -1,   7,  -7,
1015
      1,  -1,   1,   8,  -1,   4,  -4,  -8,   2,  -2,   9,   3,  -9,  -3,   1,  -1,
1016
      5,  -5,  10,   2, -10,  -2,   1,  -1,  11, -11,   1,  -1,  -4,   2,   4,   3,
1017
     -3,  -2,   6,  -6,  12,   1, -12,  -1,   2,   1,  -2,  -1,  13, -13,   2,  -2,
1018
      7,  -7,   1,  -1,   1,   1,  -1,   3,  -3,  14,   5,  -1, -14,  -5,   4,  -4,
1019
     15, -15,   1,  -1,   8,  -8,  -3,   3,  16,   1, -16,  -1,   1,   1,  -1,  -1,
1020
      1,   1,  -1,   1,   2,   1,  -2,   1,  -1,  -1,  -1,   6,  -1,   3,  -6,  17,
1021
    -17,  -3,   1,   1,   1,   4,  -1,  -1,  -4,   3,  -1,   5,  -3,  -1,  -9,   9,
1022
     -5,   1,  18, -18,   2,   1,  -2,   1,  -1,  -1,   1,  19,  -1,   1, -19,  -1,
1023
      4,   1,  -1,   1,   7,  -4,  -2,   2,  -7,  10,  -1, -10,   1,  20,  -1, -20,
1024
      1,  -1,   2,   4,  -2,   5,   1,  -5,   6,  -4,  21,   4,   2,  -6, -21,  -1,
1025
     -2,   1,  -4,  -1,  -3,  22,  -1,   1,   3, -22,  -1,  11, -11,   1,   1,   1,
1026
      8,  -8,   2,   2,  -1,  -2,  -2,  -1,   1,  -1,  -5,   5,   2,  23, -23,  -2,
1027
      1,  -1,  24, -24,  -1,  -1,   7,   6,  -7,   5,  -6,  12,  -3,   3,   1,  -5,
1028
      1,   1, -12,  25,  -1,  -5,   5, -25,  -1,   1,   9,   1,  -1,  -9,  26, -26}
1029
}
1030
};