FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/ivi.c
Date: 2022-07-04 00:18:54
Exec Total Coverage
Lines: 412 610 67.5%
Branches: 246 436 56.4%

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