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
31 #include "libavutil/attributes.h"
32 #include "libavutil/imgutils.h"
34 #define BITSTREAM_READER_LE
43 * These are 2x8 predefined Huffman codebooks for coding macroblock/block
44 * signals. They are specified using "huffman descriptors" in order to
45 * avoid huge static tables. The decoding tables will be generated at
46 * startup from these descriptors.
48 /** static macroblock huffman tables */
49 static const IVIHuffDesc ivi_mb_huff_desc[8] = {
50 {8, {0, 4, 5, 4, 4, 4, 6, 6}},
51 {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
52 {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
53 {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
54 {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
55 {9, {0, 4, 4, 4, 4, 3, 3, 3, 2}},
56 {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
57 {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
60 /** static block huffman tables */
61 static const IVIHuffDesc ivi_blk_huff_desc[8] = {
62 {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
63 {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
64 {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
65 {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
66 {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
67 {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
68 {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
69 {9, {3, 4, 4, 5, 5, 5, 6, 5, 5}}
72 static VLC ivi_mb_vlc_tabs [8]; ///< static macroblock Huffman tables
73 static VLC ivi_blk_vlc_tabs[8]; ///< static block Huffman tables
75 typedef void (*ivi_mc_func) (int16_t *buf, const int16_t *ref_buf,
76 ptrdiff_t pitch, int mc_type);
77 typedef void (*ivi_mc_avg_func) (int16_t *buf, const int16_t *ref_buf1,
78 const int16_t *ref_buf2,
79 ptrdiff_t pitch, int mc_type, int mc_type2);
81 static int ivi_mc(const IVIBandDesc *band, ivi_mc_func mc, ivi_mc_avg_func mc_avg,
82 int offs, int mv_x, int mv_y, int mv_x2, int mv_y2,
83 int mc_type, int mc_type2)
85 int ref_offs = offs + mv_y * band->pitch + mv_x;
86 int buf_size = band->pitch * band->aheight;
87 int min_size = band->pitch * (band->blk_size - 1) + band->blk_size;
88 int ref_size = (mc_type > 1) * band->pitch + (mc_type & 1);
91 av_assert0(offs >= 0 && ref_offs >= 0 && band->ref_buf);
92 av_assert0(buf_size - min_size >= offs);
93 av_assert0(buf_size - min_size - ref_size >= ref_offs);
97 mc(band->buf + offs, band->ref_buf + ref_offs, band->pitch, mc_type);
99 int ref_offs2 = offs + mv_y2 * band->pitch + mv_x2;
100 int ref_size2 = (mc_type2 > 1) * band->pitch + (mc_type2 & 1);
101 if (offs < 0 || ref_offs2 < 0 || !band->b_ref_buf)
102 return AVERROR_INVALIDDATA;
103 if (buf_size - min_size - ref_size2 < ref_offs2)
104 return AVERROR_INVALIDDATA;
107 mc(band->buf + offs, band->b_ref_buf + ref_offs2,
108 band->pitch, mc_type2);
110 mc_avg(band->buf + offs, band->ref_buf + ref_offs,
111 band->b_ref_buf + ref_offs2, band->pitch,
119 * Reverse "nbits" bits of the value "val" and return the result
120 * in the least significant bits.
122 static uint16_t inv_bits(uint16_t val, int nbits)
127 res = ff_reverse[val] >> (8 - nbits);
129 res = ((ff_reverse[val & 0xFF] << 8) +
130 (ff_reverse[val >> 8])) >> (16 - nbits);
136 * Generate a huffman codebook from the given descriptor
137 * and convert it into the FFmpeg VLC table.
139 * @param[in] cb pointer to codebook descriptor
140 * @param[out] vlc where to place the generated VLC table
141 * @param[in] flag flag: 1 - for static or 0 for dynamic tables
142 * @return result code: 0 - OK, -1 = error (invalid codebook descriptor)
144 static int ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag)
146 int pos, i, j, codes_per_row, prefix, not_last_row;
147 uint16_t codewords[256]; /* FIXME: move this temporal storage out? */
150 pos = 0; /* current position = 0 */
152 for (i = 0; i < cb->num_rows; i++) {
153 codes_per_row = 1 << cb->xbits[i];
154 not_last_row = (i != cb->num_rows - 1);
155 prefix = ((1 << i) - 1) << (cb->xbits[i] + not_last_row);
157 for (j = 0; j < codes_per_row; j++) {
158 if (pos >= 256) /* Some Indeo5 codebooks can have more than 256 */
159 break; /* elements, but only 256 codes are allowed! */
161 bits[pos] = i + cb->xbits[i] + not_last_row;
162 if (bits[pos] > IVI_VLC_BITS)
163 return AVERROR_INVALIDDATA; /* invalid descriptor */
165 codewords[pos] = inv_bits((prefix | j), bits[pos]);
173 /* number of codewords = pos */
174 return init_vlc(vlc, IVI_VLC_BITS, pos, bits, 1, 1, codewords, 2, 2,
175 (flag ? INIT_VLC_USE_NEW_STATIC : 0) | INIT_VLC_LE);
178 av_cold void ff_ivi_init_static_vlc(void)
181 static VLC_TYPE table_data[8192 * 16][2];
182 static int initialized_vlcs = 0;
184 if (initialized_vlcs)
186 for (i = 0; i < 8; i++) {
187 ivi_mb_vlc_tabs[i].table = table_data + i * 2 * 8192;
188 ivi_mb_vlc_tabs[i].table_allocated = 8192;
189 ivi_create_huff_from_desc(&ivi_mb_huff_desc[i],
190 &ivi_mb_vlc_tabs[i], 1);
191 ivi_blk_vlc_tabs[i].table = table_data + (i * 2 + 1) * 8192;
192 ivi_blk_vlc_tabs[i].table_allocated = 8192;
193 ivi_create_huff_from_desc(&ivi_blk_huff_desc[i],
194 &ivi_blk_vlc_tabs[i], 1);
196 initialized_vlcs = 1;
200 * Copy huffman codebook descriptors.
202 * @param[out] dst ptr to the destination descriptor
203 * @param[in] src ptr to the source descriptor
205 static void ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src)
207 dst->num_rows = src->num_rows;
208 memcpy(dst->xbits, src->xbits, src->num_rows);
212 * Compare two huffman codebook descriptors.
214 * @param[in] desc1 ptr to the 1st descriptor to compare
215 * @param[in] desc2 ptr to the 2nd descriptor to compare
216 * @return comparison result: 0 - equal, 1 - not equal
218 static int ivi_huff_desc_cmp(const IVIHuffDesc *desc1,
219 const IVIHuffDesc *desc2)
221 return desc1->num_rows != desc2->num_rows ||
222 memcmp(desc1->xbits, desc2->xbits, desc1->num_rows);
225 int ff_ivi_dec_huff_desc(GetBitContext *gb, int desc_coded, int which_tab,
226 IVIHuffTab *huff_tab, AVCodecContext *avctx)
229 IVIHuffDesc new_huff;
232 /* select default table */
233 huff_tab->tab = (which_tab) ? &ivi_blk_vlc_tabs[7]
234 : &ivi_mb_vlc_tabs [7];
238 huff_tab->tab_sel = get_bits(gb, 3);
239 if (huff_tab->tab_sel == 7) {
240 /* custom huffman table (explicitly encoded) */
241 new_huff.num_rows = get_bits(gb, 4);
242 if (!new_huff.num_rows) {
243 av_log(avctx, AV_LOG_ERROR, "Empty custom Huffman table!\n");
244 return AVERROR_INVALIDDATA;
247 for (i = 0; i < new_huff.num_rows; i++)
248 new_huff.xbits[i] = get_bits(gb, 4);
250 /* Have we got the same custom table? Rebuild if not. */
251 if (ivi_huff_desc_cmp(&new_huff, &huff_tab->cust_desc) || !huff_tab->cust_tab.table) {
252 ivi_huff_desc_copy(&huff_tab->cust_desc, &new_huff);
254 if (huff_tab->cust_tab.table)
255 ff_free_vlc(&huff_tab->cust_tab);
256 result = ivi_create_huff_from_desc(&huff_tab->cust_desc,
257 &huff_tab->cust_tab, 0);
259 // reset faulty description
260 huff_tab->cust_desc.num_rows = 0;
261 av_log(avctx, AV_LOG_ERROR,
262 "Error while initializing custom vlc table!\n");
266 huff_tab->tab = &huff_tab->cust_tab;
268 /* select one of predefined tables */
269 huff_tab->tab = (which_tab) ? &ivi_blk_vlc_tabs[huff_tab->tab_sel]
270 : &ivi_mb_vlc_tabs [huff_tab->tab_sel];
277 * Free planes, bands and macroblocks buffers.
279 * @param[in] planes pointer to the array of the plane descriptors
281 static av_cold void ivi_free_buffers(IVIPlaneDesc *planes)
285 for (p = 0; p < 3; p++) {
287 for (b = 0; b < planes[p].num_bands; b++) {
288 av_freep(&planes[p].bands[b].bufs[0]);
289 av_freep(&planes[p].bands[b].bufs[1]);
290 av_freep(&planes[p].bands[b].bufs[2]);
291 av_freep(&planes[p].bands[b].bufs[3]);
293 if (planes[p].bands[b].blk_vlc.cust_tab.table)
294 ff_free_vlc(&planes[p].bands[b].blk_vlc.cust_tab);
295 for (t = 0; t < planes[p].bands[b].num_tiles; t++)
296 av_freep(&planes[p].bands[b].tiles[t].mbs);
297 av_freep(&planes[p].bands[b].tiles);
299 av_freep(&planes[p].bands);
300 planes[p].num_bands = 0;
304 av_cold int ff_ivi_init_planes(AVCodecContext *avctx, IVIPlaneDesc *planes, const IVIPicConfig *cfg,
308 uint32_t b_width, b_height, align_fac, width_aligned,
309 height_aligned, buf_size;
312 ivi_free_buffers(planes);
314 if (av_image_check_size2(cfg->pic_width, cfg->pic_height, avctx->max_pixels, AV_PIX_FMT_YUV410P, 0, avctx) < 0 ||
315 cfg->luma_bands < 1 || cfg->chroma_bands < 1)
316 return AVERROR_INVALIDDATA;
318 /* fill in the descriptor of the luminance plane */
319 planes[0].width = cfg->pic_width;
320 planes[0].height = cfg->pic_height;
321 planes[0].num_bands = cfg->luma_bands;
323 /* fill in the descriptors of the chrominance planes */
324 planes[1].width = planes[2].width = (cfg->pic_width + 3) >> 2;
325 planes[1].height = planes[2].height = (cfg->pic_height + 3) >> 2;
326 planes[1].num_bands = planes[2].num_bands = cfg->chroma_bands;
328 for (p = 0; p < 3; p++) {
329 planes[p].bands = av_mallocz_array(planes[p].num_bands, sizeof(IVIBandDesc));
330 if (!planes[p].bands)
331 return AVERROR(ENOMEM);
333 /* select band dimensions: if there is only one band then it
334 * has the full size, if there are several bands each of them
335 * has only half size */
336 b_width = planes[p].num_bands == 1 ? planes[p].width
337 : (planes[p].width + 1) >> 1;
338 b_height = planes[p].num_bands == 1 ? planes[p].height
339 : (planes[p].height + 1) >> 1;
341 /* luma band buffers will be aligned on 16x16 (max macroblock size) */
342 /* chroma band buffers will be aligned on 8x8 (max macroblock size) */
343 align_fac = p ? 8 : 16;
344 width_aligned = FFALIGN(b_width , align_fac);
345 height_aligned = FFALIGN(b_height, align_fac);
346 buf_size = width_aligned * height_aligned * sizeof(int16_t);
348 for (b = 0; b < planes[p].num_bands; b++) {
349 band = &planes[p].bands[b]; /* select appropriate plane/band */
352 band->width = b_width;
353 band->height = b_height;
354 band->pitch = width_aligned;
355 band->aheight = height_aligned;
356 av_assert0(!band->bufs[0] && !band->bufs[1] &&
357 !band->bufs[2] && !band->bufs[3]);
358 band->bufsize = buf_size/2;
359 av_assert0(buf_size % 2 == 0);
361 /* reset custom vlc */
362 planes[p].bands[0].blk_vlc.cust_desc.num_rows = 0;
369 static int ivi_init_tiles(const IVIBandDesc *band, IVITile *ref_tile,
370 int p, int b, int t_height, int t_width)
373 IVITile *tile = band->tiles;
375 for (y = 0; y < band->height; y += t_height) {
376 for (x = 0; x < band->width; x += t_width) {
379 tile->mb_size = band->mb_size;
380 tile->width = FFMIN(band->width - x, t_width);
381 tile->height = FFMIN(band->height - y, t_height);
382 tile->is_empty = tile->data_size = 0;
383 /* calculate number of macroblocks */
384 tile->num_MBs = IVI_MBs_PER_TILE(tile->width, tile->height,
387 av_freep(&tile->mbs);
388 tile->mbs = av_mallocz_array(tile->num_MBs, sizeof(IVIMbInfo));
390 return AVERROR(ENOMEM);
394 if (tile->num_MBs != ref_tile->num_MBs) {
395 av_log(NULL, AV_LOG_DEBUG, "ref_tile mismatch\n");
396 return AVERROR_INVALIDDATA;
398 tile->ref_mbs = ref_tile->mbs;
408 av_cold int ff_ivi_init_tiles(IVIPlaneDesc *planes,
409 int tile_width, int tile_height)
411 int p, b, x_tiles, y_tiles, t_width, t_height, ret;
414 for (p = 0; p < 3; p++) {
415 t_width = !p ? tile_width : (tile_width + 3) >> 2;
416 t_height = !p ? tile_height : (tile_height + 3) >> 2;
418 if (!p && planes[0].num_bands == 4) {
419 if (t_width % 2 || t_height % 2) {
420 avpriv_request_sample(NULL, "Odd tiles");
421 return AVERROR_PATCHWELCOME;
426 if(t_width<=0 || t_height<=0)
427 return AVERROR(EINVAL);
429 for (b = 0; b < planes[p].num_bands; b++) {
430 band = &planes[p].bands[b];
434 for (t = 0; t < band->num_tiles; t++) {
435 av_freep(&band->tiles[t].mbs);
439 x_tiles = IVI_NUM_TILES(band->width, t_width);
440 y_tiles = IVI_NUM_TILES(band->height, t_height);
441 band->num_tiles = x_tiles * y_tiles;
443 av_freep(&band->tiles);
444 band->tiles = av_mallocz_array(band->num_tiles, sizeof(IVITile));
447 return AVERROR(ENOMEM);
450 /* use the first luma band as reference for motion vectors
452 ret = ivi_init_tiles(band, planes[0].bands[0].tiles,
453 p, b, t_height, t_width);
463 * Decode size of the tile data.
464 * The size is stored as a variable-length field having the following format:
465 * if (tile_data_size < 255) than this field is only one byte long
466 * if (tile_data_size >= 255) than this field four is byte long: 0xFF X1 X2 X3
467 * where X1-X3 is size of the tile data
469 * @param[in,out] gb the GetBit context
470 * @return size of the tile data in bytes
472 static int ivi_dec_tile_data_size(GetBitContext *gb)
478 len = get_bits(gb, 8);
480 len = get_bits(gb, 24);
483 /* align the bitstream reader on the byte boundary */
489 static int ivi_dc_transform(const IVIBandDesc *band, int *prev_dc, int buf_offs,
492 band->dc_transform(prev_dc, band->buf + buf_offs,
493 band->pitch, blk_size);
498 static int ivi_decode_coded_blocks(GetBitContext *gb, const IVIBandDesc *band,
499 ivi_mc_func mc, ivi_mc_avg_func mc_avg,
501 int mv_x2, int mv_y2,
502 int *prev_dc, int is_intra,
503 int mc_type, int mc_type2,
504 uint32_t quant, int offs,
505 AVCodecContext *avctx)
507 const uint16_t *base_tab = is_intra ? band->intra_base : band->inter_base;
508 RVMapDesc *rvmap = band->rv_map;
509 uint8_t col_flags[8];
511 uint32_t sym = 0, lo, hi, q;
513 int blk_size = band->blk_size;
514 int num_coeffs = blk_size * blk_size;
515 int col_mask = blk_size - 1;
517 int min_size = band->pitch * (band->transform_size - 1) +
518 band->transform_size;
519 int buf_size = band->pitch * band->aheight - offs;
521 if (min_size > buf_size)
522 return AVERROR_INVALIDDATA;
525 av_log(avctx, AV_LOG_ERROR, "Scan pattern is not set.\n");
526 return AVERROR_INVALIDDATA;
529 /* zero transform vector */
530 memset(trvec, 0, num_coeffs * sizeof(trvec[0]));
531 /* zero column flags */
532 memset(col_flags, 0, sizeof(col_flags));
533 while (scan_pos <= num_coeffs) {
534 sym = get_vlc2(gb, band->blk_vlc.tab->table,
536 if (sym == rvmap->eob_sym)
537 break; /* End of block */
539 /* Escape - run/val explicitly coded using 3 vlc codes */
540 if (sym == rvmap->esc_sym) {
541 run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1;
542 lo = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
543 hi = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
544 /* merge them and convert into signed val */
545 val = IVI_TOSIGNED((hi << 6) | lo);
548 av_log(avctx, AV_LOG_ERROR, "Invalid sym encountered: %"PRIu32".\n", sym);
549 return AVERROR_INVALIDDATA;
551 run = rvmap->runtab[sym];
552 val = rvmap->valtab[sym];
555 /* de-zigzag and dequantize */
557 if (scan_pos >= num_coeffs || scan_pos < 0)
559 pos = band->scan[scan_pos];
562 ff_dlog(avctx, "Val = 0 encountered!\n");
564 q = (base_tab[pos] * quant) >> 9;
566 val = val * q + FFSIGN(val) * (((q ^ 1) - 1) >> 1);
568 /* track columns containing non-zero coeffs */
569 col_flags[pos & col_mask] |= !!val;
572 if (scan_pos < 0 || scan_pos >= num_coeffs && sym != rvmap->eob_sym)
573 return AVERROR_INVALIDDATA; /* corrupt block data */
575 /* undoing DC coeff prediction for intra-blocks */
576 if (is_intra && band->is_2d_trans) {
577 *prev_dc += trvec[0];
579 col_flags[0] |= !!*prev_dc;
582 if(band->transform_size > band->blk_size){
583 av_log(NULL, AV_LOG_ERROR, "Too large transform\n");
584 return AVERROR_INVALIDDATA;
587 /* apply inverse transform */
588 band->inv_transform(trvec, band->buf + offs,
589 band->pitch, col_flags);
591 /* apply motion compensation */
593 return ivi_mc(band, mc, mc_avg, offs, mv_x, mv_y, mv_x2, mv_y2,
600 * extract huffman-coded transform coefficients from the bitstream,
601 * dequantize them, apply inverse transform and motion compensation
602 * in order to reconstruct the picture.
604 * @param[in,out] gb the GetBit context
605 * @param[in] band pointer to the band descriptor
606 * @param[in] tile pointer to the tile descriptor
607 * @return result code: 0 - OK, -1 = error (corrupted blocks data)
609 static int ivi_decode_blocks(GetBitContext *gb, const IVIBandDesc *band,
610 IVITile *tile, AVCodecContext *avctx)
612 int mbn, blk, num_blocks, blk_size, ret, is_intra;
613 int mc_type = 0, mc_type2 = -1;
614 int mv_x = 0, mv_y = 0, mv_x2 = 0, mv_y2 = 0;
616 uint32_t cbp, quant, buf_offs;
618 ivi_mc_func mc_with_delta_func, mc_no_delta_func;
619 ivi_mc_avg_func mc_avg_with_delta_func, mc_avg_no_delta_func;
620 const uint8_t *scale_tab;
622 /* init intra prediction for the DC coefficient */
624 blk_size = band->blk_size;
625 /* number of blocks per mb */
626 num_blocks = (band->mb_size != blk_size) ? 4 : 1;
628 mc_with_delta_func = ff_ivi_mc_8x8_delta;
629 mc_no_delta_func = ff_ivi_mc_8x8_no_delta;
630 mc_avg_with_delta_func = ff_ivi_mc_avg_8x8_delta;
631 mc_avg_no_delta_func = ff_ivi_mc_avg_8x8_no_delta;
633 mc_with_delta_func = ff_ivi_mc_4x4_delta;
634 mc_no_delta_func = ff_ivi_mc_4x4_no_delta;
635 mc_avg_with_delta_func = ff_ivi_mc_avg_4x4_delta;
636 mc_avg_no_delta_func = ff_ivi_mc_avg_4x4_no_delta;
639 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
640 is_intra = !mb->type;
642 buf_offs = mb->buf_offs;
644 quant = band->glob_quant + mb->q_delta;
645 if (avctx->codec_id == AV_CODEC_ID_INDEO4)
646 quant = av_clip_uintp2(quant, 5);
648 quant = av_clip(quant, 0, 23);
650 scale_tab = is_intra ? band->intra_scale : band->inter_scale;
652 quant = scale_tab[quant];
659 if (band->is_halfpel) {
660 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
661 mc_type2 = ((mv_y2 & 1) << 1) | (mv_x2 & 1);
665 mv_y2 >>= 1; /* convert halfpel vectors into fullpel ones */
669 if (mb->type != 2 && mb->type != 3)
672 int dmv_x, dmv_y, cx, cy;
674 dmv_x = mb->mv_x >> band->is_halfpel;
675 dmv_y = mb->mv_y >> band->is_halfpel;
676 cx = mb->mv_x & band->is_halfpel;
677 cy = mb->mv_y & band->is_halfpel;
679 if (mb->xpos + dmv_x < 0 ||
680 mb->xpos + dmv_x + band->mb_size + cx > band->pitch ||
681 mb->ypos + dmv_y < 0 ||
682 mb->ypos + dmv_y + band->mb_size + cy > band->aheight) {
683 return AVERROR_INVALIDDATA;
686 if (mb->type == 2 || mb->type == 3) {
687 int dmv_x, dmv_y, cx, cy;
689 dmv_x = mb->b_mv_x >> band->is_halfpel;
690 dmv_y = mb->b_mv_y >> band->is_halfpel;
691 cx = mb->b_mv_x & band->is_halfpel;
692 cy = mb->b_mv_y & band->is_halfpel;
694 if (mb->xpos + dmv_x < 0 ||
695 mb->xpos + dmv_x + band->mb_size + cx > band->pitch ||
696 mb->ypos + dmv_y < 0 ||
697 mb->ypos + dmv_y + band->mb_size + cy > band->aheight) {
698 return AVERROR_INVALIDDATA;
703 for (blk = 0; blk < num_blocks; blk++) {
704 /* adjust block position in the buffer according to its number */
706 buf_offs += blk_size;
707 } else if (blk == 2) {
708 buf_offs -= blk_size;
709 buf_offs += blk_size * band->pitch;
712 if (cbp & 1) { /* block coded ? */
713 ret = ivi_decode_coded_blocks(gb, band, mc_with_delta_func,
714 mc_avg_with_delta_func,
715 mv_x, mv_y, mv_x2, mv_y2,
717 mc_type, mc_type2, quant,
722 int buf_size = band->pitch * band->aheight - buf_offs;
723 int min_size = (blk_size - 1) * band->pitch + blk_size;
725 if (min_size > buf_size)
726 return AVERROR_INVALIDDATA;
727 /* block not coded */
728 /* for intra blocks apply the dc slant transform */
729 /* for inter - perform the motion compensation without delta */
731 ret = ivi_dc_transform(band, &prev_dc, buf_offs, blk_size);
735 ret = ivi_mc(band, mc_no_delta_func, mc_avg_no_delta_func,
736 buf_offs, mv_x, mv_y, mv_x2, mv_y2,
753 * Handle empty tiles by performing data copying and motion
754 * compensation respectively.
756 * @param[in] avctx ptr to the AVCodecContext
757 * @param[in] band pointer to the band descriptor
758 * @param[in] tile pointer to the tile descriptor
759 * @param[in] mv_scale scaling factor for motion vectors
761 static int ivi_process_empty_tile(AVCodecContext *avctx, const IVIBandDesc *band,
762 IVITile *tile, int32_t mv_scale)
764 int x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
765 int offs, mb_offset, row_offset, ret;
766 IVIMbInfo *mb, *ref_mb;
769 ivi_mc_func mc_no_delta_func;
770 int clear_first = !band->qdelta_present && !band->plane && !band->band_num;
771 int mb_size = band->mb_size;
772 int xend = tile->xpos + tile->width;
773 int is_halfpel = band->is_halfpel;
774 int pitch = band->pitch;
776 if (tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, mb_size)) {
777 av_log(avctx, AV_LOG_ERROR, "Allocated tile size %d mismatches "
778 "parameters %d in ivi_process_empty_tile()\n",
779 tile->num_MBs, IVI_MBs_PER_TILE(tile->width, tile->height, mb_size));
780 return AVERROR_INVALIDDATA;
783 offs = tile->ypos * pitch + tile->xpos;
785 ref_mb = tile->ref_mbs;
786 row_offset = mb_size * pitch;
787 need_mc = 0; /* reset the mc tracking flag */
789 for (y = tile->ypos; y < (tile->ypos + tile->height); y += mb_size) {
792 for (x = tile->xpos; x < xend; x += mb_size) {
795 mb->buf_offs = mb_offset;
797 mb->type = 1; /* set the macroblocks type = INTER */
798 mb->cbp = 0; /* all blocks are empty */
801 mb->q_delta = band->glob_quant;
807 if (band->inherit_qdelta)
808 mb->q_delta = ref_mb->q_delta;
810 if (band->inherit_mv) {
811 /* motion vector inheritance */
813 mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
814 mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
816 mb->mv_x = ref_mb->mv_x;
817 mb->mv_y = ref_mb->mv_y;
819 need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
821 int dmv_x, dmv_y, cx, cy;
823 dmv_x = mb->mv_x >> is_halfpel;
824 dmv_y = mb->mv_y >> is_halfpel;
825 cx = mb->mv_x & is_halfpel;
826 cy = mb->mv_y & is_halfpel;
828 if ( mb->xpos + dmv_x < 0
829 || mb->xpos + dmv_x + mb_size + cx > pitch
830 || mb->ypos + dmv_y < 0
831 || mb->ypos + dmv_y + mb_size + cy > band->aheight) {
832 av_log(avctx, AV_LOG_ERROR, "MV out of bounds\n");
833 return AVERROR_INVALIDDATA;
841 mb_offset += mb_size;
846 if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */
847 num_blocks = (mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */
848 mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
849 : ff_ivi_mc_4x4_no_delta;
851 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
854 if (!band->is_halfpel) {
855 mc_type = 0; /* we have only fullpel vectors */
857 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
859 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
862 for (blk = 0; blk < num_blocks; blk++) {
863 /* adjust block position in the buffer according with its number */
864 offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * pitch);
865 ret = ivi_mc(band, mc_no_delta_func, 0, offs,
866 mv_x, mv_y, 0, 0, mc_type, -1);
872 /* copy data from the reference tile into the current one */
873 src = band->ref_buf + tile->ypos * pitch + tile->xpos;
874 dst = band->buf + tile->ypos * pitch + tile->xpos;
875 for (y = 0; y < tile->height; y++) {
876 memcpy(dst, src, tile->width*sizeof(band->buf[0]));
887 static uint16_t ivi_calc_band_checksum(const IVIBandDesc *band)
890 int16_t *src, checksum;
895 for (y = 0; y < band->height; src += band->pitch, y++)
896 for (x = 0; x < band->width; x++)
904 * Convert and output the current plane.
905 * This conversion is done by adding back the bias value of 128
906 * (subtracted in the encoder) and clipping the result.
908 * @param[in] plane pointer to the descriptor of the plane being processed
909 * @param[out] dst pointer to the buffer receiving converted pixels
910 * @param[in] dst_pitch pitch for moving to the next y line
912 static void ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, ptrdiff_t dst_pitch)
915 const int16_t *src = plane->bands[0].buf;
916 ptrdiff_t pitch = plane->bands[0].pitch;
921 for (y = 0; y < plane->height; y++) {
923 int w = plane->width;
924 for (x = 0; x < w; x++) {
925 int t = src[x] + 128;
930 for (x = 0; x < w; x++)
931 dst[x] = av_clip_uint8(src[x] + 128);
937 static void *prepare_buf(IVI45DecContext *ctx, IVIBandDesc *band, int i)
939 if (ctx->pic_conf.luma_bands <= 1 && i == 2)
942 band->bufs[i] = av_mallocz(2 * band->bufsize);
943 return band->bufs[i];
947 * Decode an Indeo 4 or 5 band.
949 * @param[in,out] ctx ptr to the decoder context
950 * @param[in,out] band ptr to the band descriptor
951 * @param[in] avctx ptr to the AVCodecContext
952 * @return result code: 0 = OK, -1 = error
954 static int decode_band(IVI45DecContext *ctx,
955 IVIBandDesc *band, AVCodecContext *avctx)
957 int result, i, t, idx1, idx2, pos;
960 band->buf = prepare_buf(ctx, band, ctx->dst_buf);
962 av_log(avctx, AV_LOG_ERROR, "Band buffer points to no data!\n");
963 return AVERROR_INVALIDDATA;
965 if (ctx->is_indeo4 && ctx->frame_type == IVI4_FRAMETYPE_BIDIR) {
966 band->ref_buf = prepare_buf(ctx, band, ctx->b_ref_buf);
967 band->b_ref_buf = prepare_buf(ctx, band, ctx->ref_buf);
968 if (!band->b_ref_buf)
969 return AVERROR(ENOMEM);
971 band->ref_buf = prepare_buf(ctx, band, ctx->ref_buf);
975 return AVERROR(ENOMEM);
976 band->data_ptr = ctx->frame_data + (get_bits_count(&ctx->gb) >> 3);
978 result = ctx->decode_band_hdr(ctx, band, avctx);
980 av_log(avctx, AV_LOG_ERROR, "Error while decoding band header: %d\n",
985 if (band->is_empty) {
986 av_log(avctx, AV_LOG_ERROR, "Empty band encountered!\n");
987 return AVERROR_INVALIDDATA;
990 band->rv_map = &ctx->rvmap_tabs[band->rvmap_sel];
992 /* apply corrections to the selected rvmap table if present */
993 for (i = 0; i < band->num_corr; i++) {
994 idx1 = band->corr[i * 2];
995 idx2 = band->corr[i * 2 + 1];
996 FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
997 FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
998 if (idx1 == band->rv_map->eob_sym || idx2 == band->rv_map->eob_sym)
999 band->rv_map->eob_sym ^= idx1 ^ idx2;
1000 if (idx1 == band->rv_map->esc_sym || idx2 == band->rv_map->esc_sym)
1001 band->rv_map->esc_sym ^= idx1 ^ idx2;
1004 pos = get_bits_count(&ctx->gb);
1006 for (t = 0; t < band->num_tiles; t++) {
1007 tile = &band->tiles[t];
1009 if (tile->mb_size != band->mb_size) {
1010 av_log(avctx, AV_LOG_ERROR, "MB sizes mismatch: %d vs. %d\n",
1011 band->mb_size, tile->mb_size);
1012 return AVERROR_INVALIDDATA;
1014 tile->is_empty = get_bits1(&ctx->gb);
1015 if (tile->is_empty) {
1016 result = ivi_process_empty_tile(avctx, band, tile,
1017 (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3));
1020 ff_dlog(avctx, "Empty tile encountered!\n");
1022 tile->data_size = ivi_dec_tile_data_size(&ctx->gb);
1023 if (!tile->data_size) {
1024 av_log(avctx, AV_LOG_ERROR, "Tile data size is zero!\n");
1025 result = AVERROR_INVALIDDATA;
1029 result = ctx->decode_mb_info(ctx, band, tile, avctx);
1033 result = ivi_decode_blocks(&ctx->gb, band, tile, avctx);
1035 av_log(avctx, AV_LOG_ERROR,
1036 "Corrupted tile data encountered!\n");
1040 if (((get_bits_count(&ctx->gb) - pos) >> 3) != tile->data_size) {
1041 av_log(avctx, AV_LOG_ERROR,
1042 "Tile data_size mismatch!\n");
1043 result = AVERROR_INVALIDDATA;
1047 pos += tile->data_size << 3; // skip to next tile
1051 /* restore the selected rvmap table by applying its corrections in
1053 for (i = band->num_corr-1; i >= 0; i--) {
1054 idx1 = band->corr[i*2];
1055 idx2 = band->corr[i*2+1];
1056 FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
1057 FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
1058 if (idx1 == band->rv_map->eob_sym || idx2 == band->rv_map->eob_sym)
1059 band->rv_map->eob_sym ^= idx1 ^ idx2;
1060 if (idx1 == band->rv_map->esc_sym || idx2 == band->rv_map->esc_sym)
1061 band->rv_map->esc_sym ^= idx1 ^ idx2;
1065 if (band->checksum_present) {
1066 uint16_t chksum = ivi_calc_band_checksum(band);
1067 if (chksum != band->checksum) {
1068 av_log(avctx, AV_LOG_ERROR,
1069 "Band checksum mismatch! Plane %d, band %d, "
1070 "received: %"PRIx32", calculated: %"PRIx16"\n",
1071 band->plane, band->band_num, band->checksum, chksum);
1076 align_get_bits(&ctx->gb);
1081 int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
1084 IVI45DecContext *ctx = avctx->priv_data;
1085 const uint8_t *buf = avpkt->data;
1086 AVFrame *frame = data;
1087 int buf_size = avpkt->size;
1090 result = init_get_bits8(&ctx->gb, buf, buf_size);
1093 ctx->frame_data = buf;
1094 ctx->frame_size = buf_size;
1096 result = ctx->decode_pic_hdr(ctx, avctx);
1098 av_log(avctx, AV_LOG_ERROR,
1099 "Error while decoding picture header: %d\n", result);
1102 if (ctx->gop_invalid)
1103 return AVERROR_INVALIDDATA;
1105 if (ctx->is_indeo4 && ctx->frame_type == IVI4_FRAMETYPE_NULL_LAST) {
1106 if (ctx->got_p_frame) {
1107 av_frame_move_ref(data, ctx->p_frame);
1109 ctx->got_p_frame = 0;
1116 if (ctx->gop_flags & IVI5_IS_PROTECTED) {
1117 avpriv_report_missing_feature(avctx, "Password-protected clip");
1118 return AVERROR_PATCHWELCOME;
1121 if (!ctx->planes[0].bands) {
1122 av_log(avctx, AV_LOG_ERROR, "Color planes not initialized yet\n");
1123 return AVERROR_INVALIDDATA;
1126 ctx->switch_buffers(ctx);
1128 if (ctx->is_nonnull_frame(ctx)) {
1129 ctx->buf_invalid[ctx->dst_buf] = 1;
1130 for (p = 0; p < 3; p++) {
1131 for (b = 0; b < ctx->planes[p].num_bands; b++) {
1132 result = decode_band(ctx, &ctx->planes[p].bands[b], avctx);
1134 av_log(avctx, AV_LOG_ERROR,
1135 "Error while decoding band: %d, plane: %d\n", b, p);
1140 ctx->buf_invalid[ctx->dst_buf] = 0;
1142 if (ctx->is_scalable)
1143 return AVERROR_INVALIDDATA;
1145 for (p = 0; p < 3; p++) {
1146 if (!ctx->planes[p].bands[0].buf)
1147 return AVERROR_INVALIDDATA;
1150 if (ctx->buf_invalid[ctx->dst_buf])
1153 if (!ctx->is_nonnull_frame(ctx))
1156 result = ff_set_dimensions(avctx, ctx->planes[0].width, ctx->planes[0].height);
1160 if ((result = ff_get_buffer(avctx, frame, 0)) < 0)
1163 if (ctx->is_scalable) {
1165 ff_ivi_recompose_haar(&ctx->planes[0], frame->data[0], frame->linesize[0]);
1167 ff_ivi_recompose53 (&ctx->planes[0], frame->data[0], frame->linesize[0]);
1169 ivi_output_plane(&ctx->planes[0], frame->data[0], frame->linesize[0]);
1172 ivi_output_plane(&ctx->planes[2], frame->data[1], frame->linesize[1]);
1173 ivi_output_plane(&ctx->planes[1], frame->data[2], frame->linesize[2]);
1177 /* If the bidirectional mode is enabled, next I and the following P
1178 * frame will be sent together. Unfortunately the approach below seems
1179 * to be the only way to handle the B-frames mode.
1180 * That's exactly the same Intel decoders do.
1182 if (ctx->is_indeo4 && ctx->frame_type == IVI4_FRAMETYPE_INTRA) {
1185 // skip version string
1186 while (get_bits(&ctx->gb, 8)) {
1187 if (get_bits_left(&ctx->gb) < 8)
1188 return AVERROR_INVALIDDATA;
1190 left = get_bits_count(&ctx->gb) & 0x18;
1191 skip_bits_long(&ctx->gb, 64 - left);
1192 if (get_bits_left(&ctx->gb) > 18 &&
1193 show_bits(&ctx->gb, 21) == 0xBFFF8) { // syncheader + inter type
1195 pkt.data = avpkt->data + (get_bits_count(&ctx->gb) >> 3);
1196 pkt.size = get_bits_left(&ctx->gb) >> 3;
1197 ctx->got_p_frame = 0;
1198 av_frame_unref(ctx->p_frame);
1199 ff_ivi_decode_frame(avctx, ctx->p_frame, &ctx->got_p_frame, &pkt);
1203 if (ctx->show_indeo4_info) {
1204 if (ctx->is_scalable)
1205 av_log(avctx, AV_LOG_DEBUG, "This video uses scalability mode\n");
1206 if (ctx->uses_tiling)
1207 av_log(avctx, AV_LOG_DEBUG, "This video uses local decoding\n");
1208 if (ctx->has_b_frames)
1209 av_log(avctx, AV_LOG_DEBUG, "This video contains B-frames\n");
1210 if (ctx->has_transp)
1211 av_log(avctx, AV_LOG_DEBUG, "Transparency mode is enabled\n");
1213 av_log(avctx, AV_LOG_DEBUG, "This video uses Haar transform\n");
1214 if (ctx->uses_fullpel)
1215 av_log(avctx, AV_LOG_DEBUG, "This video uses fullpel motion vectors\n");
1216 ctx->show_indeo4_info = 0;
1223 * Close Indeo5 decoder and clean up its context.
1225 av_cold int ff_ivi_decode_close(AVCodecContext *avctx)
1227 IVI45DecContext *ctx = avctx->priv_data;
1229 ivi_free_buffers(&ctx->planes[0]);
1231 if (ctx->mb_vlc.cust_tab.table)
1232 ff_free_vlc(&ctx->mb_vlc.cust_tab);
1234 if (ctx->blk_vlc.cust_tab.table)
1235 ff_free_vlc(&ctx->blk_vlc.cust_tab);
1237 av_frame_free(&ctx->p_frame);
1244 * Scan patterns shared between indeo4 and indeo5
1246 const uint8_t ff_ivi_vertical_scan_8x8[64] = {
1247 0, 8, 16, 24, 32, 40, 48, 56,
1248 1, 9, 17, 25, 33, 41, 49, 57,
1249 2, 10, 18, 26, 34, 42, 50, 58,
1250 3, 11, 19, 27, 35, 43, 51, 59,
1251 4, 12, 20, 28, 36, 44, 52, 60,
1252 5, 13, 21, 29, 37, 45, 53, 61,
1253 6, 14, 22, 30, 38, 46, 54, 62,
1254 7, 15, 23, 31, 39, 47, 55, 63
1257 const uint8_t ff_ivi_horizontal_scan_8x8[64] = {
1258 0, 1, 2, 3, 4, 5, 6, 7,
1259 8, 9, 10, 11, 12, 13, 14, 15,
1260 16, 17, 18, 19, 20, 21, 22, 23,
1261 24, 25, 26, 27, 28, 29, 30, 31,
1262 32, 33, 34, 35, 36, 37, 38, 39,
1263 40, 41, 42, 43, 44, 45, 46, 47,
1264 48, 49, 50, 51, 52, 53, 54, 55,
1265 56, 57, 58, 59, 60, 61, 62, 63
1268 const uint8_t ff_ivi_direct_scan_4x4[16] = {
1269 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15
1274 * Run-value (RLE) tables.
1276 const RVMapDesc ff_ivi_rvmap_tabs[9] = {
1281 {1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3,
1282 1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5,
1283 1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1,
1284 8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9,
1285 9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3,
1286 2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12,
1287 8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13,
1288 2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8,
1289 1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8,
1290 6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21,
1291 22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8,
1292 4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6,
1293 1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28,
1294 1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41,
1295 6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1,
1296 30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
1299 { 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1,
1300 6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1,
1301 10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13,
1302 1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1,
1303 -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4,
1304 7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1,
1305 2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1,
1306 9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3,
1307 28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4,
1308 3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1,
1309 -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5,
1310 5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4,
1311 -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1,
1312 37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1,
1313 5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40,
1314 -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1}
1320 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7,
1321 7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16,
1322 14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
1323 25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27,
1324 33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34,
1325 37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38,
1326 40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44,
1327 57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1,
1328 52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64,
1329 60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13,
1330 12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4,
1331 1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25,
1332 21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33,
1333 29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3,
1334 28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41,
1335 2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5},
1338 {0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1,
1339 -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1,
1340 -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1,
1341 1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1,
1342 1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1,
1343 1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1,
1344 -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1,
1345 -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4,
1346 1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1,
1347 1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2,
1348 2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3,
1349 6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2,
1350 2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2,
1351 2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4,
1352 -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2,
1353 -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4}
1359 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5,
1360 2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2,
1361 2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13,
1362 3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7,
1363 1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3,
1364 9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22,
1365 23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32,
1366 28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31,
1367 49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3,
1368 3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57,
1369 1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2,
1370 50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1,
1371 45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17,
1372 17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55,
1373 7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4,
1374 8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62},
1377 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1,
1378 2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3,
1379 -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1,
1380 3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2,
1381 7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4,
1382 2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1,
1383 1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1,
1384 1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1,
1385 1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5,
1386 -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1,
1387 -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7,
1388 -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13,
1389 1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2,
1390 -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1,
1391 -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6,
1392 -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1}
1398 {0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7,
1399 7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3,
1400 3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1,
1401 5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20,
1402 21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26,
1403 9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32,
1404 2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41,
1405 35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40,
1406 12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16,
1407 43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48,
1408 57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51,
1409 8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59,
1410 59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60,
1411 60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4,
1412 25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1,
1413 20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16},
1416 { 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1,
1417 -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2,
1418 -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4,
1419 2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1,
1420 1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1,
1421 2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1,
1422 4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1,
1423 -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1,
1424 2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2,
1425 1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1,
1426 -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1,
1427 -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1,
1428 -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1,
1429 1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5,
1430 -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12,
1431 -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3}
1437 {0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5,
1438 2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1,
1439 2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1,
1440 9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4,
1441 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1,
1442 2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1443 2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12,
1444 3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1,
1445 4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1,
1446 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5,
1447 1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1,
1448 5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1,
1449 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1,
1450 3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1,
1451 1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8,
1452 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1},
1455 { 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1,
1456 2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9,
1457 3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13,
1458 1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2,
1459 18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23,
1460 -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29,
1461 6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1,
1462 4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39,
1463 3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47,
1464 -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3,
1465 -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63,
1466 -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67,
1467 -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70,
1468 6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79,
1469 75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2,
1470 83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89}
1476 {1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1,
1477 1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1,
1478 1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1,
1479 12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2,
1480 6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3,
1481 8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2,
1482 1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4,
1483 4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1,
1484 1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2,
1485 2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13,
1486 1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31,
1487 3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2,
1488 1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8,
1489 36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1,
1490 1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4,
1491 40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7},
1494 { 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4,
1495 -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6,
1496 -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8,
1497 1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5,
1498 2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4,
1499 2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7,
1500 15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4,
1501 -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18,
1502 -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9,
1503 -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2,
1504 22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1,
1505 7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11,
1506 26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4,
1507 -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29,
1508 30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7,
1509 -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5}
1515 {1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2,
1516 4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1,
1517 3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9,
1518 4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2,
1519 1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1,
1520 6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7,
1521 15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1,
1522 2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1,
1523 17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1,
1524 6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1,
1525 4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2,
1526 1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1,
1527 1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1,
1528 12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6,
1529 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25,
1530 14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2},
1533 {-20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2,
1534 1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8,
1535 2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1,
1536 2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5,
1537 -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18,
1538 2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2,
1539 -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25,
1540 -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29,
1541 1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33,
1542 -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37,
1543 -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11,
1544 -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44,
1545 45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48,
1546 -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4,
1547 6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1,
1548 2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14}
1554 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6,
1555 6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1,
1556 1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5,
1557 14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7,
1558 8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20,
1559 19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23,
1560 24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7,
1561 26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2,
1562 28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30,
1563 32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14,
1564 6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9,
1565 37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5,
1566 3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6,
1567 1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1,
1568 8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45,
1569 12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49},
1572 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1,
1573 -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5,
1574 -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2,
1575 1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2,
1576 2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1,
1577 -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1,
1578 -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3,
1579 1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7,
1580 -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1,
1581 -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2,
1582 -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3,
1583 -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5,
1584 -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5,
1585 20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21,
1586 5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1,
1587 3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1}
1593 {1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2,
1594 4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1,
1595 7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9,
1596 2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4,
1597 4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8,
1598 2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4,
1599 1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21,
1600 25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1,
1601 1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2,
1602 4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30,
1603 6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1,
1604 37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41,
1605 13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42,
1606 3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15,
1607 44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7,
1608 50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1},
1611 { 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2,
1612 1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7,
1613 1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1,
1614 5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3,
1615 -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2,
1616 7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4,
1617 15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1,
1618 1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17,
1619 -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9,
1620 -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1,
1621 4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20,
1622 1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1,
1623 -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1,
1624 8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2,
1625 1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5,
1626 1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26}