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