1/*
2 * Indeo Video Interactive 4 compatible decoder
3 * Copyright (c) 2009-2010 Maxim Poliakovski
4 *
5 * This file is part of Libav.
6 *
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22/**
23 * @file
24 * This file contains data needed for the Indeo 4 decoder.
25 */
26
27#ifndef AVCODEC_INDEO4DATA_H
28#define AVCODEC_INDEO4DATA_H
29
30#include <stdint.h>
31#include "dsputil.h"
32#include "ivi_common.h"
33
34/**
35 *  standard picture dimensions
36 */
37static const uint16_t ivi4_common_pic_sizes[14] = {
38    640, 480, 320, 240, 160, 120, 704, 480, 352, 240, 352, 288, 176, 144
39};
40
41/**
42 *  Indeo 4 8x8 scan (zigzag) patterns
43 */
44static const uint8_t ivi4_alternate_scan_8x8[64] = {
45     0,  8,  1,  9, 16, 24,  2,  3, 17, 25, 10, 11, 32, 40, 48, 56,
46     4,  5,  6,  7, 33, 41, 49, 57, 18, 19, 26, 27, 12, 13, 14, 15,
47    34, 35, 43, 42, 50, 51, 59, 58, 20, 21, 22, 23, 31, 30, 29, 28,
48    36, 37, 38, 39, 47, 46, 45, 44, 52, 53, 54, 55, 63, 62, 61, 60
49};
50
51static const uint8_t ivi4_alternate_scan_4x4[16] = {
52    0, 1, 4, 5, 8, 12, 2, 3, 9, 13, 6, 7, 10, 11, 14, 15
53};
54
55static const uint8_t ivi4_vertical_scan_4x4[16] = {
56    0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15
57};
58
59static const uint8_t ivi4_horizontal_scan_4x4[16] = {
60    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
61};
62
63static const uint8_t *scan_index_to_tab[15] = {
64    // for 8x8 transforms
65    ff_zigzag_direct,
66    ivi4_alternate_scan_8x8,
67    ff_ivi_horizontal_scan_8x8,
68    ff_ivi_vertical_scan_8x8,
69    ff_zigzag_direct,
70
71    // for 4x4 transforms
72    ff_ivi_direct_scan_4x4,
73    ivi4_alternate_scan_4x4,
74    ivi4_vertical_scan_4x4,
75    ivi4_horizontal_scan_4x4,
76    ff_ivi_direct_scan_4x4,
77
78    // TODO: check if those are needed
79    ff_ivi_horizontal_scan_8x8,
80    ff_ivi_horizontal_scan_8x8,
81    ff_ivi_horizontal_scan_8x8,
82    ff_ivi_horizontal_scan_8x8,
83    ff_ivi_horizontal_scan_8x8
84};
85
86/**
87 *  Indeo 4 dequant tables
88 */
89static const uint16_t ivi4_quant_8x8_intra[9][64] = {
90  {
91      43,  342,  385,  470,  555,  555,  598,  726,
92     342,  342,  470,  513,  555,  598,  726,  769,
93     385,  470,  555,  555,  598,  726,  726,  811,
94     470,  470,  555,  555,  598,  726,  769,  854,
95     470,  555,  555,  598,  683,  726,  854, 1025,
96     555,  555,  598,  683,  726,  854, 1025, 1153,
97     555,  555,  598,  726,  811,  982, 1195, 1451,
98     555,  598,  726,  811,  982, 1195, 1451, 1793
99  },
100  {
101      86, 1195, 2390, 2390, 4865, 4865, 4865, 4865,
102    1195, 1195, 2390, 2390, 4865, 4865, 4865, 4865,
103    2390, 2390, 4865, 4865, 6827, 6827, 6827, 6827,
104    2390, 2390, 4865, 4865, 6827, 6827, 6827, 6827,
105    4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827,
106    4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827,
107    4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827,
108    4865, 4865, 6827, 6827, 6827, 6827, 6827, 6827
109  },
110  {
111     235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
112     235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
113     235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
114     235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
115     235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
116     235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
117     235, 1067, 1195, 1323, 1451, 1579, 1707, 1835,
118     235, 1067, 1195, 1323, 1451, 1579, 1707, 1835
119  },
120  {
121    1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
122    1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
123    1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
124    1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
125    1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
126    1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
127    1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414,
128    1707, 1707, 3414, 3414, 3414, 3414, 3414, 3414
129  },
130  {
131     897,  897,  897,  897,  897,  897,  897,  897,
132    1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067,
133    1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
134    1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409,
135    1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579,
136    1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750,
137    1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921,
138    2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091
139  },
140  {
141    1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
142    1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
143    3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
144    3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
145    3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
146    3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
147    3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
148    3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414
149  },
150  {
151    2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
152    2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
153    2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
154    2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
155    2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
156    2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
157    2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
158    2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390
159  },
160  {
161      22,  171,  214,  257,  257,  299,  299,  342,
162     171,  171,  257,  257,  299,  299,  342,  385,
163     214,  257,  257,  299,  299,  342,  342,  385,
164     257,  257,  257,  299,  299,  342,  385,  427,
165     257,  257,  299,  299,  342,  385,  427,  513,
166     257,  299,  299,  342,  385,  427,  513,  598,
167     299,  299,  299,  385,  385,  470,  598,  726,
168     299,  299,  385,  385,  470,  598,  726,  897
169  },
170  {
171      86,  598, 1195, 1195, 2390, 2390, 2390, 2390,
172     598,  598, 1195, 1195, 2390, 2390, 2390, 2390,
173    1195, 1195, 2390, 2390, 3414, 3414, 3414, 3414,
174    1195, 1195, 2390, 2390, 3414, 3414, 3414, 3414,
175    2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414,
176    2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414,
177    2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414,
178    2390, 2390, 3414, 3414, 3414, 3414, 3414, 3414
179  }
180};
181
182static const uint16_t ivi4_quant_8x8_inter[9][64] = {
183  {
184     427,  427,  470,  427,  427,  427,  470,  470,
185     427,  427,  470,  427,  427,  427,  470,  470,
186     470,  470,  470,  470,  470,  470,  470,  470,
187     427,  427,  470,  470,  427,  427,  470,  470,
188     427,  427,  470,  427,  427,  427,  470,  470,
189     427,  427,  470,  427,  427,  427,  470,  470,
190     470,  470,  470,  470,  470,  470,  470,  470,
191     470,  470,  470,  470,  470,  470,  470,  470
192  },
193  {
194    1707, 1707, 2433, 2433, 3414, 3414, 3414, 3414,
195    1707, 1707, 2433, 2433, 3414, 3414, 3414, 3414,
196    2433, 2433, 3414, 3414, 4822, 4822, 4822, 4822,
197    2433, 2433, 3414, 3414, 4822, 4822, 4822, 4822,
198    3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414,
199    3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414,
200    3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414,
201    3414, 3414, 4822, 4822, 3414, 3414, 3414, 3414
202  },
203  {
204    1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
205    1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
206    1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
207    1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
208    1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
209    1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
210    1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281,
211    1195, 1195, 1281, 1238, 1195, 1195, 1281, 1281
212  },
213  {
214    2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
215    2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
216    2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
217    2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
218    2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
219    2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
220    2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433,
221    2433, 2433, 3414, 3414, 2433, 2433, 2433, 2433
222  },
223  {
224    1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
225    1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
226    1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281,
227    1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
228    1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
229    1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
230    1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281,
231    1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281
232  },
233  {
234    2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
235    2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
236    3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
237    3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
238    2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
239    2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
240    2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433,
241    2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433
242  },
243  {
244    1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
245    1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
246    1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
247    1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
248    1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
249    1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
250    1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
251    1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707
252  },
253  {
254      86,  171,  171,  214,  214,  214,  214,  257,
255     171,  171,  214,  214,  214,  214,  257,  257,
256     171,  214,  214,  214,  214,  257,  257,  257,
257     214,  214,  214,  214,  257,  257,  257,  299,
258     214,  214,  214,  257,  257,  257,  299,  299,
259     214,  214,  257,  257,  257,  299,  299,  299,
260     214,  257,  257,  257,  299,  299,  299,  342,
261     257,  257,  257,  299,  299,  299,  342,  342
262  },
263  {
264     854,  854, 1195, 1195, 1707, 1707, 1707, 1707,
265     854,  854, 1195, 1195, 1707, 1707, 1707, 1707,
266    1195, 1195, 1707, 1707, 2390, 2390, 2390, 2390,
267    1195, 1195, 1707, 1707, 2390, 2390, 2390, 2390,
268    1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707,
269    1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707,
270    1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707,
271    1707, 1707, 2390, 2390, 1707, 1707, 1707, 1707
272  }
273};
274
275static const uint16_t ivi4_quant_4x4_intra[5][16] = {
276  {
277      22,  214,  257,  299,
278     214,  257,  299,  342,
279     257,  299,  342,  427,
280     299,  342,  427,  513
281  },
282  {
283     129, 1025, 1451, 1451,
284    1025, 1025, 1451, 1451,
285    1451, 1451, 2049, 2049,
286    1451, 1451, 2049, 2049
287  },
288  {
289      43,  171,  171,  171,
290      43,  171,  171,  171,
291      43,  171,  171,  171,
292      43,  171,  171,  171
293  },
294  {
295      43,   43,   43,   43,
296     171,  171,  171,  171,
297     171,  171,  171,  171,
298     171,  171,  171,  171
299  },
300  {
301      43,   43,   43,   43,
302      43,   43,   43,   43,
303      43,   43,   43,   43,
304      43,   43,   43,   43
305  }
306};
307
308static const uint16_t ivi4_quant_4x4_inter[5][16] = {
309  {
310     107,  214,  257,  299,
311     214,  257,  299,  299,
312     257,  299,  299,  342,
313     299,  299,  342,  342
314  },
315  {
316     513, 1025, 1238, 1238,
317    1025, 1025, 1238, 1238,
318    1238, 1238, 1451, 1451,
319    1238, 1238, 1451, 1451
320  },
321  {
322      43,  171,  171,  171,
323      43,  171,  171,  171,
324      43,  171,  171,  171,
325      43,  171,  171,  171
326  },
327  {
328      43,   43,   43,   43,
329     171,  171,  171,  171,
330     171,  171,  171,  171,
331     171,  171,  171,  171
332  },
333  {
334      43,   43,   43,   43,
335      43,   43,   43,   43,
336      43,   43,   43,   43,
337      43,   43,   43,   43
338  }
339};
340
341/**
342 *  Table for mapping quant matrix index from the bitstream
343 *  into internal quant table number.
344 */
345static const uint8_t quant_index_to_tab[22] = {
346    0, 1, 0, 2, 1, 3, 0, 4, 1, 5, 0, 1, 6, 7, 8, // for 8x8 quant matrixes
347    0, 1, 2, 2, 3, 3, 4                          // for 4x4 quant matrixes
348};
349
350#endif /* AVCODEC_INDEO4DATA_H */
351