2 * common functions for Indeo Video Interactive codecs (Indeo4 and Indeo5)
4 * Copyright (c) 2009 Maxim Poliakovski
6 * This file is part of Libav.
8 * Libav is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * Libav is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with Libav; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 * This file contains functions and data shared by both Indeo4 and
31 #define BITSTREAM_READER_LE
32 #include "libavutil/attributes.h"
33 #include "libavutil/timer.h"
38 #include "ivi_common.h"
42 * These are 2x8 predefined Huffman codebooks for coding macroblock/block
43 * signals. They are specified using "huffman descriptors" in order to
44 * avoid huge static tables. The decoding tables will be generated at
45 * startup from these descriptors.
47 /** static macroblock huffman tables */
48 static const IVIHuffDesc ivi_mb_huff_desc[8] = {
49 {8, {0, 4, 5, 4, 4, 4, 6, 6}},
50 {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
51 {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
52 {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
53 {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
54 {9, {0, 4, 4, 4, 4, 3, 3, 3, 2}},
55 {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
56 {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
59 /** static block huffman tables */
60 static const IVIHuffDesc ivi_blk_huff_desc[8] = {
61 {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
62 {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
63 {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
64 {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
65 {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
66 {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
67 {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
68 {9, {3, 4, 4, 5, 5, 5, 6, 5, 5}}
71 static VLC ivi_mb_vlc_tabs [8]; ///< static macroblock Huffman tables
72 static VLC ivi_blk_vlc_tabs[8]; ///< static block Huffman tables
74 typedef void (*ivi_mc_func) (int16_t *buf, const int16_t *ref_buf,
75 uint32_t pitch, int mc_type);
77 static int ivi_mc(IVIBandDesc *band, ivi_mc_func mc,
78 int offs, int mv_x, int mv_y, int mc_type)
80 int ref_offs = offs + mv_y * band->pitch + mv_x;
81 int buf_size = band->pitch * band->aheight;
82 int min_size = band->pitch * (band->blk_size - 1) + band->blk_size;
83 int ref_size = (mc_type > 1) * band->pitch + (mc_type & 1);
85 if (offs < 0 || ref_offs < 0 || !band->ref_buf)
86 return AVERROR_INVALIDDATA;
87 if (buf_size - min_size < offs)
88 return AVERROR_INVALIDDATA;
89 if (buf_size - min_size - ref_size < ref_offs)
90 return AVERROR_INVALIDDATA;
92 mc(band->buf + offs, band->ref_buf + ref_offs, band->pitch, mc_type);
98 * Reverse "nbits" bits of the value "val" and return the result
99 * in the least significant bits.
101 static uint16_t inv_bits(uint16_t val, int nbits)
106 res = ff_reverse[val] >> (8 - nbits);
108 res = ((ff_reverse[val & 0xFF] << 8) +
109 (ff_reverse[val >> 8])) >> (16 - nbits);
115 * Generate a huffman codebook from the given descriptor
116 * and convert it into the Libav VLC table.
118 * @param[in] cb pointer to codebook descriptor
119 * @param[out] vlc where to place the generated VLC table
120 * @param[in] flag flag: 1 - for static or 0 for dynamic tables
121 * @return result code: 0 - OK, -1 = error (invalid codebook descriptor)
123 static int ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag)
125 int pos, i, j, codes_per_row, prefix, not_last_row;
126 uint16_t codewords[256]; /* FIXME: move this temporal storage out? */
129 pos = 0; /* current position = 0 */
131 for (i = 0; i < cb->num_rows; i++) {
132 codes_per_row = 1 << cb->xbits[i];
133 not_last_row = (i != cb->num_rows - 1);
134 prefix = ((1 << i) - 1) << (cb->xbits[i] + not_last_row);
136 for (j = 0; j < codes_per_row; j++) {
137 if (pos >= 256) /* Some Indeo5 codebooks can have more than 256 */
138 break; /* elements, but only 256 codes are allowed! */
140 bits[pos] = i + cb->xbits[i] + not_last_row;
141 if (bits[pos] > IVI_VLC_BITS)
142 return AVERROR_INVALIDDATA; /* invalid descriptor */
144 codewords[pos] = inv_bits((prefix | j), bits[pos]);
152 /* number of codewords = pos */
153 return init_vlc(vlc, IVI_VLC_BITS, pos, bits, 1, 1, codewords, 2, 2,
154 (flag ? INIT_VLC_USE_NEW_STATIC : 0) | INIT_VLC_LE);
157 av_cold void ff_ivi_init_static_vlc(void)
160 static VLC_TYPE table_data[8192 * 16][2];
161 static int initialized_vlcs = 0;
163 if (initialized_vlcs)
165 for (i = 0; i < 8; i++) {
166 ivi_mb_vlc_tabs[i].table = table_data + i * 2 * 8192;
167 ivi_mb_vlc_tabs[i].table_allocated = 8192;
168 ivi_create_huff_from_desc(&ivi_mb_huff_desc[i],
169 &ivi_mb_vlc_tabs[i], 1);
170 ivi_blk_vlc_tabs[i].table = table_data + (i * 2 + 1) * 8192;
171 ivi_blk_vlc_tabs[i].table_allocated = 8192;
172 ivi_create_huff_from_desc(&ivi_blk_huff_desc[i],
173 &ivi_blk_vlc_tabs[i], 1);
175 initialized_vlcs = 1;
179 * Copy huffman codebook descriptors.
181 * @param[out] dst ptr to the destination descriptor
182 * @param[in] src ptr to the source descriptor
184 static void ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src)
186 dst->num_rows = src->num_rows;
187 memcpy(dst->xbits, src->xbits, src->num_rows);
191 * Compare two huffman codebook descriptors.
193 * @param[in] desc1 ptr to the 1st descriptor to compare
194 * @param[in] desc2 ptr to the 2nd descriptor to compare
195 * @return comparison result: 0 - equal, 1 - not equal
197 static int ivi_huff_desc_cmp(const IVIHuffDesc *desc1,
198 const IVIHuffDesc *desc2)
200 return desc1->num_rows != desc2->num_rows ||
201 memcmp(desc1->xbits, desc2->xbits, desc1->num_rows);
204 int ff_ivi_dec_huff_desc(GetBitContext *gb, int desc_coded, int which_tab,
205 IVIHuffTab *huff_tab, AVCodecContext *avctx)
208 IVIHuffDesc new_huff;
211 /* select default table */
212 huff_tab->tab = (which_tab) ? &ivi_blk_vlc_tabs[7]
213 : &ivi_mb_vlc_tabs [7];
217 huff_tab->tab_sel = get_bits(gb, 3);
218 if (huff_tab->tab_sel == 7) {
219 /* custom huffman table (explicitly encoded) */
220 new_huff.num_rows = get_bits(gb, 4);
221 if (!new_huff.num_rows) {
222 av_log(avctx, AV_LOG_ERROR, "Empty custom Huffman table!\n");
223 return AVERROR_INVALIDDATA;
226 for (i = 0; i < new_huff.num_rows; i++)
227 new_huff.xbits[i] = get_bits(gb, 4);
229 /* Have we got the same custom table? Rebuild if not. */
230 if (ivi_huff_desc_cmp(&new_huff, &huff_tab->cust_desc)) {
231 ivi_huff_desc_copy(&huff_tab->cust_desc, &new_huff);
233 if (huff_tab->cust_tab.table)
234 ff_free_vlc(&huff_tab->cust_tab);
235 result = ivi_create_huff_from_desc(&huff_tab->cust_desc,
236 &huff_tab->cust_tab, 0);
238 // reset faulty description
239 huff_tab->cust_desc.num_rows = 0;
240 av_log(avctx, AV_LOG_ERROR,
241 "Error while initializing custom vlc table!\n");
245 huff_tab->tab = &huff_tab->cust_tab;
247 /* select one of predefined tables */
248 huff_tab->tab = (which_tab) ? &ivi_blk_vlc_tabs[huff_tab->tab_sel]
249 : &ivi_mb_vlc_tabs [huff_tab->tab_sel];
256 * Free planes, bands and macroblocks buffers.
258 * @param[in] planes pointer to the array of the plane descriptors
260 static av_cold void ivi_free_buffers(IVIPlaneDesc *planes)
264 for (p = 0; p < 3; p++) {
265 for (b = 0; b < planes[p].num_bands; b++) {
266 av_freep(&planes[p].bands[b].bufs[0]);
267 av_freep(&planes[p].bands[b].bufs[1]);
268 av_freep(&planes[p].bands[b].bufs[2]);
270 if (planes[p].bands[b].blk_vlc.cust_tab.table)
271 ff_free_vlc(&planes[p].bands[b].blk_vlc.cust_tab);
272 for (t = 0; t < planes[p].bands[b].num_tiles; t++)
273 av_freep(&planes[p].bands[b].tiles[t].mbs);
274 av_freep(&planes[p].bands[b].tiles);
276 av_freep(&planes[p].bands);
277 planes[p].num_bands = 0;
281 av_cold int ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg)
284 uint32_t b_width, b_height, align_fac, width_aligned,
285 height_aligned, buf_size;
288 ivi_free_buffers(planes);
290 if (cfg->pic_width < 1 || cfg->pic_height < 1 ||
291 cfg->luma_bands < 1 || cfg->chroma_bands < 1)
292 return AVERROR_INVALIDDATA;
294 /* fill in the descriptor of the luminance plane */
295 planes[0].width = cfg->pic_width;
296 planes[0].height = cfg->pic_height;
297 planes[0].num_bands = cfg->luma_bands;
299 /* fill in the descriptors of the chrominance planes */
300 planes[1].width = planes[2].width = (cfg->pic_width + 3) >> 2;
301 planes[1].height = planes[2].height = (cfg->pic_height + 3) >> 2;
302 planes[1].num_bands = planes[2].num_bands = cfg->chroma_bands;
304 for (p = 0; p < 3; p++) {
305 planes[p].bands = av_mallocz(planes[p].num_bands * sizeof(IVIBandDesc));
306 if (!planes[p].bands)
307 return AVERROR(ENOMEM);
309 /* select band dimensions: if there is only one band then it
310 * has the full size, if there are several bands each of them
311 * has only half size */
312 b_width = planes[p].num_bands == 1 ? planes[p].width
313 : (planes[p].width + 1) >> 1;
314 b_height = planes[p].num_bands == 1 ? planes[p].height
315 : (planes[p].height + 1) >> 1;
317 /* luma band buffers will be aligned on 16x16 (max macroblock size) */
318 /* chroma band buffers will be aligned on 8x8 (max macroblock size) */
319 align_fac = p ? 8 : 16;
320 width_aligned = FFALIGN(b_width , align_fac);
321 height_aligned = FFALIGN(b_height, align_fac);
322 buf_size = width_aligned * height_aligned * sizeof(int16_t);
324 for (b = 0; b < planes[p].num_bands; b++) {
325 band = &planes[p].bands[b]; /* select appropriate plane/band */
328 band->width = b_width;
329 band->height = b_height;
330 band->pitch = width_aligned;
331 band->aheight = height_aligned;
332 band->bufs[0] = av_mallocz(buf_size);
333 band->bufs[1] = av_mallocz(buf_size);
334 if (!band->bufs[0] || !band->bufs[1])
335 return AVERROR(ENOMEM);
337 /* allocate the 3rd band buffer for scalability mode */
338 if (cfg->luma_bands > 1) {
339 band->bufs[2] = av_mallocz(buf_size);
341 return AVERROR(ENOMEM);
343 /* reset custom vlc */
344 planes[p].bands[0].blk_vlc.cust_desc.num_rows = 0;
351 static int ivi_init_tiles(IVIBandDesc *band, IVITile *ref_tile,
352 int p, int b, int t_height, int t_width)
355 IVITile *tile = band->tiles;
357 for (y = 0; y < band->height; y += t_height) {
358 for (x = 0; x < band->width; x += t_width) {
361 tile->mb_size = band->mb_size;
362 tile->width = FFMIN(band->width - x, t_width);
363 tile->height = FFMIN(band->height - y, t_height);
364 tile->is_empty = tile->data_size = 0;
365 /* calculate number of macroblocks */
366 tile->num_MBs = IVI_MBs_PER_TILE(tile->width, tile->height,
369 av_freep(&tile->mbs);
370 tile->mbs = av_malloc(tile->num_MBs * sizeof(IVIMbInfo));
372 return AVERROR(ENOMEM);
376 if (tile->num_MBs != ref_tile->num_MBs)
377 return AVERROR_INVALIDDATA;
378 tile->ref_mbs = ref_tile->mbs;
388 av_cold int ff_ivi_init_tiles(IVIPlaneDesc *planes,
389 int tile_width, int tile_height)
391 int p, b, x_tiles, y_tiles, t_width, t_height, ret;
394 for (p = 0; p < 3; p++) {
395 t_width = !p ? tile_width : (tile_width + 3) >> 2;
396 t_height = !p ? tile_height : (tile_height + 3) >> 2;
398 if (!p && planes[0].num_bands == 4) {
403 for (b = 0; b < planes[p].num_bands; b++) {
404 band = &planes[p].bands[b];
405 x_tiles = IVI_NUM_TILES(band->width, t_width);
406 y_tiles = IVI_NUM_TILES(band->height, t_height);
407 band->num_tiles = x_tiles * y_tiles;
409 av_freep(&band->tiles);
410 band->tiles = av_mallocz(band->num_tiles * sizeof(IVITile));
412 return AVERROR(ENOMEM);
414 /* use the first luma band as reference for motion vectors
416 ret = ivi_init_tiles(band, planes[0].bands[0].tiles,
417 p, b, t_height, t_width);
427 * Decode size of the tile data.
428 * The size is stored as a variable-length field having the following format:
429 * if (tile_data_size < 255) than this field is only one byte long
430 * if (tile_data_size >= 255) than this field four is byte long: 0xFF X1 X2 X3
431 * where X1-X3 is size of the tile data
433 * @param[in,out] gb the GetBit context
434 * @return size of the tile data in bytes
436 static int ivi_dec_tile_data_size(GetBitContext *gb)
442 len = get_bits(gb, 8);
444 len = get_bits_long(gb, 24);
447 /* align the bitstream reader on the byte boundary */
453 static int ivi_dc_transform(IVIBandDesc *band, int *prev_dc, int buf_offs,
456 int buf_size = band->pitch * band->aheight - buf_offs;
457 int min_size = (blk_size - 1) * band->pitch + blk_size;
459 if (!band->dc_transform)
463 if (min_size > buf_size)
464 return AVERROR_INVALIDDATA;
466 band->dc_transform(prev_dc, band->buf + buf_offs,
467 band->pitch, blk_size);
472 static int ivi_decode_coded_blocks(GetBitContext *gb, IVIBandDesc *band,
473 ivi_mc_func mc, int mv_x, int mv_y,
474 int *prev_dc, int is_intra, int mc_type,
475 uint32_t quant, int offs,
476 AVCodecContext *avctx)
478 const uint16_t *base_tab = is_intra ? band->intra_base : band->inter_base;
479 RVMapDesc *rvmap = band->rv_map;
480 uint8_t col_flags[8];
482 uint32_t sym = 0, lo, hi, q;
484 int blk_size = band->blk_size;
485 int num_coeffs = blk_size * blk_size;
486 int col_mask = blk_size - 1;
488 int min_size = band->pitch * (band->transform_size - 1) +
489 band->transform_size;
490 int buf_size = band->pitch * band->aheight - offs;
492 if (min_size > buf_size)
493 return AVERROR_INVALIDDATA;
496 av_log(avctx, AV_LOG_ERROR, "Scan pattern is not set.\n");
497 return AVERROR_INVALIDDATA;
500 /* zero transform vector */
501 memset(trvec, 0, num_coeffs * sizeof(trvec[0]));
502 /* zero column flags */
503 memset(col_flags, 0, sizeof(col_flags));
504 while (scan_pos <= num_coeffs) {
505 sym = get_vlc2(gb, band->blk_vlc.tab->table,
507 if (sym == rvmap->eob_sym)
508 break; /* End of block */
510 /* Escape - run/val explicitly coded using 3 vlc codes */
511 if (sym == rvmap->esc_sym) {
512 run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1;
513 lo = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
514 hi = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
515 /* merge them and convert into signed val */
516 val = IVI_TOSIGNED((hi << 6) | lo);
519 av_log(avctx, AV_LOG_ERROR, "Invalid sym encountered: %"PRIu32".\n", sym);
520 return AVERROR_INVALIDDATA;
522 run = rvmap->runtab[sym];
523 val = rvmap->valtab[sym];
526 /* de-zigzag and dequantize */
528 if (scan_pos >= num_coeffs || scan_pos < 0)
530 pos = band->scan[scan_pos];
533 av_dlog(avctx, "Val = 0 encountered!\n");
535 q = (base_tab[pos] * quant) >> 9;
537 val = val * q + FFSIGN(val) * (((q ^ 1) - 1) >> 1);
539 /* track columns containing non-zero coeffs */
540 col_flags[pos & col_mask] |= !!val;
543 if (scan_pos < 0 || scan_pos >= num_coeffs && sym != rvmap->eob_sym)
544 return AVERROR_INVALIDDATA; /* corrupt block data */
546 /* undoing DC coeff prediction for intra-blocks */
547 if (is_intra && band->is_2d_trans) {
548 *prev_dc += trvec[0];
550 col_flags[0] |= !!*prev_dc;
553 /* apply inverse transform */
554 band->inv_transform(trvec, band->buf + offs,
555 band->pitch, col_flags);
557 /* apply motion compensation */
559 return ivi_mc(band, mc, offs, mv_x, mv_y, mc_type);
565 * extract huffman-coded transform coefficients from the bitstream,
566 * dequantize them, apply inverse transform and motion compensation
567 * in order to reconstruct the picture.
569 * @param[in,out] gb the GetBit context
570 * @param[in] band pointer to the band descriptor
571 * @param[in] tile pointer to the tile descriptor
572 * @return result code: 0 - OK, -1 = error (corrupted blocks data)
574 static int ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band,
575 IVITile *tile, AVCodecContext *avctx)
577 int mbn, blk, num_blocks, blk_size, ret, is_intra, mc_type = 0;
578 int mv_x = 0, mv_y = 0;
580 uint32_t cbp, quant, buf_offs;
582 ivi_mc_func mc_with_delta_func, mc_no_delta_func;
583 const uint8_t *scale_tab;
585 /* init intra prediction for the DC coefficient */
587 blk_size = band->blk_size;
588 /* number of blocks per mb */
589 num_blocks = (band->mb_size != blk_size) ? 4 : 1;
591 mc_with_delta_func = ff_ivi_mc_8x8_delta;
592 mc_no_delta_func = ff_ivi_mc_8x8_no_delta;
594 mc_with_delta_func = ff_ivi_mc_4x4_delta;
595 mc_no_delta_func = ff_ivi_mc_4x4_no_delta;
598 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
599 is_intra = !mb->type;
601 buf_offs = mb->buf_offs;
603 quant = band->glob_quant + mb->q_delta;
604 if (avctx->codec_id == AV_CODEC_ID_INDEO4)
605 quant = av_clip(quant, 0, 31);
607 quant = av_clip(quant, 0, 23);
609 scale_tab = is_intra ? band->intra_scale : band->inter_scale;
611 quant = scale_tab[quant];
616 if (band->is_halfpel) {
617 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
619 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
622 int dmv_x, dmv_y, cx, cy;
624 dmv_x = mb->mv_x >> band->is_halfpel;
625 dmv_y = mb->mv_y >> band->is_halfpel;
626 cx = mb->mv_x & band->is_halfpel;
627 cy = mb->mv_y & band->is_halfpel;
629 if (mb->xpos + dmv_x < 0 ||
630 mb->xpos + dmv_x + band->mb_size + cx > band->pitch ||
631 mb->ypos + dmv_y < 0 ||
632 mb->ypos + dmv_y + band->mb_size + cy > band->aheight) {
633 return AVERROR_INVALIDDATA;
638 for (blk = 0; blk < num_blocks; blk++) {
639 /* adjust block position in the buffer according to its number */
641 buf_offs += blk_size;
642 } else if (blk == 2) {
643 buf_offs -= blk_size;
644 buf_offs += blk_size * band->pitch;
647 if (cbp & 1) { /* block coded ? */
648 ret = ivi_decode_coded_blocks(gb, band, mc_with_delta_func,
649 mv_x, mv_y, &prev_dc, is_intra,
650 mc_type, quant, buf_offs, avctx);
654 /* block not coded */
655 /* for intra blocks apply the dc slant transform */
656 /* for inter - perform the motion compensation without delta */
658 ret = ivi_dc_transform(band, &prev_dc, buf_offs, blk_size);
662 ret = ivi_mc(band, mc_no_delta_func, buf_offs,
663 mv_x, mv_y, mc_type);
679 * Handle empty tiles by performing data copying and motion
680 * compensation respectively.
682 * @param[in] avctx ptr to the AVCodecContext
683 * @param[in] band pointer to the band descriptor
684 * @param[in] tile pointer to the tile descriptor
685 * @param[in] mv_scale scaling factor for motion vectors
687 static int ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
688 IVITile *tile, int32_t mv_scale)
690 int x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
691 int offs, mb_offset, row_offset, ret;
692 IVIMbInfo *mb, *ref_mb;
695 ivi_mc_func mc_no_delta_func;
697 if (tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size)) {
698 av_log(avctx, AV_LOG_ERROR, "Allocated tile size %d mismatches "
699 "parameters %d in ivi_process_empty_tile()\n",
700 tile->num_MBs, IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size));
701 return AVERROR_INVALIDDATA;
704 offs = tile->ypos * band->pitch + tile->xpos;
706 ref_mb = tile->ref_mbs;
707 row_offset = band->mb_size * band->pitch;
708 need_mc = 0; /* reset the mc tracking flag */
710 for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
713 for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
716 mb->buf_offs = mb_offset;
718 mb->type = 1; /* set the macroblocks type = INTER */
719 mb->cbp = 0; /* all blocks are empty */
721 if (!band->qdelta_present && !band->plane && !band->band_num) {
722 mb->q_delta = band->glob_quant;
727 if (band->inherit_qdelta && ref_mb)
728 mb->q_delta = ref_mb->q_delta;
730 if (band->inherit_mv && ref_mb) {
731 /* motion vector inheritance */
733 mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
734 mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
736 mb->mv_x = ref_mb->mv_x;
737 mb->mv_y = ref_mb->mv_y;
739 need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
745 mb_offset += band->mb_size;
750 if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */
751 num_blocks = (band->mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */
752 mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
753 : ff_ivi_mc_4x4_no_delta;
755 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
758 if (!band->is_halfpel) {
759 mc_type = 0; /* we have only fullpel vectors */
761 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
763 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
766 for (blk = 0; blk < num_blocks; blk++) {
767 /* adjust block position in the buffer according with its number */
768 offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
769 ret = ivi_mc(band, mc_no_delta_func, offs,
770 mv_x, mv_y, mc_type);
776 /* copy data from the reference tile into the current one */
777 src = band->ref_buf + tile->ypos * band->pitch + tile->xpos;
778 dst = band->buf + tile->ypos * band->pitch + tile->xpos;
779 for (y = 0; y < tile->height; y++) {
780 memcpy(dst, src, tile->width*sizeof(band->buf[0]));
791 static uint16_t ivi_calc_band_checksum(IVIBandDesc *band)
794 int16_t *src, checksum;
799 for (y = 0; y < band->height; src += band->pitch, y++)
800 for (x = 0; x < band->width; x++)
808 * Convert and output the current plane.
809 * This conversion is done by adding back the bias value of 128
810 * (subtracted in the encoder) and clipping the result.
812 * @param[in] plane pointer to the descriptor of the plane being processed
813 * @param[out] dst pointer to the buffer receiving converted pixels
814 * @param[in] dst_pitch pitch for moving to the next y line
816 static void ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch)
819 const int16_t *src = plane->bands[0].buf;
820 uint32_t pitch = plane->bands[0].pitch;
825 for (y = 0; y < plane->height; y++) {
826 for (x = 0; x < plane->width; x++)
827 dst[x] = av_clip_uint8(src[x] + 128);
834 * Decode an Indeo 4 or 5 band.
836 * @param[in,out] ctx ptr to the decoder context
837 * @param[in,out] band ptr to the band descriptor
838 * @param[in] avctx ptr to the AVCodecContext
839 * @return result code: 0 = OK, -1 = error
841 static int decode_band(IVI45DecContext *ctx,
842 IVIBandDesc *band, AVCodecContext *avctx)
844 int result, i, t, idx1, idx2, pos;
847 band->buf = band->bufs[ctx->dst_buf];
849 av_log(avctx, AV_LOG_ERROR, "Band buffer points to no data!\n");
850 return AVERROR_INVALIDDATA;
852 band->ref_buf = band->bufs[ctx->ref_buf];
853 band->data_ptr = ctx->frame_data + (get_bits_count(&ctx->gb) >> 3);
855 result = ctx->decode_band_hdr(ctx, band, avctx);
857 av_log(avctx, AV_LOG_ERROR, "Error while decoding band header: %d\n",
862 if (band->is_empty) {
863 av_log(avctx, AV_LOG_ERROR, "Empty band encountered!\n");
864 return AVERROR_INVALIDDATA;
867 band->rv_map = &ctx->rvmap_tabs[band->rvmap_sel];
869 /* apply corrections to the selected rvmap table if present */
870 for (i = 0; i < band->num_corr; i++) {
871 idx1 = band->corr[i * 2];
872 idx2 = band->corr[i * 2 + 1];
873 FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
874 FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
877 pos = get_bits_count(&ctx->gb);
879 for (t = 0; t < band->num_tiles; t++) {
880 tile = &band->tiles[t];
882 if (tile->mb_size != band->mb_size) {
883 av_log(avctx, AV_LOG_ERROR, "MB sizes mismatch: %d vs. %d\n",
884 band->mb_size, tile->mb_size);
885 return AVERROR_INVALIDDATA;
887 tile->is_empty = get_bits1(&ctx->gb);
888 if (tile->is_empty) {
889 result = ivi_process_empty_tile(avctx, band, tile,
890 (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3));
893 av_dlog(avctx, "Empty tile encountered!\n");
895 tile->data_size = ivi_dec_tile_data_size(&ctx->gb);
896 if (!tile->data_size) {
897 av_log(avctx, AV_LOG_ERROR, "Tile data size is zero!\n");
898 return AVERROR_INVALIDDATA;
901 result = ctx->decode_mb_info(ctx, band, tile, avctx);
905 result = ivi_decode_blocks(&ctx->gb, band, tile, avctx);
907 av_log(avctx, AV_LOG_ERROR,
908 "Corrupted tile data encountered!\n");
912 if (((get_bits_count(&ctx->gb) - pos) >> 3) != tile->data_size) {
913 av_log(avctx, AV_LOG_ERROR,
914 "Tile data_size mismatch!\n");
915 result = AVERROR_INVALIDDATA;
919 pos += tile->data_size << 3; // skip to next tile
923 /* restore the selected rvmap table by applying its corrections in
925 for (i = band->num_corr-1; i >= 0; i--) {
926 idx1 = band->corr[i*2];
927 idx2 = band->corr[i*2+1];
928 FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
929 FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
933 if (band->checksum_present) {
934 uint16_t chksum = ivi_calc_band_checksum(band);
935 if (chksum != band->checksum) {
936 av_log(avctx, AV_LOG_ERROR,
937 "Band checksum mismatch! Plane %d, band %d, "
938 "received: %"PRIx32", calculated: %"PRIx16"\n",
939 band->plane, band->band_num, band->checksum, chksum);
944 align_get_bits(&ctx->gb);
949 int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
952 IVI45DecContext *ctx = avctx->priv_data;
953 const uint8_t *buf = avpkt->data;
954 AVFrame *frame = data;
955 int buf_size = avpkt->size;
958 init_get_bits(&ctx->gb, buf, buf_size * 8);
959 ctx->frame_data = buf;
960 ctx->frame_size = buf_size;
962 result = ctx->decode_pic_hdr(ctx, avctx);
964 av_log(avctx, AV_LOG_ERROR,
965 "Error while decoding picture header: %d\n", result);
968 if (ctx->gop_invalid)
969 return AVERROR_INVALIDDATA;
971 if (ctx->gop_flags & IVI5_IS_PROTECTED) {
972 avpriv_report_missing_feature(avctx, "Password-protected clip!\n");
973 return AVERROR_PATCHWELCOME;
976 if (!ctx->planes[0].bands) {
977 av_log(avctx, AV_LOG_ERROR, "Color planes not initialized yet\n");
978 return AVERROR_INVALIDDATA;
981 ctx->switch_buffers(ctx);
985 if (ctx->is_nonnull_frame(ctx)) {
986 for (p = 0; p < 3; p++) {
987 for (b = 0; b < ctx->planes[p].num_bands; b++) {
988 result = decode_band(ctx, &ctx->planes[p].bands[b], avctx);
990 av_log(avctx, AV_LOG_ERROR,
991 "Error while decoding band: %d, plane: %d\n", b, p);
997 if (ctx->is_scalable)
998 return AVERROR_INVALIDDATA;
1000 for (p = 0; p < 3; p++) {
1001 if (!ctx->planes[p].bands[0].buf)
1002 return AVERROR_INVALIDDATA;
1006 //STOP_TIMER("decode_planes"); }
1008 /* If the bidirectional mode is enabled, next I and the following P
1009 * frame will be sent together. Unfortunately the approach below seems
1010 * to be the only way to handle the B-frames mode.
1011 * That's exactly the same Intel decoders do.
1013 if (avctx->codec_id == AV_CODEC_ID_INDEO4 &&
1014 ctx->frame_type == 0/*FRAMETYPE_INTRA*/) {
1015 while (get_bits(&ctx->gb, 8)); // skip version string
1016 skip_bits_long(&ctx->gb, 64); // skip padding, TODO: implement correct 8-bytes alignment
1017 if (get_bits_left(&ctx->gb) > 18 && show_bits(&ctx->gb, 18) == 0x3FFF8)
1018 av_log(avctx, AV_LOG_ERROR, "Buffer contains IP frames!\n");
1021 result = ff_set_dimensions(avctx, ctx->planes[0].width, ctx->planes[0].height);
1025 if ((result = ff_get_buffer(avctx, frame, 0)) < 0) {
1026 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1030 if (ctx->is_scalable) {
1031 if (avctx->codec_id == AV_CODEC_ID_INDEO4)
1032 ff_ivi_recompose_haar(&ctx->planes[0], frame->data[0], frame->linesize[0]);
1034 ff_ivi_recompose53 (&ctx->planes[0], frame->data[0], frame->linesize[0]);
1036 ivi_output_plane(&ctx->planes[0], frame->data[0], frame->linesize[0]);
1039 ivi_output_plane(&ctx->planes[2], frame->data[1], frame->linesize[1]);
1040 ivi_output_plane(&ctx->planes[1], frame->data[2], frame->linesize[2]);
1048 * Close Indeo5 decoder and clean up its context.
1050 av_cold int ff_ivi_decode_close(AVCodecContext *avctx)
1052 IVI45DecContext *ctx = avctx->priv_data;
1054 ivi_free_buffers(&ctx->planes[0]);
1056 if (ctx->mb_vlc.cust_tab.table)
1057 ff_free_vlc(&ctx->mb_vlc.cust_tab);
1059 #if IVI4_STREAM_ANALYSER
1060 if (avctx->codec_id == AV_CODEC_ID_INDEO4) {
1061 if (ctx->is_scalable)
1062 av_log(avctx, AV_LOG_ERROR, "This video uses scalability mode!\n");
1063 if (ctx->uses_tiling)
1064 av_log(avctx, AV_LOG_ERROR, "This video uses local decoding!\n");
1065 if (ctx->has_b_frames)
1066 av_log(avctx, AV_LOG_ERROR, "This video contains B-frames!\n");
1067 if (ctx->has_transp)
1068 av_log(avctx, AV_LOG_ERROR, "Transparency mode is enabled!\n");
1070 av_log(avctx, AV_LOG_ERROR, "This video uses Haar transform!\n");
1071 if (ctx->uses_fullpel)
1072 av_log(avctx, AV_LOG_ERROR, "This video uses fullpel motion vectors!\n");
1081 * Scan patterns shared between indeo4 and indeo5
1083 const uint8_t ff_ivi_vertical_scan_8x8[64] = {
1084 0, 8, 16, 24, 32, 40, 48, 56,
1085 1, 9, 17, 25, 33, 41, 49, 57,
1086 2, 10, 18, 26, 34, 42, 50, 58,
1087 3, 11, 19, 27, 35, 43, 51, 59,
1088 4, 12, 20, 28, 36, 44, 52, 60,
1089 5, 13, 21, 29, 37, 45, 53, 61,
1090 6, 14, 22, 30, 38, 46, 54, 62,
1091 7, 15, 23, 31, 39, 47, 55, 63
1094 const uint8_t ff_ivi_horizontal_scan_8x8[64] = {
1095 0, 1, 2, 3, 4, 5, 6, 7,
1096 8, 9, 10, 11, 12, 13, 14, 15,
1097 16, 17, 18, 19, 20, 21, 22, 23,
1098 24, 25, 26, 27, 28, 29, 30, 31,
1099 32, 33, 34, 35, 36, 37, 38, 39,
1100 40, 41, 42, 43, 44, 45, 46, 47,
1101 48, 49, 50, 51, 52, 53, 54, 55,
1102 56, 57, 58, 59, 60, 61, 62, 63
1105 const uint8_t ff_ivi_direct_scan_4x4[16] = {
1106 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15
1111 * Run-value (RLE) tables.
1113 const RVMapDesc ff_ivi_rvmap_tabs[9] = {
1118 {1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3,
1119 1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5,
1120 1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1,
1121 8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9,
1122 9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3,
1123 2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12,
1124 8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13,
1125 2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8,
1126 1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8,
1127 6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21,
1128 22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8,
1129 4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6,
1130 1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28,
1131 1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41,
1132 6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1,
1133 30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
1136 { 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1,
1137 6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1,
1138 10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13,
1139 1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1,
1140 -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4,
1141 7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1,
1142 2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1,
1143 9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3,
1144 28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4,
1145 3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1,
1146 -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5,
1147 5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4,
1148 -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1,
1149 37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1,
1150 5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40,
1151 -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1}
1157 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7,
1158 7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16,
1159 14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
1160 25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27,
1161 33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34,
1162 37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38,
1163 40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44,
1164 57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1,
1165 52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64,
1166 60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13,
1167 12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4,
1168 1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25,
1169 21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33,
1170 29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3,
1171 28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41,
1172 2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5},
1175 {0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1,
1176 -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1,
1177 -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1,
1178 1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1,
1179 1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1,
1180 1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1,
1181 -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1,
1182 -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4,
1183 1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1,
1184 1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2,
1185 2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3,
1186 6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2,
1187 2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2,
1188 2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4,
1189 -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2,
1190 -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4}
1196 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5,
1197 2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2,
1198 2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13,
1199 3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7,
1200 1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3,
1201 9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22,
1202 23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32,
1203 28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31,
1204 49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3,
1205 3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57,
1206 1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2,
1207 50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1,
1208 45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17,
1209 17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55,
1210 7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4,
1211 8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62},
1214 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1,
1215 2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3,
1216 -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1,
1217 3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2,
1218 7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4,
1219 2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1,
1220 1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1,
1221 1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1,
1222 1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5,
1223 -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1,
1224 -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7,
1225 -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13,
1226 1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2,
1227 -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1,
1228 -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6,
1229 -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1}
1235 {0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7,
1236 7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3,
1237 3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1,
1238 5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20,
1239 21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26,
1240 9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32,
1241 2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41,
1242 35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40,
1243 12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16,
1244 43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48,
1245 57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51,
1246 8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59,
1247 59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60,
1248 60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4,
1249 25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1,
1250 20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16},
1253 { 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1,
1254 -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2,
1255 -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4,
1256 2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1,
1257 1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1,
1258 2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1,
1259 4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1,
1260 -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1,
1261 2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2,
1262 1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1,
1263 -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1,
1264 -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1,
1265 -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1,
1266 1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5,
1267 -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12,
1268 -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3}
1274 {0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5,
1275 2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1,
1276 2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1,
1277 9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4,
1278 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1,
1279 2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1280 2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12,
1281 3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1,
1282 4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1,
1283 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5,
1284 1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1,
1285 5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1,
1286 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1,
1287 3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1,
1288 1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8,
1289 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1},
1292 { 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1,
1293 2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9,
1294 3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13,
1295 1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2,
1296 18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23,
1297 -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29,
1298 6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1,
1299 4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39,
1300 3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47,
1301 -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3,
1302 -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63,
1303 -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67,
1304 -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70,
1305 6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79,
1306 75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2,
1307 83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89}
1313 {1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1,
1314 1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1,
1315 1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1,
1316 12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2,
1317 6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3,
1318 8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2,
1319 1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4,
1320 4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1,
1321 1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2,
1322 2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13,
1323 1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31,
1324 3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2,
1325 1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8,
1326 36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1,
1327 1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4,
1328 40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7},
1331 { 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4,
1332 -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6,
1333 -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8,
1334 1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5,
1335 2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4,
1336 2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7,
1337 15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4,
1338 -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18,
1339 -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9,
1340 -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2,
1341 22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1,
1342 7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11,
1343 26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4,
1344 -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29,
1345 30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7,
1346 -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5}
1352 {1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2,
1353 4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1,
1354 3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9,
1355 4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2,
1356 1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1,
1357 6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7,
1358 15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1,
1359 2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1,
1360 17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1,
1361 6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1,
1362 4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2,
1363 1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1,
1364 1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1,
1365 12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6,
1366 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25,
1367 14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2},
1370 {-20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2,
1371 1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8,
1372 2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1,
1373 2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5,
1374 -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18,
1375 2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2,
1376 -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25,
1377 -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29,
1378 1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33,
1379 -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37,
1380 -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11,
1381 -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44,
1382 45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48,
1383 -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4,
1384 6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1,
1385 2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14}
1391 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6,
1392 6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1,
1393 1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5,
1394 14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7,
1395 8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20,
1396 19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23,
1397 24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7,
1398 26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2,
1399 28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30,
1400 32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14,
1401 6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9,
1402 37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5,
1403 3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6,
1404 1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1,
1405 8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45,
1406 12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49},
1409 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1,
1410 -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5,
1411 -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2,
1412 1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2,
1413 2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1,
1414 -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1,
1415 -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3,
1416 1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7,
1417 -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1,
1418 -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2,
1419 -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3,
1420 -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5,
1421 -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5,
1422 20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21,
1423 5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1,
1424 3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1}
1430 {1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2,
1431 4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1,
1432 7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9,
1433 2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4,
1434 4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8,
1435 2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4,
1436 1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21,
1437 25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1,
1438 1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2,
1439 4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30,
1440 6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1,
1441 37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41,
1442 13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42,
1443 3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15,
1444 44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7,
1445 50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1},
1448 { 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2,
1449 1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7,
1450 1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1,
1451 5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3,
1452 -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2,
1453 7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4,
1454 15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1,
1455 1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17,
1456 -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9,
1457 -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1,
1458 4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20,
1459 1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1,
1460 -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1,
1461 8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2,
1462 1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5,
1463 1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26}