indeo: Convert to the new bitstream reader
[libav.git] / libavcodec / ivi.c
CommitLineData
1cf31685
KS
1/*
2 * common functions for Indeo Video Interactive codecs (Indeo4 and Indeo5)
3 *
4 * Copyright (c) 2009 Maxim Poliakovski
5 *
2912e87a 6 * This file is part of Libav.
1cf31685 7 *
2912e87a 8 * Libav is free software; you can redistribute it and/or
1cf31685
KS
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 *
2912e87a 13 * Libav is distributed in the hope that it will be useful,
1cf31685
KS
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
2912e87a 19 * License along with Libav; if not, write to the Free Software
1cf31685
KS
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23/**
ba87f080 24 * @file
1cf31685
KS
25 * This file contains functions and data shared by both Indeo4 and
26 * Indeo5 decoders.
27 */
28
cc8163e1
DB
29#include <inttypes.h>
30
d5c62122 31#include "libavutil/attributes.h"
fb0c9d41 32#include "libavutil/timer.h"
b6686629
DB
33
34#define BITSTREAM_READER_LE
1cf31685 35#include "avcodec.h"
c3defda0 36#include "bitstream.h"
594d4d5d 37#include "internal.h"
d5c62122 38#include "mathops.h"
23944d29 39#include "ivi.h"
1cf31685
KS
40#include "ivi_dsp.h"
41
060ce0c6
DB
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 */
49static 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 */
61static 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};
9068f36d 71
8ab42021
AK
72static VLC ivi_mb_vlc_tabs [8]; ///< static macroblock Huffman tables
73static VLC ivi_blk_vlc_tabs[8]; ///< static block Huffman tables
9068f36d 74
e6d8acf6 75typedef void (*ivi_mc_func) (int16_t *buf, const int16_t *ref_buf,
746c56b7 76 ptrdiff_t pitch, int mc_type);
5ec6d152
DA
77typedef void (*ivi_mc_avg_func) (int16_t *buf, const int16_t *ref_buf1,
78 const int16_t *ref_buf2,
746c56b7 79 ptrdiff_t pitch, int mc_type, int mc_type2);
e6d8acf6 80
5ec6d152
DA
81static 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)
6a10142f 84{
25a6666f
LB
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);
6a10142f 89
5ec6d152
DA
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;
6a10142f 108
5ec6d152
DA
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 }
6a10142f
LB
117
118 return 0;
119}
120
1cf31685 121/**
49bd8e4b 122 * Reverse "nbits" bits of the value "val" and return the result
1cf31685
KS
123 * in the least significant bits.
124 */
125static uint16_t inv_bits(uint16_t val, int nbits)
126{
127 uint16_t res;
128
129 if (nbits <= 8) {
6dfacd7a 130 res = ff_reverse[val] >> (8 - nbits);
1cf31685 131 } else
6dfacd7a
LB
132 res = ((ff_reverse[val & 0xFF] << 8) +
133 (ff_reverse[val >> 8])) >> (16 - nbits);
1cf31685
KS
134
135 return res;
136}
137
8ab42021
AK
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 */
147static int ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag)
1cf31685
KS
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)
dd3754a4 166 return AVERROR_INVALIDDATA; /* invalid descriptor */
1cf31685
KS
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,
9068f36d
KS
178 (flag ? INIT_VLC_USE_NEW_STATIC : 0) | INIT_VLC_LE);
179}
180
6fee1b90 181av_cold void ff_ivi_init_static_vlc(void)
9068f36d
KS
182{
183 int i;
2fc492d8 184 static VLC_TYPE table_data[8192 * 16][2];
9068f36d
KS
185 static int initialized_vlcs = 0;
186
187 if (initialized_vlcs)
188 return;
189 for (i = 0; i < 8; i++) {
8ab42021
AK
190 ivi_mb_vlc_tabs[i].table = table_data + i * 2 * 8192;
191 ivi_mb_vlc_tabs[i].table_allocated = 8192;
060ce0c6 192 ivi_create_huff_from_desc(&ivi_mb_huff_desc[i],
6dfacd7a 193 &ivi_mb_vlc_tabs[i], 1);
8ab42021
AK
194 ivi_blk_vlc_tabs[i].table = table_data + (i * 2 + 1) * 8192;
195 ivi_blk_vlc_tabs[i].table_allocated = 8192;
060ce0c6 196 ivi_create_huff_from_desc(&ivi_blk_huff_desc[i],
6dfacd7a 197 &ivi_blk_vlc_tabs[i], 1);
9068f36d
KS
198 }
199 initialized_vlcs = 1;
1cf31685
KS
200}
201
8ab42021
AK
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 */
208static 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 */
6dfacd7a
LB
221static int ivi_huff_desc_cmp(const IVIHuffDesc *desc1,
222 const IVIHuffDesc *desc2)
8ab42021 223{
6dfacd7a
LB
224 return desc1->num_rows != desc2->num_rows ||
225 memcmp(desc1->xbits, desc2->xbits, desc1->num_rows);
8ab42021
AK
226}
227
c3defda0 228int ff_ivi_dec_huff_desc(BitstreamContext *bc, int desc_coded, int which_tab,
e322aace 229 IVIHuffTab *huff_tab, AVCodecContext *avctx)
1cf31685 230{
6dfacd7a 231 int i, result;
e322aace 232 IVIHuffDesc new_huff;
1cf31685 233
e322aace
KS
234 if (!desc_coded) {
235 /* select default table */
8ab42021 236 huff_tab->tab = (which_tab) ? &ivi_blk_vlc_tabs[7]
f6f36ca8
LB
237 : &ivi_mb_vlc_tabs [7];
238 return 0;
239 }
e322aace 240
c3defda0 241 huff_tab->tab_sel = bitstream_read(bc, 3);
f6f36ca8
LB
242 if (huff_tab->tab_sel == 7) {
243 /* custom huffman table (explicitly encoded) */
c3defda0 244 new_huff.num_rows = bitstream_read(bc, 4);
f6f36ca8
LB
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++)
c3defda0 251 new_huff.xbits[i] = bitstream_read(bc, 4);
f6f36ca8
LB
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;
e322aace 267 }
e322aace 268 }
f6f36ca8
LB
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];
1cf31685
KS
274 }
275
e322aace 276 return 0;
1cf31685
KS
277}
278
8ab42021
AK
279/*
280 * Free planes, bands and macroblocks buffers.
281 *
282 * @param[in] planes pointer to the array of the plane descriptors
283 */
284static av_cold void ivi_free_buffers(IVIPlaneDesc *planes)
1cf31685 285{
8ab42021 286 int p, b, t;
1cf31685 287
8ab42021
AK
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]);
5ec6d152 293 av_freep(&planes[p].bands[b].bufs[3]);
8ab42021
AK
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);
28dda8a6 302 planes[p].num_bands = 0;
8ab42021 303 }
1cf31685
KS
304}
305
5ec6d152
DA
306av_cold int ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg,
307 int is_indeo4)
1cf31685 308{
6dfacd7a
LB
309 int p, b;
310 uint32_t b_width, b_height, align_fac, width_aligned,
311 height_aligned, buf_size;
1cf31685
KS
312 IVIBandDesc *band;
313
8ab42021 314 ivi_free_buffers(planes);
1cf31685 315
28dda8a6
LB
316 if (cfg->pic_width < 1 || cfg->pic_height < 1 ||
317 cfg->luma_bands < 1 || cfg->chroma_bands < 1)
318 return AVERROR_INVALIDDATA;
319
1cf31685
KS
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 */
6dfacd7a
LB
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;
1cf31685
KS
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;
cf61aaac 357 band->aheight = height_aligned;
23ba1503
KS
358 band->bufs[0] = av_mallocz(buf_size);
359 band->bufs[1] = av_mallocz(buf_size);
1cf31685
KS
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) {
23ba1503 365 band->bufs[2] = av_mallocz(buf_size);
1cf31685
KS
366 if (!band->bufs[2])
367 return AVERROR(ENOMEM);
368 }
5ec6d152
DA
369 if (is_indeo4) {
370 band->bufs[3] = av_mallocz(buf_size);
371 if (!band->bufs[3])
372 return AVERROR(ENOMEM);
373 }
6dfacd7a
LB
374 /* reset custom vlc */
375 planes[p].bands[0].blk_vlc.cust_desc.num_rows = 0;
1cf31685
KS
376 }
377 }
378
379 return 0;
380}
381
62256010
LB
382static int ivi_init_tiles(IVIBandDesc *band, IVITile *ref_tile,
383 int p, int b, int t_height, int t_width)
1cf31685 384{
62256010
LB
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) {
f9e5261c
LB
407 if (tile->num_MBs != ref_tile->num_MBs)
408 return AVERROR_INVALIDDATA;
62256010
LB
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;
1cf31685 423 IVIBandDesc *band;
1cf31685
KS
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
5f1654b2
MP
429 if (!p && planes[0].num_bands == 4) {
430 t_width >>= 1;
431 t_height >>= 1;
432 }
433
1cf31685
KS
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
1cf31685
KS
445 /* use the first luma band as reference for motion vectors
446 * and quant */
62256010
LB
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 }
1cf31685
KS
453
454 return 0;
455}
456
8ab42021
AK
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 *
c3defda0 464 * @param[in,out] bc the Bitstream context
8ab42021
AK
465 * @return size of the tile data in bytes
466 */
c3defda0 467static int ivi_dec_tile_data_size(BitstreamContext *bc)
1cf31685
KS
468{
469 int len;
470
471 len = 0;
c3defda0
AH
472 if (bitstream_read_bit(bc)) {
473 len = bitstream_read(bc, 8);
1cf31685 474 if (len == 255)
c3defda0 475 len = bitstream_read(bc, 24);
1cf31685
KS
476 }
477
478 /* align the bitstream reader on the byte boundary */
c3defda0 479 bitstream_align(bc);
1cf31685
KS
480
481 return len;
482}
483
dc796851
LB
484static 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}
62256010 502
c3defda0 503static int ivi_decode_coded_blocks(BitstreamContext *bc, IVIBandDesc *band,
5ec6d152
DA
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,
62256010
LB
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;
dc796851
LB
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;
62256010
LB
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) {
c3defda0 539 sym = bitstream_read_vlc(bc, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
62256010
LB
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) {
c3defda0
AH
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);
62256010
LB
548 /* merge them and convert into signed val */
549 val = IVI_TOSIGNED((hi << 6) | lo);
550 } else {
551 if (sym >= 256U) {
cc8163e1 552 av_log(avctx, AV_LOG_ERROR, "Invalid sym encountered: %"PRIu32".\n", sym);
62256010
LB
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;
6a10142f 561 if (scan_pos >= num_coeffs || scan_pos < 0)
62256010
LB
562 break;
563 pos = band->scan[scan_pos];
564
565 if (!val)
6a85dfc8 566 ff_dlog(avctx, "Val = 0 encountered!\n");
62256010
LB
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
6a10142f 576 if (scan_pos < 0 || scan_pos >= num_coeffs && sym != rvmap->eob_sym)
62256010
LB
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)
5ec6d152
DA
592 return ivi_mc(band, mc, mc_avg, offs, mv_x, mv_y, mv_x2, mv_y2,
593 mc_type, mc_type2);
62256010
LB
594
595 return 0;
596}
8ab42021
AK
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 *
c3defda0 603 * @param[in,out] bc the Bitstream context
8ab42021
AK
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 */
c3defda0 608static int ivi_decode_blocks(BitstreamContext *bc, IVIBandDesc *band,
62256010 609 IVITile *tile, AVCodecContext *avctx)
1cf31685 610{
5ec6d152
DA
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;
62256010
LB
614 int32_t prev_dc;
615 uint32_t cbp, quant, buf_offs;
616 IVIMbInfo *mb;
e6d8acf6 617 ivi_mc_func mc_with_delta_func, mc_no_delta_func;
5ec6d152 618 ivi_mc_avg_func mc_avg_with_delta_func, mc_avg_no_delta_func;
62256010 619 const uint8_t *scale_tab;
1cf31685 620
62256010
LB
621 /* init intra prediction for the DC coefficient */
622 prev_dc = 0;
1cf31685 623 blk_size = band->blk_size;
62256010
LB
624 /* number of blocks per mb */
625 num_blocks = (band->mb_size != blk_size) ? 4 : 1;
1cf31685 626 if (blk_size == 8) {
5ec6d152
DA
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;
1cf31685 631 } else {
5ec6d152
DA
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;
1cf31685
KS
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
33f64fd5
KS
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);
1cf31685 648
1cf31685 649 scale_tab = is_intra ? band->intra_scale : band->inter_scale;
79d46cbe
MP
650 if (scale_tab)
651 quant = scale_tab[quant];
1cf31685
KS
652
653 if (!is_intra) {
5ec6d152
DA
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;
b1563d0c 658 if (band->is_halfpel) {
5ec6d152
DA
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 */
1cf31685 665 }
5ec6d152
DA
666 if (mb->type == 2)
667 mc_type = -1;
668 if (mb->type != 2 && mb->type != 3)
669 mc_type2 = -1;
cf61aaac
KS
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
62256010
LB
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) {
cf61aaac
KS
682 return AVERROR_INVALIDDATA;
683 }
684 }
5ec6d152
DA
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 }
1cf31685
KS
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 ? */
c3defda0 712 ret = ivi_decode_coded_blocks(bc, band, mc_with_delta_func,
5ec6d152
DA
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);
62256010
LB
718 if (ret < 0)
719 return ret;
1cf31685
KS
720 } else {
721 /* block not coded */
722 /* for intra blocks apply the dc slant transform */
723 /* for inter - perform the motion compensation without delta */
3ba40ebb 724 if (is_intra) {
dc796851
LB
725 ret = ivi_dc_transform(band, &prev_dc, buf_offs, blk_size);
726 if (ret < 0)
727 return ret;
6a10142f 728 } else {
5ec6d152
DA
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);
6a10142f
LB
732 if (ret < 0)
733 return ret;
734 }
1cf31685
KS
735 }
736
737 cbp >>= 1;
738 }// for blk
739 }// for mbn
740
c3defda0 741 bitstream_align(bc);
1cf31685
KS
742
743 return 0;
744}
745
5d2170c5
AK
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 */
ae3da0ae
AK
755static int ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
756 IVITile *tile, int32_t mv_scale)
1cf31685
KS
757{
758 int x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
6a10142f 759 int offs, mb_offset, row_offset, ret;
1cf31685
KS
760 IVIMbInfo *mb, *ref_mb;
761 const int16_t *src;
762 int16_t *dst;
e6d8acf6 763 ivi_mc_func mc_no_delta_func;
1cf31685 764
ae3da0ae
AK
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
1cf31685
KS
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
b36e1893 798 if (band->inherit_mv && ref_mb) {
1cf31685
KS
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);
5ec6d152
DA
837 ret = ivi_mc(band, mc_no_delta_func, 0, offs,
838 mv_x, mv_y, 0, 0, mc_type, -1);
6a10142f
LB
839 if (ret < 0)
840 return ret;
1cf31685
KS
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 }
ae3da0ae
AK
853
854 return 0;
1cf31685
KS
855}
856
857
f190f676 858#ifdef DEBUG
4f04f5cc 859static uint16_t ivi_calc_band_checksum(IVIBandDesc *band)
1cf31685
KS
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}
1cf31685
KS
873#endif
874
8ab42021
AK
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 */
746c56b7 884static void ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, ptrdiff_t dst_pitch)
1cf31685
KS
885{
886 int x, y;
887 const int16_t *src = plane->bands[0].buf;
746c56b7 888 ptrdiff_t pitch = plane->bands[0].pitch;
1cf31685 889
b18a0cc7
MN
890 if (!src)
891 return;
892
1cf31685
KS
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
aa372cf4
KS
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 */
87cdd7c6 909static int decode_band(IVI45DecContext *ctx,
aa372cf4
KS
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];
96037382
KS
916 if (!band->buf) {
917 av_log(avctx, AV_LOG_ERROR, "Band buffer points to no data!\n");
918 return AVERROR_INVALIDDATA;
919 }
5ec6d152
DA
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 }
c3defda0 927 band->data_ptr = ctx->frame_data + (bitstream_tell(&ctx->bc) >> 3);
aa372cf4
KS
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
c3defda0 951 pos = bitstream_tell(&ctx->bc);
aa372cf4
KS
952
953 for (t = 0; t < band->num_tiles; t++) {
954 tile = &band->tiles[t];
955
a6e4ac40
KS
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 }
c3defda0 961 tile->is_empty = bitstream_read_bit(&ctx->bc);
aa372cf4 962 if (tile->is_empty) {
ae3da0ae 963 result = ivi_process_empty_tile(avctx, band, tile,
aa372cf4 964 (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3));
ae3da0ae
AK
965 if (result < 0)
966 break;
6a85dfc8 967 ff_dlog(avctx, "Empty tile encountered!\n");
aa372cf4 968 } else {
c3defda0 969 tile->data_size = ivi_dec_tile_data_size(&ctx->bc);
aa372cf4
KS
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
c3defda0 979 result = ivi_decode_blocks(&ctx->bc, band, tile, avctx);
7388c0c5
LB
980 if (result < 0) {
981 av_log(avctx, AV_LOG_ERROR,
982 "Corrupted tile data encountered!\n");
983 break;
984 }
985
c3defda0 986 if (((bitstream_tell(&ctx->bc) - pos) >> 3) != tile->data_size) {
7388c0c5
LB
987 av_log(avctx, AV_LOG_ERROR,
988 "Tile data_size mismatch!\n");
989 result = AVERROR_INVALIDDATA;
aa372cf4
KS
990 break;
991 }
992
993 pos += tile->data_size << 3; // skip to next tile
994 }
995 }
996
6dfacd7a
LB
997 /* restore the selected rvmap table by applying its corrections in
998 * reverse order */
aa372cf4
KS
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,
6dfacd7a 1011 "Band checksum mismatch! Plane %d, band %d, "
cc8163e1 1012 "received: %"PRIx32", calculated: %"PRIx16"\n",
aa372cf4
KS
1013 band->plane, band->band_num, band->checksum, chksum);
1014 }
1015 }
1016#endif
1017
c3defda0 1018 bitstream_align(&ctx->bc);
aa372cf4
KS
1019
1020 return result;
1021}
1022
df9b9567 1023int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
aa372cf4
KS
1024 AVPacket *avpkt)
1025{
1026 IVI45DecContext *ctx = avctx->priv_data;
1027 const uint8_t *buf = avpkt->data;
759001c5 1028 AVFrame *frame = data;
aa372cf4
KS
1029 int buf_size = avpkt->size;
1030 int result, p, b;
1031
c3defda0 1032 bitstream_init(&ctx->bc, buf, buf_size * 8);
aa372cf4
KS
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);
dd3754a4 1040 return result;
aa372cf4 1041 }
89191843
MN
1042 if (ctx->gop_invalid)
1043 return AVERROR_INVALIDDATA;
aa372cf4 1044
e121ac63 1045 if (ctx->is_indeo4 && ctx->frame_type == IVI4_FRAMETYPE_NULL_LAST) {
f76e3669
DA
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
aa372cf4 1056 if (ctx->gop_flags & IVI5_IS_PROTECTED) {
69a68593 1057 avpriv_report_missing_feature(avctx, "Password-protected clip");
dd3754a4 1058 return AVERROR_PATCHWELCOME;
aa372cf4
KS
1059 }
1060
a92538b7
MS
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
aa372cf4
KS
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++) {
87cdd7c6 1073 result = decode_band(ctx, &ctx->planes[p].bands[b], avctx);
dd3754a4 1074 if (result < 0) {
aa372cf4
KS
1075 av_log(avctx, AV_LOG_ERROR,
1076 "Error while decoding band: %d, plane: %d\n", b, p);
dd3754a4 1077 return result;
aa372cf4
KS
1078 }
1079 }
1080 }
5b2a2955
LB
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 }
aa372cf4
KS
1089 }
1090
1091 //STOP_TIMER("decode_planes"); }
1092
d184cd1d
AK
1093 result = ff_set_dimensions(avctx, ctx->planes[0].width, ctx->planes[0].height);
1094 if (result < 0)
1095 return result;
1096
759001c5 1097 if ((result = ff_get_buffer(avctx, frame, 0)) < 0) {
aa372cf4
KS
1098 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1099 return result;
1100 }
1101
1102 if (ctx->is_scalable) {
e121ac63 1103 if (ctx->is_indeo4)
759001c5 1104 ff_ivi_recompose_haar(&ctx->planes[0], frame->data[0], frame->linesize[0]);
aa372cf4 1105 else
759001c5 1106 ff_ivi_recompose53 (&ctx->planes[0], frame->data[0], frame->linesize[0]);
aa372cf4 1107 } else {
759001c5 1108 ivi_output_plane(&ctx->planes[0], frame->data[0], frame->linesize[0]);
aa372cf4
KS
1109 }
1110
759001c5
AK
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]);
aa372cf4 1113
df9b9567 1114 *got_frame = 1;
aa372cf4 1115
f76e3669
DA
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 */
e121ac63 1121 if (ctx->is_indeo4 && ctx->frame_type == IVI4_FRAMETYPE_INTRA) {
f76e3669
DA
1122 int left;
1123
c3defda0
AH
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
f76e3669 1129 AVPacket pkt;
c3defda0
AH
1130 pkt.data = avpkt->data + (bitstream_tell(&ctx->bc) >> 3);
1131 pkt.size = bitstream_bits_left(&ctx->bc) >> 3;
f76e3669
DA
1132 ff_ivi_decode_frame(avctx, ctx->p_frame, &ctx->got_p_frame, &pkt);
1133 }
1134 }
1135
6202e2fe
VG
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
aa372cf4
KS
1152 return buf_size;
1153}
1154
1155/**
1156 * Close Indeo5 decoder and clean up its context.
1157 */
1158av_cold int ff_ivi_decode_close(AVCodecContext *avctx)
1159{
1160 IVI45DecContext *ctx = avctx->priv_data;
1161
8ab42021 1162 ivi_free_buffers(&ctx->planes[0]);
aa372cf4
KS
1163
1164 if (ctx->mb_vlc.cust_tab.table)
1165 ff_free_vlc(&ctx->mb_vlc.cust_tab);
1166
f76e3669
DA
1167 av_frame_free(&ctx->p_frame);
1168
aa372cf4
KS
1169 return 0;
1170}
1171
1cf31685
KS
1172
1173/**
220f2bd9
MP
1174 * Scan patterns shared between indeo4 and indeo5
1175 */
9c6b3b97 1176const uint8_t ff_ivi_vertical_scan_8x8[64] = {
220f2bd9
MP
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
9c6b3b97 1187const uint8_t ff_ivi_horizontal_scan_8x8[64] = {
220f2bd9
MP
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
9c6b3b97 1198const uint8_t ff_ivi_direct_scan_4x4[16] = {
220f2bd9
MP
1199 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15
1200};
1201
1202
1203/**
1cf31685
KS
1204 * Run-value (RLE) tables.
1205 */
1206const 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};