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  if (!band->scan) {
415  av_log(NULL, AV_LOG_ERROR, "Scan pattern is not set.\n");
416  return AVERROR_INVALIDDATA;
417  }
418 
419  scan_pos = -1;
420  memset(trvec, 0, num_coeffs*sizeof(trvec[0])); /* zero transform vector */
421  memset(col_flags, 0, sizeof(col_flags)); /* zero column flags */
422 
423  while (scan_pos <= num_coeffs) {
424  sym = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
425  if (sym == rvmap->eob_sym)
426  break; /* End of block */
427 
428  if (sym == rvmap->esc_sym) { /* Escape - run/val explicitly coded using 3 vlc codes */
429  run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1;
430  lo = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
431  hi = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
432  val = IVI_TOSIGNED((hi << 6) | lo); /* merge them and convert into signed val */
433  } else {
434  if (sym >= 256U) {
435  av_log(NULL, AV_LOG_ERROR, "Invalid sym encountered: %d.\n", sym);
436  return -1;
437  }
438  run = rvmap->runtab[sym];
439  val = rvmap->valtab[sym];
440  }
441 
442  /* de-zigzag and dequantize */
443  scan_pos += run;
444  if (scan_pos >= num_coeffs)
445  break;
446  pos = band->scan[scan_pos];
447 
448  if (!val)
449  av_dlog(NULL, "Val = 0 encountered!\n");
450 
451  q = (base_tab[pos] * quant) >> 9;
452  if (q > 1)
453  val = val * q + FFSIGN(val) * (((q ^ 1) - 1) >> 1);
454  trvec[pos] = val;
455  col_flags[pos & col_mask] |= !!val; /* track columns containing non-zero coeffs */
456  }// while
457 
458  if (scan_pos >= num_coeffs && sym != rvmap->eob_sym)
459  return -1; /* corrupt block data */
460 
461  /* undoing DC coeff prediction for intra-blocks */
462  if (is_intra && band->is_2d_trans) {
463  prev_dc += trvec[0];
464  trvec[0] = prev_dc;
465  col_flags[0] |= !!prev_dc;
466  }
467 
468  /* apply inverse transform */
469  band->inv_transform(trvec, band->buf + buf_offs,
470  band->pitch, col_flags);
471 
472  /* apply motion compensation */
473  if (!is_intra)
474  mc_with_delta_func(band->buf + buf_offs,
475  band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
476  band->pitch, mc_type);
477  } else {
478  /* block not coded */
479  /* for intra blocks apply the dc slant transform */
480  /* for inter - perform the motion compensation without delta */
481  if (is_intra && band->dc_transform) {
482  band->dc_transform(&prev_dc, band->buf + buf_offs,
483  band->pitch, blk_size);
484  } else
485  mc_no_delta_func(band->buf + buf_offs,
486  band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
487  band->pitch, mc_type);
488  }
489 
490  cbp >>= 1;
491  }// for blk
492  }// for mbn
493 
494  align_get_bits(gb);
495 
496  return 0;
497 }
498 
509  IVITile *tile, int32_t mv_scale)
510 {
511  int x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
512  int offs, mb_offset, row_offset;
513  IVIMbInfo *mb, *ref_mb;
514  const int16_t *src;
515  int16_t *dst;
516  void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch,
517  int mc_type);
518 
519  if (tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size)) {
520  av_log(avctx, AV_LOG_ERROR, "Allocated tile size %d mismatches "
521  "parameters %d in ivi_process_empty_tile()\n",
522  tile->num_MBs, IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size));
523  return AVERROR_INVALIDDATA;
524  }
525 
526  offs = tile->ypos * band->pitch + tile->xpos;
527  mb = tile->mbs;
528  ref_mb = tile->ref_mbs;
529  row_offset = band->mb_size * band->pitch;
530  need_mc = 0; /* reset the mc tracking flag */
531 
532  for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
533  mb_offset = offs;
534 
535  for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
536  mb->xpos = x;
537  mb->ypos = y;
538  mb->buf_offs = mb_offset;
539 
540  mb->type = 1; /* set the macroblocks type = INTER */
541  mb->cbp = 0; /* all blocks are empty */
542 
543  if (!band->qdelta_present && !band->plane && !band->band_num) {
544  mb->q_delta = band->glob_quant;
545  mb->mv_x = 0;
546  mb->mv_y = 0;
547  }
548 
549  if (band->inherit_qdelta && ref_mb)
550  mb->q_delta = ref_mb->q_delta;
551 
552  if (band->inherit_mv) {
553  /* motion vector inheritance */
554  if (mv_scale) {
555  mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
556  mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
557  } else {
558  mb->mv_x = ref_mb->mv_x;
559  mb->mv_y = ref_mb->mv_y;
560  }
561  need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
562  }
563 
564  mb++;
565  if (ref_mb)
566  ref_mb++;
567  mb_offset += band->mb_size;
568  } // for x
569  offs += row_offset;
570  } // for y
571 
572  if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */
573  num_blocks = (band->mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */
574  mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
576 
577  for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
578  mv_x = mb->mv_x;
579  mv_y = mb->mv_y;
580  if (!band->is_halfpel) {
581  mc_type = 0; /* we have only fullpel vectors */
582  } else {
583  mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
584  mv_x >>= 1;
585  mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
586  }
587 
588  for (blk = 0; blk < num_blocks; blk++) {
589  /* adjust block position in the buffer according with its number */
590  offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
591  mc_no_delta_func(band->buf + offs,
592  band->ref_buf + offs + mv_y * band->pitch + mv_x,
593  band->pitch, mc_type);
594  }
595  }
596  } else {
597  /* copy data from the reference tile into the current one */
598  src = band->ref_buf + tile->ypos * band->pitch + tile->xpos;
599  dst = band->buf + tile->ypos * band->pitch + tile->xpos;
600  for (y = 0; y < tile->height; y++) {
601  memcpy(dst, src, tile->width*sizeof(band->buf[0]));
602  src += band->pitch;
603  dst += band->pitch;
604  }
605  }
606 
607  return 0;
608 }
609 
610 
611 #ifdef DEBUG
612 uint16_t ivi_calc_band_checksum (IVIBandDesc *band)
613 {
614  int x, y;
615  int16_t *src, checksum;
616 
617  src = band->buf;
618  checksum = 0;
619 
620  for (y = 0; y < band->height; src += band->pitch, y++)
621  for (x = 0; x < band->width; x++)
622  checksum += src[x];
623 
624  return checksum;
625 }
626 
627 int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch)
628 {
629  int x, y, result;
630  uint8_t t1, t2;
631  int16_t *src;
632 
633  src = band->buf;
634  result = 0;
635 
636  for (y = 0; y < band->height; src += band->pitch, y++) {
637  for (x = 0; x < band->width; x++) {
638  t1 = av_clip(src[x] + 128, 0, 255);
639  t2 = ref[x];
640  if (t1 != t2) {
641  av_log(NULL, AV_LOG_ERROR, "Data mismatch: row %d, column %d\n",
642  y / band->blk_size, x / band->blk_size);
643  result = -1;
644  }
645  }
646  ref += pitch;
647  }
648 
649  return result;
650 }
651 #endif
652 
653 void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch)
654 {
655  int x, y;
656  const int16_t *src = plane->bands[0].buf;
657  uint32_t pitch = plane->bands[0].pitch;
658 
659  if (!src)
660  return;
661 
662  for (y = 0; y < plane->height; y++) {
663  for (x = 0; x < plane->width; x++)
664  dst[x] = av_clip_uint8(src[x] + 128);
665  src += pitch;
666  dst += dst_pitch;
667  }
668 }
669 
678 static int decode_band(IVI45DecContext *ctx, int plane_num,
679  IVIBandDesc *band, AVCodecContext *avctx)
680 {
681  int result, i, t, idx1, idx2, pos;
682  IVITile *tile;
683 
684  band->buf = band->bufs[ctx->dst_buf];
685  band->ref_buf = band->bufs[ctx->ref_buf];
686  band->data_ptr = ctx->frame_data + (get_bits_count(&ctx->gb) >> 3);
687 
688  result = ctx->decode_band_hdr(ctx, band, avctx);
689  if (result) {
690  av_log(avctx, AV_LOG_ERROR, "Error while decoding band header: %d\n",
691  result);
692  return result;
693  }
694 
695  if (band->is_empty) {
696  av_log(avctx, AV_LOG_ERROR, "Empty band encountered!\n");
697  return AVERROR_INVALIDDATA;
698  }
699 
700  band->rv_map = &ctx->rvmap_tabs[band->rvmap_sel];
701 
702  /* apply corrections to the selected rvmap table if present */
703  for (i = 0; i < band->num_corr; i++) {
704  idx1 = band->corr[i * 2];
705  idx2 = band->corr[i * 2 + 1];
706  FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
707  FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
708  }
709 
710  pos = get_bits_count(&ctx->gb);
711 
712  for (t = 0; t < band->num_tiles; t++) {
713  tile = &band->tiles[t];
714 
715  if (tile->mb_size != band->mb_size) {
716  av_log(avctx, AV_LOG_ERROR, "MB sizes mismatch: %d vs. %d\n",
717  band->mb_size, tile->mb_size);
718  return AVERROR_INVALIDDATA;
719  }
720  tile->is_empty = get_bits1(&ctx->gb);
721  if (tile->is_empty) {
722  result = ivi_process_empty_tile(avctx, band, tile,
723  (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3));
724  if (result < 0)
725  break;
726  av_dlog(avctx, "Empty tile encountered!\n");
727  } else {
728  tile->data_size = ff_ivi_dec_tile_data_size(&ctx->gb);
729  if (!tile->data_size) {
730  av_log(avctx, AV_LOG_ERROR, "Tile data size is zero!\n");
731  return AVERROR_INVALIDDATA;
732  }
733 
734  result = ctx->decode_mb_info(ctx, band, tile, avctx);
735  if (result < 0)
736  break;
737 
738  result = ff_ivi_decode_blocks(&ctx->gb, band, tile);
739  if (result < 0 || ((get_bits_count(&ctx->gb) - pos) >> 3) != tile->data_size) {
740  av_log(avctx, AV_LOG_ERROR, "Corrupted tile data encountered!\n");
741  break;
742  }
743 
744  pos += tile->data_size << 3; // skip to next tile
745  }
746  }
747 
748  /* restore the selected rvmap table by applying its corrections in reverse order */
749  for (i = band->num_corr-1; i >= 0; i--) {
750  idx1 = band->corr[i*2];
751  idx2 = band->corr[i*2+1];
752  FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
753  FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
754  }
755 
756 #ifdef DEBUG
757  if (band->checksum_present) {
758  uint16_t chksum = ivi_calc_band_checksum(band);
759  if (chksum != band->checksum) {
760  av_log(avctx, AV_LOG_ERROR,
761  "Band checksum mismatch! Plane %d, band %d, received: %x, calculated: %x\n",
762  band->plane, band->band_num, band->checksum, chksum);
763  }
764  }
765 #endif
766 
767  align_get_bits(&ctx->gb);
768 
769  return result;
770 }
771 
772 int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
773  AVPacket *avpkt)
774 {
775  IVI45DecContext *ctx = avctx->priv_data;
776  const uint8_t *buf = avpkt->data;
777  int buf_size = avpkt->size;
778  int result, p, b;
779 
780  init_get_bits(&ctx->gb, buf, buf_size * 8);
781  ctx->frame_data = buf;
782  ctx->frame_size = buf_size;
783 
784  result = ctx->decode_pic_hdr(ctx, avctx);
785  if (result) {
786  av_log(avctx, AV_LOG_ERROR,
787  "Error while decoding picture header: %d\n", result);
788  return -1;
789  }
790  if (ctx->gop_invalid)
791  return AVERROR_INVALIDDATA;
792 
793  if (ctx->gop_flags & IVI5_IS_PROTECTED) {
794  av_log(avctx, AV_LOG_ERROR, "Password-protected clip!\n");
795  return -1;
796  }
797 
798  ctx->switch_buffers(ctx);
799 
800  //{ START_TIMER;
801 
802  if (ctx->is_nonnull_frame(ctx)) {
803  for (p = 0; p < 3; p++) {
804  for (b = 0; b < ctx->planes[p].num_bands; b++) {
805  result = decode_band(ctx, p, &ctx->planes[p].bands[b], avctx);
806  if (result) {
807  av_log(avctx, AV_LOG_ERROR,
808  "Error while decoding band: %d, plane: %d\n", b, p);
809  return -1;
810  }
811  }
812  }
813  }
814 
815  //STOP_TIMER("decode_planes"); }
816 
817  /* If the bidirectional mode is enabled, next I and the following P frame will */
818  /* be sent together. Unfortunately the approach below seems to be the only way */
819  /* to handle the B-frames mode. That's exactly the same Intel decoders do. */
820  if (avctx->codec_id == CODEC_ID_INDEO4 && ctx->frame_type == 0/*FRAMETYPE_INTRA*/) {
821  while (get_bits(&ctx->gb, 8)); // skip version string
822  skip_bits_long(&ctx->gb, 64); // skip padding, TODO: implement correct 8-bytes alignment
823  if (get_bits_left(&ctx->gb) > 18 && show_bits(&ctx->gb, 18) == 0x3FFF8)
824  av_log(avctx, AV_LOG_ERROR, "Buffer contains IP frames!\n");
825  }
826 
827  if (ctx->frame.data[0])
828  avctx->release_buffer(avctx, &ctx->frame);
829 
830  ctx->frame.reference = 0;
831  avcodec_set_dimensions(avctx, ctx->planes[0].width, ctx->planes[0].height);
832  if ((result = avctx->get_buffer(avctx, &ctx->frame)) < 0) {
833  av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
834  return result;
835  }
836 
837  if (ctx->is_scalable) {
838  if (avctx->codec_id == CODEC_ID_INDEO4)
839  ff_ivi_recompose_haar(&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0], 4);
840  else
841  ff_ivi_recompose53 (&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0], 4);
842  } else {
843  ff_ivi_output_plane(&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0]);
844  }
845 
846  ff_ivi_output_plane(&ctx->planes[2], ctx->frame.data[1], ctx->frame.linesize[1]);
847  ff_ivi_output_plane(&ctx->planes[1], ctx->frame.data[2], ctx->frame.linesize[2]);
848 
849  *data_size = sizeof(AVFrame);
850  *(AVFrame*)data = ctx->frame;
851 
852  return buf_size;
853 }
854 
859 {
860  IVI45DecContext *ctx = avctx->priv_data;
861 
862  ff_ivi_free_buffers(&ctx->planes[0]);
863 
864  if (ctx->mb_vlc.cust_tab.table)
865  ff_free_vlc(&ctx->mb_vlc.cust_tab);
866 
867  if (ctx->frame.data[0])
868  avctx->release_buffer(avctx, &ctx->frame);
869 
870 #if IVI4_STREAM_ANALYSER
871  if (avctx->codec_id == CODEC_ID_INDEO4) {
872  if (ctx->is_scalable)
873  av_log(avctx, AV_LOG_ERROR, "This video uses scalability mode!\n");
874  if (ctx->uses_tiling)
875  av_log(avctx, AV_LOG_ERROR, "This video uses local decoding!\n");
876  if (ctx->has_b_frames)
877  av_log(avctx, AV_LOG_ERROR, "This video contains B-frames!\n");
878  if (ctx->has_transp)
879  av_log(avctx, AV_LOG_ERROR, "Transparency mode is enabled!\n");
880  if (ctx->uses_haar)
881  av_log(avctx, AV_LOG_ERROR, "This video uses Haar transform!\n");
882  if (ctx->uses_fullpel)
883  av_log(avctx, AV_LOG_ERROR, "This video uses fullpel motion vectors!\n");
884  }
885 #endif
886 
887  return 0;
888 }
889 
890 
897 const IVIHuffDesc ff_ivi_mb_huff_desc[8] = {
898  {8, {0, 4, 5, 4, 4, 4, 6, 6}},
899  {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
900  {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
901  {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
902  {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
903  {9, {0, 4, 4, 4, 4, 3, 3, 3, 2}},
904  {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
905  {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
906 };
907 
908 const IVIHuffDesc ff_ivi_blk_huff_desc[8] = {
909  {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
910  {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
911  {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
912  {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
913  {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
914  {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
915  {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
916  {9, {3, 4, 4, 5, 5, 5, 6, 5, 5}}
917 };
918 
919 
923 const uint8_t ff_ivi_vertical_scan_8x8[64] = {
924  0, 8, 16, 24, 32, 40, 48, 56,
925  1, 9, 17, 25, 33, 41, 49, 57,
926  2, 10, 18, 26, 34, 42, 50, 58,
927  3, 11, 19, 27, 35, 43, 51, 59,
928  4, 12, 20, 28, 36, 44, 52, 60,
929  5, 13, 21, 29, 37, 45, 53, 61,
930  6, 14, 22, 30, 38, 46, 54, 62,
931  7, 15, 23, 31, 39, 47, 55, 63
932 };
933 
934 const uint8_t ff_ivi_horizontal_scan_8x8[64] = {
935  0, 1, 2, 3, 4, 5, 6, 7,
936  8, 9, 10, 11, 12, 13, 14, 15,
937  16, 17, 18, 19, 20, 21, 22, 23,
938  24, 25, 26, 27, 28, 29, 30, 31,
939  32, 33, 34, 35, 36, 37, 38, 39,
940  40, 41, 42, 43, 44, 45, 46, 47,
941  48, 49, 50, 51, 52, 53, 54, 55,
942  56, 57, 58, 59, 60, 61, 62, 63
943 };
944 
945 const uint8_t ff_ivi_direct_scan_4x4[16] = {
946  0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15
947 };
948 
949 
954 { /* MapTab0 */
955  5, /* eob_sym */
956  2, /* esc_sym */
957  /* run table */
958  {1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3,
959  1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5,
960  1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1,
961  8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9,
962  9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3,
963  2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12,
964  8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13,
965  2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8,
966  1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8,
967  6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21,
968  22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8,
969  4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6,
970  1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28,
971  1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41,
972  6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1,
973  30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
974 
975  /* value table */
976  { 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1,
977  6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1,
978  10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13,
979  1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1,
980  -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4,
981  7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1,
982  2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1,
983  9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3,
984  28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4,
985  3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1,
986  -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5,
987  5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4,
988  -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1,
989  37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1,
990  5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40,
991  -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1}
992 },{
993  /* MapTab1 */
994  0, /* eob_sym */
995  38, /* esc_sym */
996  /* run table */
997  {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7,
998  7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16,
999  14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
1000  25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27,
1001  33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34,
1002  37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38,
1003  40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44,
1004  57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1,
1005  52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64,
1006  60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13,
1007  12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4,
1008  1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25,
1009  21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33,
1010  29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3,
1011  28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41,
1012  2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5},
1013 
1014  /* value table */
1015  {0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1,
1016  -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1,
1017  -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1,
1018  1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1,
1019  1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1,
1020  1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1,
1021  -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1,
1022  -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4,
1023  1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1,
1024  1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2,
1025  2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3,
1026  6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2,
1027  2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2,
1028  2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4,
1029  -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2,
1030  -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4}
1031 },{
1032  /* MapTab2 */
1033  2, /* eob_sym */
1034  11, /* esc_sym */
1035  /* run table */
1036  {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5,
1037  2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2,
1038  2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13,
1039  3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7,
1040  1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3,
1041  9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22,
1042  23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32,
1043  28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31,
1044  49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3,
1045  3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57,
1046  1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2,
1047  50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1,
1048  45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17,
1049  17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55,
1050  7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4,
1051  8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62},
1052 
1053  /* value table */
1054  { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1,
1055  2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3,
1056  -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1,
1057  3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2,
1058  7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4,
1059  2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1,
1060  1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1,
1061  1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1,
1062  1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5,
1063  -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1,
1064  -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7,
1065  -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13,
1066  1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2,
1067  -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1,
1068  -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6,
1069  -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1}
1070 },{
1071  /* MapTab3 */
1072  0, /* eob_sym */
1073  35, /* esc_sym */
1074  /* run table */
1075  {0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7,
1076  7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3,
1077  3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1,
1078  5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20,
1079  21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26,
1080  9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32,
1081  2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41,
1082  35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40,
1083  12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16,
1084  43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48,
1085  57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51,
1086  8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59,
1087  59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60,
1088  60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4,
1089  25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1,
1090  20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16},
1091 
1092  /* value table */
1093  { 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1,
1094  -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2,
1095  -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4,
1096  2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1,
1097  1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1,
1098  2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1,
1099  4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1,
1100  -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1,
1101  2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2,
1102  1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1,
1103  -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1,
1104  -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1,
1105  -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1,
1106  1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5,
1107  -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12,
1108  -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3}
1109 },{
1110  /* MapTab4 */
1111  0, /* eob_sym */
1112  34, /* esc_sym */
1113  /* run table */
1114  {0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5,
1115  2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1,
1116  2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1,
1117  9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4,
1118  1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1,
1119  2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1120  2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12,
1121  3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1,
1122  4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1,
1123  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5,
1124  1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1,
1125  5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1,
1126  1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1,
1127  3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1,
1128  1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8,
1129  1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1},
1130 
1131  /* value table */
1132  { 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1,
1133  2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9,
1134  3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13,
1135  1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2,
1136  18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23,
1137  -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29,
1138  6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1,
1139  4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39,
1140  3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47,
1141  -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3,
1142  -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63,
1143  -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67,
1144  -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70,
1145  6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79,
1146  75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2,
1147  83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89}
1148 },{
1149  /* MapTab5 */
1150  2, /* eob_sym */
1151  33, /* esc_sym */
1152  /* run table */
1153  {1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1,
1154  1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1,
1155  1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1,
1156  12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2,
1157  6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3,
1158  8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2,
1159  1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4,
1160  4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1,
1161  1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2,
1162  2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13,
1163  1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31,
1164  3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2,
1165  1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8,
1166  36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1,
1167  1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4,
1168  40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7},
1169 
1170  /* value table */
1171  { 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4,
1172  -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6,
1173  -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8,
1174  1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5,
1175  2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4,
1176  2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7,
1177  15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4,
1178  -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18,
1179  -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9,
1180  -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2,
1181  22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1,
1182  7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11,
1183  26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4,
1184  -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29,
1185  30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7,
1186  -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5}
1187 },{
1188  /* MapTab6 */
1189  2, /* eob_sym */
1190  13, /* esc_sym */
1191  /* run table */
1192  {1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2,
1193  4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1,
1194  3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9,
1195  4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2,
1196  1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1,
1197  6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7,
1198  15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1,
1199  2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1,
1200  17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1,
1201  6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1,
1202  4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2,
1203  1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1,
1204  1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1,
1205  12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6,
1206  4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25,
1207  14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2},
1208 
1209  /* value table */
1210  {-20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2,
1211  1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8,
1212  2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1,
1213  2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5,
1214  -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18,
1215  2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2,
1216  -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25,
1217  -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29,
1218  1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33,
1219  -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37,
1220  -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11,
1221  -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44,
1222  45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48,
1223  -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4,
1224  6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1,
1225  2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14}
1226 },{
1227  /* MapTab7 */
1228  2, /* eob_sym */
1229  38, /* esc_sym */
1230  /* run table */
1231  {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6,
1232  6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1,
1233  1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5,
1234  14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7,
1235  8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20,
1236  19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23,
1237  24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7,
1238  26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2,
1239  28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30,
1240  32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14,
1241  6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9,
1242  37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5,
1243  3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6,
1244  1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1,
1245  8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45,
1246  12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49},
1247 
1248  /* value table */
1249  { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1,
1250  -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5,
1251  -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2,
1252  1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2,
1253  2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1,
1254  -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1,
1255  -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3,
1256  1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7,
1257  -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1,
1258  -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2,
1259  -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3,
1260  -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5,
1261  -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5,
1262  20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21,
1263  5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1,
1264  3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1}
1265 },{
1266  /* MapTab8 */
1267  4, /* eob_sym */
1268  11, /* esc_sym */
1269  /* run table */
1270  {1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2,
1271  4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1,
1272  7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9,
1273  2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4,
1274  4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8,
1275  2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4,
1276  1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21,
1277  25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1,
1278  1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2,
1279  4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30,
1280  6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1,
1281  37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41,
1282  13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42,
1283  3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15,
1284  44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7,
1285  50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1},
1286 
1287  /* value table */
1288  { 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2,
1289  1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7,
1290  1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1,
1291  5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3,
1292  -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2,
1293  7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4,
1294  15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1,
1295  1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17,
1296  -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9,
1297  -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1,
1298  4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20,
1299  1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1,
1300  -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1,
1301  8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2,
1302  1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5,
1303  1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26}
1304 }
1305 };