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