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