Revision 1cf31685

View differences:

libavcodec/ivi_common.c
1
/*
2
 * common functions for Indeo Video Interactive codecs (Indeo4 and Indeo5)
3
 *
4
 * Copyright (c) 2009 Maxim Poliakovski
5
 *
6
 * This file is part of FFmpeg.
7
 *
8
 * FFmpeg is free software; you can redistribute it and/or
9
 * modify it under the terms of the GNU Lesser General Public
10
 * License as published by the Free Software Foundation; either
11
 * version 2.1 of the License, or (at your option) any later version.
12
 *
13
 * FFmpeg is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16
 * Lesser General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU Lesser General Public
19
 * License along with FFmpeg; if not, write to the Free Software
20
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
 */
22

  
23
/**
24
 * @file libavcodec/ivi_common.c
25
 * This file contains functions and data shared by both Indeo4 and
26
 * Indeo5 decoders.
27
 */
28

  
29
#define ALT_BITSTREAM_READER_LE
30
#include "avcodec.h"
31
#include "get_bits.h"
32
#include "ivi_common.h"
33
#include "libavutil/common.h"
34
#include "ivi_dsp.h"
35

  
36
/**
37
 *  Reverses "nbits" bits of the value "val" and returns the result
38
 *  in the least significant bits.
39
 */
40
static uint16_t inv_bits(uint16_t val, int nbits)
41
{
42
    uint16_t res;
43

  
44
    if (nbits <= 8) {
45
        res = av_reverse[val] >> (8-nbits);
46
    } else
47
        res = ((av_reverse[val & 0xFF] << 8) + (av_reverse[val >> 8])) >> (16-nbits);
48

  
49
    return res;
50
}
51

  
52
int ff_ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag)
53
{
54
    int         pos, i, j, codes_per_row, prefix, not_last_row;
55
    uint16_t    codewords[256]; /* FIXME: move this temporal storage out? */
56
    uint8_t     bits[256];
57

  
58
    pos = 0; /* current position = 0 */
59

  
60
    for (i = 0; i < cb->num_rows; i++) {
61
        codes_per_row = 1 << cb->xbits[i];
62
        not_last_row  = (i != cb->num_rows - 1);
63
        prefix        = ((1 << i) - 1) << (cb->xbits[i] + not_last_row);
64

  
65
        for (j = 0; j < codes_per_row; j++) {
66
            if (pos >= 256) /* Some Indeo5 codebooks can have more than 256 */
67
                break;      /* elements, but only 256 codes are allowed! */
68

  
69
            bits[pos] = i + cb->xbits[i] + not_last_row;
70
            if (bits[pos] > IVI_VLC_BITS)
71
                return -1; /* invalid descriptor */
72

  
73
            codewords[pos] = inv_bits((prefix | j), bits[pos]);
74
            if (!bits[pos])
75
                bits[pos] = 1;
76

  
77
            pos++;
78
        }//for j
79
    }//for i
80

  
81
    /* number of codewords = pos */
82
    return init_vlc(vlc, IVI_VLC_BITS, pos, bits, 1, 1, codewords, 2, 2,
83
                    (flag & 1) | INIT_VLC_LE);
84
}
85

  
86
int ff_ivi_dec_huff_desc(GetBitContext *gb, IVIHuffDesc *desc)
87
{
88
    int tab_sel, i;
89

  
90
    tab_sel = get_bits(gb, 3);
91
    if (tab_sel == 7) {
92
        /* custom huffman table (explicitly encoded) */
93
        desc->num_rows = get_bits(gb, 4);
94

  
95
        for (i = 0; i < desc->num_rows; i++)
96
            desc->xbits[i] = get_bits(gb, 4);
97
    }
98

  
99
    return tab_sel;
100
}
101

  
102
int ff_ivi_huff_desc_cmp(const IVIHuffDesc *desc1, const IVIHuffDesc *desc2)
103
{
104
    return    desc1->num_rows != desc2->num_rows
105
           || memcmp(desc1->xbits, desc2->xbits, desc1->num_rows);
106
}
107

  
108
void ff_ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src)
109
{
110
    dst->num_rows = src->num_rows;
111
    memcpy(dst->xbits, src->xbits, src->num_rows);
112
}
113

  
114
int av_cold ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg)
115
{
116
    int         p, b;
117
    uint32_t    b_width, b_height, align_fac, width_aligned, height_aligned, buf_size;
118
    IVIBandDesc *band;
119

  
120
    ff_ivi_free_buffers(planes);
121

  
122
    /* fill in the descriptor of the luminance plane */
123
    planes[0].width     = cfg->pic_width;
124
    planes[0].height    = cfg->pic_height;
125
    planes[0].num_bands = cfg->luma_bands;
126

  
127
    /* fill in the descriptors of the chrominance planes */
128
    planes[1].width     = planes[2].width     = (cfg->pic_width  + 3) >> 2;
129
    planes[1].height    = planes[2].height    = (cfg->pic_height + 3) >> 2;
130
    planes[1].num_bands = planes[2].num_bands = cfg->chroma_bands;
131

  
132
    for (p = 0; p < 3; p++) {
133
        planes[p].bands = av_mallocz(planes[p].num_bands * sizeof(IVIBandDesc));
134
        if (!planes[p].bands)
135
            return AVERROR(ENOMEM);
136

  
137
        /* select band dimensions: if there is only one band then it
138
         *  has the full size, if there are several bands each of them
139
         *  has only half size */
140
        b_width  = planes[p].num_bands == 1 ? planes[p].width  : (planes[p].width  + 1) >> 1;
141
        b_height = planes[p].num_bands == 1 ? planes[p].height : (planes[p].height + 1) >> 1;
142

  
143
        /* luma   band buffers will be aligned on 16x16 (max macroblock size) */
144
        /* chroma band buffers will be aligned on   8x8 (max macroblock size) */
145
        align_fac       = p ? 8 : 16;
146
        width_aligned   = FFALIGN(b_width , align_fac);
147
        height_aligned  = FFALIGN(b_height, align_fac);
148
        buf_size        = width_aligned * height_aligned * sizeof(int16_t);
149

  
150
        for (b = 0; b < planes[p].num_bands; b++) {
151
            band = &planes[p].bands[b]; /* select appropriate plane/band */
152
            band->plane    = p;
153
            band->band_num = b;
154
            band->width    = b_width;
155
            band->height   = b_height;
156
            band->pitch    = width_aligned;
157
            band->bufs[0]  = av_malloc(buf_size);
158
            band->bufs[1]  = av_malloc(buf_size);
159
            if (!band->bufs[0] || !band->bufs[1])
160
                return AVERROR(ENOMEM);
161

  
162
            /* allocate the 3rd band buffer for scalability mode */
163
            if (cfg->luma_bands > 1) {
164
                band->bufs[2] = av_malloc(buf_size);
165
                if (!band->bufs[2])
166
                    return AVERROR(ENOMEM);
167
            }
168

  
169
            planes[p].bands[0].huff_desc.num_rows = 0; /* reset custom vlc */
170
        }
171
    }
172

  
173
    return 0;
174
}
175

  
176
void av_cold ff_ivi_free_buffers(IVIPlaneDesc *planes)
177
{
178
    int p, b, t;
179

  
180
    for (p = 0; p < 3; p++) {
181
        for (b = 0; b < planes[p].num_bands; b++) {
182
            av_freep(&planes[p].bands[b].bufs[0]);
183
            av_freep(&planes[p].bands[b].bufs[1]);
184
            av_freep(&planes[p].bands[b].bufs[2]);
185

  
186
            for (t = 0; t < planes[p].bands[b].num_tiles; t++)
187
                av_freep(&planes[p].bands[b].tiles[t].mbs);
188
            av_freep(&planes[p].bands[b].tiles);
189
        }
190
        av_freep(&planes[p].bands);
191
    }
192
}
193

  
194
int av_cold ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height)
195
{
196
    int         p, b, x, y, x_tiles, y_tiles, t_width, t_height;
197
    IVIBandDesc *band;
198
    IVITile     *tile, *ref_tile;
199

  
200
    for (p = 0; p < 3; p++) {
201
        t_width  = !p ? tile_width  : (tile_width  + 3) >> 2;
202
        t_height = !p ? tile_height : (tile_height + 3) >> 2;
203

  
204
        for (b = 0; b < planes[p].num_bands; b++) {
205
            band = &planes[p].bands[b];
206
            x_tiles = IVI_NUM_TILES(band->width, t_width);
207
            y_tiles = IVI_NUM_TILES(band->height, t_height);
208
            band->num_tiles = x_tiles * y_tiles;
209

  
210
            av_freep(&band->tiles);
211
            band->tiles = av_mallocz(band->num_tiles * sizeof(IVITile));
212
            if (!band->tiles)
213
                return AVERROR(ENOMEM);
214

  
215
            tile = band->tiles;
216

  
217
            /* use the first luma band as reference for motion vectors
218
             * and quant */
219
            ref_tile = planes[0].bands[0].tiles;
220

  
221
            for (y = 0; y < band->height; y += t_height) {
222
                for (x = 0; x < band->width; x += t_width) {
223
                    tile->xpos     = x;
224
                    tile->ypos     = y;
225
                    tile->width    = FFMIN(band->width - x,  t_width);
226
                    tile->height   = FFMIN(band->height - y, t_height);
227
                    tile->is_empty = tile->data_size = 0;
228
                    /* calculate number of macroblocks */
229
                    tile->num_MBs  = IVI_MBs_PER_TILE(tile->width, tile->height,
230
                                                      band->mb_size);
231

  
232
                    av_freep(&tile->mbs);
233
                    tile->mbs = av_malloc(tile->num_MBs * sizeof(IVIMbInfo));
234
                    if (!tile->mbs)
235
                        return AVERROR(ENOMEM);
236

  
237
                    tile->ref_mbs = 0;
238
                    if (p || b) {
239
                        tile->ref_mbs = ref_tile->mbs;
240
                        ref_tile++;
241
                    }
242

  
243
                    tile++;
244
                }
245
            }
246

  
247
        }// for b
248
    }// for p
249

  
250
    return 0;
251
}
252

  
253
int ff_ivi_dec_tile_data_size(GetBitContext *gb)
254
{
255
    int    len;
256

  
257
    len = 0;
258
    if (get_bits1(gb)) {
259
        len = get_bits(gb, 8);
260
        if (len == 255)
261
            len = get_bits_long(gb, 24);
262
    }
263

  
264
    /* align the bitstream reader on the byte boundary */
265
    align_get_bits(gb);
266

  
267
    return len;
268
}
269

  
270
int ff_ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile)
271
{
272
    int         mbn, blk, num_blocks, num_coeffs, blk_size, scan_pos, run, val,
273
                pos, is_intra, mc_type, mv_x, mv_y, col_mask;
274
    uint8_t     col_flags[8];
275
    int32_t     prev_dc, trvec[64];
276
    uint32_t    cbp, sym, lo, hi, quant, buf_offs, q;
277
    IVIMbInfo   *mb;
278
    RVMapDesc   *rvmap = band->rv_map;
279
    void (*mc_with_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
280
    void (*mc_no_delta_func)  (int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
281
    const uint8_t   *base_tab, *scale_tab;
282

  
283
    prev_dc = 0; /* init intra prediction for the DC coefficient */
284

  
285
    blk_size   = band->blk_size;
286
    col_mask   = blk_size - 1; /* column mask for tracking non-zero coeffs */
287
    num_blocks = (band->mb_size != blk_size) ? 4 : 1; /* number of blocks per mb */
288
    num_coeffs = blk_size * blk_size;
289
    if (blk_size == 8) {
290
        mc_with_delta_func = ff_ivi_mc_8x8_delta;
291
        mc_no_delta_func   = ff_ivi_mc_8x8_no_delta;
292
    } else {
293
        mc_with_delta_func = ff_ivi_mc_4x4_delta;
294
        mc_no_delta_func   = ff_ivi_mc_4x4_no_delta;
295
    }
296

  
297
    for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
298
        is_intra = !mb->type;
299
        cbp      = mb->cbp;
300
        buf_offs = mb->buf_offs;
301

  
302
        quant = av_clip(band->glob_quant + mb->q_delta, 0, 23);
303

  
304
        base_tab  = is_intra ? band->intra_base  : band->inter_base;
305
        scale_tab = is_intra ? band->intra_scale : band->inter_scale;
306

  
307
        if (!is_intra) {
308
            mv_x = mb->mv_x;
309
            mv_y = mb->mv_y;
310
            if (!band->is_halfpel) {
311
                mc_type = 0; /* we have only fullpel vectors */
312
            } else {
313
                mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
314
                mv_x >>= 1;
315
                mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
316
            }
317
        }
318

  
319
        for (blk = 0; blk < num_blocks; blk++) {
320
            /* adjust block position in the buffer according to its number */
321
            if (blk & 1) {
322
                buf_offs += blk_size;
323
            } else if (blk == 2) {
324
                buf_offs -= blk_size;
325
                buf_offs += blk_size * band->pitch;
326
            }
327

  
328
            if (cbp & 1) { /* block coded ? */
329
                scan_pos = -1;
330
                memset(trvec, 0, num_coeffs*sizeof(trvec[0])); /* zero transform vector */
331
                memset(col_flags, 0, sizeof(col_flags));      /* zero column flags */
332

  
333
                while (scan_pos <= num_coeffs) {
334
                    sym = get_vlc2(gb, band->blk_vlc->table, IVI_VLC_BITS, 1);
335
                    if (sym == rvmap->eob_sym)
336
                        break; /* End of block */
337

  
338
                    if (sym == rvmap->esc_sym) { /* Escape - run/val explicitly coded using 3 vlc codes */
339
                        run = get_vlc2(gb, band->blk_vlc->table, IVI_VLC_BITS, 1) + 1;
340
                        lo  = get_vlc2(gb, band->blk_vlc->table, IVI_VLC_BITS, 1);
341
                        hi  = get_vlc2(gb, band->blk_vlc->table, IVI_VLC_BITS, 1);
342
                        val = IVI_TOSIGNED((hi << 6) | lo); /* merge them and convert into signed val */
343
                    } else {
344
                        run = rvmap->runtab[sym];
345
                        val = rvmap->valtab[sym];
346
                    }
347

  
348
                    /* de-zigzag and dequantize */
349
                    scan_pos += run;
350
                    if (scan_pos >= num_coeffs)
351
                        break;
352
                    pos = band->scan[scan_pos];
353

  
354
                    if (IVI_DEBUG && !val)
355
                        av_log(NULL, AV_LOG_ERROR, "Val = 0 encountered!\n");
356

  
357
                    q = (base_tab[pos] * scale_tab[quant]) >> 8;
358
                    if (q > 1)
359
                        val = val * q + FFSIGN(val) * ((q >> 1) - (q & 1));
360
                    trvec[pos] = val;
361
                    col_flags[pos & col_mask] |= val; /* track columns containing non-zero coeffs */
362
                }// while
363

  
364
                if (scan_pos >= num_coeffs && sym != rvmap->eob_sym)
365
                    return -1; /* corrupt block data */
366

  
367
                /* undoing DC coeff prediction for intra-blocks */
368
                if (is_intra && band->is_2d_trans) {
369
                    prev_dc      += trvec[0];
370
                    trvec[0]      = prev_dc;
371
                    col_flags[0] |= !!prev_dc;
372
                }
373

  
374
                /* apply inverse transform */
375
                band->inv_transform(trvec, band->buf + buf_offs,
376
                                    band->pitch, col_flags);
377

  
378
                /* apply motion compensation */
379
                if (!is_intra)
380
                    mc_with_delta_func(band->buf + buf_offs,
381
                                       band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
382
                                       band->pitch, mc_type);
383
            } else {
384
                /* block not coded */
385
                /* for intra blocks apply the dc slant transform */
386
                /* for inter - perform the motion compensation without delta */
387
                if (is_intra && band->dc_transform) {
388
                    band->dc_transform(&prev_dc, band->buf + buf_offs,
389
                                       band->pitch, blk_size);
390
                } else
391
                    mc_no_delta_func(band->buf + buf_offs,
392
                                     band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
393
                                     band->pitch, mc_type);
394
            }
395

  
396
            cbp >>= 1;
397
        }// for blk
398
    }// for mbn
399

  
400
    align_get_bits(gb);
401

  
402
    return 0;
403
}
404

  
405
void ff_ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
406
                               IVITile *tile, int32_t mv_scale)
