FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/cfhddata.c
Date: 2021-09-16 08:47:15
Exec Total Coverage
Lines: 58 60 96.7%
Branches: 23 26 88.5%

Line Branch Exec Source
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 6 av_cold int ff_cfhd_init_vlcs(CFHDContext *s)
277 {
278 6 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
2/2
✓ Branch 0 taken 444 times.
✓ Branch 1 taken 6 times.
450 for (i = 0, j = 0; i < NB_VLC_TABLE_9; i++, j++) {
288 444 new_cfhd_vlc_bits[j] = table_9_vlc_bits[i];
289 444 new_cfhd_vlc_len[j] = table_9_vlc_len[i];
290 444 new_cfhd_vlc_run[j] = table_9_vlc_run[i];
291 444 new_cfhd_vlc_level[j] = table_9_vlc_level[i];
292
293 /* Don't include the zero level nor escape bits */
294
2/2
✓ Branch 0 taken 396 times.
✓ Branch 1 taken 48 times.
444 if (table_9_vlc_level[i] &&
295
2/2
✓ Branch 0 taken 390 times.
✓ Branch 1 taken 6 times.
396 new_cfhd_vlc_bits[j] != table_9_vlc_bits[NB_VLC_TABLE_9-1]) {
296 390 new_cfhd_vlc_bits[j] <<= 1;
297 390 new_cfhd_vlc_len[j]++;
298 390 j++;
299 390 new_cfhd_vlc_bits[j] = (table_9_vlc_bits[i] << 1) | 1;
300 390 new_cfhd_vlc_len[j] = table_9_vlc_len[i] + 1;
301 390 new_cfhd_vlc_run[j] = table_9_vlc_run[i];
302 390 new_cfhd_vlc_level[j] = -table_9_vlc_level[i];
303 }
304 }
305
306 6 ret = init_vlc(&s->vlc_9, VLC_BITS, j, new_cfhd_vlc_len,
307 1, 1, new_cfhd_vlc_bits, 4, 4, 0);
308
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if (ret < 0)
309 return ret;
310
2/2
✓ Branch 0 taken 12528 times.
✓ Branch 1 taken 6 times.
12534 for (i = 0; i < s->vlc_9.table_size; i++) {
311 12528 int code = s->vlc_9.table[i][0];
312 12528 int len = s->vlc_9.table[i][1];
313 int level, run;
314
315
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 12456 times.
12528 if (len < 0) { // more bits needed
316 72 run = 0;
317 72 level = code;
318 } else {
319 12456 run = new_cfhd_vlc_run[code];
320 12456 level = new_cfhd_vlc_level[code];
321 }
322 12528 s->table_9_rl_vlc[i].len = len;
323 12528 s->table_9_rl_vlc[i].level = level;
324 12528 s->table_9_rl_vlc[i].run = run;
325 }
326
327 /* Table 18 */
328
2/2
✓ Branch 0 taken 1584 times.
✓ Branch 1 taken 6 times.
1590 for (i = 0, j = 0; i < NB_VLC_TABLE_18; i++, j++) {
329 1584 new_cfhd_vlc_bits[j] = table_18_vlc_bits[i];
330 1584 new_cfhd_vlc_len[j] = table_18_vlc_len[i];
331 1584 new_cfhd_vlc_run[j] = table_18_vlc_run[i];
332 1584 new_cfhd_vlc_level[j] = table_18_vlc_level[i];
333
334 /* Don't include the zero level nor escape bits */
335
2/2
✓ Branch 0 taken 1536 times.
✓ Branch 1 taken 48 times.
1584 if (table_18_vlc_level[i] &&
336
2/2
✓ Branch 0 taken 1530 times.
✓ Branch 1 taken 6 times.
1536 new_cfhd_vlc_bits[j] != table_18_vlc_bits[NB_VLC_TABLE_18-1]) {
337 1530 new_cfhd_vlc_bits[j] <<= 1;
338 1530 new_cfhd_vlc_len[j]++;
339 1530 j++;
340 1530 new_cfhd_vlc_bits[j] = (table_18_vlc_bits[i] << 1) | 1;
341 1530 new_cfhd_vlc_len[j] = table_18_vlc_len[i] + 1;
342 1530 new_cfhd_vlc_run[j] = table_18_vlc_run[i];
343 1530 new_cfhd_vlc_level[j] = -table_18_vlc_level[i];
344 }
345 }
346
347 6 ret = init_vlc(&s->vlc_18, VLC_BITS, j, new_cfhd_vlc_len,
348 1, 1, new_cfhd_vlc_bits, 4, 4, 0);
349
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if (ret < 0)
350 return ret;
351
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 av_assert0(s->vlc_18.table_size == 4572);
352
353
2/2
✓ Branch 0 taken 27432 times.
✓ Branch 1 taken 6 times.
27438 for (i = 0; i < s->vlc_18.table_size; i++) {
354 27432 int code = s->vlc_18.table[i][0];
355 27432 int len = s->vlc_18.table[i][1];
356 int level, run;
357
358
2/2
✓ Branch 0 taken 150 times.
✓ Branch 1 taken 27282 times.
27432 if (len < 0) { // more bits needed
359 150 run = 0;
360 150 level = code;
361 } else {
362 27282 run = new_cfhd_vlc_run[code];
363 27282 level = new_cfhd_vlc_level[code];
364 }
365 27432 s->table_18_rl_vlc[i].len = len;
366 27432 s->table_18_rl_vlc[i].level = level;
367 27432 s->table_18_rl_vlc[i].run = run;
368 }
369
370 6 return ret;
371 }
372