annotate ffmpeg/libavcodec/ivi_common.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * common functions for Indeo Video Interactive codecs (Indeo4 and Indeo5)
yading@10 3 *
yading@10 4 * Copyright (c) 2009 Maxim Poliakovski
yading@10 5 *
yading@10 6 * This file is part of FFmpeg.
yading@10 7 *
yading@10 8 * FFmpeg is free software; you can redistribute it and/or
yading@10 9 * modify it under the terms of the GNU Lesser General Public
yading@10 10 * License as published by the Free Software Foundation; either
yading@10 11 * version 2.1 of the License, or (at your option) any later version.
yading@10 12 *
yading@10 13 * FFmpeg is distributed in the hope that it will be useful,
yading@10 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 16 * Lesser General Public License for more details.
yading@10 17 *
yading@10 18 * You should have received a copy of the GNU Lesser General Public
yading@10 19 * License along with FFmpeg; if not, write to the Free Software
yading@10 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 21 */
yading@10 22
yading@10 23 /**
yading@10 24 * @file
yading@10 25 * This file contains functions and data shared by both Indeo4 and
yading@10 26 * Indeo5 decoders.
yading@10 27 */
yading@10 28
yading@10 29 #define BITSTREAM_READER_LE
yading@10 30 #include "libavutil/attributes.h"
yading@10 31 #include "avcodec.h"
yading@10 32 #include "get_bits.h"
yading@10 33 #include "internal.h"
yading@10 34 #include "mathops.h"
yading@10 35 #include "ivi_common.h"
yading@10 36 #include "ivi_dsp.h"
yading@10 37
yading@10 38 extern const IVIHuffDesc ff_ivi_mb_huff_desc[8]; ///< static macroblock huffman tables
yading@10 39 extern const IVIHuffDesc ff_ivi_blk_huff_desc[8]; ///< static block huffman tables
yading@10 40
yading@10 41 static VLC ivi_mb_vlc_tabs [8]; ///< static macroblock Huffman tables
yading@10 42 static VLC ivi_blk_vlc_tabs[8]; ///< static block Huffman tables
yading@10 43
yading@10 44 /**
yading@10 45 * Reverse "nbits" bits of the value "val" and return the result
yading@10 46 * in the least significant bits.
yading@10 47 */
yading@10 48 static uint16_t inv_bits(uint16_t val, int nbits)
yading@10 49 {
yading@10 50 uint16_t res;
yading@10 51
yading@10 52 if (nbits <= 8) {
yading@10 53 res = ff_reverse[val] >> (8-nbits);
yading@10 54 } else
yading@10 55 res = ((ff_reverse[val & 0xFF] << 8) + (ff_reverse[val >> 8])) >> (16-nbits);
yading@10 56
yading@10 57 return res;
yading@10 58 }
yading@10 59
yading@10 60 /*
yading@10 61 * Generate a huffman codebook from the given descriptor
yading@10 62 * and convert it into the FFmpeg VLC table.
yading@10 63 *
yading@10 64 * @param[in] cb pointer to codebook descriptor
yading@10 65 * @param[out] vlc where to place the generated VLC table
yading@10 66 * @param[in] flag flag: 1 - for static or 0 for dynamic tables
yading@10 67 * @return result code: 0 - OK, -1 = error (invalid codebook descriptor)
yading@10 68 */
yading@10 69 static int ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag)
yading@10 70 {
yading@10 71 int pos, i, j, codes_per_row, prefix, not_last_row;
yading@10 72 uint16_t codewords[256]; /* FIXME: move this temporal storage out? */
yading@10 73 uint8_t bits[256];
yading@10 74
yading@10 75 pos = 0; /* current position = 0 */
yading@10 76
yading@10 77 for (i = 0; i < cb->num_rows; i++) {
yading@10 78 codes_per_row = 1 << cb->xbits[i];
yading@10 79 not_last_row = (i != cb->num_rows - 1);
yading@10 80 prefix = ((1 << i) - 1) << (cb->xbits[i] + not_last_row);
yading@10 81
yading@10 82 for (j = 0; j < codes_per_row; j++) {
yading@10 83 if (pos >= 256) /* Some Indeo5 codebooks can have more than 256 */
yading@10 84 break; /* elements, but only 256 codes are allowed! */
yading@10 85
yading@10 86 bits[pos] = i + cb->xbits[i] + not_last_row;
yading@10 87 if (bits[pos] > IVI_VLC_BITS)
yading@10 88 return -1; /* invalid descriptor */
yading@10 89
yading@10 90 codewords[pos] = inv_bits((prefix | j), bits[pos]);
yading@10 91 if (!bits[pos])
yading@10 92 bits[pos] = 1;
yading@10 93
yading@10 94 pos++;
yading@10 95 }//for j
yading@10 96 }//for i
yading@10 97
yading@10 98 /* number of codewords = pos */
yading@10 99 return init_vlc(vlc, IVI_VLC_BITS, pos, bits, 1, 1, codewords, 2, 2,
yading@10 100 (flag ? INIT_VLC_USE_NEW_STATIC : 0) | INIT_VLC_LE);
yading@10 101 }
yading@10 102
yading@10 103 void ff_ivi_init_static_vlc(void)
yading@10 104 {
yading@10 105 int i;
yading@10 106 static VLC_TYPE table_data[8192 * 16][2];
yading@10 107 static int initialized_vlcs = 0;
yading@10 108
yading@10 109 if (initialized_vlcs)
yading@10 110 return;
yading@10 111 for (i = 0; i < 8; i++) {
yading@10 112 ivi_mb_vlc_tabs[i].table = table_data + i * 2 * 8192;
yading@10 113 ivi_mb_vlc_tabs[i].table_allocated = 8192;
yading@10 114 ivi_create_huff_from_desc(&ff_ivi_mb_huff_desc[i], &ivi_mb_vlc_tabs[i], 1);
yading@10 115 ivi_blk_vlc_tabs[i].table = table_data + (i * 2 + 1) * 8192;
yading@10 116 ivi_blk_vlc_tabs[i].table_allocated = 8192;
yading@10 117 ivi_create_huff_from_desc(&ff_ivi_blk_huff_desc[i], &ivi_blk_vlc_tabs[i], 1);
yading@10 118 }
yading@10 119 initialized_vlcs = 1;
yading@10 120 }
yading@10 121
yading@10 122 /*
yading@10 123 * Copy huffman codebook descriptors.
yading@10 124 *
yading@10 125 * @param[out] dst ptr to the destination descriptor
yading@10 126 * @param[in] src ptr to the source descriptor
yading@10 127 */
yading@10 128 static void ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src)
yading@10 129 {
yading@10 130 dst->num_rows = src->num_rows;
yading@10 131 memcpy(dst->xbits, src->xbits, src->num_rows);
yading@10 132 }
yading@10 133
yading@10 134 /*
yading@10 135 * Compare two huffman codebook descriptors.
yading@10 136 *
yading@10 137 * @param[in] desc1 ptr to the 1st descriptor to compare
yading@10 138 * @param[in] desc2 ptr to the 2nd descriptor to compare
yading@10 139 * @return comparison result: 0 - equal, 1 - not equal
yading@10 140 */
yading@10 141 static int ivi_huff_desc_cmp(const IVIHuffDesc *desc1, const IVIHuffDesc *desc2)
yading@10 142 {
yading@10 143 return desc1->num_rows != desc2->num_rows
yading@10 144 || memcmp(desc1->xbits, desc2->xbits, desc1->num_rows);
yading@10 145 }
yading@10 146
yading@10 147 int ff_ivi_dec_huff_desc(GetBitContext *gb, int desc_coded, int which_tab,
yading@10 148 IVIHuffTab *huff_tab, AVCodecContext *avctx)
yading@10 149 {
yading@10 150 int i, result;
yading@10 151 IVIHuffDesc new_huff;
yading@10 152
yading@10 153 if (!desc_coded) {
yading@10 154 /* select default table */
yading@10 155 huff_tab->tab = (which_tab) ? &ivi_blk_vlc_tabs[7]
yading@10 156 : &ivi_mb_vlc_tabs [7];
yading@10 157 } else {
yading@10 158 huff_tab->tab_sel = get_bits(gb, 3);
yading@10 159 if (huff_tab->tab_sel == 7) {
yading@10 160 /* custom huffman table (explicitly encoded) */
yading@10 161 new_huff.num_rows = get_bits(gb, 4);
yading@10 162 if (!new_huff.num_rows) {
yading@10 163 av_log(avctx, AV_LOG_ERROR, "Empty custom Huffman table!\n");
yading@10 164 return AVERROR_INVALIDDATA;
yading@10 165 }
yading@10 166
yading@10 167 for (i = 0; i < new_huff.num_rows; i++)
yading@10 168 new_huff.xbits[i] = get_bits(gb, 4);
yading@10 169
yading@10 170 /* Have we got the same custom table? Rebuild if not. */
yading@10 171 if (ivi_huff_desc_cmp(&new_huff, &huff_tab->cust_desc) || !huff_tab->cust_tab.table) {
yading@10 172 ivi_huff_desc_copy(&huff_tab->cust_desc, &new_huff);
yading@10 173
yading@10 174 if (huff_tab->cust_tab.table)
yading@10 175 ff_free_vlc(&huff_tab->cust_tab);
yading@10 176 result = ivi_create_huff_from_desc(&huff_tab->cust_desc,
yading@10 177 &huff_tab->cust_tab, 0);
yading@10 178 if (result) {
yading@10 179 huff_tab->cust_desc.num_rows = 0; // reset faulty description
yading@10 180 av_log(avctx, AV_LOG_ERROR,
yading@10 181 "Error while initializing custom vlc table!\n");
yading@10 182 return result;
yading@10 183 }
yading@10 184 }
yading@10 185 huff_tab->tab = &huff_tab->cust_tab;
yading@10 186 } else {
yading@10 187 /* select one of predefined tables */
yading@10 188 huff_tab->tab = (which_tab) ? &ivi_blk_vlc_tabs[huff_tab->tab_sel]
yading@10 189 : &ivi_mb_vlc_tabs [huff_tab->tab_sel];
yading@10 190 }
yading@10 191 }
yading@10 192
yading@10 193 return 0;
yading@10 194 }
yading@10 195
yading@10 196 /*
yading@10 197 * Free planes, bands and macroblocks buffers.
yading@10 198 *
yading@10 199 * @param[in] planes pointer to the array of the plane descriptors
yading@10 200 */
yading@10 201 static av_cold void ivi_free_buffers(IVIPlaneDesc *planes)
yading@10 202 {
yading@10 203 int p, b, t;
yading@10 204
yading@10 205 for (p = 0; p < 3; p++) {
yading@10 206 if (planes[p].bands)
yading@10 207 for (b = 0; b < planes[p].num_bands; b++) {
yading@10 208 av_freep(&planes[p].bands[b].bufs[0]);
yading@10 209 av_freep(&planes[p].bands[b].bufs[1]);
yading@10 210 av_freep(&planes[p].bands[b].bufs[2]);
yading@10 211
yading@10 212 if (planes[p].bands[b].blk_vlc.cust_tab.table)
yading@10 213 ff_free_vlc(&planes[p].bands[b].blk_vlc.cust_tab);
yading@10 214 for (t = 0; t < planes[p].bands[b].num_tiles; t++)
yading@10 215 av_freep(&planes[p].bands[b].tiles[t].mbs);
yading@10 216 av_freep(&planes[p].bands[b].tiles);
yading@10 217 }
yading@10 218 av_freep(&planes[p].bands);
yading@10 219 }
yading@10 220 }
yading@10 221
yading@10 222 av_cold int ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg)
yading@10 223 {
yading@10 224 int p, b;
yading@10 225 uint32_t b_width, b_height, align_fac, width_aligned, height_aligned, buf_size;
yading@10 226 IVIBandDesc *band;
yading@10 227
yading@10 228 ivi_free_buffers(planes);
yading@10 229
yading@10 230 /* fill in the descriptor of the luminance plane */
yading@10 231 planes[0].width = cfg->pic_width;
yading@10 232 planes[0].height = cfg->pic_height;
yading@10 233 planes[0].num_bands = cfg->luma_bands;
yading@10 234
yading@10 235 /* fill in the descriptors of the chrominance planes */
yading@10 236 planes[1].width = planes[2].width = (cfg->pic_width + 3) >> 2;
yading@10 237 planes[1].height = planes[2].height = (cfg->pic_height + 3) >> 2;
yading@10 238 planes[1].num_bands = planes[2].num_bands = cfg->chroma_bands;
yading@10 239
yading@10 240 for (p = 0; p < 3; p++) {
yading@10 241 planes[p].bands = av_mallocz(planes[p].num_bands * sizeof(IVIBandDesc));
yading@10 242 if (!planes[p].bands)
yading@10 243 return AVERROR(ENOMEM);
yading@10 244
yading@10 245 /* select band dimensions: if there is only one band then it
yading@10 246 * has the full size, if there are several bands each of them
yading@10 247 * has only half size */
yading@10 248 b_width = planes[p].num_bands == 1 ? planes[p].width : (planes[p].width + 1) >> 1;
yading@10 249 b_height = planes[p].num_bands == 1 ? planes[p].height : (planes[p].height + 1) >> 1;
yading@10 250
yading@10 251 /* luma band buffers will be aligned on 16x16 (max macroblock size) */
yading@10 252 /* chroma band buffers will be aligned on 8x8 (max macroblock size) */
yading@10 253 align_fac = p ? 8 : 16;
yading@10 254 width_aligned = FFALIGN(b_width , align_fac);
yading@10 255 height_aligned = FFALIGN(b_height, align_fac);
yading@10 256 buf_size = width_aligned * height_aligned * sizeof(int16_t);
yading@10 257
yading@10 258 for (b = 0; b < planes[p].num_bands; b++) {
yading@10 259 band = &planes[p].bands[b]; /* select appropriate plane/band */
yading@10 260 band->plane = p;
yading@10 261 band->band_num = b;
yading@10 262 band->width = b_width;
yading@10 263 band->height = b_height;
yading@10 264 band->pitch = width_aligned;
yading@10 265 band->aheight = height_aligned;
yading@10 266 band->bufs[0] = av_mallocz(buf_size);
yading@10 267 band->bufs[1] = av_mallocz(buf_size);
yading@10 268 band->bufsize = buf_size/2;
yading@10 269 if (!band->bufs[0] || !band->bufs[1])
yading@10 270 return AVERROR(ENOMEM);
yading@10 271
yading@10 272 /* allocate the 3rd band buffer for scalability mode */
yading@10 273 if (cfg->luma_bands > 1) {
yading@10 274 band->bufs[2] = av_mallocz(buf_size);
yading@10 275 if (!band->bufs[2])
yading@10 276 return AVERROR(ENOMEM);
yading@10 277 }
yading@10 278
yading@10 279 planes[p].bands[0].blk_vlc.cust_desc.num_rows = 0; /* reset custom vlc */
yading@10 280 }
yading@10 281 }
yading@10 282
yading@10 283 return 0;
yading@10 284 }
yading@10 285
yading@10 286 av_cold int ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height)
yading@10 287 {
yading@10 288 int p, b, x, y, x_tiles, y_tiles, t_width, t_height;
yading@10 289 IVIBandDesc *band;
yading@10 290 IVITile *tile, *ref_tile;
yading@10 291
yading@10 292 for (p = 0; p < 3; p++) {
yading@10 293 t_width = !p ? tile_width : (tile_width + 3) >> 2;
yading@10 294 t_height = !p ? tile_height : (tile_height + 3) >> 2;
yading@10 295
yading@10 296 if (!p && planes[0].num_bands == 4) {
yading@10 297 t_width >>= 1;
yading@10 298 t_height >>= 1;
yading@10 299 }
yading@10 300 if(t_width<=0 || t_height<=0)
yading@10 301 return AVERROR(EINVAL);
yading@10 302
yading@10 303 for (b = 0; b < planes[p].num_bands; b++) {
yading@10 304 band = &planes[p].bands[b];
yading@10 305 x_tiles = IVI_NUM_TILES(band->width, t_width);
yading@10 306 y_tiles = IVI_NUM_TILES(band->height, t_height);
yading@10 307 band->num_tiles = x_tiles * y_tiles;
yading@10 308
yading@10 309 av_freep(&band->tiles);
yading@10 310 band->tiles = av_mallocz(band->num_tiles * sizeof(IVITile));
yading@10 311 if (!band->tiles)
yading@10 312 return AVERROR(ENOMEM);
yading@10 313
yading@10 314 tile = band->tiles;
yading@10 315
yading@10 316 /* use the first luma band as reference for motion vectors
yading@10 317 * and quant */
yading@10 318 ref_tile = planes[0].bands[0].tiles;
yading@10 319
yading@10 320 for (y = 0; y < band->height; y += t_height) {
yading@10 321 for (x = 0; x < band->width; x += t_width) {
yading@10 322 tile->xpos = x;
yading@10 323 tile->ypos = y;
yading@10 324 tile->mb_size = band->mb_size;
yading@10 325 tile->width = FFMIN(band->width - x, t_width);
yading@10 326 tile->height = FFMIN(band->height - y, t_height);
yading@10 327 tile->is_empty = tile->data_size = 0;
yading@10 328 /* calculate number of macroblocks */
yading@10 329 tile->num_MBs = IVI_MBs_PER_TILE(tile->width, tile->height,
yading@10 330 band->mb_size);
yading@10 331
yading@10 332 av_freep(&tile->mbs);
yading@10 333 tile->mbs = av_malloc(tile->num_MBs * sizeof(IVIMbInfo));
yading@10 334 if (!tile->mbs)
yading@10 335 return AVERROR(ENOMEM);
yading@10 336
yading@10 337 tile->ref_mbs = 0;
yading@10 338 if (p || b) {
yading@10 339 if (tile->num_MBs <= ref_tile->num_MBs) {
yading@10 340 tile->ref_mbs = ref_tile->mbs;
yading@10 341 }else
yading@10 342 av_log(NULL, AV_LOG_DEBUG, "Cannot use ref_tile, too few mbs\n");
yading@10 343 ref_tile++;
yading@10 344 }
yading@10 345
yading@10 346 tile++;
yading@10 347 }
yading@10 348 }
yading@10 349
yading@10 350 }// for b
yading@10 351 }// for p
yading@10 352
yading@10 353 return 0;
yading@10 354 }
yading@10 355
yading@10 356 /*
yading@10 357 * Decode size of the tile data.
yading@10 358 * The size is stored as a variable-length field having the following format:
yading@10 359 * if (tile_data_size < 255) than this field is only one byte long
yading@10 360 * if (tile_data_size >= 255) than this field four is byte long: 0xFF X1 X2 X3
yading@10 361 * where X1-X3 is size of the tile data
yading@10 362 *
yading@10 363 * @param[in,out] gb the GetBit context
yading@10 364 * @return size of the tile data in bytes
yading@10 365 */
yading@10 366 static int ivi_dec_tile_data_size(GetBitContext *gb)
yading@10 367 {
yading@10 368 int len;
yading@10 369
yading@10 370 len = 0;
yading@10 371 if (get_bits1(gb)) {
yading@10 372 len = get_bits(gb, 8);
yading@10 373 if (len == 255)
yading@10 374 len = get_bits_long(gb, 24);
yading@10 375 }
yading@10 376
yading@10 377 /* align the bitstream reader on the byte boundary */
yading@10 378 align_get_bits(gb);
yading@10 379
yading@10 380 return len;
yading@10 381 }
yading@10 382
yading@10 383 /*
yading@10 384 * Decode block data:
yading@10 385 * extract huffman-coded transform coefficients from the bitstream,
yading@10 386 * dequantize them, apply inverse transform and motion compensation
yading@10 387 * in order to reconstruct the picture.
yading@10 388 *
yading@10 389 * @param[in,out] gb the GetBit context
yading@10 390 * @param[in] band pointer to the band descriptor
yading@10 391 * @param[in] tile pointer to the tile descriptor
yading@10 392 * @return result code: 0 - OK, -1 = error (corrupted blocks data)
yading@10 393 */
yading@10 394 static int ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile,
yading@10 395 AVCodecContext *avctx)
yading@10 396 {
yading@10 397 int mbn, blk, num_blocks, num_coeffs, blk_size, scan_pos, run, val,
yading@10 398 pos, is_intra, mc_type = 0, av_uninit(mv_x), av_uninit(mv_y), col_mask;
yading@10 399 uint8_t col_flags[8];
yading@10 400 int32_t prev_dc, trvec[64];
yading@10 401 uint32_t cbp, av_uninit(sym), lo, hi, quant, buf_offs, q;
yading@10 402 IVIMbInfo *mb;
yading@10 403 RVMapDesc *rvmap = band->rv_map;
yading@10 404 void (*mc_with_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
yading@10 405 void (*mc_no_delta_func) (int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
yading@10 406 const uint16_t *base_tab;
yading@10 407 const uint8_t *scale_tab;
yading@10 408
yading@10 409 prev_dc = 0; /* init intra prediction for the DC coefficient */
yading@10 410
yading@10 411 blk_size = band->blk_size;
yading@10 412 col_mask = blk_size - 1; /* column mask for tracking non-zero coeffs */
yading@10 413 num_blocks = (band->mb_size != blk_size) ? 4 : 1; /* number of blocks per mb */
yading@10 414 num_coeffs = blk_size * blk_size;
yading@10 415 if (blk_size == 8) {
yading@10 416 mc_with_delta_func = ff_ivi_mc_8x8_delta;
yading@10 417 mc_no_delta_func = ff_ivi_mc_8x8_no_delta;
yading@10 418 } else {
yading@10 419 mc_with_delta_func = ff_ivi_mc_4x4_delta;
yading@10 420 mc_no_delta_func = ff_ivi_mc_4x4_no_delta;
yading@10 421 }
yading@10 422
yading@10 423 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
yading@10 424 is_intra = !mb->type;
yading@10 425 cbp = mb->cbp;
yading@10 426 buf_offs = mb->buf_offs;
yading@10 427
yading@10 428 quant = av_clip(band->glob_quant + mb->q_delta, 0, 23);
yading@10 429
yading@10 430 base_tab = is_intra ? band->intra_base : band->inter_base;
yading@10 431 scale_tab = is_intra ? band->intra_scale : band->inter_scale;
yading@10 432 if (scale_tab)
yading@10 433 quant = scale_tab[quant];
yading@10 434
yading@10 435 if (!is_intra) {
yading@10 436 mv_x = mb->mv_x;
yading@10 437 mv_y = mb->mv_y;
yading@10 438 if (band->is_halfpel) {
yading@10 439 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
yading@10 440 mv_x >>= 1;
yading@10 441 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
yading@10 442 }
yading@10 443 if (mb->type) {
yading@10 444 int dmv_x, dmv_y, cx, cy;
yading@10 445
yading@10 446 dmv_x = mb->mv_x >> band->is_halfpel;
yading@10 447 dmv_y = mb->mv_y >> band->is_halfpel;
yading@10 448 cx = mb->mv_x & band->is_halfpel;
yading@10 449 cy = mb->mv_y & band->is_halfpel;
yading@10 450
yading@10 451 if ( mb->xpos + dmv_x < 0
yading@10 452 || mb->xpos + dmv_x + band->mb_size + cx > band->pitch
yading@10 453 || mb->ypos + dmv_y < 0
yading@10 454 || mb->ypos + dmv_y + band->mb_size + cy > band->aheight) {
yading@10 455 return AVERROR_INVALIDDATA;
yading@10 456 }
yading@10 457 }
yading@10 458 }
yading@10 459
yading@10 460 for (blk = 0; blk < num_blocks; blk++) {
yading@10 461 /* adjust block position in the buffer according to its number */
yading@10 462 if (blk & 1) {
yading@10 463 buf_offs += blk_size;
yading@10 464 } else if (blk == 2) {
yading@10 465 buf_offs -= blk_size;
yading@10 466 buf_offs += blk_size * band->pitch;
yading@10 467 }
yading@10 468
yading@10 469 if (cbp & 1) { /* block coded ? */
yading@10 470 if (!band->scan) {
yading@10 471 av_log(avctx, AV_LOG_ERROR, "Scan pattern is not set.\n");
yading@10 472 return AVERROR_INVALIDDATA;
yading@10 473 }
yading@10 474
yading@10 475 scan_pos = -1;
yading@10 476 memset(trvec, 0, num_coeffs*sizeof(trvec[0])); /* zero transform vector */
yading@10 477 memset(col_flags, 0, sizeof(col_flags)); /* zero column flags */
yading@10 478
yading@10 479 while (scan_pos <= num_coeffs) {
yading@10 480 sym = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
yading@10 481 if (sym == rvmap->eob_sym)
yading@10 482 break; /* End of block */
yading@10 483
yading@10 484 if (sym == rvmap->esc_sym) { /* Escape - run/val explicitly coded using 3 vlc codes */
yading@10 485 run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1;
yading@10 486 lo = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
yading@10 487 hi = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
yading@10 488 val = IVI_TOSIGNED((hi << 6) | lo); /* merge them and convert into signed val */
yading@10 489 } else {
yading@10 490 if (sym >= 256U) {
yading@10 491 av_log(avctx, AV_LOG_ERROR, "Invalid sym encountered: %d.\n", sym);
yading@10 492 return -1;
yading@10 493 }
yading@10 494 run = rvmap->runtab[sym];
yading@10 495 val = rvmap->valtab[sym];
yading@10 496 }
yading@10 497
yading@10 498 /* de-zigzag and dequantize */
yading@10 499 scan_pos += run;
yading@10 500 if (scan_pos >= (unsigned)num_coeffs)
yading@10 501 break;
yading@10 502 pos = band->scan[scan_pos];
yading@10 503
yading@10 504 if (!val)
yading@10 505 av_dlog(avctx, "Val = 0 encountered!\n");
yading@10 506
yading@10 507 q = (base_tab[pos] * quant) >> 9;
yading@10 508 if (q > 1)
yading@10 509 val = val * q + FFSIGN(val) * (((q ^ 1) - 1) >> 1);
yading@10 510 trvec[pos] = val;
yading@10 511 col_flags[pos & col_mask] |= !!val; /* track columns containing non-zero coeffs */
yading@10 512 }// while
yading@10 513
yading@10 514 if (scan_pos >= num_coeffs && sym != rvmap->eob_sym)
yading@10 515 return -1; /* corrupt block data */
yading@10 516
yading@10 517 /* undoing DC coeff prediction for intra-blocks */
yading@10 518 if (is_intra && band->is_2d_trans) {
yading@10 519 prev_dc += trvec[0];
yading@10 520 trvec[0] = prev_dc;
yading@10 521 col_flags[0] |= !!prev_dc;
yading@10 522 }
yading@10 523 if(band->transform_size > band->blk_size){
yading@10 524 av_log(NULL, AV_LOG_ERROR, "Too large transform\n");
yading@10 525 return AVERROR_INVALIDDATA;
yading@10 526 }
yading@10 527 /* apply inverse transform */
yading@10 528 band->inv_transform(trvec, band->buf + buf_offs,
yading@10 529 band->pitch, col_flags);
yading@10 530
yading@10 531 /* apply motion compensation */
yading@10 532 if (!is_intra)
yading@10 533 mc_with_delta_func(band->buf + buf_offs,
yading@10 534 band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
yading@10 535 band->pitch, mc_type);
yading@10 536 } else {
yading@10 537 /* block not coded */
yading@10 538 /* for intra blocks apply the dc slant transform */
yading@10 539 /* for inter - perform the motion compensation without delta */
yading@10 540 if (is_intra) {
yading@10 541 band->dc_transform(&prev_dc, band->buf + buf_offs,
yading@10 542 band->pitch, blk_size);
yading@10 543 } else
yading@10 544 mc_no_delta_func(band->buf + buf_offs,
yading@10 545 band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
yading@10 546 band->pitch, mc_type);
yading@10 547 }
yading@10 548
yading@10 549 cbp >>= 1;
yading@10 550 }// for blk
yading@10 551 }// for mbn
yading@10 552
yading@10 553 align_get_bits(gb);
yading@10 554
yading@10 555 return 0;
yading@10 556 }
yading@10 557
yading@10 558 /**
yading@10 559 * Handle empty tiles by performing data copying and motion
yading@10 560 * compensation respectively.
yading@10 561 *
yading@10 562 * @param[in] avctx ptr to the AVCodecContext
yading@10 563 * @param[in] band pointer to the band descriptor
yading@10 564 * @param[in] tile pointer to the tile descriptor
yading@10 565 * @param[in] mv_scale scaling factor for motion vectors
yading@10 566 */
yading@10 567 static int ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
yading@10 568 IVITile *tile, int32_t mv_scale)
yading@10 569 {
yading@10 570 int x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
yading@10 571 int offs, mb_offset, row_offset;
yading@10 572 IVIMbInfo *mb, *ref_mb;
yading@10 573 const int16_t *src;
yading@10 574 int16_t *dst;
yading@10 575 void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch,
yading@10 576 int mc_type);
yading@10 577
yading@10 578 if (tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size)) {
yading@10 579 av_log(avctx, AV_LOG_ERROR, "Allocated tile size %d mismatches "
yading@10 580 "parameters %d in ivi_process_empty_tile()\n",
yading@10 581 tile->num_MBs, IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size));
yading@10 582 return AVERROR_INVALIDDATA;
yading@10 583 }
yading@10 584
yading@10 585 offs = tile->ypos * band->pitch + tile->xpos;
yading@10 586 mb = tile->mbs;
yading@10 587 ref_mb = tile->ref_mbs;
yading@10 588 row_offset = band->mb_size * band->pitch;
yading@10 589 need_mc = 0; /* reset the mc tracking flag */
yading@10 590
yading@10 591 for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
yading@10 592 mb_offset = offs;
yading@10 593
yading@10 594 for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
yading@10 595 mb->xpos = x;
yading@10 596 mb->ypos = y;
yading@10 597 mb->buf_offs = mb_offset;
yading@10 598
yading@10 599 mb->type = 1; /* set the macroblocks type = INTER */
yading@10 600 mb->cbp = 0; /* all blocks are empty */
yading@10 601
yading@10 602 if (!band->qdelta_present && !band->plane && !band->band_num) {
yading@10 603 mb->q_delta = band->glob_quant;
yading@10 604 mb->mv_x = 0;
yading@10 605 mb->mv_y = 0;
yading@10 606 }
yading@10 607
yading@10 608 if (band->inherit_qdelta && ref_mb)
yading@10 609 mb->q_delta = ref_mb->q_delta;
yading@10 610
yading@10 611 if (band->inherit_mv && ref_mb) {
yading@10 612 /* motion vector inheritance */
yading@10 613 if (mv_scale) {
yading@10 614 mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
yading@10 615 mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
yading@10 616 } else {
yading@10 617 mb->mv_x = ref_mb->mv_x;
yading@10 618 mb->mv_y = ref_mb->mv_y;
yading@10 619 }
yading@10 620 need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
yading@10 621 {
yading@10 622 int dmv_x, dmv_y, cx, cy;
yading@10 623
yading@10 624 dmv_x = mb->mv_x >> band->is_halfpel;
yading@10 625 dmv_y = mb->mv_y >> band->is_halfpel;
yading@10 626 cx = mb->mv_x & band->is_halfpel;
yading@10 627 cy = mb->mv_y & band->is_halfpel;
yading@10 628
yading@10 629 if ( mb->xpos + dmv_x < 0
yading@10 630 || mb->xpos + dmv_x + band->mb_size + cx > band->pitch
yading@10 631 || mb->ypos + dmv_y < 0
yading@10 632 || mb->ypos + dmv_y + band->mb_size + cy > band->aheight) {
yading@10 633 av_log(avctx, AV_LOG_ERROR, "MV out of bounds\n");
yading@10 634 return AVERROR_INVALIDDATA;
yading@10 635 }
yading@10 636 }
yading@10 637 }
yading@10 638
yading@10 639 mb++;
yading@10 640 if (ref_mb)
yading@10 641 ref_mb++;
yading@10 642 mb_offset += band->mb_size;
yading@10 643 } // for x
yading@10 644 offs += row_offset;
yading@10 645 } // for y
yading@10 646
yading@10 647 if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */
yading@10 648 num_blocks = (band->mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */
yading@10 649 mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
yading@10 650 : ff_ivi_mc_4x4_no_delta;
yading@10 651
yading@10 652 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
yading@10 653 mv_x = mb->mv_x;
yading@10 654 mv_y = mb->mv_y;
yading@10 655 if (!band->is_halfpel) {
yading@10 656 mc_type = 0; /* we have only fullpel vectors */
yading@10 657 } else {
yading@10 658 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
yading@10 659 mv_x >>= 1;
yading@10 660 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
yading@10 661 }
yading@10 662
yading@10 663 for (blk = 0; blk < num_blocks; blk++) {
yading@10 664 /* adjust block position in the buffer according with its number */
yading@10 665 offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
yading@10 666 mc_no_delta_func(band->buf + offs,
yading@10 667 band->ref_buf + offs + mv_y * band->pitch + mv_x,
yading@10 668 band->pitch, mc_type);
yading@10 669 }
yading@10 670 }
yading@10 671 } else {
yading@10 672 /* copy data from the reference tile into the current one */
yading@10 673 src = band->ref_buf + tile->ypos * band->pitch + tile->xpos;
yading@10 674 dst = band->buf + tile->ypos * band->pitch + tile->xpos;
yading@10 675 for (y = 0; y < tile->height; y++) {
yading@10 676 memcpy(dst, src, tile->width*sizeof(band->buf[0]));
yading@10 677 src += band->pitch;
yading@10 678 dst += band->pitch;
yading@10 679 }
yading@10 680 }
yading@10 681
yading@10 682 return 0;
yading@10 683 }
yading@10 684
yading@10 685
yading@10 686 #ifdef DEBUG
yading@10 687 static uint16_t ivi_calc_band_checksum(IVIBandDesc *band)
yading@10 688 {
yading@10 689 int x, y;
yading@10 690 int16_t *src, checksum;
yading@10 691
yading@10 692 src = band->buf;
yading@10 693 checksum = 0;
yading@10 694
yading@10 695 for (y = 0; y < band->height; src += band->pitch, y++)
yading@10 696 for (x = 0; x < band->width; x++)
yading@10 697 checksum += src[x];
yading@10 698
yading@10 699 return checksum;
yading@10 700 }
yading@10 701 #endif
yading@10 702
yading@10 703 /*
yading@10 704 * Convert and output the current plane.
yading@10 705 * This conversion is done by adding back the bias value of 128
yading@10 706 * (subtracted in the encoder) and clipping the result.
yading@10 707 *
yading@10 708 * @param[in] plane pointer to the descriptor of the plane being processed
yading@10 709 * @param[out] dst pointer to the buffer receiving converted pixels
yading@10 710 * @param[in] dst_pitch pitch for moving to the next y line
yading@10 711 */
yading@10 712 static void ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch)
yading@10 713 {
yading@10 714 int x, y;
yading@10 715 const int16_t *src = plane->bands[0].buf;
yading@10 716 uint32_t pitch = plane->bands[0].pitch;
yading@10 717
yading@10 718 if (!src)
yading@10 719 return;
yading@10 720
yading@10 721 for (y = 0; y < plane->height; y++) {
yading@10 722 for (x = 0; x < plane->width; x++)
yading@10 723 dst[x] = av_clip_uint8(src[x] + 128);
yading@10 724 src += pitch;
yading@10 725 dst += dst_pitch;
yading@10 726 }
yading@10 727 }
yading@10 728
yading@10 729 /**
yading@10 730 * Decode an Indeo 4 or 5 band.
yading@10 731 *
yading@10 732 * @param[in,out] ctx ptr to the decoder context
yading@10 733 * @param[in,out] band ptr to the band descriptor
yading@10 734 * @param[in] avctx ptr to the AVCodecContext
yading@10 735 * @return result code: 0 = OK, -1 = error
yading@10 736 */
yading@10 737 static int decode_band(IVI45DecContext *ctx,
yading@10 738 IVIBandDesc *band, AVCodecContext *avctx)
yading@10 739 {
yading@10 740 int result, i, t, idx1, idx2, pos;
yading@10 741 IVITile *tile;
yading@10 742
yading@10 743 band->buf = band->bufs[ctx->dst_buf];
yading@10 744 if (!band->buf) {
yading@10 745 av_log(avctx, AV_LOG_ERROR, "Band buffer points to no data!\n");
yading@10 746 return AVERROR_INVALIDDATA;
yading@10 747 }
yading@10 748 band->ref_buf = band->bufs[ctx->ref_buf];
yading@10 749 band->data_ptr = ctx->frame_data + (get_bits_count(&ctx->gb) >> 3);
yading@10 750
yading@10 751 result = ctx->decode_band_hdr(ctx, band, avctx);
yading@10 752 if (result) {
yading@10 753 av_log(avctx, AV_LOG_ERROR, "Error while decoding band header: %d\n",
yading@10 754 result);
yading@10 755 return result;
yading@10 756 }
yading@10 757
yading@10 758 if (band->is_empty) {
yading@10 759 av_log(avctx, AV_LOG_ERROR, "Empty band encountered!\n");
yading@10 760 return AVERROR_INVALIDDATA;
yading@10 761 }
yading@10 762
yading@10 763 band->rv_map = &ctx->rvmap_tabs[band->rvmap_sel];
yading@10 764
yading@10 765 /* apply corrections to the selected rvmap table if present */
yading@10 766 for (i = 0; i < band->num_corr; i++) {
yading@10 767 idx1 = band->corr[i * 2];
yading@10 768 idx2 = band->corr[i * 2 + 1];
yading@10 769 FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
yading@10 770 FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
yading@10 771 if (idx1 == band->rv_map->eob_sym || idx2 == band->rv_map->eob_sym)
yading@10 772 band->rv_map->eob_sym ^= idx1 ^ idx2;
yading@10 773 if (idx1 == band->rv_map->esc_sym || idx2 == band->rv_map->esc_sym)
yading@10 774 band->rv_map->esc_sym ^= idx1 ^ idx2;
yading@10 775 }
yading@10 776
yading@10 777 pos = get_bits_count(&ctx->gb);
yading@10 778
yading@10 779 for (t = 0; t < band->num_tiles; t++) {
yading@10 780 tile = &band->tiles[t];
yading@10 781
yading@10 782 if (tile->mb_size != band->mb_size) {
yading@10 783 av_log(avctx, AV_LOG_ERROR, "MB sizes mismatch: %d vs. %d\n",
yading@10 784 band->mb_size, tile->mb_size);
yading@10 785 return AVERROR_INVALIDDATA;
yading@10 786 }
yading@10 787 tile->is_empty = get_bits1(&ctx->gb);
yading@10 788 if (tile->is_empty) {
yading@10 789 result = ivi_process_empty_tile(avctx, band, tile,
yading@10 790 (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3));
yading@10 791 if (result < 0)
yading@10 792 break;
yading@10 793 av_dlog(avctx, "Empty tile encountered!\n");
yading@10 794 } else {
yading@10 795 tile->data_size = ivi_dec_tile_data_size(&ctx->gb);
yading@10 796 if (!tile->data_size) {
yading@10 797 av_log(avctx, AV_LOG_ERROR, "Tile data size is zero!\n");
yading@10 798 result = AVERROR_INVALIDDATA;
yading@10 799 break;
yading@10 800 }
yading@10 801
yading@10 802 result = ctx->decode_mb_info(ctx, band, tile, avctx);
yading@10 803 if (result < 0)
yading@10 804 break;
yading@10 805
yading@10 806 result = ivi_decode_blocks(&ctx->gb, band, tile, avctx);
yading@10 807 if (result < 0 || ((get_bits_count(&ctx->gb) - pos) >> 3) != tile->data_size) {
yading@10 808 av_log(avctx, AV_LOG_ERROR, "Corrupted tile data encountered!\n");
yading@10 809 break;
yading@10 810 }
yading@10 811
yading@10 812 pos += tile->data_size << 3; // skip to next tile
yading@10 813 }
yading@10 814 }
yading@10 815
yading@10 816 /* restore the selected rvmap table by applying its corrections in reverse order */
yading@10 817 for (i = band->num_corr-1; i >= 0; i--) {
yading@10 818 idx1 = band->corr[i*2];
yading@10 819 idx2 = band->corr[i*2+1];
yading@10 820 FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
yading@10 821 FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
yading@10 822 if (idx1 == band->rv_map->eob_sym || idx2 == band->rv_map->eob_sym)
yading@10 823 band->rv_map->eob_sym ^= idx1 ^ idx2;
yading@10 824 if (idx1 == band->rv_map->esc_sym || idx2 == band->rv_map->esc_sym)
yading@10 825 band->rv_map->esc_sym ^= idx1 ^ idx2;
yading@10 826 }
yading@10 827
yading@10 828 #ifdef DEBUG
yading@10 829 if (band->checksum_present) {
yading@10 830 uint16_t chksum = ivi_calc_band_checksum(band);
yading@10 831 if (chksum != band->checksum) {
yading@10 832 av_log(avctx, AV_LOG_ERROR,
yading@10 833 "Band checksum mismatch! Plane %d, band %d, received: %x, calculated: %x\n",
yading@10 834 band->plane, band->band_num, band->checksum, chksum);
yading@10 835 }
yading@10 836 }
yading@10 837 #endif
yading@10 838
yading@10 839 align_get_bits(&ctx->gb);
yading@10 840
yading@10 841 return result;
yading@10 842 }
yading@10 843
yading@10 844 int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
yading@10 845 AVPacket *avpkt)
yading@10 846 {
yading@10 847 IVI45DecContext *ctx = avctx->priv_data;
yading@10 848 const uint8_t *buf = avpkt->data;
yading@10 849 AVFrame *frame = data;
yading@10 850 int buf_size = avpkt->size;
yading@10 851 int result, p, b;
yading@10 852
yading@10 853 init_get_bits(&ctx->gb, buf, buf_size * 8);
yading@10 854 ctx->frame_data = buf;
yading@10 855 ctx->frame_size = buf_size;
yading@10 856
yading@10 857 result = ctx->decode_pic_hdr(ctx, avctx);
yading@10 858 if (result) {
yading@10 859 av_log(avctx, AV_LOG_ERROR,
yading@10 860 "Error while decoding picture header: %d\n", result);
yading@10 861 return -1;
yading@10 862 }
yading@10 863 if (ctx->gop_invalid)
yading@10 864 return AVERROR_INVALIDDATA;
yading@10 865
yading@10 866 if (ctx->gop_flags & IVI5_IS_PROTECTED) {
yading@10 867 av_log(avctx, AV_LOG_ERROR, "Password-protected clip!\n");
yading@10 868 return -1;
yading@10 869 }
yading@10 870
yading@10 871 ctx->switch_buffers(ctx);
yading@10 872
yading@10 873 //{ START_TIMER;
yading@10 874
yading@10 875 if (ctx->is_nonnull_frame(ctx)) {
yading@10 876 ctx->buf_invalid[ctx->dst_buf] = 1;
yading@10 877 for (p = 0; p < 3; p++) {
yading@10 878 for (b = 0; b < ctx->planes[p].num_bands; b++) {
yading@10 879 result = decode_band(ctx, &ctx->planes[p].bands[b], avctx);
yading@10 880 if (result) {
yading@10 881 av_log(avctx, AV_LOG_ERROR,
yading@10 882 "Error while decoding band: %d, plane: %d\n", b, p);
yading@10 883 return -1;
yading@10 884 }
yading@10 885 }
yading@10 886 }
yading@10 887 ctx->buf_invalid[ctx->dst_buf] = 0;
yading@10 888 }
yading@10 889 if (ctx->buf_invalid[ctx->dst_buf])
yading@10 890 return -1;
yading@10 891
yading@10 892 //STOP_TIMER("decode_planes"); }
yading@10 893
yading@10 894 /* If the bidirectional mode is enabled, next I and the following P frame will */
yading@10 895 /* be sent together. Unfortunately the approach below seems to be the only way */
yading@10 896 /* to handle the B-frames mode. That's exactly the same Intel decoders do. */
yading@10 897 if (avctx->codec_id == AV_CODEC_ID_INDEO4 && ctx->frame_type == 0/*FRAMETYPE_INTRA*/) {
yading@10 898 while (get_bits(&ctx->gb, 8)); // skip version string
yading@10 899 skip_bits_long(&ctx->gb, 64); // skip padding, TODO: implement correct 8-bytes alignment
yading@10 900 if (get_bits_left(&ctx->gb) > 18 && show_bits(&ctx->gb, 18) == 0x3FFF8)
yading@10 901 av_log(avctx, AV_LOG_ERROR, "Buffer contains IP frames!\n");
yading@10 902 }
yading@10 903
yading@10 904 if (!ctx->is_nonnull_frame(ctx))
yading@10 905 return buf_size;
yading@10 906
yading@10 907 avcodec_set_dimensions(avctx, ctx->planes[0].width, ctx->planes[0].height);
yading@10 908 if ((result = ff_get_buffer(avctx, frame, 0)) < 0)
yading@10 909 return result;
yading@10 910
yading@10 911 if (ctx->is_scalable) {
yading@10 912 if (avctx->codec_id == AV_CODEC_ID_INDEO4)
yading@10 913 ff_ivi_recompose_haar(&ctx->planes[0], frame->data[0], frame->linesize[0]);
yading@10 914 else
yading@10 915 ff_ivi_recompose53 (&ctx->planes[0], frame->data[0], frame->linesize[0]);
yading@10 916 } else {
yading@10 917 ivi_output_plane(&ctx->planes[0], frame->data[0], frame->linesize[0]);
yading@10 918 }
yading@10 919
yading@10 920 ivi_output_plane(&ctx->planes[2], frame->data[1], frame->linesize[1]);
yading@10 921 ivi_output_plane(&ctx->planes[1], frame->data[2], frame->linesize[2]);
yading@10 922
yading@10 923 *got_frame = 1;
yading@10 924
yading@10 925 return buf_size;
yading@10 926 }
yading@10 927
yading@10 928 /**
yading@10 929 * Close Indeo5 decoder and clean up its context.
yading@10 930 */
yading@10 931 av_cold int ff_ivi_decode_close(AVCodecContext *avctx)
yading@10 932 {
yading@10 933 IVI45DecContext *ctx = avctx->priv_data;
yading@10 934
yading@10 935 ivi_free_buffers(&ctx->planes[0]);
yading@10 936
yading@10 937 if (ctx->mb_vlc.cust_tab.table)
yading@10 938 ff_free_vlc(&ctx->mb_vlc.cust_tab);
yading@10 939
yading@10 940 #if IVI4_STREAM_ANALYSER
yading@10 941 if (avctx->codec_id == AV_CODEC_ID_INDEO4) {
yading@10 942 if (ctx->is_scalable)
yading@10 943 av_log(avctx, AV_LOG_ERROR, "This video uses scalability mode!\n");
yading@10 944 if (ctx->uses_tiling)
yading@10 945 av_log(avctx, AV_LOG_ERROR, "This video uses local decoding!\n");
yading@10 946 if (ctx->has_b_frames)
yading@10 947 av_log(avctx, AV_LOG_ERROR, "This video contains B-frames!\n");
yading@10 948 if (ctx->has_transp)
yading@10 949 av_log(avctx, AV_LOG_ERROR, "Transparency mode is enabled!\n");
yading@10 950 if (ctx->uses_haar)
yading@10 951 av_log(avctx, AV_LOG_ERROR, "This video uses Haar transform!\n");
yading@10 952 if (ctx->uses_fullpel)
yading@10 953 av_log(avctx, AV_LOG_ERROR, "This video uses fullpel motion vectors!\n");
yading@10 954 }
yading@10 955 #endif
yading@10 956
yading@10 957 return 0;
yading@10 958 }
yading@10 959
yading@10 960
yading@10 961 /**
yading@10 962 * These are 2x8 predefined Huffman codebooks for coding macroblock/block
yading@10 963 * signals. They are specified using "huffman descriptors" in order to
yading@10 964 * avoid huge static tables. The decoding tables will be generated at
yading@10 965 * startup from these descriptors.
yading@10 966 */
yading@10 967 const IVIHuffDesc ff_ivi_mb_huff_desc[8] = {
yading@10 968 {8, {0, 4, 5, 4, 4, 4, 6, 6}},
yading@10 969 {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
yading@10 970 {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
yading@10 971 {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
yading@10 972 {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
yading@10 973 {9, {0, 4, 4, 4, 4, 3, 3, 3, 2}},
yading@10 974 {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
yading@10 975 {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
yading@10 976 };
yading@10 977
yading@10 978 const IVIHuffDesc ff_ivi_blk_huff_desc[8] = {
yading@10 979 {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
yading@10 980 {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
yading@10 981 {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
yading@10 982 {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
yading@10 983 {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
yading@10 984 {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
yading@10 985 {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
yading@10 986 {9, {3, 4, 4, 5, 5, 5, 6, 5, 5}}
yading@10 987 };
yading@10 988
yading@10 989
yading@10 990 /**
yading@10 991 * Scan patterns shared between indeo4 and indeo5
yading@10 992 */
yading@10 993 const uint8_t ff_ivi_vertical_scan_8x8[64] = {
yading@10 994 0, 8, 16, 24, 32, 40, 48, 56,
yading@10 995 1, 9, 17, 25, 33, 41, 49, 57,
yading@10 996 2, 10, 18, 26, 34, 42, 50, 58,
yading@10 997 3, 11, 19, 27, 35, 43, 51, 59,
yading@10 998 4, 12, 20, 28, 36, 44, 52, 60,
yading@10 999 5, 13, 21, 29, 37, 45, 53, 61,
yading@10 1000 6, 14, 22, 30, 38, 46, 54, 62,
yading@10 1001 7, 15, 23, 31, 39, 47, 55, 63
yading@10 1002 };
yading@10 1003
yading@10 1004 const uint8_t ff_ivi_horizontal_scan_8x8[64] = {
yading@10 1005 0, 1, 2, 3, 4, 5, 6, 7,
yading@10 1006 8, 9, 10, 11, 12, 13, 14, 15,
yading@10 1007 16, 17, 18, 19, 20, 21, 22, 23,
yading@10 1008 24, 25, 26, 27, 28, 29, 30, 31,
yading@10 1009 32, 33, 34, 35, 36, 37, 38, 39,
yading@10 1010 40, 41, 42, 43, 44, 45, 46, 47,
yading@10 1011 48, 49, 50, 51, 52, 53, 54, 55,
yading@10 1012 56, 57, 58, 59, 60, 61, 62, 63
yading@10 1013 };
yading@10 1014
yading@10 1015 const uint8_t ff_ivi_direct_scan_4x4[16] = {
yading@10 1016 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15
yading@10 1017 };
yading@10 1018
yading@10 1019
yading@10 1020 /**
yading@10 1021 * Run-value (RLE) tables.
yading@10 1022 */
yading@10 1023 const RVMapDesc ff_ivi_rvmap_tabs[9] = {
yading@10 1024 { /* MapTab0 */
yading@10 1025 5, /* eob_sym */
yading@10 1026 2, /* esc_sym */
yading@10 1027 /* run table */
yading@10 1028 {1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3,
yading@10 1029 1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5,
yading@10 1030 1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1,
yading@10 1031 8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9,
yading@10 1032 9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3,
yading@10 1033 2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12,
yading@10 1034 8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13,
yading@10 1035 2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8,
yading@10 1036 1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8,
yading@10 1037 6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21,
yading@10 1038 22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8,
yading@10 1039 4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6,
yading@10 1040 1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28,
yading@10 1041 1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41,
yading@10 1042 6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1,
yading@10 1043 30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
yading@10 1044
yading@10 1045 /* value table */
yading@10 1046 { 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1,
yading@10 1047 6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1,
yading@10 1048 10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13,
yading@10 1049 1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1,
yading@10 1050 -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4,
yading@10 1051 7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1,
yading@10 1052 2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1,
yading@10 1053 9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3,
yading@10 1054 28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4,
yading@10 1055 3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1,
yading@10 1056 -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5,
yading@10 1057 5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4,
yading@10 1058 -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1,
yading@10 1059 37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1,
yading@10 1060 5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40,
yading@10 1061 -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1}
yading@10 1062 },{
yading@10 1063 /* MapTab1 */
yading@10 1064 0, /* eob_sym */
yading@10 1065 38, /* esc_sym */
yading@10 1066 /* run table */
yading@10 1067 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7,
yading@10 1068 7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16,
yading@10 1069 14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
yading@10 1070 25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27,
yading@10 1071 33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34,
yading@10 1072 37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38,
yading@10 1073 40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44,
yading@10 1074 57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1,
yading@10 1075 52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64,
yading@10 1076 60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13,
yading@10 1077 12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4,
yading@10 1078 1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25,
yading@10 1079 21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33,
yading@10 1080 29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3,
yading@10 1081 28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41,
yading@10 1082 2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5},
yading@10 1083
yading@10 1084 /* value table */
yading@10 1085 {0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1,
yading@10 1086 -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1,
yading@10 1087 -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1,
yading@10 1088 1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1,
yading@10 1089 1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1,
yading@10 1090 1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1,
yading@10 1091 -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1,
yading@10 1092 -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4,
yading@10 1093 1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1,
yading@10 1094 1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2,
yading@10 1095 2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3,
yading@10 1096 6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2,
yading@10 1097 2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2,
yading@10 1098 2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4,
yading@10 1099 -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2,
yading@10 1100 -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4}
yading@10 1101 },{
yading@10 1102 /* MapTab2 */
yading@10 1103 2, /* eob_sym */
yading@10 1104 11, /* esc_sym */
yading@10 1105 /* run table */
yading@10 1106 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5,
yading@10 1107 2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2,
yading@10 1108 2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13,
yading@10 1109 3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7,
yading@10 1110 1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3,
yading@10 1111 9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22,
yading@10 1112 23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32,
yading@10 1113 28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31,
yading@10 1114 49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3,
yading@10 1115 3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57,
yading@10 1116 1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2,
yading@10 1117 50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1,
yading@10 1118 45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17,
yading@10 1119 17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55,
yading@10 1120 7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4,
yading@10 1121 8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62},
yading@10 1122
yading@10 1123 /* value table */
yading@10 1124 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1,
yading@10 1125 2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3,
yading@10 1126 -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1,
yading@10 1127 3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2,
yading@10 1128 7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4,
yading@10 1129 2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1,
yading@10 1130 1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1,
yading@10 1131 1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1,
yading@10 1132 1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5,
yading@10 1133 -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1,
yading@10 1134 -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7,
yading@10 1135 -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13,
yading@10 1136 1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2,
yading@10 1137 -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1,
yading@10 1138 -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6,
yading@10 1139 -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1}
yading@10 1140 },{
yading@10 1141 /* MapTab3 */
yading@10 1142 0, /* eob_sym */
yading@10 1143 35, /* esc_sym */
yading@10 1144 /* run table */
yading@10 1145 {0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7,
yading@10 1146 7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3,
yading@10 1147 3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1,
yading@10 1148 5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20,
yading@10 1149 21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26,
yading@10 1150 9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32,
yading@10 1151 2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41,
yading@10 1152 35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40,
yading@10 1153 12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16,
yading@10 1154 43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48,
yading@10 1155 57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51,
yading@10 1156 8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59,
yading@10 1157 59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60,
yading@10 1158 60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4,
yading@10 1159 25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1,
yading@10 1160 20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16},
yading@10 1161
yading@10 1162 /* value table */
yading@10 1163 { 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1,
yading@10 1164 -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2,
yading@10 1165 -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4,
yading@10 1166 2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1,
yading@10 1167 1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1,
yading@10 1168 2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1,
yading@10 1169 4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1,
yading@10 1170 -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1,
yading@10 1171 2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2,
yading@10 1172 1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1,
yading@10 1173 -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1,
yading@10 1174 -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1,
yading@10 1175 -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1,
yading@10 1176 1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5,
yading@10 1177 -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12,
yading@10 1178 -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3}
yading@10 1179 },{
yading@10 1180 /* MapTab4 */
yading@10 1181 0, /* eob_sym */
yading@10 1182 34, /* esc_sym */
yading@10 1183 /* run table */
yading@10 1184 {0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5,
yading@10 1185 2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1,
yading@10 1186 2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1,
yading@10 1187 9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4,
yading@10 1188 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1,
yading@10 1189 2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
yading@10 1190 2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12,
yading@10 1191 3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1,
yading@10 1192 4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1,
yading@10 1193 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5,
yading@10 1194 1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1,
yading@10 1195 5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1,
yading@10 1196 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1,
yading@10 1197 3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1,
yading@10 1198 1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8,
yading@10 1199 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1},
yading@10 1200
yading@10 1201 /* value table */
yading@10 1202 { 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1,
yading@10 1203 2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9,
yading@10 1204 3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13,
yading@10 1205 1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2,
yading@10 1206 18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23,
yading@10 1207 -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29,
yading@10 1208 6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1,
yading@10 1209 4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39,
yading@10 1210 3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47,
yading@10 1211 -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3,
yading@10 1212 -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63,
yading@10 1213 -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67,
yading@10 1214 -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70,
yading@10 1215 6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79,
yading@10 1216 75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2,
yading@10 1217 83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89}
yading@10 1218 },{
yading@10 1219 /* MapTab5 */
yading@10 1220 2, /* eob_sym */
yading@10 1221 33, /* esc_sym */
yading@10 1222 /* run table */
yading@10 1223 {1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1,
yading@10 1224 1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1,
yading@10 1225 1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1,
yading@10 1226 12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2,
yading@10 1227 6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3,
yading@10 1228 8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2,
yading@10 1229 1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4,
yading@10 1230 4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1,
yading@10 1231 1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2,
yading@10 1232 2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13,
yading@10 1233 1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31,
yading@10 1234 3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2,
yading@10 1235 1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8,
yading@10 1236 36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1,
yading@10 1237 1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4,
yading@10 1238 40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7},
yading@10 1239
yading@10 1240 /* value table */
yading@10 1241 { 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4,
yading@10 1242 -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6,
yading@10 1243 -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8,
yading@10 1244 1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5,
yading@10 1245 2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4,
yading@10 1246 2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7,
yading@10 1247 15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4,
yading@10 1248 -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18,
yading@10 1249 -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9,
yading@10 1250 -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2,
yading@10 1251 22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1,
yading@10 1252 7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11,
yading@10 1253 26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4,
yading@10 1254 -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29,
yading@10 1255 30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7,
yading@10 1256 -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5}
yading@10 1257 },{
yading@10 1258 /* MapTab6 */
yading@10 1259 2, /* eob_sym */
yading@10 1260 13, /* esc_sym */
yading@10 1261 /* run table */
yading@10 1262 {1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2,
yading@10 1263 4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1,
yading@10 1264 3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9,
yading@10 1265 4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2,
yading@10 1266 1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1,
yading@10 1267 6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7,
yading@10 1268 15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1,
yading@10 1269 2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1,
yading@10 1270 17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1,
yading@10 1271 6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1,
yading@10 1272 4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2,
yading@10 1273 1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1,
yading@10 1274 1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1,
yading@10 1275 12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6,
yading@10 1276 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25,
yading@10 1277 14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2},
yading@10 1278
yading@10 1279 /* value table */
yading@10 1280 {-20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2,
yading@10 1281 1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8,
yading@10 1282 2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1,
yading@10 1283 2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5,
yading@10 1284 -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18,
yading@10 1285 2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2,
yading@10 1286 -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25,
yading@10 1287 -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29,
yading@10 1288 1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33,
yading@10 1289 -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37,
yading@10 1290 -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11,
yading@10 1291 -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44,
yading@10 1292 45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48,
yading@10 1293 -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4,
yading@10 1294 6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1,
yading@10 1295 2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14}
yading@10 1296 },{
yading@10 1297 /* MapTab7 */
yading@10 1298 2, /* eob_sym */
yading@10 1299 38, /* esc_sym */
yading@10 1300 /* run table */
yading@10 1301 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6,
yading@10 1302 6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1,
yading@10 1303 1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5,
yading@10 1304 14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7,
yading@10 1305 8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20,
yading@10 1306 19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23,
yading@10 1307 24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7,
yading@10 1308 26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2,
yading@10 1309 28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30,
yading@10 1310 32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14,
yading@10 1311 6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9,
yading@10 1312 37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5,
yading@10 1313 3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6,
yading@10 1314 1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1,
yading@10 1315 8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45,
yading@10 1316 12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49},
yading@10 1317
yading@10 1318 /* value table */
yading@10 1319 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1,
yading@10 1320 -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5,
yading@10 1321 -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2,
yading@10 1322 1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2,
yading@10 1323 2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1,
yading@10 1324 -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1,
yading@10 1325 -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3,
yading@10 1326 1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7,
yading@10 1327 -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1,
yading@10 1328 -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2,
yading@10 1329 -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3,
yading@10 1330 -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5,
yading@10 1331 -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5,
yading@10 1332 20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21,
yading@10 1333 5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1,
yading@10 1334 3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1}
yading@10 1335 },{
yading@10 1336 /* MapTab8 */
yading@10 1337 4, /* eob_sym */
yading@10 1338 11, /* esc_sym */
yading@10 1339 /* run table */
yading@10 1340 {1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2,
yading@10 1341 4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1,
yading@10 1342 7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9,
yading@10 1343 2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4,
yading@10 1344 4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8,
yading@10 1345 2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4,
yading@10 1346 1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21,
yading@10 1347 25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1,
yading@10 1348 1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2,
yading@10 1349 4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30,
yading@10 1350 6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1,
yading@10 1351 37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41,
yading@10 1352 13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42,
yading@10 1353 3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15,
yading@10 1354 44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7,
yading@10 1355 50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1},
yading@10 1356
yading@10 1357 /* value table */
yading@10 1358 { 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2,
yading@10 1359 1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7,
yading@10 1360 1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1,
yading@10 1361 5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3,
yading@10 1362 -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2,
yading@10 1363 7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4,
yading@10 1364 15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1,
yading@10 1365 1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17,
yading@10 1366 -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9,
yading@10 1367 -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1,
yading@10 1368 4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20,
yading@10 1369 1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1,
yading@10 1370 -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1,
yading@10 1371 8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2,
yading@10 1372 1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5,
yading@10 1373 1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26}
yading@10 1374 }
yading@10 1375 };