indeo: Convert to the new bitstream reader
[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 "bitstream.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(BitstreamContext *bc, 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 = bitstream_read(bc, 3);
242 if (huff_tab->tab_sel == 7) {
243 /* custom huffman table (explicitly encoded) */
244 new_huff.num_rows = bitstream_read(bc, 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] = bitstream_read(bc, 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] bc the Bitstream context
465 * @return size of the tile data in bytes
466 */
467 static int ivi_dec_tile_data_size(BitstreamContext *bc)
468 {
469 int len;
470
471 len = 0;
472 if (bitstream_read_bit(bc)) {
473 len = bitstream_read(bc, 8);
474 if (len == 255)
475 len = bitstream_read(bc, 24);
476 }
477
478 /* align the bitstream reader on the byte boundary */
479 bitstream_align(bc);
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(BitstreamContext *bc, 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 = bitstream_read_vlc(bc, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
540 if (sym == rvmap->eob_sym)
541 break; /* End of block */
542
543 /* Escape - run/val explicitly coded using 3 vlc codes */
544 if (sym == rvmap->esc_sym) {
545 run = bitstream_read_vlc(bc, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1;
546 lo = bitstream_read_vlc(bc, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
547 hi = bitstream_read_vlc(bc, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
548 /* merge them and convert into signed val */
549 val = IVI_TOSIGNED((hi << 6) | lo);
550 } else {
551 if (sym >= 256U) {
552 av_log(avctx, AV_LOG_ERROR, "Invalid sym encountered: %"PRIu32".\n", sym);
553 return AVERROR_INVALIDDATA;
554 }
555 run = rvmap->runtab[sym];
556 val = rvmap->valtab[sym];
557 }
558
559 /* de-zigzag and dequantize */
560 scan_pos += run;
561 if (scan_pos >= num_coeffs || scan_pos < 0)
562 break;
563 pos = band->scan[scan_pos];
564
565 if (!val)
566 ff_dlog(avctx, "Val = 0 encountered!\n");
567
568 q = (base_tab[pos] * quant) >> 9;
569 if (q > 1)
570 val = val * q + FFSIGN(val) * (((q ^ 1) - 1) >> 1);
571 trvec[pos] = val;
572 /* track columns containing non-zero coeffs */
573 col_flags[pos & col_mask] |= !!val;
574 }
575
576 if (scan_pos < 0 || scan_pos >= num_coeffs && sym != rvmap->eob_sym)
577 return AVERROR_INVALIDDATA; /* corrupt block data */
578
579 /* undoing DC coeff prediction for intra-blocks */
580 if (is_intra && band->is_2d_trans) {
581 *prev_dc += trvec[0];
582 trvec[0] = *prev_dc;
583 col_flags[0] |= !!*prev_dc;
584 }
585
586 /* apply inverse transform */
587 band->inv_transform(trvec, band->buf + offs,
588 band->pitch, col_flags);
589
590 /* apply motion compensation */
591 if (!is_intra)
592 return ivi_mc(band, mc, mc_avg, offs, mv_x, mv_y, mv_x2, mv_y2,
593 mc_type, mc_type2);
594
595 return 0;
596 }
597 /*
598 * Decode block data:
599 * extract huffman-coded transform coefficients from the bitstream,
600 * dequantize them, apply inverse transform and motion compensation
601 * in order to reconstruct the picture.
602 *
603 * @param[in,out] bc the Bitstream context
604 * @param[in] band pointer to the band descriptor
605 * @param[in] tile pointer to the tile descriptor
606 * @return result code: 0 - OK, -1 = error (corrupted blocks data)
607 */
608 static int ivi_decode_blocks(BitstreamContext *bc, IVIBandDesc *band,
609 IVITile *tile, AVCodecContext *avctx)
610 {
611 int mbn, blk, num_blocks, blk_size, ret, is_intra;
612 int mc_type = 0, mc_type2 = -1;
613 int mv_x = 0, mv_y = 0, mv_x2 = 0, mv_y2 = 0;
614 int32_t prev_dc;
615 uint32_t cbp, quant, buf_offs;
616 IVIMbInfo *mb;
617 ivi_mc_func mc_with_delta_func, mc_no_delta_func;
618 ivi_mc_avg_func mc_avg_with_delta_func, mc_avg_no_delta_func;
619 const uint8_t *scale_tab;
620
621 /* init intra prediction for the DC coefficient */
622 prev_dc = 0;
623 blk_size = band->blk_size;
624 /* number of blocks per mb */
625 num_blocks = (band->mb_size != blk_size) ? 4 : 1;
626 if (blk_size == 8) {
627 mc_with_delta_func = ff_ivi_mc_8x8_delta;
628 mc_no_delta_func = ff_ivi_mc_8x8_no_delta;
629 mc_avg_with_delta_func = ff_ivi_mc_avg_8x8_delta;
630 mc_avg_no_delta_func = ff_ivi_mc_avg_8x8_no_delta;
631 } else {
632 mc_with_delta_func = ff_ivi_mc_4x4_delta;
633 mc_no_delta_func = ff_ivi_mc_4x4_no_delta;
634 mc_avg_with_delta_func = ff_ivi_mc_avg_4x4_delta;
635 mc_avg_no_delta_func = ff_ivi_mc_avg_4x4_no_delta;
636 }
637
638 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
639 is_intra = !mb->type;
640 cbp = mb->cbp;
641 buf_offs = mb->buf_offs;
642
643 quant = band->glob_quant + mb->q_delta;
644 if (avctx->codec_id == AV_CODEC_ID_INDEO4)
645 quant = av_clip(quant, 0, 31);
646 else
647 quant = av_clip(quant, 0, 23);
648
649 scale_tab = is_intra ? band->intra_scale : band->inter_scale;
650 if (scale_tab)
651 quant = scale_tab[quant];
652
653 if (!is_intra) {
654 mv_x = mb->mv_x;
655 mv_y = mb->mv_y;
656 mv_x2 = mb->b_mv_x;
657 mv_y2 = mb->b_mv_y;
658 if (band->is_halfpel) {
659 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
660 mc_type2 = ((mv_y2 & 1) << 1) | (mv_x2 & 1);
661 mv_x >>= 1;
662 mv_y >>= 1;
663 mv_x2 >>= 1;
664 mv_y2 >>= 1; /* convert halfpel vectors into fullpel ones */
665 }
666 if (mb->type == 2)
667 mc_type = -1;
668 if (mb->type != 2 && mb->type != 3)
669 mc_type2 = -1;
670 if (mb->type) {
671 int dmv_x, dmv_y, cx, cy;
672
673 dmv_x = mb->mv_x >> band->is_halfpel;
674 dmv_y = mb->mv_y >> band->is_halfpel;
675 cx = mb->mv_x & band->is_halfpel;
676 cy = mb->mv_y & band->is_halfpel;
677
678 if (mb->xpos + dmv_x < 0 ||
679 mb->xpos + dmv_x + band->mb_size + cx > band->pitch ||
680 mb->ypos + dmv_y < 0 ||
681 mb->ypos + dmv_y + band->mb_size + cy > band->aheight) {
682 return AVERROR_INVALIDDATA;
683 }
684 }
685 if (mb->type == 2 || mb->type == 3) {
686 int dmv_x, dmv_y, cx, cy;
687
688 dmv_x = mb->b_mv_x >> band->is_halfpel;
689 dmv_y = mb->b_mv_y >> band->is_halfpel;
690 cx = mb->b_mv_x & band->is_halfpel;
691 cy = mb->b_mv_y & band->is_halfpel;
692
693 if (mb->xpos + dmv_x < 0 ||
694 mb->xpos + dmv_x + band->mb_size + cx > band->pitch ||
695 mb->ypos + dmv_y < 0 ||
696 mb->ypos + dmv_y + band->mb_size + cy > band->aheight) {
697 return AVERROR_INVALIDDATA;
698 }
699 }
700 }
701
702 for (blk = 0; blk < num_blocks; blk++) {
703 /* adjust block position in the buffer according to its number */
704 if (blk & 1) {
705 buf_offs += blk_size;
706 } else if (blk == 2) {
707 buf_offs -= blk_size;
708 buf_offs += blk_size * band->pitch;
709 }
710
711 if (cbp & 1) { /* block coded ? */
712 ret = ivi_decode_coded_blocks(bc, band, mc_with_delta_func,
713 mc_avg_with_delta_func,
714 mv_x, mv_y, mv_x2, mv_y2,
715 &prev_dc, is_intra,
716 mc_type, mc_type2, quant,
717 buf_offs, avctx);
718 if (ret < 0)
719 return ret;
720 } else {
721 /* block not coded */
722 /* for intra blocks apply the dc slant transform */
723 /* for inter - perform the motion compensation without delta */
724 if (is_intra) {
725 ret = ivi_dc_transform(band, &prev_dc, buf_offs, blk_size);
726 if (ret < 0)
727 return ret;
728 } else {
729 ret = ivi_mc(band, mc_no_delta_func, mc_avg_no_delta_func,
730 buf_offs, mv_x, mv_y, mv_x2, mv_y2,
731 mc_type, mc_type2);
732 if (ret < 0)
733 return ret;
734 }
735 }
736
737 cbp >>= 1;
738 }// for blk
739 }// for mbn
740
741 bitstream_align(bc);
742
743 return 0;
744 }
745
746 /**
747 * Handle empty tiles by performing data copying and motion
748 * compensation respectively.
749 *
750 * @param[in] avctx ptr to the AVCodecContext
751 * @param[in] band pointer to the band descriptor
752 * @param[in] tile pointer to the tile descriptor
753 * @param[in] mv_scale scaling factor for motion vectors
754 */
755 static int ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
756 IVITile *tile, int32_t mv_scale)
757 {
758 int x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
759 int offs, mb_offset, row_offset, ret;
760 IVIMbInfo *mb, *ref_mb;
761 const int16_t *src;
762 int16_t *dst;
763 ivi_mc_func mc_no_delta_func;
764
765 if (tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size)) {
766 av_log(avctx, AV_LOG_ERROR, "Allocated tile size %d mismatches "
767 "parameters %d in ivi_process_empty_tile()\n",
768 tile->num_MBs, IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size));
769 return AVERROR_INVALIDDATA;
770 }
771
772 offs = tile->ypos * band->pitch + tile->xpos;
773 mb = tile->mbs;
774 ref_mb = tile->ref_mbs;
775 row_offset = band->mb_size * band->pitch;
776 need_mc = 0; /* reset the mc tracking flag */
777
778 for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
779 mb_offset = offs;
780
781 for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
782 mb->xpos = x;
783 mb->ypos = y;
784 mb->buf_offs = mb_offset;
785
786 mb->type = 1; /* set the macroblocks type = INTER */
787 mb->cbp = 0; /* all blocks are empty */
788
789 if (!band->qdelta_present && !band->plane && !band->band_num) {
790 mb->q_delta = band->glob_quant;
791 mb->mv_x = 0;
792 mb->mv_y = 0;
793 }
794
795 if (band->inherit_qdelta && ref_mb)
796 mb->q_delta = ref_mb->q_delta;
797
798 if (band->inherit_mv && ref_mb) {
799 /* motion vector inheritance */
800 if (mv_scale) {
801 mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
802 mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
803 } else {
804 mb->mv_x = ref_mb->mv_x;
805 mb->mv_y = ref_mb->mv_y;
806 }
807 need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
808 }
809
810 mb++;
811 if (ref_mb)
812 ref_mb++;
813 mb_offset += band->mb_size;
814 } // for x
815 offs += row_offset;
816 } // for y
817
818 if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */
819 num_blocks = (band->mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */
820 mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
821 : ff_ivi_mc_4x4_no_delta;
822
823 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
824 mv_x = mb->mv_x;
825 mv_y = mb->mv_y;
826 if (!band->is_halfpel) {
827 mc_type = 0; /* we have only fullpel vectors */
828 } else {
829 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
830 mv_x >>= 1;
831 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
832 }
833
834 for (blk = 0; blk < num_blocks; blk++) {
835 /* adjust block position in the buffer according with its number */
836 offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
837 ret = ivi_mc(band, mc_no_delta_func, 0, offs,
838 mv_x, mv_y, 0, 0, mc_type, -1);
839 if (ret < 0)
840 return ret;
841 }
842 }
843 } else {
844 /* copy data from the reference tile into the current one */
845 src = band->ref_buf + tile->ypos * band->pitch + tile->xpos;
846 dst = band->buf + tile->ypos * band->pitch + tile->xpos;
847 for (y = 0; y < tile->height; y++) {
848 memcpy(dst, src, tile->width*sizeof(band->buf[0]));
849 src += band->pitch;
850 dst += band->pitch;
851 }
852 }
853
854 return 0;
855 }
856
857
858 #ifdef DEBUG
859 static uint16_t ivi_calc_band_checksum(IVIBandDesc *band)
860 {
861 int x, y;
862 int16_t *src, checksum;
863
864 src = band->buf;
865 checksum = 0;
866
867 for (y = 0; y < band->height; src += band->pitch, y++)
868 for (x = 0; x < band->width; x++)
869 checksum += src[x];
870
871 return checksum;
872 }
873 #endif
874
875 /*
876 * Convert and output the current plane.
877 * This conversion is done by adding back the bias value of 128
878 * (subtracted in the encoder) and clipping the result.
879 *
880 * @param[in] plane pointer to the descriptor of the plane being processed
881 * @param[out] dst pointer to the buffer receiving converted pixels
882 * @param[in] dst_pitch pitch for moving to the next y line
883 */
884 static void ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, ptrdiff_t dst_pitch)
885 {
886 int x, y;
887 const int16_t *src = plane->bands[0].buf;
888 ptrdiff_t pitch = plane->bands[0].pitch;
889
890 if (!src)
891 return;
892
893 for (y = 0; y < plane->height; y++) {
894 for (x = 0; x < plane->width; x++)
895 dst[x] = av_clip_uint8(src[x] + 128);
896 src += pitch;
897 dst += dst_pitch;
898 }
899 }
900
901 /**
902 * Decode an Indeo 4 or 5 band.
903 *
904 * @param[in,out] ctx ptr to the decoder context
905 * @param[in,out] band ptr to the band descriptor
906 * @param[in] avctx ptr to the AVCodecContext
907 * @return result code: 0 = OK, -1 = error
908 */
909 static int decode_band(IVI45DecContext *ctx,
910 IVIBandDesc *band, AVCodecContext *avctx)
911 {
912 int result, i, t, idx1, idx2, pos;
913 IVITile *tile;
914
915 band->buf = band->bufs[ctx->dst_buf];
916 if (!band->buf) {
917 av_log(avctx, AV_LOG_ERROR, "Band buffer points to no data!\n");
918 return AVERROR_INVALIDDATA;
919 }
920 if (ctx->is_indeo4 && ctx->frame_type == IVI4_FRAMETYPE_BIDIR) {
921 band->ref_buf = band->bufs[ctx->b_ref_buf];
922 band->b_ref_buf = band->bufs[ctx->ref_buf];
923 } else {
924 band->ref_buf = band->bufs[ctx->ref_buf];
925 band->b_ref_buf = 0;
926 }
927 band->data_ptr = ctx->frame_data + (bitstream_tell(&ctx->bc) >> 3);
928
929 result = ctx->decode_band_hdr(ctx, band, avctx);
930 if (result) {
931 av_log(avctx, AV_LOG_ERROR, "Error while decoding band header: %d\n",
932 result);
933 return result;
934 }
935
936 if (band->is_empty) {
937 av_log(avctx, AV_LOG_ERROR, "Empty band encountered!\n");
938 return AVERROR_INVALIDDATA;
939 }
940
941 band->rv_map = &ctx->rvmap_tabs[band->rvmap_sel];
942
943 /* apply corrections to the selected rvmap table if present */
944 for (i = 0; i < band->num_corr; i++) {
945 idx1 = band->corr[i * 2];
946 idx2 = band->corr[i * 2 + 1];
947 FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
948 FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
949 }
950
951 pos = bitstream_tell(&ctx->bc);
952
953 for (t = 0; t < band->num_tiles; t++) {
954 tile = &band->tiles[t];
955
956 if (tile->mb_size != band->mb_size) {
957 av_log(avctx, AV_LOG_ERROR, "MB sizes mismatch: %d vs. %d\n",
958 band->mb_size, tile->mb_size);
959 return AVERROR_INVALIDDATA;
960 }
961 tile->is_empty = bitstream_read_bit(&ctx->bc);
962 if (tile->is_empty) {
963 result = ivi_process_empty_tile(avctx, band, tile,
964 (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3));
965 if (result < 0)
966 break;
967 ff_dlog(avctx, "Empty tile encountered!\n");
968 } else {
969 tile->data_size = ivi_dec_tile_data_size(&ctx->bc);
970 if (!tile->data_size) {
971 av_log(avctx, AV_LOG_ERROR, "Tile data size is zero!\n");
972 return AVERROR_INVALIDDATA;
973 }
974
975 result = ctx->decode_mb_info(ctx, band, tile, avctx);
976 if (result < 0)
977 break;
978
979 result = ivi_decode_blocks(&ctx->bc, band, tile, avctx);
980 if (result < 0) {
981 av_log(avctx, AV_LOG_ERROR,
982 "Corrupted tile data encountered!\n");
983 break;
984 }
985
986 if (((bitstream_tell(&ctx->bc) - pos) >> 3) != tile->data_size) {
987 av_log(avctx, AV_LOG_ERROR,
988 "Tile data_size mismatch!\n");
989 result = AVERROR_INVALIDDATA;
990 break;
991 }
992
993 pos += tile->data_size << 3; // skip to next tile
994 }
995 }
996
997 /* restore the selected rvmap table by applying its corrections in
998 * reverse order */
999 for (i = band->num_corr-1; i >= 0; i--) {
1000 idx1 = band->corr[i*2];
1001 idx2 = band->corr[i*2+1];
1002 FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
1003 FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
1004 }
1005
1006 #ifdef DEBUG
1007 if (band->checksum_present) {
1008 uint16_t chksum = ivi_calc_band_checksum(band);
1009 if (chksum != band->checksum) {
1010 av_log(avctx, AV_LOG_ERROR,
1011 "Band checksum mismatch! Plane %d, band %d, "
1012 "received: %"PRIx32", calculated: %"PRIx16"\n",
1013 band->plane, band->band_num, band->checksum, chksum);
1014 }
1015 }
1016 #endif
1017
1018 bitstream_align(&ctx->bc);
1019
1020 return result;
1021 }
1022
1023 int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
1024 AVPacket *avpkt)
1025 {
1026 IVI45DecContext *ctx = avctx->priv_data;
1027 const uint8_t *buf = avpkt->data;
1028 AVFrame *frame = data;
1029 int buf_size = avpkt->size;
1030 int result, p, b;
1031
1032 bitstream_init(&ctx->bc, buf, buf_size * 8);
1033 ctx->frame_data = buf;
1034 ctx->frame_size = buf_size;
1035
1036 result = ctx->decode_pic_hdr(ctx, avctx);
1037 if (result) {
1038 av_log(avctx, AV_LOG_ERROR,
1039 "Error while decoding picture header: %d\n", result);
1040 return result;
1041 }
1042 if (ctx->gop_invalid)
1043 return AVERROR_INVALIDDATA;
1044
1045 if (ctx->is_indeo4 && ctx->frame_type == IVI4_FRAMETYPE_NULL_LAST) {
1046 if (ctx->got_p_frame) {
1047 av_frame_move_ref(data, ctx->p_frame);
1048 *got_frame = 1;
1049 ctx->got_p_frame = 0;
1050 } else {
1051 *got_frame = 0;
1052 }
1053 return buf_size;
1054 }
1055
1056 if (ctx->gop_flags & IVI5_IS_PROTECTED) {
1057 avpriv_report_missing_feature(avctx, "Password-protected clip");
1058 return AVERROR_PATCHWELCOME;
1059 }
1060
1061 if (!ctx->planes[0].bands) {
1062 av_log(avctx, AV_LOG_ERROR, "Color planes not initialized yet\n");
1063 return AVERROR_INVALIDDATA;
1064 }
1065
1066 ctx->switch_buffers(ctx);
1067
1068 //{ START_TIMER;
1069
1070 if (ctx->is_nonnull_frame(ctx)) {
1071 for (p = 0; p < 3; p++) {
1072 for (b = 0; b < ctx->planes[p].num_bands; b++) {
1073 result = decode_band(ctx, &ctx->planes[p].bands[b], avctx);
1074 if (result < 0) {
1075 av_log(avctx, AV_LOG_ERROR,
1076 "Error while decoding band: %d, plane: %d\n", b, p);
1077 return result;
1078 }
1079 }
1080 }
1081 } else {
1082 if (ctx->is_scalable)
1083 return AVERROR_INVALIDDATA;
1084
1085 for (p = 0; p < 3; p++) {
1086 if (!ctx->planes[p].bands[0].buf)
1087 return AVERROR_INVALIDDATA;
1088 }
1089 }
1090
1091 //STOP_TIMER("decode_planes"); }
1092
1093 result = ff_set_dimensions(avctx, ctx->planes[0].width, ctx->planes[0].height);
1094 if (result < 0)
1095 return result;
1096
1097 if ((result = ff_get_buffer(avctx, frame, 0)) < 0) {
1098 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1099 return result;
1100 }
1101
1102 if (ctx->is_scalable) {
1103 if (ctx->is_indeo4)
1104 ff_ivi_recompose_haar(&ctx->planes[0], frame->data[0], frame->linesize[0]);
1105 else
1106 ff_ivi_recompose53 (&ctx->planes[0], frame->data[0], frame->linesize[0]);
1107 } else {
1108 ivi_output_plane(&ctx->planes[0], frame->data[0], frame->linesize[0]);
1109 }
1110
1111 ivi_output_plane(&ctx->planes[2], frame->data[1], frame->linesize[1]);
1112 ivi_output_plane(&ctx->planes[1], frame->data[2], frame->linesize[2]);
1113
1114 *got_frame = 1;
1115
1116 /* If the bidirectional mode is enabled, next I and the following P
1117 * frame will be sent together. Unfortunately the approach below seems
1118 * to be the only way to handle the B-frames mode.
1119 * That's exactly the same Intel decoders do.
1120 */
1121 if (ctx->is_indeo4 && ctx->frame_type == IVI4_FRAMETYPE_INTRA) {
1122 int left;
1123
1124 while (bitstream_read(&ctx->bc, 8)); // skip version string
1125 left = bitstream_tell(&ctx->bc) & 0x18;
1126 bitstream_skip(&ctx->bc, 64 - left);
1127 if (bitstream_bits_left(&ctx->bc) > 18 &&
1128 bitstream_peek(&ctx->bc, 21) == 0xBFFF8) { // syncheader + inter type
1129 AVPacket pkt;
1130 pkt.data = avpkt->data + (bitstream_tell(&ctx->bc) >> 3);
1131 pkt.size = bitstream_bits_left(&ctx->bc) >> 3;
1132 ff_ivi_decode_frame(avctx, ctx->p_frame, &ctx->got_p_frame, &pkt);
1133 }
1134 }
1135
1136 if (ctx->show_indeo4_info) {
1137 if (ctx->is_scalable)
1138 av_log(avctx, AV_LOG_DEBUG, "This video uses scalability mode\n");
1139 if (ctx->uses_tiling)
1140 av_log(avctx, AV_LOG_DEBUG, "This video uses local decoding\n");
1141 if (ctx->has_b_frames)
1142 av_log(avctx, AV_LOG_DEBUG, "This video contains B-frames\n");
1143 if (ctx->has_transp)
1144 av_log(avctx, AV_LOG_DEBUG, "Transparency mode is enabled\n");
1145 if (ctx->uses_haar)
1146 av_log(avctx, AV_LOG_DEBUG, "This video uses Haar transform\n");
1147 if (ctx->uses_fullpel)
1148 av_log(avctx, AV_LOG_DEBUG, "This video uses fullpel motion vectors\n");
1149 ctx->show_indeo4_info = 0;
1150 }
1151
1152 return buf_size;
1153 }
1154
1155 /**
1156 * Close Indeo5 decoder and clean up its context.
1157 */
1158 av_cold int ff_ivi_decode_close(AVCodecContext *avctx)
1159 {
1160 IVI45DecContext *ctx = avctx->priv_data;
1161
1162 ivi_free_buffers(&ctx->planes[0]);
1163
1164 if (ctx->mb_vlc.cust_tab.table)
1165 ff_free_vlc(&ctx->mb_vlc.cust_tab);
1166
1167 av_frame_free(&ctx->p_frame);
1168
1169 return 0;
1170 }
1171
1172
1173 /**
1174 * Scan patterns shared between indeo4 and indeo5
1175 */
1176 const uint8_t ff_ivi_vertical_scan_8x8[64] = {
1177 0, 8, 16, 24, 32, 40, 48, 56,
1178 1, 9, 17, 25, 33, 41, 49, 57,
1179 2, 10, 18, 26, 34, 42, 50, 58,
1180 3, 11, 19, 27, 35, 43, 51, 59,
1181 4, 12, 20, 28, 36, 44, 52, 60,
1182 5, 13, 21, 29, 37, 45, 53, 61,
1183 6, 14, 22, 30, 38, 46, 54, 62,
1184 7, 15, 23, 31, 39, 47, 55, 63
1185 };
1186
1187 const uint8_t ff_ivi_horizontal_scan_8x8[64] = {
1188 0, 1, 2, 3, 4, 5, 6, 7,
1189 8, 9, 10, 11, 12, 13, 14, 15,
1190 16, 17, 18, 19, 20, 21, 22, 23,
1191 24, 25, 26, 27, 28, 29, 30, 31,
1192 32, 33, 34, 35, 36, 37, 38, 39,
1193 40, 41, 42, 43, 44, 45, 46, 47,
1194 48, 49, 50, 51, 52, 53, 54, 55,
1195 56, 57, 58, 59, 60, 61, 62, 63
1196 };
1197
1198 const uint8_t ff_ivi_direct_scan_4x4[16] = {
1199 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15
1200 };
1201
1202
1203 /**
1204 * Run-value (RLE) tables.
1205 */
1206 const RVMapDesc ff_ivi_rvmap_tabs[9] = {
1207 { /* MapTab0 */
1208 5, /* eob_sym */
1209 2, /* esc_sym */
1210 /* run table */
1211 {1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3,
1212 1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5,
1213 1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1,
1214 8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9,
1215 9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3,
1216 2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12,
1217 8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13,
1218 2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8,
1219 1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8,
1220 6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21,
1221 22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8,
1222 4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6,
1223 1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28,
1224 1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41,
1225 6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1,
1226 30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
1227
1228 /* value table */
1229 { 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1,
1230 6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1,
1231 10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13,
1232 1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1,
1233 -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4,
1234 7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1,
1235 2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1,
1236 9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3,
1237 28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4,
1238 3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1,
1239 -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5,
1240 5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4,
1241 -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1,
1242 37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1,
1243 5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40,
1244 -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1}
1245 },{
1246 /* MapTab1 */
1247 0, /* eob_sym */
1248 38, /* esc_sym */
1249 /* run table */
1250 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7,
1251 7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16,
1252 14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
1253 25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27,
1254 33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34,
1255 37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38,
1256 40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44,
1257 57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1,
1258 52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64,
1259 60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13,
1260 12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4,
1261 1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25,
1262 21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33,
1263 29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3,
1264 28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41,
1265 2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5},
1266
1267 /* value table */
1268 {0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1,
1269 -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1,
1270 -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1,
1271 1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1,
1272 1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1,
1273 1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1,
1274 -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1,
1275 -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4,
1276 1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1,
1277 1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2,
1278 2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3,
1279 6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2,
1280 2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2,
1281 2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4,
1282 -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2,
1283 -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4}
1284 },{
1285 /* MapTab2 */
1286 2, /* eob_sym */
1287 11, /* esc_sym */
1288 /* run table */
1289 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5,
1290 2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2,
1291 2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13,
1292 3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7,
1293 1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3,
1294 9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22,
1295 23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32,
1296 28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31,
1297 49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3,
1298 3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57,
1299 1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2,
1300 50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1,
1301 45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17,
1302 17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55,
1303 7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4,
1304 8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62},
1305
1306 /* value table */
1307 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1,
1308 2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3,
1309 -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1,
1310 3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2,
1311 7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4,
1312 2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1,
1313 1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1,
1314 1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1,
1315 1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5,
1316 -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1,
1317 -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7,
1318 -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13,
1319 1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2,
1320 -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1,
1321 -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6,
1322 -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1}
1323 },{
1324 /* MapTab3 */
1325 0, /* eob_sym */
1326 35, /* esc_sym */
1327 /* run table */
1328 {0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7,
1329 7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3,
1330 3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1,
1331 5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20,
1332 21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26,
1333 9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32,
1334 2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41,
1335 35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40,
1336 12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16,
1337 43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48,
1338 57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51,
1339 8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59,
1340 59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60,
1341 60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4,
1342 25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1,
1343 20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16},
1344
1345 /* value table */
1346 { 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1,
1347 -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2,
1348 -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4,
1349 2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1,
1350 1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1,
1351 2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1,
1352 4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1,
1353 -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1,
1354 2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2,
1355 1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1,
1356 -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1,
1357 -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1,
1358 -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1,
1359 1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5,
1360 -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12,
1361 -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3}
1362 },{
1363 /* MapTab4 */
1364 0, /* eob_sym */
1365 34, /* esc_sym */
1366 /* run table */
1367 {0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5,
1368 2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1,
1369 2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1,
1370 9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4,
1371 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1,
1372 2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1373 2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12,
1374 3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1,
1375 4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1,
1376 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5,
1377 1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1,
1378 5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1,
1379 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1,
1380 3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1,
1381 1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8,
1382 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1},
1383
1384 /* value table */
1385 { 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1,
1386 2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9,
1387 3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13,
1388 1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2,
1389 18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23,
1390 -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29,
1391 6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1,
1392 4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39,
1393 3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47,
1394 -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3,
1395 -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63,
1396 -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67,
1397 -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70,
1398 6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79,
1399 75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2,
1400 83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89}
1401 },{
1402 /* MapTab5 */
1403 2, /* eob_sym */
1404 33, /* esc_sym */
1405 /* run table */
1406 {1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1,
1407 1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1,
1408 1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1,
1409 12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2,
1410 6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3,
1411 8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2,
1412 1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4,
1413 4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1,
1414 1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2,
1415 2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13,
1416 1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31,
1417 3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2,
1418 1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8,
1419 36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1,
1420 1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4,
1421 40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7},
1422
1423 /* value table */
1424 { 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4,
1425 -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6,
1426 -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8,
1427 1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5,
1428 2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4,
1429 2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7,
1430 15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4,
1431 -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18,
1432 -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9,
1433 -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2,
1434 22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1,
1435 7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11,
1436 26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4,
1437 -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29,
1438 30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7,
1439 -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5}
1440 },{
1441 /* MapTab6 */
1442 2, /* eob_sym */
1443 13, /* esc_sym */
1444 /* run table */
1445 {1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2,
1446 4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1,
1447 3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9,
1448 4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2,
1449 1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1,
1450 6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7,
1451 15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1,
1452 2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1,
1453 17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1,
1454 6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1,
1455 4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2,
1456 1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1,
1457 1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1,
1458 12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6,
1459 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25,
1460 14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2},
1461
1462 /* value table */
1463 {-20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2,
1464 1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8,
1465 2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1,
1466 2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5,
1467 -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18,
1468 2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2,
1469 -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25,
1470 -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29,
1471 1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33,
1472 -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37,
1473 -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11,
1474 -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44,
1475 45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48,
1476 -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4,
1477 6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1,
1478 2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14}
1479 },{
1480 /* MapTab7 */
1481 2, /* eob_sym */
1482 38, /* esc_sym */
1483 /* run table */
1484 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6,
1485 6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1,
1486 1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5,
1487 14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7,
1488 8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20,
1489 19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23,
1490 24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7,
1491 26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2,
1492 28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30,
1493 32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14,
1494 6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9,
1495 37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5,
1496 3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6,
1497 1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1,
1498 8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45,
1499 12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49},
1500
1501 /* value table */
1502 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1,
1503 -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5,
1504 -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2,
1505 1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2,
1506 2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1,
1507 -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1,
1508 -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3,
1509 1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7,
1510 -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1,
1511 -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2,
1512 -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3,
1513 -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5,
1514 -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5,
1515 20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21,
1516 5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1,
1517 3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1}
1518 },{
1519 /* MapTab8 */
1520 4, /* eob_sym */
1521 11, /* esc_sym */
1522 /* run table */
1523 {1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2,
1524 4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1,
1525 7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9,
1526 2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4,
1527 4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8,
1528 2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4,
1529 1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21,
1530 25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1,
1531 1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2,
1532 4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30,
1533 6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1,
1534 37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41,
1535 13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42,
1536 3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15,
1537 44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7,
1538 50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1},
1539
1540 /* value table */
1541 { 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2,
1542 1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7,
1543 1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1,
1544 5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3,
1545 -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2,
1546 7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4,
1547 15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1,
1548 1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17,
1549 -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9,
1550 -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1,
1551 4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20,
1552 1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1,
1553 -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1,
1554 8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2,
1555 1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5,
1556 1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26}
1557 }
1558 };