407
{
408
    int             x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
409
    int             offs, mb_offset, row_offset;
410
    IVIMbInfo       *mb, *ref_mb;
411
    const int16_t   *src;
412
    int16_t         *dst;
413
    void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch,
414
                             int mc_type);
415

  
416
    offs       = tile->ypos * band->pitch + tile->xpos;
417
    mb         = tile->mbs;
418
    ref_mb     = tile->ref_mbs;
419
    row_offset = band->mb_size * band->pitch;
420
    need_mc    = 0; /* reset the mc tracking flag */
421

  
422
    for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
423
        mb_offset = offs;
424

  
425
        for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
426
            mb->xpos     = x;
427
            mb->ypos     = y;
428
            mb->buf_offs = mb_offset;
429

  
430
            mb->type = 1; /* set the macroblocks type = INTER */
431
            mb->cbp  = 0; /* all blocks are empty */
432

  
433
            if (!band->qdelta_present && !band->plane && !band->band_num) {
434
                mb->q_delta = band->glob_quant;
435
                mb->mv_x    = 0;
436
                mb->mv_y    = 0;
437
            }
438

  
439
            if (band->inherit_qdelta && ref_mb)
440
                mb->q_delta = ref_mb->q_delta;
441

  
442
            if (band->inherit_mv) {
443
                /* motion vector inheritance */
444
                if (mv_scale) {
445
                    mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
446
                    mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
447
                } else {
448
                    mb->mv_x = ref_mb->mv_x;
449
                    mb->mv_y = ref_mb->mv_y;
450
                }
451
                need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
452
            }
453

  
454
            mb++;
455
            if (ref_mb)
456
                ref_mb++;
457
            mb_offset += band->mb_size;
458
        } // for x
459
        offs += row_offset;
460
    } // for y
461

  
462
    if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */
463
        num_blocks = (band->mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */
464
        mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
465
                                                 : ff_ivi_mc_4x4_no_delta;
466

  
467
        for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
468
            mv_x = mb->mv_x;
469
            mv_y = mb->mv_y;
470
            if (!band->is_halfpel) {
471
                mc_type = 0; /* we have only fullpel vectors */
472
            } else {
473
                mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
474
                mv_x >>= 1;
475
                mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
476
            }
477

  
478
            for (blk = 0; blk < num_blocks; blk++) {
479
                /* adjust block position in the buffer according with its number */
480
                offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
481
                mc_no_delta_func(band->buf + offs,
482
                                 band->ref_buf + offs + mv_y * band->pitch + mv_x,
483
                                 band->pitch, mc_type);
484
            }
485
        }
486
    } else {
487
        /* copy data from the reference tile into the current one */
488
        src = band->ref_buf + tile->ypos * band->pitch + tile->xpos;
489
        dst = band->buf     + tile->ypos * band->pitch + tile->xpos;
490
        for (y = 0; y < tile->height; y++) {
491
            memcpy(dst, src, tile->width*sizeof(band->buf[0]));
492
            src += band->pitch;
493
            dst += band->pitch;
494
        }
495
    }
496
}
497

  
498

  
499
#if IVI_DEBUG
500
uint16_t ivi_calc_band_checksum (IVIBandDesc *band)
501
{
502
    int         x, y;
503
    int16_t     *src, checksum;
504

  
505
    src = band->buf;
506
    checksum = 0;
507

  
508
    for (y = 0; y < band->height; src += band->pitch, y++)
509
        for (x = 0; x < band->width; x++)
510
            checksum += src[x];
511

  
512
    return checksum;
513
}
514

  
515
int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch)
516
{
517
    int         x, y, result;
518
    uint8_t     t1, t2;
519
    int16_t    *src;
520

  
521
    src = band->buf;
522
    result = 0;
523

  
524
    for (y = 0; y < band->height; src += band->pitch, y++) {
525
        for (x = 0; x < band->width; x++) {
526
            t1 = av_clip(src[x] + 128, 0, 255);
527
            t2 = ref[x];
528
            if (t1 != t2) {
529
                av_log(NULL, AV_LOG_ERROR, "Data mismatch: row %d, column %d\n",
530
                       y / band->blk_size, x / band->blk_size);
531
                result = -1;
532
            }
533
        }
534
        ref += pitch;
535
    }
536

  
537
    return result;
538
}
539
#endif
540

  
541
void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch)
542
{
543
    int             x, y;
544
    const int16_t   *src  = plane->bands[0].buf;
545
    uint32_t        pitch = plane->bands[0].pitch;
546

  
547
    for (y = 0; y < plane->height; y++) {
548
        for (x = 0; x < plane->width; x++)
549
            dst[x] = av_clip_uint8(src[x] + 128);
550
        src += pitch;
551
        dst += dst_pitch;
552
    }
553
}
554

  
555

  
556
/**
557
 * These are 2x8 predefined Huffman codebooks for coding macroblock/block
558
 * signals. They are specified using "huffman descriptors" in order to
559
 * avoid huge static tables. The decoding tables will be generated at
560
 * startup from these descriptors.
561
 */
