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