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