Line | Branch | Exec | Source |
---|---|---|---|
1 | /** | ||
2 | * @file | ||
3 | * Vorbis I decoder | ||
4 | * @author Denes Balatoni ( dbalatoni programozo hu ) | ||
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 | * Vorbis I decoder | ||
26 | * @author Denes Balatoni ( dbalatoni programozo hu ) | ||
27 | */ | ||
28 | |||
29 | #include <inttypes.h> | ||
30 | #include <math.h> | ||
31 | |||
32 | #include "libavutil/avassert.h" | ||
33 | #include "libavutil/float_dsp.h" | ||
34 | #include "libavutil/mem.h" | ||
35 | #include "libavutil/tx.h" | ||
36 | |||
37 | #define BITSTREAM_READER_LE | ||
38 | #include "avcodec.h" | ||
39 | #include "codec_internal.h" | ||
40 | #include "decode.h" | ||
41 | #include "get_bits.h" | ||
42 | #include "internal.h" | ||
43 | #include "vorbis.h" | ||
44 | #include "vorbisdsp.h" | ||
45 | #include "vorbis_data.h" | ||
46 | #include "xiph.h" | ||
47 | |||
48 | #define V_NB_BITS 8 | ||
49 | #define V_NB_BITS2 11 | ||
50 | #define V_MAX_VLCS (1 << 16) | ||
51 | #define V_MAX_PARTITIONS (1 << 20) | ||
52 | |||
53 | typedef struct vorbis_codebook { | ||
54 | uint8_t dimensions; | ||
55 | uint8_t lookup_type; | ||
56 | uint8_t maxdepth; | ||
57 | VLC vlc; | ||
58 | float *codevectors; | ||
59 | unsigned int nb_bits; | ||
60 | } vorbis_codebook; | ||
61 | |||
62 | typedef union vorbis_floor_u vorbis_floor_data; | ||
63 | typedef struct vorbis_floor0_s vorbis_floor0; | ||
64 | typedef struct vorbis_floor1_s vorbis_floor1; | ||
65 | struct vorbis_context_s; | ||
66 | typedef | ||
67 | int (* vorbis_floor_decode_func) | ||
68 | (struct vorbis_context_s *, vorbis_floor_data *, float *); | ||
69 | typedef struct vorbis_floor { | ||
70 | uint8_t floor_type; | ||
71 | vorbis_floor_decode_func decode; | ||
72 | union vorbis_floor_u { | ||
73 | struct vorbis_floor0_s { | ||
74 | uint8_t order; | ||
75 | uint16_t rate; | ||
76 | uint16_t bark_map_size; | ||
77 | int32_t *map[2]; | ||
78 | uint32_t map_size[2]; | ||
79 | uint8_t amplitude_bits; | ||
80 | uint8_t amplitude_offset; | ||
81 | uint8_t num_books; | ||
82 | uint8_t *book_list; | ||
83 | float *lsp; | ||
84 | } t0; | ||
85 | struct vorbis_floor1_s { | ||
86 | uint8_t partitions; | ||
87 | uint8_t partition_class[32]; | ||
88 | uint8_t class_dimensions[16]; | ||
89 | uint8_t class_subclasses[16]; | ||
90 | uint8_t class_masterbook[16]; | ||
91 | int16_t subclass_books[16][8]; | ||
92 | uint8_t multiplier; | ||
93 | uint16_t x_list_dim; | ||
94 | vorbis_floor1_entry *list; | ||
95 | } t1; | ||
96 | } data; | ||
97 | } vorbis_floor; | ||
98 | |||
99 | typedef struct vorbis_residue { | ||
100 | uint16_t type; | ||
101 | uint32_t begin; | ||
102 | uint32_t end; | ||
103 | unsigned partition_size; | ||
104 | uint8_t classifications; | ||
105 | uint8_t classbook; | ||
106 | int16_t books[64][8]; | ||
107 | uint8_t maxpass; | ||
108 | uint16_t ptns_to_read; | ||
109 | uint8_t *classifs; | ||
110 | } vorbis_residue; | ||
111 | |||
112 | typedef struct vorbis_mapping { | ||
113 | uint8_t submaps; | ||
114 | uint16_t coupling_steps; | ||
115 | uint8_t *magnitude; | ||
116 | uint8_t *angle; | ||
117 | uint8_t *mux; | ||
118 | uint8_t submap_floor[16]; | ||
119 | uint8_t submap_residue[16]; | ||
120 | } vorbis_mapping; | ||
121 | |||
122 | typedef struct vorbis_mode { | ||
123 | uint8_t blockflag; | ||
124 | uint16_t windowtype; | ||
125 | uint16_t transformtype; | ||
126 | uint8_t mapping; | ||
127 | } vorbis_mode; | ||
128 | |||
129 | typedef struct vorbis_context_s { | ||
130 | AVCodecContext *avctx; | ||
131 | GetBitContext gb; | ||
132 | VorbisDSPContext dsp; | ||
133 | AVFloatDSPContext *fdsp; | ||
134 | |||
135 | AVTXContext *mdct[2]; | ||
136 | av_tx_fn mdct_fn[2]; | ||
137 | |||
138 | uint8_t first_frame; | ||
139 | uint32_t version; | ||
140 | uint8_t audio_channels; | ||
141 | uint32_t audio_samplerate; | ||
142 | uint32_t bitrate_maximum; | ||
143 | uint32_t bitrate_nominal; | ||
144 | uint32_t bitrate_minimum; | ||
145 | uint32_t blocksize[2]; | ||
146 | const float *win[2]; | ||
147 | uint16_t codebook_count; | ||
148 | vorbis_codebook *codebooks; | ||
149 | uint8_t floor_count; | ||
150 | vorbis_floor *floors; | ||
151 | uint8_t residue_count; | ||
152 | vorbis_residue *residues; | ||
153 | uint8_t mapping_count; | ||
154 | vorbis_mapping *mappings; | ||
155 | uint8_t mode_count; | ||
156 | vorbis_mode *modes; | ||
157 | uint8_t mode_number; // mode number for the current packet | ||
158 | int8_t previous_window; | ||
159 | float *channel_residues; | ||
160 | float *saved; | ||
161 | } vorbis_context; | ||
162 | |||
163 | /* Helper functions */ | ||
164 | |||
165 | #define BARK(x) \ | ||
166 | (13.1f * atan(0.00074f * (x)) + 2.24f * atan(1.85e-8f * (x) * (x)) + 1e-4f * (x)) | ||
167 | |||
168 | static const char idx_err_str[] = "Index value %d out of range (0 - %d) for %s at %s:%i\n"; | ||
169 | #define VALIDATE_INDEX(idx, limit) \ | ||
170 | if (idx >= limit) {\ | ||
171 | av_log(vc->avctx, AV_LOG_ERROR,\ | ||
172 | idx_err_str,\ | ||
173 | (int)(idx), (int)(limit - 1), #idx, __FILE__, __LINE__);\ | ||
174 | return AVERROR_INVALIDDATA;\ | ||
175 | } | ||
176 | #define GET_VALIDATED_INDEX(idx, bits, limit) \ | ||
177 | {\ | ||
178 | idx = get_bits(gb, bits);\ | ||
179 | VALIDATE_INDEX(idx, limit)\ | ||
180 | } | ||
181 | |||
182 | 1800 | static float vorbisfloat2float(unsigned val) | |
183 | { | ||
184 | 1800 | float mant = val & 0x1fffff; | |
185 | 1800 | int exp = (val & 0x7fe00000) >> 21; | |
186 |
2/2✓ Branch 0 taken 832 times.
✓ Branch 1 taken 968 times.
|
1800 | if (val & 0x80000000) |
187 | 832 | mant = -mant; | |
188 | 1800 | return ldexpf(mant, exp - 20 - 768); | |
189 | } | ||
190 | |||
191 | |||
192 | // Free all allocated memory ----------------------------------------- | ||
193 | |||
194 | 66 | static void vorbis_free(vorbis_context *vc) | |
195 | { | ||
196 | int i; | ||
197 | |||
198 | 66 | av_freep(&vc->channel_residues); | |
199 | 66 | av_freep(&vc->saved); | |
200 | 66 | av_freep(&vc->fdsp); | |
201 | |||
202 |
1/2✓ Branch 0 taken 66 times.
✗ Branch 1 not taken.
|
66 | if (vc->residues) |
203 |
2/2✓ Branch 0 taken 132 times.
✓ Branch 1 taken 66 times.
|
198 | for (i = 0; i < vc->residue_count; i++) |
204 | 132 | av_freep(&vc->residues[i].classifs); | |
205 | 66 | av_freep(&vc->residues); | |
206 | 66 | av_freep(&vc->modes); | |
207 | |||
208 | 66 | av_tx_uninit(&vc->mdct[0]); | |
209 | 66 | av_tx_uninit(&vc->mdct[1]); | |
210 | |||
211 |
1/2✓ Branch 0 taken 66 times.
✗ Branch 1 not taken.
|
66 | if (vc->codebooks) |
212 |
2/2✓ Branch 0 taken 2046 times.
✓ Branch 1 taken 66 times.
|
2112 | for (i = 0; i < vc->codebook_count; ++i) { |
213 | 2046 | av_freep(&vc->codebooks[i].codevectors); | |
214 | 2046 | ff_vlc_free(&vc->codebooks[i].vlc); | |
215 | } | ||
216 | 66 | av_freep(&vc->codebooks); | |
217 | |||
218 |
1/2✓ Branch 0 taken 66 times.
✗ Branch 1 not taken.
|
66 | if (vc->floors) |
219 |
2/2✓ Branch 0 taken 132 times.
✓ Branch 1 taken 66 times.
|
198 | for (i = 0; i < vc->floor_count; ++i) { |
220 |
2/2✓ Branch 0 taken 44 times.
✓ Branch 1 taken 88 times.
|
132 | if (vc->floors[i].floor_type == 0) { |
221 | 44 | av_freep(&vc->floors[i].data.t0.map[0]); | |
222 | 44 | av_freep(&vc->floors[i].data.t0.map[1]); | |
223 | 44 | av_freep(&vc->floors[i].data.t0.book_list); | |
224 | 44 | av_freep(&vc->floors[i].data.t0.lsp); | |
225 | } else { | ||
226 | 88 | av_freep(&vc->floors[i].data.t1.list); | |
227 | } | ||
228 | } | ||
229 | 66 | av_freep(&vc->floors); | |
230 | |||
231 |
1/2✓ Branch 0 taken 66 times.
✗ Branch 1 not taken.
|
66 | if (vc->mappings) |
232 |
2/2✓ Branch 0 taken 130 times.
✓ Branch 1 taken 66 times.
|
196 | for (i = 0; i < vc->mapping_count; ++i) { |
233 | 130 | av_freep(&vc->mappings[i].magnitude); | |
234 | 130 | av_freep(&vc->mappings[i].angle); | |
235 | 130 | av_freep(&vc->mappings[i].mux); | |
236 | } | ||
237 | 66 | av_freep(&vc->mappings); | |
238 | 66 | } | |
239 | |||
240 | // Parse setup header ------------------------------------------------- | ||
241 | |||
242 | // Process codebooks part | ||
243 | |||
244 | 66 | static int vorbis_parse_setup_hdr_codebooks(vorbis_context *vc) | |
245 | { | ||
246 | unsigned cb; | ||
247 | 66 | uint8_t *tmp_vlc_bits = NULL; | |
248 | 66 | uint32_t *tmp_vlc_codes = NULL; | |
249 | 66 | GetBitContext *gb = &vc->gb; | |
250 | 66 | uint16_t *codebook_multiplicands = NULL; | |
251 | 66 | int ret = 0; | |
252 | |||
253 | 66 | vc->codebook_count = get_bits(gb, 8) + 1; | |
254 | |||
255 | ff_dlog(NULL, " Codebooks: %d \n", vc->codebook_count); | ||
256 | |||
257 | 66 | vc->codebooks = av_mallocz(vc->codebook_count * sizeof(*vc->codebooks)); | |
258 | 66 | tmp_vlc_bits = av_mallocz(V_MAX_VLCS * sizeof(*tmp_vlc_bits)); | |
259 | 66 | tmp_vlc_codes = av_mallocz(V_MAX_VLCS * sizeof(*tmp_vlc_codes)); | |
260 | 66 | codebook_multiplicands = av_malloc(V_MAX_VLCS * sizeof(*codebook_multiplicands)); | |
261 |
2/4✓ Branch 0 taken 66 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 66 times.
✗ Branch 3 not taken.
|
66 | if (!vc->codebooks || |
262 |
2/4✓ Branch 0 taken 66 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 66 times.
|
66 | !tmp_vlc_bits || !tmp_vlc_codes || !codebook_multiplicands) { |
263 | ✗ | ret = AVERROR(ENOMEM); | |
264 | ✗ | goto error; | |
265 | } | ||
266 | |||
267 |
2/2✓ Branch 0 taken 2046 times.
✓ Branch 1 taken 66 times.
|
2112 | for (cb = 0; cb < vc->codebook_count; ++cb) { |
268 | 2046 | vorbis_codebook *codebook_setup = &vc->codebooks[cb]; | |
269 | 2046 | unsigned ordered, t, entries, used_entries = 0; | |
270 | |||
271 | ff_dlog(NULL, " %u. Codebook\n", cb); | ||
272 | |||
273 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 2046 times.
|
2046 | if (get_bits(gb, 24) != 0x564342) { |
274 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, | |
275 | " %u. Codebook setup data corrupt.\n", cb); | ||
276 | ✗ | ret = AVERROR_INVALIDDATA; | |
277 | ✗ | goto error; | |
278 | } | ||
279 | |||
280 | 2046 | codebook_setup->dimensions=get_bits(gb, 16); | |
281 |
2/4✓ Branch 0 taken 2046 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2046 times.
|
2046 | if (codebook_setup->dimensions > 16 || codebook_setup->dimensions == 0) { |
282 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, | |
283 | " %u. Codebook's dimension is invalid (%d).\n", | ||
284 | ✗ | cb, codebook_setup->dimensions); | |
285 | ✗ | ret = AVERROR_INVALIDDATA; | |
286 | ✗ | goto error; | |
287 | } | ||
288 | 2046 | entries = get_bits(gb, 24); | |
289 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2046 times.
|
2046 | if (entries > V_MAX_VLCS) { |
290 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, | |
291 | " %u. Codebook has too many entries (%u).\n", | ||
292 | cb, entries); | ||
293 | ✗ | ret = AVERROR_INVALIDDATA; | |
294 | ✗ | goto error; | |
295 | } | ||
296 | |||
297 | 2046 | ordered = get_bits1(gb); | |
298 | |||
299 | ff_dlog(NULL, " codebook_dimensions %d, codebook_entries %u\n", | ||
300 | codebook_setup->dimensions, entries); | ||
301 | |||
302 |
2/2✓ Branch 0 taken 2022 times.
✓ Branch 1 taken 24 times.
|
2046 | if (!ordered) { |
303 | unsigned ce, flag; | ||
304 | 2022 | unsigned sparse = get_bits1(gb); | |
305 | |||
306 | ff_dlog(NULL, " not ordered \n"); | ||
307 | |||
308 |
2/2✓ Branch 0 taken 826 times.
✓ Branch 1 taken 1196 times.
|
2022 | if (sparse) { |
309 | ff_dlog(NULL, " sparse \n"); | ||
310 | |||
311 | 826 | used_entries = 0; | |
312 |
2/2✓ Branch 0 taken 287536 times.
✓ Branch 1 taken 826 times.
|
288362 | for (ce = 0; ce < entries; ++ce) { |
313 | 287536 | flag = get_bits1(gb); | |
314 |
2/2✓ Branch 0 taken 102466 times.
✓ Branch 1 taken 185070 times.
|
287536 | if (flag) { |
315 | 102466 | tmp_vlc_bits[ce] = get_bits(gb, 5) + 1; | |
316 | 102466 | ++used_entries; | |
317 | } else | ||
318 | 185070 | tmp_vlc_bits[ce] = 0; | |
319 | } | ||
320 | } else { | ||
321 | ff_dlog(NULL, " not sparse \n"); | ||
322 | |||
323 | 1196 | used_entries = entries; | |
324 |
2/2✓ Branch 0 taken 299514 times.
✓ Branch 1 taken 1196 times.
|
300710 | for (ce = 0; ce < entries; ++ce) |
325 | 299514 | tmp_vlc_bits[ce] = get_bits(gb, 5) + 1; | |
326 | } | ||
327 | } else { | ||
328 | 24 | unsigned current_entry = 0; | |
329 | 24 | unsigned current_length = get_bits(gb, 5) + 1; | |
330 | |||
331 | ff_dlog(NULL, " ordered, current length: %u\n", current_length); //FIXME | ||
332 | |||
333 | 24 | used_entries = entries; | |
334 |
3/4✓ Branch 0 taken 84 times.
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 84 times.
✗ Branch 3 not taken.
|
108 | for (; current_entry < used_entries && current_length <= 32; ++current_length) { |
335 | unsigned i, number; | ||
336 | |||
337 | ff_dlog(NULL, " number bits: %u ", ilog(entries - current_entry)); | ||
338 | |||
339 | 84 | number = get_bits(gb, ilog(entries - current_entry)); | |
340 | |||
341 | ff_dlog(NULL, " number: %u\n", number); | ||
342 | |||
343 |
2/2✓ Branch 0 taken 902 times.
✓ Branch 1 taken 84 times.
|
986 | for (i = current_entry; i < number+current_entry; ++i) |
344 |
1/2✓ Branch 0 taken 902 times.
✗ Branch 1 not taken.
|
902 | if (i < used_entries) |
345 | 902 | tmp_vlc_bits[i] = current_length; | |
346 | |||
347 | 84 | current_entry+=number; | |
348 | } | ||
349 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
|
24 | if (current_entry>used_entries) { |
350 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, " More codelengths than codes in codebook. \n"); | |
351 | ✗ | ret = AVERROR_INVALIDDATA; | |
352 | ✗ | goto error; | |
353 | } | ||
354 | } | ||
355 | |||
356 | 2046 | codebook_setup->lookup_type = get_bits(gb, 4); | |
357 | |||
358 | ff_dlog(NULL, " lookup type: %d : %s \n", codebook_setup->lookup_type, | ||
359 | codebook_setup->lookup_type ? "vq" : "no lookup"); | ||
360 | |||
361 | // If the codebook is used for (inverse) VQ, calculate codevectors. | ||
362 | |||
363 |
2/2✓ Branch 0 taken 900 times.
✓ Branch 1 taken 1146 times.
|
2046 | if (codebook_setup->lookup_type == 1) { |
364 | unsigned i, j, k; | ||
365 | 900 | unsigned codebook_lookup_values = ff_vorbis_nth_root(entries, codebook_setup->dimensions); | |
366 | |||
367 | 900 | float codebook_minimum_value = vorbisfloat2float(get_bits_long(gb, 32)); | |
368 | 900 | float codebook_delta_value = vorbisfloat2float(get_bits_long(gb, 32)); | |
369 | 900 | unsigned codebook_value_bits = get_bits(gb, 4) + 1; | |
370 | 900 | unsigned codebook_sequence_p = get_bits1(gb); | |
371 | |||
372 |
2/4✓ Branch 0 taken 900 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 900 times.
|
900 | if (!isfinite(codebook_minimum_value) || !isfinite(codebook_delta_value)) { |
373 | ✗ | ret = AVERROR_INVALIDDATA; | |
374 | ✗ | goto error; | |
375 | } | ||
376 | ff_dlog(NULL, " We expect %d numbers for building the codevectors. \n", | ||
377 | codebook_lookup_values); | ||
378 | ff_dlog(NULL, " delta %f minmum %f \n", | ||
379 | codebook_delta_value, codebook_minimum_value); | ||
380 | |||
381 |
2/2✓ Branch 0 taken 17232 times.
✓ Branch 1 taken 900 times.
|
18132 | for (i = 0; i < codebook_lookup_values; ++i) { |
382 | 17232 | codebook_multiplicands[i] = get_bits(gb, codebook_value_bits); | |
383 | |||
384 | ff_dlog(NULL, " multiplicands*delta+minmum : %e \n", | ||
385 | (float)codebook_multiplicands[i] * codebook_delta_value + codebook_minimum_value); | ||
386 | ff_dlog(NULL, " multiplicand %u\n", codebook_multiplicands[i]); | ||
387 | } | ||
388 | |||
389 | // Weed out unused vlcs and build codevector vector | ||
390 |
1/2✓ Branch 0 taken 900 times.
✗ Branch 1 not taken.
|
900 | if (used_entries) { |
391 | 900 | codebook_setup->codevectors = | |
392 | 900 | av_calloc(used_entries, codebook_setup->dimensions * | |
393 | sizeof(*codebook_setup->codevectors)); | ||
394 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 900 times.
|
900 | if (!codebook_setup->codevectors) { |
395 | ✗ | ret = AVERROR(ENOMEM); | |
396 | ✗ | goto error; | |
397 | } | ||
398 | } else | ||
399 | ✗ | codebook_setup->codevectors = NULL; | |
400 | |||
401 |
2/2✓ Branch 0 taken 492498 times.
✓ Branch 1 taken 900 times.
|
493398 | for (j = 0, i = 0; i < entries; ++i) { |
402 | 492498 | unsigned dim = codebook_setup->dimensions; | |
403 | |||
404 |
2/2✓ Branch 0 taken 319750 times.
✓ Branch 1 taken 172748 times.
|
492498 | if (tmp_vlc_bits[i]) { |
405 | 319750 | float last = 0.0; | |
406 | 319750 | unsigned lookup_offset = i; | |
407 | |||
408 | ff_dlog(vc->avctx, "Lookup offset %u ,", i); | ||
409 | |||
410 |
2/2✓ Branch 0 taken 963193 times.
✓ Branch 1 taken 319750 times.
|
1282943 | for (k = 0; k < dim; ++k) { |
411 | 963193 | unsigned multiplicand_offset = lookup_offset % codebook_lookup_values; | |
412 | 963193 | codebook_setup->codevectors[j * dim + k] = codebook_multiplicands[multiplicand_offset] * codebook_delta_value + codebook_minimum_value + last; | |
413 |
2/2✓ Branch 0 taken 257530 times.
✓ Branch 1 taken 705663 times.
|
963193 | if (codebook_sequence_p) |
414 | 257530 | last = codebook_setup->codevectors[j * dim + k]; | |
415 | 963193 | lookup_offset/=codebook_lookup_values; | |
416 | } | ||
417 | 319750 | tmp_vlc_bits[j] = tmp_vlc_bits[i]; | |
418 | |||
419 | ff_dlog(vc->avctx, "real lookup offset %u, vector: ", j); | ||
420 |
2/2✓ Branch 0 taken 963193 times.
✓ Branch 1 taken 319750 times.
|
1282943 | for (k = 0; k < dim; ++k) |
421 | ff_dlog(vc->avctx, " %f ", | ||
422 | codebook_setup->codevectors[j * dim + k]); | ||
423 | ff_dlog(vc->avctx, "\n"); | ||
424 | |||
425 | 319750 | ++j; | |
426 | } | ||
427 | } | ||
428 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 900 times.
|
900 | if (j != used_entries) { |
429 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, "Bug in codevector vector building code. \n"); | |
430 | ✗ | ret = AVERROR_INVALIDDATA; | |
431 | ✗ | goto error; | |
432 | } | ||
433 | 900 | entries = used_entries; | |
434 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1146 times.
|
1146 | } else if (codebook_setup->lookup_type >= 2) { |
435 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, "Codebook lookup type not supported. \n"); | |
436 | ✗ | ret = AVERROR_INVALIDDATA; | |
437 | ✗ | goto error; | |
438 | } | ||
439 | |||
440 | // Initialize VLC table | ||
441 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 2046 times.
|
2046 | if (ff_vorbis_len2vlc(tmp_vlc_bits, tmp_vlc_codes, entries)) { |
442 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, " Invalid code lengths while generating vlcs. \n"); | |
443 | ✗ | ret = AVERROR_INVALIDDATA; | |
444 | ✗ | goto error; | |
445 | } | ||
446 | 2046 | codebook_setup->maxdepth = 0; | |
447 |
2/2✓ Branch 0 taken 415204 times.
✓ Branch 1 taken 2046 times.
|
417250 | for (t = 0; t < entries; ++t) |
448 |
2/2✓ Branch 0 taken 113542 times.
✓ Branch 1 taken 301662 times.
|
415204 | if (tmp_vlc_bits[t] >= codebook_setup->maxdepth) |
449 | 113542 | codebook_setup->maxdepth = tmp_vlc_bits[t]; | |
450 | |||
451 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2046 times.
|
2046 | if (codebook_setup->maxdepth > 3 * V_NB_BITS) |
452 | ✗ | codebook_setup->nb_bits = V_NB_BITS2; | |
453 | else | ||
454 | 2046 | codebook_setup->nb_bits = V_NB_BITS; | |
455 | |||
456 | 2046 | codebook_setup->maxdepth = (codebook_setup->maxdepth+codebook_setup->nb_bits - 1) / codebook_setup->nb_bits; | |
457 | |||
458 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 2046 times.
|
2046 | if ((ret = vlc_init(&codebook_setup->vlc, codebook_setup->nb_bits, |
459 | entries, tmp_vlc_bits, sizeof(*tmp_vlc_bits), | ||
460 | sizeof(*tmp_vlc_bits), tmp_vlc_codes, | ||
461 | sizeof(*tmp_vlc_codes), sizeof(*tmp_vlc_codes), | ||
462 | VLC_INIT_LE))) { | ||
463 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, " Error generating vlc tables. \n"); | |
464 | ✗ | goto error; | |
465 | } | ||
466 | } | ||
467 | |||
468 | 66 | av_free(tmp_vlc_bits); | |
469 | 66 | av_free(tmp_vlc_codes); | |
470 | 66 | av_free(codebook_multiplicands); | |
471 | 66 | return 0; | |
472 | |||
473 | // Error: | ||
474 | ✗ | error: | |
475 | ✗ | av_free(tmp_vlc_bits); | |
476 | ✗ | av_free(tmp_vlc_codes); | |
477 | ✗ | av_free(codebook_multiplicands); | |
478 | ✗ | return ret; | |
479 | } | ||
480 | |||
481 | // Process time domain transforms part (unused in Vorbis I) | ||
482 | |||
483 | 66 | static int vorbis_parse_setup_hdr_tdtransforms(vorbis_context *vc) | |
484 | { | ||
485 | 66 | GetBitContext *gb = &vc->gb; | |
486 | 66 | unsigned i, vorbis_time_count = get_bits(gb, 6) + 1; | |
487 | |||
488 |
2/2✓ Branch 0 taken 66 times.
✓ Branch 1 taken 66 times.
|
132 | for (i = 0; i < vorbis_time_count; ++i) { |
489 | 66 | unsigned vorbis_tdtransform = get_bits(gb, 16); | |
490 | |||
491 | ff_dlog(NULL, " Vorbis time domain transform %u: %u\n", | ||
492 | vorbis_time_count, vorbis_tdtransform); | ||
493 | |||
494 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 66 times.
|
66 | if (vorbis_tdtransform) { |
495 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, "Vorbis time domain transform data nonzero. \n"); | |
496 | ✗ | return AVERROR_INVALIDDATA; | |
497 | } | ||
498 | } | ||
499 | 66 | return 0; | |
500 | } | ||
501 | |||
502 | // Process floors part | ||
503 | |||
504 | static int vorbis_floor0_decode(vorbis_context *vc, | ||
505 | vorbis_floor_data *vfu, float *vec); | ||
506 | static int create_map(vorbis_context *vc, unsigned floor_number); | ||
507 | static int vorbis_floor1_decode(vorbis_context *vc, | ||
508 | vorbis_floor_data *vfu, float *vec); | ||
509 | 66 | static int vorbis_parse_setup_hdr_floors(vorbis_context *vc) | |
510 | { | ||
511 | 66 | GetBitContext *gb = &vc->gb; | |
512 | int i, j, k, ret; | ||
513 | |||
514 | 66 | vc->floor_count = get_bits(gb, 6) + 1; | |
515 | |||
516 | 66 | vc->floors = av_mallocz(vc->floor_count * sizeof(*vc->floors)); | |
517 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 66 times.
|
66 | if (!vc->floors) |
518 | ✗ | return AVERROR(ENOMEM); | |
519 | |||
520 |
2/2✓ Branch 0 taken 132 times.
✓ Branch 1 taken 66 times.
|
198 | for (i = 0; i < vc->floor_count; ++i) { |
521 | 132 | vorbis_floor *floor_setup = &vc->floors[i]; | |
522 | |||
523 | 132 | floor_setup->floor_type = get_bits(gb, 16); | |
524 | |||
525 | ff_dlog(NULL, " %d. floor type %d \n", i, floor_setup->floor_type); | ||
526 | |||
527 |
2/2✓ Branch 0 taken 88 times.
✓ Branch 1 taken 44 times.
|
132 | if (floor_setup->floor_type == 1) { |
528 | 88 | int maximum_class = -1; | |
529 | 88 | unsigned rangebits, rangemax, floor1_values = 2; | |
530 | |||
531 | 88 | floor_setup->decode = vorbis_floor1_decode; | |
532 | |||
533 | 88 | floor_setup->data.t1.partitions = get_bits(gb, 5); | |
534 | |||
535 | ff_dlog(NULL, " %d.floor: %d partitions \n", | ||
536 | i, floor_setup->data.t1.partitions); | ||
537 | |||
538 |
2/2✓ Branch 0 taken 502 times.
✓ Branch 1 taken 88 times.
|
590 | for (j = 0; j < floor_setup->data.t1.partitions; ++j) { |
539 | 502 | floor_setup->data.t1.partition_class[j] = get_bits(gb, 4); | |
540 |
2/2✓ Branch 0 taken 318 times.
✓ Branch 1 taken 184 times.
|
502 | if (floor_setup->data.t1.partition_class[j] > maximum_class) |
541 | 318 | maximum_class = floor_setup->data.t1.partition_class[j]; | |
542 | |||
543 | ff_dlog(NULL, " %d. floor %d partition class %d \n", | ||
544 | i, j, floor_setup->data.t1.partition_class[j]); | ||
545 | |||
546 | } | ||
547 | |||
548 | ff_dlog(NULL, " maximum class %d \n", maximum_class); | ||
549 | |||
550 |
2/2✓ Branch 0 taken 318 times.
✓ Branch 1 taken 88 times.
|
406 | for (j = 0; j <= maximum_class; ++j) { |
551 | 318 | floor_setup->data.t1.class_dimensions[j] = get_bits(gb, 3) + 1; | |
552 | 318 | floor_setup->data.t1.class_subclasses[j] = get_bits(gb, 2); | |
553 | |||
554 | ff_dlog(NULL, " %d floor %d class dim: %d subclasses %d \n", i, j, | ||
555 | floor_setup->data.t1.class_dimensions[j], | ||
556 | floor_setup->data.t1.class_subclasses[j]); | ||
557 | |||
558 |
2/2✓ Branch 0 taken 262 times.
✓ Branch 1 taken 56 times.
|
318 | if (floor_setup->data.t1.class_subclasses[j]) { |
559 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 262 times.
|
262 | GET_VALIDATED_INDEX(floor_setup->data.t1.class_masterbook[j], 8, vc->codebook_count) |
560 | |||
561 | ff_dlog(NULL, " masterbook: %d \n", floor_setup->data.t1.class_masterbook[j]); | ||
562 | } | ||
563 | |||
564 |
2/2✓ Branch 0 taken 904 times.
✓ Branch 1 taken 318 times.
|
1222 | for (k = 0; k < (1 << floor_setup->data.t1.class_subclasses[j]); ++k) { |
565 | 904 | int16_t bits = get_bits(gb, 8) - 1; | |
566 |
2/2✓ Branch 0 taken 752 times.
✓ Branch 1 taken 152 times.
|
904 | if (bits != -1) |
567 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 752 times.
|
752 | VALIDATE_INDEX(bits, vc->codebook_count) |
568 | 904 | floor_setup->data.t1.subclass_books[j][k] = bits; | |
569 | |||
570 | ff_dlog(NULL, " book %d. : %d \n", k, floor_setup->data.t1.subclass_books[j][k]); | ||
571 | } | ||
572 | } | ||
573 | |||
574 | 88 | floor_setup->data.t1.multiplier = get_bits(gb, 2) + 1; | |
575 | 88 | floor_setup->data.t1.x_list_dim = 2; | |
576 | |||
577 |
2/2✓ Branch 0 taken 502 times.
✓ Branch 1 taken 88 times.
|
590 | for (j = 0; j < floor_setup->data.t1.partitions; ++j) |
578 | 502 | floor_setup->data.t1.x_list_dim+=floor_setup->data.t1.class_dimensions[floor_setup->data.t1.partition_class[j]]; | |
579 | |||
580 | 88 | floor_setup->data.t1.list = av_calloc(floor_setup->data.t1.x_list_dim, | |
581 | sizeof(*floor_setup->data.t1.list)); | ||
582 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 88 times.
|
88 | if (!floor_setup->data.t1.list) |
583 | ✗ | return AVERROR(ENOMEM); | |
584 | |||
585 | 88 | rangebits = get_bits(gb, 4); | |
586 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 88 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
88 | if (!rangebits && floor_setup->data.t1.partitions) { |
587 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, | |
588 | "A rangebits value of 0 is not compliant with the Vorbis I specification.\n"); | ||
589 | ✗ | return AVERROR_INVALIDDATA; | |
590 | } | ||
591 | 88 | rangemax = (1 << rangebits); | |
592 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 88 times.
|
88 | if (rangemax > vc->blocksize[1] / 2) { |
593 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, | |
594 | "Floor value is too large for blocksize: %u (%"PRIu32")\n", | ||
595 | ✗ | rangemax, vc->blocksize[1] / 2); | |
596 | ✗ | return AVERROR_INVALIDDATA; | |
597 | } | ||
598 | 88 | floor_setup->data.t1.list[0].x = 0; | |
599 | 88 | floor_setup->data.t1.list[1].x = rangemax; | |
600 | |||
601 |
2/2✓ Branch 0 taken 502 times.
✓ Branch 1 taken 88 times.
|
590 | for (j = 0; j < floor_setup->data.t1.partitions; ++j) { |
602 |
2/2✓ Branch 0 taken 1618 times.
✓ Branch 1 taken 502 times.
|
2120 | for (k = 0; k < floor_setup->data.t1.class_dimensions[floor_setup->data.t1.partition_class[j]]; ++k, ++floor1_values) { |
603 | 1618 | floor_setup->data.t1.list[floor1_values].x = get_bits(gb, rangebits); | |
604 | |||
605 | ff_dlog(NULL, " %u. floor1 Y coord. %d\n", floor1_values, | ||
606 | floor_setup->data.t1.list[floor1_values].x); | ||
607 | } | ||
608 | } | ||
609 | |||
610 | // Precalculate order of x coordinates - needed for decode | ||
611 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 88 times.
|
88 | if (ff_vorbis_ready_floor1_list(vc->avctx, |
612 | floor_setup->data.t1.list, | ||
613 | 88 | floor_setup->data.t1.x_list_dim)) { | |
614 | ✗ | return AVERROR_INVALIDDATA; | |
615 | } | ||
616 |
1/2✓ Branch 0 taken 44 times.
✗ Branch 1 not taken.
|
44 | } else if (floor_setup->floor_type == 0) { |
617 | 44 | unsigned max_codebook_dim = 0; | |
618 | |||
619 | 44 | floor_setup->decode = vorbis_floor0_decode; | |
620 | |||
621 | 44 | floor_setup->data.t0.order = get_bits(gb, 8); | |
622 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 44 times.
|
44 | if (!floor_setup->data.t0.order) { |
623 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, "Floor 0 order is 0.\n"); | |
624 | ✗ | return AVERROR_INVALIDDATA; | |
625 | } | ||
626 | 44 | floor_setup->data.t0.rate = get_bits(gb, 16); | |
627 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 44 times.
|
44 | if (!floor_setup->data.t0.rate) { |
628 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, "Floor 0 rate is 0.\n"); | |
629 | ✗ | return AVERROR_INVALIDDATA; | |
630 | } | ||
631 | 44 | floor_setup->data.t0.bark_map_size = get_bits(gb, 16); | |
632 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 44 times.
|
44 | if (!floor_setup->data.t0.bark_map_size) { |
633 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, | |
634 | "Floor 0 bark map size is 0.\n"); | ||
635 | ✗ | return AVERROR_INVALIDDATA; | |
636 | } | ||
637 | 44 | floor_setup->data.t0.amplitude_bits = get_bits(gb, 6); | |
638 | 44 | floor_setup->data.t0.amplitude_offset = get_bits(gb, 8); | |
639 | 44 | floor_setup->data.t0.num_books = get_bits(gb, 4) + 1; | |
640 | |||
641 | /* allocate mem for booklist */ | ||
642 | 44 | floor_setup->data.t0.book_list = | |
643 | 44 | av_malloc(floor_setup->data.t0.num_books); | |
644 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 44 times.
|
44 | if (!floor_setup->data.t0.book_list) |
645 | ✗ | return AVERROR(ENOMEM); | |
646 | /* read book indexes */ | ||
647 | { | ||
648 | int idx; | ||
649 | unsigned book_idx; | ||
650 |
2/2✓ Branch 0 taken 68 times.
✓ Branch 1 taken 44 times.
|
112 | for (idx = 0; idx < floor_setup->data.t0.num_books; ++idx) { |
651 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 68 times.
|
68 | GET_VALIDATED_INDEX(book_idx, 8, vc->codebook_count) |
652 | 68 | floor_setup->data.t0.book_list[idx] = book_idx; | |
653 |
1/2✓ Branch 0 taken 68 times.
✗ Branch 1 not taken.
|
68 | if (vc->codebooks[book_idx].dimensions > max_codebook_dim) |
654 | 68 | max_codebook_dim = vc->codebooks[book_idx].dimensions; | |
655 | } | ||
656 | } | ||
657 | |||
658 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 44 times.
|
44 | if ((ret = create_map(vc, i)) < 0) |
659 | ✗ | return ret; | |
660 | |||
661 | /* codebook dim is for padding if codebook dim doesn't * | ||
662 | * divide order+1 then we need to read more data */ | ||
663 | 44 | floor_setup->data.t0.lsp = | |
664 | 44 | av_malloc_array((floor_setup->data.t0.order + 1 + max_codebook_dim), | |
665 | sizeof(*floor_setup->data.t0.lsp)); | ||
666 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 44 times.
|
44 | if (!floor_setup->data.t0.lsp) |
667 | ✗ | return AVERROR(ENOMEM); | |
668 | |||
669 | /* debug output parsed headers */ | ||
670 | ff_dlog(NULL, "floor0 order: %u\n", floor_setup->data.t0.order); | ||
671 | ff_dlog(NULL, "floor0 rate: %u\n", floor_setup->data.t0.rate); | ||
672 | ff_dlog(NULL, "floor0 bark map size: %u\n", | ||
673 | floor_setup->data.t0.bark_map_size); | ||
674 | ff_dlog(NULL, "floor0 amplitude bits: %u\n", | ||
675 | floor_setup->data.t0.amplitude_bits); | ||
676 | ff_dlog(NULL, "floor0 amplitude offset: %u\n", | ||
677 | floor_setup->data.t0.amplitude_offset); | ||
678 | ff_dlog(NULL, "floor0 number of books: %u\n", | ||
679 | floor_setup->data.t0.num_books); | ||
680 | ff_dlog(NULL, "floor0 book list pointer: %p\n", | ||
681 | floor_setup->data.t0.book_list); | ||
682 | { | ||
683 | int idx; | ||
684 |
2/2✓ Branch 0 taken 68 times.
✓ Branch 1 taken 44 times.
|
112 | for (idx = 0; idx < floor_setup->data.t0.num_books; ++idx) { |
685 | ff_dlog(NULL, " Book %d: %u\n", idx + 1, | ||
686 | floor_setup->data.t0.book_list[idx]); | ||
687 | } | ||
688 | } | ||
689 | } else { | ||
690 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, "Invalid floor type!\n"); | |
691 | ✗ | return AVERROR_INVALIDDATA; | |
692 | } | ||
693 | } | ||
694 | 66 | return 0; | |
695 | } | ||
696 | |||
697 | // Process residues part | ||
698 | |||
699 | 66 | static int vorbis_parse_setup_hdr_residues(vorbis_context *vc) | |
700 | { | ||
701 | 66 | GetBitContext *gb = &vc->gb; | |
702 | unsigned i, j, k; | ||
703 | |||
704 | 66 | vc->residue_count = get_bits(gb, 6)+1; | |
705 | 66 | vc->residues = av_mallocz(vc->residue_count * sizeof(*vc->residues)); | |
706 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 66 times.
|
66 | if (!vc->residues) |
707 | ✗ | return AVERROR(ENOMEM); | |
708 | |||
709 | ff_dlog(NULL, " There are %d residues. \n", vc->residue_count); | ||
710 | |||
711 |
2/2✓ Branch 0 taken 132 times.
✓ Branch 1 taken 66 times.
|
198 | for (i = 0; i < vc->residue_count; ++i) { |
712 | 132 | vorbis_residue *res_setup = &vc->residues[i]; | |
713 | uint8_t cascade[64]; | ||
714 | unsigned high_bits, low_bits; | ||
715 | |||
716 | 132 | res_setup->type = get_bits(gb, 16); | |
717 | |||
718 | ff_dlog(NULL, " %u. residue type %d\n", i, res_setup->type); | ||
719 | |||
720 | 132 | res_setup->begin = get_bits(gb, 24); | |
721 | 132 | res_setup->end = get_bits(gb, 24); | |
722 | 132 | res_setup->partition_size = get_bits(gb, 24) + 1; | |
723 | /* Validations to prevent a buffer overflow later. */ | ||
724 |
1/2✓ Branch 0 taken 132 times.
✗ Branch 1 not taken.
|
132 | if (res_setup->begin>res_setup->end || |
725 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 132 times.
|
132 | (res_setup->end-res_setup->begin) / res_setup->partition_size > FFMIN(V_MAX_PARTITIONS, 65535)) { |
726 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, | |
727 | "partition out of bounds: type, begin, end, size, blocksize: %"PRIu16", %"PRIu32", %"PRIu32", %u, %"PRIu32"\n", | ||
728 | ✗ | res_setup->type, res_setup->begin, res_setup->end, | |
729 | ✗ | res_setup->partition_size, vc->blocksize[1] / 2); | |
730 | ✗ | return AVERROR_INVALIDDATA; | |
731 | } | ||
732 | |||
733 | 132 | res_setup->classifications = get_bits(gb, 6) + 1; | |
734 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 132 times.
|
132 | GET_VALIDATED_INDEX(res_setup->classbook, 8, vc->codebook_count) |
735 | |||
736 | 132 | res_setup->ptns_to_read = | |
737 | 132 | (res_setup->end - res_setup->begin) / res_setup->partition_size; | |
738 | 264 | res_setup->classifs = av_malloc_array(res_setup->ptns_to_read, | |
739 | 132 | vc->audio_channels * | |
740 | sizeof(*res_setup->classifs)); | ||
741 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 132 times.
|
132 | if (!res_setup->classifs) |
742 | ✗ | return AVERROR(ENOMEM); | |
743 | |||
744 | ff_dlog(NULL, " begin %"PRIu32" end %"PRIu32" part.size %u classif.s %"PRIu8" classbook %"PRIu8"\n", | ||
745 | res_setup->begin, res_setup->end, res_setup->partition_size, | ||
746 | res_setup->classifications, res_setup->classbook); | ||
747 | |||
748 |
2/2✓ Branch 0 taken 1144 times.
✓ Branch 1 taken 132 times.
|
1276 | for (j = 0; j < res_setup->classifications; ++j) { |
749 | 1144 | high_bits = 0; | |
750 | 1144 | low_bits = get_bits(gb, 3); | |
751 |
2/2✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1140 times.
|
1144 | if (get_bits1(gb)) |
752 | 4 | high_bits = get_bits(gb, 5); | |
753 | 1144 | cascade[j] = (high_bits << 3) + low_bits; | |
754 | |||
755 | ff_dlog(NULL, " %u class cascade depth: %d\n", j, ilog(cascade[j])); | ||
756 | } | ||
757 | |||
758 | 132 | res_setup->maxpass = 0; | |
759 |
2/2✓ Branch 0 taken 1144 times.
✓ Branch 1 taken 132 times.
|
1276 | for (j = 0; j < res_setup->classifications; ++j) { |
760 |
2/2✓ Branch 0 taken 9152 times.
✓ Branch 1 taken 1144 times.
|
10296 | for (k = 0; k < 8; ++k) { |
761 |
2/2✓ Branch 0 taken 1348 times.
✓ Branch 1 taken 7804 times.
|
9152 | if (cascade[j]&(1 << k)) { |
762 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 1348 times.
|
1348 | GET_VALIDATED_INDEX(res_setup->books[j][k], 8, vc->codebook_count) |
763 | |||
764 | ff_dlog(NULL, " %u class cascade depth %u book: %d\n", | ||
765 | j, k, res_setup->books[j][k]); | ||
766 | |||
767 |
2/2✓ Branch 0 taken 106 times.
✓ Branch 1 taken 1242 times.
|
1348 | if (k>res_setup->maxpass) |
768 | 106 | res_setup->maxpass = k; | |
769 | } else { | ||
770 | 7804 | res_setup->books[j][k] = -1; | |
771 | } | ||
772 | } | ||
773 | } | ||
774 | } | ||
775 | 66 | return 0; | |
776 | } | ||
777 | |||
778 | // Process mappings part | ||
779 | |||
780 | 66 | static int vorbis_parse_setup_hdr_mappings(vorbis_context *vc) | |
781 | { | ||
782 | 66 | GetBitContext *gb = &vc->gb; | |
783 | unsigned i, j; | ||
784 | |||
785 | 66 | vc->mapping_count = get_bits(gb, 6)+1; | |
786 | 66 | vc->mappings = av_mallocz(vc->mapping_count * sizeof(*vc->mappings)); | |
787 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 66 times.
|
66 | if (!vc->mappings) |
788 | ✗ | return AVERROR(ENOMEM); | |
789 | |||
790 | ff_dlog(NULL, " There are %d mappings. \n", vc->mapping_count); | ||
791 | |||
792 |
2/2✓ Branch 0 taken 130 times.
✓ Branch 1 taken 66 times.
|
196 | for (i = 0; i < vc->mapping_count; ++i) { |
793 | 130 | vorbis_mapping *mapping_setup = &vc->mappings[i]; | |
794 | |||
795 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 130 times.
|
130 | if (get_bits(gb, 16)) { |
796 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, "Other mappings than type 0 are not compliant with the Vorbis I specification. \n"); | |
797 | ✗ | return AVERROR_INVALIDDATA; | |
798 | } | ||
799 |
2/2✓ Branch 1 taken 4 times.
✓ Branch 2 taken 126 times.
|
130 | if (get_bits1(gb)) { |
800 | 4 | mapping_setup->submaps = get_bits(gb, 4) + 1; | |
801 | } else { | ||
802 | 126 | mapping_setup->submaps = 1; | |
803 | } | ||
804 | |||
805 |
2/2✓ Branch 1 taken 50 times.
✓ Branch 2 taken 80 times.
|
130 | if (get_bits1(gb)) { |
806 | 50 | mapping_setup->coupling_steps = get_bits(gb, 8) + 1; | |
807 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 50 times.
|
50 | if (vc->audio_channels < 2) { |
808 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, | |
809 | "Square polar channel mapping with less than two channels is not compliant with the Vorbis I specification.\n"); | ||
810 | ✗ | return AVERROR_INVALIDDATA; | |
811 | } | ||
812 | 50 | mapping_setup->magnitude = av_mallocz(mapping_setup->coupling_steps * | |
813 | sizeof(*mapping_setup->magnitude)); | ||
814 | 50 | mapping_setup->angle = av_mallocz(mapping_setup->coupling_steps * | |
815 | sizeof(*mapping_setup->angle)); | ||
816 |
2/4✓ Branch 0 taken 50 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 50 times.
|
50 | if (!mapping_setup->angle || !mapping_setup->magnitude) |
817 | ✗ | return AVERROR(ENOMEM); | |
818 | |||
819 |
2/2✓ Branch 0 taken 62 times.
✓ Branch 1 taken 50 times.
|
112 | for (j = 0; j < mapping_setup->coupling_steps; ++j) { |
820 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 62 times.
|
62 | GET_VALIDATED_INDEX(mapping_setup->magnitude[j], ilog(vc->audio_channels - 1), vc->audio_channels) |
821 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 62 times.
|
62 | GET_VALIDATED_INDEX(mapping_setup->angle[j], ilog(vc->audio_channels - 1), vc->audio_channels) |
822 | } | ||
823 | } else { | ||
824 | 80 | mapping_setup->coupling_steps = 0; | |
825 | } | ||
826 | |||
827 | ff_dlog(NULL, " %u mapping coupling steps: %d\n", | ||
828 | i, mapping_setup->coupling_steps); | ||
829 | |||
830 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 130 times.
|
130 | if (get_bits(gb, 2)) { |
831 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, "%u. mapping setup data invalid.\n", i); | |
832 | ✗ | return AVERROR_INVALIDDATA; // following spec. | |
833 | } | ||
834 | |||
835 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 126 times.
|
130 | if (mapping_setup->submaps>1) { |
836 | 4 | mapping_setup->mux = av_calloc(vc->audio_channels, | |
837 | sizeof(*mapping_setup->mux)); | ||
838 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
4 | if (!mapping_setup->mux) |
839 | ✗ | return AVERROR(ENOMEM); | |
840 | |||
841 |
2/2✓ Branch 0 taken 24 times.
✓ Branch 1 taken 4 times.
|
28 | for (j = 0; j < vc->audio_channels; ++j) |
842 | 24 | mapping_setup->mux[j] = get_bits(gb, 4); | |
843 | } | ||
844 | |||
845 |
2/2✓ Branch 0 taken 134 times.
✓ Branch 1 taken 130 times.
|
264 | for (j = 0; j < mapping_setup->submaps; ++j) { |
846 | 134 | skip_bits(gb, 8); // FIXME check? | |
847 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 134 times.
|
134 | GET_VALIDATED_INDEX(mapping_setup->submap_floor[j], 8, vc->floor_count) |
848 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 134 times.
|
134 | GET_VALIDATED_INDEX(mapping_setup->submap_residue[j], 8, vc->residue_count) |
849 | |||
850 | ff_dlog(NULL, " %u mapping %u submap : floor %d, residue %d\n", i, j, | ||
851 | mapping_setup->submap_floor[j], | ||
852 | mapping_setup->submap_residue[j]); | ||
853 | } | ||
854 | } | ||
855 | 66 | return 0; | |
856 | } | ||
857 | |||
858 | // Process modes part | ||
859 | |||
860 | 44 | static int create_map(vorbis_context *vc, unsigned floor_number) | |
861 | { | ||
862 | 44 | vorbis_floor *floors = vc->floors; | |
863 | vorbis_floor0 *vf; | ||
864 | int idx; | ||
865 | int blockflag, n; | ||
866 | int32_t *map; | ||
867 | |||
868 |
2/2✓ Branch 0 taken 88 times.
✓ Branch 1 taken 44 times.
|
132 | for (blockflag = 0; blockflag < 2; ++blockflag) { |
869 | 88 | n = vc->blocksize[blockflag] / 2; | |
870 | 176 | floors[floor_number].data.t0.map[blockflag] = | |
871 | 88 | av_malloc_array(n + 1, sizeof(int32_t)); // n + sentinel | |
872 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 88 times.
|
88 | if (!floors[floor_number].data.t0.map[blockflag]) |
873 | ✗ | return AVERROR(ENOMEM); | |
874 | |||
875 | 88 | map = floors[floor_number].data.t0.map[blockflag]; | |
876 | 88 | vf = &floors[floor_number].data.t0; | |
877 | |||
878 |
2/2✓ Branch 0 taken 51200 times.
✓ Branch 1 taken 88 times.
|
51288 | for (idx = 0; idx < n; ++idx) { |
879 | 51200 | map[idx] = floor(BARK((vf->rate * idx) / (2.0f * n)) * | |
880 | 51200 | (vf->bark_map_size / BARK(vf->rate / 2.0f))); | |
881 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 51200 times.
|
51200 | if (vf->bark_map_size-1 < map[idx]) |
882 | ✗ | map[idx] = vf->bark_map_size - 1; | |
883 | } | ||
884 | 88 | map[n] = -1; | |
885 | 88 | vf->map_size[blockflag] = n; | |
886 | } | ||
887 | |||
888 |
2/2✓ Branch 0 taken 45100 times.
✓ Branch 1 taken 44 times.
|
45144 | for (idx = 0; idx <= n; ++idx) { |
889 | ff_dlog(NULL, "floor0 map: map at pos %d is %"PRId32"\n", idx, map[idx]); | ||
890 | } | ||
891 | |||
892 | 44 | return 0; | |
893 | } | ||
894 | |||
895 | 66 | static int vorbis_parse_setup_hdr_modes(vorbis_context *vc) | |
896 | { | ||
897 | 66 | GetBitContext *gb = &vc->gb; | |
898 | unsigned i; | ||
899 | |||
900 | 66 | vc->mode_count = get_bits(gb, 6) + 1; | |
901 | 66 | vc->modes = av_mallocz(vc->mode_count * sizeof(*vc->modes)); | |
902 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 66 times.
|
66 | if (!vc->modes) |
903 | ✗ | return AVERROR(ENOMEM); | |
904 | |||
905 | ff_dlog(NULL, " There are %d modes.\n", vc->mode_count); | ||
906 | |||
907 |
2/2✓ Branch 0 taken 132 times.
✓ Branch 1 taken 66 times.
|
198 | for (i = 0; i < vc->mode_count; ++i) { |
908 | 132 | vorbis_mode *mode_setup = &vc->modes[i]; | |
909 | |||
910 | 132 | mode_setup->blockflag = get_bits1(gb); | |
911 | 132 | mode_setup->windowtype = get_bits(gb, 16); //FIXME check | |
912 | 132 | mode_setup->transformtype = get_bits(gb, 16); //FIXME check | |
913 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 132 times.
|
132 | GET_VALIDATED_INDEX(mode_setup->mapping, 8, vc->mapping_count); |
914 | |||
915 | ff_dlog(NULL, " %u mode: blockflag %d, windowtype %d, transformtype %d, mapping %d\n", | ||
916 | i, mode_setup->blockflag, mode_setup->windowtype, | ||
917 | mode_setup->transformtype, mode_setup->mapping); | ||
918 | } | ||
919 | 66 | return 0; | |
920 | } | ||
921 | |||
922 | // Process the whole setup header using the functions above | ||
923 | |||
924 | 66 | static int vorbis_parse_setup_hdr(vorbis_context *vc) | |
925 | { | ||
926 | 66 | GetBitContext *gb = &vc->gb; | |
927 | int ret; | ||
928 | |||
929 |
3/6✓ Branch 1 taken 66 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 66 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 66 times.
✗ Branch 7 not taken.
|
132 | if ((get_bits(gb, 8) != 'v') || (get_bits(gb, 8) != 'o') || |
930 |
2/4✓ Branch 2 taken 66 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 66 times.
✗ Branch 5 not taken.
|
198 | (get_bits(gb, 8) != 'r') || (get_bits(gb, 8) != 'b') || |
931 |
1/2✗ Branch 2 not taken.
✓ Branch 3 taken 66 times.
|
132 | (get_bits(gb, 8) != 'i') || (get_bits(gb, 8) != 's')) { |
932 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, " Vorbis setup header packet corrupt (no vorbis signature). \n"); | |
933 | ✗ | return AVERROR_INVALIDDATA; | |
934 | } | ||
935 | |||
936 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 66 times.
|
66 | if ((ret = vorbis_parse_setup_hdr_codebooks(vc))) { |
937 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, " Vorbis setup header packet corrupt (codebooks). \n"); | |
938 | ✗ | return ret; | |
939 | } | ||
940 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 66 times.
|
66 | if ((ret = vorbis_parse_setup_hdr_tdtransforms(vc))) { |
941 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, " Vorbis setup header packet corrupt (time domain transforms). \n"); | |
942 | ✗ | return ret; | |
943 | } | ||
944 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 66 times.
|
66 | if ((ret = vorbis_parse_setup_hdr_floors(vc))) { |
945 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, " Vorbis setup header packet corrupt (floors). \n"); | |
946 | ✗ | return ret; | |
947 | } | ||
948 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 66 times.
|
66 | if ((ret = vorbis_parse_setup_hdr_residues(vc))) { |
949 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, " Vorbis setup header packet corrupt (residues). \n"); | |
950 | ✗ | return ret; | |
951 | } | ||
952 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 66 times.
|
66 | if ((ret = vorbis_parse_setup_hdr_mappings(vc))) { |
953 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, " Vorbis setup header packet corrupt (mappings). \n"); | |
954 | ✗ | return ret; | |
955 | } | ||
956 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 66 times.
|
66 | if ((ret = vorbis_parse_setup_hdr_modes(vc))) { |
957 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, " Vorbis setup header packet corrupt (modes). \n"); | |
958 | ✗ | return ret; | |
959 | } | ||
960 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 66 times.
|
66 | if (!get_bits1(gb)) { |
961 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, " Vorbis setup header packet corrupt (framing flag). \n"); | |
962 | ✗ | return AVERROR_INVALIDDATA; // framing flag bit unset error | |
963 | } | ||
964 | |||
965 | 66 | return 0; | |
966 | } | ||
967 | |||
968 | // Process the identification header | ||
969 | |||
970 | 66 | static int vorbis_parse_id_hdr(vorbis_context *vc) | |
971 | { | ||
972 | 66 | GetBitContext *gb = &vc->gb; | |
973 | unsigned bl0, bl1; | ||
974 | 66 | float scale = -1.0; | |
975 | int ret; | ||
976 | |||
977 |
3/6✓ Branch 1 taken 66 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 66 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 66 times.
✗ Branch 7 not taken.
|
132 | if ((get_bits(gb, 8) != 'v') || (get_bits(gb, 8) != 'o') || |
978 |
2/4✓ Branch 2 taken 66 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 66 times.
✗ Branch 5 not taken.
|
198 | (get_bits(gb, 8) != 'r') || (get_bits(gb, 8) != 'b') || |
979 |
1/2✗ Branch 2 not taken.
✓ Branch 3 taken 66 times.
|
132 | (get_bits(gb, 8) != 'i') || (get_bits(gb, 8) != 's')) { |
980 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, " Vorbis id header packet corrupt (no vorbis signature). \n"); | |
981 | ✗ | return AVERROR_INVALIDDATA; | |
982 | } | ||
983 | |||
984 | 66 | vc->version = get_bits_long(gb, 32); //FIXME check 0 | |
985 | 66 | vc->audio_channels = get_bits(gb, 8); | |
986 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 66 times.
|
66 | if (vc->audio_channels <= 0) { |
987 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, "Invalid number of channels\n"); | |
988 | ✗ | return AVERROR_INVALIDDATA; | |
989 | } | ||
990 | 66 | vc->audio_samplerate = get_bits_long(gb, 32); | |
991 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 66 times.
|
66 | if (vc->audio_samplerate <= 0) { |
992 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, "Invalid samplerate\n"); | |
993 | ✗ | return AVERROR_INVALIDDATA; | |
994 | } | ||
995 | 66 | vc->bitrate_maximum = get_bits_long(gb, 32); | |
996 | 66 | vc->bitrate_nominal = get_bits_long(gb, 32); | |
997 | 66 | vc->bitrate_minimum = get_bits_long(gb, 32); | |
998 | 66 | bl0 = get_bits(gb, 4); | |
999 | 66 | bl1 = get_bits(gb, 4); | |
1000 |
5/10✓ Branch 0 taken 66 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 66 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 66 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 66 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 66 times.
|
66 | if (bl0 > 13 || bl0 < 6 || bl1 > 13 || bl1 < 6 || bl1 < bl0) { |
1001 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, " Vorbis id header packet corrupt (illegal blocksize). \n"); | |
1002 | ✗ | return AVERROR_INVALIDDATA; | |
1003 | } | ||
1004 | 66 | vc->blocksize[0] = (1 << bl0); | |
1005 | 66 | vc->blocksize[1] = (1 << bl1); | |
1006 | 66 | vc->win[0] = ff_vorbis_vwin[bl0 - 6]; | |
1007 | 66 | vc->win[1] = ff_vorbis_vwin[bl1 - 6]; | |
1008 | |||
1009 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 66 times.
|
66 | if ((get_bits1(gb)) == 0) { |
1010 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, " Vorbis id header packet corrupt (framing flag not set). \n"); | |
1011 | ✗ | return AVERROR_INVALIDDATA; | |
1012 | } | ||
1013 | |||
1014 | 66 | vc->channel_residues = av_malloc_array(vc->blocksize[1] / 2, vc->audio_channels * sizeof(*vc->channel_residues)); | |
1015 | 66 | vc->saved = av_calloc(vc->blocksize[1] / 4, vc->audio_channels * sizeof(*vc->saved)); | |
1016 |
2/4✓ Branch 0 taken 66 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 66 times.
|
66 | if (!vc->channel_residues || !vc->saved) |
1017 | ✗ | return AVERROR(ENOMEM); | |
1018 | |||
1019 | 66 | vc->previous_window = -1; | |
1020 | |||
1021 | 66 | ret = av_tx_init(&vc->mdct[0], &vc->mdct_fn[0], AV_TX_FLOAT_MDCT, 1, | |
1022 | 66 | vc->blocksize[0] >> 1, &scale, 0); | |
1023 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 66 times.
|
66 | if (ret < 0) |
1024 | ✗ | return ret; | |
1025 | |||
1026 | 66 | ret = av_tx_init(&vc->mdct[1], &vc->mdct_fn[1], AV_TX_FLOAT_MDCT, 1, | |
1027 | 66 | vc->blocksize[1] >> 1, &scale, 0); | |
1028 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 66 times.
|
66 | if (ret < 0) |
1029 | ✗ | return ret; | |
1030 | |||
1031 | 66 | vc->fdsp = avpriv_float_dsp_alloc(vc->avctx->flags & AV_CODEC_FLAG_BITEXACT); | |
1032 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 66 times.
|
66 | if (!vc->fdsp) |
1033 | ✗ | return AVERROR(ENOMEM); | |
1034 | |||
1035 | ff_dlog(NULL, " vorbis version %"PRIu32" \n audio_channels %"PRIu8" \n audio_samplerate %"PRIu32" \n bitrate_max %"PRIu32" \n bitrate_nom %"PRIu32" \n bitrate_min %"PRIu32" \n blk_0 %"PRIu32" blk_1 %"PRIu32" \n ", | ||
1036 | vc->version, vc->audio_channels, vc->audio_samplerate, vc->bitrate_maximum, vc->bitrate_nominal, vc->bitrate_minimum, vc->blocksize[0], vc->blocksize[1]); | ||
1037 | |||
1038 | /* | ||
1039 | BLK = vc->blocksize[0]; | ||
1040 | for (i = 0; i < BLK / 2; ++i) { | ||
1041 | vc->win[0][i] = sin(0.5*3.14159265358*(sin(((float)i + 0.5) / (float)BLK*3.14159265358))*(sin(((float)i + 0.5) / (float)BLK*3.14159265358))); | ||
1042 | } | ||
1043 | */ | ||
1044 | |||
1045 | 66 | return 0; | |
1046 | } | ||
1047 | |||
1048 | // Process the extradata using the functions above (identification header, setup header) | ||
1049 | |||
1050 | 66 | static av_cold int vorbis_decode_init(AVCodecContext *avctx) | |
1051 | { | ||
1052 | 66 | vorbis_context *vc = avctx->priv_data; | |
1053 | 66 | uint8_t *headers = avctx->extradata; | |
1054 | 66 | int headers_len = avctx->extradata_size; | |
1055 | const uint8_t *header_start[3]; | ||
1056 | int header_len[3]; | ||
1057 | 66 | GetBitContext *gb = &vc->gb; | |
1058 | int hdr_type, ret; | ||
1059 | |||
1060 | 66 | vc->avctx = avctx; | |
1061 | 66 | ff_vorbisdsp_init(&vc->dsp); | |
1062 | |||
1063 | 66 | avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; | |
1064 | |||
1065 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 66 times.
|
66 | if (!headers_len) { |
1066 | ✗ | av_log(avctx, AV_LOG_ERROR, "Extradata missing.\n"); | |
1067 | ✗ | return AVERROR_INVALIDDATA; | |
1068 | } | ||
1069 | |||
1070 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 66 times.
|
66 | if ((ret = avpriv_split_xiph_headers(headers, headers_len, 30, header_start, header_len)) < 0) { |
1071 | ✗ | av_log(avctx, AV_LOG_ERROR, "Extradata corrupt.\n"); | |
1072 | ✗ | return ret; | |
1073 | } | ||
1074 | |||
1075 | 66 | init_get_bits(gb, header_start[0], header_len[0]*8); | |
1076 | 66 | hdr_type = get_bits(gb, 8); | |
1077 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 66 times.
|
66 | if (hdr_type != 1) { |
1078 | ✗ | av_log(avctx, AV_LOG_ERROR, "First header is not the id header.\n"); | |
1079 | ✗ | return AVERROR_INVALIDDATA; | |
1080 | } | ||
1081 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 66 times.
|
66 | if ((ret = vorbis_parse_id_hdr(vc))) { |
1082 | ✗ | av_log(avctx, AV_LOG_ERROR, "Id header corrupt.\n"); | |
1083 | ✗ | vorbis_free(vc); | |
1084 | ✗ | return ret; | |
1085 | } | ||
1086 | |||
1087 | 66 | init_get_bits(gb, header_start[2], header_len[2]*8); | |
1088 | 66 | hdr_type = get_bits(gb, 8); | |
1089 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 66 times.
|
66 | if (hdr_type != 5) { |
1090 | ✗ | av_log(avctx, AV_LOG_ERROR, "Third header is not the setup header.\n"); | |
1091 | ✗ | vorbis_free(vc); | |
1092 | ✗ | return AVERROR_INVALIDDATA; | |
1093 | } | ||
1094 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 66 times.
|
66 | if ((ret = vorbis_parse_setup_hdr(vc))) { |
1095 | ✗ | av_log(avctx, AV_LOG_ERROR, "Setup header corrupt.\n"); | |
1096 | ✗ | vorbis_free(vc); | |
1097 | ✗ | return ret; | |
1098 | } | ||
1099 | |||
1100 | 66 | av_channel_layout_uninit(&avctx->ch_layout); | |
1101 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 66 times.
|
66 | if (vc->audio_channels > 8) { |
1102 | ✗ | avctx->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC; | |
1103 | ✗ | avctx->ch_layout.nb_channels = vc->audio_channels; | |
1104 | } else { | ||
1105 | 66 | av_channel_layout_copy(&avctx->ch_layout, &ff_vorbis_ch_layouts[vc->audio_channels - 1]); | |
1106 | } | ||
1107 | |||
1108 | 66 | avctx->sample_rate = vc->audio_samplerate; | |
1109 | |||
1110 | 66 | return 0; | |
1111 | } | ||
1112 | |||
1113 | // Decode audiopackets ------------------------------------------------- | ||
1114 | |||
1115 | // Read and decode floor | ||
1116 | |||
1117 | 6375 | static int vorbis_floor0_decode(vorbis_context *vc, | |
1118 | vorbis_floor_data *vfu, float *vec) | ||
1119 | { | ||
1120 | 6375 | vorbis_floor0 *vf = &vfu->t0; | |
1121 | 6375 | float *lsp = vf->lsp; | |
1122 | unsigned book_idx; | ||
1123 | uint64_t amplitude; | ||
1124 | 6375 | unsigned blockflag = vc->modes[vc->mode_number].blockflag; | |
1125 | |||
1126 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 6375 times.
|
6375 | if (!vf->amplitude_bits) |
1127 | ✗ | return 1; | |
1128 | |||
1129 | 6375 | amplitude = get_bits64(&vc->gb, vf->amplitude_bits); | |
1130 |
2/2✓ Branch 0 taken 6251 times.
✓ Branch 1 taken 124 times.
|
6375 | if (amplitude > 0) { |
1131 | 6251 | float last = 0; | |
1132 | 6251 | unsigned idx, lsp_len = 0; | |
1133 | vorbis_codebook codebook; | ||
1134 | |||
1135 | 6251 | book_idx = get_bits(&vc->gb, ilog(vf->num_books)); | |
1136 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 6251 times.
|
6251 | if (book_idx >= vf->num_books) { |
1137 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, "floor0 dec: booknumber too high!\n"); | |
1138 | ✗ | book_idx = 0; | |
1139 | } | ||
1140 | ff_dlog(NULL, "floor0 dec: booknumber: %u\n", book_idx); | ||
1141 | 6251 | codebook = vc->codebooks[vf->book_list[book_idx]]; | |
1142 | /* Invalid codebook! */ | ||
1143 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 6251 times.
|
6251 | if (!codebook.codevectors) |
1144 | ✗ | return AVERROR_INVALIDDATA; | |
1145 | |||
1146 |
2/2✓ Branch 0 taken 50348 times.
✓ Branch 1 taken 6251 times.
|
56599 | while (lsp_len<vf->order) { |
1147 | int vec_off; | ||
1148 | |||
1149 | ff_dlog(NULL, "floor0 dec: book dimension: %d\n", codebook.dimensions); | ||
1150 | ff_dlog(NULL, "floor0 dec: maximum depth: %d\n", codebook.maxdepth); | ||
1151 | /* read temp vector */ | ||
1152 | 50348 | vec_off = get_vlc2(&vc->gb, codebook.vlc.table, | |
1153 | 50348 | codebook.nb_bits, codebook.maxdepth); | |
1154 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 50348 times.
|
50348 | if (vec_off < 0) |
1155 | ✗ | return AVERROR_INVALIDDATA; | |
1156 | 50348 | vec_off *= codebook.dimensions; | |
1157 | ff_dlog(NULL, "floor0 dec: vector offset: %d\n", vec_off); | ||
1158 | /* copy each vector component and add last to it */ | ||
1159 |
2/2✓ Branch 0 taken 145572 times.
✓ Branch 1 taken 50348 times.
|
195920 | for (idx = 0; idx < codebook.dimensions; ++idx) |
1160 | 145572 | lsp[lsp_len+idx] = codebook.codevectors[vec_off+idx] + last; | |
1161 | 50348 | last = lsp[lsp_len+idx-1]; /* set last to last vector component */ | |
1162 | |||
1163 | 50348 | lsp_len += codebook.dimensions; | |
1164 | } | ||
1165 | /* DEBUG: output lsp coeffs */ | ||
1166 | { | ||
1167 | int idx; | ||
1168 |
2/2✓ Branch 0 taken 145572 times.
✓ Branch 1 taken 6251 times.
|
151823 | for (idx = 0; idx < lsp_len; ++idx) |
1169 | ff_dlog(NULL, "floor0 dec: coeff at %d is %f\n", idx, lsp[idx]); | ||
1170 | } | ||
1171 | |||
1172 | /* synthesize floor output vector */ | ||
1173 | { | ||
1174 | int i; | ||
1175 | 6251 | int order = vf->order; | |
1176 | 6251 | float wstep = M_PI / vf->bark_map_size; | |
1177 | |||
1178 |
2/2✓ Branch 0 taken 145572 times.
✓ Branch 1 taken 6251 times.
|
151823 | for (i = 0; i < order; i++) |
1179 | 145572 | lsp[i] = 2.0f * cos(lsp[i]); | |
1180 | |||
1181 | ff_dlog(NULL, "floor0 synth: map_size = %"PRIu32"; m = %d; wstep = %f\n", | ||
1182 | vf->map_size[blockflag], order, wstep); | ||
1183 | |||
1184 | 6251 | i = 0; | |
1185 |
2/2✓ Branch 0 taken 939090 times.
✓ Branch 1 taken 6251 times.
|
945341 | while (i < vf->map_size[blockflag]) { |
1186 | 939090 | int j, iter_cond = vf->map[blockflag][i]; | |
1187 | 939090 | float p = 0.5f; | |
1188 | 939090 | float q = 0.5f; | |
1189 | 939090 | float two_cos_w = 2.0f * cos(wstep * iter_cond); // needed all times | |
1190 | |||
1191 | /* similar part for the q and p products */ | ||
1192 |
2/2✓ Branch 0 taken 13168596 times.
✓ Branch 1 taken 939090 times.
|
14107686 | for (j = 0; j + 1 < order; j += 2) { |
1193 | 13168596 | q *= lsp[j] - two_cos_w; | |
1194 | 13168596 | p *= lsp[j + 1] - two_cos_w; | |
1195 | } | ||
1196 |
2/2✓ Branch 0 taken 925416 times.
✓ Branch 1 taken 13674 times.
|
939090 | if (j == order) { // even order |
1197 | 925416 | p *= p * (2.0f - two_cos_w); | |
1198 | 925416 | q *= q * (2.0f + two_cos_w); | |
1199 | } else { // odd order | ||
1200 | 13674 | q *= two_cos_w-lsp[j]; // one more time for q | |
1201 | |||
1202 | /* final step and square */ | ||
1203 | 13674 | p *= p * (4.f - two_cos_w * two_cos_w); | |
1204 | 13674 | q *= q; | |
1205 | } | ||
1206 | |||
1207 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 939090 times.
|
939090 | if (p + q == 0.0) |
1208 | ✗ | return AVERROR_INVALIDDATA; | |
1209 | |||
1210 | /* calculate linear floor value */ | ||
1211 | 939090 | q = exp((((amplitude*vf->amplitude_offset) / | |
1212 | 939090 | (((1ULL << vf->amplitude_bits) - 1) * sqrt(p + q))) | |
1213 | 939090 | - vf->amplitude_offset) * .11512925f); | |
1214 | |||
1215 | /* fill vector */ | ||
1216 | do { | ||
1217 | 4384000 | vec[i] = q; ++i; | |
1218 |
2/2✓ Branch 0 taken 3444910 times.
✓ Branch 1 taken 939090 times.
|
4384000 | } while (vf->map[blockflag][i] == iter_cond); |
1219 | } | ||
1220 | } | ||
1221 | } else { | ||
1222 | /* this channel is unused */ | ||
1223 | 124 | return 1; | |
1224 | } | ||
1225 | |||
1226 | ff_dlog(NULL, " Floor0 decoded\n"); | ||
1227 | |||
1228 | 6251 | return 0; | |
1229 | } | ||
1230 | |||
1231 | 11463 | static int vorbis_floor1_decode(vorbis_context *vc, | |
1232 | vorbis_floor_data *vfu, float *vec) | ||
1233 | { | ||
1234 | 11463 | vorbis_floor1 *vf = &vfu->t1; | |
1235 | 11463 | GetBitContext *gb = &vc->gb; | |
1236 | 11463 | uint16_t range_v[4] = { 256, 128, 86, 64 }; | |
1237 | 11463 | unsigned range = range_v[vf->multiplier - 1]; | |
1238 | uint16_t floor1_Y[258]; | ||
1239 | uint16_t floor1_Y_final[258]; | ||
1240 | int floor1_flag[258]; | ||
1241 | unsigned partition_class, cdim, cbits, csub, cval, offset, i, j; | ||
1242 | int book, adx, ady, dy, off, predicted, err; | ||
1243 | |||
1244 | |||
1245 |
2/2✓ Branch 1 taken 2001 times.
✓ Branch 2 taken 9462 times.
|
11463 | if (!get_bits1(gb)) // silence |
1246 | 2001 | return 1; | |
1247 | |||
1248 | // Read values (or differences) for the floor's points | ||
1249 | |||
1250 | 9462 | floor1_Y[0] = get_bits(gb, ilog(range - 1)); | |
1251 | 9462 | floor1_Y[1] = get_bits(gb, ilog(range - 1)); | |
1252 | |||
1253 | ff_dlog(NULL, "floor 0 Y %d floor 1 Y %d \n", floor1_Y[0], floor1_Y[1]); | ||
1254 | |||
1255 | 9462 | offset = 2; | |
1256 |
2/2✓ Branch 0 taken 68787 times.
✓ Branch 1 taken 9462 times.
|
78249 | for (i = 0; i < vf->partitions; ++i) { |
1257 | 68787 | partition_class = vf->partition_class[i]; | |
1258 | 68787 | cdim = vf->class_dimensions[partition_class]; | |
1259 | 68787 | cbits = vf->class_subclasses[partition_class]; | |
1260 | 68787 | csub = (1 << cbits) - 1; | |
1261 | 68787 | cval = 0; | |
1262 | |||
1263 | ff_dlog(NULL, "Cbits %u\n", cbits); | ||
1264 | |||
1265 |
2/2✓ Branch 0 taken 62865 times.
✓ Branch 1 taken 5922 times.
|
68787 | if (cbits) // this reads all subclasses for this partition's class |
1266 | 62865 | cval = get_vlc2(gb, vc->codebooks[vf->class_masterbook[partition_class]].vlc.table, | |
1267 | 62865 | vc->codebooks[vf->class_masterbook[partition_class]].nb_bits, 3); | |
1268 | |||
1269 |
2/2✓ Branch 0 taken 216430 times.
✓ Branch 1 taken 68787 times.
|
285217 | for (j = 0; j < cdim; ++j) { |
1270 | 216430 | book = vf->subclass_books[partition_class][cval & csub]; | |
1271 | |||
1272 | ff_dlog(NULL, "book %d Cbits %u cval %u bits:%d\n", | ||
1273 | book, cbits, cval, get_bits_count(gb)); | ||
1274 | |||
1275 | 216430 | cval = cval >> cbits; | |
1276 |
2/2✓ Branch 0 taken 113935 times.
✓ Branch 1 taken 102495 times.
|
216430 | if (book > -1) { |
1277 | 113935 | int v = get_vlc2(gb, vc->codebooks[book].vlc.table, | |
1278 | 113935 | vc->codebooks[book].nb_bits, 3); | |
1279 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 113935 times.
|
113935 | if (v < 0) |
1280 | ✗ | return AVERROR_INVALIDDATA; | |
1281 | 113935 | floor1_Y[offset+j] = v; | |
1282 | } else { | ||
1283 | 102495 | floor1_Y[offset+j] = 0; | |
1284 | } | ||
1285 | |||
1286 | ff_dlog(NULL, " floor(%d) = %d \n", | ||
1287 | vf->list[offset+j].x, floor1_Y[offset+j]); | ||
1288 | } | ||
1289 | 68787 | offset+=cdim; | |
1290 | } | ||
1291 | |||
1292 | // Amplitude calculation from the differences | ||
1293 | |||
1294 | 9462 | floor1_flag[0] = 1; | |
1295 | 9462 | floor1_flag[1] = 1; | |
1296 | 9462 | floor1_Y_final[0] = floor1_Y[0]; | |
1297 | 9462 | floor1_Y_final[1] = floor1_Y[1]; | |
1298 | |||
1299 |
2/2✓ Branch 0 taken 216430 times.
✓ Branch 1 taken 9462 times.
|
225892 | for (i = 2; i < vf->x_list_dim; ++i) { |
1300 | unsigned val, highroom, lowroom, room, high_neigh_offs, low_neigh_offs; | ||
1301 | |||
1302 | 216430 | low_neigh_offs = vf->list[i].low; | |
1303 | 216430 | high_neigh_offs = vf->list[i].high; | |
1304 | 216430 | dy = floor1_Y_final[high_neigh_offs] - floor1_Y_final[low_neigh_offs]; // render_point begin | |
1305 | 216430 | adx = vf->list[high_neigh_offs].x - vf->list[low_neigh_offs].x; | |
1306 | 216430 | ady = FFABS(dy); | |
1307 | 216430 | err = ady * (vf->list[i].x - vf->list[low_neigh_offs].x); | |
1308 | 216430 | off = err / adx; | |
1309 |
2/2✓ Branch 0 taken 119510 times.
✓ Branch 1 taken 96920 times.
|
216430 | if (dy < 0) { |
1310 | 119510 | predicted = floor1_Y_final[low_neigh_offs] - off; | |
1311 | } else { | ||
1312 | 96920 | predicted = floor1_Y_final[low_neigh_offs] + off; | |
1313 | } // render_point end | ||
1314 | |||
1315 | 216430 | val = floor1_Y[i]; | |
1316 | 216430 | highroom = range-predicted; | |
1317 | 216430 | lowroom = predicted; | |
1318 |
2/2✓ Branch 0 taken 87980 times.
✓ Branch 1 taken 128450 times.
|
216430 | if (highroom < lowroom) { |
1319 | 87980 | room = highroom * 2; | |
1320 | } else { | ||
1321 | 128450 | room = lowroom * 2; // SPEC misspelling | |
1322 | } | ||
1323 |
2/2✓ Branch 0 taken 98022 times.
✓ Branch 1 taken 118408 times.
|
216430 | if (val) { |
1324 | 98022 | floor1_flag[low_neigh_offs] = 1; | |
1325 | 98022 | floor1_flag[high_neigh_offs] = 1; | |
1326 | 98022 | floor1_flag[i] = 1; | |
1327 |
2/2✓ Branch 0 taken 108 times.
✓ Branch 1 taken 97914 times.
|
98022 | if (val >= room) { |
1328 |
2/2✓ Branch 0 taken 80 times.
✓ Branch 1 taken 28 times.
|
108 | if (highroom > lowroom) { |
1329 | 80 | floor1_Y_final[i] = av_clip_uint16(val - lowroom + predicted); | |
1330 | } else { | ||
1331 | 28 | floor1_Y_final[i] = av_clip_uint16(predicted - val + highroom - 1); | |
1332 | } | ||
1333 | } else { | ||
1334 |
2/2✓ Branch 0 taken 63543 times.
✓ Branch 1 taken 34371 times.
|
97914 | if (val & 1) { |
1335 | 63543 | floor1_Y_final[i] = av_clip_uint16(predicted - (val + 1) / 2); | |
1336 | } else { | ||
1337 | 34371 | floor1_Y_final[i] = av_clip_uint16(predicted + val / 2); | |
1338 | } | ||
1339 | } | ||
1340 | } else { | ||
1341 | 118408 | floor1_flag[i] = 0; | |
1342 | 118408 | floor1_Y_final[i] = av_clip_uint16(predicted); | |
1343 | } | ||
1344 | |||
1345 | ff_dlog(NULL, " Decoded floor(%d) = %u / val %u\n", | ||
1346 | vf->list[i].x, floor1_Y_final[i], val); | ||
1347 | } | ||
1348 | |||
1349 | // Curve synth - connect the calculated dots and convert from dB scale FIXME optimize ? | ||
1350 | |||
1351 | 9462 | ff_vorbis_floor1_render_list(vf->list, vf->x_list_dim, floor1_Y_final, floor1_flag, vf->multiplier, vec, vf->list[1].x); | |
1352 | |||
1353 | ff_dlog(NULL, " Floor decoded\n"); | ||
1354 | |||
1355 | 9462 | return 0; | |
1356 | } | ||
1357 | |||
1358 | 134567 | static av_always_inline int setup_classifs(vorbis_context *vc, | |
1359 | vorbis_residue *vr, | ||
1360 | uint8_t *do_not_decode, | ||
1361 | unsigned ch_used, | ||
1362 | int partition_count, | ||
1363 | int ptns_to_read | ||
1364 | ) | ||
1365 | { | ||
1366 | 134567 | vorbis_codebook *codebook = vc->codebooks + vr->classbook; | |
1367 | int p, j, i; | ||
1368 | 134567 | unsigned c_p_c = codebook->dimensions; | |
1369 | 134567 | unsigned inverse_class = ff_inverse[vr->classifications]; | |
1370 | int temp, temp2; | ||
1371 |
2/2✓ Branch 0 taken 163820 times.
✓ Branch 1 taken 134567 times.
|
298387 | for (p = 0, j = 0; j < ch_used; ++j) { |
1372 |
2/2✓ Branch 0 taken 162499 times.
✓ Branch 1 taken 1321 times.
|
163820 | if (!do_not_decode[j]) { |
1373 | 162499 | temp = get_vlc2(&vc->gb, codebook->vlc.table, | |
1374 | 162499 | codebook->nb_bits, 3); | |
1375 | |||
1376 | ff_dlog(NULL, "Classword: %u\n", temp); | ||
1377 | |||
1378 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 162499 times.
|
162499 | av_assert0(temp < 65536); |
1379 | |||
1380 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 162499 times.
|
162499 | if (temp < 0) { |
1381 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, | |
1382 | "Invalid vlc code decoding %d channel.", j); | ||
1383 | ✗ | return AVERROR_INVALIDDATA; | |
1384 | } | ||
1385 | |||
1386 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 162499 times.
|
162499 | if (vr->classifications == 1) { |
1387 | ✗ | for (i = partition_count + c_p_c - 1; i >= partition_count; i--) { | |
1388 | ✗ | if (i < ptns_to_read) | |
1389 | ✗ | vr->classifs[p + i] = 0; | |
1390 | } | ||
1391 | } else { | ||
1392 |
2/2✓ Branch 0 taken 344115 times.
✓ Branch 1 taken 162499 times.
|
506614 | for (i = partition_count + c_p_c - 1; i >= partition_count; i--) { |
1393 | 344115 | temp2 = (((uint64_t)temp) * inverse_class) >> 32; | |
1394 | |||
1395 |
2/2✓ Branch 0 taken 343899 times.
✓ Branch 1 taken 216 times.
|
344115 | if (i < ptns_to_read) |
1396 | 343899 | vr->classifs[p + i] = temp - temp2 * vr->classifications; | |
1397 | 344115 | temp = temp2; | |
1398 | } | ||
1399 | } | ||
1400 | } | ||
1401 | 163820 | p += ptns_to_read; | |
1402 | } | ||
1403 | 134567 | return 0; | |
1404 | } | ||
1405 | // Read and decode residue | ||
1406 | |||
1407 | 9495 | static av_always_inline int vorbis_residue_decode_internal(vorbis_context *vc, | |
1408 | vorbis_residue *vr, | ||
1409 | unsigned ch, | ||
1410 | uint8_t *do_not_decode, | ||
1411 | float *vec, | ||
1412 | unsigned vlen, | ||
1413 | unsigned ch_left, | ||
1414 | int vr_type) | ||
1415 | { | ||
1416 | 9495 | GetBitContext *gb = &vc->gb; | |
1417 | 9495 | unsigned c_p_c = vc->codebooks[vr->classbook].dimensions; | |
1418 | 9495 | uint8_t *classifs = vr->classifs; | |
1419 | unsigned pass, ch_used, i, j, k, l; | ||
1420 | 9495 | unsigned max_output = (ch - 1) * vlen; | |
1421 | 9495 | int ptns_to_read = vr->ptns_to_read; | |
1422 | 9495 | int libvorbis_bug = 0; | |
1423 | |||
1424 |
2/2✓ Branch 0 taken 4275 times.
✓ Branch 1 taken 5220 times.
|
9495 | if (vr_type == 2) { |
1425 |
2/2✓ Branch 0 taken 5388 times.
✓ Branch 1 taken 4275 times.
|
9663 | for (j = 1; j < ch; ++j) |
1426 | 5388 | do_not_decode[0] &= do_not_decode[j]; // FIXME - clobbering input | |
1427 |
2/2✓ Branch 0 taken 120 times.
✓ Branch 1 taken 4155 times.
|
4275 | if (do_not_decode[0]) |
1428 | 120 | return 0; | |
1429 | 4155 | ch_used = 1; | |
1430 | 4155 | max_output += vr->end / ch; | |
1431 | } else { | ||
1432 | 5220 | ch_used = ch; | |
1433 | 5220 | max_output += vr->end; | |
1434 | } | ||
1435 | |||
1436 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 9375 times.
|
9375 | if (max_output > ch_left * vlen) { |
1437 | ✗ | if (max_output <= ch_left * vlen + vr->partition_size*ch_used/ch) { | |
1438 | ✗ | ptns_to_read--; | |
1439 | ✗ | libvorbis_bug = 1; | |
1440 | } else { | ||
1441 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, "Insufficient output buffer\n"); | |
1442 | ✗ | return AVERROR_INVALIDDATA; | |
1443 | } | ||
1444 | } | ||
1445 | |||
1446 | ff_dlog(NULL, " residue type 0/1/2 decode begin, ch: %d cpc %d \n", ch, c_p_c); | ||
1447 | |||
1448 |
2/2✓ Branch 0 taken 21604 times.
✓ Branch 1 taken 9375 times.
|
30979 | for (pass = 0; pass <= vr->maxpass; ++pass) { // FIXME OPTIMIZE? |
1449 | int voffset, partition_count, j_times_ptns_to_read; | ||
1450 | |||
1451 | 21604 | voffset = vr->begin; | |
1452 |
2/2✓ Branch 0 taken 349690 times.
✓ Branch 1 taken 21604 times.
|
371294 | for (partition_count = 0; partition_count < ptns_to_read;) { // SPEC error |
1453 |
2/2✓ Branch 0 taken 134567 times.
✓ Branch 1 taken 215123 times.
|
349690 | if (!pass) { |
1454 | 134567 | int ret = setup_classifs(vc, vr, do_not_decode, ch_used, partition_count, ptns_to_read); | |
1455 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 134567 times.
|
134567 | if (ret < 0) |
1456 | ✗ | return ret; | |
1457 | } | ||
1458 |
4/4✓ Branch 0 taken 735605 times.
✓ Branch 1 taken 349042 times.
✓ Branch 2 taken 734957 times.
✓ Branch 3 taken 648 times.
|
1084647 | for (i = 0; (i < c_p_c) && (partition_count < ptns_to_read); ++i) { |
1459 |
2/2✓ Branch 0 taken 797495 times.
✓ Branch 1 taken 734957 times.
|
1532452 | for (j_times_ptns_to_read = 0, j = 0; j < ch_used; ++j) { |
1460 | unsigned voffs; | ||
1461 | |||
1462 |
2/2✓ Branch 0 taken 793479 times.
✓ Branch 1 taken 4016 times.
|
797495 | if (!do_not_decode[j]) { |
1463 | 793479 | unsigned vqclass = classifs[j_times_ptns_to_read + partition_count]; | |
1464 | 793479 | int vqbook = vr->books[vqclass][pass]; | |
1465 | |||
1466 |
3/4✓ Branch 0 taken 321723 times.
✓ Branch 1 taken 471756 times.
✓ Branch 2 taken 321723 times.
✗ Branch 3 not taken.
|
793479 | if (vqbook >= 0 && vc->codebooks[vqbook].codevectors) { |
1467 | int coffs; | ||
1468 | 321723 | unsigned dim = vc->codebooks[vqbook].dimensions; | |
1469 | 321723 | unsigned step = FASTDIV(vr->partition_size << 1, dim << 1); | |
1470 | 321723 | vorbis_codebook codebook = vc->codebooks[vqbook]; | |
1471 | |||
1472 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 321723 times.
|
321723 | if (get_bits_left(gb) <= 0) |
1473 | ✗ | return AVERROR_INVALIDDATA; | |
1474 | |||
1475 |
2/2✓ Branch 0 taken 115082 times.
✓ Branch 1 taken 206641 times.
|
321723 | if (vr_type == 0) { |
1476 | |||
1477 | 115082 | voffs = voffset+j*vlen; | |
1478 |
2/2✓ Branch 0 taken 1242824 times.
✓ Branch 1 taken 115082 times.
|
1357906 | for (k = 0; k < step; ++k) { |
1479 | 1242824 | coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3); | |
1480 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1242824 times.
|
1242824 | if (coffs < 0) |
1481 | ✗ | return coffs; | |
1482 | 1242824 | coffs *= dim; | |
1483 |
2/2✓ Branch 0 taken 3535904 times.
✓ Branch 1 taken 1242824 times.
|
4778728 | for (l = 0; l < dim; ++l) |
1484 | 3535904 | vec[voffs + k + l * step] += codebook.codevectors[coffs + l]; | |
1485 | } | ||
1486 |
2/2✓ Branch 0 taken 27682 times.
✓ Branch 1 taken 178959 times.
|
206641 | } else if (vr_type == 1) { |
1487 | 27682 | voffs = voffset + j * vlen; | |
1488 |
2/2✓ Branch 0 taken 286230 times.
✓ Branch 1 taken 27682 times.
|
313912 | for (k = 0; k < step; ++k) { |
1489 | 286230 | coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3); | |
1490 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 286230 times.
|
286230 | if (coffs < 0) |
1491 | ✗ | return coffs; | |
1492 | 286230 | coffs *= dim; | |
1493 |
2/2✓ Branch 0 taken 788868 times.
✓ Branch 1 taken 286230 times.
|
1075098 | for (l = 0; l < dim; ++l, ++voffs) { |
1494 | 788868 | vec[voffs]+=codebook.codevectors[coffs+l]; | |
1495 | |||
1496 | ff_dlog(NULL, " pass %d offs: %d curr: %f change: %f cv offs.: %d \n", | ||
1497 | pass, voffs, vec[voffs], codebook.codevectors[coffs+l], coffs); | ||
1498 | } | ||
1499 | } | ||
1500 |
5/8✓ Branch 0 taken 178959 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 151234 times.
✓ Branch 3 taken 27725 times.
✓ Branch 4 taken 151234 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 151234 times.
✗ Branch 7 not taken.
|
178959 | } else if (vr_type == 2 && ch == 2 && (voffset & 1) == 0 && (dim & 1) == 0) { // most frequent case optimized |
1501 | 151234 | voffs = voffset >> 1; | |
1502 | |||
1503 |
2/2✓ Branch 0 taken 64528 times.
✓ Branch 1 taken 86706 times.
|
151234 | if (dim == 2) { |
1504 |
2/2✓ Branch 0 taken 1004556 times.
✓ Branch 1 taken 64528 times.
|
1069084 | for (k = 0; k < step; ++k) { |
1505 | 1004556 | coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3); | |
1506 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1004556 times.
|
1004556 | if (coffs < 0) |
1507 | ✗ | return coffs; | |
1508 | 1004556 | coffs *= 2; | |
1509 | 1004556 | vec[voffs + k ] += codebook.codevectors[coffs ]; | |
1510 | 1004556 | vec[voffs + k + vlen] += codebook.codevectors[coffs + 1]; | |
1511 | } | ||
1512 |
2/2✓ Branch 0 taken 63074 times.
✓ Branch 1 taken 23632 times.
|
86706 | } else if (dim == 4) { |
1513 |
2/2✓ Branch 0 taken 447102 times.
✓ Branch 1 taken 63074 times.
|
510176 | for (k = 0; k < step; ++k, voffs += 2) { |
1514 | 447102 | coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3); | |
1515 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 447102 times.
|
447102 | if (coffs < 0) |
1516 | ✗ | return coffs; | |
1517 | 447102 | coffs *= 4; | |
1518 | 447102 | vec[voffs ] += codebook.codevectors[coffs ]; | |
1519 | 447102 | vec[voffs + 1 ] += codebook.codevectors[coffs + 2]; | |
1520 | 447102 | vec[voffs + vlen ] += codebook.codevectors[coffs + 1]; | |
1521 | 447102 | vec[voffs + vlen + 1] += codebook.codevectors[coffs + 3]; | |
1522 | } | ||
1523 | } else | ||
1524 |
2/2✓ Branch 0 taken 94166 times.
✓ Branch 1 taken 23632 times.
|
117798 | for (k = 0; k < step; ++k) { |
1525 | 94166 | coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3); | |
1526 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 94166 times.
|
94166 | if (coffs < 0) |
1527 | ✗ | return coffs; | |
1528 | 94166 | coffs *= dim; | |
1529 |
2/2✓ Branch 0 taken 376664 times.
✓ Branch 1 taken 94166 times.
|
470830 | for (l = 0; l < dim; l += 2, voffs++) { |
1530 | 376664 | vec[voffs ] += codebook.codevectors[coffs + l ]; | |
1531 | 376664 | vec[voffs + vlen] += codebook.codevectors[coffs + l + 1]; | |
1532 | |||
1533 | ff_dlog(NULL, " pass %d offs: %d curr: %f change: %f cv offs.: %d+%d \n", | ||
1534 | pass, voffset / ch + (voffs % ch) * vlen, | ||
1535 | vec[voffset / ch + (voffs % ch) * vlen], | ||
1536 | codebook.codevectors[coffs + l], coffs, l); | ||
1537 | } | ||
1538 | } | ||
1539 | |||
1540 |
1/2✓ Branch 0 taken 27725 times.
✗ Branch 1 not taken.
|
27725 | } else if (vr_type == 2) { |
1541 |
1/2✓ Branch 0 taken 27725 times.
✗ Branch 1 not taken.
|
27725 | unsigned voffs_div = ch == 1 ? voffset : FASTDIV(voffset, ch); |
1542 | 27725 | unsigned voffs_mod = voffset - voffs_div * ch; | |
1543 | |||
1544 |
2/2✓ Branch 0 taken 164109 times.
✓ Branch 1 taken 27725 times.
|
191834 | for (k = 0; k < step; ++k) { |
1545 | 164109 | coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3); | |
1546 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 164109 times.
|
164109 | if (coffs < 0) |
1547 | ✗ | return coffs; | |
1548 | 164109 | coffs *= dim; | |
1549 |
2/2✓ Branch 0 taken 748485 times.
✓ Branch 1 taken 164109 times.
|
912594 | for (l = 0; l < dim; ++l) { |
1550 | 748485 | vec[voffs_div + voffs_mod * vlen] += | |
1551 | 748485 | codebook.codevectors[coffs + l]; | |
1552 | |||
1553 | ff_dlog(NULL, " pass %d offs: %d curr: %f change: %f cv offs.: %d+%d \n", | ||
1554 | pass, voffs_div + voffs_mod * vlen, | ||
1555 | vec[voffs_div + voffs_mod * vlen], | ||
1556 | codebook.codevectors[coffs + l], coffs, l); | ||
1557 | |||
1558 |
2/2✓ Branch 0 taken 149697 times.
✓ Branch 1 taken 598788 times.
|
748485 | if (++voffs_mod == ch) { |
1559 | 149697 | voffs_div++; | |
1560 | 149697 | voffs_mod = 0; | |
1561 | } | ||
1562 | } | ||
1563 | } | ||
1564 | } | ||
1565 | } | ||
1566 | } | ||
1567 | 797495 | j_times_ptns_to_read += ptns_to_read; | |
1568 | } | ||
1569 | 734957 | ++partition_count; | |
1570 | 734957 | voffset += vr->partition_size; | |
1571 | } | ||
1572 | } | ||
1573 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 21604 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
21604 | if (libvorbis_bug && !pass) { |
1574 | ✗ | for (j = 0; j < ch_used; ++j) { | |
1575 | ✗ | if (!do_not_decode[j]) { | |
1576 | ✗ | get_vlc2(&vc->gb, vc->codebooks[vr->classbook].vlc.table, | |
1577 | ✗ | vc->codebooks[vr->classbook].nb_bits, 3); | |
1578 | } | ||
1579 | } | ||
1580 | } | ||
1581 | } | ||
1582 | 9375 | return 0; | |
1583 | } | ||
1584 | |||
1585 | 9495 | static inline int vorbis_residue_decode(vorbis_context *vc, vorbis_residue *vr, | |
1586 | unsigned ch, | ||
1587 | uint8_t *do_not_decode, | ||
1588 | float *vec, unsigned vlen, | ||
1589 | unsigned ch_left) | ||
1590 | { | ||
1591 |
2/2✓ Branch 0 taken 4275 times.
✓ Branch 1 taken 5220 times.
|
9495 | if (vr->type == 2) |
1592 | 4275 | return vorbis_residue_decode_internal(vc, vr, ch, do_not_decode, vec, vlen, ch_left, 2); | |
1593 |
2/2✓ Branch 0 taken 1800 times.
✓ Branch 1 taken 3420 times.
|
5220 | else if (vr->type == 1) |
1594 | 1800 | return vorbis_residue_decode_internal(vc, vr, ch, do_not_decode, vec, vlen, ch_left, 1); | |
1595 |
1/2✓ Branch 0 taken 3420 times.
✗ Branch 1 not taken.
|
3420 | else if (vr->type == 0) |
1596 | 3420 | return vorbis_residue_decode_internal(vc, vr, ch, do_not_decode, vec, vlen, ch_left, 0); | |
1597 | else { | ||
1598 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, " Invalid residue type while residue decode?! \n"); | |
1599 | ✗ | return AVERROR_INVALIDDATA; | |
1600 | } | ||
1601 | } | ||
1602 | |||
1603 | // Decode the audio packet using the functions above | ||
1604 | |||
1605 | 9124 | static int vorbis_parse_audio_packet(vorbis_context *vc, float **floor_ptr) | |
1606 | { | ||
1607 | 9124 | GetBitContext *gb = &vc->gb; | |
1608 | AVTXContext *mdct; | ||
1609 | av_tx_fn mdct_fn; | ||
1610 | 9124 | int previous_window = vc->previous_window; | |
1611 | unsigned mode_number, blockflag, blocksize; | ||
1612 | int i, j; | ||
1613 | uint8_t no_residue[255]; | ||
1614 | uint8_t do_not_decode[255]; | ||
1615 | vorbis_mapping *mapping; | ||
1616 | 9124 | float *ch_res_ptr = vc->channel_residues; | |
1617 | uint8_t res_chan[255]; | ||
1618 | 9124 | unsigned res_num = 0; | |
1619 | 9124 | int retlen = 0; | |
1620 | 9124 | unsigned ch_left = vc->audio_channels; | |
1621 | unsigned vlen; | ||
1622 | |||
1623 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 9124 times.
|
9124 | if (get_bits1(gb)) { |
1624 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, "Not a Vorbis I audio packet.\n"); | |
1625 | ✗ | return AVERROR_INVALIDDATA; // packet type not audio | |
1626 | } | ||
1627 | |||
1628 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 9124 times.
|
9124 | if (vc->mode_count == 1) { |
1629 | ✗ | mode_number = 0; | |
1630 | } else { | ||
1631 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 9124 times.
|
9124 | GET_VALIDATED_INDEX(mode_number, ilog(vc->mode_count-1), vc->mode_count) |
1632 | } | ||
1633 | 9124 | vc->mode_number = mode_number; | |
1634 | 9124 | mapping = &vc->mappings[vc->modes[mode_number].mapping]; | |
1635 | |||
1636 | ff_dlog(NULL, " Mode number: %u , mapping: %d , blocktype %d\n", mode_number, | ||
1637 | vc->modes[mode_number].mapping, vc->modes[mode_number].blockflag); | ||
1638 | |||
1639 | 9124 | blockflag = vc->modes[mode_number].blockflag; | |
1640 | 9124 | blocksize = vc->blocksize[blockflag]; | |
1641 | 9124 | vlen = blocksize / 2; | |
1642 |
2/2✓ Branch 0 taken 5975 times.
✓ Branch 1 taken 3149 times.
|
9124 | if (blockflag) { |
1643 | 5975 | int code = get_bits(gb, 2); | |
1644 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 5972 times.
|
5975 | if (previous_window < 0) |
1645 | 3 | previous_window = code>>1; | |
1646 |
2/2✓ Branch 0 taken 53 times.
✓ Branch 1 taken 3096 times.
|
3149 | } else if (previous_window < 0) |
1647 | 53 | previous_window = 0; | |
1648 | |||
1649 | 9124 | memset(ch_res_ptr, 0, sizeof(float) * vc->audio_channels * vlen); //FIXME can this be removed ? | |
1650 |
2/2✓ Branch 0 taken 17838 times.
✓ Branch 1 taken 9124 times.
|
26962 | for (i = 0; i < vc->audio_channels; ++i) |
1651 | 17838 | memset(floor_ptr[i], 0, vlen * sizeof(floor_ptr[0][0])); //FIXME can this be removed ? | |
1652 | |||
1653 | // Decode floor | ||
1654 | |||
1655 |
2/2✓ Branch 0 taken 17838 times.
✓ Branch 1 taken 9124 times.
|
26962 | for (i = 0; i < vc->audio_channels; ++i) { |
1656 | vorbis_floor *floor; | ||
1657 | int ret; | ||
1658 |
2/2✓ Branch 0 taken 2226 times.
✓ Branch 1 taken 15612 times.
|
17838 | if (mapping->submaps > 1) { |
1659 | 2226 | floor = &vc->floors[mapping->submap_floor[mapping->mux[i]]]; | |
1660 | } else { | ||
1661 | 15612 | floor = &vc->floors[mapping->submap_floor[0]]; | |
1662 | } | ||
1663 | |||
1664 | 17838 | ret = floor->decode(vc, &floor->data, floor_ptr[i]); | |
1665 | |||
1666 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 17838 times.
|
17838 | if (ret < 0) { |
1667 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, "Invalid codebook in vorbis_floor_decode.\n"); | |
1668 | ✗ | return AVERROR_INVALIDDATA; | |
1669 | } | ||
1670 | 17838 | no_residue[i] = ret; | |
1671 | } | ||
1672 | |||
1673 | // Nonzero vector propagate | ||
1674 | |||
1675 |
2/2✓ Branch 0 taken 5388 times.
✓ Branch 1 taken 9124 times.
|
14512 | for (i = mapping->coupling_steps - 1; i >= 0; --i) { |
1676 |
2/2✓ Branch 0 taken 4732 times.
✓ Branch 1 taken 656 times.
|
5388 | if (!(no_residue[mapping->magnitude[i]] & no_residue[mapping->angle[i]])) { |
1677 | 4732 | no_residue[mapping->magnitude[i]] = 0; | |
1678 | 4732 | no_residue[mapping->angle[i]] = 0; | |
1679 | } | ||
1680 | } | ||
1681 | |||
1682 | // Decode residue | ||
1683 | |||
1684 |
2/2✓ Branch 0 taken 9495 times.
✓ Branch 1 taken 9124 times.
|
18619 | for (i = 0; i < mapping->submaps; ++i) { |
1685 | vorbis_residue *residue; | ||
1686 | 9495 | unsigned ch = 0; | |
1687 | int ret; | ||
1688 | |||
1689 |
2/2✓ Branch 0 taken 20064 times.
✓ Branch 1 taken 9495 times.
|
29559 | for (j = 0; j < vc->audio_channels; ++j) { |
1690 |
4/4✓ Branch 0 taken 4452 times.
✓ Branch 1 taken 15612 times.
✓ Branch 2 taken 2226 times.
✓ Branch 3 taken 2226 times.
|
20064 | if ((mapping->submaps == 1) || (i == mapping->mux[j])) { |
1691 | 17838 | res_chan[j] = res_num; | |
1692 |
2/2✓ Branch 0 taken 1226 times.
✓ Branch 1 taken 16612 times.
|
17838 | if (no_residue[j]) { |
1693 | 1226 | do_not_decode[ch] = 1; | |
1694 | } else { | ||
1695 | 16612 | do_not_decode[ch] = 0; | |
1696 | } | ||
1697 | 17838 | ++ch; | |
1698 | 17838 | ++res_num; | |
1699 | } | ||
1700 | } | ||
1701 | 9495 | residue = &vc->residues[mapping->submap_residue[i]]; | |
1702 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 9495 times.
|
9495 | if (ch_left < ch) { |
1703 | ✗ | av_log(vc->avctx, AV_LOG_ERROR, "Too many channels in vorbis_floor_decode.\n"); | |
1704 | ✗ | return AVERROR_INVALIDDATA; | |
1705 | } | ||
1706 |
1/2✓ Branch 0 taken 9495 times.
✗ Branch 1 not taken.
|
9495 | if (ch) { |
1707 | 9495 | ret = vorbis_residue_decode(vc, residue, ch, do_not_decode, ch_res_ptr, vlen, ch_left); | |
1708 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 9495 times.
|
9495 | if (ret < 0) |
1709 | ✗ | return ret; | |
1710 | } | ||
1711 | |||
1712 | 9495 | ch_res_ptr += ch * vlen; | |
1713 | 9495 | ch_left -= ch; | |
1714 | } | ||
1715 | |||
1716 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 9124 times.
|
9124 | if (ch_left > 0) |
1717 | ✗ | return AVERROR_INVALIDDATA; | |
1718 | |||
1719 | // Inverse coupling | ||
1720 | |||
1721 |
2/2✓ Branch 0 taken 5388 times.
✓ Branch 1 taken 9124 times.
|
14512 | for (i = mapping->coupling_steps - 1; i >= 0; --i) { //warning: i has to be signed |
1722 | float *mag, *ang; | ||
1723 | |||
1724 | 5388 | mag = vc->channel_residues+res_chan[mapping->magnitude[i]] * blocksize / 2; | |
1725 | 5388 | ang = vc->channel_residues+res_chan[mapping->angle[i]] * blocksize / 2; | |
1726 | 5388 | vc->dsp.vorbis_inverse_coupling(mag, ang, blocksize / 2); | |
1727 | } | ||
1728 | |||
1729 | // Dotproduct, MDCT | ||
1730 | |||
1731 | 9124 | mdct = vc->mdct[blockflag]; | |
1732 | 9124 | mdct_fn = vc->mdct_fn[blockflag]; | |
1733 | |||
1734 |
2/2✓ Branch 0 taken 17838 times.
✓ Branch 1 taken 9124 times.
|
26962 | for (j = vc->audio_channels-1;j >= 0; j--) { |
1735 | 17838 | ch_res_ptr = vc->channel_residues + res_chan[j] * blocksize / 2; | |
1736 | 17838 | vc->fdsp->vector_fmul(floor_ptr[j], floor_ptr[j], ch_res_ptr, blocksize / 2); | |
1737 | 17838 | mdct_fn(mdct, ch_res_ptr, floor_ptr[j], sizeof(float)); | |
1738 | } | ||
1739 | |||
1740 | // Overlap/add, save data for next overlapping | ||
1741 | |||
1742 | 9124 | retlen = (blocksize + vc->blocksize[previous_window]) / 4; | |
1743 |
2/2✓ Branch 0 taken 17838 times.
✓ Branch 1 taken 9124 times.
|
26962 | for (j = 0; j < vc->audio_channels; j++) { |
1744 | 17838 | unsigned bs0 = vc->blocksize[0]; | |
1745 | 17838 | unsigned bs1 = vc->blocksize[1]; | |
1746 | 17838 | float *residue = vc->channel_residues + res_chan[j] * blocksize / 2; | |
1747 | 17838 | float *saved = vc->saved + j * bs1 / 4; | |
1748 | 17838 | float *ret = floor_ptr[j]; | |
1749 | 17838 | float *buf = residue; | |
1750 | 17838 | const float *win = vc->win[blockflag & previous_window]; | |
1751 | |||
1752 |
2/2✓ Branch 0 taken 16407 times.
✓ Branch 1 taken 1431 times.
|
17838 | if (blockflag == previous_window) { |
1753 | 16407 | vc->fdsp->vector_fmul_window(ret, saved, buf, win, blocksize / 4); | |
1754 |
2/2✓ Branch 0 taken 735 times.
✓ Branch 1 taken 696 times.
|
1431 | } else if (blockflag > previous_window) { |
1755 | 735 | vc->fdsp->vector_fmul_window(ret, saved, buf, win, bs0 / 4); | |
1756 | 735 | memcpy(ret+bs0/2, buf+bs0/4, ((bs1-bs0)/4) * sizeof(float)); | |
1757 | } else { | ||
1758 | 696 | memcpy(ret, saved, ((bs1 - bs0) / 4) * sizeof(float)); | |
1759 | 696 | vc->fdsp->vector_fmul_window(ret + (bs1 - bs0) / 4, saved + (bs1 - bs0) / 4, buf, win, bs0 / 4); | |
1760 | } | ||
1761 | 17838 | memcpy(saved, buf + blocksize / 4, blocksize / 4 * sizeof(float)); | |
1762 | } | ||
1763 | |||
1764 | 9124 | vc->previous_window = blockflag; | |
1765 | 9124 | return retlen; | |
1766 | } | ||
1767 | |||
1768 | // Return the decoded audio packet through the standard api | ||
1769 | |||
1770 | 9124 | static int vorbis_decode_frame(AVCodecContext *avctx, AVFrame *frame, | |
1771 | int *got_frame_ptr, AVPacket *avpkt) | ||
1772 | { | ||
1773 | 9124 | const uint8_t *buf = avpkt->data; | |
1774 | 9124 | int buf_size = avpkt->size; | |
1775 | 9124 | vorbis_context *vc = avctx->priv_data; | |
1776 | 9124 | GetBitContext *gb = &vc->gb; | |
1777 | float *channel_ptrs[255]; | ||
1778 | int i, len, ret; | ||
1779 | |||
1780 | ff_dlog(NULL, "packet length %d \n", buf_size); | ||
1781 | |||
1782 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 9124 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
9124 | if (*buf == 1 && buf_size > 7) { |
1783 | ✗ | if ((ret = init_get_bits8(gb, buf + 1, buf_size - 1)) < 0) | |
1784 | ✗ | return ret; | |
1785 | |||
1786 | ✗ | vorbis_free(vc); | |
1787 | ✗ | if ((ret = vorbis_parse_id_hdr(vc))) { | |
1788 | ✗ | av_log(avctx, AV_LOG_ERROR, "Id header corrupt.\n"); | |
1789 | ✗ | vorbis_free(vc); | |
1790 | ✗ | return ret; | |
1791 | } | ||
1792 | |||
1793 | ✗ | av_channel_layout_uninit(&avctx->ch_layout); | |
1794 | ✗ | if (vc->audio_channels > 8) { | |
1795 | ✗ | avctx->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC; | |
1796 | ✗ | avctx->ch_layout.nb_channels = vc->audio_channels; | |
1797 | } else { | ||
1798 | ✗ | av_channel_layout_copy(&avctx->ch_layout, &ff_vorbis_ch_layouts[vc->audio_channels - 1]); | |
1799 | } | ||
1800 | |||
1801 | ✗ | avctx->sample_rate = vc->audio_samplerate; | |
1802 | ✗ | return buf_size; | |
1803 | } | ||
1804 | |||
1805 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 9124 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
9124 | if (*buf == 3 && buf_size > 7) { |
1806 | ✗ | av_log(avctx, AV_LOG_DEBUG, "Ignoring comment header\n"); | |
1807 | ✗ | return buf_size; | |
1808 | } | ||
1809 | |||
1810 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 9124 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
9124 | if (*buf == 5 && buf_size > 7 && vc->channel_residues && !vc->modes) { |
1811 | ✗ | if ((ret = init_get_bits8(gb, buf + 1, buf_size - 1)) < 0) | |
1812 | ✗ | return ret; | |
1813 | |||
1814 | ✗ | if ((ret = vorbis_parse_setup_hdr(vc))) { | |
1815 | ✗ | av_log(avctx, AV_LOG_ERROR, "Setup header corrupt.\n"); | |
1816 | ✗ | vorbis_free(vc); | |
1817 | ✗ | return ret; | |
1818 | } | ||
1819 | ✗ | return buf_size; | |
1820 | } | ||
1821 | |||
1822 |
2/4✓ Branch 0 taken 9124 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 9124 times.
|
9124 | if (!vc->channel_residues || !vc->modes) { |
1823 | ✗ | av_log(avctx, AV_LOG_ERROR, "Data packet before valid headers\n"); | |
1824 | ✗ | return AVERROR_INVALIDDATA; | |
1825 | } | ||
1826 | |||
1827 | /* get output buffer */ | ||
1828 | 9124 | frame->nb_samples = vc->blocksize[1] / 2; | |
1829 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 9124 times.
|
9124 | if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) |
1830 | ✗ | return ret; | |
1831 | |||
1832 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 9124 times.
|
9124 | if (vc->audio_channels > 8) { |
1833 | ✗ | for (i = 0; i < vc->audio_channels; i++) | |
1834 | ✗ | channel_ptrs[i] = (float *)frame->extended_data[i]; | |
1835 | } else { | ||
1836 |
2/2✓ Branch 0 taken 17838 times.
✓ Branch 1 taken 9124 times.
|
26962 | for (i = 0; i < vc->audio_channels; i++) { |
1837 | 17838 | int ch = ff_vorbis_channel_layout_offsets[vc->audio_channels - 1][i]; | |
1838 | 17838 | channel_ptrs[ch] = (float *)frame->extended_data[i]; | |
1839 | } | ||
1840 | } | ||
1841 | |||
1842 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 9124 times.
|
9124 | if ((ret = init_get_bits8(gb, buf, buf_size)) < 0) |
1843 | ✗ | return ret; | |
1844 | |||
1845 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 9124 times.
|
9124 | if ((len = vorbis_parse_audio_packet(vc, channel_ptrs)) <= 0) |
1846 | ✗ | return len; | |
1847 | |||
1848 |
2/2✓ Branch 0 taken 56 times.
✓ Branch 1 taken 9068 times.
|
9124 | if (!vc->first_frame) { |
1849 | 56 | vc->first_frame = 1; | |
1850 | 56 | avctx->internal->skip_samples = len; | |
1851 | } | ||
1852 | |||
1853 | ff_dlog(NULL, "parsed %d bytes %d bits, returned %d samples (*ch*bits) \n", | ||
1854 | get_bits_count(gb) / 8, get_bits_count(gb) % 8, len); | ||
1855 | |||
1856 | 9124 | frame->nb_samples = len; | |
1857 | 9124 | *got_frame_ptr = 1; | |
1858 | |||
1859 | 9124 | return buf_size; | |
1860 | } | ||
1861 | |||
1862 | // Close decoder | ||
1863 | |||
1864 | 66 | static av_cold int vorbis_decode_close(AVCodecContext *avctx) | |
1865 | { | ||
1866 | 66 | vorbis_context *vc = avctx->priv_data; | |
1867 | |||
1868 | 66 | vorbis_free(vc); | |
1869 | |||
1870 | 66 | return 0; | |
1871 | } | ||
1872 | |||
1873 | ✗ | static av_cold void vorbis_decode_flush(AVCodecContext *avctx) | |
1874 | { | ||
1875 | ✗ | vorbis_context *vc = avctx->priv_data; | |
1876 | |||
1877 | ✗ | if (vc->saved) { | |
1878 | ✗ | memset(vc->saved, 0, (vc->blocksize[1] / 4) * vc->audio_channels * | |
1879 | sizeof(*vc->saved)); | ||
1880 | } | ||
1881 | ✗ | vc->previous_window = -1; | |
1882 | ✗ | vc->first_frame = 0; | |
1883 | ✗ | } | |
1884 | |||
1885 | const FFCodec ff_vorbis_decoder = { | ||
1886 | .p.name = "vorbis", | ||
1887 | CODEC_LONG_NAME("Vorbis"), | ||
1888 | .p.type = AVMEDIA_TYPE_AUDIO, | ||
1889 | .p.id = AV_CODEC_ID_VORBIS, | ||
1890 | .priv_data_size = sizeof(vorbis_context), | ||
1891 | .init = vorbis_decode_init, | ||
1892 | .close = vorbis_decode_close, | ||
1893 | FF_CODEC_DECODE_CB(vorbis_decode_frame), | ||
1894 | .flush = vorbis_decode_flush, | ||
1895 | .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF, | ||
1896 | .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, | ||
1897 | .p.ch_layouts = ff_vorbis_ch_layouts, | ||
1898 | .p.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, | ||
1899 | AV_SAMPLE_FMT_NONE }, | ||
1900 | }; | ||
1901 |