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