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