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