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