Statistics
| Branch: | Revision:

ffmpeg / libavcodec / ivi_common.c @ 2912e87a

History | View | Annotate | Download (46.1 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 Libav.
7
 *
8
 * Libav is free software; you can redistribute it and/or
9
 * modify it under the terms of the GNU Lesser General Public
10
 * License as published by the Free Software Foundation; either
11
 * version 2.1 of the License, or (at your option) any later version.
12
 *
13
 * Libav is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16
 * Lesser General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU Lesser General Public
19
 * License along with Libav; if not, write to the Free Software
20
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
 */
22

    
23
/**
24
 * @file
25
 * This file contains functions and data shared by both Indeo4 and
26
 * Indeo5 decoders.
27
 */
28

    
29
#define 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
 *  Reverse "nbits" bits of the value "val" and return 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 uint16_t  *base_tab;
342
    const uint8_t   *scale_tab;
343

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

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

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

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

    
365
        base_tab  = is_intra ? band->intra_base  : band->inter_base;
366
        scale_tab = is_intra ? band->intra_scale : band->inter_scale;
367
        if (scale_tab)
368
            quant = scale_tab[quant];
369

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

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

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

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

    
401
                    if (sym == rvmap->esc_sym) { /* Escape - run/val explicitly coded using 3 vlc codes */
402
                        run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1;
403
                        lo  = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
404
                        hi  = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
405
                        val = IVI_TOSIGNED((hi << 6) | lo); /* merge them and convert into signed val */
406
                    } else {
407
                        if (sym >= 256U) {
408
                            av_log(NULL, AV_LOG_ERROR, "Invalid sym encountered: %d.\n", sym);
409
                            return -1;
410
                        }
411
                        run = rvmap->runtab[sym];
412
                        val = rvmap->valtab[sym];
413
                    }
414

    
415
                    /* de-zigzag and dequantize */
416
                    scan_pos += run;
417
                    if (scan_pos >= num_coeffs)
418
                        break;
419
                    pos = band->scan[scan_pos];
420

    
421
                    if (IVI_DEBUG && !val)
422
                        av_log(NULL, AV_LOG_ERROR, "Val = 0 encountered!\n");
423

    
424
                    q = (base_tab[pos] * quant) >> 9;
425
                    if (q > 1)
426
                        val = val * q + FFSIGN(val) * (((q ^ 1) - 1) >> 1);
427
                    trvec[pos] = val;
428
                    col_flags[pos & col_mask] |= !!val; /* track columns containing non-zero coeffs */
429
                }// while
430

    
431
                if (scan_pos >= num_coeffs && sym != rvmap->eob_sym)
432
                    return -1; /* corrupt block data */
433

    
434
                /* undoing DC coeff prediction for intra-blocks */
435
                if (is_intra && band->is_2d_trans) {
436
                    prev_dc      += trvec[0];
437
                    trvec[0]      = prev_dc;
438
                    col_flags[0] |= !!prev_dc;
439
                }
440

    
441
                /* apply inverse transform */
442
                band->inv_transform(trvec, band->buf + buf_offs,
443
                                    band->pitch, col_flags);
444

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

    
463
            cbp >>= 1;
464
        }// for blk
465
    }// for mbn
466

    
467
    align_get_bits(gb);
468

    
469
    return 0;
470
}
471

    
472
void ff_ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
473
                               IVITile *tile, int32_t mv_scale)
474
{
475
    int             x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
476
    int             offs, mb_offset, row_offset;
477
    IVIMbInfo       *mb, *ref_mb;
478
    const int16_t   *src;
479
    int16_t         *dst;
480
    void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch,
481
                             int mc_type);
482

    
483
    offs       = tile->ypos * band->pitch + tile->xpos;
484
    mb         = tile->mbs;
485
    ref_mb     = tile->ref_mbs;
486
    row_offset = band->mb_size * band->pitch;
487
    need_mc    = 0; /* reset the mc tracking flag */
488

    
489
    for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
490
        mb_offset = offs;
491

    
492
        for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
493
            mb->xpos     = x;
494
            mb->ypos     = y;
495
            mb->buf_offs = mb_offset;
496

    
497
            mb->type = 1; /* set the macroblocks type = INTER */
498
            mb->cbp  = 0; /* all blocks are empty */
499

    
500
            if (!band->qdelta_present && !band->plane && !band->band_num) {
501
                mb->q_delta = band->glob_quant;
502
                mb->mv_x    = 0;
503
                mb->mv_y    = 0;
504
            }
505

    
506
            if (band->inherit_qdelta && ref_mb)
507
                mb->q_delta = ref_mb->q_delta;
508

    
509
            if (band->inherit_mv) {
510
                /* motion vector inheritance */
511
                if (mv_scale) {
512
                    mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
513
                    mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
514
                } else {
515
                    mb->mv_x = ref_mb->mv_x;
516
                    mb->mv_y = ref_mb->mv_y;
517
                }
518
                need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
519
            }
520

    
521
            mb++;
522
            if (ref_mb)
523
                ref_mb++;
