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) || !huff_tab->cust_tab.table) {
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 av_cold int 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 band->bufsize = buf_size/2;
00219 if (!band->bufs[0] || !band->bufs[1])
00220 return AVERROR(ENOMEM);
00221
00222
00223 if (cfg->luma_bands > 1) {
00224 band->bufs[2] = av_mallocz(buf_size);
00225 if (!band->bufs[2])
00226 return AVERROR(ENOMEM);
00227 }
00228
00229 planes[p].bands[0].blk_vlc.cust_desc.num_rows = 0;
00230 }
00231 }
00232
00233 return 0;
00234 }
00235
00236 av_cold void ff_ivi_free_buffers(IVIPlaneDesc *planes)
00237 {
00238 int p, b, t;
00239
00240 for (p = 0; p < 3; p++) {
00241 for (b = 0; b < planes[p].num_bands; b++) {
00242 av_freep(&planes[p].bands[b].bufs[0]);
00243 av_freep(&planes[p].bands[b].bufs[1]);
00244 av_freep(&planes[p].bands[b].bufs[2]);
00245
00246 if (planes[p].bands[b].blk_vlc.cust_tab.table)
00247 ff_free_vlc(&planes[p].bands[b].blk_vlc.cust_tab);
00248 for (t = 0; t < planes[p].bands[b].num_tiles; t++)
00249 av_freep(&planes[p].bands[b].tiles[t].mbs);
00250 av_freep(&planes[p].bands[b].tiles);
00251 }
00252 av_freep(&planes[p].bands);
00253 }
00254 }
00255
00256 av_cold int ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height)
00257 {
00258 int p, b, x, y, x_tiles, y_tiles, t_width, t_height;
00259 IVIBandDesc *band;
00260 IVITile *tile, *ref_tile;
00261
00262 for (p = 0; p < 3; p++) {
00263 t_width = !p ? tile_width : (tile_width + 3) >> 2;
00264 t_height = !p ? tile_height : (tile_height + 3) >> 2;
00265
00266 if (!p && planes[0].num_bands == 4) {
00267 t_width >>= 1;
00268 t_height >>= 1;
00269 }
00270 if(t_width<=0 || t_height<=0)
00271 return AVERROR(EINVAL);
00272
00273 for (b = 0; b < planes[p].num_bands; b++) {
00274 band = &planes[p].bands[b];
00275 x_tiles = IVI_NUM_TILES(band->width, t_width);
00276 y_tiles = IVI_NUM_TILES(band->height, t_height);
00277 band->num_tiles = x_tiles * y_tiles;
00278
00279 av_freep(&band->tiles);
00280 band->tiles = av_mallocz(band->num_tiles * sizeof(IVITile));
00281 if (!band->tiles)
00282 return AVERROR(ENOMEM);
00283
00284 tile = band->tiles;
00285
00286
00287
00288 ref_tile = planes[0].bands[0].tiles;
00289
00290 for (y = 0; y < band->height; y += t_height) {
00291 for (x = 0; x < band->width; x += t_width) {
00292 tile->xpos = x;
00293 tile->ypos = y;
00294 tile->mb_size = band->mb_size;
00295 tile->width = FFMIN(band->width - x, t_width);
00296 tile->height = FFMIN(band->height - y, t_height);
00297 tile->is_empty = tile->data_size = 0;
00298
00299 tile->num_MBs = IVI_MBs_PER_TILE(tile->width, tile->height,
00300 band->mb_size);
00301
00302 av_freep(&tile->mbs);
00303 tile->mbs = av_malloc(tile->num_MBs * sizeof(IVIMbInfo));
00304 if (!tile->mbs)
00305 return AVERROR(ENOMEM);
00306
00307 tile->ref_mbs = 0;
00308 if (p || b) {
00309 tile->ref_mbs = ref_tile->mbs;
00310 ref_tile++;
00311 }
00312
00313 tile++;
00314 }
00315 }
00316
00317 }
00318 }
00319
00320 return 0;
00321 }
00322
00323 int ff_ivi_dec_tile_data_size(GetBitContext *gb)
00324 {
00325 int len;
00326
00327 len = 0;
00328 if (get_bits1(gb)) {
00329 len = get_bits(gb, 8);
00330 if (len == 255)
00331 len = get_bits_long(gb, 24);
00332 }
00333
00334
00335 align_get_bits(gb);
00336
00337 return len;
00338 }
00339
00340 int ff_ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile)
00341 {
00342 int mbn, blk, num_blocks, num_coeffs, blk_size, scan_pos, run, val,
00343 pos, is_intra, mc_type = 0, mv_x, mv_y, col_mask;
00344 uint8_t col_flags[8];
00345 int32_t prev_dc, trvec[64];
00346 uint32_t cbp, sym, lo, hi, quant, buf_offs, q;
00347 IVIMbInfo *mb;
00348 RVMapDesc *rvmap = band->rv_map;
00349 void (*mc_with_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
00350 void (*mc_no_delta_func) (int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
00351 const uint16_t *base_tab;
00352 const uint8_t *scale_tab;
00353
00354 prev_dc = 0;
00355
00356 blk_size = band->blk_size;
00357 col_mask = blk_size - 1;
00358 num_blocks = (band->mb_size != blk_size) ? 4 : 1;
00359 num_coeffs = blk_size * blk_size;
00360 if (blk_size == 8) {
00361 mc_with_delta_func = ff_ivi_mc_8x8_delta;
00362 mc_no_delta_func = ff_ivi_mc_8x8_no_delta;
00363 } else {
00364 mc_with_delta_func = ff_ivi_mc_4x4_delta;
00365 mc_no_delta_func = ff_ivi_mc_4x4_no_delta;
00366 }
00367
00368 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
00369 is_intra = !mb->type;
00370 cbp = mb->cbp;
00371 buf_offs = mb->buf_offs;
00372
00373 quant = av_clip(band->glob_quant + mb->q_delta, 0, 23);
00374
00375 base_tab = is_intra ? band->intra_base : band->inter_base;
00376 scale_tab = is_intra ? band->intra_scale : band->inter_scale;
00377 if (scale_tab)
00378 quant = scale_tab[quant];
00379
00380 if (!is_intra) {
00381 mv_x = mb->mv_x;
00382 mv_y = mb->mv_y;
00383 if (band->is_halfpel) {
00384 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
00385 mv_x >>= 1;
00386 mv_y >>= 1;
00387 }
00388 if (mb->type) {
00389 int dmv_x, dmv_y, cx, cy;
00390
00391 dmv_x = mb->mv_x >> band->is_halfpel;
00392 dmv_y = mb->mv_y >> band->is_halfpel;
00393 cx = mb->mv_x & band->is_halfpel;
00394 cy = mb->mv_y & band->is_halfpel;
00395
00396 if ( mb->xpos + dmv_x < 0
00397 || mb->xpos + dmv_x + band->mb_size + cx > band->pitch
00398 || mb->ypos + dmv_y < 0
00399 || mb->ypos + dmv_y + band->mb_size + cy > band->aheight) {
00400 return AVERROR_INVALIDDATA;
00401 }
00402 }
00403 }
00404
00405 for (blk = 0; blk < num_blocks; blk++) {
00406
00407 if (blk & 1) {
00408 buf_offs += blk_size;
00409 } else if (blk == 2) {
00410 buf_offs -= blk_size;
00411 buf_offs += blk_size * band->pitch;
00412 }
00413
00414 if (cbp & 1) {
00415 scan_pos = -1;
00416 memset(trvec, 0, num_coeffs*sizeof(trvec[0]));
00417 memset(col_flags, 0, sizeof(col_flags));
00418
00419 while (scan_pos <= num_coeffs) {
00420 sym = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
00421 if (sym == rvmap->eob_sym)
00422 break;
00423
00424 if (sym == rvmap->esc_sym) {
00425 run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1;
00426 lo = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
00427 hi = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
00428 val = IVI_TOSIGNED((hi << 6) | lo);
00429 } else {
00430 if (sym >= 256U) {
00431 av_log(NULL, AV_LOG_ERROR, "Invalid sym encountered: %d.\n", sym);
00432 return -1;
00433 }
00434 run = rvmap->runtab[sym];
00435 val = rvmap->valtab[sym];
00436 }
00437
00438
00439 scan_pos += run;
00440 if (scan_pos >= (unsigned)num_coeffs)
00441 break;
00442 pos = band->scan[scan_pos];
00443
00444 if (!val)
00445 av_dlog(NULL, "Val = 0 encountered!\n");
00446
00447 q = (base_tab[pos] * quant) >> 9;
00448 if (q > 1)
00449 val = val * q + FFSIGN(val) * (((q ^ 1) - 1) >> 1);
00450 trvec[pos] = val;
00451 col_flags[pos & col_mask] |= !!val;
00452 }
00453
00454 if (scan_pos >= num_coeffs && sym != rvmap->eob_sym)
00455 return -1;
00456
00457
00458 if (is_intra && band->is_2d_trans) {
00459 prev_dc += trvec[0];
00460 trvec[0] = prev_dc;
00461 col_flags[0] |= !!prev_dc;
00462 }
00463 if(band->transform_size > band->blk_size){
00464 av_log(0, AV_LOG_ERROR, "Too large transform\n");
00465 return AVERROR_INVALIDDATA;
00466 }
00467
00468 band->inv_transform(trvec, band->buf + buf_offs,
00469 band->pitch, col_flags);
00470
00471
00472 if (!is_intra)
00473 mc_with_delta_func(band->buf + buf_offs,
00474 band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
00475 band->pitch, mc_type);
00476 } else {
00477
00478
00479
00480 if (is_intra && band->dc_transform) {
00481 band->dc_transform(&prev_dc, band->buf + buf_offs,
00482 band->pitch, blk_size);
00483 } else
00484 mc_no_delta_func(band->buf + buf_offs,
00485 band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
00486 band->pitch, mc_type);
00487 }
00488
00489 cbp >>= 1;
00490 }
00491 }
00492
00493 align_get_bits(gb);
00494
00495 return 0;
00496 }
00497
00498 void ff_ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
00499 IVITile *tile, int32_t mv_scale)
00500 {
00501 int x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
00502 int offs, mb_offset, row_offset;
00503 IVIMbInfo *mb, *ref_mb;
00504 const int16_t *src;
00505 int16_t *dst;
00506 void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch,
00507 int mc_type);
00508
00509 if( tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size) ){
00510 av_log(avctx, AV_LOG_ERROR, "allocated tile size %d mismatches parameters %d in ff_ivi_process_empty_tile()\n",
00511 tile->num_MBs, IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size));
00512 return;
00513 }
00514
00515 offs = tile->ypos * band->pitch + tile->xpos;
00516 mb = tile->mbs;
00517 ref_mb = tile->ref_mbs;
00518 row_offset = band->mb_size * band->pitch;
00519 need_mc = 0;
00520
00521 for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
00522 mb_offset = offs;
00523
00524 for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
00525 mb->xpos = x;
00526 mb->ypos = y;
00527 mb->buf_offs = mb_offset;
00528
00529 mb->type = 1;
00530 mb->cbp = 0;
00531
00532 if (!band->qdelta_present && !band->plane && !band->band_num) {
00533 mb->q_delta = band->glob_quant;
00534 mb->mv_x = 0;
00535 mb->mv_y = 0;
00536 }
00537
00538 if (band->inherit_qdelta && ref_mb)
00539 mb->q_delta = ref_mb->q_delta;
00540
00541 if (band->inherit_mv && ref_mb) {
00542
00543 if (mv_scale) {
00544 mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
00545 mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
00546 } else {
00547 mb->mv_x = ref_mb->mv_x;
00548 mb->mv_y = ref_mb->mv_y;
00549 }
00550 need_mc |= mb->mv_x || mb->mv_y;
00551 }
00552
00553 mb++;
00554 if (ref_mb)
00555 ref_mb++;
00556 mb_offset += band->mb_size;
00557 }
00558 offs += row_offset;
00559 }
00560
00561 if (band->inherit_mv && need_mc) {
00562 num_blocks = (band->mb_size != band->blk_size) ? 4 : 1;
00563 mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
00564 : ff_ivi_mc_4x4_no_delta;
00565
00566 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
00567 mv_x = mb->mv_x;
00568 mv_y = mb->mv_y;
00569 if (!band->is_halfpel) {
00570 mc_type = 0;
00571 } else {
00572 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
00573 mv_x >>= 1;
00574 mv_y >>= 1;
00575 }
00576
00577 for (blk = 0; blk < num_blocks; blk++) {
00578
00579 offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
00580 mc_no_delta_func(band->buf + offs,
00581 band->ref_buf + offs + mv_y * band->pitch + mv_x,
00582 band->pitch, mc_type);
00583 }
00584 }
00585 } else {
00586
00587 src = band->ref_buf + tile->ypos * band->pitch + tile->xpos;
00588 dst = band->buf + tile->ypos * band->pitch + tile->xpos;
00589 for (y = 0; y < tile->height; y++) {
00590 memcpy(dst, src, tile->width*sizeof(band->buf[0]));
00591 src += band->pitch;
00592 dst += band->pitch;
00593 }
00594 }
00595 }
00596
00597
00598 #ifdef DEBUG
00599 static uint16_t ivi_calc_band_checksum(IVIBandDesc *band)
00600 {
00601 int x, y;
00602 int16_t *src, checksum;
00603
00604 src = band->buf;
00605 checksum = 0;
00606
00607 for (y = 0; y < band->height; src += band->pitch, y++)
00608 for (x = 0; x < band->width; x++)
00609 checksum += src[x];
00610
00611 return checksum;
00612 }
00613 #endif
00614
00615 void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch)
00616 {
00617 int x, y;
00618 const int16_t *src = plane->bands[0].buf;
00619 uint32_t pitch = plane->bands[0].pitch;
00620
00621 if (!src)
00622 return;
00623
00624 for (y = 0; y < plane->height; y++) {
00625 for (x = 0; x < plane->width; x++)
00626 dst[x] = av_clip_uint8(src[x] + 128);
00627 src += pitch;
00628 dst += dst_pitch;
00629 }
00630 }
00631
00640 static int decode_band(IVI45DecContext *ctx, int plane_num,
00641 IVIBandDesc *band, AVCodecContext *avctx)
00642 {
00643 int result, i, t, idx1, idx2, pos;
00644 IVITile *tile;
00645
00646 band->buf = band->bufs[ctx->dst_buf];
00647 if (!band->buf) {
00648 av_log(avctx, AV_LOG_ERROR, "Band buffer points to no data!\n");
00649 return AVERROR_INVALIDDATA;
00650 }
00651 band->ref_buf = band->bufs[ctx->ref_buf];
00652 band->data_ptr = ctx->frame_data + (get_bits_count(&ctx->gb) >> 3);
00653
00654 result = ctx->decode_band_hdr(ctx, band, avctx);
00655 if (result) {
00656 av_log(avctx, AV_LOG_ERROR, "Error while decoding band header: %d\n",
00657 result);
00658 return result;
00659 }
00660
00661 if (band->is_empty) {
00662 av_log(avctx, AV_LOG_ERROR, "Empty band encountered!\n");
00663 return AVERROR_INVALIDDATA;
00664 }
00665
00666 band->rv_map = &ctx->rvmap_tabs[band->rvmap_sel];
00667
00668
00669 for (i = 0; i < band->num_corr; i++) {
00670 idx1 = band->corr[i * 2];
00671 idx2 = band->corr[i * 2 + 1];
00672 FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
00673 FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
00674 if (idx1 == band->rv_map->eob_sym || idx2 == band->rv_map->eob_sym)
00675 band->rv_map->eob_sym ^= idx1 ^ idx2;
00676 if (idx1 == band->rv_map->esc_sym || idx2 == band->rv_map->esc_sym)
00677 band->rv_map->esc_sym ^= idx1 ^ idx2;
00678 }
00679
00680 pos = get_bits_count(&ctx->gb);
00681
00682 for (t = 0; t < band->num_tiles; t++) {
00683 tile = &band->tiles[t];
00684
00685 if (tile->mb_size != band->mb_size) {
00686 av_log(avctx, AV_LOG_ERROR, "MB sizes mismatch: %d vs. %d\n",
00687 band->mb_size, tile->mb_size);
00688 return AVERROR_INVALIDDATA;
00689 }
00690 tile->is_empty = get_bits1(&ctx->gb);
00691 if (tile->is_empty) {
00692 ff_ivi_process_empty_tile(avctx, band, tile,
00693 (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3));
00694 av_dlog(avctx, "Empty tile encountered!\n");
00695 } else {
00696 tile->data_size = ff_ivi_dec_tile_data_size(&ctx->gb);
00697 if (!tile->data_size) {
00698 av_log(avctx, AV_LOG_ERROR, "Tile data size is zero!\n");
00699 result = AVERROR_INVALIDDATA;
00700 break;
00701 }
00702
00703 result = ctx->decode_mb_info(ctx, band, tile, avctx);
00704 if (result < 0)
00705 break;
00706
00707 result = ff_ivi_decode_blocks(&ctx->gb, band, tile);
00708 if (result < 0 || ((get_bits_count(&ctx->gb) - pos) >> 3) != tile->data_size) {
00709 av_log(avctx, AV_LOG_ERROR, "Corrupted tile data encountered!\n");
00710 break;
00711 }
00712
00713 pos += tile->data_size << 3;
00714 }
00715 }
00716
00717
00718 for (i = band->num_corr-1; i >= 0; i--) {
00719 idx1 = band->corr[i*2];
00720 idx2 = band->corr[i*2+1];
00721 FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
00722 FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
00723 if (idx1 == band->rv_map->eob_sym || idx2 == band->rv_map->eob_sym)
00724 band->rv_map->eob_sym ^= idx1 ^ idx2;
00725 if (idx1 == band->rv_map->esc_sym || idx2 == band->rv_map->esc_sym)
00726 band->rv_map->esc_sym ^= idx1 ^ idx2;
00727 }
00728
00729 #ifdef DEBUG
00730 if (band->checksum_present) {
00731 uint16_t chksum = ivi_calc_band_checksum(band);
00732 if (chksum != band->checksum) {
00733 av_log(avctx, AV_LOG_ERROR,
00734 "Band checksum mismatch! Plane %d, band %d, received: %x, calculated: %x\n",
00735 band->plane, band->band_num, band->checksum, chksum);
00736 }
00737 }
00738 #endif
00739
00740 align_get_bits(&ctx->gb);
00741
00742 return result;
00743 }
00744
00745 int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
00746 AVPacket *avpkt)
00747 {
00748 IVI45DecContext *ctx = avctx->priv_data;
00749 const uint8_t *buf = avpkt->data;
00750 int buf_size = avpkt->size;
00751 int result, p, b;
00752
00753 init_get_bits(&ctx->gb, buf, buf_size * 8);
00754 ctx->frame_data = buf;
00755 ctx->frame_size = buf_size;
00756
00757 result = ctx->decode_pic_hdr(ctx, avctx);
00758 if (result || ctx->gop_invalid) {
00759 av_log(avctx, AV_LOG_ERROR,
00760 "Error while decoding picture header: %d\n", result);
00761 return -1;
00762 }
00763
00764 if (ctx->gop_flags & IVI5_IS_PROTECTED) {
00765 av_log(avctx, AV_LOG_ERROR, "Password-protected clip!\n");
00766 return -1;
00767 }
00768
00769 ctx->switch_buffers(ctx);
00770
00771
00772
00773 if (ctx->is_nonnull_frame(ctx)) {
00774 ctx->buf_invalid[ctx->dst_buf] = 1;
00775 for (p = 0; p < 3; p++) {
00776 for (b = 0; b < ctx->planes[p].num_bands; b++) {
00777 result = decode_band(ctx, p, &ctx->planes[p].bands[b], avctx);
00778 if (result) {
00779 av_log(avctx, AV_LOG_ERROR,
00780 "Error while decoding band: %d, plane: %d\n", b, p);
00781 return -1;
00782 }
00783 }
00784 }
00785 ctx->buf_invalid[ctx->dst_buf] = 0;
00786 }
00787 if (ctx->buf_invalid[ctx->dst_buf])
00788 return -1;
00789
00790
00791
00792
00793
00794
00795 if (avctx->codec_id == AV_CODEC_ID_INDEO4 && ctx->frame_type == 0) {
00796 while (get_bits(&ctx->gb, 8));
00797 skip_bits_long(&ctx->gb, 64);
00798 if (get_bits_left(&ctx->gb) > 18 && show_bits(&ctx->gb, 18) == 0x3FFF8)
00799 av_log(avctx, AV_LOG_ERROR, "Buffer contains IP frames!\n");
00800 }
00801
00802 if (!ctx->is_nonnull_frame(ctx))
00803 return buf_size;
00804
00805 if (ctx->frame.data[0])
00806 avctx->release_buffer(avctx, &ctx->frame);
00807
00808 avcodec_set_dimensions(avctx, ctx->planes[0].width, ctx->planes[0].height);
00809 ctx->frame.reference = 0;
00810 if ((result = avctx->get_buffer(avctx, &ctx->frame)) < 0) {
00811 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
00812 return result;
00813 }
00814
00815 if (ctx->is_scalable) {
00816 if (avctx->codec_id == AV_CODEC_ID_INDEO4)
00817 ff_ivi_recompose_haar(&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0], 4);
00818 else
00819 ff_ivi_recompose53 (&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0], 4);
00820 } else {
00821 ff_ivi_output_plane(&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0]);
00822 }
00823
00824 ff_ivi_output_plane(&ctx->planes[2], ctx->frame.data[1], ctx->frame.linesize[1]);
00825 ff_ivi_output_plane(&ctx->planes[1], ctx->frame.data[2], ctx->frame.linesize[2]);
00826
00827 *data_size = sizeof(AVFrame);
00828 *(AVFrame*)data = ctx->frame;
00829
00830 return buf_size;
00831 }
00832
00836 av_cold int ff_ivi_decode_close(AVCodecContext *avctx)
00837 {
00838 IVI45DecContext *ctx = avctx->priv_data;
00839
00840 ff_ivi_free_buffers(&ctx->planes[0]);
00841
00842 if (ctx->mb_vlc.cust_tab.table)
00843 ff_free_vlc(&ctx->mb_vlc.cust_tab);
00844
00845 if (ctx->frame.data[0])
00846 avctx->release_buffer(avctx, &ctx->frame);
00847
00848 #if IVI4_STREAM_ANALYSER
00849 if (avctx->codec_id == AV_CODEC_ID_INDEO4) {
00850 if (ctx->is_scalable)
00851 av_log(avctx, AV_LOG_ERROR, "This video uses scalability mode!\n");
00852 if (ctx->uses_tiling)
00853 av_log(avctx, AV_LOG_ERROR, "This video uses local decoding!\n");
00854 if (ctx->has_b_frames)
00855 av_log(avctx, AV_LOG_ERROR, "This video contains B-frames!\n");
00856 if (ctx->has_transp)
00857 av_log(avctx, AV_LOG_ERROR, "Transparency mode is enabled!\n");
00858 if (ctx->uses_haar)
00859 av_log(avctx, AV_LOG_ERROR, "This video uses Haar transform!\n");
00860 if (ctx->uses_fullpel)
00861 av_log(avctx, AV_LOG_ERROR, "This video uses fullpel motion vectors!\n");
00862 }
00863 #endif
00864
00865 return 0;
00866 }
00867
00868
00875 const IVIHuffDesc ff_ivi_mb_huff_desc[8] = {
00876 {8, {0, 4, 5, 4, 4, 4, 6, 6}},
00877 {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
00878 {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
00879 {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
00880 {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
00881 {9, {0, 4, 4, 4, 4, 3, 3, 3, 2}},
00882 {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
00883 {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
00884 };
00885
00886 const IVIHuffDesc ff_ivi_blk_huff_desc[8] = {
00887 {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
00888 {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
00889 {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
00890 {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
00891 {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
00892 {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
00893 {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
00894 {9, {3, 4, 4, 5, 5, 5, 6, 5, 5}}
00895 };
00896
00897
00901 const uint8_t ff_ivi_vertical_scan_8x8[64] = {
00902 0, 8, 16, 24, 32, 40, 48, 56,
00903 1, 9, 17, 25, 33, 41, 49, 57,
00904 2, 10, 18, 26, 34, 42, 50, 58,
00905 3, 11, 19, 27, 35, 43, 51, 59,
00906 4, 12, 20, 28, 36, 44, 52, 60,
00907 5, 13, 21, 29, 37, 45, 53, 61,
00908 6, 14, 22, 30, 38, 46, 54, 62,
00909 7, 15, 23, 31, 39, 47, 55, 63
00910 };
00911
00912 const uint8_t ff_ivi_horizontal_scan_8x8[64] = {
00913 0, 1, 2, 3, 4, 5, 6, 7,
00914 8, 9, 10, 11, 12, 13, 14, 15,
00915 16, 17, 18, 19, 20, 21, 22, 23,
00916 24, 25, 26, 27, 28, 29, 30, 31,
00917 32, 33, 34, 35, 36, 37, 38, 39,
00918 40, 41, 42, 43, 44, 45, 46, 47,
00919 48, 49, 50, 51, 52, 53, 54, 55,
00920 56, 57, 58, 59, 60, 61, 62, 63
00921 };
00922
00923 const uint8_t ff_ivi_direct_scan_4x4[16] = {
00924 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15
00925 };
00926
00927
00931 const RVMapDesc ff_ivi_rvmap_tabs[9] = {
00932 {
00933 5,
00934 2,
00935
00936 {1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3,
00937 1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5,
00938 1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1,
00939 8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9,
00940 9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3,
00941 2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12,
00942 8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13,
00943 2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8,
00944 1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8,
00945 6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21,
00946 22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8,
00947 4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6,
00948 1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28,
00949 1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41,
00950 6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1,
00951 30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
00952
00953
00954 { 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1,
00955 6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1,
00956 10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13,
00957 1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1,
00958 -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4,
00959 7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1,
00960 2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1,
00961 9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3,
00962 28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4,
00963 3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1,
00964 -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5,
00965 5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4,
00966 -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1,
00967 37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1,
00968 5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40,
00969 -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1}
00970 },{
00971
00972 0,
00973 38,
00974
00975 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7,
00976 7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16,
00977 14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
00978 25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27,
00979 33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34,
00980 37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38,
00981 40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44,
00982 57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1,
00983 52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64,
00984 60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13,
00985 12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4,
00986 1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25,
00987 21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33,
00988 29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3,
00989 28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41,
00990 2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5},
00991
00992
00993 {0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1,
00994 -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1,
00995 -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1,
00996 1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1,
00997 1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1,
00998 1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1,
00999 -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1,
01000 -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4,
01001 1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1,
01002 1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2,
01003 2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3,
01004 6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2,
01005 2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2,
01006 2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4,
01007 -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2,
01008 -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4}
01009 },{
01010
01011 2,
01012 11,
01013
01014 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5,
01015 2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2,
01016 2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13,
01017 3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7,
01018 1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3,
01019 9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22,
01020 23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32,
01021 28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31,
01022 49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3,
01023 3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57,
01024 1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2,
01025 50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1,
01026 45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17,
01027 17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55,
01028 7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4,
01029 8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62},
01030
01031
01032 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1,
01033 2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3,
01034 -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1,
01035 3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2,
01036 7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4,
01037 2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1,
01038 1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1,
01039 1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1,
01040 1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5,
01041 -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1,
01042 -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7,
01043 -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13,
01044 1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2,
01045 -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1,
01046 -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6,
01047 -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1}
01048 },{
01049
01050 0,
01051 35,
01052
01053 {0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7,
01054 7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3,
01055 3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1,
01056 5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20,
01057 21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26,
01058 9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32,
01059 2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41,
01060 35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40,
01061 12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16,
01062 43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48,
01063 57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51,
01064 8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59,
01065 59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60,
01066 60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4,
01067 25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1,
01068 20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16},
01069
01070
01071 { 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1,
01072 -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2,
01073 -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4,
01074 2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1,
01075 1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1,
01076 2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1,
01077 4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1,
01078 -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1,
01079 2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2,
01080 1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1,
01081 -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1,
01082 -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1,
01083 -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1,
01084 1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5,
01085 -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12,
01086 -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3}
01087 },{
01088
01089 0,
01090 34,
01091
01092 {0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5,
01093 2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1,
01094 2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1,
01095 9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4,
01096 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1,
01097 2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
01098 2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12,
01099 3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1,
01100 4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1,
01101 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5,
01102 1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1,
01103 5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1,
01104 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1,
01105 3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1,
01106 1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8,
01107 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1},
01108
01109
01110 { 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1,
01111 2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9,
01112 3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13,
01113 1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2,
01114 18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23,
01115 -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29,
01116 6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1,
01117 4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39,
01118 3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47,
01119 -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3,
01120 -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63,
01121 -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67,
01122 -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70,
01123 6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79,
01124 75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2,
01125 83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89}
01126 },{
01127
01128 2,
01129 33,
01130
01131 {1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1,
01132 1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1,
01133 1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1,
01134 12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2,
01135 6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3,
01136 8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2,
01137 1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4,
01138 4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1,
01139 1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2,
01140 2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13,
01141 1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31,
01142 3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2,
01143 1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8,
01144 36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1,
01145 1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4,
01146 40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7},
01147
01148
01149 { 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4,
01150 -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6,
01151 -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8,
01152 1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5,
01153 2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4,
01154 2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7,
01155 15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4,
01156 -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18,
01157 -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9,
01158 -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2,
01159 22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1,
01160 7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11,
01161 26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4,
01162 -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29,
01163 30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7,
01164 -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5}
01165 },{
01166
01167 2,
01168 13,
01169
01170 {1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2,
01171 4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1,
01172 3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9,
01173 4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2,
01174 1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1,
01175 6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7,
01176 15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1,
01177 2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1,
01178 17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1,
01179 6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1,
01180 4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2,
01181 1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1,
01182 1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1,
01183 12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6,
01184 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25,
01185 14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2},
01186
01187
01188 {-20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2,
01189 1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8,
01190 2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1,
01191 2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5,
01192 -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18,
01193 2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2,
01194 -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25,
01195 -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29,
01196 1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33,
01197 -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37,
01198 -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11,
01199 -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44,
01200 45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48,
01201 -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4,
01202 6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1,
01203 2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14}
01204 },{
01205
01206 2,
01207 38,
01208
01209 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6,
01210 6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1,
01211 1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5,
01212 14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7,
01213 8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20,
01214 19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23,
01215 24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7,
01216 26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2,
01217 28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30,
01218 32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14,
01219 6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9,
01220 37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5,
01221 3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6,
01222 1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1,
01223 8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45,
01224 12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49},
01225
01226
01227 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1,
01228 -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5,
01229 -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2,
01230 1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2,
01231 2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1,
01232 -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1,
01233 -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3,
01234 1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7,
01235 -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1,
01236 -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2,
01237 -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3,
01238 -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5,
01239 -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5,
01240 20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21,
01241 5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1,
01242 3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1}
01243 },{
01244
01245 4,
01246 11,
01247
01248 {1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2,
01249 4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1,
01250 7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9,
01251 2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4,
01252 4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8,
01253 2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4,
01254 1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21,
01255 25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1,
01256 1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2,
01257 4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30,
01258 6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1,
01259 37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41,
01260 13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42,
01261 3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15,
01262 44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7,
01263 50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1},
01264
01265
01266 { 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2,
01267 1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7,
01268 1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1,
01269 5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3,
01270 -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2,
01271 7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4,
01272 15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1,
01273 1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17,
01274 -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9,
01275 -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1,
01276 4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20,
01277 1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1,
01278 -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1,
01279 8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2,
01280 1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5,
01281 1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26}
01282 }
01283 };