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