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