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