00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00029 #define BITSTREAM_READER_LE
00030 #include "avcodec.h"
00031 #include "get_bits.h"
00032 #include "ivi_common.h"
00033 #include "libavutil/common.h"
00034 #include "ivi_dsp.h"
00035
00036 extern const IVIHuffDesc ff_ivi_mb_huff_desc[8];
00037 extern const IVIHuffDesc ff_ivi_blk_huff_desc[8];
00038
00039 VLC ff_ivi_mb_vlc_tabs [8];
00040 VLC ff_ivi_blk_vlc_tabs[8];
00041
00046 static uint16_t inv_bits(uint16_t val, int nbits)
00047 {
00048 uint16_t res;
00049
00050 if (nbits <= 8) {
00051 res = av_reverse[val] >> (8-nbits);
00052 } else
00053 res = ((av_reverse[val & 0xFF] << 8) + (av_reverse[val >> 8])) >> (16-nbits);
00054
00055 return res;
00056 }
00057
00058 int ff_ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag)
00059 {
00060 int pos, i, j, codes_per_row, prefix, not_last_row;
00061 uint16_t codewords[256];
00062 uint8_t bits[256];
00063
00064 pos = 0;
00065
00066 for (i = 0; i < cb->num_rows; i++) {
00067 codes_per_row = 1 << cb->xbits[i];
00068 not_last_row = (i != cb->num_rows - 1);
00069 prefix = ((1 << i) - 1) << (cb->xbits[i] + not_last_row);
00070
00071 for (j = 0; j < codes_per_row; j++) {
00072 if (pos >= 256)
00073 break;
00074
00075 bits[pos] = i + cb->xbits[i] + not_last_row;
00076 if (bits[pos] > IVI_VLC_BITS)
00077 return -1;
00078
00079 codewords[pos] = inv_bits((prefix | j), bits[pos]);
00080 if (!bits[pos])
00081 bits[pos] = 1;
00082
00083 pos++;
00084 }
00085 }
00086
00087
00088 return init_vlc(vlc, IVI_VLC_BITS, pos, bits, 1, 1, codewords, 2, 2,
00089 (flag ? INIT_VLC_USE_NEW_STATIC : 0) | INIT_VLC_LE);
00090 }
00091
00092 void ff_ivi_init_static_vlc(void)
00093 {
00094 int i;
00095 static VLC_TYPE table_data[8192 * 16][2];
00096 static int initialized_vlcs = 0;
00097
00098 if (initialized_vlcs)
00099 return;
00100 for (i = 0; i < 8; i++) {
00101 ff_ivi_mb_vlc_tabs[i].table = table_data + i * 2 * 8192;
00102 ff_ivi_mb_vlc_tabs[i].table_allocated = 8192;
00103 ff_ivi_create_huff_from_desc(&ff_ivi_mb_huff_desc[i], &ff_ivi_mb_vlc_tabs[i], 1);
00104 ff_ivi_blk_vlc_tabs[i].table = table_data + (i * 2 + 1) * 8192;
00105 ff_ivi_blk_vlc_tabs[i].table_allocated = 8192;
00106 ff_ivi_create_huff_from_desc(&ff_ivi_blk_huff_desc[i], &ff_ivi_blk_vlc_tabs[i], 1);
00107 }
00108 initialized_vlcs = 1;
00109 }
00110
00111 int ff_ivi_dec_huff_desc(GetBitContext *gb, int desc_coded, int which_tab,
00112 IVIHuffTab *huff_tab, AVCodecContext *avctx)
00113 {
00114 int i, result;
00115 IVIHuffDesc new_huff;
00116
00117 if (!desc_coded) {
00118
00119 huff_tab->tab = (which_tab) ? &ff_ivi_blk_vlc_tabs[7]
00120 : &ff_ivi_mb_vlc_tabs [7];
00121 } else {
00122 huff_tab->tab_sel = get_bits(gb, 3);
00123 if (huff_tab->tab_sel == 7) {
00124
00125 new_huff.num_rows = get_bits(gb, 4);
00126 if (!new_huff.num_rows) {
00127 av_log(avctx, AV_LOG_ERROR, "Empty custom Huffman table!\n");
00128 return AVERROR_INVALIDDATA;
00129 }
00130
00131 for (i = 0; i < new_huff.num_rows; i++)
00132 new_huff.xbits[i] = get_bits(gb, 4);
00133
00134
00135 if (ff_ivi_huff_desc_cmp(&new_huff, &huff_tab->cust_desc)) {
00136 ff_ivi_huff_desc_copy(&huff_tab->cust_desc, &new_huff);
00137
00138 if (huff_tab->cust_tab.table)
00139 ff_free_vlc(&huff_tab->cust_tab);
00140 result = ff_ivi_create_huff_from_desc(&huff_tab->cust_desc,
00141 &huff_tab->cust_tab, 0);
00142 if (result) {
00143 huff_tab->cust_desc.num_rows = 0;
00144 av_log(avctx, AV_LOG_ERROR,
00145 "Error while initializing custom vlc table!\n");
00146 return result;
00147 }
00148 }
00149 huff_tab->tab = &huff_tab->cust_tab;
00150 } else {
00151
00152 huff_tab->tab = (which_tab) ? &ff_ivi_blk_vlc_tabs[huff_tab->tab_sel]
00153 : &ff_ivi_mb_vlc_tabs [huff_tab->tab_sel];
00154 }
00155 }
00156
00157 return 0;
00158 }
00159
00160 int ff_ivi_huff_desc_cmp(const IVIHuffDesc *desc1, const IVIHuffDesc *desc2)
00161 {
00162 return desc1->num_rows != desc2->num_rows
00163 || memcmp(desc1->xbits, desc2->xbits, desc1->num_rows);
00164 }
00165
00166 void ff_ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src)
00167 {
00168 dst->num_rows = src->num_rows;
00169 memcpy(dst->xbits, src->xbits, src->num_rows);
00170 }
00171
00172 int av_cold ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg)
00173 {
00174 int p, b;
00175 uint32_t b_width, b_height, align_fac, width_aligned, height_aligned, buf_size;
00176 IVIBandDesc *band;
00177
00178 ff_ivi_free_buffers(planes);
00179
00180
00181 planes[0].width = cfg->pic_width;
00182 planes[0].height = cfg->pic_height;
00183 planes[0].num_bands = cfg->luma_bands;
00184
00185
00186 planes[1].width = planes[2].width = (cfg->pic_width + 3) >> 2;
00187 planes[1].height = planes[2].height = (cfg->pic_height + 3) >> 2;
00188 planes[1].num_bands = planes[2].num_bands = cfg->chroma_bands;
00189
00190 for (p = 0; p < 3; p++) {
00191 planes[p].bands = av_mallocz(planes[p].num_bands * sizeof(IVIBandDesc));
00192 if (!planes[p].bands)
00193 return AVERROR(ENOMEM);
00194
00195
00196
00197
00198 b_width = planes[p].num_bands == 1 ? planes[p].width : (planes[p].width + 1) >> 1;
00199 b_height = planes[p].num_bands == 1 ? planes[p].height : (planes[p].height + 1) >> 1;
00200
00201
00202
00203 align_fac = p ? 8 : 16;
00204 width_aligned = FFALIGN(b_width , align_fac);
00205 height_aligned = FFALIGN(b_height, align_fac);
00206 buf_size = width_aligned * height_aligned * sizeof(int16_t);
00207
00208 for (b = 0; b < planes[p].num_bands; b++) {
00209 band = &planes[p].bands[b];
00210 band->plane = p;
00211 band->band_num = b;
00212 band->width = b_width;
00213 band->height = b_height;
00214 band->pitch = width_aligned;
00215 band->aheight = height_aligned;
00216 band->bufs[0] = av_mallocz(buf_size);
00217 band->bufs[1] = av_mallocz(buf_size);
00218 if (!band->bufs[0] || !band->bufs[1])
00219 return AVERROR(ENOMEM);
00220
00221
00222 if (cfg->luma_bands > 1) {
00223 band->bufs[2] = av_mallocz(buf_size);
00224 if (!band->bufs[2])
00225 return AVERROR(ENOMEM);
00226 }
00227
00228 planes[p].bands[0].blk_vlc.cust_desc.num_rows = 0;
00229 }
00230 }
00231
00232 return 0;
00233 }
00234
00235 void av_cold ff_ivi_free_buffers(IVIPlaneDesc *planes)
00236 {
00237 int p, b, t;
00238
00239 for (p = 0; p < 3; p++) {
00240 for (b = 0; b < planes[p].num_bands; b++) {
00241 av_freep(&planes[p].bands[b].bufs[0]);
00242 av_freep(&planes[p].bands[b].bufs[1]);
00243 av_freep(&planes[p].bands[b].bufs[2]);
00244
00245 if (planes[p].bands[b].blk_vlc.cust_tab.table)
00246 ff_free_vlc(&planes[p].bands[b].blk_vlc.cust_tab);
00247 for (t = 0; t < planes[p].bands[b].num_tiles; t++)
00248 av_freep(&planes[p].bands[b].tiles[t].mbs);
00249 av_freep(&planes[p].bands[b].tiles);
00250 }
00251 av_freep(&planes[p].bands);
00252 }
00253 }
00254
00255 int av_cold ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height)
00256 {
00257 int p, b, x, y, x_tiles, y_tiles, t_width, t_height;
00258 IVIBandDesc *band;
00259 IVITile *tile, *ref_tile;
00260
00261 for (p = 0; p < 3; p++) {
00262 t_width = !p ? tile_width : (tile_width + 3) >> 2;
00263 t_height = !p ? tile_height : (tile_height + 3) >> 2;
00264
00265 if (!p && planes[0].num_bands == 4) {
00266 t_width >>= 1;
00267 t_height >>= 1;
00268 }
00269
00270 for (b = 0; b < planes[p].num_bands; b++) {
00271 band = &planes[p].bands[b];
00272 x_tiles = IVI_NUM_TILES(band->width, t_width);
00273 y_tiles = IVI_NUM_TILES(band->height, t_height);
00274 band->num_tiles = x_tiles * y_tiles;
00275
00276 av_freep(&band->tiles);
00277 band->tiles = av_mallocz(band->num_tiles * sizeof(IVITile));
00278 if (!band->tiles)
00279 return AVERROR(ENOMEM);
00280
00281 tile = band->tiles;
00282
00283
00284
00285 ref_tile = planes[0].bands[0].tiles;
00286
00287 for (y = 0; y < band->height; y += t_height) {
00288 for (x = 0; x < band->width; x += t_width) {
00289 tile->xpos = x;
00290 tile->ypos = y;
00291 tile->mb_size = band->mb_size;
00292 tile->width = FFMIN(band->width - x, t_width);
00293 tile->height = FFMIN(band->height - y, t_height);
00294 tile->is_empty = tile->data_size = 0;
00295
00296 tile->num_MBs = IVI_MBs_PER_TILE(tile->width, tile->height,
00297 band->mb_size);
00298
00299 av_freep(&tile->mbs);
00300 tile->mbs = av_malloc(tile->num_MBs * sizeof(IVIMbInfo));
00301 if (!tile->mbs)
00302 return AVERROR(ENOMEM);
00303
00304 tile->ref_mbs = 0;
00305 if (p || b) {
00306 tile->ref_mbs = ref_tile->mbs;
00307 ref_tile++;
00308 }
00309
00310 tile++;
00311 }
00312 }
00313
00314 }
00315 }
00316
00317 return 0;
00318 }
00319
00320 int ff_ivi_dec_tile_data_size(GetBitContext *gb)
00321 {
00322 int len;
00323
00324 len = 0;
00325 if (get_bits1(gb)) {
00326 len = get_bits(gb, 8);
00327 if (len == 255)
00328 len = get_bits_long(gb, 24);
00329 }
00330
00331
00332 align_get_bits(gb);
00333
00334 return len;
00335 }
00336
00337 int ff_ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile)
00338 {
00339 int mbn, blk, num_blocks, num_coeffs, blk_size, scan_pos, run, val,
00340 pos, is_intra, mc_type, mv_x, mv_y, col_mask;
00341 uint8_t col_flags[8];
00342 int32_t prev_dc, trvec[64];
00343 uint32_t cbp, sym, lo, hi, quant, buf_offs, q;
00344 IVIMbInfo *mb;
00345 RVMapDesc *rvmap = band->rv_map;
00346 void (*mc_with_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
00347 void (*mc_no_delta_func) (int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
00348 const uint16_t *base_tab;
00349 const uint8_t *scale_tab;
00350
00351 prev_dc = 0;
00352
00353 blk_size = band->blk_size;
00354 col_mask = blk_size - 1;
00355 num_blocks = (band->mb_size != blk_size) ? 4 : 1;
00356 num_coeffs = blk_size * blk_size;
00357 if (blk_size == 8) {
00358 mc_with_delta_func = ff_ivi_mc_8x8_delta;
00359 mc_no_delta_func = ff_ivi_mc_8x8_no_delta;
00360 } else {
00361 mc_with_delta_func = ff_ivi_mc_4x4_delta;
00362 mc_no_delta_func = ff_ivi_mc_4x4_no_delta;
00363 }
00364
00365 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
00366 is_intra = !mb->type;
00367 cbp = mb->cbp;
00368 buf_offs = mb->buf_offs;
00369
00370 quant = av_clip(band->glob_quant + mb->q_delta, 0, 23);
00371
00372 base_tab = is_intra ? band->intra_base : band->inter_base;
00373 scale_tab = is_intra ? band->intra_scale : band->inter_scale;
00374 if (scale_tab)
00375 quant = scale_tab[quant];
00376
00377 if (!is_intra) {
00378 mv_x = mb->mv_x;
00379 mv_y = mb->mv_y;
00380 if (!band->is_halfpel) {
00381 mc_type = 0;
00382 } else {
00383 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
00384 mv_x >>= 1;
00385 mv_y >>= 1;
00386 }
00387 if (mb->type) {
00388 int dmv_x, dmv_y, cx, cy;
00389
00390 dmv_x = mb->mv_x >> band->is_halfpel;
00391 dmv_y = mb->mv_y >> band->is_halfpel;
00392 cx = mb->mv_x & band->is_halfpel;
00393 cy = mb->mv_y & band->is_halfpel;
00394
00395 if ( mb->xpos + dmv_x < 0
00396 || mb->xpos + dmv_x + band->mb_size + cx > band->pitch
00397 || mb->ypos + dmv_y < 0
00398 || mb->ypos + dmv_y + band->mb_size + cy > band->aheight) {
00399 return AVERROR_INVALIDDATA;
00400 }
00401 }
00402 }
00403
00404 for (blk = 0; blk < num_blocks; blk++) {
00405
00406 if (blk & 1) {
00407 buf_offs += blk_size;
00408 } else if (blk == 2) {
00409 buf_offs -= blk_size;
00410 buf_offs += blk_size * band->pitch;
00411 }
00412
00413 if (cbp & 1) {
00414 scan_pos = -1;
00415 memset(trvec, 0, num_coeffs*sizeof(trvec[0]));
00416 memset(col_flags, 0, sizeof(col_flags));
00417
00418 while (scan_pos <= num_coeffs) {
00419 sym = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
00420 if (sym == rvmap->eob_sym)
00421 break;
00422
00423 if (sym == rvmap->esc_sym) {
00424 run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1;
00425 lo = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
00426 hi = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
00427 val = IVI_TOSIGNED((hi << 6) | lo);
00428 } else {
00429 if (sym >= 256U) {
00430 av_log(NULL, AV_LOG_ERROR, "Invalid sym encountered: %d.\n", sym);
00431 return -1;
00432 }
00433 run = rvmap->runtab[sym];
00434 val = rvmap->valtab[sym];
00435 }
00436
00437
00438 scan_pos += run;
00439 if (scan_pos >= num_coeffs)
00440 break;
00441 pos = band->scan[scan_pos];
00442
00443 if (!val)
00444 av_dlog(NULL, "Val = 0 encountered!\n");
00445
00446 q = (base_tab[pos] * quant) >> 9;
00447 if (q > 1)
00448 val = val * q + FFSIGN(val) * (((q ^ 1) - 1) >> 1);
00449 trvec[pos] = val;
00450 col_flags[pos & col_mask] |= !!val;
00451 }
00452
00453 if (scan_pos >= num_coeffs && sym != rvmap->eob_sym)
00454 return -1;
00455
00456
00457 if (is_intra && band->is_2d_trans) {
00458 prev_dc += trvec[0];
00459 trvec[0] = prev_dc;
00460 col_flags[0] |= !!prev_dc;
00461 }
00462
00463
00464 band->inv_transform(trvec, band->buf + buf_offs,
00465 band->pitch, col_flags);
00466
00467
00468 if (!is_intra)
00469 mc_with_delta_func(band->buf + buf_offs,
00470 band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
00471 band->pitch, mc_type);
00472 } else {
00473
00474
00475
00476 if (is_intra && band->dc_transform) {
00477 band->dc_transform(&prev_dc, band->buf + buf_offs,
00478 band->pitch, blk_size);
00479 } else
00480 mc_no_delta_func(band->buf + buf_offs,
00481 band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
00482 band->pitch, mc_type);
00483 }
00484
00485 cbp >>= 1;
00486 }
00487 }
00488
00489 align_get_bits(gb);
00490
00491 return 0;
00492 }
00493
00503 static int ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
00504 IVITile *tile, int32_t mv_scale)
00505 {
00506 int x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
00507 int offs, mb_offset, row_offset;
00508 IVIMbInfo *mb, *ref_mb;
00509 const int16_t *src;
00510 int16_t *dst;
00511 void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch,
00512 int mc_type);
00513
00514 if (tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size)) {
00515 av_log(avctx, AV_LOG_ERROR, "Allocated tile size %d mismatches "
00516 "parameters %d in ivi_process_empty_tile()\n",
00517 tile->num_MBs, IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size));
00518 return AVERROR_INVALIDDATA;
00519 }
00520
00521 offs = tile->ypos * band->pitch + tile->xpos;
00522 mb = tile->mbs;
00523 ref_mb = tile->ref_mbs;
00524 row_offset = band->mb_size * band->pitch;
00525 need_mc = 0;
00526
00527 for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
00528 mb_offset = offs;
00529
00530 for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
00531 mb->xpos = x;
00532 mb->ypos = y;
00533 mb->buf_offs = mb_offset;
00534
00535 mb->type = 1;
00536 mb->cbp = 0;
00537
00538 if (!band->qdelta_present && !band->plane && !band->band_num) {
00539 mb->q_delta = band->glob_quant;
00540 mb->mv_x = 0;
00541 mb->mv_y = 0;
00542 }
00543
00544 if (band->inherit_qdelta && ref_mb)
00545 mb->q_delta = ref_mb->q_delta;
00546
00547 if (band->inherit_mv) {
00548
00549 if (mv_scale) {
00550 mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
00551 mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
00552 } else {
00553 mb->mv_x = ref_mb->mv_x;
00554 mb->mv_y = ref_mb->mv_y;
00555 }
00556 need_mc |= mb->mv_x || mb->mv_y;
00557 }
00558
00559 mb++;
00560 if (ref_mb)
00561 ref_mb++;
00562 mb_offset += band->mb_size;
00563 }
00564 offs += row_offset;
00565 }
00566
00567 if (band->inherit_mv && need_mc) {
00568 num_blocks = (band->mb_size != band->blk_size) ? 4 : 1;
00569 mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
00570 : ff_ivi_mc_4x4_no_delta;
00571
00572 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
00573 mv_x = mb->mv_x;
00574 mv_y = mb->mv_y;
00575 if (!band->is_halfpel) {
00576 mc_type = 0;
00577 } else {
00578 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
00579 mv_x >>= 1;
00580 mv_y >>= 1;
00581 }
00582
00583 for (blk = 0; blk < num_blocks; blk++) {
00584
00585 offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
00586 mc_no_delta_func(band->buf + offs,
00587 band->ref_buf + offs + mv_y * band->pitch + mv_x,
00588 band->pitch, mc_type);
00589 }
00590 }
00591 } else {
00592
00593 src = band->ref_buf + tile->ypos * band->pitch + tile->xpos;
00594 dst = band->buf + tile->ypos * band->pitch + tile->xpos;
00595 for (y = 0; y < tile->height; y++) {
00596 memcpy(dst, src, tile->width*sizeof(band->buf[0]));
00597 src += band->pitch;
00598 dst += band->pitch;
00599 }
00600 }
00601
00602 return 0;
00603 }
00604
00605
00606 #ifdef DEBUG
00607 uint16_t ivi_calc_band_checksum (IVIBandDesc *band)
00608 {
00609 int x, y;
00610 int16_t *src, checksum;
00611
00612 src = band->buf;
00613 checksum = 0;
00614
00615 for (y = 0; y < band->height; src += band->pitch, y++)
00616 for (x = 0; x < band->width; x++)
00617 checksum += src[x];
00618
00619 return checksum;
00620 }
00621
00622 int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch)
00623 {
00624 int x, y, result;
00625 uint8_t t1, t2;
00626 int16_t *src;
00627
00628 src = band->buf;
00629 result = 0;
00630
00631 for (y = 0; y < band->height; src += band->pitch, y++) {
00632 for (x = 0; x < band->width; x++) {
00633 t1 = av_clip(src[x] + 128, 0, 255);
00634 t2 = ref[x];
00635 if (t1 != t2) {
00636 av_log(NULL, AV_LOG_ERROR, "Data mismatch: row %d, column %d\n",
00637 y / band->blk_size, x / band->blk_size);
00638 result = -1;
00639 }
00640 }
00641 ref += pitch;
00642 }
00643
00644 return result;
00645 }
00646 #endif
00647
00648 void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch)
00649 {
00650 int x, y;
00651 const int16_t *src = plane->bands[0].buf;
00652 uint32_t pitch = plane->bands[0].pitch;
00653
00654 if (!src)
00655 return;
00656
00657 for (y = 0; y < plane->height; y++) {
00658 for (x = 0; x < plane->width; x++)
00659 dst[x] = av_clip_uint8(src[x] + 128);
00660 src += pitch;
00661 dst += dst_pitch;
00662 }
00663 }
00664
00673 static int decode_band(IVI45DecContext *ctx, int plane_num,
00674 IVIBandDesc *band, AVCodecContext *avctx)
00675 {
00676 int result, i, t, idx1, idx2, pos;
00677 IVITile *tile;
00678
00679 band->buf = band->bufs[ctx->dst_buf];
00680 band->ref_buf = band->bufs[ctx->ref_buf];
00681 band->data_ptr = ctx->frame_data + (get_bits_count(&ctx->gb) >> 3);
00682
00683 result = ctx->decode_band_hdr(ctx, band, avctx);
00684 if (result) {
00685 av_log(avctx, AV_LOG_ERROR, "Error while decoding band header: %d\n",
00686 result);
00687 return result;
00688 }
00689
00690 if (band->is_empty) {
00691 av_log(avctx, AV_LOG_ERROR, "Empty band encountered!\n");
00692 return AVERROR_INVALIDDATA;
00693 }
00694
00695 band->rv_map = &ctx->rvmap_tabs[band->rvmap_sel];
00696
00697
00698 for (i = 0; i < band->num_corr; i++) {
00699 idx1 = band->corr[i * 2];
00700 idx2 = band->corr[i * 2 + 1];
00701 FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
00702 FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
00703 }
00704
00705 pos = get_bits_count(&ctx->gb);
00706
00707 for (t = 0; t < band->num_tiles; t++) {
00708 tile = &band->tiles[t];
00709
00710 if (tile->mb_size != band->mb_size) {
00711 av_log(avctx, AV_LOG_ERROR, "MB sizes mismatch: %d vs. %d\n",
00712 band->mb_size, tile->mb_size);
00713 return AVERROR_INVALIDDATA;
00714 }
00715 tile->is_empty = get_bits1(&ctx->gb);
00716 if (tile->is_empty) {
00717 result = ivi_process_empty_tile(avctx, band, tile,
00718 (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3));
00719 if (result < 0)
00720 break;
00721 av_dlog(avctx, "Empty tile encountered!\n");
00722 } else {
00723 tile->data_size = ff_ivi_dec_tile_data_size(&ctx->gb);
00724 if (!tile->data_size) {
00725 av_log(avctx, AV_LOG_ERROR, "Tile data size is zero!\n");
00726 return AVERROR_INVALIDDATA;
00727 }
00728
00729 result = ctx->decode_mb_info(ctx, band, tile, avctx);
00730 if (result < 0)
00731 break;
00732
00733 result = ff_ivi_decode_blocks(&ctx->gb, band, tile);
00734 if (result < 0 || ((get_bits_count(&ctx->gb) - pos) >> 3) != tile->data_size) {
00735 av_log(avctx, AV_LOG_ERROR, "Corrupted tile data encountered!\n");
00736 break;
00737 }
00738
00739 pos += tile->data_size << 3;
00740 }
00741 }
00742
00743
00744 for (i = band->num_corr-1; i >= 0; i--) {
00745 idx1 = band->corr[i*2];
00746 idx2 = band->corr[i*2+1];
00747 FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
00748 FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
00749 }
00750
00751 #ifdef DEBUG
00752 if (band->checksum_present) {
00753 uint16_t chksum = ivi_calc_band_checksum(band);
00754 if (chksum != band->checksum) {
00755 av_log(avctx, AV_LOG_ERROR,
00756 "Band checksum mismatch! Plane %d, band %d, received: %x, calculated: %x\n",
00757 band->plane, band->band_num, band->checksum, chksum);
00758 }
00759 }
00760 #endif
00761
00762 align_get_bits(&ctx->gb);
00763
00764 return result;
00765 }
00766
00767 int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
00768 AVPacket *avpkt)
00769 {
00770 IVI45DecContext *ctx = avctx->priv_data;
00771 const uint8_t *buf = avpkt->data;
00772 int buf_size = avpkt->size;
00773 int result, p, b;
00774
00775 init_get_bits(&ctx->gb, buf, buf_size * 8);
00776 ctx->frame_data = buf;
00777 ctx->frame_size = buf_size;
00778
00779 result = ctx->decode_pic_hdr(ctx, avctx);
00780 if (result) {
00781 av_log(avctx, AV_LOG_ERROR,
00782 "Error while decoding picture header: %d\n", result);
00783 return -1;
00784 }
00785 if (ctx->gop_invalid)
00786 return AVERROR_INVALIDDATA;
00787
00788 if (ctx->gop_flags & IVI5_IS_PROTECTED) {
00789 av_log(avctx, AV_LOG_ERROR, "Password-protected clip!\n");
00790 return -1;
00791 }
00792
00793 ctx->switch_buffers(ctx);
00794
00795
00796
00797 if (ctx->is_nonnull_frame(ctx)) {
00798 for (p = 0; p < 3; p++) {
00799 for (b = 0; b < ctx->planes[p].num_bands; b++) {
00800 result = decode_band(ctx, p, &ctx->planes[p].bands[b], avctx);
00801 if (result) {
00802 av_log(avctx, AV_LOG_ERROR,
00803 "Error while decoding band: %d, plane: %d\n", b, p);
00804 return -1;
00805 }
00806 }
00807 }
00808 }
00809
00810
00811
00812
00813
00814
00815 if (avctx->codec_id == CODEC_ID_INDEO4 && ctx->frame_type == 0) {
00816 while (get_bits(&ctx->gb, 8));
00817 skip_bits_long(&ctx->gb, 64);
00818 if (get_bits_left(&ctx->gb) > 18 && show_bits(&ctx->gb, 18) == 0x3FFF8)
00819 av_log(avctx, AV_LOG_ERROR, "Buffer contains IP frames!\n");
00820 }
00821
00822 if (ctx->frame.data[0])
00823 avctx->release_buffer(avctx, &ctx->frame);
00824
00825 ctx->frame.reference = 0;
00826 avcodec_set_dimensions(avctx, ctx->planes[0].width, ctx->planes[0].height);
00827 if ((result = avctx->get_buffer(avctx, &ctx->frame)) < 0) {
00828 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
00829 return result;
00830 }
00831
00832 if (ctx->is_scalable) {
00833 if (avctx->codec_id == CODEC_ID_INDEO4)
00834 ff_ivi_recompose_haar(&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0], 4);
00835 else
00836 ff_ivi_recompose53 (&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0], 4);
00837 } else {
00838 ff_ivi_output_plane(&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0]);
00839 }
00840
00841 ff_ivi_output_plane(&ctx->planes[2], ctx->frame.data[1], ctx->frame.linesize[1]);
00842 ff_ivi_output_plane(&ctx->planes[1], ctx->frame.data[2], ctx->frame.linesize[2]);
00843
00844 *data_size = sizeof(AVFrame);
00845 *(AVFrame*)data = ctx->frame;
00846
00847 return buf_size;
00848 }
00849
00853 av_cold int ff_ivi_decode_close(AVCodecContext *avctx)
00854 {
00855 IVI45DecContext *ctx = avctx->priv_data;
00856
00857 ff_ivi_free_buffers(&ctx->planes[0]);
00858
00859 if (ctx->mb_vlc.cust_tab.table)
00860 ff_free_vlc(&ctx->mb_vlc.cust_tab);
00861
00862 if (ctx->frame.data[0])
00863 avctx->release_buffer(avctx, &ctx->frame);
00864
00865 #if IVI4_STREAM_ANALYSER
00866 if (avctx->codec_id == CODEC_ID_INDEO4) {
00867 if (ctx->is_scalable)
00868 av_log(avctx, AV_LOG_ERROR, "This video uses scalability mode!\n");
00869 if (ctx->uses_tiling)
00870 av_log(avctx, AV_LOG_ERROR, "This video uses local decoding!\n");
00871 if (ctx->has_b_frames)
00872 av_log(avctx, AV_LOG_ERROR, "This video contains B-frames!\n");
00873 if (ctx->has_transp)
00874 av_log(avctx, AV_LOG_ERROR, "Transparency mode is enabled!\n");
00875 if (ctx->uses_haar)
00876 av_log(avctx, AV_LOG_ERROR, "This video uses Haar transform!\n");
00877 if (ctx->uses_fullpel)
00878 av_log(avctx, AV_LOG_ERROR, "This video uses fullpel motion vectors!\n");
00879 }
00880 #endif
00881
00882 return 0;
00883 }
00884
00885
00892 const IVIHuffDesc ff_ivi_mb_huff_desc[8] = {
00893 {8, {0, 4, 5, 4, 4, 4, 6, 6}},
00894 {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
00895 {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
00896 {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
00897 {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
00898 {9, {0, 4, 4, 4, 4, 3, 3, 3, 2}},
00899 {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
00900 {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
00901 };
00902
00903 const IVIHuffDesc ff_ivi_blk_huff_desc[8] = {
00904 {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
00905 {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
00906 {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
00907 {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
00908 {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
00909 {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
00910 {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
00911 {9, {3, 4, 4, 5, 5, 5, 6, 5, 5}}
00912 };
00913
00914
00918 const uint8_t ff_ivi_vertical_scan_8x8[64] = {
00919 0, 8, 16, 24, 32, 40, 48, 56,
00920 1, 9, 17, 25, 33, 41, 49, 57,
00921 2, 10, 18, 26, 34, 42, 50, 58,
00922 3, 11, 19, 27, 35, 43, 51, 59,
00923 4, 12, 20, 28, 36, 44, 52, 60,
00924 5, 13, 21, 29, 37, 45, 53, 61,
00925 6, 14, 22, 30, 38, 46, 54, 62,
00926 7, 15, 23, 31, 39, 47, 55, 63
00927 };
00928
00929 const uint8_t ff_ivi_horizontal_scan_8x8[64] = {
00930 0, 1, 2, 3, 4, 5, 6, 7,
00931 8, 9, 10, 11, 12, 13, 14, 15,
00932 16, 17, 18, 19, 20, 21, 22, 23,
00933 24, 25, 26, 27, 28, 29, 30, 31,
00934 32, 33, 34, 35, 36, 37, 38, 39,
00935 40, 41, 42, 43, 44, 45, 46, 47,
00936 48, 49, 50, 51, 52, 53, 54, 55,
00937 56, 57, 58, 59, 60, 61, 62, 63
00938 };
00939
00940 const uint8_t ff_ivi_direct_scan_4x4[16] = {
00941 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15
00942 };
00943
00944
00948 const RVMapDesc ff_ivi_rvmap_tabs[9] = {
00949 {
00950 5,
00951 2,
00952
00953 {1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3,
00954 1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5,
00955 1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1,
00956 8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9,
00957 9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3,
00958 2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12,
00959 8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13,
00960 2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8,
00961 1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8,
00962 6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21,
00963 22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8,
00964 4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6,
00965 1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28,
00966 1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41,
00967 6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1,
00968 30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
00969
00970
00971 { 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1,
00972 6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1,
00973 10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13,
00974 1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1,
00975 -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4,
00976 7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1,
00977 2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1,
00978 9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3,
00979 28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4,
00980 3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1,
00981 -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5,
00982 5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4,
00983 -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1,
00984 37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1,
00985 5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40,
00986 -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1}
00987 },{
00988
00989 0,
00990 38,
00991
00992 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7,
00993 7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16,
00994 14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
00995 25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27,
00996 33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34,
00997 37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38,
00998 40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44,
00999 57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1,
01000 52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64,
01001 60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13,
01002 12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4,
01003 1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25,
01004 21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33,
01005 29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3,
01006 28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41,
01007 2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5},
01008
01009
01010 {0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1,
01011 -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1,
01012 -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1,
01013 1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1,
01014 1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1,
01015 1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1,
01016 -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1,
01017 -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4,
01018 1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1,
01019 1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2,
01020 2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3,
01021 6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2,
01022 2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2,
01023 2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4,
01024 -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2,
01025 -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4}
01026 },{
01027
01028 2,
01029 11,
01030
01031 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5,
01032 2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2,
01033 2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13,
01034 3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7,
01035 1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3,
01036 9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22,
01037 23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32,
01038 28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31,
01039 49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3,
01040 3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57,
01041 1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2,
01042 50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1,
01043 45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17,
01044 17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55,
01045 7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4,
01046 8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62},
01047
01048
01049 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1,
01050 2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3,
01051 -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1,
01052 3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2,
01053 7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4,
01054 2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1,
01055 1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1,
01056 1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1,
01057 1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5,
01058 -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1,
01059 -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7,
01060 -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13,
01061 1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2,
01062 -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1,
01063 -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6,
01064 -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1}
01065 },{
01066
01067 0,
01068 35,
01069
01070 {0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7,
01071 7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3,
01072 3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1,
01073 5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20,
01074 21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26,
01075 9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32,
01076 2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41,
01077 35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40,
01078 12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16,
01079 43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48,
01080 57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51,
01081 8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59,
01082 59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60,
01083 60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4,
01084 25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1,
01085 20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16},
01086
01087
01088 { 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1,
01089 -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2,
01090 -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4,
01091 2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1,
01092 1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1,
01093 2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1,
01094 4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1,
01095 -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1,
01096 2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2,
01097 1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1,
01098 -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1,
01099 -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1,
01100 -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1,
01101 1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5,
01102 -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12,
01103 -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3}
01104 },{
01105
01106 0,
01107 34,
01108
01109 {0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5,
01110 2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1,
01111 2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1,
01112 9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4,
01113 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1,
01114 2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
01115 2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12,
01116 3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1,
01117 4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1,
01118 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5,
01119 1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1,
01120 5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1,
01121 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1,
01122 3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1,
01123 1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8,
01124 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1},
01125
01126
01127 { 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1,
01128 2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9,
01129 3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13,
01130 1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2,
01131 18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23,
01132 -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29,
01133 6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1,
01134 4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39,
01135 3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47,
01136 -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3,
01137 -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63,
01138 -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67,
01139 -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70,
01140 6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79,
01141 75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2,
01142 83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89}
01143 },{
01144
01145 2,
01146 33,
01147
01148 {1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1,
01149 1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1,
01150 1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1,
01151 12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2,
01152 6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3,
01153 8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2,
01154 1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4,
01155 4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1,
01156 1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2,
01157 2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13,
01158 1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31,
01159 3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2,
01160 1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8,
01161 36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1,
01162 1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4,
01163 40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7},
01164
01165
01166 { 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4,
01167 -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6,
01168 -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8,
01169 1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5,
01170 2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4,
01171 2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7,
01172 15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4,
01173 -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18,
01174 -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9,
01175 -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2,
01176 22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1,
01177 7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11,
01178 26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4,
01179 -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29,
01180 30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7,
01181 -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5}
01182 },{
01183
01184 2,
01185 13,
01186
01187 {1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2,
01188 4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1,
01189 3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9,
01190 4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2,
01191 1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1,
01192 6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7,
01193 15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1,
01194 2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1,
01195 17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1,
01196 6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1,
01197 4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2,
01198 1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1,
01199 1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1,
01200 12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6,
01201 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25,
01202 14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2},
01203
01204
01205 {-20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2,
01206 1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8,
01207 2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1,
01208 2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5,
01209 -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18,
01210 2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2,
01211 -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25,
01212 -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29,
01213 1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33,
01214 -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37,
01215 -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11,
01216 -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44,
01217 45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48,
01218 -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4,
01219 6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1,
01220 2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14}
01221 },{
01222
01223 2,
01224 38,
01225
01226 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6,
01227 6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1,
01228 1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5,
01229 14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7,
01230 8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20,
01231 19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23,
01232 24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7,
01233 26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2,
01234 28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30,
01235 32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14,
01236 6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9,
01237 37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5,
01238 3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6,
01239 1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1,
01240 8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45,
01241 12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49},
01242
01243
01244 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1,
01245 -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5,
01246 -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2,
01247 1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2,
01248 2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1,
01249 -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1,
01250 -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3,
01251 1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7,
01252 -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1,
01253 -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2,
01254 -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3,
01255 -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5,
01256 -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5,
01257 20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21,
01258 5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1,
01259 3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1}
01260 },{
01261
01262 4,
01263 11,
01264
01265 {1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2,
01266 4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1,
01267 7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9,
01268 2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4,
01269 4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8,
01270 2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4,
01271 1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21,
01272 25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1,
01273 1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2,
01274 4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30,
01275 6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1,
01276 37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41,
01277 13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42,
01278 3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15,
01279 44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7,
01280 50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1},
01281
01282
01283 { 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2,
01284 1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7,
01285 1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1,
01286 5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3,
01287 -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2,
01288 7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4,
01289 15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1,
01290 1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17,
01291 -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9,
01292 -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1,
01293 4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20,
01294 1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1,
01295 -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1,
01296 8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2,
01297 1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5,
01298 1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26}
01299 }
01300 };