562
const IVIHuffDesc ff_ivi_mb_huff_desc[8] = {
563
    {8,  {0, 4, 5, 4, 4, 4, 6, 6}},
564
    {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
565
    {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
566
    {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
567
    {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
568
    {9,  {0, 4, 4, 4, 4, 3, 3, 3, 2}},
569
    {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
570
    {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
571
};
572

  
573
const IVIHuffDesc ff_ivi_blk_huff_desc[8] = {
574
    {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
575
    {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
576
    {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
577
    {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
578
    {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
579
    {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
580
    {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
581
    {9,  {3, 4, 4, 5, 5, 5, 6, 5, 5}}
582
};
583

  
584

  
585
/**
586
 *  Run-value (RLE) tables.
587
 */
588
const RVMapDesc ff_ivi_rvmap_tabs[9] = {
589
{   /* MapTab0 */
590
    5, /* eob_sym */
591
    2, /* esc_sym */
592
    /* run table */
593
    {1,  1,  0,  1,  1,  0,  1,  1,  2,  2,  1,  1,  1,  1,  3,  3,
594
     1,  1,  2,  2,  1,  1,  4,  4,  1,  1,  1,  1,  2,  2,  5,  5,
595
     1,  1,  3,  3,  1,  1,  6,  6,  1,  2,  1,  2,  7,  7,  1,  1,
596
     8,  8,  1,  1,  4,  2,  1,  4,  2,  1,  3,  3,  1,  1,  1,  9,
597
     9,  1,  2,  1,  2,  1,  5,  5,  1,  1, 10, 10,  1,  1,  3,  3,
598
     2,  2,  1,  1, 11, 11,  6,  4,  4,  1,  6,  1,  2,  1,  2, 12,
599
     8,  1, 12,  7,  8,  7,  1, 16,  1, 16,  1,  3,  3, 13,  1, 13,
600
     2,  2,  1, 15,  1,  5, 14, 15,  1,  5, 14,  1, 17,  8, 17,  8,
601
     1,  4,  4,  2,  2,  1, 25, 25, 24, 24,  1,  3,  1,  3,  1,  8,
602
     6,  7,  6,  1, 18,  8, 18,  1,  7, 23,  2,  2, 23,  1,  1, 21,
603
    22,  9,  9, 22, 19,  1, 21,  5, 19,  5,  1, 33, 20, 33, 20,  8,
604
     4,  4,  1, 32,  2,  2,  8,  3, 32, 26,  3,  1,  7,  7, 26,  6,
605
     1,  6,  1,  1, 16,  1, 10,  1, 10,  2, 16, 29, 28,  2, 29, 28,
606
     1, 27,  5,  8,  5, 27,  1,  8,  3,  7,  3, 31, 41, 31,  1, 41,
607
     6,  1,  6,  7,  4,  4,  1,  1,  2,  1,  2, 11, 34, 30, 11,  1,
608
    30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
609

  
610
    /* value table */
611
    { 1,  -1,   0,   2,  -2,   0,   3,  -3,   1,  -1,   4,  -4,   5,  -5,   1,  -1,
612
      6,  -6,   2,  -2,   7,  -7,   1,  -1,   8,  -8,   9,  -9,   3,  -3,   1,  -1,
613
     10, -10,   2,  -2,  11, -11,   1,  -1,  12,   4, -12,  -4,   1,  -1,  13, -13,
614
      1,  -1,  14, -14,   2,   5,  15,  -2,  -5, -15,  -3,   3,  16, -16,  17,   1,
615
     -1, -17,   6,  18,  -6, -18,   2,  -2,  19, -19,   1,  -1,  20, -20,   4,  -4,
616
      7,  -7,  21, -21,   1,  -1,   2,   3,  -3,  22,  -2, -22,   8,  23,  -8,   1,
617
      2, -23,  -1,   2,  -2,  -2,  24,   1, -24,  -1,  25,   5,  -5,   1, -25,  -1,
618
      9,  -9,  26,   1, -26,   3,   1,  -1,  27,  -3,  -1, -27,   1,   3,  -1,  -3,
619
     28,  -4,   4,  10, -10, -28,   1,  -1,   1,  -1,  29,   6, -29,  -6,  30,  -4,
620
      3,   3,  -3, -30,   1,   4,  -1,  31,  -3,   1,  11, -11,  -1, -31,  32,  -1,
621
     -1,   2,  -2,   1,   1, -32,   1,   4,  -1,  -4,  33,  -1,   1,   1,  -1,   5,
622
      5,  -5, -33,  -1, -12,  12,  -5,  -7,   1,   1,   7,  34,   4,  -4,  -1,   4,
623
    -34,  -4,  35,  36,  -2, -35,  -2, -36,   2,  13,   2,  -1,   1, -13,   1,  -1,
624
     37,   1,  -5,   6,   5,  -1,  38,  -6,  -8,   5,   8,  -1,   1,   1, -37,  -1,
625
      5,  39,  -5,  -5,   6,  -6, -38, -39, -14,  40,  14,   2,   1,   1,  -2, -40,
626
     -1,  -2,   2,  -1,  -1,  -1,   1,   1,   1,  -1,   1,  -1,   1,  -1,   1,  -1}
627
},{
628
    /* MapTab1 */
629
    0,  /* eob_sym */
630
    38, /* esc_sym */
631
    /* run table */
632
    {0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  8,  6,  8,  7,
633
     7,  9,  9, 10, 10, 11, 11,  1, 12,  1, 12, 13, 13, 16, 14, 16,
634
    14, 15, 15, 17, 17, 18,  0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
635
    25, 24,  2, 25, 24, 23, 23,  2, 26, 28, 26, 28, 29, 27, 29, 27,
636
    33, 33,  1, 32,  1,  3, 32, 30, 36,  3, 36, 30, 31, 31, 35, 34,
637
    37, 41, 34, 35, 37,  4, 41,  4, 49,  8,  8, 49, 40, 38,  5, 38,
638
    40, 39,  5, 39, 42, 43, 42,  7, 57,  6, 43, 44,  6, 50,  7, 44,
639
    57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58,  1, 51, 58,  1,
640
    52, 59, 53,  9, 52, 55, 55, 59, 53, 56, 54, 56, 54,  9, 64, 64,
641
    60, 63, 60, 63, 61, 62, 61, 62,  2, 10,  2, 10, 11,  1, 11, 13,
642
    12,  1, 12, 13, 16, 16,  8,  8, 14,  3,  3, 15, 14, 15,  4,  4,
643
     1, 17, 17,  5,  1,  7,  7,  5,  6,  1,  2,  2,  6, 22,  1, 25,
644
    21, 22,  8, 24,  1, 21, 25, 24,  8, 18, 18, 23,  9, 20, 23, 33,
645
    29, 33, 20,  1, 19,  1, 29, 36,  9, 36, 19, 41, 28, 57, 32,  3,
646
    28,  3,  1, 27, 49, 49,  1, 32, 26, 26,  2,  4,  4,  7, 57, 41,
647
     2,  7, 10,  5, 37, 16, 10, 27,  8,  8, 13, 16, 37, 13,  1,  5},
648

  
649
    /* value table */
650
    {0,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,   1,  -1,  -1,   1,
651
    -1,   1,  -1,   1,  -1,   1,  -1,   2,   1,  -2,  -1,   1,  -1,   1,   1,  -1,
652
    -1,   1,  -1,   1,  -1,   1,   0,  -1,   1,   1,   1,  -1,   1,  -1,  -1,  -1,
653
     1,   1,   2,  -1,  -1,   1,  -1,  -2,   1,   1,  -1,  -1,   1,   1,  -1,  -1,
654
     1,  -1,   3,   1,  -3,   2,  -1,   1,   1,  -2,  -1,  -1,  -1,   1,   1,   1,
655
     1,   1,  -1,  -1,  -1,   2,  -1,  -2,   1,   2,  -2,  -1,   1,   1,   2,  -1,
656
    -1,   1,  -2,  -1,   1,   1,  -1,   2,   1,   2,  -1,   1,  -2,  -1,  -2,  -1,
657
    -1,   1,   1,  -1,   1,  -1,   1,   1,   1,  -1,  -1,   1,   4,  -1,  -1,  -4,
658
     1,   1,   1,   2,  -1,  -1,   1,  -1,  -1,   1,  -1,  -1,   1,  -2,   1,  -1,
659
     1,   1,  -1,  -1,   1,   1,  -1,  -1,   3,   2,  -3,  -2,   2,   5,  -2,   2,
660
     2,  -5,  -2,  -2,  -2,   2,  -3,   3,   2,   3,  -3,   2,  -2,  -2,   3,  -3,
661
     6,   2,  -2,   3,  -6,   3,  -3,  -3,   3,   7,  -4,   4,  -3,   2,  -7,   2,
662
     2,  -2,  -4,   2,   8,  -2,  -2,  -2,   4,   2,  -2,   2,   3,   2,  -2,  -2,
663
     2,   2,  -2,  -8,  -2,   9,  -2,   2,  -3,  -2,   2,  -2,   2,   2,   2,   4,
664
    -2,  -4,  10,   2,   2,  -2,  -9,  -2,   2,  -2,   5,   4,  -4,   4,  -2,   2,
665
    -5,  -4,  -3,   4,   2,  -3,   3,  -2,  -5,   5,   3,   3,  -2,  -3, -10,  -4}
666
},{
667
    /* MapTab2 */
668
    2,  /* eob_sym */
669
    11, /* esc_sym */
670
    /* run table */
671
    {1,  1,  0,  2,  2,  1,  1,  3,  3,  4,  4,  0,  1,  1,  5,  5,
672
     2,  2,  6,  6,  7,  7,  1,  8,  1,  8,  3,  3,  9,  9,  1,  2,
673
     2,  1,  4, 10,  4, 10, 11, 11,  1,  5, 12, 12,  1,  5, 13, 13,
674
     3,  3,  6,  6,  2,  2, 14, 14, 16, 16, 15,  7, 15,  8,  8,  7,
675
     1,  1, 17, 17,  4,  4,  1,  1, 18, 18,  2,  2,  5,  5, 25,  3,
676
     9,  3, 25,  9, 19, 24, 19, 24,  1, 21, 20,  1, 21, 22, 20, 22,
677
    23, 23,  8,  6, 33,  6,  8, 33,  7,  7, 26, 26,  1, 32,  1, 32,
678
    28,  4, 28, 10, 29, 27, 27, 10, 41,  4, 29,  2,  2, 41, 36, 31,
679
    49, 31, 34, 30, 34, 36, 30, 35,  1, 49, 11,  5, 35, 11,  1,  3,
680
     3,  5, 37, 37,  8, 40,  8, 40, 12, 12, 42, 42,  1, 38, 16, 57,
681
     1,  6, 16, 39, 38,  6,  7,  7, 13, 13, 39, 43,  2, 43, 57,  2,
682
    50,  9, 44,  9, 50,  4, 15, 48, 44,  4,  1, 15, 48, 14, 14,  1,
683
    45, 45,  8,  3,  5,  8, 51, 47,  3, 46, 46, 47,  5, 51,  1, 17,
684
    17, 58,  1, 58,  2, 52, 52,  2, 53,  7, 59,  6,  6, 56, 53, 55,
685
     7, 55,  1, 54, 59, 56, 54, 10,  1, 10,  4, 60,  1, 60,  8,  4,
686
     8, 64, 64, 61,  1, 63,  3, 63, 62, 61,  5, 11,  5,  3, 11, 62},
687

  
688
    /* value table */
689
    { 1,  -1,   0,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   0,   3,  -3,   1,  -1,
690
      2,  -2,   1,  -1,   1,  -1,   4,   1,  -4,  -1,   2,  -2,   1,  -1,   5,   3,
691
     -3,  -5,   2,   1,  -2,  -1,   1,  -1,   6,   2,   1,  -1,  -6,  -2,   1,  -1,
692
      3,  -3,   2,  -2,   4,  -4,   1,  -1,   1,  -1,   1,   2,  -1,   2,  -2,  -2,
693
      7,  -7,   1,  -1,   3,  -3,   8,  -8,   1,  -1,   5,  -5,   3,  -3,   1,   4,
694
      2,  -4,  -1,  -2,   1,   1,  -1,  -1,   9,   1,   1,  -9,  -1,   1,  -1,  -1,
695
      1,  -1,   3,  -3,   1,   3,  -3,  -1,   3,  -3,   1,  -1,  10,   1, -10,  -1,
696
      1,   4,  -1,   2,   1,  -1,   1,  -2,   1,  -4,  -1,   6,  -6,  -1,   1,   1,
697
      1,  -1,   1,   1,  -1,  -1,  -1,   1,  11,  -1,  -2,   4,  -1,   2, -11,   5,
698
     -5,  -4,  -1,   1,   4,   1,  -4,  -1,  -2,   2,   1,  -1,  12,   1,  -2,   1,
699
    -12,   4,   2,   1,  -1,  -4,   4,  -4,   2,  -2,  -1,   1,   7,  -1,  -1,  -7,
700
     -1,  -3,   1,   3,   1,   5,   2,   1,  -1,  -5,  13,  -2,  -1,   2,  -2, -13,
701
      1,  -1,   5,   6,   5,  -5,   1,   1,  -6,   1,  -1,  -1,  -5,  -1,  14,   2,
702
     -2,   1, -14,  -1,   8,   1,  -1,  -8,   1,   5,   1,   5,  -5,   1,  -1,   1,
703
     -5,  -1,  15,   1,  -1,  -1,  -1,   3, -15,  -3,   6,   1,  16,  -1,   6,  -6,
704
     -6,   1,  -1,   1, -16,   1,   7,  -1,   1,  -1,  -6,  -3,   6,  -7,   3,  -1}
705
},{
706
    /* MapTab3 */
707
    0,  /* eob_sym */
708
    35, /* esc_sym */
709
    /* run table */
710
    {0,  1,  1,  2,  2,  3,  3,  4,  4,  1,  1,  5,  5,  6,  6,  7,
711
     7,  8,  8,  9,  9,  2,  2, 10, 10,  1,  1, 11, 11, 12, 12,  3,
712
     3, 13, 13,  0, 14, 14, 16, 15, 16, 15,  4,  4, 17,  1, 17,  1,
713
     5,  5, 18, 18,  2,  2,  6,  6,  8, 19,  7,  8,  7, 19, 20, 20,
714
    21, 21, 22, 24, 22, 24, 23, 23,  1,  1, 25, 25,  3,  3, 26, 26,
715
     9,  9, 27, 27, 28, 28, 33, 29,  4, 33, 29,  1,  4,  1, 32, 32,
716
     2,  2, 31, 10, 30, 10, 30, 31, 34, 34,  5,  5, 36, 36, 35, 41,
717
    35, 11, 41, 11, 37,  1,  8,  8, 37,  6,  1,  6, 40,  7,  7, 40,
718
    12, 38, 12, 39, 39, 38, 49, 13, 49, 13,  3, 42,  3, 42, 16, 16,
719
    43, 43, 14, 14,  1,  1, 44, 15, 44, 15,  2,  2, 57, 48, 50, 48,
720
    57, 50,  4, 45, 45,  4, 46, 47, 47, 46,  1, 51,  1, 17, 17, 51,
721
     8,  9,  9,  5, 58,  8, 58,  5, 52, 52, 55, 56, 53, 56, 55, 59,
722
    59, 53, 54,  1,  6, 54,  7,  7,  6,  1,  2,  3,  2,  3, 64, 60,
723
    60, 10, 10, 64, 61, 62, 61, 63,  1, 63, 62,  1, 18, 24, 18,  4,
724
    25,  4,  8, 21, 21,  1, 24, 22, 25, 22,  8, 11, 19, 11, 23,  1,
725
    20, 23, 19, 20,  5, 12,  5,  1, 16,  2, 12, 13,  2, 13,  1, 16},
726

  
727
    /* value table */
728
    { 0,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   1,
729
     -1,   1,  -1,   1,  -1,   2,  -2,   1,  -1,   3,  -3,   1,  -1,   1,  -1,   2,
730
     -2,   1,  -1,   0,   1,  -1,   1,   1,  -1,  -1,   2,  -2,   1,   4,  -1,  -4,
731
      2,  -2,   1,  -1,  -3,   3,   2,  -2,   2,   1,   2,  -2,  -2,  -1,   1,  -1,
732
      1,  -1,   1,   1,  -1,  -1,   1,  -1,   5,  -5,   1,  -1,   3,  -3,   1,  -1,
733
      2,  -2,   1,  -1,   1,  -1,   1,   1,   3,  -1,  -1,   6,  -3,  -6,  -1,   1,
734
      4,  -4,   1,   2,   1,  -2,  -1,  -1,   1,  -1,   3,  -3,   1,  -1,   1,   1,
735
     -1,   2,  -1,  -2,   1,   7,  -3,   3,  -1,   3,  -7,  -3,   1,  -3,   3,  -1,
736
      2,   1,  -2,   1,  -1,  -1,   1,   2,  -1,  -2,  -4,  -1,   4,   1,   2,  -2,
737
      1,  -1,  -2,   2,   8,  -8,  -1,   2,   1,  -2,  -5,   5,   1,  -1,  -1,   1,
738
     -1,   1,   4,  -1,   1,  -4,  -1,  -1,   1,   1,   9,   1,  -9,   2,  -2,  -1,
739
     -4,   3,  -3,  -4,  -1,   4,   1,   4,   1,  -1,   1,  -1,   1,   1,  -1,   1,
740
     -1,  -1,  -1,  10,   4,   1,   4,  -4,  -4, -10,   6,   5,  -6,  -5,   1,  -1,
741
      1,   3,  -3,  -1,   1,  -1,  -1,  -1,  11,   1,   1, -11,  -2,  -2,   2,   5,
742
     -2,  -5,  -5,   2,  -2,  12,   2,  -2,   2,   2,   5,  -3,  -2,   3,  -2, -12,
743
     -2,   2,   2,   2,  -5,   3,   5,  13,  -3,   7,  -3,  -3,  -7,   3, -13,   3}
744
},{
745
    /* MapTab4 */
746
    0,  /* eob_sym */
747
    34, /* esc_sym */
748
    /* run table */
749
    {0,  1,  1,  1,  2,  2,  1,  3,  3,  1,  1,  1,  4,  4,  1,  5,
750
     2,  1,  5,  2,  1,  1,  6,  6,  1,  1,  1,  1,  1,  7,  3,  1,
751
     2,  3,  0,  1,  2,  7,  1,  1,  1,  8,  1,  1,  8,  1,  1,  1,
752
     9,  1,  9,  1,  2,  1,  1,  2,  1,  1, 10,  4,  1, 10,  1,  4,
753
     1,  1,  1,  1,  1,  3,  1,  1,  1,  3,  2,  1,  5,  1,  1,  1,
754
     2,  5,  1, 11,  1, 11,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
755
     2,  1,  6,  1,  6,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1, 12,
756
     3,  1, 12,  1,  1,  1,  2,  1,  1,  3,  1,  1,  1,  1,  1,  1,
757
     4,  1,  1,  1,  2,  1,  1,  4,  1,  1,  1,  1,  1,  1,  2,  1,
758
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  3,  1,  2,  1,  1,  5,
759
     1,  1,  1,  1,  1,  7,  1,  7,  1,  1,  2,  3,  1,  1,  1,  1,
760
     5,  1,  1,  1,  1,  1,  1,  2, 13,  1,  1,  1,  1,  1,  1,  1,
761
     1,  1,  1,  1,  1,  1,  1,  1, 13,  2,  1,  1,  4,  1,  1,  1,
762
     3,  1,  6,  1,  1,  1, 14,  1,  1,  1,  1,  1, 14,  6,  1,  1,
763
     1,  1, 15,  2,  4,  1,  2,  3, 15,  1,  1,  1,  8,  1,  1,  8,
764
     1,  1,  1,  1,  1,  1,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1},
765

  
766
    /* value table */
767
    { 0,   1,  -1,   2,   1,  -1,  -2,   1,  -1,   3,  -3,   4,   1,  -1,  -4,   1,
768
      2,   5,  -1,  -2,  -5,   6,   1,  -1,  -6,   7,  -7,   8,  -8,   1,   2,   9,
769
      3,  -2,   0,  -9,  -3,  -1,  10, -10,  11,   1, -11,  12,  -1, -12,  13, -13,
770
      1,  14,  -1, -14,   4,  15, -15,  -4,  16, -16,   1,   2,  17,  -1, -17,  -2,
771
     18, -18,  19, -19,  20,   3, -20,  21, -21,  -3,   5,  22,   2, -22, -23,  23,
772
     -5,  -2,  24,   1, -24,  -1,  25, -25,  26, -26, -27,  27,  28,  29, -28, -29,
773
      6,  30,   2, -31,  -2, -30,  31,  -6, -32,  32,  33, -33,  34, -35, -34,   1,
774
      4, -36,  -1,  35,  37,  36,   7, -37,  38,  -4, -38,  39,  41,  40, -40, -39,
775
      3,  42, -43, -41,  -7, -42,  43,  -3,  44, -44,  45, -45,  46,  47,   8, -47,
776
    -48, -46,  50, -50,  48,  49,  51, -49,  52, -52,   5, -51,  -8, -53,  53,   3,
777
    -56,  56,  55,  54, -54,   2,  60,  -2, -55,  58,   9,  -5,  59,  57, -57, -63,
778
     -3, -58, -60, -61,  61, -59, -62,  -9,   1,  64,  62,  69, -64,  63,  65, -67,
779
    -68,  66, -65,  68, -66, -69,  67, -70,  -1,  10,  71, -71,   4,  73,  72,  70,
780
      6, -76,  -3,  74, -78, -74,   1,  78,  80, -72, -75,  76,  -1,   3, -73,  79,
781
     75,  77,   1,  11,  -4, -79, -10,  -6,  -1, -77, -83, -80,   2,  81, -84,  -2,
782
     83, -81,  82, -82,  84, -87, -86,  85, -11, -85,  86, -89,  87, -88,  88,  89}
783
},{
784
    /* MapTab5 */
785
    2,  /* eob_sym */
786
    33, /* esc_sym */
787
    /* run table */
788
    {1,  1,  0,  2,  1,  2,  1,  3,  3,  1,  1,  4,  4,  2,  2,  1,
789
     1,  5,  5,  6,  1,  6,  1,  7,  7,  3,  3,  2,  8,  2,  8,  1,
790
     1,  0,  9,  9,  1,  1, 10,  4, 10,  4, 11, 11,  2,  1,  2,  1,
791
    12, 12,  3,  3,  1,  1, 13,  5,  5, 13, 14,  1,  1, 14,  2,  2,
792
     6,  6, 15,  1,  1, 15, 16,  4,  7, 16,  4,  7,  1,  1,  3,  3,
793
     8,  8,  2,  2,  1,  1, 17, 17,  1,  1, 18, 18,  5,  5,  2,  2,
794
     1,  1,  9, 19,  9, 19, 20,  3,  3, 20,  1, 10, 21,  1, 10,  4,
795
     4, 21, 22,  6,  6, 22,  1,  1, 23, 24,  2,  2, 23, 24, 11,  1,
796
     1, 11,  7, 25,  7,  1,  1, 25,  8,  8,  3, 26,  3,  1, 12,  2,
797
     2, 26,  1, 12,  5,  5, 27,  4,  1,  4,  1, 27, 28,  1, 28, 13,
798
     1, 13,  2, 29,  2,  1, 32,  6,  1, 30, 14, 29, 14,  6,  3, 31,
799
     3,  1, 30,  1, 32, 31, 33,  9, 33,  1,  1,  7,  9,  7,  2,  2,
800
     1,  1,  4, 36, 34,  4,  5, 10, 10,  5, 34,  1,  1, 35,  8,  8,
801
    36,  3, 35,  1, 15,  3,  2,  1, 16, 15, 16,  2, 37,  1, 37,  1,
802
     1,  1,  6,  6, 38,  1, 38, 11,  1, 39, 39, 40, 11,  2, 41,  4,
803
    40,  1,  2,  4,  1,  1,  1, 41,  3,  1,  3,  1,  5,  7,  5,  7},
804

  
805
    /* value table */
806
    { 1,  -1,   0,   1,   2,  -1,  -2,   1,  -1,   3,  -3,   1,  -1,   2,  -2,   4,
807
     -4,   1,  -1,   1,   5,  -1,  -5,   1,  -1,   2,  -2,   3,   1,  -3,  -1,   6,
808
     -6,   0,   1,  -1,   7,  -7,   1,   2,  -1,  -2,   1,  -1,   4,   8,  -4,  -8,
809
      1,  -1,   3,  -3,   9,  -9,   1,   2,  -2,  -1,   1,  10, -10,  -1,   5,  -5,
810
      2,  -2,   1,  11, -11,  -1,   1,   3,   2,  -1,  -3,  -2,  12, -12,   4,  -4,
811
      2,  -2,  -6,   6,  13, -13,   1,  -1,  14, -14,   1,  -1,   3,  -3,   7,  -7,
812
     15, -15,   2,   1,  -2,  -1,   1,   5,  -5,  -1, -16,   2,   1,  16,  -2,   4,
813
     -4,  -1,   1,   3,  -3,  -1,  17, -17,   1,   1,  -8,   8,  -1,  -1,   2,  18,
814
    -18,  -2,   3,   1,  -3,  19, -19,  -1,   3,  -3,   6,   1,  -6,  20,   2,   9,
815
     -9,  -1, -20,  -2,   4,  -4,   1,  -5,  21,   5, -21,  -1,   1, -22,  -1,   2,
816
     22,  -2,  10,   1, -10,  23,   1,   4, -23,   1,   2,  -1,  -2,  -4,  -7,   1,
817
      7, -24,  -1,  24,  -1,  -1,   1,   3,  -1, -25,  25,   4,  -3,  -4,  11, -11,
818
     26, -26,   6,   1,   1,  -6,  -5,  -3,   3,   5,  -1, -27,  27,   1,   4,  -4,
819
     -1,  -8,  -1,  28,   2,   8, -12, -28,  -2,  -2,   2,  12,  -1,  29,   1, -29,
820
     30, -30,   5,  -5,   1, -31,  -1,   3,  31,  -1,   1,   1,  -3, -13,   1,  -7,
821
     -1, -32,  13,   7,  32,  33, -33,  -1,  -9, -34,   9,  34,  -6,   5,   6,  -5}
822
},{
823
    /* MapTab6 */
824
    2,  /* eob_sym */
825
    13, /* esc_sym */
826
    /* run table */
827
    {1,  1,  0,  1,  1,  2,  2,  1,  1,  3,  3,  1,  1,  0,  2,  2,
828
     4,  1,  4,  1,  1,  1,  5,  5,  1,  1,  6,  6,  2,  2,  1,  1,
829
     3,  3,  7,  7,  1,  1,  8,  8,  1,  1,  2,  2,  1,  9,  1,  9,
830
     4,  4, 10,  1,  1, 10,  1,  1, 11, 11,  3,  3,  1,  2,  1,  2,
831
     1,  1, 12, 12,  5,  5,  1,  1, 13,  1,  1, 13,  2,  2,  1,  1,
832
     6,  6,  1,  1,  4, 14,  4, 14,  3,  1,  3,  1,  1,  1, 15,  7,
833
    15,  2,  2,  7,  1,  1,  1,  8,  1,  8, 16, 16,  1,  1,  1,  1,
834
     2,  1,  1,  2,  1,  1,  3,  5,  5,  3,  4,  1,  1,  4,  1,  1,
835
    17, 17,  9,  1,  1,  9,  2,  2,  1,  1, 10, 10,  1,  6,  1,  1,
836
     6, 18,  1,  1, 18,  1,  1,  1,  2,  2,  3,  1,  3,  1,  1,  1,
837
     4,  1, 19,  1, 19,  7,  1,  1, 20,  1,  4, 20,  1,  7, 11,  2,
838
     1, 11, 21,  2,  8,  5,  1,  8,  1,  5, 21,  1,  1,  1, 22,  1,
839
     1, 22,  1,  1,  3,  3,  1, 23,  2, 12, 24,  1,  1,  2,  1,  1,
840
    12, 23,  1,  1, 24,  1,  1,  1,  4,  1,  1,  1,  2,  1,  6,  6,
841
     4,  2,  1,  1,  1,  1,  1,  1,  1, 14, 13,  3,  1, 25,  9, 25,
842
    14,  1,  9,  3, 13,  1,  1,  1,  1,  1, 10,  1,  1,  2, 10,  2},
843

  
844
    /* value table */
845
    {-20,  -1,   0,   2,  -2,   1,  -1,   3,  -3,   1,  -1,   4,  -4,   0,   2,  -2,
846
       1,   5,  -1,  -5,   6,  -6,   1,  -1,   7,  -7,   1,  -1,   3,  -3,   8,  -8,
847
       2,  -2,   1,  -1,   9,  -9,   1,  -1,  10, -10,   4,  -4,  11,   1, -11,  -1,
848
       2,  -2,   1,  12, -12,  -1,  13, -13,   1,  -1,   3,  -3,  14,   5, -14,  -5,
849
     -15,  15,  -1,   1,   2,  -2,  16, -16,   1,  17, -17,  -1,   6,  -6,  18, -18,
850
       2,  -2, -19,  19,  -3,   1,   3,  -1,   4,  20,  -4,   1, -21,  21,   1,   2,
851
      -1,  -7,   7,  -2,  22, -22,  23,   2, -23,  -2,   1,  -1, -24,  24, -25,  25,
852
      -8, -26,  26,   8, -27,  27,   5,   3,  -3,  -5,  -4,  28, -28,   4,  29, -29,
853
       1,  -1,  -2, -30,  30,   2,   9,  -9, -31,  31,   2,  -2, -32,   3,  32, -33,
854
      -3,   1,  33, -34,  -1,  34, -35,  35, -10,  10,  -6,  36,   6, -36,  37, -37,
855
      -5,  38,   1, -38,  -1,   3,  39, -39,  -1,  40,   5,   1, -40,  -3,   2, -11,
856
     -41,  -2,   1,  11,  -3,  -4,  41,   3,  42,   4,  -1, -43, -42,  43,   1, -44,
857
      45,  -1,  44, -45,  -7,   7, -46,   1, -12,   2,   1, -47,  46,  12,  47,  48,
858
      -2,  -1, -48,  49,  -1, -50, -49,  50,  -6, -51,  51,  52, -13,  53,  -4,   4,
859
       6,  13, -53, -52, -54,  55,  54, -55, -56,  -2,   2,  -8,  56,   1,  -3,  -1,
860
       2,  58,   3,   8,  -2,  57, -58, -60, -59, -57,  -3,  60,  59, -14,   3,  14}
861
},{
862
    /* MapTab7 */
863
    2,  /* eob_sym */
864
    38, /* esc_sym */
865
    /* run table */
866
    {1,  1,  0,  2,  2,  1,  1,  3,  3,  4,  4,  5,  5,  1,  1,  6,
867
     6,  2,  2,  7,  7,  8,  8,  1,  1,  3,  3,  9,  9, 10, 10,  1,
868
     1,  2,  2,  4,  4, 11,  0, 11, 12, 12, 13, 13,  1,  1,  5,  5,
869
    14, 14, 15, 16, 15, 16,  3,  3,  1,  6,  1,  6,  2,  2,  7,  7,
870
     8,  8, 17, 17,  1,  1,  4,  4, 18, 18,  2,  2,  1, 19,  1, 20,
871
    19, 20, 21, 21,  3,  3, 22, 22,  5,  5, 24,  1,  1, 23,  9, 23,
872
    24,  9,  2,  2, 10,  1,  1, 10,  6,  6, 25,  4,  4, 25,  7,  7,
873
    26,  8,  1,  8,  3,  1, 26,  3, 11, 11, 27, 27,  2, 28,  1,  2,
874
    28,  1, 12, 12,  5,  5, 29, 13, 13, 29, 32,  1,  1, 33, 31, 30,
875
    32,  4, 30, 33,  4, 31,  3, 14,  1,  1,  3, 34, 34,  2,  2, 14,
876
     6,  6, 35, 36, 35, 36,  1, 15,  1, 16, 16, 15,  7,  9,  7,  9,
877
    37,  8,  8, 37,  1,  1, 39,  2, 38, 39,  2, 40,  5, 38, 40,  5,
878
     3,  3,  4,  4, 10, 10,  1,  1,  1,  1, 41,  2, 41,  2,  6,  6,
879
     1,  1, 11, 42, 11, 43,  3, 42,  3, 17,  4, 43,  1, 17,  7,  1,
880
     8, 44,  4,  7, 44,  5,  8,  2,  5,  1,  2, 48, 45,  1, 12, 45,
881
    12, 48, 13, 13,  1,  9,  9, 46,  1, 46, 47, 47, 49, 18, 18, 49},
882

  
883
    /* value table */
884
    { 1,  -1,   0,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   1,  -1,   3,  -3,   1,
885
     -1,  -2,   2,   1,  -1,   1,  -1,   4,  -4,  -2,   2,   1,  -1,   1,  -1,   5,
886
     -5,  -3,   3,   2,  -2,   1,   0,  -1,   1,  -1,   1,  -1,   6,  -6,   2,  -2,
887
      1,  -1,   1,   1,  -1,  -1,  -3,   3,   7,   2,  -7,  -2,  -4,   4,   2,  -2,
888
      2,  -2,   1,  -1,   8,  -8,   3,  -3,   1,  -1,  -5,   5,   9,   1,  -9,   1,
889
     -1,  -1,   1,  -1,  -4,   4,   1,  -1,   3,  -3,   1, -10,  10,   1,   2,  -1,
890
     -1,  -2,   6,  -6,   2,  11, -11,  -2,   3,  -3,   1,  -4,   4,  -1,   3,  -3,
891
      1,   3,  12,  -3,  -5, -12,  -1,   5,   2,  -2,   1,  -1,  -7,   1,  13,   7,
892
     -1, -13,   2,  -2,   4,  -4,   1,   2,  -2,  -1,   1,  14, -14,   1,   1,   1,
893
     -1,  -5,  -1,  -1,   5,  -1,  -6,   2, -15,  15,   6,   1,  -1,  -8,   8,  -2,
894
     -4,   4,   1,   1,  -1,  -1,  16,   2, -16,  -2,   2,  -2,   4,   3,  -4,  -3,
895
     -1,  -4,   4,   1, -17,  17,  -1,  -9,   1,   1,   9,   1,  -5,  -1,  -1,   5,
896
     -7,   7,   6,  -6,   3,  -3,  18, -18,  19, -19,   1, -10,  -1,  10,  -5,   5,
897
     20, -20,  -3,   1,   3,   1,   8,  -1,  -8,   2,   7,  -1, -21,  -2,   5,  21,
898
      5,  -1,  -7,  -5,   1,  -6,  -5, -11,   6,  22,  11,   1,   1, -22,  -3,  -1,
899
      3,  -1,   3,  -3, -23,   4,  -4,   1,  23,  -1,   1,  -1,   1,  -2,   2,  -1}
900
},{
901
    /* MapTab8 */
902
    4,  /* eob_sym */
903
    11, /* esc_sym */
904
    /* run table */
905
    {1,  1,  1,  1,  0,  2,  2,  1,  1,  3,  3,  0,  1,  1,  2,  2,
906
     4,  4,  1,  1,  5,  5,  1,  1,  2,  2,  3,  3,  6,  6,  1,  1,
907
     7,  7,  8,  1,  8,  2,  2,  1,  4,  4,  1,  3,  1,  3,  9,  9,
908
     2,  2,  1,  5,  1,  5, 10, 10,  1,  1, 11, 11,  3,  6,  3,  4,
909
     4,  6,  2,  2,  1, 12,  1, 12,  7, 13,  7, 13,  1,  1,  8,  8,
910
     2,  2, 14, 14, 16, 15, 16,  5,  5,  1,  3, 15,  1,  3,  4,  4,
911
     1,  1, 17, 17,  2,  2,  6,  6,  1, 18,  1, 18, 22, 21, 22, 21,
912
    25, 24, 25, 19,  9, 20,  9, 23, 19, 24, 20,  3, 23,  7,  3,  1,
913
     1,  7, 28, 26, 29,  5, 28, 26,  5,  8, 29,  4,  8, 27,  2,  2,
914
     4, 27,  1,  1, 10, 36, 10, 33, 33, 36, 30,  1, 32, 32,  1, 30,
915
     6, 31, 31, 35,  3,  6, 11, 11,  3,  2, 35,  2, 34,  1, 34,  1,
916
    37, 37, 12,  7, 12,  5, 41,  5,  4,  7,  1,  8, 13,  4,  1, 41,
917
    13, 38,  8, 38,  9,  1, 40, 40,  9,  1, 39,  2,  2, 49, 39, 42,
918
     3,  3, 14, 16, 49, 14, 16, 42, 43, 43,  6,  6, 15,  1,  1, 15,
919
    44, 44,  1,  1, 50, 48,  4,  5,  4,  7,  5,  2, 10, 10, 48,  7,
920
    50, 45,  2,  1, 45,  8,  8,  1, 46, 46,  3, 47, 47,  3,  1,  1},
921

  
922
    /* value table */
923
    { 1,  -1,   2,  -2,   0,   1,  -1,   3,  -3,   1,  -1,   0,   4,  -4,   2,  -2,
924
      1,  -1,   5,  -5,   1,  -1,   6,  -6,   3,  -3,   2,  -2,   1,  -1,   7,  -7,
925
      1,  -1,   1,   8,  -1,   4,  -4,  -8,   2,  -2,   9,   3,  -9,  -3,   1,  -1,
926
      5,  -5,  10,   2, -10,  -2,   1,  -1,  11, -11,   1,  -1,  -4,   2,   4,   3,
927
     -3,  -2,   6,  -6,  12,   1, -12,  -1,   2,   1,  -2,  -1,  13, -13,   2,  -2,
928
      7,  -7,   1,  -1,   1,   1,  -1,   3,  -3,  14,   5,  -1, -14,  -5,   4,  -4,
929
     15, -15,   1,  -1,   8,  -8,  -3,   3,  16,   1, -16,  -1,   1,   1,  -1,  -1,
930
      1,   1,  -1,   1,   2,   1,  -2,   1,  -1,  -1,  -1,   6,  -1,   3,  -6,  17,
931
    -17,  -3,   1,   1,   1,   4,  -1,  -1,  -4,   3,  -1,   5,  -3,  -1,  -9,   9,
932
     -5,   1,  18, -18,   2,   1,  -2,   1,  -1,  -1,   1,  19,  -1,   1, -19,  -1,
933
      4,   1,  -1,   1,   7,  -4,  -2,   2,  -7,  10,  -1, -10,   1,  20,  -1, -20,
934
      1,  -1,   2,   4,  -2,   5,   1,  -5,   6,  -4,  21,   4,   2,  -6, -21,  -1,
935
     -2,   1,  -4,  -1,  -3,  22,  -1,   1,   3, -22,  -1,  11, -11,   1,   1,   1,
936
      8,  -8,   2,   2,  -1,  -2,  -2,  -1,   1,  -1,  -5,   5,   2,  23, -23,  -2,
937
      1,  -1,  24, -24,  -1,  -1,   7,   6,  -7,   5,  -6,  12,  -3,   3,   1,  -5,
938
      1,   1, -12,  25,  -1,  -5,   5, -25,  -1,   1,   9,   1,  -1,  -9,  26, -26}
939
}
940
};
libavcodec/ivi_common.h
1
/*
2
 * common functions for Indeo Video Interactive codecs (Indeo4 and Indeo5)
3
 *
4
 * Copyright (c) 2009 Maxim Poliakovski
5
 *
6
 * This file is part of FFmpeg.
7
 *
8
 * FFmpeg is free software; you can redistribute it and/or
9
 * modify it under the terms of the GNU Lesser General Public
10
 * License as published by the Free Software Foundation; either
11
 * version 2.1 of the License, or (at your option) any later version.
12
 *
13
 * FFmpeg is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16
 * Lesser General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU Lesser General Public
19
 * License along with FFmpeg; if not, write to the Free Software
20
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
 */
22

  
23
/**
24
 * @file libavcodec/ivi_common.h
25
 * This file contains structures and macros shared by both Indeo4 and
26
 * Indeo5 decoders.
27
 */
28

  
29
#ifndef AVCODEC_IVI_COMMON_H
30
#define AVCODEC_IVI_COMMON_H
31

  
32
#include "avcodec.h"
33
#include "get_bits.h"
34
#include <stdint.h>
35

  
36
#define IVI_DEBUG 0
37

  
38
#define IVI_VLC_BITS 13 ///< max number of bits of the ivi's huffman codes
39

  
40
/**
41
 *  huffman codebook descriptor
42
 */
43
typedef struct {
44
    int32_t     num_rows;
45
    uint8_t     xbits[16];
46
} IVIHuffDesc;
47

  
48
extern const IVIHuffDesc ff_ivi_mb_huff_desc[8];  ///< static macroblock huffman tables
49
extern const IVIHuffDesc ff_ivi_blk_huff_desc[8]; ///< static block huffman tables
50

  
51

  
52
/**
53
 *  run-value (RLE) table descriptor
54
 */
55
typedef struct {
56
    uint8_t     eob_sym; ///< end of block symbol
57
    uint8_t     esc_sym; ///< escape symbol
58
    uint8_t     runtab[256];
59
    int8_t      valtab[256];
60
} RVMapDesc;
61

  
62
extern const RVMapDesc ff_ivi_rvmap_tabs[9];
63

  
64

  
65
/**
66
 *  information for Indeo macroblock (16x16, 8x8 or 4x4)
67
 */
68
typedef struct {
69
    int16_t     xpos;
70
    int16_t     ypos;
71
    uint32_t    buf_offs; ///< address in the output buffer for this mb
72
    uint8_t     type;     ///< macroblock type: 0 - INTRA, 1 - INTER
73
    uint8_t     cbp;      ///< coded block pattern
74
    uint8_t     q_delta;  ///< quant delta
75
    int8_t      mv_x;     ///< motion vector (x component)
76
    int8_t      mv_y;     ///< motion vector (y component)
77
} IVIMbInfo;
78

  
79

  
80
/**
81
 *  information for Indeo tile
82
 */
83
typedef struct {
84
    int         xpos;
85
    int         ypos;
86
    int         width;
87
    int         height;
88
    int         is_empty;  ///< = 1 if this tile doesn't contain any data
89
    int         data_size; ///< size of the data in bytes
90
    int         num_MBs;   ///< number of macroblocks in this tile
91
    IVIMbInfo   *mbs;      ///< array of macroblock descriptors
92
    IVIMbInfo   *ref_mbs;  ///< ptr to the macroblock descriptors of the reference tile
93
} IVITile;
94

  
95

  
96
/**
97
 *  information for Indeo wavelet band
98
 */
99
typedef struct {
100
    int             plane;          ///< plane number this band belongs to
101
    int             band_num;       ///< band number
102
    int             width;
103
    int             height;
104
    const uint8_t   *data_ptr;      ///< ptr to the first byte of the band data
105
    int             data_size;      ///< size of the band data
106
    int16_t         *buf;           ///< pointer to the output buffer for this band
107
    int16_t         *ref_buf;       ///< pointer to the reference frame buffer (for motion compensation)
108
    int16_t         *bufs[3];       ///< array of pointers to the band buffers
109
    int             pitch;          ///< pitch associated with the buffers above
110
    int             is_empty;       ///< = 1 if this band doesn't contain any data
111
    int             mb_size;        ///< macroblock size
112
    int             blk_size;       ///< block size
113
    int             is_halfpel;     ///< precision of the motion compensation: 0 - fullpel, 1 - halfpel
114
    int             inherit_mv;     ///< tells if motion vector is inherited from reference macroblock
115
    int             inherit_qdelta; ///< tells if quantiser delta is inherited from reference macroblock
116
    int             qdelta_present; ///< tells if Qdelta signal is present in the bitstream (Indeo5 only)
117
    int             quant_mat;      ///< dequant matrix index
118
    int             glob_quant;     ///< quant base for this band
119
    const uint8_t   *scan;          ///< ptr to the scan pattern
120

  
121
    int             huff_sel;       ///< huffman table for this band
122
    IVIHuffDesc     huff_desc;      ///< table descriptor associated with the selector above
123
    VLC             *blk_vlc;       ///< ptr to the vlc table for decoding block data
124
    VLC             blk_vlc_cust;   ///< custom block vlc table
125

  
126
    uint16_t        *dequant_intra; ///< ptr to dequant tables for intra blocks
127
    uint16_t        *dequant_inter; ///< ptr dequant tables for inter blocks
128
    int             num_corr;       ///< number of correction entries
129
    uint8_t         corr[61*2];     ///< rvmap correction pairs
130
    int             rvmap_sel;      ///< rvmap table selector
131
    RVMapDesc       *rv_map;        ///< ptr to the RLE table for this band
132
    int             num_tiles;      ///< number of tiles in this band
133
    IVITile         *tiles;         ///< array of tile descriptors
134
    void (*inv_transform)(const int32_t *in, int16_t *out, uint32_t pitch, const uint8_t *flags); ///< inverse transform function pointer
135
    void (*dc_transform) (const int32_t *in, int16_t *out, uint32_t pitch, int blk_size);   ///< dc transform function pointer, it may be NULL
136
    int             is_2d_trans;    ///< 1 indicates that the two-dimensional inverse transform is used
137
    int32_t         checksum;       ///< for debug purposes
138
    int             checksum_present;
139
    int             bufsize;        ///< band buffer size in bytes
140
    const uint8_t   *intra_base;    ///< quantization matrix for intra blocks
141
    const uint8_t   *inter_base;    ///< quantization matrix for inter blocks
142
    const uint8_t   *intra_scale;   ///< quantization coefficient for intra blocks
143
    const uint8_t   *inter_scale;   ///< quantization coefficient for inter blocks
144
} IVIBandDesc;
145

  
146

  
147
/**
148
 *  color plane (luma or chroma) information
149
 */
150
typedef struct {
151
    uint16_t    width;
152
    uint16_t    height;
153
    uint8_t     num_bands;  ///< number of bands this plane subdivided into
154
    IVIBandDesc *bands;     ///< array of band descriptors
155
} IVIPlaneDesc;
156

  
157

  
158
typedef struct {
159
    uint16_t    pic_width;
160
    uint16_t    pic_height;
161
    uint16_t    chroma_width;
162
    uint16_t    chroma_height;
163
    uint16_t    tile_width;
164
    uint16_t    tile_height;
165
    uint8_t     luma_bands;
166
    uint8_t     chroma_bands;
167
} IVIPicConfig;
168

  
169
/** compares some properties of two pictures */
170
static inline int ivi_pic_config_cmp(IVIPicConfig *str1, IVIPicConfig *str2)
171
{
172
    return (str1->pic_width    != str2->pic_width    || str1->pic_height    != str2->pic_height    ||
173
            str1->chroma_width != str2->chroma_width || str1->chroma_height != str2->chroma_height ||
174
            str1->tile_width   != str2->tile_width   || str1->tile_height   != str2->tile_height   ||
175
            str1->luma_bands   != str2->luma_bands   || str1->chroma_bands  != str2->chroma_bands);
176
}
177

  
178
/** calculate number of tiles in a stride */
179
#define IVI_NUM_TILES(stride, tile_size) (((stride) + (tile_size) - 1) / (tile_size))
180

  
181
/** calculate number of macroblocks in a tile */
182
#define IVI_MBs_PER_TILE(tile_width, tile_height, mb_size) \
183
    ((((tile_width) + (mb_size) - 1) / (mb_size)) * (((tile_height) + (mb_size) - 1) / (mb_size)))
184

  
185
/** convert unsigned values into signed ones (the sign is in the LSB) */
186
/* TODO: find a way to calculate this without the conditional using bit magic */
187
#define IVI_TOSIGNED(val) (-(((val) >> 1) ^ -((val) & 1)))
188

  
189
/** scales motion vector */
190
static inline int ivi_scale_mv(int mv, int mv_scale)
191
{
192
    return (mv + (mv > 0) + (mv_scale - 1)) >> mv_scale;
193
}
194

  
195
/**
196
 *  Generates a huffman codebook from the given descriptor
197
 *  and converts it into the FFmpeg VLC table.
198
 *
199
 *  @param cb   [in]  pointer to codebook descriptor
200
 *  @param vlc  [out] where to place the generated VLC table
201
 *  @param flag [in]  flag: 1 - for static or 0 for dynamic tables
202
 *  @return     result code: 0 - OK, -1 = error (invalid codebook descriptor)
203
 */
204
int  ff_ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag);
205

  
206
/**
207
 *  Decodes a huffman codebook descriptor from the bitstream.
208
 *
209
 *  @param gb   [in,out] the GetBit context
210
 *  @param desc [out] ptr to descriptor to be filled with data
211
 *  @return     selector indicating huffman table:
212
 *              (0...6 - predefined, 7 - custom one supplied with the bitstream)
213
 */
214
int  ff_ivi_dec_huff_desc(GetBitContext *gb, IVIHuffDesc *desc);
215

  
216
/**
217
 *  Compares two huffman codebook descriptors.
218
 *
219
 *  @param desc1    [in] ptr to the 1st descriptor to compare
220
 *  @param desc2    [in] ptr to the 2nd descriptor to compare
221
 *  @return         comparison result: 0 - equal, 1 - not equal
222
 */
223
int  ff_ivi_huff_desc_cmp(const IVIHuffDesc *desc1, const IVIHuffDesc *desc2);
224

  
225
/**
226
 *  Copies huffman codebook descriptors.
227
 *
228
 *  @param dst  [out] ptr to the destination descriptor
229
 *  @param src  [in]  ptr to the source descriptor
230
 */
231
void ff_ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src);
232

  
233
/**
234
 *  Initializes planes (prepares descriptors, allocates buffers etc).
235
 *
236
 *  @param planes       [in,out] pointer to the array of the plane descriptors
237
 *  @param cfg          [in] pointer to the ivi_pic_config structure describing picture layout
238
 *  @return             result code: 0 - OK
239
 */
240
int  ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg);
241

  
242
/**
243
 *  Frees planes, bands and macroblocks buffers.
244
 *
245
 *  @param planes       [in] pointer to the array of the plane descriptors
246
 */
247
void ff_ivi_free_buffers(IVIPlaneDesc *planes);
248

  
249
/**
250
 *  Initializes tile and macroblock descriptors.
251
 *
252
 *  @param planes       [in,out] pointer to the array of the plane descriptors
253
 *  @param tile_width   [in]     tile width
254
 *  @param tile_height  [in]     tile height
255
 *  @return             result code: 0 - OK
256
 */
257
int  ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height);
258

  
259
/**
260
 *  Decodes size of the tile data.
261
 *  The size is stored as a variable-length field having the following format:
262
 *  if (tile_data_size < 255) than this field is only one byte long
263
 *  if (tile_data_size >= 255) than this field four is byte long: 0xFF X1 X2 X3
264
 *  where X1-X3 is size of the tile data
265
 *
266
 *  @param gb   [in,out] the GetBit context
267
 *  @return     size of the tile data in bytes
268
 */
269
int  ff_ivi_dec_tile_data_size(GetBitContext *gb);
270

  
271
/**
272
 *  Decodes block data:
273
 *  extracts huffman-coded transform coefficients from the bitstream,
274
 *  dequantizes them, applies inverse transform and motion compensation
275
 *  in order to reconstruct the picture.
276
 *
277
 *  @param gb   [in,out] the GetBit context
278
 *  @param band [in]     pointer to the band descriptor
279
 *  @param tile [in]     pointer to the tile descriptor
280
 *  @return     result code: 0 - OK, -1 = error (corrupted blocks data)
281
 */
282
int  ff_ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile);
283

  
284
/**
285
 *  Handles empty tiles by performing data copying and motion
286
 *  compensation respectively.
287
 *
288
 *  @param avctx    [in] ptr to the AVCodecContext
289
 *  @param band     [in] pointer to the band descriptor
290
 *  @param tile     [in] pointer to the tile descriptor
291
 *  @param mv_scale [in] scaling factor for motion vectors
292
 */
293
void ff_ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
294
                               IVITile *tile, int32_t mv_scale);
295

  
296
/**
297
 *  Converts and outputs the current plane.
298
 *  This conversion is done by adding back the bias value of 128
299
 *  (subtracted in the encoder) and clipping the result.
300
 *
301
 *  @param plane        [in]  pointer to the descriptor of the plane being processed
302
 *  @param dst          [out] pointer to the buffer receiving converted pixels
303
 *  @param dst_pitch    [in]  pitch for moving to the next y line
304
 */
305
void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch);
306

  
307
#if IVI_DEBUG
308
/**
309
 *  Calculates band checksum from band data.
310
 */
311
uint16_t ivi_calc_band_checksum (IVIBandDesc *band);
312

  
313
/**
314
 *  Verifies that band data lies in range.
315
 */
316
int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch);
317
#endif
318

  
319
#endif /* AVCODEC_IVI_COMMON_H */
libavcodec/ivi_dsp.c
1
/*
2
 * DSP functions for Indeo Video Interactive codecs (Indeo4 and Indeo5)
3
 *
4
 * Copyright (c) 2009 Maxim Poliakovski
5
 *
6
 * This file is part of FFmpeg.
7
 *
8
 * FFmpeg is free software; you can redistribute it and/or
9
 * modify it under the terms of the GNU Lesser General Public
10
 * License as published by the Free Software Foundation; either
11
 * version 2.1 of the License, or (at your option) any later version.
12
 *
13
 * FFmpeg is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16
 * Lesser General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU Lesser General Public
19
 * License along with FFmpeg; if not, write to the Free Software
20
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
 */
22

  
23
/**
24
 * @file libavcodec/ivi_dsp.c
25
 * DSP functions (inverse transforms, motion compensation, wavelet recompostions)
26
 * for Indeo Video Interactive codecs.
27
 */
28

  
29
#include "avcodec.h"
30
#include "dsputil.h"
31
#include "ivi_common.h"
32
#include "ivi_dsp.h"
33

  
34
void ff_ivi_recompose53(const IVIPlaneDesc *plane, uint8_t *dst,
35
                        const int dst_pitch, const int num_bands)
36
{
37
    int             x, y, indx;
38
    int32_t         p0, p1, p2, p3, tmp0, tmp1, tmp2;
39
    int32_t         b0_1, b0_2, b1_1, b1_2, b1_3, b2_1, b2_2, b2_3, b2_4, b2_5, b2_6;
40
    int32_t         b3_1, b3_2, b3_3, b3_4, b3_5, b3_6, b3_7, b3_8, b3_9;
41
    uint32_t        pitch, back_pitch;
42
    const IDWTELEM *b0_ptr, *b1_ptr, *b2_ptr, *b3_ptr;
43

  
44
    /* all bands should have the same pitch */
45
    pitch = plane->bands[0].pitch;
46

  
47
    /* pixels at the position "y-1" will be set to pixels at the "y" for the 1st iteration */
48
    back_pitch = 0;
49

  
50
    /* get pointers to the wavelet bands */
51
    b0_ptr = plane->bands[0].buf;
52
    b1_ptr = plane->bands[1].buf;
53
    b2_ptr = plane->bands[2].buf;
54
    b3_ptr = plane->bands[3].buf;
55

  
56
    for (y = 0; y < plane->height; y += 2) {
57
        /* load storage variables with values */
58
        if (num_bands > 0) {
59
            b0_1 = b0_ptr[0];
60
            b0_2 = b0_ptr[pitch];
61
        }
62

  
63
        if (num_bands > 1) {
64
            b1_1 = b1_ptr[back_pitch];
65
            b1_2 = b1_ptr[0];
66
            b1_3 = b1_1 - b1_2*6 + b1_ptr[pitch];
67
        }
68

  
69
        if (num_bands > 2) {
70
            b2_2 = b2_ptr[0];     // b2[x,  y  ]
71
            b2_3 = b2_2;          // b2[x+1,y  ] = b2[x,y]
72
            b2_5 = b2_ptr[pitch]; // b2[x  ,y+1]
73
            b2_6 = b2_5;          // b2[x+1,y+1] = b2[x,y+1]
74
        }
75

  
76
        if (num_bands > 3) {
77
            b3_2 = b3_ptr[back_pitch]; // b3[x  ,y-1]
78
            b3_3 = b3_2;               // b3[x+1,y-1] = b3[x  ,y-1]
79
            b3_5 = b3_ptr[0];          // b3[x  ,y  ]
80
            b3_6 = b3_5;               // b3[x+1,y  ] = b3[x  ,y  ]
81
            b3_8 = b3_2 - b3_5*6 + b3_ptr[pitch];
82
            b3_9 = b3_8;
83
        }
84

  
85
        for (x = 0, indx = 0; x < plane->width; x+=2, indx++) {
86
            /* some values calculated in the previous iterations can */
87
            /* be reused in the next ones, so do appropriate copying */
88
            b2_1 = b2_2; // b2[x-1,y  ] = b2[x,  y  ]
89
            b2_2 = b2_3; // b2[x  ,y  ] = b2[x+1,y  ]
90
            b2_4 = b2_5; // b2[x-1,y+1] = b2[x  ,y+1]
91
            b2_5 = b2_6; // b2[x  ,y+1] = b2[x+1,y+1]
92
            b3_1 = b3_2; // b3[x-1,y-1] = b3[x  ,y-1]
93
            b3_2 = b3_3; // b3[x  ,y-1] = b3[x+1,y-1]
94
            b3_4 = b3_5; // b3[x-1,y  ] = b3[x  ,y  ]
95
            b3_5 = b3_6; // b3[x  ,y  ] = b3[x+1,y  ]
96
            b3_7 = b3_8; // vert_HPF(x-1)
97
            b3_8 = b3_9; // vert_HPF(x  )
98

  
99
            p0 = p1 = p2 = p3 = 0;
100

  
101
            /* process the LL-band by applying LPF both vertically and horizontally */
102
            if (num_bands > 0) {
103
                tmp0 = b0_1;
104
                tmp2 = b0_2;
105
                b0_1 = b0_ptr[indx+1];
106
                b0_2 = b0_ptr[pitch+indx+1];
107
                tmp1 = tmp0 + b0_1;
108

  
109
                p0 =  tmp0 << 4;
110
                p1 =  tmp1 << 3;
111
                p2 = (tmp0 + tmp2) << 3;
112
                p3 = (tmp1 + tmp2 + b0_2) << 2;
113
            }
114

  
115
            /* process the HL-band by applying HPF vertically and LPF horizontally */
116
            if (num_bands > 1) {
117
                tmp0 = b1_2;
118
                tmp1 = b1_1;
119
                b1_2 = b1_ptr[indx+1];
120
                b1_1 = b1_ptr[back_pitch+indx+1];
121

  
122
                tmp2 = tmp1 - tmp0*6 + b1_3;
123
                b1_3 = b1_1 - b1_2*6 + b1_ptr[pitch+indx+1];
124

  
125
                p0 += (tmp0 + tmp1) << 3;
126
                p1 += (tmp0 + tmp1 + b1_1 + b1_2) << 2;
127
                p2 +=  tmp2 << 2;
128
                p3 += (tmp2 + b1_3) << 1;
129
            }
130

  
131
            /* process the LH-band by applying LPF vertically and HPF horizontally */
132
            if (num_bands > 2) {
133
                b2_3 = b2_ptr[indx+1];
134
                b2_6 = b2_ptr[pitch+indx+1];
135

  
136
                tmp0 = b2_1 + b2_2;
137
                tmp1 = b2_1 - b2_2*6 + b2_3;
138

  
139
                p0 += tmp0 << 3;
140
                p1 += tmp1 << 2;
141
                p2 += (tmp0 + b2_4 + b2_5) << 2;
142
                p3 += (tmp1 + b2_4 - b2_5*6 + b2_6) << 1;
143
            }
144

  
145
            /* process the HH-band by applying HPF both vertically and horizontally */
146
            if (num_bands > 3) {
147
                b3_6 = b3_ptr[indx+1];            // b3[x+1,y  ]
148
                b3_3 = b3_ptr[back_pitch+indx+1]; // b3[x+1,y-1]
149

  
150
                tmp0 = b3_1 + b3_4;
151
                tmp1 = b3_2 + b3_5;
152
                tmp2 = b3_3 + b3_6;
153

  
154
                b3_9 = b3_3 - b3_6*6 + b3_ptr[pitch+indx+1];
155

  
156
                p0 += (tmp0 + tmp1) << 2;
157
                p1 += (tmp0 - tmp1*6 + tmp2) << 1;
158
                p2 += (b3_7 + b3_8) << 1;
159
                p3 +=  b3_7 - b3_8*6 + b3_9;
160
            }
161

  
162
            /* output four pixels */
163
            dst[x]             = av_clip_uint8((p0 >> 6) + 128);
164
            dst[x+1]           = av_clip_uint8((p1 >> 6) + 128);
165
            dst[dst_pitch+x]   = av_clip_uint8((p2 >> 6) + 128);
166
            dst[dst_pitch+x+1] = av_clip_uint8((p3 >> 6) + 128);
167
        }// for x
168

  
169
        dst += dst_pitch << 1;
170

  
171
        back_pitch = -pitch;
172

  
173
        b0_ptr += pitch;
174
        b1_ptr += pitch;
175
        b2_ptr += pitch;
176
        b3_ptr += pitch;
177
    }
178
}
179

  
180
/** butterfly operation for the inverse slant transform */
181
#define IVI_SLANT_BFLY(s1, s2, o1, o2, t) \
182
    t  = s1 - s2;\
183
    o1 = s1 + s2;\
184
    o2 = t;\
185

  
186
/** This is a reflection a,b = 1/2, 5/4 for the inverse slant transform */
187
#define IVI_IREFLECT(s1, s2, o1, o2, t) \
188
    t  = ((s1 + s2*2 + 2) >> 2) + s1;\
189
    o2 = ((s1*2 - s2 + 2) >> 2) - s2;\
190
    o1 = t;\
191

  
192
/** This is a reflection a,b = 1/2, 7/8 for the inverse slant transform */
193
#define IVI_SLANT_PART4(s1, s2, o1, o2, t) \
194
    t  = s2 + ((s1*4  - s2 + 4) >> 3);\
195
    o2 = s1 + ((-s1 - s2*4 + 4) >> 3);\
196
    o1 = t;\
197

  
198
/** inverse slant8 transform */
199
#define IVI_INV_SLANT8(s1, s4, s8, s5, s2, s6, s3, s7,\
200
                       d1, d2, d3, d4, d5, d6, d7, d8,\
201
                       t0, t1, t2, t3, t4, t5, t6, t7, t8) {\
202
    IVI_SLANT_PART4(s4, s5, t4, t5, t0);\
203
\
204
    IVI_SLANT_BFLY(s1, t5, t1, t5, t0); IVI_SLANT_BFLY(s2, s6, t2, t6, t0);\
205
    IVI_SLANT_BFLY(s7, s3, t7, t3, t0); IVI_SLANT_BFLY(t4, s8, t4, t8, t0);\
206
\
207
    IVI_SLANT_BFLY(t1, t2, t1, t2, t0); IVI_IREFLECT  (t4, t3, t4, t3, t0);\
208
    IVI_SLANT_BFLY(t5, t6, t5, t6, t0); IVI_IREFLECT  (t8, t7, t8, t7, t0);\
209
    IVI_SLANT_BFLY(t1, t4, t1, t4, t0); IVI_SLANT_BFLY(t2, t3, t2, t3, t0);\
210
    IVI_SLANT_BFLY(t5, t8, t5, t8, t0); IVI_SLANT_BFLY(t6, t7, t6, t7, t0);\
211
    d1 = COMPENSATE(t1);\
212
    d2 = COMPENSATE(t2);\
213
    d3 = COMPENSATE(t3);\
214
    d4 = COMPENSATE(t4);\
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff