avcodec/pnm: Avoid structure pointer dereferences in inner loop in pnm_get()
[ffmpeg.git] / libavcodec / cfhddata.c
1 /*
2  * Copyright (c) 2015 Kieran Kunhya
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20
21 #include <stdint.h>
22
23 #include "libavutil/attributes.h"
24
25 #include "cfhd.h"
26
27 /* some special codewords, not sure what they all mean */
28 #define TABLE_9_BAND_END1 0x1C7859Eh
29 #define TABLE_9_BAND_END_LEN1 25
30 #define TABLE_9_BAND_END2 0x38F0B3Fh
31 #define TABLE_9_BAND_END_LEN2 26
32 #define TABLE_9_BAND_END3 0x38F0B3Eh
33 #define TABLE_9_BAND_END_LEN3 26
34
35 #define NB_VLC_TABLE_9   (71 + 3)
36 #define NB_VLC_TABLE_18 (263 + 1)
37
38 static const uint32_t table_9_vlc_bits[NB_VLC_TABLE_9] = {
39             0,       0x2,       0xc,      0x1a,
40          0x1d,      0x1e,      0x39,      0x3e,
41          0x37,      0x7e,      0x6c,      0xe2,
42          0xfe,      0xdb,      0xe0,     0x1c3,
43         0x1c6,     0x1ff,     0x1fe,     0x1b5,
44         0x369,     0x385,     0x71d,     0x6d0,
45         0x708,     0x71f,     0xe3d,     0xe39,
46         0xe13,     0xe12,    0x1c71,    0x1b45,
47        0x1b47,    0x3689,    0x38f2,    0x38e1,
48        0x38e0,    0x38f1,    0x3688,    0x6d1b,
49        0x71e0,    0x6d19,    0x71e7,    0xe3cd,
50        0xda35,    0xda30,    0xe3c3,   0x1b469,
51       0x1b462,   0x1c798,   0x1b463,   0x1c799,
52       0x38f08,   0x38f09,   0x38f0a,   0x6d1a0,
53       0x6d1a3,   0x6d1a1,   0xda345,   0xda344,
54       0xe3c2d,   0xe3c2f,   0xe3c2e,  0x38f0b2,
55      0x71e160,  0x71e162,  0x71e166,  0x71e161,
56      0xe3c2ce,  0xe3c2c6,  0xe3c2c7, 0x1C7859E,
57     0x38F0B3F, 0x38F0B3E,
58 };
59
60 static const uint8_t table_9_vlc_len[NB_VLC_TABLE_9] = {
61      1,    2,    4,    5,    5,    5,    6,    6,
62      6,    7,    7,    8,    8,    8,    8,    9,
63      9,    9,    9,    9,   10,   10,   11,   11,
64     11,   11,   12,   12,   12,   12,   13,   13,
65     13,   14,   14,   14,   14,   14,   14,   15,
66     15,   15,   15,   16,   16,   16,   16,   17,
67     17,   17,   17,   17,   18,   18,   18,   19,
68     19,   19,   20,   20,   20,   20,   20,   22,
69     23,   23,   23,   23,   24,   24,   24,   25,
70     26,   26,
71 };
72
73 static const uint16_t table_9_vlc_run[NB_VLC_TABLE_9] = {
74     1,    1,    1,    1,   12,    1,   32,  160,
75     1,    1,    1,  320,    1,    1,   80,  120,
76     1,    1,  100,    1,    1,    1,    1,    1,
77     1,    1,    1,    1,    1,    1,    1,    1,
78     1,    1,    1,    1,    1,    1,    1,    1,
79     1,    1,    1,    1,    1,    1,    1,    1,
80     1,    1,    1,    1,    1,    1,    1,    1,
81     1,    1,    1,    1,    1,    1,    1,    1,
82     1,    1,    1,    1,    1,    1,    1,    1,
83     1,    1
84 };
85
86 static const uint8_t table_9_vlc_level[NB_VLC_TABLE_9] = {
87      0,    1,    2,    3,    0,    4,    0,    0,
88      5,    7,    6,    0,    9,    8,    0,    0,
89     11,   12,    0,   10,   13,   14,   17,   15,
90     16,   18,   22,   21,   20,   19,   25,   23,
91     24,   27,   31,   29,   28,   30,   26,   33,
92     34,   32,   35,   39,   37,   36,   38,   42,
93     40,   43,   41,   44,   45,   46,   47,   48,
94     50,   49,   52,   51,   53,   55,   54,   56,
95     57,   59,   60,   58,   61,   62,   63,   64,
96     64,   64,
97 };
98
99 static const uint32_t table_18_vlc_bits[NB_VLC_TABLE_18] = {
100             0,       0x2,       0x7,      0x19,
101          0x30,      0x36,      0x6f,      0x63,
102          0x69,      0x6b,      0xd1,      0xd4,
103          0xdc,     0x189,     0x18a,     0x1a0,
104         0x1ab,     0x377,     0x310,     0x316,
105         0x343,     0x354,     0x375,     0x623,
106         0x684,     0x685,     0x6ab,     0x6ec,
107         0xddb,     0xc5c,     0xc5e,     0xc44,
108         0xd55,     0xdd1,     0xdd3,    0x1bb5,
109        0x188b,    0x18bb,    0x18bf,    0x1aa8,
110        0x1ba0,    0x1ba5,    0x1ba4,    0x3115,
111        0x3175,    0x317d,    0x3553,    0x3768,
112        0x6e87,    0x6ed3,    0x62e8,    0x62f8,
113        0x6228,    0x6aa4,    0x6e85,    0xc453,
114        0xc5d3,    0xc5f3,    0xdda4,    0xdd08,
115        0xdd0c,   0x1bb4b,   0x1bb4a,   0x18ba5,
116       0x18be5,   0x1aa95,   0x1aa97,   0x188a4,
117       0x1ba13,   0x31748,   0x317c8,   0x35528,
118       0x3552c,   0x37424,   0x37434,   0x37436,
119       0x62294,   0x62e92,   0x62f92,   0x6aa52,
120       0x6aa5a,   0x6e86a,   0x6e86e,   0x6e84a,
121       0xc452a,   0xc5d27,   0xc5f26,   0xd54a6,
122       0xd54b6,   0xdd096,   0xdd0d6,   0xdd0de,
123      0x188a56,  0x18ba4d,  0x18be4e,  0x18be4f,
124      0x1aa96e,  0x1ba12e,  0x1ba12f,  0x1ba1af,
125      0x1ba1bf,  0x37435d,  0x37437d,  0x317498,
126      0x35529c,  0x35529d,  0x3552de,  0x3552df,
127      0x62e933,  0x62295d,  0x6aa53d,  0x6aa53f,
128      0x6aa53e,  0x6e86b9,  0x6e86f8,  0xd54a79,
129      0xc5d265,  0xc452b8,  0xdd0d71,  0xd54a78,
130      0xdd0d70,  0xdd0df2,  0xdd0df3, 0x188a5f6,
131     0x188a5f5, 0x188a5f4, 0x188a5f3, 0x188a5f2,
132     0x188a5f1, 0x188a5f0, 0x188a5ef, 0x188a5ee,
133     0x188a5ed, 0x188a5aa, 0x188a5e3, 0x188a5df,
134     0x188a589, 0x188a5dd, 0x188a578, 0x188a5e0,
135     0x188a588, 0x188a5d6, 0x188a5db, 0x188a5e1,
136     0x188a587, 0x188a59a, 0x188a5c4, 0x188a5ec,
137     0x188a586, 0x188a573, 0x188a59c, 0x188a5c8,
138     0x188a5fb, 0x188a5a1, 0x188a5eb, 0x188a5a8,
139     0x188a584, 0x188a5d2, 0x188a599, 0x188a598,
140     0x188a583, 0x18ba4c9, 0x188a5d0, 0x188a594,
141     0x188a582, 0x188a5cb, 0x188a5d8, 0x188a5e7,
142     0x188a581, 0x188a5ea, 0x188a5a9, 0x188a5a6,
143     0x188a580, 0x188a5a0, 0x188a59d, 0x188a5c3,
144     0x188a57f, 0x188a5c0, 0x188a5de, 0x188a5d4,
145     0x188a57e, 0x188a5c2, 0x188a592, 0x188a5cd,
146     0x188a57d, 0x188a5a3, 0x188a5e8, 0x188a5a2,
147     0x188a57c, 0x188a58e, 0x188a5b3, 0x188a5b2,
148     0x188a5b1, 0x188a5b0, 0x188a5af, 0x188a5ae,
149     0x188a5ad, 0x188a5ac, 0x188a5ab, 0x188a5da,
150     0x188a5e4, 0x188a5e5, 0x188a5d9, 0x188a5b5,
151     0x188a5bc, 0x188a5bd, 0x188a5e9, 0x188a5cc,
152     0x188a585, 0x188a5d3, 0x188a5e2, 0x188a595,
153     0x188a596, 0x188a5b8, 0x188a590, 0x188a5c9,
154     0x188a5a4, 0x188a5e6, 0x188a5a5, 0x188a5ce,
155     0x188a5bf, 0x188a572, 0x188a59b, 0x188a5be,
156     0x188a5c7, 0x188a5ca, 0x188a5d5, 0x188a57b,
157     0x188a58d, 0x188a58c, 0x188a58b, 0x188a58a,
158     0x18ba4c8, 0x188a5c5, 0x188a5fa, 0x188a5bb,
159     0x188a5c1, 0x188a5cf, 0x188a5b9, 0x188a5b6,
160     0x188a597, 0x188a5fe, 0x188a5d7, 0x188a5ba,
161     0x188a591, 0x188a5c6, 0x188a5dc, 0x188a57a,
162     0x188a59f, 0x188a5f9, 0x188a5b4, 0x188a5a7,
163     0x188a58f, 0x188a5fd, 0x188a5b7, 0x188a593,
164     0x188a59e, 0x188a5f8, 0x188a5ff, 0x188a5fc,
165     0x188a579, 0x188a5f7, 0x3114ba2, 0x3114ba3,
166 };
167
168 static const uint8_t table_18_vlc_len[NB_VLC_TABLE_18] = {
169      1,  2,  3,  5,  6,  6,  7,  7,
170      7,  7,  8,  8,  8,  9,  9,  9,
171      9, 10, 10, 10, 10, 10, 10, 11,
172     11, 11, 11, 11, 12, 12, 12, 12,
173     12, 12, 12, 13, 13, 13, 13, 13,
174     13, 13, 13, 14, 14, 14, 14, 14,
175     15, 15, 15, 15, 15, 15, 15, 16,
176     16, 16, 16, 16, 16, 17, 17, 17,
177     17, 17, 17, 17, 17, 18, 18, 18,
178     18, 18, 18, 18, 19, 19, 19, 19,
179     19, 19, 19, 19, 20, 20, 20, 20,
180     20, 20, 20, 20, 21, 21, 21, 21,
181     21, 21, 21, 21, 21, 22, 22, 22,
182     22, 22, 22, 22, 23, 23, 23, 23,
183     23, 23, 23, 24, 24, 24, 24, 24,
184     24, 24, 24, 25, 25, 25, 25, 25,
185     25, 25, 25, 25, 25, 25, 25, 25,
186     25, 25, 25, 25, 25, 25, 25, 25,
187     25, 25, 25, 25, 25, 25, 25, 25,
188     25, 25, 25, 25, 25, 25, 25, 25,
189     25, 25, 25, 25, 25, 25, 25, 25,
190     25, 25, 25, 25, 25, 25, 25, 25,
191     25, 25, 25, 25, 25, 25, 25, 25,
192     25, 25, 25, 25, 25, 25, 25, 25,
193     25, 25, 25, 25, 25, 25, 25, 25,
194     25, 25, 25, 25, 25, 25, 25, 25,
195     25, 25, 25, 25, 25, 25, 25, 25,
196     25, 25, 25, 25, 25, 25, 25, 25,
197     25, 25, 25, 25, 25, 25, 25, 25,
198     25, 25, 25, 25, 25, 25, 25, 25,
199     25, 25, 25, 25, 25, 25, 25, 25,
200     25, 25, 25, 25, 25, 25, 25, 25,
201     25, 25, 25, 25, 25, 25, 26, 26,
202 };
203
204 static const uint16_t table_18_vlc_run[NB_VLC_TABLE_18] = {
205      1,    1,    1,    1,    1,    1,    1,    1,
206     12,    1,   20,    1,    1,    1,   32,    1,
207      1,    1,    1,    1,   60,    1,    1,    1,
208      1,  100,    1,    1,    1,    1,    1,    1,
209      1,    1,    1,    1,    1,    1,  180,    1,
210      1,  320,    1,    1,    1,    1,    1,    1,
211      1,    1,    1,    1,    1,    1,    1,    1,
212      1,    1,    1,    1,    1,    1,    1,    1,
213      1,    1,    1,    1,    1,    1,    1,    1,
214      1,    1,    1,    1,    1,    1,    1,    1,
215      1,    1,    1,    1,    1,    1,    1,    1,
216      1,    1,    1,    1,    1,    1,    1,    1,
217      1,    1,    1,    1,    1,    1,    1,    1,
218      1,    1,    1,    1,    1,    1,    1,    1,
219      1,    1,    1,    1,    1,    1,    1,    1,
220      1,    1,    1,    1,    1,    1,    1,    1,
221      1,    1,    1,    1,    1,    1,    1,    1,
222      1,    1,    1,    1,    1,    1,    1,    1,
223      1,    1,    1,    1,    1,    1,    1,    1,
224      1,    1,    1,    1,    1,    1,    1,    1,
225      1,    1,    1,    1,    1,    1,    1,    1,
226      1,    1,    1,    1,    1,    1,    1,    1,
227      1,    1,    1,    1,    1,    1,    1,    1,
228      1,    1,    1,    1,    1,    1,    1,    1,
229      1,    1,    1,    1,    1,    1,    1,    1,
230      1,    1,    1,    1,    1,    1,    1,    1,
231      1,    1,    1,    1,    1,    1,    1,    1,
232      1,    1,    1,    1,    1,    1,    1,    1,
233      1,    1,    1,    1,    1,    1,    1,    1,
234      1,    1,    1,    1,    1,    1,    1,    1,
235      1,    1,    1,    1,    1,    1,    1,    1,
236      1,    1,    1,    1,    1,    1,    1,    1,
237      1,    1,    1,    1,    1,    1,    1,    2,
238 };
239
240 static const uint8_t table_18_vlc_level[NB_VLC_TABLE_18] = {
241       0,    1,    2,    3,    4,    5,    8,    6,
242       0,    7,    0,    9,   10,   11,    0,   12,
243      13,   18,   14,   15,    0,   16,   17,   19,
244      20,    0,   21,   22,   29,   24,   25,   23,
245      26,   27,   28,   35,   30,   31,    0,   32,
246      33,    0,   34,   36,   37,   38,   39,   40,
247      46,   47,   42,   43,   41,   44,   45,   48,
248      49,   50,   53,   51,   52,   61,   60,   55,
249      56,   57,   58,   54,   59,   62,   63,   64,
250      65,   66,   67,   68,   69,   70,   71,   72,
251      73,   75,   76,   74,   77,   78,   79,   80,
252      81,   82,   83,   84,   85,   86,   87,   88,
253      89,   90,   91,   92,   93,   99,  100,   94,
254      95,   96,   97,   98,  102,  101,  103,  105,
255     104,  106,  107,  111,  109,  108,  113,  110,
256     112,  114,  115,  225,  189,  188,  203,  202,
257     197,  207,  169,  223,  159,  235,  152,  192,
258     179,  201,  172,  149,  178,  120,  219,  150,
259     127,  211,  125,  158,  247,  238,  163,  228,
260     183,  217,  168,  122,  128,  249,  187,  186,
261     136,  181,  255,  230,  135,  233,  222,  145,
262     134,  167,  248,  209,  243,  216,  164,  140,
263     157,  239,  191,  251,  156,  139,  242,  133,
264     162,  213,  165,  212,  227,  198,  236,  234,
265     117,  215,  124,  123,  254,  253,  148,  218,
266     146,  147,  224,  143,  184,  185,  166,  132,
267     129,  250,  151,  119,  193,  176,  245,  229,
268     206,  144,  208,  137,  241,  237,  190,  240,
269     131,  232,  252,  171,  205,  204,  118,  214,
270     180,  126,  182,  175,  141,  138,  177,  153,
271     194,  160,  121,  174,  246,  130,  200,  170,
272     221,  196,  142,  210,  199,  155,  154,  244,
273     220,  195,  161,  231,  173,  226,  116,  255,
274 };
275
276 av_cold int ff_cfhd_init_vlcs(CFHDContext *s)
277 {
278     int i, j, ret = 0;
279     uint32_t new_cfhd_vlc_bits[NB_VLC_TABLE_18 * 2];
280     uint8_t  new_cfhd_vlc_len[NB_VLC_TABLE_18 * 2];
281     uint16_t new_cfhd_vlc_run[NB_VLC_TABLE_18 * 2];
282     int16_t  new_cfhd_vlc_level[NB_VLC_TABLE_18 * 2];
283
284     /** Similar to dv.c, generate signed VLC tables **/
285
286     /* Table 9 */
287     for (i = 0, j = 0; i < NB_VLC_TABLE_9; i++, j++) {
288         new_cfhd_vlc_bits[j]  = table_9_vlc_bits[i];
289         new_cfhd_vlc_len[j]   = table_9_vlc_len[i];
290         new_cfhd_vlc_run[j]   = table_9_vlc_run[i];
291         new_cfhd_vlc_level[j] = table_9_vlc_level[i];
292
293         /* Don't include the zero level nor escape bits */
294         if (table_9_vlc_level[i] &&
295             new_cfhd_vlc_bits[j] != table_9_vlc_bits[NB_VLC_TABLE_9-1]) {
296             new_cfhd_vlc_bits[j] <<= 1;
297             new_cfhd_vlc_len[j]++;
298             j++;
299             new_cfhd_vlc_bits[j]  = (table_9_vlc_bits[i] << 1) | 1;
300             new_cfhd_vlc_len[j]   =  table_9_vlc_len[i] + 1;
301             new_cfhd_vlc_run[j]   =  table_9_vlc_run[i];
302             new_cfhd_vlc_level[j] = -table_9_vlc_level[i];
303         }
304     }
305
306     ret = init_vlc(&s->vlc_9, VLC_BITS, j, new_cfhd_vlc_len,
307                    1, 1, new_cfhd_vlc_bits, 4, 4, 0);
308     if (ret < 0)
309         return ret;
310     for (i = 0; i < s->vlc_9.table_size; i++) {
311         int code = s->vlc_9.table[i][0];
312         int len  = s->vlc_9.table[i][1];
313         int level, run;
314
315         if (len < 0) { // more bits needed
316             run   = 0;
317             level = code;
318         } else {
319             run   = new_cfhd_vlc_run[code];
320             level = new_cfhd_vlc_level[code];
321         }
322         s->table_9_rl_vlc[i].len   = len;
323         s->table_9_rl_vlc[i].level = level;
324         s->table_9_rl_vlc[i].run   = run;
325     }
326
327     /* Table 18 */
328     for (i = 0, j = 0; i < NB_VLC_TABLE_18; i++, j++) {
329         new_cfhd_vlc_bits[j]  = table_18_vlc_bits[i];
330         new_cfhd_vlc_len[j]   = table_18_vlc_len[i];
331         new_cfhd_vlc_run[j]   = table_18_vlc_run[i];
332         new_cfhd_vlc_level[j] = table_18_vlc_level[i];
333
334         /* Don't include the zero level nor escape bits */
335         if (table_18_vlc_level[i] &&
336             new_cfhd_vlc_bits[j] != table_18_vlc_bits[NB_VLC_TABLE_18-1]) {
337             new_cfhd_vlc_bits[j] <<= 1;
338             new_cfhd_vlc_len[j]++;
339             j++;
340             new_cfhd_vlc_bits[j]  = (table_18_vlc_bits[i] << 1) | 1;
341             new_cfhd_vlc_len[j]   =  table_18_vlc_len[i] + 1;
342             new_cfhd_vlc_run[j]   =  table_18_vlc_run[i];
343             new_cfhd_vlc_level[j] = -table_18_vlc_level[i];
344         }
345     }
346
347     ret = init_vlc(&s->vlc_18, VLC_BITS, j, new_cfhd_vlc_len,
348                    1, 1, new_cfhd_vlc_bits, 4, 4, 0);
349     if (ret < 0)
350         return ret;
351     av_assert0(s->vlc_18.table_size == 4572);
352
353     for (i = 0; i < s->vlc_18.table_size; i++) {
354         int code = s->vlc_18.table[i][0];
355         int len  = s->vlc_18.table[i][1];
356         int level, run;
357
358         if (len < 0) { // more bits needed
359             run   = 0;
360             level = code;
361         } else {
362             run   = new_cfhd_vlc_run[code];
363             level = new_cfhd_vlc_level[code];
364         }
365         s->table_18_rl_vlc[i].len   = len;
366         s->table_18_rl_vlc[i].level = level;
367         s->table_18_rl_vlc[i].run   = run;
368     }
369
370     return ret;
371 }