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
29 #define BITSTREAM_READER_LE
32 #include "ivi_common.h"
33 #include "libavutil/common.h"
36 extern const IVIHuffDesc ff_ivi_mb_huff_desc[8]; ///< static macroblock huffman tables
37 extern const IVIHuffDesc ff_ivi_blk_huff_desc[8]; ///< static block huffman tables
39 VLC ff_ivi_mb_vlc_tabs [8];
40 VLC ff_ivi_blk_vlc_tabs[8];
43 * Reverse "nbits" bits of the value "val" and return the result
44 * in the least significant bits.
46 static uint16_t inv_bits(uint16_t val, int nbits)
51 res = av_reverse[val] >> (8-nbits);
53 res = ((av_reverse[val & 0xFF] << 8) + (av_reverse[val >> 8])) >> (16-nbits);
58 int ff_ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag)
60 int pos, i, j, codes_per_row, prefix, not_last_row;
61 uint16_t codewords[256]; /* FIXME: move this temporal storage out? */
64 pos = 0; /* current position = 0 */
66 for (i = 0; i < cb->num_rows; i++) {
67 codes_per_row = 1 << cb->xbits[i];
68 not_last_row = (i != cb->num_rows - 1);
69 prefix = ((1 << i) - 1) << (cb->xbits[i] + not_last_row);
71 for (j = 0; j < codes_per_row; j++) {
72 if (pos >= 256) /* Some Indeo5 codebooks can have more than 256 */
73 break; /* elements, but only 256 codes are allowed! */
75 bits[pos] = i + cb->xbits[i] + not_last_row;
76 if (bits[pos] > IVI_VLC_BITS)
77 return -1; /* invalid descriptor */
79 codewords[pos] = inv_bits((prefix | j), bits[pos]);
87 /* number of codewords = pos */
88 return init_vlc(vlc, IVI_VLC_BITS, pos, bits, 1, 1, codewords, 2, 2,
89 (flag ? INIT_VLC_USE_NEW_STATIC : 0) | INIT_VLC_LE);
92 void ff_ivi_init_static_vlc(void)
95 static VLC_TYPE table_data[8192 * 16][2];
96 static int initialized_vlcs = 0;
100 for (i = 0; i < 8; i++) {
101 ff_ivi_mb_vlc_tabs[i].table = table_data + i * 2 * 8192;
102 ff_ivi_mb_vlc_tabs[i].table_allocated = 8192;
103 ff_ivi_create_huff_from_desc(&ff_ivi_mb_huff_desc[i], &ff_ivi_mb_vlc_tabs[i], 1);
104 ff_ivi_blk_vlc_tabs[i].table = table_data + (i * 2 + 1) * 8192;
105 ff_ivi_blk_vlc_tabs[i].table_allocated = 8192;
106 ff_ivi_create_huff_from_desc(&ff_ivi_blk_huff_desc[i], &ff_ivi_blk_vlc_tabs[i], 1);
108 initialized_vlcs = 1;
111 int ff_ivi_dec_huff_desc(GetBitContext *gb, int desc_coded, int which_tab,
112 IVIHuffTab *huff_tab, AVCodecContext *avctx)
115 IVIHuffDesc new_huff;
118 /* select default table */
119 huff_tab->tab = (which_tab) ? &ff_ivi_blk_vlc_tabs[7]
120 : &ff_ivi_mb_vlc_tabs [7];
122 huff_tab->tab_sel = get_bits(gb, 3);
123 if (huff_tab->tab_sel == 7) {
124 /* custom huffman table (explicitly encoded) */
125 new_huff.num_rows = get_bits(gb, 4);
126 if (!new_huff.num_rows) {
127 av_log(avctx, AV_LOG_ERROR, "Empty custom Huffman table!\n");
128 return AVERROR_INVALIDDATA;
131 for (i = 0; i < new_huff.num_rows; i++)
132 new_huff.xbits[i] = get_bits(gb, 4);
134 /* Have we got the same custom table? Rebuild if not. */
135 if (ff_ivi_huff_desc_cmp(&new_huff, &huff_tab->cust_desc)) {
136 ff_ivi_huff_desc_copy(&huff_tab->cust_desc, &new_huff);
138 if (huff_tab->cust_tab.table)
139 ff_free_vlc(&huff_tab->cust_tab);
140 result = ff_ivi_create_huff_from_desc(&huff_tab->cust_desc,
141 &huff_tab->cust_tab, 0);
143 huff_tab->cust_desc.num_rows = 0; // reset faulty description
144 av_log(avctx, AV_LOG_ERROR,
145 "Error while initializing custom vlc table!\n");
149 huff_tab->tab = &huff_tab->cust_tab;
151 /* select one of predefined tables */
152 huff_tab->tab = (which_tab) ? &ff_ivi_blk_vlc_tabs[huff_tab->tab_sel]
153 : &ff_ivi_mb_vlc_tabs [huff_tab->tab_sel];
160 int ff_ivi_huff_desc_cmp(const IVIHuffDesc *desc1, const IVIHuffDesc *desc2)
162 return desc1->num_rows != desc2->num_rows
163 || memcmp(desc1->xbits, desc2->xbits, desc1->num_rows);
166 void ff_ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src)
168 dst->num_rows = src->num_rows;
169 memcpy(dst->xbits, src->xbits, src->num_rows);
172 av_cold int ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg)
175 uint32_t b_width, b_height, align_fac, width_aligned, height_aligned, buf_size;
178 ff_ivi_free_buffers(planes);
180 /* fill in the descriptor of the luminance plane */
181 planes[0].width = cfg->pic_width;
182 planes[0].height = cfg->pic_height;
183 planes[0].num_bands = cfg->luma_bands;
185 /* fill in the descriptors of the chrominance planes */
186 planes[1].width = planes[2].width = (cfg->pic_width + 3) >> 2;
187 planes[1].height = planes[2].height = (cfg->pic_height + 3) >> 2;
188 planes[1].num_bands = planes[2].num_bands = cfg->chroma_bands;
190 for (p = 0; p < 3; p++) {
191 planes[p].bands = av_mallocz(planes[p].num_bands * sizeof(IVIBandDesc));
192 if (!planes[p].bands)
193 return AVERROR(ENOMEM);
195 /* select band dimensions: if there is only one band then it
196 * has the full size, if there are several bands each of them
197 * has only half size */
198 b_width = planes[p].num_bands == 1 ? planes[p].width : (planes[p].width + 1) >> 1;
199 b_height = planes[p].num_bands == 1 ? planes[p].height : (planes[p].height + 1) >> 1;
201 /* luma band buffers will be aligned on 16x16 (max macroblock size) */
202 /* chroma band buffers will be aligned on 8x8 (max macroblock size) */
203 align_fac = p ? 8 : 16;
204 width_aligned = FFALIGN(b_width , align_fac);
205 height_aligned = FFALIGN(b_height, align_fac);
206 buf_size = width_aligned * height_aligned * sizeof(int16_t);
208 for (b = 0; b < planes[p].num_bands; b++) {
209 band = &planes[p].bands[b]; /* select appropriate plane/band */
212 band->width = b_width;
213 band->height = b_height;
214 band->pitch = width_aligned;
215 band->bufs[0] = av_malloc(buf_size);
216 band->bufs[1] = av_malloc(buf_size);
217 if (!band->bufs[0] || !band->bufs[1])
218 return AVERROR(ENOMEM);
220 /* allocate the 3rd band buffer for scalability mode */
221 if (cfg->luma_bands > 1) {
222 band->bufs[2] = av_malloc(buf_size);
224 return AVERROR(ENOMEM);
227 planes[p].bands[0].blk_vlc.cust_desc.num_rows = 0; /* reset custom vlc */
234 av_cold void ff_ivi_free_buffers(IVIPlaneDesc *planes)
238 for (p = 0; p < 3; p++) {
239 for (b = 0; b < planes[p].num_bands; b++) {
240 av_freep(&planes[p].bands[b].bufs[0]);
241 av_freep(&planes[p].bands[b].bufs[1]);
242 av_freep(&planes[p].bands[b].bufs[2]);
244 if (planes[p].bands[b].blk_vlc.cust_tab.table)
245 ff_free_vlc(&planes[p].bands[b].blk_vlc.cust_tab);
246 for (t = 0; t < planes[p].bands[b].num_tiles; t++)
247 av_freep(&planes[p].bands[b].tiles[t].mbs);
248 av_freep(&planes[p].bands[b].tiles);
250 av_freep(&planes[p].bands);
254 av_cold int ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height)
256 int p, b, x, y, x_tiles, y_tiles, t_width, t_height;
258 IVITile *tile, *ref_tile;
260 for (p = 0; p < 3; p++) {
261 t_width = !p ? tile_width : (tile_width + 3) >> 2;
262 t_height = !p ? tile_height : (tile_height + 3) >> 2;
264 if (!p && planes[0].num_bands == 4) {
269 for (b = 0; b < planes[p].num_bands; b++) {
270 band = &planes[p].bands[b];
271 x_tiles = IVI_NUM_TILES(band->width, t_width);
272 y_tiles = IVI_NUM_TILES(band->height, t_height);
273 band->num_tiles = x_tiles * y_tiles;
275 av_freep(&band->tiles);
276 band->tiles = av_mallocz(band->num_tiles * sizeof(IVITile));
278 return AVERROR(ENOMEM);
282 /* use the first luma band as reference for motion vectors
284 ref_tile = planes[0].bands[0].tiles;
286 for (y = 0; y < band->height; y += t_height) {
287 for (x = 0; x < band->width; x += t_width) {
290 tile->mb_size = band->mb_size;
291 tile->width = FFMIN(band->width - x, t_width);
292 tile->height = FFMIN(band->height - y, t_height);
293 tile->is_empty = tile->data_size = 0;
294 /* calculate number of macroblocks */
295 tile->num_MBs = IVI_MBs_PER_TILE(tile->width, tile->height,
298 av_freep(&tile->mbs);
299 tile->mbs = av_malloc(tile->num_MBs * sizeof(IVIMbInfo));
301 return AVERROR(ENOMEM);
305 tile->ref_mbs = ref_tile->mbs;
319 int ff_ivi_dec_tile_data_size(GetBitContext *gb)
325 len = get_bits(gb, 8);
327 len = get_bits_long(gb, 24);
330 /* align the bitstream reader on the byte boundary */
336 int ff_ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile)
338 int mbn, blk, num_blocks, num_coeffs, blk_size, scan_pos, run, val,
339 pos, is_intra, mc_type = 0, mv_x, mv_y, col_mask;
340 uint8_t col_flags[8];
341 int32_t prev_dc, trvec[64];
342 uint32_t cbp, sym, lo, hi, quant, buf_offs, q;
344 RVMapDesc *rvmap = band->rv_map;
345 void (*mc_with_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
346 void (*mc_no_delta_func) (int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
347 const uint16_t *base_tab;
348 const uint8_t *scale_tab;
350 prev_dc = 0; /* init intra prediction for the DC coefficient */
352 blk_size = band->blk_size;
353 col_mask = blk_size - 1; /* column mask for tracking non-zero coeffs */
354 num_blocks = (band->mb_size != blk_size) ? 4 : 1; /* number of blocks per mb */
355 num_coeffs = blk_size * blk_size;
357 mc_with_delta_func = ff_ivi_mc_8x8_delta;
358 mc_no_delta_func = ff_ivi_mc_8x8_no_delta;
360 mc_with_delta_func = ff_ivi_mc_4x4_delta;
361 mc_no_delta_func = ff_ivi_mc_4x4_no_delta;
364 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
365 is_intra = !mb->type;
367 buf_offs = mb->buf_offs;
369 quant = av_clip(band->glob_quant + mb->q_delta, 0, 23);
371 base_tab = is_intra ? band->intra_base : band->inter_base;
372 scale_tab = is_intra ? band->intra_scale : band->inter_scale;
374 quant = scale_tab[quant];
379 if (band->is_halfpel) {
380 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
382 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
386 for (blk = 0; blk < num_blocks; blk++) {
387 /* adjust block position in the buffer according to its number */
389 buf_offs += blk_size;
390 } else if (blk == 2) {
391 buf_offs -= blk_size;
392 buf_offs += blk_size * band->pitch;
395 if (cbp & 1) { /* block coded ? */
397 memset(trvec, 0, num_coeffs*sizeof(trvec[0])); /* zero transform vector */
398 memset(col_flags, 0, sizeof(col_flags)); /* zero column flags */
400 while (scan_pos <= num_coeffs) {
401 sym = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
402 if (sym == rvmap->eob_sym)
403 break; /* End of block */
405 if (sym == rvmap->esc_sym) { /* Escape - run/val explicitly coded using 3 vlc codes */
406 run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1;
407 lo = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
408 hi = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
409 val = IVI_TOSIGNED((hi << 6) | lo); /* merge them and convert into signed val */
412 av_log(NULL, AV_LOG_ERROR, "Invalid sym encountered: %d.\n", sym);
415 run = rvmap->runtab[sym];
416 val = rvmap->valtab[sym];
419 /* de-zigzag and dequantize */
421 if (scan_pos >= num_coeffs)
423 pos = band->scan[scan_pos];
426 av_dlog(NULL, "Val = 0 encountered!\n");
428 q = (base_tab[pos] * quant) >> 9;
430 val = val * q + FFSIGN(val) * (((q ^ 1) - 1) >> 1);
432 col_flags[pos & col_mask] |= !!val; /* track columns containing non-zero coeffs */
435 if (scan_pos >= num_coeffs && sym != rvmap->eob_sym)
436 return -1; /* corrupt block data */
438 /* undoing DC coeff prediction for intra-blocks */
439 if (is_intra && band->is_2d_trans) {
442 col_flags[0] |= !!prev_dc;
445 /* apply inverse transform */
446 band->inv_transform(trvec, band->buf + buf_offs,
447 band->pitch, col_flags);
449 /* apply motion compensation */
451 mc_with_delta_func(band->buf + buf_offs,
452 band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
453 band->pitch, mc_type);
455 /* block not coded */
456 /* for intra blocks apply the dc slant transform */
457 /* for inter - perform the motion compensation without delta */
458 if (is_intra && band->dc_transform) {
459 band->dc_transform(&prev_dc, band->buf + buf_offs,
460 band->pitch, blk_size);
462 mc_no_delta_func(band->buf + buf_offs,
463 band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
464 band->pitch, mc_type);
476 void ff_ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
477 IVITile *tile, int32_t mv_scale)
479 int x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
480 int offs, mb_offset, row_offset;
481 IVIMbInfo *mb, *ref_mb;
484 void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch,
487 offs = tile->ypos * band->pitch + tile->xpos;
489 ref_mb = tile->ref_mbs;
490 row_offset = band->mb_size * band->pitch;
491 need_mc = 0; /* reset the mc tracking flag */
493 for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
496 for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
499 mb->buf_offs = mb_offset;
501 mb->type = 1; /* set the macroblocks type = INTER */
502 mb->cbp = 0; /* all blocks are empty */
504 if (!band->qdelta_present && !band->plane && !band->band_num) {
505 mb->q_delta = band->glob_quant;
510 if (band->inherit_qdelta && ref_mb)
511 mb->q_delta = ref_mb->q_delta;
513 if (band->inherit_mv) {
514 /* motion vector inheritance */
516 mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
517 mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
519 mb->mv_x = ref_mb->mv_x;
520 mb->mv_y = ref_mb->mv_y;
522 need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
528 mb_offset += band->mb_size;
533 if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */
534 num_blocks = (band->mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */
535 mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
536 : ff_ivi_mc_4x4_no_delta;
538 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
541 if (!band->is_halfpel) {
542 mc_type = 0; /* we have only fullpel vectors */
544 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
546 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
549 for (blk = 0; blk < num_blocks; blk++) {
550 /* adjust block position in the buffer according with its number */
551 offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
552 mc_no_delta_func(band->buf + offs,
553 band->ref_buf + offs + mv_y * band->pitch + mv_x,
554 band->pitch, mc_type);
558 /* copy data from the reference tile into the current one */
559 src = band->ref_buf + tile->ypos * band->pitch + tile->xpos;
560 dst = band->buf + tile->ypos * band->pitch + tile->xpos;
561 for (y = 0; y < tile->height; y++) {
562 memcpy(dst, src, tile->width*sizeof(band->buf[0]));
571 uint16_t ivi_calc_band_checksum (IVIBandDesc *band)
574 int16_t *src, checksum;
579 for (y = 0; y < band->height; src += band->pitch, y++)
580 for (x = 0; x < band->width; x++)
586 int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch)
595 for (y = 0; y < band->height; src += band->pitch, y++) {
596 for (x = 0; x < band->width; x++) {
597 t1 = av_clip(src[x] + 128, 0, 255);
600 av_log(NULL, AV_LOG_ERROR, "Data mismatch: row %d, column %d\n",
601 y / band->blk_size, x / band->blk_size);
612 void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch)
615 const int16_t *src = plane->bands[0].buf;
616 uint32_t pitch = plane->bands[0].pitch;
621 for (y = 0; y < plane->height; y++) {
622 for (x = 0; x < plane->width; x++)
623 dst[x] = av_clip_uint8(src[x] + 128);
630 * Decode an Indeo 4 or 5 band.
632 * @param[in,out] ctx ptr to the decoder context
633 * @param[in,out] band ptr to the band descriptor
634 * @param[in] avctx ptr to the AVCodecContext
635 * @return result code: 0 = OK, -1 = error
637 static int decode_band(IVI45DecContext *ctx, int plane_num,
638 IVIBandDesc *band, AVCodecContext *avctx)
640 int result, i, t, idx1, idx2, pos;
643 band->buf = band->bufs[ctx->dst_buf];
644 band->ref_buf = band->bufs[ctx->ref_buf];
645 band->data_ptr = ctx->frame_data + (get_bits_count(&ctx->gb) >> 3);
647 result = ctx->decode_band_hdr(ctx, band, avctx);
649 av_log(avctx, AV_LOG_ERROR, "Error while decoding band header: %d\n",
654 if (band->is_empty) {
655 av_log(avctx, AV_LOG_ERROR, "Empty band encountered!\n");
656 return AVERROR_INVALIDDATA;
659 band->rv_map = &ctx->rvmap_tabs[band->rvmap_sel];
661 /* apply corrections to the selected rvmap table if present */
662 for (i = 0; i < band->num_corr; i++) {
663 idx1 = band->corr[i * 2];
664 idx2 = band->corr[i * 2 + 1];
665 FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
666 FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
669 pos = get_bits_count(&ctx->gb);
671 for (t = 0; t < band->num_tiles; t++) {
672 tile = &band->tiles[t];
674 if (tile->mb_size != band->mb_size) {
675 av_log(avctx, AV_LOG_ERROR, "MB sizes mismatch: %d vs. %d\n",
676 band->mb_size, tile->mb_size);
677 return AVERROR_INVALIDDATA;
679 tile->is_empty = get_bits1(&ctx->gb);
680 if (tile->is_empty) {
681 ff_ivi_process_empty_tile(avctx, band, tile,
682 (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3));
683 av_dlog(avctx, "Empty tile encountered!\n");
685 tile->data_size = ff_ivi_dec_tile_data_size(&ctx->gb);
686 if (!tile->data_size) {
687 av_log(avctx, AV_LOG_ERROR, "Tile data size is zero!\n");
688 return AVERROR_INVALIDDATA;
691 result = ctx->decode_mb_info(ctx, band, tile, avctx);
695 result = ff_ivi_decode_blocks(&ctx->gb, band, tile);
696 if (result < 0 || ((get_bits_count(&ctx->gb) - pos) >> 3) != tile->data_size) {
697 av_log(avctx, AV_LOG_ERROR, "Corrupted tile data encountered!\n");
701 pos += tile->data_size << 3; // skip to next tile
705 /* restore the selected rvmap table by applying its corrections in reverse order */
706 for (i = band->num_corr-1; i >= 0; i--) {
707 idx1 = band->corr[i*2];
708 idx2 = band->corr[i*2+1];
709 FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
710 FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
714 if (band->checksum_present) {
715 uint16_t chksum = ivi_calc_band_checksum(band);
716 if (chksum != band->checksum) {
717 av_log(avctx, AV_LOG_ERROR,
718 "Band checksum mismatch! Plane %d, band %d, received: %x, calculated: %x\n",
719 band->plane, band->band_num, band->checksum, chksum);
724 align_get_bits(&ctx->gb);
729 int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
732 IVI45DecContext *ctx = avctx->priv_data;
733 const uint8_t *buf = avpkt->data;
734 int buf_size = avpkt->size;
737 init_get_bits(&ctx->gb, buf, buf_size * 8);
738 ctx->frame_data = buf;
739 ctx->frame_size = buf_size;
741 result = ctx->decode_pic_hdr(ctx, avctx);
743 av_log(avctx, AV_LOG_ERROR,
744 "Error while decoding picture header: %d\n", result);
748 if (ctx->gop_flags & IVI5_IS_PROTECTED) {
749 av_log(avctx, AV_LOG_ERROR, "Password-protected clip!\n");
753 ctx->switch_buffers(ctx);
757 if (ctx->is_nonnull_frame(ctx)) {
758 for (p = 0; p < 3; p++) {
759 for (b = 0; b < ctx->planes[p].num_bands; b++) {
760 result = decode_band(ctx, p, &ctx->planes[p].bands[b], avctx);
762 av_log(avctx, AV_LOG_ERROR,
763 "Error while decoding band: %d, plane: %d\n", b, p);
770 //STOP_TIMER("decode_planes"); }
772 /* If the bidirectional mode is enabled, next I and the following P frame will */
773 /* be sent together. Unfortunately the approach below seems to be the only way */
774 /* to handle the B-frames mode. That's exactly the same Intel decoders do. */
775 if (avctx->codec_id == CODEC_ID_INDEO4 && ctx->frame_type == 0/*FRAMETYPE_INTRA*/) {
776 while (get_bits(&ctx->gb, 8)); // skip version string
777 skip_bits_long(&ctx->gb, 64); // skip padding, TODO: implement correct 8-bytes alignment
778 if (get_bits_left(&ctx->gb) > 18 && show_bits(&ctx->gb, 18) == 0x3FFF8)
779 av_log(avctx, AV_LOG_ERROR, "Buffer contains IP frames!\n");
782 if (ctx->frame.data[0])
783 avctx->release_buffer(avctx, &ctx->frame);
785 ctx->frame.reference = 0;
786 if ((result = avctx->get_buffer(avctx, &ctx->frame)) < 0) {
787 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
791 if (ctx->is_scalable) {
792 if (avctx->codec_id == CODEC_ID_INDEO4)
793 ff_ivi_recompose_haar(&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0], 4);
795 ff_ivi_recompose53 (&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0], 4);
797 ff_ivi_output_plane(&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0]);
800 ff_ivi_output_plane(&ctx->planes[2], ctx->frame.data[1], ctx->frame.linesize[1]);
801 ff_ivi_output_plane(&ctx->planes[1], ctx->frame.data[2], ctx->frame.linesize[2]);
803 *data_size = sizeof(AVFrame);
804 *(AVFrame*)data = ctx->frame;
810 * Close Indeo5 decoder and clean up its context.
812 av_cold int ff_ivi_decode_close(AVCodecContext *avctx)
814 IVI45DecContext *ctx = avctx->priv_data;
816 ff_ivi_free_buffers(&ctx->planes[0]);
818 if (ctx->mb_vlc.cust_tab.table)
819 ff_free_vlc(&ctx->mb_vlc.cust_tab);
821 if (ctx->frame.data[0])
822 avctx->release_buffer(avctx, &ctx->frame);
824 #if IVI4_STREAM_ANALYSER
825 if (avctx->codec_id == CODEC_ID_INDEO4) {
826 if (ctx->is_scalable)
827 av_log(avctx, AV_LOG_ERROR, "This video uses scalability mode!\n");
828 if (ctx->uses_tiling)
829 av_log(avctx, AV_LOG_ERROR, "This video uses local decoding!\n");
830 if (ctx->has_b_frames)
831 av_log(avctx, AV_LOG_ERROR, "This video contains B-frames!\n");
833 av_log(avctx, AV_LOG_ERROR, "Transparency mode is enabled!\n");
835 av_log(avctx, AV_LOG_ERROR, "This video uses Haar transform!\n");
836 if (ctx->uses_fullpel)
837 av_log(avctx, AV_LOG_ERROR, "This video uses fullpel motion vectors!\n");
846 * These are 2x8 predefined Huffman codebooks for coding macroblock/block
847 * signals. They are specified using "huffman descriptors" in order to
848 * avoid huge static tables. The decoding tables will be generated at
849 * startup from these descriptors.
851 const IVIHuffDesc ff_ivi_mb_huff_desc[8] = {
852 {8, {0, 4, 5, 4, 4, 4, 6, 6}},
853 {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
854 {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
855 {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
856 {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
857 {9, {0, 4, 4, 4, 4, 3, 3, 3, 2}},
858 {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
859 {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
862 const IVIHuffDesc ff_ivi_blk_huff_desc[8] = {
863 {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
864 {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
865 {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
866 {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
867 {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
868 {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
869 {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
870 {9, {3, 4, 4, 5, 5, 5, 6, 5, 5}}
875 * Scan patterns shared between indeo4 and indeo5
877 const uint8_t ff_ivi_vertical_scan_8x8[64] = {
878 0, 8, 16, 24, 32, 40, 48, 56,
879 1, 9, 17, 25, 33, 41, 49, 57,
880 2, 10, 18, 26, 34, 42, 50, 58,
881 3, 11, 19, 27, 35, 43, 51, 59,
882 4, 12, 20, 28, 36, 44, 52, 60,
883 5, 13, 21, 29, 37, 45, 53, 61,
884 6, 14, 22, 30, 38, 46, 54, 62,
885 7, 15, 23, 31, 39, 47, 55, 63
888 const uint8_t ff_ivi_horizontal_scan_8x8[64] = {
889 0, 1, 2, 3, 4, 5, 6, 7,
890 8, 9, 10, 11, 12, 13, 14, 15,
891 16, 17, 18, 19, 20, 21, 22, 23,
892 24, 25, 26, 27, 28, 29, 30, 31,
893 32, 33, 34, 35, 36, 37, 38, 39,
894 40, 41, 42, 43, 44, 45, 46, 47,
895 48, 49, 50, 51, 52, 53, 54, 55,
896 56, 57, 58, 59, 60, 61, 62, 63
899 const uint8_t ff_ivi_direct_scan_4x4[16] = {
900 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15
905 * Run-value (RLE) tables.
907 const RVMapDesc ff_ivi_rvmap_tabs[9] = {
912 {1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3,
913 1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5,
914 1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1,
915 8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9,
916 9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3,
917 2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12,
918 8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13,
919 2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8,
920 1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8,
921 6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21,
922 22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8,
923 4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6,
924 1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28,
925 1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41,
926 6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1,
927 30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
930 { 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1,
931 6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1,
932 10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13,
933 1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1,
934 -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4,
935 7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1,
936 2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1,
937 9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3,
938 28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4,
939 3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1,
940 -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5,
941 5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4,
942 -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1,
943 37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1,
944 5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40,
945 -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1}
951 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7,
952 7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16,
953 14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
954 25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27,
955 33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34,
956 37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38,
957 40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44,
958 57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1,
959 52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64,
960 60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13,
961 12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4,
962 1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25,
963 21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33,
964 29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3,
965 28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41,
966 2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5},
969 {0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1,
970 -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1,
971 -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1,
972 1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1,
973 1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1,
974 1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1,
975 -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1,
976 -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4,
977 1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1,
978 1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2,
979 2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3,
980 6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2,
981 2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2,
982 2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4,
983 -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2,
984 -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4}
990 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5,
991 2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2,
992 2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13,
993 3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7,
994 1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3,
995 9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22,
996 23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32,
997 28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31,
998 49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3,
999 3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57,
1000 1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2,
1001 50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1,
1002 45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17,
1003 17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55,
1004 7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4,
1005 8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62},
1008 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1,
1009 2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3,
1010 -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1,
1011 3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2,
1012 7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4,
1013 2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1,
1014 1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1,
1015 1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1,
1016 1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5,
1017 -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1,
1018 -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7,
1019 -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13,
1020 1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2,
1021 -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1,
1022 -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6,
1023 -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1}
1029 {0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7,
1030 7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3,
1031 3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1,
1032 5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20,
1033 21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26,
1034 9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32,
1035 2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41,
1036 35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40,
1037 12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16,
1038 43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48,
1039 57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51,
1040 8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59,
1041 59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60,
1042 60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4,
1043 25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1,
1044 20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16},
1047 { 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1,
1048 -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2,
1049 -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4,
1050 2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1,
1051 1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1,
1052 2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1,
1053 4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1,
1054 -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1,
1055 2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2,
1056 1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1,
1057 -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1,
1058 -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1,
1059 -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1,
1060 1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5,
1061 -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12,
1062 -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3}
1068 {0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5,
1069 2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1,
1070 2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1,
1071 9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4,
1072 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1,
1073 2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1074 2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12,
1075 3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1,
1076 4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1,
1077 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5,
1078 1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1,
1079 5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1,
1080 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1,
1081 3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1,
1082 1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8,
1083 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1},
1086 { 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1,
1087 2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9,
1088 3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13,
1089 1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2,
1090 18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23,
1091 -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29,
1092 6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1,
1093 4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39,
1094 3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47,
1095 -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3,
1096 -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63,
1097 -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67,
1098 -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70,
1099 6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79,
1100 75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2,
1101 83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89}
1107 {1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1,
1108 1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1,
1109 1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1,
1110 12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2,
1111 6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3,
1112 8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2,
1113 1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4,
1114 4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1,
1115 1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2,
1116 2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13,
1117 1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31,
1118 3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2,
1119 1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8,
1120 36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1,
1121 1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4,
1122 40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7},
1125 { 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4,
1126 -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6,
1127 -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8,
1128 1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5,
1129 2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4,
1130 2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7,
1131 15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4,
1132 -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18,
1133 -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9,
1134 -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2,
1135 22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1,
1136 7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11,
1137 26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4,
1138 -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29,
1139 30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7,
1140 -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5}
1146 {1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2,
1147 4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1,
1148 3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9,
1149 4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2,
1150 1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1,
1151 6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7,
1152 15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1,
1153 2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1,
1154 17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1,
1155 6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1,
1156 4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2,
1157 1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1,
1158 1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1,
1159 12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6,
1160 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25,
1161 14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2},
1164 {-20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2,
1165 1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8,
1166 2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1,
1167 2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5,
1168 -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18,
1169 2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2,
1170 -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25,
1171 -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29,
1172 1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33,
1173 -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37,
1174 -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11,
1175 -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44,
1176 45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48,
1177 -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4,
1178 6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1,
1179 2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14}
1185 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6,
1186 6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1,
1187 1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5,
1188 14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7,
1189 8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20,
1190 19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23,
1191 24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7,
1192 26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2,
1193 28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30,
1194 32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14,
1195 6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9,
1196 37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5,
1197 3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6,
1198 1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1,
1199 8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45,
1200 12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49},
1203 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1,
1204 -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5,
1205 -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2,
1206 1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2,
1207 2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1,
1208 -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1,
1209 -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3,
1210 1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7,
1211 -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1,
1212 -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2,
1213 -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3,
1214 -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5,
1215 -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5,
1216 20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21,
1217 5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1,
1218 3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1}
1224 {1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2,
1225 4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1,
1226 7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9,
1227 2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4,
1228 4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8,
1229 2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4,
1230 1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21,
1231 25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1,
1232 1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2,
1233 4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30,
1234 6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1,
1235 37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41,
1236 13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42,
1237 3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15,
1238 44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7,
1239 50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1},
1242 { 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2,
1243 1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7,
1244 1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1,
1245 5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3,
1246 -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2,
1247 7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4,
1248 15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1,
1249 1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17,
1250 -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9,
1251 -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1,
1252 4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20,
1253 1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1,
1254 -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1,
1255 8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2,
1256 1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5,
1257 1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26}