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