524
            mb_offset += band->mb_size;
525
        } // for x
526
        offs += row_offset;
527
    } // for y
528

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

    
534
        for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
535
            mv_x = mb->mv_x;
536
            mv_y = mb->mv_y;
537
            if (!band->is_halfpel) {
538
                mc_type = 0; /* we have only fullpel vectors */
539
            } else {
540
                mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
541
                mv_x >>= 1;
542
                mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
543
            }
544

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

    
565

    
566
#if IVI_DEBUG
567
uint16_t ivi_calc_band_checksum (IVIBandDesc *band)
568
{
569
    int         x, y;
570
    int16_t     *src, checksum;
571

    
572
    src = band->buf;
573
    checksum = 0;
574

    
575
    for (y = 0; y < band->height; src += band->pitch, y++)
576
        for (x = 0; x < band->width; x++)
577
            checksum += src[x];
578

    
579
    return checksum;
580
}
581

    
582
int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch)
583
{
584
    int         x, y, result;
585
    uint8_t     t1, t2;
586
    int16_t    *src;
587

    
588
    src = band->buf;
589
    result = 0;
590

    
591
    for (y = 0; y < band->height; src += band->pitch, y++) {
592
        for (x = 0; x < band->width; x++) {
593
            t1 = av_clip(src[x] + 128, 0, 255);
594
            t2 = ref[x];
595
            if (t1 != t2) {
596
                av_log(NULL, AV_LOG_ERROR, "Data mismatch: row %d, column %d\n",
597
                       y / band->blk_size, x / band->blk_size);
598
                result = -1;
599
            }
600
        }
601
        ref += pitch;
602
    }
603

    
604
    return result;
605
}
606
#endif
607

    
608
void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch)
609
{
610
    int             x, y;
611
    const int16_t   *src  = plane->bands[0].buf;
612
    uint32_t        pitch = plane->bands[0].pitch;
613

    
614
    for (y = 0; y < plane->height; y++) {
615
        for (x = 0; x < plane->width; x++)
616
            dst[x] = av_clip_uint8(src[x] + 128);
617
        src += pitch;
618
        dst += dst_pitch;
619
    }
620
}
621

    
622

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

    
640
const IVIHuffDesc ff_ivi_blk_huff_desc[8] = {
641
    {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
642
    {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
643
    {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
644
    {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
645
    {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
646
    {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
647
    {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
648
    {9,  {3, 4, 4, 5, 5, 5, 6, 5, 5}}
649
};
650

    
651

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

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

    
677
const uint8_t ff_ivi_direct_scan_4x4[16] = {
678
    0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15
679
};
680

    
681

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

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

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

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

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

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

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

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

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

    
1019
    /* value table */
1020
    { 1,  -1,   2,  -2,   0,   1,  -1,   3,  -3,   1,  -1,   0,   4,  -4,   2,  -2,
1021
      1,  -1,   5,  -5,   1,  -1,   6,  -6,   3,  -3,   2,  -2,   1,  -1,   7,  -7,
1022
      1,  -1,   1,   8,  -1,   4,  -4,  -8,   2,  -2,   9,   3,  -9,  -3,   1,  -1,
1023
      5,  -5,  10,   2, -10,  -2,   1,  -1,  11, -11,   1,  -1,  -4,   2,   4,   3,
1024
     -3,  -2,   6,  -6,  12,   1, -12,  -1,   2,   1,  -2,  -1,  13, -13,   2,  -2,
1025
      7,  -7,   1,  -1,   1,   1,  -1,   3,  -3,  14,   5,  -1, -14,  -5,   4,  -4,
1026
     15, -15,   1,  -1,   8,  -8,  -3,   3,  16,   1, -16,  -1,   1,   1,  -1,  -1,
1027
      1,   1,  -1,   1,   2,   1,  -2,   1,  -1,  -1,  -1,   6,  -1,   3,  -6,  17,
1028
    -17,  -3,   1,   1,   1,   4,  -1,  -1,  -4,   3,  -1,   5,  -3,  -1,  -9,   9,
1029
     -5,   1,  18, -18,   2,   1,  -2,   1,  -1,  -1,   1,  19,  -1,   1, -19,  -1,
1030
      4,   1,  -1,   1,   7,  -4,  -2,   2,  -7,  10,  -1, -10,   1,  20,  -1, -20,
1031
      1,  -1,   2,   4,  -2,   5,   1,  -5,   6,  -4,  21,   4,   2,  -6, -21,  -1,
1032
     -2,   1,  -4,  -1,  -3,  22,  -1,   1,   3, -22,  -1,  11, -11,   1,   1,   1,
1033
      8,  -8,   2,   2,  -1,  -2,  -2,  -1,   1,  -1,  -5,   5,   2,  23, -23,  -2,
1034
      1,  -1,  24, -24,  -1,  -1,   7,   6,  -7,   5,  -6,  12,  -3,   3,   1,  -5,
1035
      1,   1, -12,  25,  -1,  -5,   5, -25,  -1,   1,   9,   1,  -1,  -9,  26, -26}
1036
}
1037
};