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