00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00029 #define ALT_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
00127 for (i = 0; i < new_huff.num_rows; i++)
00128 new_huff.xbits[i] = get_bits(gb, 4);
00129
00130
00131 if (ff_ivi_huff_desc_cmp(&new_huff, &huff_tab->cust_desc)) {
00132 ff_ivi_huff_desc_copy(&huff_tab->cust_desc, &new_huff);
00133
00134 if (huff_tab->cust_tab.table)
00135 free_vlc(&huff_tab->cust_tab);
00136 result = ff_ivi_create_huff_from_desc(&huff_tab->cust_desc,
00137 &huff_tab->cust_tab, 0);
00138 if (result) {
00139 av_log(avctx, AV_LOG_ERROR,
00140 "Error while initializing custom vlc table!\n");
00141 return -1;
00142 }
00143 }
00144 huff_tab->tab = &huff_tab->cust_tab;
00145 } else {
00146
00147 huff_tab->tab = (which_tab) ? &ff_ivi_blk_vlc_tabs[huff_tab->tab_sel]
00148 : &ff_ivi_mb_vlc_tabs [huff_tab->tab_sel];
00149 }
00150 }
00151
00152 return 0;
00153 }
00154
00155 int ff_ivi_huff_desc_cmp(const IVIHuffDesc *desc1, const IVIHuffDesc *desc2)
00156 {
00157 return desc1->num_rows != desc2->num_rows
00158 || memcmp(desc1->xbits, desc2->xbits, desc1->num_rows);
00159 }
00160
00161 void ff_ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src)
00162 {
00163 dst->num_rows = src->num_rows;
00164 memcpy(dst->xbits, src->xbits, src->num_rows);
00165 }
00166
00167 int av_cold ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg)
00168 {
00169 int p, b;
00170 uint32_t b_width, b_height, align_fac, width_aligned, height_aligned, buf_size;
00171 IVIBandDesc *band;
00172
00173 ff_ivi_free_buffers(planes);
00174
00175
00176 planes[0].width = cfg->pic_width;
00177 planes[0].height = cfg->pic_height;
00178 planes[0].num_bands = cfg->luma_bands;
00179
00180
00181 planes[1].width = planes[2].width = (cfg->pic_width + 3) >> 2;
00182 planes[1].height = planes[2].height = (cfg->pic_height + 3) >> 2;
00183 planes[1].num_bands = planes[2].num_bands = cfg->chroma_bands;
00184
00185 for (p = 0; p < 3; p++) {
00186 planes[p].bands = av_mallocz(planes[p].num_bands * sizeof(IVIBandDesc));
00187 if (!planes[p].bands)
00188 return AVERROR(ENOMEM);
00189
00190
00191
00192
00193 b_width = planes[p].num_bands == 1 ? planes[p].width : (planes[p].width + 1) >> 1;
00194 b_height = planes[p].num_bands == 1 ? planes[p].height : (planes[p].height + 1) >> 1;
00195
00196
00197
00198 align_fac = p ? 8 : 16;
00199 width_aligned = FFALIGN(b_width , align_fac);
00200 height_aligned = FFALIGN(b_height, align_fac);
00201 buf_size = width_aligned * height_aligned * sizeof(int16_t);
00202
00203 for (b = 0; b < planes[p].num_bands; b++) {
00204 band = &planes[p].bands[b];
00205 band->plane = p;
00206 band->band_num = b;
00207 band->width = b_width;
00208 band->height = b_height;
00209 band->pitch = width_aligned;
00210 band->bufs[0] = av_malloc(buf_size);
00211 band->bufs[1] = av_malloc(buf_size);
00212 if (!band->bufs[0] || !band->bufs[1])
00213 return AVERROR(ENOMEM);
00214
00215
00216 if (cfg->luma_bands > 1) {
00217 band->bufs[2] = av_malloc(buf_size);
00218 if (!band->bufs[2])
00219 return AVERROR(ENOMEM);
00220 }
00221
00222 planes[p].bands[0].blk_vlc.cust_desc.num_rows = 0;
00223 }
00224 }
00225
00226 return 0;
00227 }
00228
00229 void av_cold ff_ivi_free_buffers(IVIPlaneDesc *planes)
00230 {
00231 int p, b, t;
00232
00233 for (p = 0; p < 3; p++) {
00234 for (b = 0; b < planes[p].num_bands; b++) {
00235 av_freep(&planes[p].bands[b].bufs[0]);
00236 av_freep(&planes[p].bands[b].bufs[1]);
00237 av_freep(&planes[p].bands[b].bufs[2]);
00238
00239 if (planes[p].bands[b].blk_vlc.cust_tab.table)
00240 free_vlc(&planes[p].bands[b].blk_vlc.cust_tab);
00241 for (t = 0; t < planes[p].bands[b].num_tiles; t++)
00242 av_freep(&planes[p].bands[b].tiles[t].mbs);
00243 av_freep(&planes[p].bands[b].tiles);
00244 }
00245 av_freep(&planes[p].bands);
00246 }
00247 }
00248
00249 int av_cold ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height)
00250 {
00251 int p, b, x, y, x_tiles, y_tiles, t_width, t_height;
00252 IVIBandDesc *band;
00253 IVITile *tile, *ref_tile;
00254
00255 for (p = 0; p < 3; p++) {
00256 t_width = !p ? tile_width : (tile_width + 3) >> 2;
00257 t_height = !p ? tile_height : (tile_height + 3) >> 2;
00258
00259 if (!p && planes[0].num_bands == 4) {
00260 t_width >>= 1;
00261 t_height >>= 1;
00262 }
00263
00264 for (b = 0; b < planes[p].num_bands; b++) {
00265 band = &planes[p].bands[b];
00266 x_tiles = IVI_NUM_TILES(band->width, t_width);
00267 y_tiles = IVI_NUM_TILES(band->height, t_height);
00268 band->num_tiles = x_tiles * y_tiles;
00269
00270 av_freep(&band->tiles);
00271 band->tiles = av_mallocz(band->num_tiles * sizeof(IVITile));
00272 if (!band->tiles)
00273 return AVERROR(ENOMEM);
00274
00275 tile = band->tiles;
00276
00277
00278
00279 ref_tile = planes[0].bands[0].tiles;
00280
00281 for (y = 0; y < band->height; y += t_height) {
00282 for (x = 0; x < band->width; x += t_width) {
00283 tile->xpos = x;
00284 tile->ypos = y;
00285 tile->width = FFMIN(band->width - x, t_width);
00286 tile->height = FFMIN(band->height - y, t_height);
00287 tile->is_empty = tile->data_size = 0;
00288
00289 tile->num_MBs = IVI_MBs_PER_TILE(tile->width, tile->height,
00290 band->mb_size);
00291
00292 av_freep(&tile->mbs);
00293 tile->mbs = av_malloc(tile->num_MBs * sizeof(IVIMbInfo));
00294 if (!tile->mbs)
00295 return AVERROR(ENOMEM);
00296
00297 tile->ref_mbs = 0;
00298 if (p || b) {
00299 tile->ref_mbs = ref_tile->mbs;
00300 ref_tile++;
00301 }
00302
00303 tile++;
00304 }
00305 }
00306
00307 }
00308 }
00309
00310 return 0;
00311 }
00312
00313 int ff_ivi_dec_tile_data_size(GetBitContext *gb)
00314 {
00315 int len;
00316
00317 len = 0;
00318 if (get_bits1(gb)) {
00319 len = get_bits(gb, 8);
00320 if (len == 255)
00321 len = get_bits_long(gb, 24);
00322 }
00323
00324
00325 align_get_bits(gb);
00326
00327 return len;
00328 }
00329
00330 int ff_ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile)
00331 {
00332 int mbn, blk, num_blocks, num_coeffs, blk_size, scan_pos, run, val,
00333 pos, is_intra, mc_type, mv_x, mv_y, col_mask;
00334 uint8_t col_flags[8];
00335 int32_t prev_dc, trvec[64];
00336 uint32_t cbp, sym, lo, hi, quant, buf_offs, q;
00337 IVIMbInfo *mb;
00338 RVMapDesc *rvmap = band->rv_map;
00339 void (*mc_with_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
00340 void (*mc_no_delta_func) (int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
00341 const uint16_t *base_tab;
00342 const uint8_t *scale_tab;
00343
00344 prev_dc = 0;
00345
00346 blk_size = band->blk_size;
00347 col_mask = blk_size - 1;
00348 num_blocks = (band->mb_size != blk_size) ? 4 : 1;
00349 num_coeffs = blk_size * blk_size;
00350 if (blk_size == 8) {
00351 mc_with_delta_func = ff_ivi_mc_8x8_delta;
00352 mc_no_delta_func = ff_ivi_mc_8x8_no_delta;
00353 } else {
00354 mc_with_delta_func = ff_ivi_mc_4x4_delta;
00355 mc_no_delta_func = ff_ivi_mc_4x4_no_delta;
00356 }
00357
00358 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
00359 is_intra = !mb->type;
00360 cbp = mb->cbp;
00361 buf_offs = mb->buf_offs;
00362
00363 quant = av_clip(band->glob_quant + mb->q_delta, 0, 23);
00364
00365 base_tab = is_intra ? band->intra_base : band->inter_base;
00366 scale_tab = is_intra ? band->intra_scale : band->inter_scale;
00367 if (scale_tab)
00368 quant = scale_tab[quant];
00369
00370 if (!is_intra) {
00371 mv_x = mb->mv_x;
00372 mv_y = mb->mv_y;
00373 if (!band->is_halfpel) {
00374 mc_type = 0;
00375 } else {
00376 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
00377 mv_x >>= 1;
00378 mv_y >>= 1;
00379 }
00380 }
00381
00382 for (blk = 0; blk < num_blocks; blk++) {
00383
00384 if (blk & 1) {
00385 buf_offs += blk_size;
00386 } else if (blk == 2) {
00387 buf_offs -= blk_size;
00388 buf_offs += blk_size * band->pitch;
00389 }
00390
00391 if (cbp & 1) {
00392 scan_pos = -1;
00393 memset(trvec, 0, num_coeffs*sizeof(trvec[0]));
00394 memset(col_flags, 0, sizeof(col_flags));
00395
00396 while (scan_pos <= num_coeffs) {
00397 sym = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
00398 if (sym == rvmap->eob_sym)
00399 break;
00400
00401 if (sym == rvmap->esc_sym) {
00402 run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1;
00403 lo = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
00404 hi = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
00405 val = IVI_TOSIGNED((hi << 6) | lo);
00406 } else {
00407 if (sym >= 256U) {
00408 av_log(NULL, AV_LOG_ERROR, "Invalid sym encountered: %d.\n", sym);
00409 return -1;
00410 }
00411 run = rvmap->runtab[sym];
00412 val = rvmap->valtab[sym];
00413 }
00414
00415
00416 scan_pos += run;
00417 if (scan_pos >= num_coeffs)
00418 break;
00419 pos = band->scan[scan_pos];
00420
00421 if (!val)
00422 av_dlog(NULL, "Val = 0 encountered!\n");
00423
00424 q = (base_tab[pos] * quant) >> 9;
00425 if (q > 1)
00426 val = val * q + FFSIGN(val) * (((q ^ 1) - 1) >> 1);
00427 trvec[pos] = val;
00428 col_flags[pos & col_mask] |= !!val;
00429 }
00430
00431 if (scan_pos >= num_coeffs && sym != rvmap->eob_sym)
00432 return -1;
00433
00434
00435 if (is_intra && band->is_2d_trans) {
00436 prev_dc += trvec[0];
00437 trvec[0] = prev_dc;
00438 col_flags[0] |= !!prev_dc;
00439 }
00440
00441
00442 band->inv_transform(trvec, band->buf + buf_offs,
00443 band->pitch, col_flags);
00444
00445
00446 if (!is_intra)
00447 mc_with_delta_func(band->buf + buf_offs,
00448 band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
00449 band->pitch, mc_type);
00450 } else {
00451
00452
00453
00454 if (is_intra && band->dc_transform) {
00455 band->dc_transform(&prev_dc, band->buf + buf_offs,
00456 band->pitch, blk_size);
00457 } else
00458 mc_no_delta_func(band->buf + buf_offs,
00459 band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
00460 band->pitch, mc_type);
00461 }
00462
00463 cbp >>= 1;
00464 }
00465 }
00466
00467 align_get_bits(gb);
00468
00469 return 0;
00470 }
00471
00472 void ff_ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
00473 IVITile *tile, int32_t mv_scale)
00474 {
00475 int x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
00476 int offs, mb_offset, row_offset;
00477 IVIMbInfo *mb, *ref_mb;
00478 const int16_t *src;
00479 int16_t *dst;
00480 void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch,
00481 int mc_type);
00482
00483 offs = tile->ypos * band->pitch + tile->xpos;
00484 mb = tile->mbs;
00485 ref_mb = tile->ref_mbs;
00486 row_offset = band->mb_size * band->pitch;
00487 need_mc = 0;
00488
00489 for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
00490 mb_offset = offs;
00491
00492 for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
00493 mb->xpos = x;
00494 mb->ypos = y;
00495 mb->buf_offs = mb_offset;
00496
00497 mb->type = 1;
00498 mb->cbp = 0;
00499
00500 if (!band->qdelta_present && !band->plane && !band->band_num) {
00501 mb->q_delta = band->glob_quant;
00502 mb->mv_x = 0;
00503 mb->mv_y = 0;
00504 }
00505
00506 if (band->inherit_qdelta && ref_mb)
00507 mb->q_delta = ref_mb->q_delta;
00508
00509 if (band->inherit_mv) {
00510
00511 if (mv_scale) {
00512 mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
00513 mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
00514 } else {
00515 mb->mv_x = ref_mb->mv_x;
00516 mb->mv_y = ref_mb->mv_y;
00517 }
00518 need_mc |= mb->mv_x || mb->mv_y;
00519 }
00520
00521 mb++;
00522 if (ref_mb)
00523 ref_mb++;
00524 mb_offset += band->mb_size;
00525 }
00526 offs += row_offset;
00527 }
00528
00529 if (band->inherit_mv && need_mc) {
00530 num_blocks = (band->mb_size != band->blk_size) ? 4 : 1;
00531 mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
00532 : ff_ivi_mc_4x4_no_delta;
00533
00534 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
00535 mv_x = mb->mv_x;
00536 mv_y = mb->mv_y;
00537 if (!band->is_halfpel) {
00538 mc_type = 0;
00539 } else {
00540 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
00541 mv_x >>= 1;
00542 mv_y >>= 1;
00543 }
00544
00545 for (blk = 0; blk < num_blocks; blk++) {
00546
00547 offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
00548 mc_no_delta_func(band->buf + offs,
00549 band->ref_buf + offs + mv_y * band->pitch + mv_x,
00550 band->pitch, mc_type);
00551 }
00552 }
00553 } else {
00554
00555 src = band->ref_buf + tile->ypos * band->pitch + tile->xpos;
00556 dst = band->buf + tile->ypos * band->pitch + tile->xpos;
00557 for (y = 0; y < tile->height; y++) {
00558 memcpy(dst, src, tile->width*sizeof(band->buf[0]));
00559 src += band->pitch;
00560 dst += band->pitch;
00561 }
00562 }
00563 }
00564
00565
00566 #ifdef DEBUG
00567 uint16_t ivi_calc_band_checksum (IVIBandDesc *band)
00568 {
00569 int x, y;
00570 int16_t *src, checksum;
00571
00572 src = band->buf;
00573 checksum = 0;
00574
00575 for (y = 0; y < band->height; src += band->pitch, y++)
00576 for (x = 0; x < band->width; x++)
00577 checksum += src[x];
00578
00579 return checksum;
00580 }
00581
00582 int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch)
00583 {
00584 int x, y, result;
00585 uint8_t t1, t2;
00586 int16_t *src;
00587
00588 src = band->buf;
00589 result = 0;
00590
00591 for (y = 0; y < band->height; src += band->pitch, y++) {
00592 for (x = 0; x < band->width; x++) {
00593 t1 = av_clip(src[x] + 128, 0, 255);
00594 t2 = ref[x];
00595 if (t1 != t2) {
00596 av_log(NULL, AV_LOG_ERROR, "Data mismatch: row %d, column %d\n",
00597 y / band->blk_size, x / band->blk_size);
00598 result = -1;
00599 }
00600 }
00601 ref += pitch;
00602 }
00603
00604 return result;
00605 }
00606 #endif
00607
00608 void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch)
00609 {
00610 int x, y;
00611 const int16_t *src = plane->bands[0].buf;
00612 uint32_t pitch = plane->bands[0].pitch;
00613
00614 for (y = 0; y < plane->height; y++) {
00615 for (x = 0; x < plane->width; x++)
00616 dst[x] = av_clip_uint8(src[x] + 128);
00617 src += pitch;
00618 dst += dst_pitch;
00619 }
00620 }
00621
00622
00629 const IVIHuffDesc ff_ivi_mb_huff_desc[8] = {
00630 {8, {0, 4, 5, 4, 4, 4, 6, 6}},
00631 {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
00632 {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
00633 {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
00634 {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
00635 {9, {0, 4, 4, 4, 4, 3, 3, 3, 2}},
00636 {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
00637 {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
00638 };
00639
00640 const IVIHuffDesc ff_ivi_blk_huff_desc[8] = {
00641 {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
00642 {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
00643 {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
00644 {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
00645 {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
00646 {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
00647 {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
00648 {9, {3, 4, 4, 5, 5, 5, 6, 5, 5}}
00649 };
00650
00651
00655 const uint8_t ff_ivi_vertical_scan_8x8[64] = {
00656 0, 8, 16, 24, 32, 40, 48, 56,
00657 1, 9, 17, 25, 33, 41, 49, 57,
00658 2, 10, 18, 26, 34, 42, 50, 58,
00659 3, 11, 19, 27, 35, 43, 51, 59,
00660 4, 12, 20, 28, 36, 44, 52, 60,
00661 5, 13, 21, 29, 37, 45, 53, 61,
00662 6, 14, 22, 30, 38, 46, 54, 62,
00663 7, 15, 23, 31, 39, 47, 55, 63
00664 };
00665
00666 const uint8_t ff_ivi_horizontal_scan_8x8[64] = {
00667 0, 1, 2, 3, 4, 5, 6, 7,
00668 8, 9, 10, 11, 12, 13, 14, 15,
00669 16, 17, 18, 19, 20, 21, 22, 23,
00670 24, 25, 26, 27, 28, 29, 30, 31,
00671 32, 33, 34, 35, 36, 37, 38, 39,
00672 40, 41, 42, 43, 44, 45, 46, 47,
00673 48, 49, 50, 51, 52, 53, 54, 55,
00674 56, 57, 58, 59, 60, 61, 62, 63
00675 };
00676
00677 const uint8_t ff_ivi_direct_scan_4x4[16] = {
00678 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15
00679 };
00680
00681
00685 const RVMapDesc ff_ivi_rvmap_tabs[9] = {
00686 {
00687 5,
00688 2,
00689
00690 {1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3,
00691 1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5,
00692 1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1,
00693 8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9,
00694 9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3,
00695 2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12,
00696 8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13,
00697 2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8,
00698 1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8,
00699 6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21,
00700 22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8,
00701 4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6,
00702 1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28,
00703 1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41,
00704 6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1,
00705 30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
00706
00707
00708 { 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1,
00709 6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1,
00710 10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13,
00711 1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1,
00712 -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4,
00713 7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1,
00714 2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1,
00715 9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3,
00716 28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4,
00717 3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1,
00718 -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5,
00719 5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4,
00720 -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1,
00721 37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1,
00722 5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40,
00723 -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1}
00724 },{
00725
00726 0,
00727 38,
00728
00729 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7,
00730 7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16,
00731 14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
00732 25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27,
00733 33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34,
00734 37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38,
00735 40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44,
00736 57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1,
00737 52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64,
00738 60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13,
00739 12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4,
00740 1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25,
00741 21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33,
00742 29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3,
00743 28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41,
00744 2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5},
00745
00746
00747 {0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1,
00748 -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1,
00749 -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1,
00750 1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1,
00751 1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1,
00752 1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1,
00753 -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1,
00754 -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4,
00755 1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1,
00756 1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2,
00757 2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3,
00758 6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2,
00759 2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2,
00760 2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4,
00761 -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2,
00762 -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4}
00763 },{
00764
00765 2,
00766 11,
00767
00768 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5,
00769 2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2,
00770 2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13,
00771 3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7,
00772 1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3,
00773 9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22,
00774 23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32,
00775 28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31,
00776 49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3,
00777 3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57,
00778 1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2,
00779 50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1,
00780 45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17,
00781 17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55,
00782 7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4,
00783 8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62},
00784
00785
00786 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1,
00787 2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3,
00788 -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1,
00789 3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2,
00790 7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4,
00791 2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1,
00792 1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1,
00793 1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1,
00794 1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5,
00795 -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1,
00796 -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7,
00797 -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13,
00798 1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2,
00799 -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1,
00800 -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6,
00801 -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1}
00802 },{
00803
00804 0,
00805 35,
00806
00807 {0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7,
00808 7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3,
00809 3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1,
00810 5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20,
00811 21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26,
00812 9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32,
00813 2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41,
00814 35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40,
00815 12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16,
00816 43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48,
00817 57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51,
00818 8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59,
00819 59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60,
00820 60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4,
00821 25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1,
00822 20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16},
00823
00824
00825 { 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1,
00826 -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2,
00827 -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4,
00828 2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1,
00829 1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1,
00830 2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1,
00831 4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1,
00832 -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1,
00833 2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2,
00834 1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1,
00835 -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1,
00836 -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1,
00837 -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1,
00838 1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5,
00839 -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12,
00840 -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3}
00841 },{
00842
00843 0,
00844 34,
00845
00846 {0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5,
00847 2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1,
00848 2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1,
00849 9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4,
00850 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1,
00851 2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
00852 2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12,
00853 3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1,
00854 4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1,
00855 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5,
00856 1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1,
00857 5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1,
00858 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1,
00859 3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1,
00860 1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8,
00861 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1},
00862
00863
00864 { 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1,
00865 2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9,
00866 3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13,
00867 1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2,
00868 18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23,
00869 -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29,
00870 6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1,
00871 4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39,
00872 3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47,
00873 -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3,
00874 -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63,
00875 -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67,
00876 -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70,
00877 6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79,
00878 75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2,
00879 83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89}
00880 },{
00881
00882 2,
00883 33,
00884
00885 {1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1,
00886 1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1,
00887 1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1,
00888 12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2,
00889 6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3,
00890 8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2,
00891 1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4,
00892 4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1,
00893 1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2,
00894 2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13,
00895 1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31,
00896 3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2,
00897 1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8,
00898 36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1,
00899 1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4,
00900 40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7},
00901
00902
00903 { 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4,
00904 -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6,
00905 -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8,
00906 1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5,
00907 2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4,
00908 2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7,
00909 15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4,
00910 -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18,
00911 -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9,
00912 -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2,
00913 22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1,
00914 7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11,
00915 26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4,
00916 -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29,
00917 30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7,
00918 -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5}
00919 },{
00920
00921 2,
00922 13,
00923
00924 {1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2,
00925 4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1,
00926 3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9,
00927 4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2,
00928 1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1,
00929 6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7,
00930 15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1,
00931 2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1,
00932 17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1,
00933 6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1,
00934 4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2,
00935 1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1,
00936 1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1,
00937 12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6,
00938 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25,
00939 14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2},
00940
00941
00942 {-20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2,
00943 1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8,
00944 2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1,
00945 2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5,
00946 -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18,
00947 2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2,
00948 -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25,
00949 -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29,
00950 1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33,
00951 -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37,
00952 -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11,
00953 -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44,
00954 45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48,
00955 -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4,
00956 6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1,
00957 2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14}
00958 },{
00959
00960 2,
00961 38,
00962
00963 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6,
00964 6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1,
00965 1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5,
00966 14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7,
00967 8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20,
00968 19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23,
00969 24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7,
00970 26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2,
00971 28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30,
00972 32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14,
00973 6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9,
00974 37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5,
00975 3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6,
00976 1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1,
00977 8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45,
00978 12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49},
00979
00980
00981 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1,
00982 -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5,
00983 -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2,
00984 1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2,
00985 2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1,
00986 -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1,
00987 -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3,
00988 1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7,
00989 -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1,
00990 -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2,
00991 -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3,
00992 -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5,
00993 -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5,
00994 20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21,
00995 5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1,
00996 3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1}
00997 },{
00998
00999 4,
01000 11,
01001
01002 {1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2,
01003 4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1,
01004 7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9,
01005 2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4,
01006 4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8,
01007 2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4,
01008 1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21,
01009 25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1,
01010 1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2,
01011 4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30,
01012 6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1,
01013 37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41,
01014 13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42,
01015 3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15,
01016 44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7,
01017 50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1},
01018
01019
01020 { 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2,
01021 1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7,
01022 1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1,
01023 5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3,
01024 -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2,
01025 7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4,
01026 15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1,
01027 1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17,
01028 -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9,
01029 -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1,
01030 4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20,
01031 1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1,
01032 -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1,
01033 8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2,
01034 1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5,
01035 1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26}
01036 }
01037 };