Coverage Report

Created: 2026-05-23 07:06

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ffmpeg/libavcodec/ivi.c
Line
Count
Source
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
#include <inttypes.h>
30
31
#include "libavutil/attributes.h"
32
#include "libavutil/imgutils.h"
33
#include "libavutil/mem.h"
34
#include "libavutil/thread.h"
35
36
#define BITSTREAM_READER_LE
37
#include "avcodec.h"
38
#include "decode.h"
39
#include "get_bits.h"
40
#include "ivi.h"
41
#include "ivi_dsp.h"
42
43
/**
44
 * These are 2x8 predefined Huffman codebooks for coding macroblock/block
45
 * signals. They are specified using "huffman descriptors" in order to
46
 * avoid huge static tables. The decoding tables will be generated at
47
 * startup from these descriptors.
48
 */
49
/** static macroblock huffman tables */
50
static const IVIHuffDesc ivi_mb_huff_desc[8] = {
51
    {8,  {0, 4, 5, 4, 4, 4, 6, 6}},
52
    {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
53
    {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
54
    {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
55
    {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
56
    {9,  {0, 4, 4, 4, 4, 3, 3, 3, 2}},
57
    {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
58
    {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
59
};
60
61
/** static block huffman tables */
62
static const IVIHuffDesc ivi_blk_huff_desc[8] = {
63
    {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
64
    {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
65
    {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
66
    {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
67
    {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
68
    {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
69
    {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
70
    {9,  {3, 4, 4, 5, 5, 5, 6, 5, 5}}
71
};
72
73
static VLC ivi_mb_vlc_tabs [8]; ///< static macroblock Huffman tables
74
static VLC ivi_blk_vlc_tabs[8]; ///< static block Huffman tables
75
76
typedef void (*ivi_mc_func) (int16_t *buf, const int16_t *ref_buf,
77
                             ptrdiff_t pitch, int mc_type);
78
typedef void (*ivi_mc_avg_func) (int16_t *buf, const int16_t *ref_buf1,
79
                                 const int16_t *ref_buf2,
80
                                 ptrdiff_t pitch, int mc_type, int mc_type2);
81
82
static int ivi_mc(const IVIBandDesc *band, ivi_mc_func mc, ivi_mc_avg_func mc_avg,
83
                  int offs, int mv_x, int mv_y, int mv_x2, int mv_y2,
84
                  int mc_type, int mc_type2)
85
2.33M
{
86
2.33M
    int ref_offs = offs + mv_y * band->pitch + mv_x;
87
2.33M
    int buf_size = band->pitch * band->aheight;
88
2.33M
    int min_size = band->pitch * (band->blk_size - 1) + band->blk_size;
89
2.33M
    int ref_size = (mc_type > 1) * band->pitch + (mc_type & 1);
90
91
2.33M
    if (mc_type != -1) {
92
2.27M
        av_assert0(offs >= 0 && ref_offs >= 0 && band->ref_buf);
93
2.27M
        av_assert0(buf_size - min_size >= offs);
94
2.27M
        av_assert0(buf_size - min_size - ref_size >= ref_offs);
95
2.27M
    }
96
97
2.33M
    if (mc_type2 == -1) {
98
2.25M
        mc(band->buf + offs, band->ref_buf + ref_offs, band->pitch, mc_type);
99
2.25M
    } else {
100
77.6k
        int ref_offs2 = offs + mv_y2 * band->pitch + mv_x2;
101
77.6k
        int ref_size2 = (mc_type2 > 1) * band->pitch + (mc_type2 & 1);
102
77.6k
        if (offs < 0 || ref_offs2 < 0 || !band->b_ref_buf)
103
0
            return AVERROR_INVALIDDATA;
104
77.6k
        if (buf_size - min_size - ref_size2 < ref_offs2)
105
0
            return AVERROR_INVALIDDATA;
106
107
77.6k
        if (mc_type == -1)
108
49.5k
            mc(band->buf + offs, band->b_ref_buf + ref_offs2,
109
49.5k
               band->pitch, mc_type2);
110
28.0k
        else
111
28.0k
            mc_avg(band->buf + offs, band->ref_buf + ref_offs,
112
28.0k
                   band->b_ref_buf + ref_offs2, band->pitch,
113
28.0k
                   mc_type, mc_type2);
114
77.6k
    }
115
116
2.33M
    return 0;
117
2.33M
}
118
119
/*
120
 *  Generate a huffman codebook from the given descriptor
121
 *  and convert it into the FFmpeg VLC table.
122
 *
123
 *  @param[in]   cb    pointer to codebook descriptor
124
 *  @param[out]  vlc   where to place the generated VLC table
125
 *  @param[in]   flag  flag: 1 - for static or 0 for dynamic tables
126
 *  @return     result code: 0 - OK, -1 = error (invalid codebook descriptor)
127
 */
128
static int ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag)
129
10.0k
{
130
10.0k
    int         pos, i, j, codes_per_row, prefix, not_last_row;
131
10.0k
    uint16_t    codewords[256]; /* FIXME: move this temporal storage out? */
132
10.0k
    uint8_t     bits[256];
133
134
10.0k
    pos = 0; /* current position = 0 */
135
136
91.2k
    for (i = 0; i < cb->num_rows; i++) {
137
83.2k
        codes_per_row = 1 << cb->xbits[i];
138
83.2k
        not_last_row  = (i != cb->num_rows - 1);
139
83.2k
        prefix        = ((1 << i) - 1) << (cb->xbits[i] + not_last_row);
140
141
1.66M
        for (j = 0; j < codes_per_row; j++) {
142
1.64M
            if (pos >= 256) /* Some Indeo5 codebooks can have more than 256 */
143
61.4k
                break;      /* elements, but only 256 codes are allowed! */
144
145
1.58M
            bits[pos] = i + cb->xbits[i] + not_last_row;
146
1.58M
            if (bits[pos] > IVI_VLC_BITS)
147
2.11k
                return AVERROR_INVALIDDATA; /* invalid descriptor */
148
149
1.57M
            codewords[pos] = prefix | j;
150
1.57M
            if (!bits[pos])
151
492
                bits[pos] = 1;
152
153
1.57M
            pos++;
154
1.57M
        }//for j
155
83.2k
    }//for i
156
157
    /* number of codewords = pos */
158
7.94k
    return vlc_init(vlc, IVI_VLC_BITS, pos, bits, 1, 1, codewords, 2, 2,
159
10.0k
                    (flag ? VLC_INIT_USE_STATIC : 0) | VLC_INIT_OUTPUT_LE);
160
10.0k
}
161
162
static av_cold void ivi_init_static_vlc(void)
163
2
{
164
2
    int i;
165
2
    static VLCElem table_data[8192 * 16];
166
167
18
    for (i = 0; i < 8; i++) {
168
16
        ivi_mb_vlc_tabs[i].table = table_data + i * 2 * 8192;
169
16
        ivi_mb_vlc_tabs[i].table_allocated = 8192;
170
16
        ivi_create_huff_from_desc(&ivi_mb_huff_desc[i],
171
16
                                  &ivi_mb_vlc_tabs[i], 1);
172
16
        ivi_blk_vlc_tabs[i].table = table_data + (i * 2 + 1) * 8192;
173
16
        ivi_blk_vlc_tabs[i].table_allocated = 8192;
174
16
        ivi_create_huff_from_desc(&ivi_blk_huff_desc[i],
175
16
                                  &ivi_blk_vlc_tabs[i], 1);
176
16
    }
177
2
}
178
179
av_cold void ff_ivi_init_static_vlc(void)
180
8.24k
{
181
8.24k
    static AVOnce init_static_once = AV_ONCE_INIT;
182
8.24k
    ff_thread_once(&init_static_once, ivi_init_static_vlc);
183
8.24k
}
184
185
/*
186
 *  Copy huffman codebook descriptors.
187
 *
188
 *  @param[out]  dst  ptr to the destination descriptor
189
 *  @param[in]   src  ptr to the source descriptor
190
 */
191
static void ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src)
192
10.0k
{
193
10.0k
    dst->num_rows = src->num_rows;
194
10.0k
    memcpy(dst->xbits, src->xbits, src->num_rows);
195
10.0k
}
196
197
/*
198
 *  Compare two huffman codebook descriptors.
199
 *
200
 *  @param[in]  desc1  ptr to the 1st descriptor to compare
201
 *  @param[in]  desc2  ptr to the 2nd descriptor to compare
202
 *  @return         comparison result: 0 - equal, 1 - not equal
203
 */
204
static int ivi_huff_desc_cmp(const IVIHuffDesc *desc1,
205
                             const IVIHuffDesc *desc2)
206
33.2k
{
207
33.2k
    return desc1->num_rows != desc2->num_rows ||
208
27.9k
           memcmp(desc1->xbits, desc2->xbits, desc1->num_rows);
209
33.2k
}
210
211
int ff_ivi_dec_huff_desc(GetBitContext *gb, int desc_coded, int which_tab,
212
                         IVIHuffTab *huff_tab, AVCodecContext *avctx)
213
219k
{
214
219k
    int i, result;
215
219k
    IVIHuffDesc new_huff;
216
217
219k
    if (!desc_coded) {
218
        /* select default table */
219
145k
        huff_tab->tab = (which_tab) ? &ivi_blk_vlc_tabs[7]
220
145k
                                    : &ivi_mb_vlc_tabs [7];
221
145k
        return 0;
222
145k
    }
223
224
74.1k
    huff_tab->tab_sel = get_bits(gb, 3);
225
74.1k
    if (huff_tab->tab_sel == 7) {
226
        /* custom huffman table (explicitly encoded) */
227
33.8k
        new_huff.num_rows = get_bits(gb, 4);
228
33.8k
        if (!new_huff.num_rows) {
229
617
            av_log(avctx, AV_LOG_ERROR, "Empty custom Huffman table!\n");
230
617
            return AVERROR_INVALIDDATA;
231
617
        }
232
233
219k
        for (i = 0; i < new_huff.num_rows; i++)
234
185k
            new_huff.xbits[i] = get_bits(gb, 4);
235
236
        /* Have we got the same custom table? Rebuild if not. */
237
33.2k
        if (ivi_huff_desc_cmp(&new_huff, &huff_tab->cust_desc) || !huff_tab->cust_tab.table) {
238
10.0k
            ivi_huff_desc_copy(&huff_tab->cust_desc, &new_huff);
239
240
10.0k
            if (huff_tab->cust_tab.table)
241
6.29k
                ff_vlc_free(&huff_tab->cust_tab);
242
10.0k
            result = ivi_create_huff_from_desc(&huff_tab->cust_desc,
243
10.0k
                    &huff_tab->cust_tab, 0);
244
10.0k
            if (result) {
245
                // reset faulty description
246
2.11k
                huff_tab->cust_desc.num_rows = 0;
247
2.11k
                av_log(avctx, AV_LOG_ERROR,
248
2.11k
                       "Error while initializing custom vlc table!\n");
249
2.11k
                return result;
250
2.11k
            }
251
10.0k
        }
252
31.1k
        huff_tab->tab = &huff_tab->cust_tab;
253
40.2k
    } else {
254
        /* select one of predefined tables */
255
40.2k
        huff_tab->tab = (which_tab) ? &ivi_blk_vlc_tabs[huff_tab->tab_sel]
256
40.2k
            : &ivi_mb_vlc_tabs [huff_tab->tab_sel];
257
40.2k
    }
258
259
71.3k
    return 0;
260
74.1k
}
261
262
/*
263
 *  Free planes, bands and macroblocks buffers.
264
 *
265
 *  @param[in]  planes  pointer to the array of the plane descriptors
266
 */
267
static av_cold void ivi_free_buffers(IVIPlaneDesc *planes)
268
39.7k
{
269
39.7k
    int p, b, t;
270
271
159k
    for (p = 0; p < 3; p++) {
272
119k
        if (planes[p].bands) {
273
207k
            for (b = 0; b < planes[p].num_bands; b++) {
274
118k
                IVIBandDesc *band = &planes[p].bands[b];
275
118k
                av_freep(&band->bufs[0]);
276
118k
                av_freep(&band->bufs[1]);
277
118k
                av_freep(&band->bufs[2]);
278
118k
                av_freep(&band->bufs[3]);
279
280
118k
                if (band->blk_vlc.cust_tab.table)
281
724
                    ff_vlc_free(&band->blk_vlc.cust_tab);
282
2.09M
                for (t = 0; t < band->num_tiles; t++)
283
1.97M
                    av_freep(&band->tiles[t].mbs);
284
118k
                av_freep(&band->tiles);
285
118k
            }
286
89.6k
        }
287
119k
        av_freep(&planes[p].bands);
288
119k
        planes[p].num_bands = 0;
289
119k
    }
290
39.7k
}
291
292
av_cold int ff_ivi_init_planes(AVCodecContext *avctx, IVIPlaneDesc *planes, const IVIPicConfig *cfg,
293
                               int is_indeo4)
294
31.5k
{
295
31.5k
    int p, b;
296
31.5k
    uint32_t b_width, b_height, align_fac, width_aligned,
297
31.5k
             height_aligned, buf_size;
298
31.5k
    IVIBandDesc *band;
299
300
31.5k
    ivi_free_buffers(planes);
301
302
31.5k
    if (av_image_check_size2(cfg->pic_width, cfg->pic_height, avctx->max_pixels, AV_PIX_FMT_YUV410P, 0, avctx) < 0 ||
303
29.8k
        cfg->luma_bands < 1 || cfg->chroma_bands < 1)
304
1.64k
        return AVERROR_INVALIDDATA;
305
306
    /* fill in the descriptor of the luminance plane */
307
29.8k
    planes[0].width     = cfg->pic_width;
308
29.8k
    planes[0].height    = cfg->pic_height;
309
29.8k
    planes[0].num_bands = cfg->luma_bands;
310
311
    /* fill in the descriptors of the chrominance planes */
312
29.8k
    planes[1].width     = planes[2].width     = (cfg->pic_width  + 3) >> 2;
313
29.8k
    planes[1].height    = planes[2].height    = (cfg->pic_height + 3) >> 2;
314
29.8k
    planes[1].num_bands = planes[2].num_bands = cfg->chroma_bands;
315
316
119k
    for (p = 0; p < 3; p++) {
317
89.6k
        planes[p].bands = av_calloc(planes[p].num_bands, sizeof(*planes[p].bands));
318
89.6k
        if (!planes[p].bands)
319
0
            return AVERROR(ENOMEM);
320
321
        /* select band dimensions: if there is only one band then it
322
         *  has the full size, if there are several bands each of them
323
         *  has only half size */
324
89.6k
        b_width  = planes[p].num_bands == 1 ? planes[p].width
325
89.6k
                                            : (planes[p].width  + 1) >> 1;
326
89.6k
        b_height = planes[p].num_bands == 1 ? planes[p].height
327
89.6k
                                            : (planes[p].height + 1) >> 1;
328
329
        /* luma   band buffers will be aligned on 16x16 (max macroblock size) */
330
        /* chroma band buffers will be aligned on   8x8 (max macroblock size) */
331
89.6k
        align_fac       = p ? 8 : 16;
332
89.6k
        width_aligned   = FFALIGN(b_width , align_fac);
333
89.6k
        height_aligned  = FFALIGN(b_height, align_fac);
334
89.6k
        buf_size        = width_aligned * height_aligned * sizeof(int16_t);
335
336
207k
        for (b = 0; b < planes[p].num_bands; b++) {
337
118k
            band = &planes[p].bands[b]; /* select appropriate plane/band */
338
118k
            band->plane    = p;
339
118k
            band->band_num = b;
340
118k
            band->width    = b_width;
341
118k
            band->height   = b_height;
342
118k
            band->pitch    = width_aligned;
343
118k
            band->aheight  = height_aligned;
344
118k
            av_assert0(!band->bufs[0] && !band->bufs[1] &&
345
118k
                       !band->bufs[2] && !band->bufs[3]);
346
118k
            band->bufsize  = buf_size/2;
347
118k
            av_assert0(buf_size % 2 == 0);
348
349
            /* reset custom vlc */
350
118k
            planes[p].bands[0].blk_vlc.cust_desc.num_rows = 0;
351
118k
        }
352
89.6k
    }
353
354
29.8k
    return 0;
355
29.8k
}
356
357
static int ivi_init_tiles(const IVIBandDesc *band, IVITile *ref_tile,
358
                          int p, int b, int t_height, int t_width)
359
73.8k
{
360
73.8k
    int x, y;
361
73.8k
    IVITile *tile = band->tiles;
362
363
345k
    for (y = 0; y < band->height; y += t_height) {
364
2.22M
        for (x = 0; x < band->width; x += t_width) {
365
1.95M
            tile->xpos     = x;
366
1.95M
            tile->ypos     = y;
367
1.95M
            tile->mb_size  = band->mb_size;
368
1.95M
            tile->width    = FFMIN(band->width - x,  t_width);
369
1.95M
            tile->height   = FFMIN(band->height - y, t_height);
370
1.95M
            tile->is_empty = tile->data_size = 0;
371
            /* calculate number of macroblocks */
372
1.95M
            tile->num_MBs  = IVI_MBs_PER_TILE(tile->width, tile->height,
373
1.95M
                                              band->mb_size);
374
375
1.95M
            av_freep(&tile->mbs);
376
1.95M
            tile->mbs = av_calloc(tile->num_MBs, sizeof(*tile->mbs));
377
1.95M
            if (!tile->mbs)
378
0
                return AVERROR(ENOMEM);
379
380
1.95M
            tile->ref_mbs = 0;
381
1.95M
            if (p || b) {
382
1.33M
                if (tile->num_MBs != ref_tile->num_MBs) {
383
522
                    av_log(NULL, AV_LOG_DEBUG, "ref_tile mismatch\n");
384
522
                    return AVERROR_INVALIDDATA;
385
522
                }
386
1.33M
                tile->ref_mbs = ref_tile->mbs;
387
1.33M
                ref_tile++;
388
1.33M
            }
389
1.95M
            tile++;
390
1.95M
        }
391
272k
    }
392
393
73.3k
    return 0;
394
73.8k
}
395
396
av_cold int ff_ivi_init_tiles(IVIPlaneDesc *planes,
397
                              int tile_width, int tile_height)
398
21.0k
{
399
21.0k
    int p, b, x_tiles, y_tiles, t_width, t_height, ret;
400
21.0k
    IVIBandDesc *band;
401
402
78.8k
    for (p = 0; p < 3; p++) {
403
59.7k
        t_width  = !p ? tile_width  : (tile_width  + 3) >> 2;
404
59.7k
        t_height = !p ? tile_height : (tile_height + 3) >> 2;
405
406
59.7k
        if (!p && planes[0].num_bands == 4) {
407
6.59k
            if (t_width % 2 || t_height % 2) {
408
1.40k
                avpriv_request_sample(NULL, "Odd tiles");
409
1.40k
                return AVERROR_PATCHWELCOME;
410
1.40k
            }
411
5.18k
            t_width  >>= 1;
412
5.18k
            t_height >>= 1;
413
5.18k
        }
414
58.3k
        if(t_width<=0 || t_height<=0)
415
0
            return AVERROR(EINVAL);
416
417
131k
        for (b = 0; b < planes[p].num_bands; b++) {
418
73.8k
            band = &planes[p].bands[b];
419
420
73.8k
            if (band->tiles) {
421
611
                int t;
422
1.73k
                for (t = 0; t < band->num_tiles; t++) {
423
1.12k
                    av_freep(&band->tiles[t].mbs);
424
1.12k
                }
425
611
            }
426
427
73.8k
            x_tiles = IVI_NUM_TILES(band->width, t_width);
428
73.8k
            y_tiles = IVI_NUM_TILES(band->height, t_height);
429
73.8k
            band->num_tiles = x_tiles * y_tiles;
430
431
73.8k
            av_freep(&band->tiles);
432
73.8k
            band->tiles = av_calloc(band->num_tiles, sizeof(*band->tiles));
433
73.8k
            if (!band->tiles) {
434
0
                band->num_tiles = 0;
435
0
                return AVERROR(ENOMEM);
436
0
            }
437
438
            /* use the first luma band as reference for motion vectors
439
             * and quant */
440
73.8k
            ret = ivi_init_tiles(band, planes[0].bands[0].tiles,
441
73.8k
                                 p, b, t_height, t_width);
442
73.8k
            if (ret < 0)
443
522
                return ret;
444
73.8k
        }
445
58.3k
    }
446
447
19.1k
    return 0;
448
21.0k
}
449
450
/*
451
 *  Decode size of the tile data.
452
 *  The size is stored as a variable-length field having the following format:
453
 *  if (tile_data_size < 255) than this field is only one byte long
454
 *  if (tile_data_size >= 255) than this field four is byte long: 0xFF X1 X2 X3
455
 *  where X1-X3 is size of the tile data
456
 *
457
 *  @param[in,out]  gb  the GetBit context
458
 *  @return     size of the tile data in bytes
459
 */
460
static int ivi_dec_tile_data_size(GetBitContext *gb)
461
54.5k
{
462
54.5k
    int    len;
463
464
54.5k
    len = 0;
465
54.5k
    if (get_bits1(gb)) {
466
27.2k
        len = get_bits(gb, 8);
467
27.2k
        if (len == 255)
468
1.29k
            len = get_bits(gb, 24);
469
27.2k
    }
470
471
    /* align the bitstream reader on the byte boundary */
472
54.5k
    align_get_bits(gb);
473
474
54.5k
    return len;
475
54.5k
}
476
477
static int ivi_dc_transform(const IVIBandDesc *band, int *prev_dc, int buf_offs,
478
                            int blk_size)
479
2.15M
{
480
2.15M
    band->dc_transform(prev_dc, band->buf + buf_offs,
481
2.15M
                       band->pitch, blk_size);
482
483
2.15M
    return 0;
484
2.15M
}
485
486
static int ivi_decode_coded_blocks(GetBitContext *gb, const IVIBandDesc *band,
487
                                   ivi_mc_func mc, ivi_mc_avg_func mc_avg,
488
                                   int mv_x, int mv_y,
489
                                   int mv_x2, int mv_y2,
490
                                   int *prev_dc, int is_intra,
491
                                   int mc_type, int mc_type2,
492
                                   uint32_t quant, int offs,
493
                                   AVCodecContext *avctx)
494
143k
{
495
143k
    const uint16_t *base_tab  = is_intra ? band->intra_base : band->inter_base;
496
143k
    RVMapDesc *rvmap = band->rv_map;
497
143k
    uint8_t col_flags[8];
498
143k
    int32_t trvec[64];
499
143k
    uint32_t sym = 0, lo, hi, q;
500
143k
    int pos, run, val;
501
143k
    int blk_size   = band->blk_size;
502
143k
    int num_coeffs = blk_size * blk_size;
503
143k
    int col_mask   = blk_size - 1;
504
143k
    int scan_pos   = -1;
505
143k
    int min_size   = band->pitch * (band->transform_size - 1) +
506
143k
                     band->transform_size;
507
143k
    int buf_size   = band->pitch * band->aheight - offs;
508
509
143k
    if (min_size > buf_size)
510
0
        return AVERROR_INVALIDDATA;
511
512
143k
    if (!band->scan) {
513
0
        av_log(avctx, AV_LOG_ERROR, "Scan pattern is not set.\n");
514
0
        return AVERROR_INVALIDDATA;
515
0
    }
516
517
    /* zero transform vector */
518
143k
    memset(trvec, 0, num_coeffs * sizeof(trvec[0]));
519
    /* zero column flags */
520
143k
    memset(col_flags, 0, sizeof(col_flags));
521
681k
    while (scan_pos <= num_coeffs) {
522
681k
        sym = get_vlc2(gb, band->blk_vlc.tab->table,
523
681k
                       IVI_VLC_BITS, 1);
524
681k
        if (sym == rvmap->eob_sym)
525
135k
            break; /* End of block */
526
527
        /* Escape - run/val explicitly coded using 3 vlc codes */
528
546k
        if (sym == rvmap->esc_sym) {
529
25.1k
            run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1;
530
25.1k
            lo  = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
531
25.1k
            hi  = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
532
            /* merge them and convert into signed val */
533
25.1k
            val = IVI_TOSIGNED((hi << 6) | lo);
534
520k
        } else {
535
520k
            if (sym >= 256U) {
536
935
                av_log(avctx, AV_LOG_ERROR, "Invalid sym encountered: %"PRIu32".\n", sym);
537
935
                return AVERROR_INVALIDDATA;
538
935
            }
539
520k
            run = rvmap->runtab[sym];
540
520k
            val = rvmap->valtab[sym];
541
520k
        }
542
543
        /* de-zigzag and dequantize */
544
545k
        scan_pos += run;
545
545k
        if (scan_pos >= num_coeffs || scan_pos < 0)
546
7.63k
            break;
547
537k
        pos = band->scan[scan_pos];
548
549
537k
        if (!val)
550
10.7k
            ff_dlog(avctx, "Val = 0 encountered!\n");
551
552
537k
        q = (base_tab[pos] * quant) >> 9;
553
537k
        if (q > 1)
554
400k
            val = val * q + FFSIGN(val) * (((q ^ 1) - 1) >> 1);
555
537k
        trvec[pos] = val;
556
        /* track columns containing non-zero coeffs */
557
537k
        col_flags[pos & col_mask] |= !!val;
558
537k
    }
559
560
142k
    if (scan_pos < 0 || scan_pos >= num_coeffs && sym != rvmap->eob_sym)
561
9.30k
        return AVERROR_INVALIDDATA; /* corrupt block data */
562
563
    /* undoing DC coeff prediction for intra-blocks */
564
133k
    if (is_intra && band->is_2d_trans) {
565
25.2k
        *prev_dc     += trvec[0];
566
25.2k
        trvec[0]      = *prev_dc;
567
25.2k
        col_flags[0] |= !!*prev_dc;
568
25.2k
    }
569
570
133k
    if(band->transform_size > band->blk_size){
571
0
        av_log(NULL, AV_LOG_ERROR, "Too large transform\n");
572
0
        return AVERROR_INVALIDDATA;
573
0
    }
574
575
    /* apply inverse transform */
576
133k
    band->inv_transform(trvec, band->buf + offs,
577
133k
                        band->pitch, col_flags);
578
579
    /* apply motion compensation */
580
133k
    if (!is_intra)
581
80.2k
        return ivi_mc(band, mc, mc_avg, offs, mv_x, mv_y, mv_x2, mv_y2,
582
80.2k
                      mc_type, mc_type2);
583
584
53.2k
    return 0;
585
133k
}
586
/*
587
 *  Decode block data:
588
 *  extract huffman-coded transform coefficients from the bitstream,
589
 *  dequantize them, apply inverse transform and motion compensation
590
 *  in order to reconstruct the picture.
591
 *
592
 *  @param[in,out]  gb    the GetBit context
593
 *  @param[in]      band  pointer to the band descriptor
594
 *  @param[in]      tile  pointer to the tile descriptor
595
 *  @return     result code: 0 - OK, -1 = error (corrupted blocks data)
596
 */
597
static int ivi_decode_blocks(GetBitContext *gb, const IVIBandDesc *band,
598
                             IVITile *tile, AVCodecContext *avctx)
599
21.3k
{
600
21.3k
    int mbn, blk, num_blocks, blk_size, ret, is_intra;
601
21.3k
    int mc_type = 0, mc_type2 = -1;
602
21.3k
    int mv_x = 0, mv_y = 0, mv_x2 = 0, mv_y2 = 0;
603
21.3k
    int32_t prev_dc;
604
21.3k
    uint32_t cbp, quant, buf_offs;
605
21.3k
    IVIMbInfo *mb;
606
21.3k
    ivi_mc_func mc_with_delta_func, mc_no_delta_func;
607
21.3k
    ivi_mc_avg_func mc_avg_with_delta_func, mc_avg_no_delta_func;
608
21.3k
    const uint8_t *scale_tab;
609
610
    /* init intra prediction for the DC coefficient */
611
21.3k
    prev_dc    = 0;
612
21.3k
    blk_size   = band->blk_size;
613
    /* number of blocks per mb */
614
21.3k
    num_blocks = (band->mb_size != blk_size) ? 4 : 1;
615
21.3k
    if (blk_size == 8) {
616
18.6k
        mc_with_delta_func     = ff_ivi_mc_8x8_delta;
617
18.6k
        mc_no_delta_func       = ff_ivi_mc_8x8_no_delta;
618
18.6k
        mc_avg_with_delta_func = ff_ivi_mc_avg_8x8_delta;
619
18.6k
        mc_avg_no_delta_func   = ff_ivi_mc_avg_8x8_no_delta;
620
18.6k
    } else {
621
2.64k
        mc_with_delta_func     = ff_ivi_mc_4x4_delta;
622
2.64k
        mc_no_delta_func       = ff_ivi_mc_4x4_no_delta;
623
2.64k
        mc_avg_with_delta_func = ff_ivi_mc_avg_4x4_delta;
624
2.64k
        mc_avg_no_delta_func   = ff_ivi_mc_avg_4x4_no_delta;
625
2.64k
    }
626
627
919k
    for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
628
912k
        is_intra = !mb->type;
629
912k
        cbp      = mb->cbp;
630
912k
        buf_offs = mb->buf_offs;
631
632
912k
        quant = band->glob_quant + mb->q_delta;
633
912k
        if (avctx->codec_id == AV_CODEC_ID_INDEO4)
634
168k
            quant = av_clip_uintp2(quant, 5);
635
744k
        else
636
744k
            quant = av_clip(quant, 0, 23);
637
638
912k
        scale_tab = is_intra ? band->intra_scale : band->inter_scale;
639
912k
        if (scale_tab)
640
744k
            quant = scale_tab[quant];
641
642
912k
        if (!is_intra) {
643
350k
            mv_x  = mb->mv_x;
644
350k
            mv_y  = mb->mv_y;
645
350k
            mv_x2 = mb->b_mv_x;
646
350k
            mv_y2 = mb->b_mv_y;
647
350k
            if (band->is_halfpel) {
648
257k
                mc_type  = ((mv_y  & 1) << 1) | (mv_x  & 1);
649
257k
                mc_type2 = ((mv_y2 & 1) << 1) | (mv_x2 & 1);
650
257k
                mv_x  >>= 1;
651
257k
                mv_y  >>= 1;
652
257k
                mv_x2 >>= 1;
653
257k
                mv_y2 >>= 1; /* convert halfpel vectors into fullpel ones */
654
257k
            }
655
350k
            if (mb->type == 2)
656
17.9k
                mc_type = -1;
657
350k
            if (mb->type != 2 && mb->type != 3)
658
319k
                mc_type2 = -1;
659
350k
            if (mb->type) {
660
350k
                int dmv_x, dmv_y, cx, cy;
661
662
350k
                dmv_x = mb->mv_x >> band->is_halfpel;
663
350k
                dmv_y = mb->mv_y >> band->is_halfpel;
664
350k
                cx    = mb->mv_x &  band->is_halfpel;
665
350k
                cy    = mb->mv_y &  band->is_halfpel;
666
667
350k
                if (mb->xpos + dmv_x < 0 ||
668
349k
                    mb->xpos + dmv_x + band->mb_size + cx > band->pitch ||
669
349k
                    mb->ypos + dmv_y < 0 ||
670
349k
                    mb->ypos + dmv_y + band->mb_size + cy > band->aheight) {
671
1.26k
                    return AVERROR_INVALIDDATA;
672
1.26k
                }
673
350k
            }
674
349k
            if (mb->type == 2 || mb->type == 3) {
675
30.4k
                int dmv_x, dmv_y, cx, cy;
676
677
30.4k
                dmv_x = mb->b_mv_x >> band->is_halfpel;
678
30.4k
                dmv_y = mb->b_mv_y >> band->is_halfpel;
679
30.4k
                cx    = mb->b_mv_x &  band->is_halfpel;
680
30.4k
                cy    = mb->b_mv_y &  band->is_halfpel;
681
682
30.4k
                if (mb->xpos + dmv_x < 0 ||
683
30.2k
                    mb->xpos + dmv_x + band->mb_size + cx > band->pitch ||
684
29.9k
                    mb->ypos + dmv_y < 0 ||
685
29.7k
                    mb->ypos + dmv_y + band->mb_size + cy > band->aheight) {
686
3.48k
                    return AVERROR_INVALIDDATA;
687
3.48k
                }
688
30.4k
            }
689
349k
        }
690
691
3.83M
        for (blk = 0; blk < num_blocks; blk++) {
692
            /* adjust block position in the buffer according to its number */
693
2.94M
            if (blk & 1) {
694
1.35M
                buf_offs += blk_size;
695
1.58M
            } else if (blk == 2) {
696
678k
                buf_offs -= blk_size;
697
678k
                buf_offs += blk_size * band->pitch;
698
678k
            }
699
700
2.94M
            if (cbp & 1) { /* block coded ? */
701
143k
                ret = ivi_decode_coded_blocks(gb, band, mc_with_delta_func,
702
143k
                                              mc_avg_with_delta_func,
703
143k
                                              mv_x, mv_y, mv_x2, mv_y2,
704
143k
                                              &prev_dc, is_intra,
705
143k
                                              mc_type, mc_type2, quant,
706
143k
                                              buf_offs, avctx);
707
143k
                if (ret < 0)
708
10.2k
                    return ret;
709
2.79M
            } else {
710
2.79M
                int buf_size = band->pitch * band->aheight - buf_offs;
711
2.79M
                int min_size = (blk_size - 1) * band->pitch + blk_size;
712
713
2.79M
                if (min_size > buf_size)
714
0
                    return AVERROR_INVALIDDATA;
715
                /* block not coded */
716
                /* for intra blocks apply the dc slant transform */
717
                /* for inter - perform the motion compensation without delta */
718
2.79M
                if (is_intra) {
719
2.15M
                    ret = ivi_dc_transform(band, &prev_dc, buf_offs, blk_size);
720
2.15M
                    if (ret < 0)
721
0
                        return ret;
722
2.15M
                } else {
723
643k
                    ret = ivi_mc(band, mc_no_delta_func, mc_avg_no_delta_func,
724
643k
                                 buf_offs, mv_x, mv_y, mv_x2, mv_y2,
725
643k
                                 mc_type, mc_type2);
726
643k
                    if (ret < 0)
727
0
                        return ret;
728
643k
                }
729
2.79M
            }
730
731
2.93M
            cbp >>= 1;
732
2.93M
        }// for blk
733
908k
    }// for mbn
734
735
6.33k
    align_get_bits(gb);
736
737
6.33k
    return 0;
738
21.3k
}
739
740
/**
741
 *  Handle empty tiles by performing data copying and motion
742
 *  compensation respectively.
743
 *
744
 *  @param[in]  avctx     ptr to the AVCodecContext
745
 *  @param[in]  band      pointer to the band descriptor
746
 *  @param[in]  tile      pointer to the tile descriptor
747
 *  @param[in]  mv_scale  scaling factor for motion vectors
748
 */
749
static int ivi_process_empty_tile(AVCodecContext *avctx, const IVIBandDesc *band,
750
                                  IVITile *tile, int32_t mv_scale)
751
163k
{
752
163k
    int             x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
753
163k
    int             offs, mb_offset, row_offset, ret;
754
163k
    IVIMbInfo       *mb, *ref_mb;
755
163k
    const int16_t   *src;
756
163k
    int16_t         *dst;
757
163k
    ivi_mc_func     mc_no_delta_func;
758
163k
    int             clear_first = !band->qdelta_present && !band->plane && !band->band_num;
759
163k
    int             mb_size     = band->mb_size;
760
163k
    int             xend        = tile->xpos + tile->width;
761
163k
    int             is_halfpel  = band->is_halfpel;
762
163k
    int             pitch       = band->pitch;
763
764
163k
    if (tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, mb_size)) {
765
0
        av_log(avctx, AV_LOG_ERROR, "Allocated tile size %d mismatches "
766
0
               "parameters %d in ivi_process_empty_tile()\n",
767
0
               tile->num_MBs, IVI_MBs_PER_TILE(tile->width, tile->height, mb_size));
768
0
        return AVERROR_INVALIDDATA;
769
0
    }
770
771
163k
    offs       = tile->ypos * pitch + tile->xpos;
772
163k
    mb         = tile->mbs;
773
163k
    ref_mb     = tile->ref_mbs;
774
163k
    row_offset = mb_size * pitch;
775
163k
    need_mc    = 0; /* reset the mc tracking flag */
776
777
2.67M
    for (y = tile->ypos; y < (tile->ypos + tile->height); y += mb_size) {
778
2.51M
        mb_offset = offs;
779
780
68.8M
        for (x = tile->xpos; x < xend; x += mb_size) {
781
66.3M
            mb->xpos     = x;
782
66.3M
            mb->ypos     = y;
783
66.3M
            mb->buf_offs = mb_offset;
784
785
66.3M
            mb->type = 1; /* set the macroblocks type = INTER */
786
66.3M
            mb->cbp  = 0; /* all blocks are empty */
787
788
66.3M
            if (clear_first) {
789
19.6M
                mb->q_delta = band->glob_quant;
790
19.6M
                mb->mv_x    = 0;
791
19.6M
                mb->mv_y    = 0;
792
19.6M
            }
793
794
66.3M
            if (ref_mb) {
795
40.0M
                if (band->inherit_qdelta)
796
11.1M
                    mb->q_delta = ref_mb->q_delta;
797
798
40.0M
                if (band->inherit_mv) {
799
                    /* motion vector inheritance */
800
32.1M
                    if (mv_scale) {
801
31.8M
                        mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
802
31.8M
                        mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
803
31.8M
                    } else {
804
294k
                        mb->mv_x = ref_mb->mv_x;
805
294k
                        mb->mv_y = ref_mb->mv_y;
806
294k
                    }
807
32.1M
                    need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
808
32.1M
                    {
809
32.1M
                        int dmv_x, dmv_y, cx, cy;
810
811
32.1M
                        dmv_x = mb->mv_x >> is_halfpel;
812
32.1M
                        dmv_y = mb->mv_y >> is_halfpel;
813
32.1M
                        cx    = mb->mv_x &  is_halfpel;
814
32.1M
                        cy    = mb->mv_y &  is_halfpel;
815
816
32.1M
                        if (   mb->xpos + dmv_x < 0
817
32.1M
                            || mb->xpos + dmv_x + mb_size + cx > pitch
818
32.1M
                            || mb->ypos + dmv_y < 0
819
32.1M
                            || mb->ypos + dmv_y + mb_size + cy > band->aheight) {
820
1.85k
                            av_log(avctx, AV_LOG_ERROR, "MV out of bounds\n");
821
1.85k
                            return AVERROR_INVALIDDATA;
822
1.85k
                        }
823
32.1M
                    }
824
32.1M
                }
825
40.0M
                ref_mb++;
826
40.0M
            }
827
828
66.3M
            mb++;
829
66.3M
            mb_offset += mb_size;
830
66.3M
        } // for x
831
2.51M
        offs += row_offset;
832
2.51M
    } // for y
833
834
162k
    if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */
835
1.14k
        num_blocks = (mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */
836
1.14k
        mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
837
1.14k
                                                 : ff_ivi_mc_4x4_no_delta;
838
839
1.57M
        for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
840
1.57M
            mv_x = mb->mv_x;
841
1.57M
            mv_y = mb->mv_y;
842
1.57M
            if (!band->is_halfpel) {
843
524k
                mc_type = 0; /* we have only fullpel vectors */
844
1.05M
            } else {
845
1.05M
                mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
846
1.05M
                mv_x >>= 1;
847
1.05M
                mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
848
1.05M
            }
849
850
3.18M
            for (blk = 0; blk < num_blocks; blk++) {
851
                /* adjust block position in the buffer according with its number */
852
1.61M
                offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * pitch);
853
1.61M
                ret = ivi_mc(band, mc_no_delta_func, 0, offs,
854
1.61M
                             mv_x, mv_y, 0, 0, mc_type, -1);
855
1.61M
                if (ret < 0)
856
0
                    return ret;
857
1.61M
            }
858
1.57M
        }
859
160k
    } else {
860
        /* copy data from the reference tile into the current one */
861
160k
        src = band->ref_buf + tile->ypos * pitch + tile->xpos;
862
160k
        dst = band->buf     + tile->ypos * pitch + tile->xpos;
863
28.8M
        for (y = 0; y < tile->height; y++) {
864
28.6M
            memcpy(dst, src, tile->width*sizeof(band->buf[0]));
865
28.6M
            src += pitch;
866
28.6M
            dst += pitch;
867
28.6M
        }
868
160k
    }
869
870
162k
    return 0;
871
162k
}
872
873
874
#ifdef DEBUG
875
static uint16_t ivi_calc_band_checksum(const IVIBandDesc *band)
876
{
877
    int         x, y;
878
    int16_t     *src, checksum;
879
880
    src = band->buf;
881
    checksum = 0;
882
883
    for (y = 0; y < band->height; src += band->pitch, y++)
884
        for (x = 0; x < band->width; x++)
885
            checksum += src[x];
886
887
    return checksum;
888
}
889
#endif
890
891
/*
892
 *  Convert and output the current plane.
893
 *  This conversion is done by adding back the bias value of 128
894
 *  (subtracted in the encoder) and clipping the result.
895
 *
896
 *  @param[in]   plane      pointer to the descriptor of the plane being processed
897
 *  @param[out]  dst        pointer to the buffer receiving converted pixels
898
 *  @param[in]   dst_pitch  pitch for moving to the next y line
899
 */
900
static void ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, ptrdiff_t dst_pitch)
901
32.6k
{
902
32.6k
    int             x, y;
903
32.6k
    const int16_t   *src  = plane->bands[0].buf;
904
32.6k
    ptrdiff_t       pitch = plane->bands[0].pitch;
905
906
32.6k
    if (!src)
907
0
        return;
908
909
7.04M
    for (y = 0; y < plane->height; y++) {
910
7.01M
        int m = 0;
911
7.01M
        int w = plane->width;
912
3.66G
        for (x = 0; x < w; x++) {
913
3.65G
            int t = src[x] + 128;
914
3.65G
            dst[x] = t;
915
3.65G
            m |= t;
916
3.65G
        }
917
7.01M
        if (m & ~255)
918
324k
            for (x = 0; x < w; x++)
919
322k
                dst[x] = av_clip_uint8(src[x] + 128);
920
7.01M
        src += pitch;
921
7.01M
        dst += dst_pitch;
922
7.01M
    }
923
32.6k
}
924
925
static void *prepare_buf(IVI45DecContext *ctx, IVIBandDesc *band, int i)
926
277k
{
927
277k
    if (ctx->pic_conf.luma_bands <= 1 && i == 2)
928
413
        return NULL;
929
277k
    if (!band->bufs[i])
930
65.1k
        band->bufs[i] = av_mallocz(2 * band->bufsize);
931
277k
    return band->bufs[i];
932
277k
}
933
934
/**
935
 *  Decode an Indeo 4 or 5 band.
936
 *
937
 *  @param[in,out]  ctx    ptr to the decoder context
938
 *  @param[in,out]  band   ptr to the band descriptor
939
 *  @param[in]      avctx  ptr to the AVCodecContext
940
 *  @return         result code: 0 = OK, -1 = error
941
 */
942
static int decode_band(IVI45DecContext *ctx,
943
                       IVIBandDesc *band, AVCodecContext *avctx)
944
132k
{
945
132k
    int         result, i, t, idx1, idx2, pos;
946
132k
    IVITile     *tile;
947
948
132k
    band->buf     = prepare_buf(ctx, band, ctx->dst_buf);
949
132k
    if (!band->buf) {
950
214
        av_log(avctx, AV_LOG_ERROR, "Band buffer points to no data!\n");
951
214
        return AVERROR_INVALIDDATA;
952
214
    }
953
131k
    if (ctx->is_indeo4 && ctx->frame_type == IVI4_FRAMETYPE_BIDIR) {
954
13.7k
        band->ref_buf   = prepare_buf(ctx, band, ctx->b_ref_buf);
955
13.7k
        band->b_ref_buf = prepare_buf(ctx, band, ctx->ref_buf);
956
13.7k
        if (!band->b_ref_buf)
957
0
            return AVERROR(ENOMEM);
958
118k
    } else {
959
118k
        band->ref_buf   = prepare_buf(ctx, band, ctx->ref_buf);
960
118k
        band->b_ref_buf = 0;
961
118k
    }
962
131k
    if (!band->ref_buf)
963
199
        return AVERROR(ENOMEM);
964
131k
    band->data_ptr  = ctx->frame_data + (get_bits_count(&ctx->gb) >> 3);
965
966
131k
    result = ctx->decode_band_hdr(ctx, band, avctx);
967
131k
    if (result) {
968
8.39k
        av_log(avctx, AV_LOG_ERROR, "Error while decoding band header: %d\n",
969
8.39k
               result);
970
8.39k
        return result;
971
8.39k
    }
972
973
123k
    if (band->is_empty) {
974
8.02k
        av_log(avctx, AV_LOG_ERROR, "Empty band encountered!\n");
975
8.02k
        return AVERROR_INVALIDDATA;
976
8.02k
    }
977
978
115k
    band->rv_map = &ctx->rvmap_tabs[band->rvmap_sel];
979
980
    /* apply corrections to the selected rvmap table if present */
981
187k
    for (i = 0; i < band->num_corr; i++) {
982
72.7k
        idx1 = band->corr[i * 2];
983
72.7k
        idx2 = band->corr[i * 2 + 1];
984
72.7k
        FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
985
72.7k
        FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
986
72.7k
        if (idx1 == band->rv_map->eob_sym || idx2 == band->rv_map->eob_sym)
987
4.11k
            band->rv_map->eob_sym ^= idx1 ^ idx2;
988
72.7k
        if (idx1 == band->rv_map->esc_sym || idx2 == band->rv_map->esc_sym)
989
5.29k
            band->rv_map->esc_sym ^= idx1 ^ idx2;
990
72.7k
    }
991
992
115k
    pos = get_bits_count(&ctx->gb);
993
994
279k
    for (t = 0; t < band->num_tiles; t++) {
995
220k
        tile = &band->tiles[t];
996
997
220k
        if (tile->mb_size != band->mb_size ||
998
218k
            ctx->planes[0].bands[0].mb_size < band->mb_size
999
220k
        ) {
1000
2.27k
            av_log(avctx, AV_LOG_ERROR, "MB sizes mismatch: %d vs. %d vs. %d\n",
1001
2.27k
                   band->mb_size, tile->mb_size, ctx->planes[0].bands[0].mb_size);
1002
2.27k
            return AVERROR_INVALIDDATA;
1003
2.27k
        }
1004
218k
        tile->is_empty = get_bits1(&ctx->gb);
1005
218k
        if (tile->is_empty) {
1006
163k
            result = ivi_process_empty_tile(avctx, band, tile,
1007
163k
                                      (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3));
1008
163k
            if (result < 0)
1009
1.85k
                break;
1010
162k
            ff_dlog(avctx, "Empty tile encountered!\n");
1011
162k
        } else {
1012
54.5k
            tile->data_size = ivi_dec_tile_data_size(&ctx->gb);
1013
54.5k
            if (!tile->data_size) {
1014
27.8k
                av_log(avctx, AV_LOG_ERROR, "Tile data size is zero!\n");
1015
27.8k
                result = AVERROR_INVALIDDATA;
1016
27.8k
                break;
1017
27.8k
            }
1018
1019
26.7k
            result = ctx->decode_mb_info(ctx, band, tile, avctx);
1020
26.7k
            if (result < 0)
1021
5.43k
                break;
1022
1023
21.3k
            result = ivi_decode_blocks(&ctx->gb, band, tile, avctx);
1024
21.3k
            if (result < 0) {
1025
14.9k
                av_log(avctx, AV_LOG_ERROR,
1026
14.9k
                       "Corrupted tile data encountered!\n");
1027
14.9k
                break;
1028
14.9k
            }
1029
1030
6.33k
            if (((get_bits_count(&ctx->gb) - pos) >> 3) != tile->data_size) {
1031
3.85k
                av_log(avctx, AV_LOG_ERROR,
1032
3.85k
                       "Tile data_size mismatch!\n");
1033
3.85k
                result = AVERROR_INVALIDDATA;
1034
3.85k
                break;
1035
3.85k
            }
1036
1037
2.47k
            pos += tile->data_size << 3; // skip to next tile
1038
2.47k
        }
1039
218k
    }
1040
1041
    /* restore the selected rvmap table by applying its corrections in
1042
     * reverse order */
1043
169k
    for (i = band->num_corr-1; i >= 0; i--) {
1044
57.0k
        idx1 = band->corr[i*2];
1045
57.0k
        idx2 = band->corr[i*2+1];
1046
57.0k
        FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
1047
57.0k
        FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
1048
57.0k
        if (idx1 == band->rv_map->eob_sym || idx2 == band->rv_map->eob_sym)
1049
3.54k
            band->rv_map->eob_sym ^= idx1 ^ idx2;
1050
57.0k
        if (idx1 == band->rv_map->esc_sym || idx2 == band->rv_map->esc_sym)
1051
4.57k
            band->rv_map->esc_sym ^= idx1 ^ idx2;
1052
57.0k
    }
1053
1054
#ifdef DEBUG
1055
    if (band->checksum_present) {
1056
        uint16_t chksum = ivi_calc_band_checksum(band);
1057
        if (chksum != band->checksum) {
1058
            av_log(avctx, AV_LOG_ERROR,
1059
                   "Band checksum mismatch! Plane %d, band %d, "
1060
                   "received: %"PRIx32", calculated: %"PRIx16"\n",
1061
                   band->plane, band->band_num, band->checksum, chksum);
1062
        }
1063
    }
1064
#endif
1065
1066
112k
    align_get_bits(&ctx->gb);
1067
1068
112k
    return result;
1069
115k
}
1070
1071
int ff_ivi_decode_frame(AVCodecContext *avctx, AVFrame *frame,
1072
                        int *got_frame, AVPacket *avpkt)
1073
390k
{
1074
390k
    IVI45DecContext *ctx = avctx->priv_data;
1075
390k
    const uint8_t   *buf = avpkt->data;
1076
390k
    int             buf_size = avpkt->size;
1077
390k
    int             result, p, b;
1078
1079
390k
    result = init_get_bits8(&ctx->gb, buf, buf_size);
1080
390k
    if (result < 0)
1081
0
        return result;
1082
390k
    ctx->frame_data = buf;
1083
390k
    ctx->frame_size = buf_size;
1084
1085
390k
    result = ctx->decode_pic_hdr(ctx, avctx);
1086
390k
    if (result) {
1087
45.3k
        av_log(avctx, AV_LOG_ERROR,
1088
45.3k
               "Error while decoding picture header: %d\n", result);
1089
45.3k
        return result;
1090
45.3k
    }
1091
345k
    if (ctx->gop_invalid)
1092
8.19k
        return AVERROR_INVALIDDATA;
1093
1094
337k
    if (ctx->is_indeo4 && ctx->frame_type == IVI4_FRAMETYPE_NULL_LAST) {
1095
153k
        if (ctx->got_p_frame) {
1096
253
            av_frame_move_ref(frame, ctx->p_frame);
1097
253
            *got_frame = 1;
1098
253
            ctx->got_p_frame = 0;
1099
153k
        } else {
1100
153k
            *got_frame = 0;
1101
153k
        }
1102
153k
        return buf_size;
1103
153k
    }
1104
1105
183k
    if (ctx->gop_flags & IVI5_IS_PROTECTED) {
1106
478
        avpriv_report_missing_feature(avctx, "Password-protected clip");
1107
478
        return AVERROR_PATCHWELCOME;
1108
478
    }
1109
1110
183k
    if (!ctx->planes[0].bands) {
1111
197
        av_log(avctx, AV_LOG_ERROR, "Color planes not initialized yet\n");
1112
197
        return AVERROR_INVALIDDATA;
1113
197
    }
1114
1115
182k
    ctx->switch_buffers(ctx);
1116
1117
182k
    if (ctx->is_nonnull_frame(ctx)) {
1118
84.2k
        ctx->buf_invalid[ctx->dst_buf] = 1;
1119
128k
        for (p = 0; p < 3; p++) {
1120
176k
            for (b = 0; b < ctx->planes[p].num_bands; b++) {
1121
132k
                result = decode_band(ctx, &ctx->planes[p].bands[b], avctx);
1122
132k
                if (result < 0) {
1123
73.0k
                    av_log(avctx, AV_LOG_ERROR,
1124
73.0k
                           "Error while decoding band: %d, plane: %d\n", b, p);
1125
73.0k
                    return result;
1126
73.0k
                }
1127
132k
            }
1128
117k
        }
1129
11.1k
        ctx->buf_invalid[ctx->dst_buf] = 0;
1130
98.6k
    } else {
1131
98.6k
        if (ctx->is_scalable)
1132
17.2k
            return AVERROR_INVALIDDATA;
1133
1134
323k
        for (p = 0; p < 3; p++) {
1135
243k
            if (!ctx->planes[p].bands[0].buf)
1136
1.11k
                return AVERROR_INVALIDDATA;
1137
243k
        }
1138
81.4k
    }
1139
91.5k
    if (ctx->buf_invalid[ctx->dst_buf])
1140
8.87k
        return -1;
1141
1142
82.6k
    if (!ctx->is_nonnull_frame(ctx))
1143
71.4k
        return buf_size;
1144
1145
11.1k
    result = ff_set_dimensions(avctx, ctx->planes[0].width, ctx->planes[0].height);
1146
11.1k
    if (result < 0)
1147
0
        return result;
1148
1149
11.1k
    if ((result = ff_get_buffer(avctx, frame, 0)) < 0)
1150
87
        return result;
1151
1152
11.0k
    if (ctx->is_scalable) {
1153
553
        if (ctx->is_indeo4)
1154
0
            ff_ivi_recompose_haar(&ctx->planes[0], frame->data[0], frame->linesize[0]);
1155
553
        else
1156
553
            ff_ivi_recompose53   (&ctx->planes[0], frame->data[0], frame->linesize[0]);
1157
10.5k
    } else {
1158
10.5k
        ivi_output_plane(&ctx->planes[0], frame->data[0], frame->linesize[0]);
1159
10.5k
    }
1160
1161
11.0k
    ivi_output_plane(&ctx->planes[2], frame->data[1], frame->linesize[1]);
1162
11.0k
    ivi_output_plane(&ctx->planes[1], frame->data[2], frame->linesize[2]);
1163
1164
11.0k
    *got_frame = 1;
1165
1166
    /* If the bidirectional mode is enabled, next I and the following P
1167
     * frame will be sent together. Unfortunately the approach below seems
1168
     * to be the only way to handle the B-frames mode.
1169
     * That's exactly the same Intel decoders do.
1170
     */
1171
11.0k
    if (ctx->is_indeo4 && ctx->frame_type == IVI4_FRAMETYPE_INTRA) {
1172
3.68k
        int left;
1173
1174
            // skip version string
1175
3.29M
        while (get_bits(&ctx->gb, 8)) {
1176
3.29M
            if (get_bits_left(&ctx->gb) < 8)
1177
673
                return AVERROR_INVALIDDATA;
1178
3.29M
        }
1179
3.01k
        left = get_bits_count(&ctx->gb) & 0x18;
1180
3.01k
        skip_bits_long(&ctx->gb, 64 - left);
1181
3.01k
        if (get_bits_left(&ctx->gb) > 18 &&
1182
943
            show_bits(&ctx->gb, 21) == 0xBFFF8) { // syncheader + inter type
1183
523
            AVPacket pkt;
1184
523
            pkt.data = avpkt->data + (get_bits_count(&ctx->gb) >> 3);
1185
523
            pkt.size = get_bits_left(&ctx->gb) >> 3;
1186
523
            ctx->got_p_frame = 0;
1187
523
            av_frame_unref(ctx->p_frame);
1188
523
            ff_ivi_decode_frame(avctx, ctx->p_frame, &ctx->got_p_frame, &pkt);
1189
523
        }
1190
3.01k
    }
1191
1192
10.3k
    if (ctx->show_indeo4_info) {
1193
488
        if (ctx->is_scalable)
1194
8
            av_log(avctx, AV_LOG_DEBUG, "This video uses scalability mode\n");
1195
488
        if (ctx->uses_tiling)
1196
78
            av_log(avctx, AV_LOG_DEBUG, "This video uses local decoding\n");
1197
488
        if (ctx->has_b_frames)
1198
53
            av_log(avctx, AV_LOG_DEBUG, "This video contains B-frames\n");
1199
488
        if (ctx->has_transp)
1200
164
            av_log(avctx, AV_LOG_DEBUG, "Transparency mode is enabled\n");
1201
488
        if (ctx->uses_haar)
1202
311
            av_log(avctx, AV_LOG_DEBUG, "This video uses Haar transform\n");
1203
488
        if (ctx->uses_fullpel)
1204
484
            av_log(avctx, AV_LOG_DEBUG, "This video uses fullpel motion vectors\n");
1205
488
        ctx->show_indeo4_info = 0;
1206
488
    }
1207
1208
10.3k
    return buf_size;
1209
11.0k
}
1210
1211
/**
1212
 *  Close Indeo5 decoder and clean up its context.
1213
 */
1214
av_cold int ff_ivi_decode_close(AVCodecContext *avctx)
1215
8.24k
{
1216
8.24k
    IVI45DecContext *ctx = avctx->priv_data;
1217
1218
8.24k
    ivi_free_buffers(&ctx->planes[0]);
1219
1220
8.24k
    if (ctx->mb_vlc.cust_tab.table)
1221
746
        ff_vlc_free(&ctx->mb_vlc.cust_tab);
1222
1223
8.24k
    if (ctx->blk_vlc.cust_tab.table)
1224
144
        ff_vlc_free(&ctx->blk_vlc.cust_tab);
1225
1226
8.24k
    av_frame_free(&ctx->p_frame);
1227
1228
8.24k
    return 0;
1229
8.24k
}
1230
1231
1232
/**
1233
 *  Scan patterns shared between indeo4 and indeo5
1234
 */
1235
const uint8_t ff_ivi_vertical_scan_8x8[64] = {
1236
    0,  8, 16, 24, 32, 40, 48, 56,
1237
    1,  9, 17, 25, 33, 41, 49, 57,
1238
    2, 10, 18, 26, 34, 42, 50, 58,
1239
    3, 11, 19, 27, 35, 43, 51, 59,
1240
    4, 12, 20, 28, 36, 44, 52, 60,
1241
    5, 13, 21, 29, 37, 45, 53, 61,
1242
    6, 14, 22, 30, 38, 46, 54, 62,
1243
    7, 15, 23, 31, 39, 47, 55, 63
1244
};
1245
1246
const uint8_t ff_ivi_horizontal_scan_8x8[64] = {
1247
     0,  1,  2,  3,  4,  5,  6,  7,
1248
     8,  9, 10, 11, 12, 13, 14, 15,
1249
    16, 17, 18, 19, 20, 21, 22, 23,
1250
    24, 25, 26, 27, 28, 29, 30, 31,
1251
    32, 33, 34, 35, 36, 37, 38, 39,
1252
    40, 41, 42, 43, 44, 45, 46, 47,
1253
    48, 49, 50, 51, 52, 53, 54, 55,
1254
    56, 57, 58, 59, 60, 61, 62, 63
1255
};
1256
1257
const uint8_t ff_ivi_direct_scan_4x4[16] = {
1258
    0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15
1259
};
1260
1261
1262
/**
1263
 *  Run-value (RLE) tables.
1264
 */
1265
const RVMapDesc ff_ivi_rvmap_tabs[9] = {
1266
{   /* MapTab0 */
1267
    5, /* eob_sym */
1268
    2, /* esc_sym */
1269
    /* run table */
1270
    {1,  1,  0,  1,  1,  0,  1,  1,  2,  2,  1,  1,  1,  1,  3,  3,
1271
     1,  1,  2,  2,  1,  1,  4,  4,  1,  1,  1,  1,  2,  2,  5,  5,
1272
     1,  1,  3,  3,  1,  1,  6,  6,  1,  2,  1,  2,  7,  7,  1,  1,
1273
     8,  8,  1,  1,  4,  2,  1,  4,  2,  1,  3,  3,  1,  1,  1,  9,
1274
     9,  1,  2,  1,  2,  1,  5,  5,  1,  1, 10, 10,  1,  1,  3,  3,
1275
     2,  2,  1,  1, 11, 11,  6,  4,  4,  1,  6,  1,  2,  1,  2, 12,
1276
     8,  1, 12,  7,  8,  7,  1, 16,  1, 16,  1,  3,  3, 13,  1, 13,
1277
     2,  2,  1, 15,  1,  5, 14, 15,  1,  5, 14,  1, 17,  8, 17,  8,
1278
     1,  4,  4,  2,  2,  1, 25, 25, 24, 24,  1,  3,  1,  3,  1,  8,
1279
     6,  7,  6,  1, 18,  8, 18,  1,  7, 23,  2,  2, 23,  1,  1, 21,
1280
    22,  9,  9, 22, 19,  1, 21,  5, 19,  5,  1, 33, 20, 33, 20,  8,
1281
     4,  4,  1, 32,  2,  2,  8,  3, 32, 26,  3,  1,  7,  7, 26,  6,
1282
     1,  6,  1,  1, 16,  1, 10,  1, 10,  2, 16, 29, 28,  2, 29, 28,
1283
     1, 27,  5,  8,  5, 27,  1,  8,  3,  7,  3, 31, 41, 31,  1, 41,
1284
     6,  1,  6,  7,  4,  4,  1,  1,  2,  1,  2, 11, 34, 30, 11,  1,
1285
    30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
1286
1287
    /* value table */
1288
    { 1,  -1,   0,   2,  -2,   0,   3,  -3,   1,  -1,   4,  -4,   5,  -5,   1,  -1,
1289
      6,  -6,   2,  -2,   7,  -7,   1,  -1,   8,  -8,   9,  -9,   3,  -3,   1,  -1,
1290
     10, -10,   2,  -2,  11, -11,   1,  -1,  12,   4, -12,  -4,   1,  -1,  13, -13,
1291
      1,  -1,  14, -14,   2,   5,  15,  -2,  -5, -15,  -3,   3,  16, -16,  17,   1,
1292
     -1, -17,   6,  18,  -6, -18,   2,  -2,  19, -19,   1,  -1,  20, -20,   4,  -4,
1293
      7,  -7,  21, -21,   1,  -1,   2,   3,  -3,  22,  -2, -22,   8,  23,  -8,   1,
1294
      2, -23,  -1,   2,  -2,  -2,  24,   1, -24,  -1,  25,   5,  -5,   1, -25,  -1,
1295
      9,  -9,  26,   1, -26,   3,   1,  -1,  27,  -3,  -1, -27,   1,   3,  -1,  -3,
1296
     28,  -4,   4,  10, -10, -28,   1,  -1,   1,  -1,  29,   6, -29,  -6,  30,  -4,
1297
      3,   3,  -3, -30,   1,   4,  -1,  31,  -3,   1,  11, -11,  -1, -31,  32,  -1,
1298
     -1,   2,  -2,   1,   1, -32,   1,   4,  -1,  -4,  33,  -1,   1,   1,  -1,   5,
1299
      5,  -5, -33,  -1, -12,  12,  -5,  -7,   1,   1,   7,  34,   4,  -4,  -1,   4,
1300
    -34,  -4,  35,  36,  -2, -35,  -2, -36,   2,  13,   2,  -1,   1, -13,   1,  -1,
1301
     37,   1,  -5,   6,   5,  -1,  38,  -6,  -8,   5,   8,  -1,   1,   1, -37,  -1,
1302
      5,  39,  -5,  -5,   6,  -6, -38, -39, -14,  40,  14,   2,   1,   1,  -2, -40,
1303
     -1,  -2,   2,  -1,  -1,  -1,   1,   1,   1,  -1,   1,  -1,   1,  -1,   1,  -1}
1304
},{
1305
    /* MapTab1 */
1306
    0,  /* eob_sym */
1307
    38, /* esc_sym */
1308
    /* run table */
1309
    {0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  8,  6,  8,  7,
1310
     7,  9,  9, 10, 10, 11, 11,  1, 12,  1, 12, 13, 13, 16, 14, 16,
1311
    14, 15, 15, 17, 17, 18,  0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
1312
    25, 24,  2, 25, 24, 23, 23,  2, 26, 28, 26, 28, 29, 27, 29, 27,
1313
    33, 33,  1, 32,  1,  3, 32, 30, 36,  3, 36, 30, 31, 31, 35, 34,
1314
    37, 41, 34, 35, 37,  4, 41,  4, 49,  8,  8, 49, 40, 38,  5, 38,
1315
    40, 39,  5, 39, 42, 43, 42,  7, 57,  6, 43, 44,  6, 50,  7, 44,
1316
    57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58,  1, 51, 58,  1,
1317
    52, 59, 53,  9, 52, 55, 55, 59, 53, 56, 54, 56, 54,  9, 64, 64,
1318
    60, 63, 60, 63, 61, 62, 61, 62,  2, 10,  2, 10, 11,  1, 11, 13,
1319
    12,  1, 12, 13, 16, 16,  8,  8, 14,  3,  3, 15, 14, 15,  4,  4,
1320
     1, 17, 17,  5,  1,  7,  7,  5,  6,  1,  2,  2,  6, 22,  1, 25,
1321
    21, 22,  8, 24,  1, 21, 25, 24,  8, 18, 18, 23,  9, 20, 23, 33,
1322
    29, 33, 20,  1, 19,  1, 29, 36,  9, 36, 19, 41, 28, 57, 32,  3,
1323
    28,  3,  1, 27, 49, 49,  1, 32, 26, 26,  2,  4,  4,  7, 57, 41,
1324
     2,  7, 10,  5, 37, 16, 10, 27,  8,  8, 13, 16, 37, 13,  1,  5},
1325
1326
    /* value table */
1327
    {0,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,   1,  -1,  -1,   1,
1328
    -1,   1,  -1,   1,  -1,   1,  -1,   2,   1,  -2,  -1,   1,  -1,   1,   1,  -1,
1329
    -1,   1,  -1,   1,  -1,   1,   0,  -1,   1,   1,   1,  -1,   1,  -1,  -1,  -1,
1330
     1,   1,   2,  -1,  -1,   1,  -1,  -2,   1,   1,  -1,  -1,   1,   1,  -1,  -1,
1331
     1,  -1,   3,   1,  -3,   2,  -1,   1,   1,  -2,  -1,  -1,  -1,   1,   1,   1,
1332
     1,   1,  -1,  -1,  -1,   2,  -1,  -2,   1,   2,  -2,  -1,   1,   1,   2,  -1,
1333
    -1,   1,  -2,  -1,   1,   1,  -1,   2,   1,   2,  -1,   1,  -2,  -1,  -2,  -1,
1334
    -1,   1,   1,  -1,   1,  -1,   1,   1,   1,  -1,  -1,   1,   4,  -1,  -1,  -4,
1335
     1,   1,   1,   2,  -1,  -1,   1,  -1,  -1,   1,  -1,  -1,   1,  -2,   1,  -1,
1336
     1,   1,  -1,  -1,   1,   1,  -1,  -1,   3,   2,  -3,  -2,   2,   5,  -2,   2,
1337
     2,  -5,  -2,  -2,  -2,   2,  -3,   3,   2,   3,  -3,   2,  -2,  -2,   3,  -3,
1338
     6,   2,  -2,   3,  -6,   3,  -3,  -3,   3,   7,  -4,   4,  -3,   2,  -7,   2,
1339
     2,  -2,  -4,   2,   8,  -2,  -2,  -2,   4,   2,  -2,   2,   3,   2,  -2,  -2,
1340
     2,   2,  -2,  -8,  -2,   9,  -2,   2,  -3,  -2,   2,  -2,   2,   2,   2,   4,
1341
    -2,  -4,  10,   2,   2,  -2,  -9,  -2,   2,  -2,   5,   4,  -4,   4,  -2,   2,
1342
    -5,  -4,  -3,   4,   2,  -3,   3,  -2,  -5,   5,   3,   3,  -2,  -3, -10,  -4}
1343
},{
1344
    /* MapTab2 */
1345
    2,  /* eob_sym */
1346
    11, /* esc_sym */
1347
    /* run table */
1348
    {1,  1,  0,  2,  2,  1,  1,  3,  3,  4,  4,  0,  1,  1,  5,  5,
1349
     2,  2,  6,  6,  7,  7,  1,  8,  1,  8,  3,  3,  9,  9,  1,  2,
1350
     2,  1,  4, 10,  4, 10, 11, 11,  1,  5, 12, 12,  1,  5, 13, 13,
1351
     3,  3,  6,  6,  2,  2, 14, 14, 16, 16, 15,  7, 15,  8,  8,  7,
1352
     1,  1, 17, 17,  4,  4,  1,  1, 18, 18,  2,  2,  5,  5, 25,  3,
1353
     9,  3, 25,  9, 19, 24, 19, 24,  1, 21, 20,  1, 21, 22, 20, 22,
1354
    23, 23,  8,  6, 33,  6,  8, 33,  7,  7, 26, 26,  1, 32,  1, 32,
1355
    28,  4, 28, 10, 29, 27, 27, 10, 41,  4, 29,  2,  2, 41, 36, 31,
1356
    49, 31, 34, 30, 34, 36, 30, 35,  1, 49, 11,  5, 35, 11,  1,  3,
1357
     3,  5, 37, 37,  8, 40,  8, 40, 12, 12, 42, 42,  1, 38, 16, 57,
1358
     1,  6, 16, 39, 38,  6,  7,  7, 13, 13, 39, 43,  2, 43, 57,  2,
1359
    50,  9, 44,  9, 50,  4, 15, 48, 44,  4,  1, 15, 48, 14, 14,  1,
1360
    45, 45,  8,  3,  5,  8, 51, 47,  3, 46, 46, 47,  5, 51,  1, 17,
1361
    17, 58,  1, 58,  2, 52, 52,  2, 53,  7, 59,  6,  6, 56, 53, 55,
1362
     7, 55,  1, 54, 59, 56, 54, 10,  1, 10,  4, 60,  1, 60,  8,  4,
1363
     8, 64, 64, 61,  1, 63,  3, 63, 62, 61,  5, 11,  5,  3, 11, 62},
1364
1365
    /* value table */
1366
    { 1,  -1,   0,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   0,   3,  -3,   1,  -1,
1367
      2,  -2,   1,  -1,   1,  -1,   4,   1,  -4,  -1,   2,  -2,   1,  -1,   5,   3,
1368
     -3,  -5,   2,   1,  -2,  -1,   1,  -1,   6,   2,   1,  -1,  -6,  -2,   1,  -1,
1369
      3,  -3,   2,  -2,   4,  -4,   1,  -1,   1,  -1,   1,   2,  -1,   2,  -2,  -2,
1370
      7,  -7,   1,  -1,   3,  -3,   8,  -8,   1,  -1,   5,  -5,   3,  -3,   1,   4,
1371
      2,  -4,  -1,  -2,   1,   1,  -1,  -1,   9,   1,   1,  -9,  -1,   1,  -1,  -1,
1372
      1,  -1,   3,  -3,   1,   3,  -3,  -1,   3,  -3,   1,  -1,  10,   1, -10,  -1,
1373
      1,   4,  -1,   2,   1,  -1,   1,  -2,   1,  -4,  -1,   6,  -6,  -1,   1,   1,
1374
      1,  -1,   1,   1,  -1,  -1,  -1,   1,  11,  -1,  -2,   4,  -1,   2, -11,   5,
1375
     -5,  -4,  -1,   1,   4,   1,  -4,  -1,  -2,   2,   1,  -1,  12,   1,  -2,   1,
1376
    -12,   4,   2,   1,  -1,  -4,   4,  -4,   2,  -2,  -1,   1,   7,  -1,  -1,  -7,
1377
     -1,  -3,   1,   3,   1,   5,   2,   1,  -1,  -5,  13,  -2,  -1,   2,  -2, -13,
1378
      1,  -1,   5,   6,   5,  -5,   1,   1,  -6,   1,  -1,  -1,  -5,  -1,  14,   2,
1379
     -2,   1, -14,  -1,   8,   1,  -1,  -8,   1,   5,   1,   5,  -5,   1,  -1,   1,
1380
     -5,  -1,  15,   1,  -1,  -1,  -1,   3, -15,  -3,   6,   1,  16,  -1,   6,  -6,
1381
     -6,   1,  -1,   1, -16,   1,   7,  -1,   1,  -1,  -6,  -3,   6,  -7,   3,  -1}
1382
},{
1383
    /* MapTab3 */
1384
    0,  /* eob_sym */
1385
    35, /* esc_sym */
1386
    /* run table */
1387
    {0,  1,  1,  2,  2,  3,  3,  4,  4,  1,  1,  5,  5,  6,  6,  7,
1388
     7,  8,  8,  9,  9,  2,  2, 10, 10,  1,  1, 11, 11, 12, 12,  3,
1389
     3, 13, 13,  0, 14, 14, 16, 15, 16, 15,  4,  4, 17,  1, 17,  1,
1390
     5,  5, 18, 18,  2,  2,  6,  6,  8, 19,  7,  8,  7, 19, 20, 20,
1391
    21, 21, 22, 24, 22, 24, 23, 23,  1,  1, 25, 25,  3,  3, 26, 26,
1392
     9,  9, 27, 27, 28, 28, 33, 29,  4, 33, 29,  1,  4,  1, 32, 32,
1393
     2,  2, 31, 10, 30, 10, 30, 31, 34, 34,  5,  5, 36, 36, 35, 41,
1394
    35, 11, 41, 11, 37,  1,  8,  8, 37,  6,  1,  6, 40,  7,  7, 40,
1395
    12, 38, 12, 39, 39, 38, 49, 13, 49, 13,  3, 42,  3, 42, 16, 16,
1396
    43, 43, 14, 14,  1,  1, 44, 15, 44, 15,  2,  2, 57, 48, 50, 48,
1397
    57, 50,  4, 45, 45,  4, 46, 47, 47, 46,  1, 51,  1, 17, 17, 51,
1398
     8,  9,  9,  5, 58,  8, 58,  5, 52, 52, 55, 56, 53, 56, 55, 59,
1399
    59, 53, 54,  1,  6, 54,  7,  7,  6,  1,  2,  3,  2,  3, 64, 60,
1400
    60, 10, 10, 64, 61, 62, 61, 63,  1, 63, 62,  1, 18, 24, 18,  4,
1401
    25,  4,  8, 21, 21,  1, 24, 22, 25, 22,  8, 11, 19, 11, 23,  1,
1402
    20, 23, 19, 20,  5, 12,  5,  1, 16,  2, 12, 13,  2, 13,  1, 16},
1403
1404
    /* value table */
1405
    { 0,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   1,
1406
     -1,   1,  -1,   1,  -1,   2,  -2,   1,  -1,   3,  -3,   1,  -1,   1,  -1,   2,
1407
     -2,   1,  -1,   0,   1,  -1,   1,   1,  -1,  -1,   2,  -2,   1,   4,  -1,  -4,
1408
      2,  -2,   1,  -1,  -3,   3,   2,  -2,   2,   1,   2,  -2,  -2,  -1,   1,  -1,
1409
      1,  -1,   1,   1,  -1,  -1,   1,  -1,   5,  -5,   1,  -1,   3,  -3,   1,  -1,
1410
      2,  -2,   1,  -1,   1,  -1,   1,   1,   3,  -1,  -1,   6,  -3,  -6,  -1,   1,
1411
      4,  -4,   1,   2,   1,  -2,  -1,  -1,   1,  -1,   3,  -3,   1,  -1,   1,   1,
1412
     -1,   2,  -1,  -2,   1,   7,  -3,   3,  -1,   3,  -7,  -3,   1,  -3,   3,  -1,
1413
      2,   1,  -2,   1,  -1,  -1,   1,   2,  -1,  -2,  -4,  -1,   4,   1,   2,  -2,
1414
      1,  -1,  -2,   2,   8,  -8,  -1,   2,   1,  -2,  -5,   5,   1,  -1,  -1,   1,
1415
     -1,   1,   4,  -1,   1,  -4,  -1,  -1,   1,   1,   9,   1,  -9,   2,  -2,  -1,
1416
     -4,   3,  -3,  -4,  -1,   4,   1,   4,   1,  -1,   1,  -1,   1,   1,  -1,   1,
1417
     -1,  -1,  -1,  10,   4,   1,   4,  -4,  -4, -10,   6,   5,  -6,  -5,   1,  -1,
1418
      1,   3,  -3,  -1,   1,  -1,  -1,  -1,  11,   1,   1, -11,  -2,  -2,   2,   5,
1419
     -2,  -5,  -5,   2,  -2,  12,   2,  -2,   2,   2,   5,  -3,  -2,   3,  -2, -12,
1420
     -2,   2,   2,   2,  -5,   3,   5,  13,  -3,   7,  -3,  -3,  -7,   3, -13,   3}
1421
},{
1422
    /* MapTab4 */
1423
    0,  /* eob_sym */
1424
    34, /* esc_sym */
1425
    /* run table */
1426
    {0,  1,  1,  1,  2,  2,  1,  3,  3,  1,  1,  1,  4,  4,  1,  5,
1427
     2,  1,  5,  2,  1,  1,  6,  6,  1,  1,  1,  1,  1,  7,  3,  1,
1428
     2,  3,  0,  1,  2,  7,  1,  1,  1,  8,  1,  1,  8,  1,  1,  1,
1429
     9,  1,  9,  1,  2,  1,  1,  2,  1,  1, 10,  4,  1, 10,  1,  4,
1430
     1,  1,  1,  1,  1,  3,  1,  1,  1,  3,  2,  1,  5,  1,  1,  1,
1431
     2,  5,  1, 11,  1, 11,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
1432
     2,  1,  6,  1,  6,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1, 12,
1433
     3,  1, 12,  1,  1,  1,  2,  1,  1,  3,  1,  1,  1,  1,  1,  1,
1434
     4,  1,  1,  1,  2,  1,  1,  4,  1,  1,  1,  1,  1,  1,  2,  1,
1435
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  3,  1,  2,  1,  1,  5,
1436
     1,  1,  1,  1,  1,  7,  1,  7,  1,  1,  2,  3,  1,  1,  1,  1,
1437
     5,  1,  1,  1,  1,  1,  1,  2, 13,  1,  1,  1,  1,  1,  1,  1,
1438
     1,  1,  1,  1,  1,  1,  1,  1, 13,  2,  1,  1,  4,  1,  1,  1,
1439
     3,  1,  6,  1,  1,  1, 14,  1,  1,  1,  1,  1, 14,  6,  1,  1,
1440
     1,  1, 15,  2,  4,  1,  2,  3, 15,  1,  1,  1,  8,  1,  1,  8,
1441
     1,  1,  1,  1,  1,  1,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1},
1442
1443
    /* value table */
1444
    { 0,   1,  -1,   2,   1,  -1,  -2,   1,  -1,   3,  -3,   4,   1,  -1,  -4,   1,
1445
      2,   5,  -1,  -2,  -5,   6,   1,  -1,  -6,   7,  -7,   8,  -8,   1,   2,   9,
1446
      3,  -2,   0,  -9,  -3,  -1,  10, -10,  11,   1, -11,  12,  -1, -12,  13, -13,
1447
      1,  14,  -1, -14,   4,  15, -15,  -4,  16, -16,   1,   2,  17,  -1, -17,  -2,
1448
     18, -18,  19, -19,  20,   3, -20,  21, -21,  -3,   5,  22,   2, -22, -23,  23,
1449
     -5,  -2,  24,   1, -24,  -1,  25, -25,  26, -26, -27,  27,  28,  29, -28, -29,
1450
      6,  30,   2, -31,  -2, -30,  31,  -6, -32,  32,  33, -33,  34, -35, -34,   1,
1451
      4, -36,  -1,  35,  37,  36,   7, -37,  38,  -4, -38,  39,  41,  40, -40, -39,
1452
      3,  42, -43, -41,  -7, -42,  43,  -3,  44, -44,  45, -45,  46,  47,   8, -47,
1453
    -48, -46,  50, -50,  48,  49,  51, -49,  52, -52,   5, -51,  -8, -53,  53,   3,
1454
    -56,  56,  55,  54, -54,   2,  60,  -2, -55,  58,   9,  -5,  59,  57, -57, -63,
1455
     -3, -58, -60, -61,  61, -59, -62,  -9,   1,  64,  62,  69, -64,  63,  65, -67,
1456
    -68,  66, -65,  68, -66, -69,  67, -70,  -1,  10,  71, -71,   4,  73,  72,  70,
1457
      6, -76,  -3,  74, -78, -74,   1,  78,  80, -72, -75,  76,  -1,   3, -73,  79,
1458
     75,  77,   1,  11,  -4, -79, -10,  -6,  -1, -77, -83, -80,   2,  81, -84,  -2,
1459
     83, -81,  82, -82,  84, -87, -86,  85, -11, -85,  86, -89,  87, -88,  88,  89}
1460
},{
1461
    /* MapTab5 */
1462
    2,  /* eob_sym */
1463
    33, /* esc_sym */
1464
    /* run table */
1465
    {1,  1,  0,  2,  1,  2,  1,  3,  3,  1,  1,  4,  4,  2,  2,  1,
1466
     1,  5,  5,  6,  1,  6,  1,  7,  7,  3,  3,  2,  8,  2,  8,  1,
1467
     1,  0,  9,  9,  1,  1, 10,  4, 10,  4, 11, 11,  2,  1,  2,  1,
1468
    12, 12,  3,  3,  1,  1, 13,  5,  5, 13, 14,  1,  1, 14,  2,  2,
1469
     6,  6, 15,  1,  1, 15, 16,  4,  7, 16,  4,  7,  1,  1,  3,  3,
1470
     8,  8,  2,  2,  1,  1, 17, 17,  1,  1, 18, 18,  5,  5,  2,  2,
1471
     1,  1,  9, 19,  9, 19, 20,  3,  3, 20,  1, 10, 21,  1, 10,  4,
1472
     4, 21, 22,  6,  6, 22,  1,  1, 23, 24,  2,  2, 23, 24, 11,  1,
1473
     1, 11,  7, 25,  7,  1,  1, 25,  8,  8,  3, 26,  3,  1, 12,  2,
1474
     2, 26,  1, 12,  5,  5, 27,  4,  1,  4,  1, 27, 28,  1, 28, 13,
1475
     1, 13,  2, 29,  2,  1, 32,  6,  1, 30, 14, 29, 14,  6,  3, 31,
1476
     3,  1, 30,  1, 32, 31, 33,  9, 33,  1,  1,  7,  9,  7,  2,  2,
1477
     1,  1,  4, 36, 34,  4,  5, 10, 10,  5, 34,  1,  1, 35,  8,  8,
1478
    36,  3, 35,  1, 15,  3,  2,  1, 16, 15, 16,  2, 37,  1, 37,  1,
1479
     1,  1,  6,  6, 38,  1, 38, 11,  1, 39, 39, 40, 11,  2, 41,  4,
1480
    40,  1,  2,  4,  1,  1,  1, 41,  3,  1,  3,  1,  5,  7,  5,  7},
1481
1482
    /* value table */
1483
    { 1,  -1,   0,   1,   2,  -1,  -2,   1,  -1,   3,  -3,   1,  -1,   2,  -2,   4,
1484
     -4,   1,  -1,   1,   5,  -1,  -5,   1,  -1,   2,  -2,   3,   1,  -3,  -1,   6,
1485
     -6,   0,   1,  -1,   7,  -7,   1,   2,  -1,  -2,   1,  -1,   4,   8,  -4,  -8,
1486
      1,  -1,   3,  -3,   9,  -9,   1,   2,  -2,  -1,   1,  10, -10,  -1,   5,  -5,
1487
      2,  -2,   1,  11, -11,  -1,   1,   3,   2,  -1,  -3,  -2,  12, -12,   4,  -4,
1488
      2,  -2,  -6,   6,  13, -13,   1,  -1,  14, -14,   1,  -1,   3,  -3,   7,  -7,
1489
     15, -15,   2,   1,  -2,  -1,   1,   5,  -5,  -1, -16,   2,   1,  16,  -2,   4,
1490
     -4,  -1,   1,   3,  -3,  -1,  17, -17,   1,   1,  -8,   8,  -1,  -1,   2,  18,
1491
    -18,  -2,   3,   1,  -3,  19, -19,  -1,   3,  -3,   6,   1,  -6,  20,   2,   9,
1492
     -9,  -1, -20,  -2,   4,  -4,   1,  -5,  21,   5, -21,  -1,   1, -22,  -1,   2,
1493
     22,  -2,  10,   1, -10,  23,   1,   4, -23,   1,   2,  -1,  -2,  -4,  -7,   1,
1494
      7, -24,  -1,  24,  -1,  -1,   1,   3,  -1, -25,  25,   4,  -3,  -4,  11, -11,
1495
     26, -26,   6,   1,   1,  -6,  -5,  -3,   3,   5,  -1, -27,  27,   1,   4,  -4,
1496
     -1,  -8,  -1,  28,   2,   8, -12, -28,  -2,  -2,   2,  12,  -1,  29,   1, -29,
1497
     30, -30,   5,  -5,   1, -31,  -1,   3,  31,  -1,   1,   1,  -3, -13,   1,  -7,
1498
     -1, -32,  13,   7,  32,  33, -33,  -1,  -9, -34,   9,  34,  -6,   5,   6,  -5}
1499
},{
1500
    /* MapTab6 */
1501
    2,  /* eob_sym */
1502
    13, /* esc_sym */
1503
    /* run table */
1504
    {1,  1,  0,  1,  1,  2,  2,  1,  1,  3,  3,  1,  1,  0,  2,  2,
1505
     4,  1,  4,  1,  1,  1,  5,  5,  1,  1,  6,  6,  2,  2,  1,  1,
1506
     3,  3,  7,  7,  1,  1,  8,  8,  1,  1,  2,  2,  1,  9,  1,  9,
1507
     4,  4, 10,  1,  1, 10,  1,  1, 11, 11,  3,  3,  1,  2,  1,  2,
1508
     1,  1, 12, 12,  5,  5,  1,  1, 13,  1,  1, 13,  2,  2,  1,  1,
1509
     6,  6,  1,  1,  4, 14,  4, 14,  3,  1,  3,  1,  1,  1, 15,  7,
1510
    15,  2,  2,  7,  1,  1,  1,  8,  1,  8, 16, 16,  1,  1,  1,  1,
1511
     2,  1,  1,  2,  1,  1,  3,  5,  5,  3,  4,  1,  1,  4,  1,  1,
1512
    17, 17,  9,  1,  1,  9,  2,  2,  1,  1, 10, 10,  1,  6,  1,  1,
1513
     6, 18,  1,  1, 18,  1,  1,  1,  2,  2,  3,  1,  3,  1,  1,  1,
1514
     4,  1, 19,  1, 19,  7,  1,  1, 20,  1,  4, 20,  1,  7, 11,  2,
1515
     1, 11, 21,  2,  8,  5,  1,  8,  1,  5, 21,  1,  1,  1, 22,  1,
1516
     1, 22,  1,  1,  3,  3,  1, 23,  2, 12, 24,  1,  1,  2,  1,  1,
1517
    12, 23,  1,  1, 24,  1,  1,  1,  4,  1,  1,  1,  2,  1,  6,  6,
1518
     4,  2,  1,  1,  1,  1,  1,  1,  1, 14, 13,  3,  1, 25,  9, 25,
1519
    14,  1,  9,  3, 13,  1,  1,  1,  1,  1, 10,  1,  1,  2, 10,  2},
1520
1521
    /* value table */
1522
    {-20,  -1,   0,   2,  -2,   1,  -1,   3,  -3,   1,  -1,   4,  -4,   0,   2,  -2,
1523
       1,   5,  -1,  -5,   6,  -6,   1,  -1,   7,  -7,   1,  -1,   3,  -3,   8,  -8,
1524
       2,  -2,   1,  -1,   9,  -9,   1,  -1,  10, -10,   4,  -4,  11,   1, -11,  -1,
1525
       2,  -2,   1,  12, -12,  -1,  13, -13,   1,  -1,   3,  -3,  14,   5, -14,  -5,
1526
     -15,  15,  -1,   1,   2,  -2,  16, -16,   1,  17, -17,  -1,   6,  -6,  18, -18,
1527
       2,  -2, -19,  19,  -3,   1,   3,  -1,   4,  20,  -4,   1, -21,  21,   1,   2,
1528
      -1,  -7,   7,  -2,  22, -22,  23,   2, -23,  -2,   1,  -1, -24,  24, -25,  25,
1529
      -8, -26,  26,   8, -27,  27,   5,   3,  -3,  -5,  -4,  28, -28,   4,  29, -29,
1530
       1,  -1,  -2, -30,  30,   2,   9,  -9, -31,  31,   2,  -2, -32,   3,  32, -33,
1531
      -3,   1,  33, -34,  -1,  34, -35,  35, -10,  10,  -6,  36,   6, -36,  37, -37,
1532
      -5,  38,   1, -38,  -1,   3,  39, -39,  -1,  40,   5,   1, -40,  -3,   2, -11,
1533
     -41,  -2,   1,  11,  -3,  -4,  41,   3,  42,   4,  -1, -43, -42,  43,   1, -44,
1534
      45,  -1,  44, -45,  -7,   7, -46,   1, -12,   2,   1, -47,  46,  12,  47,  48,
1535
      -2,  -1, -48,  49,  -1, -50, -49,  50,  -6, -51,  51,  52, -13,  53,  -4,   4,
1536
       6,  13, -53, -52, -54,  55,  54, -55, -56,  -2,   2,  -8,  56,   1,  -3,  -1,
1537
       2,  58,   3,   8,  -2,  57, -58, -60, -59, -57,  -3,  60,  59, -14,   3,  14}
1538
},{
1539
    /* MapTab7 */
1540
    2,  /* eob_sym */
1541
    38, /* esc_sym */
1542
    /* run table */
1543
    {1,  1,  0,  2,  2,  1,  1,  3,  3,  4,  4,  5,  5,  1,  1,  6,
1544
     6,  2,  2,  7,  7,  8,  8,  1,  1,  3,  3,  9,  9, 10, 10,  1,
1545
     1,  2,  2,  4,  4, 11,  0, 11, 12, 12, 13, 13,  1,  1,  5,  5,
1546
    14, 14, 15, 16, 15, 16,  3,  3,  1,  6,  1,  6,  2,  2,  7,  7,
1547
     8,  8, 17, 17,  1,  1,  4,  4, 18, 18,  2,  2,  1, 19,  1, 20,
1548
    19, 20, 21, 21,  3,  3, 22, 22,  5,  5, 24,  1,  1, 23,  9, 23,
1549
    24,  9,  2,  2, 10,  1,  1, 10,  6,  6, 25,  4,  4, 25,  7,  7,
1550
    26,  8,  1,  8,  3,  1, 26,  3, 11, 11, 27, 27,  2, 28,  1,  2,
1551
    28,  1, 12, 12,  5,  5, 29, 13, 13, 29, 32,  1,  1, 33, 31, 30,
1552
    32,  4, 30, 33,  4, 31,  3, 14,  1,  1,  3, 34, 34,  2,  2, 14,
1553
     6,  6, 35, 36, 35, 36,  1, 15,  1, 16, 16, 15,  7,  9,  7,  9,
1554
    37,  8,  8, 37,  1,  1, 39,  2, 38, 39,  2, 40,  5, 38, 40,  5,
1555
     3,  3,  4,  4, 10, 10,  1,  1,  1,  1, 41,  2, 41,  2,  6,  6,
1556
     1,  1, 11, 42, 11, 43,  3, 42,  3, 17,  4, 43,  1, 17,  7,  1,
1557
     8, 44,  4,  7, 44,  5,  8,  2,  5,  1,  2, 48, 45,  1, 12, 45,
1558
    12, 48, 13, 13,  1,  9,  9, 46,  1, 46, 47, 47, 49, 18, 18, 49},
1559
1560
    /* value table */
1561
    { 1,  -1,   0,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   1,  -1,   3,  -3,   1,
1562
     -1,  -2,   2,   1,  -1,   1,  -1,   4,  -4,  -2,   2,   1,  -1,   1,  -1,   5,
1563
     -5,  -3,   3,   2,  -2,   1,   0,  -1,   1,  -1,   1,  -1,   6,  -6,   2,  -2,
1564
      1,  -1,   1,   1,  -1,  -1,  -3,   3,   7,   2,  -7,  -2,  -4,   4,   2,  -2,
1565
      2,  -2,   1,  -1,   8,  -8,   3,  -3,   1,  -1,  -5,   5,   9,   1,  -9,   1,
1566
     -1,  -1,   1,  -1,  -4,   4,   1,  -1,   3,  -3,   1, -10,  10,   1,   2,  -1,
1567
     -1,  -2,   6,  -6,   2,  11, -11,  -2,   3,  -3,   1,  -4,   4,  -1,   3,  -3,
1568
      1,   3,  12,  -3,  -5, -12,  -1,   5,   2,  -2,   1,  -1,  -7,   1,  13,   7,
1569
     -1, -13,   2,  -2,   4,  -4,   1,   2,  -2,  -1,   1,  14, -14,   1,   1,   1,
1570
     -1,  -5,  -1,  -1,   5,  -1,  -6,   2, -15,  15,   6,   1,  -1,  -8,   8,  -2,
1571
     -4,   4,   1,   1,  -1,  -1,  16,   2, -16,  -2,   2,  -2,   4,   3,  -4,  -3,
1572
     -1,  -4,   4,   1, -17,  17,  -1,  -9,   1,   1,   9,   1,  -5,  -1,  -1,   5,
1573
     -7,   7,   6,  -6,   3,  -3,  18, -18,  19, -19,   1, -10,  -1,  10,  -5,   5,
1574
     20, -20,  -3,   1,   3,   1,   8,  -1,  -8,   2,   7,  -1, -21,  -2,   5,  21,
1575
      5,  -1,  -7,  -5,   1,  -6,  -5, -11,   6,  22,  11,   1,   1, -22,  -3,  -1,
1576
      3,  -1,   3,  -3, -23,   4,  -4,   1,  23,  -1,   1,  -1,   1,  -2,   2,  -1}
1577
},{
1578
    /* MapTab8 */
1579
    4,  /* eob_sym */
1580
    11, /* esc_sym */
1581
    /* run table */
1582
    {1,  1,  1,  1,  0,  2,  2,  1,  1,  3,  3,  0,  1,  1,  2,  2,
1583
     4,  4,  1,  1,  5,  5,  1,  1,  2,  2,  3,  3,  6,  6,  1,  1,
1584
     7,  7,  8,  1,  8,  2,  2,  1,  4,  4,  1,  3,  1,  3,  9,  9,
1585
     2,  2,  1,  5,  1,  5, 10, 10,  1,  1, 11, 11,  3,  6,  3,  4,
1586
     4,  6,  2,  2,  1, 12,  1, 12,  7, 13,  7, 13,  1,  1,  8,  8,
1587
     2,  2, 14, 14, 16, 15, 16,  5,  5,  1,  3, 15,  1,  3,  4,  4,
1588
     1,  1, 17, 17,  2,  2,  6,  6,  1, 18,  1, 18, 22, 21, 22, 21,
1589
    25, 24, 25, 19,  9, 20,  9, 23, 19, 24, 20,  3, 23,  7,  3,  1,
1590
     1,  7, 28, 26, 29,  5, 28, 26,  5,  8, 29,  4,  8, 27,  2,  2,
1591
     4, 27,  1,  1, 10, 36, 10, 33, 33, 36, 30,  1, 32, 32,  1, 30,
1592
     6, 31, 31, 35,  3,  6, 11, 11,  3,  2, 35,  2, 34,  1, 34,  1,
1593
    37, 37, 12,  7, 12,  5, 41,  5,  4,  7,  1,  8, 13,  4,  1, 41,
1594
    13, 38,  8, 38,  9,  1, 40, 40,  9,  1, 39,  2,  2, 49, 39, 42,
1595
     3,  3, 14, 16, 49, 14, 16, 42, 43, 43,  6,  6, 15,  1,  1, 15,
1596
    44, 44,  1,  1, 50, 48,  4,  5,  4,  7,  5,  2, 10, 10, 48,  7,
1597
    50, 45,  2,  1, 45,  8,  8,  1, 46, 46,  3, 47, 47,  3,  1,  1},
1598
1599
    /* value table */
1600
    { 1,  -1,   2,  -2,   0,   1,  -1,   3,  -3,   1,  -1,   0,   4,  -4,   2,  -2,
1601
      1,  -1,   5,  -5,   1,  -1,   6,  -6,   3,  -3,   2,  -2,   1,  -1,   7,  -7,
1602
      1,  -1,   1,   8,  -1,   4,  -4,  -8,   2,  -2,   9,   3,  -9,  -3,   1,  -1,
1603
      5,  -5,  10,   2, -10,  -2,   1,  -1,  11, -11,   1,  -1,  -4,   2,   4,   3,
1604
     -3,  -2,   6,  -6,  12,   1, -12,  -1,   2,   1,  -2,  -1,  13, -13,   2,  -2,
1605
      7,  -7,   1,  -1,   1,   1,  -1,   3,  -3,  14,   5,  -1, -14,  -5,   4,  -4,
1606
     15, -15,   1,  -1,   8,  -8,  -3,   3,  16,   1, -16,  -1,   1,   1,  -1,  -1,
1607
      1,   1,  -1,   1,   2,   1,  -2,   1,  -1,  -1,  -1,   6,  -1,   3,  -6,  17,
1608
    -17,  -3,   1,   1,   1,   4,  -1,  -1,  -4,   3,  -1,   5,  -3,  -1,  -9,   9,
1609
     -5,   1,  18, -18,   2,   1,  -2,   1,  -1,  -1,   1,  19,  -1,   1, -19,  -1,
1610
      4,   1,  -1,   1,   7,  -4,  -2,   2,  -7,  10,  -1, -10,   1,  20,  -1, -20,
1611
      1,  -1,   2,   4,  -2,   5,   1,  -5,   6,  -4,  21,   4,   2,  -6, -21,  -1,
1612
     -2,   1,  -4,  -1,  -3,  22,  -1,   1,   3, -22,  -1,  11, -11,   1,   1,   1,
1613
      8,  -8,   2,   2,  -1,  -2,  -2,  -1,   1,  -1,  -5,   5,   2,  23, -23,  -2,
1614
      1,  -1,  24, -24,  -1,  -1,   7,   6,  -7,   5,  -6,  12,  -3,   3,   1,  -5,
1615
      1,   1, -12,  25,  -1,  -5,   5, -25,  -1,   1,   9,   1,  -1,  -9,  26, -26}
1616
}
1617
};