2 * common functions for Indeo Video Interactive codecs (Indeo4 and Indeo5)
4 * Copyright (c) 2009 Maxim Poliakovski
6 * This file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 * This file contains functions and data shared by both Indeo4 and
29 #define BITSTREAM_READER_LE
30 #include "libavutil/attributes.h"
35 #include "ivi_common.h"
38 extern const IVIHuffDesc ff_ivi_mb_huff_desc[8]; ///< static macroblock huffman tables
39 extern const IVIHuffDesc ff_ivi_blk_huff_desc[8]; ///< static block huffman tables
41 static VLC ivi_mb_vlc_tabs [8]; ///< static macroblock Huffman tables
42 static VLC ivi_blk_vlc_tabs[8]; ///< static block Huffman tables
44 typedef void (*ivi_mc_func) (int16_t *buf, const int16_t *ref_buf,
45 uint32_t pitch, int mc_type);
47 static int ivi_mc(IVIBandDesc *band, ivi_mc_func mc,
48 int offs, int mv_x, int mv_y, int mc_type)
50 int ref_offs = offs + mv_y * band->pitch + mv_x;
51 int buf_size = band->pitch * band->aheight;
52 int min_size = band->pitch * (band->blk_size - 1) + band->blk_size;
53 int ref_size = (mc_type > 1) * band->pitch + (mc_type & 1);
55 av_assert0(offs >= 0 && ref_offs >= 0 && band->ref_buf);
56 av_assert0(buf_size - min_size >= offs);
57 av_assert0(buf_size - min_size - ref_size >= ref_offs);
59 mc(band->buf + offs, band->ref_buf + ref_offs, band->pitch, mc_type);
65 * Reverse "nbits" bits of the value "val" and return the result
66 * in the least significant bits.
68 static uint16_t inv_bits(uint16_t val, int nbits)
73 res = ff_reverse[val] >> (8 - nbits);
75 res = ((ff_reverse[val & 0xFF] << 8) +
76 (ff_reverse[val >> 8])) >> (16 - nbits);
82 * Generate a huffman codebook from the given descriptor
83 * and convert it into the FFmpeg VLC table.
85 * @param[in] cb pointer to codebook descriptor
86 * @param[out] vlc where to place the generated VLC table
87 * @param[in] flag flag: 1 - for static or 0 for dynamic tables
88 * @return result code: 0 - OK, -1 = error (invalid codebook descriptor)
90 static int ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag)
92 int pos, i, j, codes_per_row, prefix, not_last_row;
93 uint16_t codewords[256]; /* FIXME: move this temporal storage out? */
96 pos = 0; /* current position = 0 */
98 for (i = 0; i < cb->num_rows; i++) {
99 codes_per_row = 1 << cb->xbits[i];
100 not_last_row = (i != cb->num_rows - 1);
101 prefix = ((1 << i) - 1) << (cb->xbits[i] + not_last_row);
103 for (j = 0; j < codes_per_row; j++) {
104 if (pos >= 256) /* Some Indeo5 codebooks can have more than 256 */
105 break; /* elements, but only 256 codes are allowed! */
107 bits[pos] = i + cb->xbits[i] + not_last_row;
108 if (bits[pos] > IVI_VLC_BITS)
109 return AVERROR_INVALIDDATA; /* invalid descriptor */
111 codewords[pos] = inv_bits((prefix | j), bits[pos]);
119 /* number of codewords = pos */
120 return init_vlc(vlc, IVI_VLC_BITS, pos, bits, 1, 1, codewords, 2, 2,
121 (flag ? INIT_VLC_USE_NEW_STATIC : 0) | INIT_VLC_LE);
124 av_cold void ff_ivi_init_static_vlc(void)
127 static VLC_TYPE table_data[8192 * 16][2];
128 static int initialized_vlcs = 0;
130 if (initialized_vlcs)
132 for (i = 0; i < 8; i++) {
133 ivi_mb_vlc_tabs[i].table = table_data + i * 2 * 8192;
134 ivi_mb_vlc_tabs[i].table_allocated = 8192;
135 ivi_create_huff_from_desc(&ff_ivi_mb_huff_desc[i],
136 &ivi_mb_vlc_tabs[i], 1);
137 ivi_blk_vlc_tabs[i].table = table_data + (i * 2 + 1) * 8192;
138 ivi_blk_vlc_tabs[i].table_allocated = 8192;
139 ivi_create_huff_from_desc(&ff_ivi_blk_huff_desc[i],
140 &ivi_blk_vlc_tabs[i], 1);
142 initialized_vlcs = 1;
146 * Copy huffman codebook descriptors.
148 * @param[out] dst ptr to the destination descriptor
149 * @param[in] src ptr to the source descriptor
151 static void ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src)
153 dst->num_rows = src->num_rows;
154 memcpy(dst->xbits, src->xbits, src->num_rows);
158 * Compare two huffman codebook descriptors.
160 * @param[in] desc1 ptr to the 1st descriptor to compare
161 * @param[in] desc2 ptr to the 2nd descriptor to compare
162 * @return comparison result: 0 - equal, 1 - not equal
164 static int ivi_huff_desc_cmp(const IVIHuffDesc *desc1,
165 const IVIHuffDesc *desc2)
167 return desc1->num_rows != desc2->num_rows ||
168 memcmp(desc1->xbits, desc2->xbits, desc1->num_rows);
171 int ff_ivi_dec_huff_desc(GetBitContext *gb, int desc_coded, int which_tab,
172 IVIHuffTab *huff_tab, AVCodecContext *avctx)
175 IVIHuffDesc new_huff;
178 /* select default table */
179 huff_tab->tab = (which_tab) ? &ivi_blk_vlc_tabs[7]
180 : &ivi_mb_vlc_tabs [7];
184 huff_tab->tab_sel = get_bits(gb, 3);
185 if (huff_tab->tab_sel == 7) {
186 /* custom huffman table (explicitly encoded) */
187 new_huff.num_rows = get_bits(gb, 4);
188 if (!new_huff.num_rows) {
189 av_log(avctx, AV_LOG_ERROR, "Empty custom Huffman table!\n");
190 return AVERROR_INVALIDDATA;
193 for (i = 0; i < new_huff.num_rows; i++)
194 new_huff.xbits[i] = get_bits(gb, 4);
196 /* Have we got the same custom table? Rebuild if not. */
197 if (ivi_huff_desc_cmp(&new_huff, &huff_tab->cust_desc) || !huff_tab->cust_tab.table) {
198 ivi_huff_desc_copy(&huff_tab->cust_desc, &new_huff);
200 if (huff_tab->cust_tab.table)
201 ff_free_vlc(&huff_tab->cust_tab);
202 result = ivi_create_huff_from_desc(&huff_tab->cust_desc,
203 &huff_tab->cust_tab, 0);
205 // reset faulty description
206 huff_tab->cust_desc.num_rows = 0;
207 av_log(avctx, AV_LOG_ERROR,
208 "Error while initializing custom vlc table!\n");
212 huff_tab->tab = &huff_tab->cust_tab;
214 /* select one of predefined tables */
215 huff_tab->tab = (which_tab) ? &ivi_blk_vlc_tabs[huff_tab->tab_sel]
216 : &ivi_mb_vlc_tabs [huff_tab->tab_sel];
223 * Free planes, bands and macroblocks buffers.
225 * @param[in] planes pointer to the array of the plane descriptors
227 static av_cold void ivi_free_buffers(IVIPlaneDesc *planes)
231 for (p = 0; p < 3; p++) {
233 for (b = 0; b < planes[p].num_bands; b++) {
234 av_freep(&planes[p].bands[b].bufs[0]);
235 av_freep(&planes[p].bands[b].bufs[1]);
236 av_freep(&planes[p].bands[b].bufs[2]);
238 if (planes[p].bands[b].blk_vlc.cust_tab.table)
239 ff_free_vlc(&planes[p].bands[b].blk_vlc.cust_tab);
240 for (t = 0; t < planes[p].bands[b].num_tiles; t++)
241 av_freep(&planes[p].bands[b].tiles[t].mbs);
242 av_freep(&planes[p].bands[b].tiles);
244 av_freep(&planes[p].bands);
245 planes[p].num_bands = 0;
249 av_cold int ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg)
252 uint32_t b_width, b_height, align_fac, width_aligned,
253 height_aligned, buf_size;
256 ivi_free_buffers(planes);
258 if (cfg->pic_width < 1 || cfg->pic_height < 1 ||
259 cfg->luma_bands < 1 || cfg->chroma_bands < 1)
260 return AVERROR_INVALIDDATA;
262 /* fill in the descriptor of the luminance plane */
263 planes[0].width = cfg->pic_width;
264 planes[0].height = cfg->pic_height;
265 planes[0].num_bands = cfg->luma_bands;
267 /* fill in the descriptors of the chrominance planes */
268 planes[1].width = planes[2].width = (cfg->pic_width + 3) >> 2;
269 planes[1].height = planes[2].height = (cfg->pic_height + 3) >> 2;
270 planes[1].num_bands = planes[2].num_bands = cfg->chroma_bands;
272 for (p = 0; p < 3; p++) {
273 planes[p].bands = av_mallocz(planes[p].num_bands * sizeof(IVIBandDesc));
274 if (!planes[p].bands)
275 return AVERROR(ENOMEM);
277 /* select band dimensions: if there is only one band then it
278 * has the full size, if there are several bands each of them
279 * has only half size */
280 b_width = planes[p].num_bands == 1 ? planes[p].width
281 : (planes[p].width + 1) >> 1;
282 b_height = planes[p].num_bands == 1 ? planes[p].height
283 : (planes[p].height + 1) >> 1;
285 /* luma band buffers will be aligned on 16x16 (max macroblock size) */
286 /* chroma band buffers will be aligned on 8x8 (max macroblock size) */
287 align_fac = p ? 8 : 16;
288 width_aligned = FFALIGN(b_width , align_fac);
289 height_aligned = FFALIGN(b_height, align_fac);
290 buf_size = width_aligned * height_aligned * sizeof(int16_t);
292 for (b = 0; b < planes[p].num_bands; b++) {
293 band = &planes[p].bands[b]; /* select appropriate plane/band */
296 band->width = b_width;
297 band->height = b_height;
298 band->pitch = width_aligned;
299 band->aheight = height_aligned;
300 band->bufs[0] = av_mallocz(buf_size);
301 band->bufs[1] = av_mallocz(buf_size);
302 band->bufsize = buf_size/2;
303 if (!band->bufs[0] || !band->bufs[1])
304 return AVERROR(ENOMEM);
306 /* allocate the 3rd band buffer for scalability mode */
307 if (cfg->luma_bands > 1) {
308 band->bufs[2] = av_mallocz(buf_size);
310 return AVERROR(ENOMEM);
312 /* reset custom vlc */
313 planes[p].bands[0].blk_vlc.cust_desc.num_rows = 0;
320 static int ivi_init_tiles(IVIBandDesc *band, IVITile *ref_tile,
321 int p, int b, int t_height, int t_width)
324 IVITile *tile = band->tiles;
326 for (y = 0; y < band->height; y += t_height) {
327 for (x = 0; x < band->width; x += t_width) {
330 tile->mb_size = band->mb_size;
331 tile->width = FFMIN(band->width - x, t_width);
332 tile->height = FFMIN(band->height - y, t_height);
333 tile->is_empty = tile->data_size = 0;
334 /* calculate number of macroblocks */
335 tile->num_MBs = IVI_MBs_PER_TILE(tile->width, tile->height,
338 av_freep(&tile->mbs);
339 tile->mbs = av_malloc(tile->num_MBs * sizeof(IVIMbInfo));
341 return AVERROR(ENOMEM);
345 if (tile->num_MBs != ref_tile->num_MBs) {
346 av_log(NULL, AV_LOG_DEBUG, "ref_tile mismatch\n");
347 return AVERROR_INVALIDDATA;
349 tile->ref_mbs = ref_tile->mbs;
359 av_cold int ff_ivi_init_tiles(IVIPlaneDesc *planes,
360 int tile_width, int tile_height)
362 int p, b, x_tiles, y_tiles, t_width, t_height, ret;
365 for (p = 0; p < 3; p++) {
366 t_width = !p ? tile_width : (tile_width + 3) >> 2;
367 t_height = !p ? tile_height : (tile_height + 3) >> 2;
369 if (!p && planes[0].num_bands == 4) {
373 if(t_width<=0 || t_height<=0)
374 return AVERROR(EINVAL);
376 for (b = 0; b < planes[p].num_bands; b++) {
377 band = &planes[p].bands[b];
378 x_tiles = IVI_NUM_TILES(band->width, t_width);
379 y_tiles = IVI_NUM_TILES(band->height, t_height);
380 band->num_tiles = x_tiles * y_tiles;
382 av_freep(&band->tiles);
383 band->tiles = av_mallocz(band->num_tiles * sizeof(IVITile));
385 return AVERROR(ENOMEM);
387 /* use the first luma band as reference for motion vectors
389 ret = ivi_init_tiles(band, planes[0].bands[0].tiles,
390 p, b, t_height, t_width);
400 * Decode size of the tile data.
401 * The size is stored as a variable-length field having the following format:
402 * if (tile_data_size < 255) than this field is only one byte long
403 * if (tile_data_size >= 255) than this field four is byte long: 0xFF X1 X2 X3
404 * where X1-X3 is size of the tile data
406 * @param[in,out] gb the GetBit context
407 * @return size of the tile data in bytes
409 static int ivi_dec_tile_data_size(GetBitContext *gb)
415 len = get_bits(gb, 8);
417 len = get_bits_long(gb, 24);
420 /* align the bitstream reader on the byte boundary */
426 static int ivi_dc_transform(IVIBandDesc *band, int *prev_dc, int buf_offs,
429 int buf_size = band->pitch * band->aheight - buf_offs;
430 int min_size = (blk_size - 1) * band->pitch + blk_size;
432 if (min_size > buf_size)
433 return AVERROR_INVALIDDATA;
435 band->dc_transform(prev_dc, band->buf + buf_offs,
436 band->pitch, blk_size);
441 static int ivi_decode_coded_blocks(GetBitContext *gb, IVIBandDesc *band,
442 ivi_mc_func mc, int mv_x, int mv_y,
443 int *prev_dc, int is_intra, int mc_type,
444 uint32_t quant, int offs,
445 AVCodecContext *avctx)
447 const uint16_t *base_tab = is_intra ? band->intra_base : band->inter_base;
448 RVMapDesc *rvmap = band->rv_map;
449 uint8_t col_flags[8];
451 uint32_t sym = 0, lo, hi, q;
453 int blk_size = band->blk_size;
454 int num_coeffs = blk_size * blk_size;
455 int col_mask = blk_size - 1;
457 int min_size = band->pitch * (band->transform_size - 1) +
458 band->transform_size;
459 int buf_size = band->pitch * band->aheight - offs;
461 if (min_size > buf_size)
462 return AVERROR_INVALIDDATA;
465 av_log(avctx, AV_LOG_ERROR, "Scan pattern is not set.\n");
466 return AVERROR_INVALIDDATA;
469 /* zero transform vector */
470 memset(trvec, 0, num_coeffs * sizeof(trvec[0]));
471 /* zero column flags */
472 memset(col_flags, 0, sizeof(col_flags));
473 while (scan_pos <= num_coeffs) {
474 sym = get_vlc2(gb, band->blk_vlc.tab->table,
476 if (sym == rvmap->eob_sym)
477 break; /* End of block */
479 /* Escape - run/val explicitly coded using 3 vlc codes */
480 if (sym == rvmap->esc_sym) {
481 run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1;
482 lo = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
483 hi = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
484 /* merge them and convert into signed val */
485 val = IVI_TOSIGNED((hi << 6) | lo);
488 av_log(avctx, AV_LOG_ERROR, "Invalid sym encountered: %d.\n", sym);
489 return AVERROR_INVALIDDATA;
491 run = rvmap->runtab[sym];
492 val = rvmap->valtab[sym];
495 /* de-zigzag and dequantize */
497 if (scan_pos >= num_coeffs || scan_pos < 0)
499 pos = band->scan[scan_pos];
502 av_dlog(avctx, "Val = 0 encountered!\n");
504 q = (base_tab[pos] * quant) >> 9;
506 val = val * q + FFSIGN(val) * (((q ^ 1) - 1) >> 1);
508 /* track columns containing non-zero coeffs */
509 col_flags[pos & col_mask] |= !!val;
512 if (scan_pos < 0 || scan_pos >= num_coeffs && sym != rvmap->eob_sym)
513 return AVERROR_INVALIDDATA; /* corrupt block data */
515 /* undoing DC coeff prediction for intra-blocks */
516 if (is_intra && band->is_2d_trans) {
517 *prev_dc += trvec[0];
519 col_flags[0] |= !!*prev_dc;
522 if(band->transform_size > band->blk_size){
523 av_log(NULL, AV_LOG_ERROR, "Too large transform\n");
524 return AVERROR_INVALIDDATA;
527 /* apply inverse transform */
528 band->inv_transform(trvec, band->buf + offs,
529 band->pitch, col_flags);
531 /* apply motion compensation */
533 return ivi_mc(band, mc, offs, mv_x, mv_y, mc_type);
539 * extract huffman-coded transform coefficients from the bitstream,
540 * dequantize them, apply inverse transform and motion compensation
541 * in order to reconstruct the picture.
543 * @param[in,out] gb the GetBit context
544 * @param[in] band pointer to the band descriptor
545 * @param[in] tile pointer to the tile descriptor
546 * @return result code: 0 - OK, -1 = error (corrupted blocks data)
548 static int ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band,
549 IVITile *tile, AVCodecContext *avctx)
551 int mbn, blk, num_blocks, blk_size, ret, is_intra, mc_type = 0;
552 int mv_x = 0, mv_y = 0;
554 uint32_t cbp, quant, buf_offs;
556 ivi_mc_func mc_with_delta_func, mc_no_delta_func;
557 const uint8_t *scale_tab;
559 /* init intra prediction for the DC coefficient */
561 blk_size = band->blk_size;
562 /* number of blocks per mb */
563 num_blocks = (band->mb_size != blk_size) ? 4 : 1;
565 mc_with_delta_func = ff_ivi_mc_8x8_delta;
566 mc_no_delta_func = ff_ivi_mc_8x8_no_delta;
568 mc_with_delta_func = ff_ivi_mc_4x4_delta;
569 mc_no_delta_func = ff_ivi_mc_4x4_no_delta;
572 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
573 is_intra = !mb->type;
575 buf_offs = mb->buf_offs;
577 quant = band->glob_quant + mb->q_delta;
578 if (avctx->codec_id == AV_CODEC_ID_INDEO4)
579 quant = av_clip(quant, 0, 31);
581 quant = av_clip(quant, 0, 23);
583 scale_tab = is_intra ? band->intra_scale : band->inter_scale;
585 quant = scale_tab[quant];
590 if (band->is_halfpel) {
591 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
593 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
596 int dmv_x, dmv_y, cx, cy;
598 dmv_x = mb->mv_x >> band->is_halfpel;
599 dmv_y = mb->mv_y >> band->is_halfpel;
600 cx = mb->mv_x & band->is_halfpel;
601 cy = mb->mv_y & band->is_halfpel;
603 if (mb->xpos + dmv_x < 0 ||
604 mb->xpos + dmv_x + band->mb_size + cx > band->pitch ||
605 mb->ypos + dmv_y < 0 ||
606 mb->ypos + dmv_y + band->mb_size + cy > band->aheight) {
607 return AVERROR_INVALIDDATA;
612 for (blk = 0; blk < num_blocks; blk++) {
613 /* adjust block position in the buffer according to its number */
615 buf_offs += blk_size;
616 } else if (blk == 2) {
617 buf_offs -= blk_size;
618 buf_offs += blk_size * band->pitch;
621 if (cbp & 1) { /* block coded ? */
622 ret = ivi_decode_coded_blocks(gb, band, mc_with_delta_func,
623 mv_x, mv_y, &prev_dc, is_intra,
624 mc_type, quant, buf_offs, avctx);
628 /* block not coded */
629 /* for intra blocks apply the dc slant transform */
630 /* for inter - perform the motion compensation without delta */
632 ret = ivi_dc_transform(band, &prev_dc, buf_offs, blk_size);
636 ret = ivi_mc(band, mc_no_delta_func, buf_offs,
637 mv_x, mv_y, mc_type);
653 * Handle empty tiles by performing data copying and motion
654 * compensation respectively.
656 * @param[in] avctx ptr to the AVCodecContext
657 * @param[in] band pointer to the band descriptor
658 * @param[in] tile pointer to the tile descriptor
659 * @param[in] mv_scale scaling factor for motion vectors
661 static int ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
662 IVITile *tile, int32_t mv_scale)
664 int x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
665 int offs, mb_offset, row_offset, ret;
666 IVIMbInfo *mb, *ref_mb;
669 ivi_mc_func mc_no_delta_func;
671 if (tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size)) {
672 av_log(avctx, AV_LOG_ERROR, "Allocated tile size %d mismatches "
673 "parameters %d in ivi_process_empty_tile()\n",
674 tile->num_MBs, IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size));
675 return AVERROR_INVALIDDATA;
678 offs = tile->ypos * band->pitch + tile->xpos;
680 ref_mb = tile->ref_mbs;
681 row_offset = band->mb_size * band->pitch;
682 need_mc = 0; /* reset the mc tracking flag */
684 for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
687 for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
690 mb->buf_offs = mb_offset;
692 mb->type = 1; /* set the macroblocks type = INTER */
693 mb->cbp = 0; /* all blocks are empty */
695 if (!band->qdelta_present && !band->plane && !band->band_num) {
696 mb->q_delta = band->glob_quant;
701 if (band->inherit_qdelta && ref_mb)
702 mb->q_delta = ref_mb->q_delta;
704 if (band->inherit_mv && ref_mb) {
705 /* motion vector inheritance */
707 mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
708 mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
710 mb->mv_x = ref_mb->mv_x;
711 mb->mv_y = ref_mb->mv_y;
713 need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
715 int dmv_x, dmv_y, cx, cy;
717 dmv_x = mb->mv_x >> band->is_halfpel;
718 dmv_y = mb->mv_y >> band->is_halfpel;
719 cx = mb->mv_x & band->is_halfpel;
720 cy = mb->mv_y & band->is_halfpel;
722 if ( mb->xpos + dmv_x < 0
723 || mb->xpos + dmv_x + band->mb_size + cx > band->pitch
724 || mb->ypos + dmv_y < 0
725 || mb->ypos + dmv_y + band->mb_size + cy > band->aheight) {
726 av_log(avctx, AV_LOG_ERROR, "MV out of bounds\n");
727 return AVERROR_INVALIDDATA;
735 mb_offset += band->mb_size;
740 if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */
741 num_blocks = (band->mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */
742 mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
743 : ff_ivi_mc_4x4_no_delta;
745 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
748 if (!band->is_halfpel) {
749 mc_type = 0; /* we have only fullpel vectors */
751 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
753 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
756 for (blk = 0; blk < num_blocks; blk++) {
757 /* adjust block position in the buffer according with its number */
758 offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
759 ret = ivi_mc(band, mc_no_delta_func, offs,
760 mv_x, mv_y, mc_type);
766 /* copy data from the reference tile into the current one */
767 src = band->ref_buf + tile->ypos * band->pitch + tile->xpos;
768 dst = band->buf + tile->ypos * band->pitch + tile->xpos;
769 for (y = 0; y < tile->height; y++) {
770 memcpy(dst, src, tile->width*sizeof(band->buf[0]));
781 static uint16_t ivi_calc_band_checksum(IVIBandDesc *band)
784 int16_t *src, checksum;
789 for (y = 0; y < band->height; src += band->pitch, y++)
790 for (x = 0; x < band->width; x++)
798 * Convert and output the current plane.
799 * This conversion is done by adding back the bias value of 128
800 * (subtracted in the encoder) and clipping the result.
802 * @param[in] plane pointer to the descriptor of the plane being processed
803 * @param[out] dst pointer to the buffer receiving converted pixels
804 * @param[in] dst_pitch pitch for moving to the next y line
806 static void ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch)
809 const int16_t *src = plane->bands[0].buf;
810 uint32_t pitch = plane->bands[0].pitch;
815 for (y = 0; y < plane->height; y++) {
816 for (x = 0; x < plane->width; x++)
817 dst[x] = av_clip_uint8(src[x] + 128);
824 * Decode an Indeo 4 or 5 band.
826 * @param[in,out] ctx ptr to the decoder context
827 * @param[in,out] band ptr to the band descriptor
828 * @param[in] avctx ptr to the AVCodecContext
829 * @return result code: 0 = OK, -1 = error
831 static int decode_band(IVI45DecContext *ctx,
832 IVIBandDesc *band, AVCodecContext *avctx)
834 int result, i, t, idx1, idx2, pos;
837 band->buf = band->bufs[ctx->dst_buf];
839 av_log(avctx, AV_LOG_ERROR, "Band buffer points to no data!\n");
840 return AVERROR_INVALIDDATA;
842 band->ref_buf = band->bufs[ctx->ref_buf];
843 band->data_ptr = ctx->frame_data + (get_bits_count(&ctx->gb) >> 3);
845 result = ctx->decode_band_hdr(ctx, band, avctx);
847 av_log(avctx, AV_LOG_ERROR, "Error while decoding band header: %d\n",
852 if (band->is_empty) {
853 av_log(avctx, AV_LOG_ERROR, "Empty band encountered!\n");
854 return AVERROR_INVALIDDATA;
857 band->rv_map = &ctx->rvmap_tabs[band->rvmap_sel];
859 /* apply corrections to the selected rvmap table if present */
860 for (i = 0; i < band->num_corr; i++) {
861 idx1 = band->corr[i * 2];
862 idx2 = band->corr[i * 2 + 1];
863 FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
864 FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
865 if (idx1 == band->rv_map->eob_sym || idx2 == band->rv_map->eob_sym)
866 band->rv_map->eob_sym ^= idx1 ^ idx2;
867 if (idx1 == band->rv_map->esc_sym || idx2 == band->rv_map->esc_sym)
868 band->rv_map->esc_sym ^= idx1 ^ idx2;
871 pos = get_bits_count(&ctx->gb);
873 for (t = 0; t < band->num_tiles; t++) {
874 tile = &band->tiles[t];
876 if (tile->mb_size != band->mb_size) {
877 av_log(avctx, AV_LOG_ERROR, "MB sizes mismatch: %d vs. %d\n",
878 band->mb_size, tile->mb_size);
879 return AVERROR_INVALIDDATA;
881 tile->is_empty = get_bits1(&ctx->gb);
882 if (tile->is_empty) {
883 result = ivi_process_empty_tile(avctx, band, tile,
884 (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3));
887 av_dlog(avctx, "Empty tile encountered!\n");
889 tile->data_size = ivi_dec_tile_data_size(&ctx->gb);
890 if (!tile->data_size) {
891 av_log(avctx, AV_LOG_ERROR, "Tile data size is zero!\n");
892 result = AVERROR_INVALIDDATA;
896 result = ctx->decode_mb_info(ctx, band, tile, avctx);
900 result = ivi_decode_blocks(&ctx->gb, band, tile, avctx);
902 av_log(avctx, AV_LOG_ERROR,
903 "Corrupted tile data encountered!\n");
907 if (((get_bits_count(&ctx->gb) - pos) >> 3) != tile->data_size) {
908 av_log(avctx, AV_LOG_ERROR,
909 "Tile data_size mismatch!\n");
910 result = AVERROR_INVALIDDATA;
914 pos += tile->data_size << 3; // skip to next tile
918 /* restore the selected rvmap table by applying its corrections in
920 for (i = band->num_corr-1; i >= 0; i--) {
921 idx1 = band->corr[i*2];
922 idx2 = band->corr[i*2+1];
923 FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
924 FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
925 if (idx1 == band->rv_map->eob_sym || idx2 == band->rv_map->eob_sym)
926 band->rv_map->eob_sym ^= idx1 ^ idx2;
927 if (idx1 == band->rv_map->esc_sym || idx2 == band->rv_map->esc_sym)
928 band->rv_map->esc_sym ^= idx1 ^ idx2;
932 if (band->checksum_present) {
933 uint16_t chksum = ivi_calc_band_checksum(band);
934 if (chksum != band->checksum) {
935 av_log(avctx, AV_LOG_ERROR,
936 "Band checksum mismatch! Plane %d, band %d, "
937 "received: %x, calculated: %x\n",
938 band->plane, band->band_num, band->checksum, chksum);
943 align_get_bits(&ctx->gb);
948 int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
951 IVI45DecContext *ctx = avctx->priv_data;
952 const uint8_t *buf = avpkt->data;
953 AVFrame *frame = data;
954 int buf_size = avpkt->size;
957 init_get_bits(&ctx->gb, buf, buf_size * 8);
958 ctx->frame_data = buf;
959 ctx->frame_size = buf_size;
961 result = ctx->decode_pic_hdr(ctx, avctx);
963 av_log(avctx, AV_LOG_ERROR,
964 "Error while decoding picture header: %d\n", result);
967 if (ctx->gop_invalid)
968 return AVERROR_INVALIDDATA;
970 if (ctx->gop_flags & IVI5_IS_PROTECTED) {
971 avpriv_report_missing_feature(avctx, "Password-protected clip!\n");
972 return AVERROR_PATCHWELCOME;
975 ctx->switch_buffers(ctx);
979 if (ctx->is_nonnull_frame(ctx)) {
980 ctx->buf_invalid[ctx->dst_buf] = 1;
981 for (p = 0; p < 3; p++) {
982 for (b = 0; b < ctx->planes[p].num_bands; b++) {
983 result = decode_band(ctx, &ctx->planes[p].bands[b], avctx);
985 av_log(avctx, AV_LOG_ERROR,
986 "Error while decoding band: %d, plane: %d\n", b, p);
991 ctx->buf_invalid[ctx->dst_buf] = 0;
993 if (ctx->is_scalable)
994 return AVERROR_INVALIDDATA;
996 for (p = 0; p < 3; p++) {
997 if (!ctx->planes[p].bands[0].buf)
998 return AVERROR_INVALIDDATA;
1001 if (ctx->buf_invalid[ctx->dst_buf])
1004 //STOP_TIMER("decode_planes"); }
1006 /* If the bidirectional mode is enabled, next I and the following P
1007 * frame will be sent together. Unfortunately the approach below seems
1008 * to be the only way to handle the B-frames mode.
1009 * That's exactly the same Intel decoders do.
1011 if (avctx->codec_id == AV_CODEC_ID_INDEO4 &&
1012 ctx->frame_type == 0/*FRAMETYPE_INTRA*/) {
1013 while (get_bits(&ctx->gb, 8)); // skip version string
1014 skip_bits_long(&ctx->gb, 64); // skip padding, TODO: implement correct 8-bytes alignment
1015 if (get_bits_left(&ctx->gb) > 18 && show_bits(&ctx->gb, 18) == 0x3FFF8)
1016 av_log(avctx, AV_LOG_ERROR, "Buffer contains IP frames!\n");
1019 if (!ctx->is_nonnull_frame(ctx))
1022 avcodec_set_dimensions(avctx, ctx->planes[0].width, ctx->planes[0].height);
1023 if ((result = ff_get_buffer(avctx, frame, 0)) < 0)
1026 if (ctx->is_scalable) {
1027 if (avctx->codec_id == AV_CODEC_ID_INDEO4)
1028 ff_ivi_recompose_haar(&ctx->planes[0], frame->data[0], frame->linesize[0]);
1030 ff_ivi_recompose53 (&ctx->planes[0], frame->data[0], frame->linesize[0]);
1032 ivi_output_plane(&ctx->planes[0], frame->data[0], frame->linesize[0]);
1035 ivi_output_plane(&ctx->planes[2], frame->data[1], frame->linesize[1]);
1036 ivi_output_plane(&ctx->planes[1], frame->data[2], frame->linesize[2]);
1044 * Close Indeo5 decoder and clean up its context.
1046 av_cold int ff_ivi_decode_close(AVCodecContext *avctx)
1048 IVI45DecContext *ctx = avctx->priv_data;
1050 ivi_free_buffers(&ctx->planes[0]);
1052 if (ctx->mb_vlc.cust_tab.table)
1053 ff_free_vlc(&ctx->mb_vlc.cust_tab);
1055 #if IVI4_STREAM_ANALYSER
1056 if (avctx->codec_id == AV_CODEC_ID_INDEO4) {
1057 if (ctx->is_scalable)
1058 av_log(avctx, AV_LOG_ERROR, "This video uses scalability mode!\n");
1059 if (ctx->uses_tiling)
1060 av_log(avctx, AV_LOG_ERROR, "This video uses local decoding!\n");
1061 if (ctx->has_b_frames)
1062 av_log(avctx, AV_LOG_ERROR, "This video contains B-frames!\n");
1063 if (ctx->has_transp)
1064 av_log(avctx, AV_LOG_ERROR, "Transparency mode is enabled!\n");
1066 av_log(avctx, AV_LOG_ERROR, "This video uses Haar transform!\n");
1067 if (ctx->uses_fullpel)
1068 av_log(avctx, AV_LOG_ERROR, "This video uses fullpel motion vectors!\n");
1077 * These are 2x8 predefined Huffman codebooks for coding macroblock/block
1078 * signals. They are specified using "huffman descriptors" in order to
1079 * avoid huge static tables. The decoding tables will be generated at
1080 * startup from these descriptors.
1082 const IVIHuffDesc ff_ivi_mb_huff_desc[8] = {
1083 {8, {0, 4, 5, 4, 4, 4, 6, 6}},
1084 {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
1085 {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
1086 {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
1087 {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
1088 {9, {0, 4, 4, 4, 4, 3, 3, 3, 2}},
1089 {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
1090 {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
1093 const IVIHuffDesc ff_ivi_blk_huff_desc[8] = {
1094 {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
1095 {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
1096 {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
1097 {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
1098 {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
1099 {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
1100 {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
1101 {9, {3, 4, 4, 5, 5, 5, 6, 5, 5}}
1106 * Scan patterns shared between indeo4 and indeo5
1108 const uint8_t ff_ivi_vertical_scan_8x8[64] = {
1109 0, 8, 16, 24, 32, 40, 48, 56,
1110 1, 9, 17, 25, 33, 41, 49, 57,
1111 2, 10, 18, 26, 34, 42, 50, 58,
1112 3, 11, 19, 27, 35, 43, 51, 59,
1113 4, 12, 20, 28, 36, 44, 52, 60,
1114 5, 13, 21, 29, 37, 45, 53, 61,
1115 6, 14, 22, 30, 38, 46, 54, 62,
1116 7, 15, 23, 31, 39, 47, 55, 63
1119 const uint8_t ff_ivi_horizontal_scan_8x8[64] = {
1120 0, 1, 2, 3, 4, 5, 6, 7,
1121 8, 9, 10, 11, 12, 13, 14, 15,
1122 16, 17, 18, 19, 20, 21, 22, 23,
1123 24, 25, 26, 27, 28, 29, 30, 31,
1124 32, 33, 34, 35, 36, 37, 38, 39,
1125 40, 41, 42, 43, 44, 45, 46, 47,
1126 48, 49, 50, 51, 52, 53, 54, 55,
1127 56, 57, 58, 59, 60, 61, 62, 63
1130 const uint8_t ff_ivi_direct_scan_4x4[16] = {
1131 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15
1136 * Run-value (RLE) tables.
1138 const RVMapDesc ff_ivi_rvmap_tabs[9] = {
1143 {1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3,
1144 1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5,
1145 1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1,
1146 8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9,
1147 9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3,
1148 2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12,
1149 8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13,
1150 2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8,
1151 1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8,
1152 6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21,
1153 22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8,
1154 4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6,
1155 1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28,
1156 1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41,
1157 6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1,
1158 30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
1161 { 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1,
1162 6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1,
1163 10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13,
1164 1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1,
1165 -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4,
1166 7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1,
1167 2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1,
1168 9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3,
1169 28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4,
1170 3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1,
1171 -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5,
1172 5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4,
1173 -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1,
1174 37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1,
1175 5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40,
1176 -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1}
1182 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7,
1183 7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16,
1184 14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
1185 25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27,
1186 33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34,
1187 37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38,
1188 40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44,
1189 57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1,
1190 52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64,
1191 60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13,
1192 12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4,
1193 1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25,
1194 21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33,
1195 29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3,
1196 28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41,
1197 2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5},
1200 {0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1,
1201 -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1,
1202 -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1,
1203 1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1,
1204 1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1,
1205 1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1,
1206 -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1,
1207 -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4,
1208 1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1,
1209 1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2,
1210 2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3,
1211 6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2,
1212 2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2,
1213 2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4,
1214 -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2,
1215 -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4}
1221 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5,
1222 2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2,
1223 2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13,
1224 3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7,
1225 1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3,
1226 9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22,
1227 23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32,
1228 28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31,
1229 49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3,
1230 3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57,
1231 1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2,
1232 50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1,
1233 45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17,
1234 17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55,
1235 7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4,
1236 8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62},
1239 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1,
1240 2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3,
1241 -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1,
1242 3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2,
1243 7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4,
1244 2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1,
1245 1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1,
1246 1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1,
1247 1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5,
1248 -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1,
1249 -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7,
1250 -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13,
1251 1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2,
1252 -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1,
1253 -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6,
1254 -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1}
1260 {0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7,
1261 7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3,
1262 3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1,
1263 5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20,
1264 21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26,
1265 9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32,
1266 2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41,
1267 35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40,
1268 12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16,
1269 43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48,
1270 57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51,
1271 8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59,
1272 59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60,
1273 60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4,
1274 25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1,
1275 20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16},
1278 { 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1,
1279 -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2,
1280 -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4,
1281 2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1,
1282 1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1,
1283 2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1,
1284 4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1,
1285 -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1,
1286 2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2,
1287 1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1,
1288 -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1,
1289 -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1,
1290 -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1,
1291 1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5,
1292 -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12,
1293 -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3}
1299 {0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5,
1300 2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1,
1301 2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1,
1302 9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4,
1303 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1,
1304 2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1305 2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12,
1306 3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1,
1307 4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1,
1308 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5,
1309 1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1,
1310 5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1,
1311 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1,
1312 3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1,
1313 1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8,
1314 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1},
1317 { 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1,
1318 2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9,
1319 3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13,
1320 1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2,
1321 18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23,
1322 -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29,
1323 6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1,
1324 4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39,
1325 3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47,
1326 -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3,
1327 -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63,
1328 -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67,
1329 -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70,
1330 6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79,
1331 75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2,
1332 83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89}
1338 {1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1,
1339 1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1,
1340 1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1,
1341 12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2,
1342 6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3,
1343 8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2,
1344 1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4,
1345 4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1,
1346 1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2,
1347 2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13,
1348 1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31,
1349 3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2,
1350 1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8,
1351 36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1,
1352 1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4,
1353 40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7},
1356 { 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4,
1357 -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6,
1358 -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8,
1359 1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5,
1360 2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4,
1361 2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7,
1362 15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4,
1363 -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18,
1364 -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9,
1365 -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2,
1366 22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1,
1367 7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11,
1368 26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4,
1369 -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29,
1370 30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7,
1371 -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5}
1377 {1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2,
1378 4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1,
1379 3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9,
1380 4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2,
1381 1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1,
1382 6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7,
1383 15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1,
1384 2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1,
1385 17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1,
1386 6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1,
1387 4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2,
1388 1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1,
1389 1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1,
1390 12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6,
1391 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25,
1392 14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2},
1395 {-20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2,
1396 1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8,
1397 2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1,
1398 2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5,
1399 -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18,
1400 2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2,
1401 -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25,
1402 -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29,
1403 1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33,
1404 -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37,
1405 -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11,
1406 -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44,
1407 45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48,
1408 -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4,
1409 6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1,
1410 2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14}
1416 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6,
1417 6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1,
1418 1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5,
1419 14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7,
1420 8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20,
1421 19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23,
1422 24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7,
1423 26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2,
1424 28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30,
1425 32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14,
1426 6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9,
1427 37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5,
1428 3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6,
1429 1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1,
1430 8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45,
1431 12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49},
1434 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1,
1435 -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5,
1436 -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2,
1437 1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2,
1438 2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1,
1439 -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1,
1440 -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3,
1441 1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7,
1442 -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1,
1443 -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2,
1444 -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3,
1445 -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5,
1446 -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5,
1447 20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21,
1448 5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1,
1449 3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1}
1455 {1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2,
1456 4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1,
1457 7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9,
1458 2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4,
1459 4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8,
1460 2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4,
1461 1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21,
1462 25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1,
1463 1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2,
1464 4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30,
1465 6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1,
1466 37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41,
1467 13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42,
1468 3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15,
1469 44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7,
1470 50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1},
1473 { 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2,
1474 1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7,
1475 1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1,
1476 5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3,
1477 -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2,
1478 7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4,
1479 15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1,
1480 1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17,
1481 -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9,
1482 -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1,
1483 4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20,
1484 1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1,
1485 -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1,
1486 8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2,
1487 1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5,
1488 1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26}