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