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