FFmpeg
vorbisdec.c
Go to the documentation of this file.
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;
58  float *codevectors;
59  unsigned int nb_bits;
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
68  (struct vorbis_context_s *, vorbis_floor_data *, float *);
69 typedef struct vorbis_floor {
70  uint8_t floor_type;
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;
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;
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;
105  uint8_t classbook;
106  int16_t books[64][8];
107  uint8_t maxpass;
108  uint16_t ptns_to_read;
109  uint8_t *classifs;
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];
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 {
134 
137 
138  uint8_t first_frame;
139  uint32_t version;
140  uint8_t audio_channels;
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;
149  uint8_t floor_count;
151  uint8_t residue_count;
153  uint8_t mapping_count;
155  uint8_t mode_count;
157  uint8_t mode_number; // mode number for the current packet
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 static float vorbisfloat2float(unsigned val)
183 {
184  float mant = val & 0x1fffff;
185  int exp = (val & 0x7fe00000) >> 21;
186  if (val & 0x80000000)
187  mant = -mant;
188  return ldexpf(mant, exp - 20 - 768);
189 }
190 
191 
192 // Free all allocated memory -----------------------------------------
193 
194 static void vorbis_free(vorbis_context *vc)
195 {
196  int i;
197 
198  av_freep(&vc->channel_residues);
199  av_freep(&vc->saved);
200  av_freep(&vc->fdsp);
201 
202  if (vc->residues)
203  for (i = 0; i < vc->residue_count; i++)
204  av_freep(&vc->residues[i].classifs);
205  av_freep(&vc->residues);
206  av_freep(&vc->modes);
207 
208  av_tx_uninit(&vc->mdct[0]);
209  av_tx_uninit(&vc->mdct[1]);
210 
211  if (vc->codebooks)
212  for (i = 0; i < vc->codebook_count; ++i) {
213  av_freep(&vc->codebooks[i].codevectors);
214  ff_vlc_free(&vc->codebooks[i].vlc);
215  }
216  av_freep(&vc->codebooks);
217 
218  if (vc->floors)
219  for (i = 0; i < vc->floor_count; ++i) {
220  if (vc->floors[i].floor_type == 0) {
221  av_freep(&vc->floors[i].data.t0.map[0]);
222  av_freep(&vc->floors[i].data.t0.map[1]);
223  av_freep(&vc->floors[i].data.t0.book_list);
224  av_freep(&vc->floors[i].data.t0.lsp);
225  } else {
226  av_freep(&vc->floors[i].data.t1.list);
227  }
228  }
229  av_freep(&vc->floors);
230 
231  if (vc->mappings)
232  for (i = 0; i < vc->mapping_count; ++i) {
233  av_freep(&vc->mappings[i].magnitude);
234  av_freep(&vc->mappings[i].angle);
235  av_freep(&vc->mappings[i].mux);
236  }
237  av_freep(&vc->mappings);
238 }
239 
240 // Parse setup header -------------------------------------------------
241 
242 // Process codebooks part
243 
244 static int vorbis_parse_setup_hdr_codebooks(vorbis_context *vc)
245 {
246  unsigned cb;
247  uint8_t *tmp_vlc_bits = NULL;
248  uint32_t *tmp_vlc_codes = NULL;
249  GetBitContext *gb = &vc->gb;
250  uint16_t *codebook_multiplicands = NULL;
251  int ret = 0;
252 
253  vc->codebook_count = get_bits(gb, 8) + 1;
254 
255  ff_dlog(NULL, " Codebooks: %d \n", vc->codebook_count);
256 
257  vc->codebooks = av_mallocz(vc->codebook_count * sizeof(*vc->codebooks));
258  tmp_vlc_bits = av_mallocz(V_MAX_VLCS * sizeof(*tmp_vlc_bits));
259  tmp_vlc_codes = av_mallocz(V_MAX_VLCS * sizeof(*tmp_vlc_codes));
260  codebook_multiplicands = av_malloc(V_MAX_VLCS * sizeof(*codebook_multiplicands));
261  if (!vc->codebooks ||
262  !tmp_vlc_bits || !tmp_vlc_codes || !codebook_multiplicands) {
263  ret = AVERROR(ENOMEM);
264  goto error;
265  }
266 
267  for (cb = 0; cb < vc->codebook_count; ++cb) {
268  vorbis_codebook *codebook_setup = &vc->codebooks[cb];
269  unsigned ordered, t, entries, used_entries = 0;
270 
271  ff_dlog(NULL, " %u. Codebook\n", cb);
272 
273  if (get_bits(gb, 24) != 0x564342) {
274  av_log(vc->avctx, AV_LOG_ERROR,
275  " %u. Codebook setup data corrupt.\n", cb);
277  goto error;
278  }
279 
280  codebook_setup->dimensions=get_bits(gb, 16);
281  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);
286  goto error;
287  }
288  entries = get_bits(gb, 24);
289  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);
294  goto error;
295  }
296 
297  ordered = get_bits1(gb);
298 
299  ff_dlog(NULL, " codebook_dimensions %d, codebook_entries %u\n",
300  codebook_setup->dimensions, entries);
301 
302  if (!ordered) {
303  unsigned ce, flag;
304  unsigned sparse = get_bits1(gb);
305 
306  ff_dlog(NULL, " not ordered \n");
307 
308  if (sparse) {
309  ff_dlog(NULL, " sparse \n");
310 
311  used_entries = 0;
312  for (ce = 0; ce < entries; ++ce) {
313  flag = get_bits1(gb);
314  if (flag) {
315  tmp_vlc_bits[ce] = get_bits(gb, 5) + 1;
316  ++used_entries;
317  } else
318  tmp_vlc_bits[ce] = 0;
319  }
320  } else {
321  ff_dlog(NULL, " not sparse \n");
322 
323  used_entries = entries;
324  for (ce = 0; ce < entries; ++ce)
325  tmp_vlc_bits[ce] = get_bits(gb, 5) + 1;
326  }
327  } else {
328  unsigned current_entry = 0;
329  unsigned current_length = get_bits(gb, 5) + 1;
330 
331  ff_dlog(NULL, " ordered, current length: %u\n", current_length); //FIXME
332 
333  used_entries = entries;
334  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  number = get_bits(gb, ilog(entries - current_entry));
340 
341  ff_dlog(NULL, " number: %u\n", number);
342 
343  for (i = current_entry; i < number+current_entry; ++i)
344  if (i < used_entries)
345  tmp_vlc_bits[i] = current_length;
346 
347  current_entry+=number;
348  }
349  if (current_entry>used_entries) {
350  av_log(vc->avctx, AV_LOG_ERROR, " More codelengths than codes in codebook. \n");
352  goto error;
353  }
354  }
355 
356  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  if (codebook_setup->lookup_type == 1) {
364  unsigned i, j, k;
365  unsigned codebook_lookup_values = ff_vorbis_nth_root(entries, codebook_setup->dimensions);
366 
367  float codebook_minimum_value = vorbisfloat2float(get_bits_long(gb, 32));
368  float codebook_delta_value = vorbisfloat2float(get_bits_long(gb, 32));
369  unsigned codebook_value_bits = get_bits(gb, 4) + 1;
370  unsigned codebook_sequence_p = get_bits1(gb);
371 
372  if (!isfinite(codebook_minimum_value) || !isfinite(codebook_delta_value)) {
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 minimum %f \n",
379  codebook_delta_value, codebook_minimum_value);
380 
381  for (i = 0; i < codebook_lookup_values; ++i) {
382  codebook_multiplicands[i] = get_bits(gb, codebook_value_bits);
383 
384  ff_dlog(NULL, " multiplicands*delta+minimum : %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  if (used_entries) {
391  codebook_setup->codevectors =
392  av_calloc(used_entries, codebook_setup->dimensions *
393  sizeof(*codebook_setup->codevectors));
394  if (!codebook_setup->codevectors) {
395  ret = AVERROR(ENOMEM);
396  goto error;
397  }
398  } else
399  codebook_setup->codevectors = NULL;
400 
401  for (j = 0, i = 0; i < entries; ++i) {
402  unsigned dim = codebook_setup->dimensions;
403 
404  if (tmp_vlc_bits[i]) {
405  float last = 0.0;
406  unsigned lookup_offset = i;
407 
408  ff_dlog(vc->avctx, "Lookup offset %u ,", i);
409 
410  for (k = 0; k < dim; ++k) {
411  unsigned multiplicand_offset = lookup_offset % codebook_lookup_values;
412  codebook_setup->codevectors[j * dim + k] = codebook_multiplicands[multiplicand_offset] * codebook_delta_value + codebook_minimum_value + last;
413  if (codebook_sequence_p)
414  last = codebook_setup->codevectors[j * dim + k];
415  lookup_offset/=codebook_lookup_values;
416  }
417  tmp_vlc_bits[j] = tmp_vlc_bits[i];
418 
419  ff_dlog(vc->avctx, "real lookup offset %u, vector: ", j);
420  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  ++j;
426  }
427  }
428  if (j != used_entries) {
429  av_log(vc->avctx, AV_LOG_ERROR, "Bug in codevector vector building code. \n");
431  goto error;
432  }
433  entries = used_entries;
434  } else if (codebook_setup->lookup_type >= 2) {
435  av_log(vc->avctx, AV_LOG_ERROR, "Codebook lookup type not supported. \n");
437  goto error;
438  }
439 
440 // Initialize VLC table
441  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");
444  goto error;
445  }
446  codebook_setup->maxdepth = 0;
447  for (t = 0; t < entries; ++t)
448  if (tmp_vlc_bits[t] >= codebook_setup->maxdepth)
449  codebook_setup->maxdepth = tmp_vlc_bits[t];
450 
451  if (codebook_setup->maxdepth > 3 * V_NB_BITS)
452  codebook_setup->nb_bits = V_NB_BITS2;
453  else
454  codebook_setup->nb_bits = V_NB_BITS;
455 
456  codebook_setup->maxdepth = (codebook_setup->maxdepth+codebook_setup->nb_bits - 1) / codebook_setup->nb_bits;
457 
458  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  av_free(tmp_vlc_bits);
469  av_free(tmp_vlc_codes);
470  av_free(codebook_multiplicands);
471  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 static int vorbis_parse_setup_hdr_tdtransforms(vorbis_context *vc)
484 {
485  GetBitContext *gb = &vc->gb;
486  unsigned i, vorbis_time_count = get_bits(gb, 6) + 1;
487 
488  for (i = 0; i < vorbis_time_count; ++i) {
489  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  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  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 static int vorbis_parse_setup_hdr_floors(vorbis_context *vc)
510 {
511  GetBitContext *gb = &vc->gb;
512  int i, j, k, ret;
513 
514  vc->floor_count = get_bits(gb, 6) + 1;
515 
516  vc->floors = av_mallocz(vc->floor_count * sizeof(*vc->floors));
517  if (!vc->floors)
518  return AVERROR(ENOMEM);
519 
520  for (i = 0; i < vc->floor_count; ++i) {
521  vorbis_floor *floor_setup = &vc->floors[i];
522 
523  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  if (floor_setup->floor_type == 1) {
528  int maximum_class = -1;
529  unsigned rangebits, rangemax, floor1_values = 2;
530 
531  floor_setup->decode = vorbis_floor1_decode;
532 
533  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  for (j = 0; j < floor_setup->data.t1.partitions; ++j) {
539  floor_setup->data.t1.partition_class[j] = get_bits(gb, 4);
540  if (floor_setup->data.t1.partition_class[j] > maximum_class)
541  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  for (j = 0; j <= maximum_class; ++j) {
551  floor_setup->data.t1.class_dimensions[j] = get_bits(gb, 3) + 1;
552  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  if (floor_setup->data.t1.class_subclasses[j]) {
559  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  for (k = 0; k < (1 << floor_setup->data.t1.class_subclasses[j]); ++k) {
565  int16_t bits = get_bits(gb, 8) - 1;
566  if (bits != -1)
567  VALIDATE_INDEX(bits, vc->codebook_count)
568  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  floor_setup->data.t1.multiplier = get_bits(gb, 2) + 1;
575  floor_setup->data.t1.x_list_dim = 2;
576 
577  for (j = 0; j < floor_setup->data.t1.partitions; ++j)
578  floor_setup->data.t1.x_list_dim+=floor_setup->data.t1.class_dimensions[floor_setup->data.t1.partition_class[j]];
579 
580  floor_setup->data.t1.list = av_calloc(floor_setup->data.t1.x_list_dim,
581  sizeof(*floor_setup->data.t1.list));
582  if (!floor_setup->data.t1.list)
583  return AVERROR(ENOMEM);
584 
585  rangebits = get_bits(gb, 4);
586  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  rangemax = (1 << rangebits);
592  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  floor_setup->data.t1.list[0].x = 0;
599  floor_setup->data.t1.list[1].x = rangemax;
600 
601  for (j = 0; j < floor_setup->data.t1.partitions; ++j) {
602  for (k = 0; k < floor_setup->data.t1.class_dimensions[floor_setup->data.t1.partition_class[j]]; ++k, ++floor1_values) {
603  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  if (ff_vorbis_ready_floor1_list(vc->avctx,
612  floor_setup->data.t1.list,
613  floor_setup->data.t1.x_list_dim)) {
614  return AVERROR_INVALIDDATA;
615  }
616  } else if (floor_setup->floor_type == 0) {
617  unsigned max_codebook_dim = 0;
618 
619  floor_setup->decode = vorbis_floor0_decode;
620 
621  floor_setup->data.t0.order = get_bits(gb, 8);
622  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  floor_setup->data.t0.rate = get_bits(gb, 16);
627  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  floor_setup->data.t0.bark_map_size = get_bits(gb, 16);
632  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  floor_setup->data.t0.amplitude_bits = get_bits(gb, 6);
638  floor_setup->data.t0.amplitude_offset = get_bits(gb, 8);
639  floor_setup->data.t0.num_books = get_bits(gb, 4) + 1;
640 
641  /* allocate mem for booklist */
642  floor_setup->data.t0.book_list =
643  av_malloc(floor_setup->data.t0.num_books);
644  if (!floor_setup->data.t0.book_list)
645  return AVERROR(ENOMEM);
646  /* read book indexes */
647  {
648  int idx;
649  unsigned book_idx;
650  for (idx = 0; idx < floor_setup->data.t0.num_books; ++idx) {
651  GET_VALIDATED_INDEX(book_idx, 8, vc->codebook_count)
652  floor_setup->data.t0.book_list[idx] = book_idx;
653  if (vc->codebooks[book_idx].dimensions > max_codebook_dim)
654  max_codebook_dim = vc->codebooks[book_idx].dimensions;
655  }
656  }
657 
658  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  floor_setup->data.t0.lsp =
664  av_malloc_array((floor_setup->data.t0.order + 1 + max_codebook_dim),
665  sizeof(*floor_setup->data.t0.lsp));
666  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  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  return 0;
695 }
696 
697 // Process residues part
698 
699 static int vorbis_parse_setup_hdr_residues(vorbis_context *vc)
700 {
701  GetBitContext *gb = &vc->gb;
702  unsigned i, j, k;
703 
704  vc->residue_count = get_bits(gb, 6)+1;
705  vc->residues = av_mallocz(vc->residue_count * sizeof(*vc->residues));
706  if (!vc->residues)
707  return AVERROR(ENOMEM);
708 
709  ff_dlog(NULL, " There are %d residues. \n", vc->residue_count);
710 
711  for (i = 0; i < vc->residue_count; ++i) {
712  vorbis_residue *res_setup = &vc->residues[i];
713  uint8_t cascade[64];
714  unsigned high_bits, low_bits;
715 
716  res_setup->type = get_bits(gb, 16);
717 
718  ff_dlog(NULL, " %u. residue type %d\n", i, res_setup->type);
719 
720  res_setup->begin = get_bits(gb, 24);
721  res_setup->end = get_bits(gb, 24);
722  res_setup->partition_size = get_bits(gb, 24) + 1;
723  /* Validations to prevent a buffer overflow later. */
724  if (res_setup->begin>res_setup->end ||
725  (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  res_setup->classifications = get_bits(gb, 6) + 1;
734  GET_VALIDATED_INDEX(res_setup->classbook, 8, vc->codebook_count)
735 
736  res_setup->ptns_to_read =
737  (res_setup->end - res_setup->begin) / res_setup->partition_size;
738  res_setup->classifs = av_malloc_array(res_setup->ptns_to_read,
739  vc->audio_channels *
740  sizeof(*res_setup->classifs));
741  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  for (j = 0; j < res_setup->classifications; ++j) {
749  high_bits = 0;
750  low_bits = get_bits(gb, 3);
751  if (get_bits1(gb))
752  high_bits = get_bits(gb, 5);
753  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  res_setup->maxpass = 0;
759  for (j = 0; j < res_setup->classifications; ++j) {
760  for (k = 0; k < 8; ++k) {
761  if (cascade[j]&(1 << k)) {
762  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  if (k>res_setup->maxpass)
768  res_setup->maxpass = k;
769  } else {
770  res_setup->books[j][k] = -1;
771  }
772  }
773  }
774  }
775  return 0;
776 }
777 
778 // Process mappings part
779 
780 static int vorbis_parse_setup_hdr_mappings(vorbis_context *vc)
781 {
782  GetBitContext *gb = &vc->gb;
783  unsigned i, j;
784 
785  vc->mapping_count = get_bits(gb, 6)+1;
786  vc->mappings = av_mallocz(vc->mapping_count * sizeof(*vc->mappings));
787  if (!vc->mappings)
788  return AVERROR(ENOMEM);
789 
790  ff_dlog(NULL, " There are %d mappings. \n", vc->mapping_count);
791 
792  for (i = 0; i < vc->mapping_count; ++i) {
793  vorbis_mapping *mapping_setup = &vc->mappings[i];
794 
795  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  if (get_bits1(gb)) {
800  mapping_setup->submaps = get_bits(gb, 4) + 1;
801  } else {
802  mapping_setup->submaps = 1;
803  }
804 
805  if (get_bits1(gb)) {
806  mapping_setup->coupling_steps = get_bits(gb, 8) + 1;
807  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  mapping_setup->magnitude = av_mallocz(mapping_setup->coupling_steps *
813  sizeof(*mapping_setup->magnitude));
814  mapping_setup->angle = av_mallocz(mapping_setup->coupling_steps *
815  sizeof(*mapping_setup->angle));
816  if (!mapping_setup->angle || !mapping_setup->magnitude)
817  return AVERROR(ENOMEM);
818 
819  for (j = 0; j < mapping_setup->coupling_steps; ++j) {
820  GET_VALIDATED_INDEX(mapping_setup->magnitude[j], ilog(vc->audio_channels - 1), vc->audio_channels)
821  GET_VALIDATED_INDEX(mapping_setup->angle[j], ilog(vc->audio_channels - 1), vc->audio_channels)
822  }
823  } else {
824  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  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  if (mapping_setup->submaps>1) {
836  mapping_setup->mux = av_calloc(vc->audio_channels,
837  sizeof(*mapping_setup->mux));
838  if (!mapping_setup->mux)
839  return AVERROR(ENOMEM);
840 
841  for (j = 0; j < vc->audio_channels; ++j)
842  mapping_setup->mux[j] = get_bits(gb, 4);
843  }
844 
845  for (j = 0; j < mapping_setup->submaps; ++j) {
846  skip_bits(gb, 8); // FIXME check?
847  GET_VALIDATED_INDEX(mapping_setup->submap_floor[j], 8, vc->floor_count)
848  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  return 0;
856 }
857 
858 // Process modes part
859 
860 static int create_map(vorbis_context *vc, unsigned floor_number)
861 {
862  vorbis_floor *floors = vc->floors;
863  vorbis_floor0 *vf;
864  int idx;
865  int blockflag, n;
866  int32_t *map;
867 
868  for (blockflag = 0; blockflag < 2; ++blockflag) {
869  n = vc->blocksize[blockflag] / 2;
870  floors[floor_number].data.t0.map[blockflag] =
871  av_malloc_array(n + 1, sizeof(int32_t)); // n + sentinel
872  if (!floors[floor_number].data.t0.map[blockflag])
873  return AVERROR(ENOMEM);
874 
875  map = floors[floor_number].data.t0.map[blockflag];
876  vf = &floors[floor_number].data.t0;
877 
878  for (idx = 0; idx < n; ++idx) {
879  map[idx] = floor(BARK((vf->rate * idx) / (2.0f * n)) *
880  (vf->bark_map_size / BARK(vf->rate / 2.0f)));
881  if (vf->bark_map_size-1 < map[idx])
882  map[idx] = vf->bark_map_size - 1;
883  }
884  map[n] = -1;
885  vf->map_size[blockflag] = n;
886  }
887 
888  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  return 0;
893 }
894 
895 static int vorbis_parse_setup_hdr_modes(vorbis_context *vc)
896 {
897  GetBitContext *gb = &vc->gb;
898  unsigned i;
899 
900  vc->mode_count = get_bits(gb, 6) + 1;
901  vc->modes = av_mallocz(vc->mode_count * sizeof(*vc->modes));
902  if (!vc->modes)
903  return AVERROR(ENOMEM);
904 
905  ff_dlog(NULL, " There are %d modes.\n", vc->mode_count);
906 
907  for (i = 0; i < vc->mode_count; ++i) {
908  vorbis_mode *mode_setup = &vc->modes[i];
909 
910  mode_setup->blockflag = get_bits1(gb);
911  mode_setup->windowtype = get_bits(gb, 16);
912  mode_setup->transformtype = get_bits(gb, 16);
913  if (mode_setup->transformtype != 0 || mode_setup->windowtype != 0) {
914  av_log(vc->avctx, AV_LOG_WARNING,
915  "Invalid mode: windowtype %u, transformtype %u (both must be 0)\n",
916  mode_setup->windowtype, mode_setup->transformtype);
917  }
918  GET_VALIDATED_INDEX(mode_setup->mapping, 8, vc->mapping_count);
919 
920  ff_dlog(NULL, " %u mode: blockflag %d, windowtype %d, transformtype %d, mapping %d\n",
921  i, mode_setup->blockflag, mode_setup->windowtype,
922  mode_setup->transformtype, mode_setup->mapping);
923  }
924  return 0;
925 }
926 
927 // Process the whole setup header using the functions above
928 
929 static int vorbis_parse_setup_hdr(vorbis_context *vc)
930 {
931  GetBitContext *gb = &vc->gb;
932  int ret;
933 
934  if ((get_bits(gb, 8) != 'v') || (get_bits(gb, 8) != 'o') ||
935  (get_bits(gb, 8) != 'r') || (get_bits(gb, 8) != 'b') ||
936  (get_bits(gb, 8) != 'i') || (get_bits(gb, 8) != 's')) {
937  av_log(vc->avctx, AV_LOG_ERROR, " Vorbis setup header packet corrupt (no vorbis signature). \n");
938  return AVERROR_INVALIDDATA;
939  }
940 
942  av_log(vc->avctx, AV_LOG_ERROR, " Vorbis setup header packet corrupt (codebooks). \n");
943  return ret;
944  }
946  av_log(vc->avctx, AV_LOG_ERROR, " Vorbis setup header packet corrupt (time domain transforms). \n");
947  return ret;
948  }
949  if ((ret = vorbis_parse_setup_hdr_floors(vc))) {
950  av_log(vc->avctx, AV_LOG_ERROR, " Vorbis setup header packet corrupt (floors). \n");
951  return ret;
952  }
953  if ((ret = vorbis_parse_setup_hdr_residues(vc))) {
954  av_log(vc->avctx, AV_LOG_ERROR, " Vorbis setup header packet corrupt (residues). \n");
955  return ret;
956  }
957  if ((ret = vorbis_parse_setup_hdr_mappings(vc))) {
958  av_log(vc->avctx, AV_LOG_ERROR, " Vorbis setup header packet corrupt (mappings). \n");
959  return ret;
960  }
961  if ((ret = vorbis_parse_setup_hdr_modes(vc))) {
962  av_log(vc->avctx, AV_LOG_ERROR, " Vorbis setup header packet corrupt (modes). \n");
963  return ret;
964  }
965  if (!get_bits1(gb)) {
966  av_log(vc->avctx, AV_LOG_ERROR, " Vorbis setup header packet corrupt (framing flag). \n");
967  return AVERROR_INVALIDDATA; // framing flag bit unset error
968  }
969 
970  return 0;
971 }
972 
973 // Process the identification header
974 
975 static int vorbis_parse_id_hdr(vorbis_context *vc)
976 {
977  GetBitContext *gb = &vc->gb;
978  unsigned bl0, bl1;
979  float scale = -1.0;
980  int ret;
981 
982  if ((get_bits(gb, 8) != 'v') || (get_bits(gb, 8) != 'o') ||
983  (get_bits(gb, 8) != 'r') || (get_bits(gb, 8) != 'b') ||
984  (get_bits(gb, 8) != 'i') || (get_bits(gb, 8) != 's')) {
985  av_log(vc->avctx, AV_LOG_ERROR, " Vorbis id header packet corrupt (no vorbis signature). \n");
986  return AVERROR_INVALIDDATA;
987  }
988 
989  vc->version = get_bits_long(gb, 32); //FIXME check 0
990  vc->audio_channels = get_bits(gb, 8);
991  if (vc->audio_channels <= 0) {
992  av_log(vc->avctx, AV_LOG_ERROR, "Invalid number of channels\n");
993  return AVERROR_INVALIDDATA;
994  }
995  vc->audio_samplerate = get_bits_long(gb, 32);
996  if (vc->audio_samplerate <= 0) {
997  av_log(vc->avctx, AV_LOG_ERROR, "Invalid samplerate\n");
998  return AVERROR_INVALIDDATA;
999  }
1000  vc->bitrate_maximum = get_bits_long(gb, 32);
1001  vc->bitrate_nominal = get_bits_long(gb, 32);
1002  vc->bitrate_minimum = get_bits_long(gb, 32);
1003  bl0 = get_bits(gb, 4);
1004  bl1 = get_bits(gb, 4);
1005  if (bl0 > 13 || bl0 < 6 || bl1 > 13 || bl1 < 6 || bl1 < bl0) {
1006  av_log(vc->avctx, AV_LOG_ERROR, " Vorbis id header packet corrupt (illegal blocksize). \n");
1007  return AVERROR_INVALIDDATA;
1008  }
1009  vc->blocksize[0] = (1 << bl0);
1010  vc->blocksize[1] = (1 << bl1);
1011  vc->win[0] = ff_vorbis_vwin[bl0 - 6];
1012  vc->win[1] = ff_vorbis_vwin[bl1 - 6];
1013 
1014  if ((get_bits1(gb)) == 0) {
1015  av_log(vc->avctx, AV_LOG_ERROR, " Vorbis id header packet corrupt (framing flag not set). \n");
1016  return AVERROR_INVALIDDATA;
1017  }
1018 
1019  vc->channel_residues = av_malloc_array(vc->blocksize[1] / 2, vc->audio_channels * sizeof(*vc->channel_residues));
1020  vc->saved = av_calloc(vc->blocksize[1] / 4, vc->audio_channels * sizeof(*vc->saved));
1021  if (!vc->channel_residues || !vc->saved)
1022  return AVERROR(ENOMEM);
1023 
1024  vc->previous_window = -1;
1025 
1026  ret = av_tx_init(&vc->mdct[0], &vc->mdct_fn[0], AV_TX_FLOAT_MDCT, 1,
1027  vc->blocksize[0] >> 1, &scale, 0);
1028  if (ret < 0)
1029  return ret;
1030 
1031  ret = av_tx_init(&vc->mdct[1], &vc->mdct_fn[1], AV_TX_FLOAT_MDCT, 1,
1032  vc->blocksize[1] >> 1, &scale, 0);
1033  if (ret < 0)
1034  return ret;
1035 
1036  vc->fdsp = avpriv_float_dsp_alloc(vc->avctx->flags & AV_CODEC_FLAG_BITEXACT);
1037  if (!vc->fdsp)
1038  return AVERROR(ENOMEM);
1039 
1040  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 ",
1041  vc->version, vc->audio_channels, vc->audio_samplerate, vc->bitrate_maximum, vc->bitrate_nominal, vc->bitrate_minimum, vc->blocksize[0], vc->blocksize[1]);
1042 
1043 /*
1044  BLK = vc->blocksize[0];
1045  for (i = 0; i < BLK / 2; ++i) {
1046  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)));
1047  }
1048 */
1049 
1050  return 0;
1051 }
1052 
1053 // Process the extradata using the functions above (identification header, setup header)
1054 
1056 {
1057  vorbis_context *vc = avctx->priv_data;
1058  uint8_t *headers = avctx->extradata;
1059  int headers_len = avctx->extradata_size;
1060  const uint8_t *header_start[3];
1061  int header_len[3];
1062  GetBitContext *gb = &vc->gb;
1063  int hdr_type, ret;
1064 
1065  vc->avctx = avctx;
1066  ff_vorbisdsp_init(&vc->dsp);
1067 
1068  avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
1069 
1070  if (!headers_len) {
1071  av_log(avctx, AV_LOG_ERROR, "Extradata missing.\n");
1072  return AVERROR_INVALIDDATA;
1073  }
1074 
1075  if ((ret = avpriv_split_xiph_headers(headers, headers_len, 30, header_start, header_len)) < 0) {
1076  av_log(avctx, AV_LOG_ERROR, "Extradata corrupt.\n");
1077  return ret;
1078  }
1079 
1080  init_get_bits(gb, header_start[0], header_len[0]*8);
1081  hdr_type = get_bits(gb, 8);
1082  if (hdr_type != 1) {
1083  av_log(avctx, AV_LOG_ERROR, "First header is not the id header.\n");
1084  return AVERROR_INVALIDDATA;
1085  }
1086  if ((ret = vorbis_parse_id_hdr(vc))) {
1087  av_log(avctx, AV_LOG_ERROR, "Id header corrupt.\n");
1088  vorbis_free(vc);
1089  return ret;
1090  }
1091 
1092  init_get_bits(gb, header_start[2], header_len[2]*8);
1093  hdr_type = get_bits(gb, 8);
1094  if (hdr_type != 5) {
1095  av_log(avctx, AV_LOG_ERROR, "Third header is not the setup header.\n");
1096  vorbis_free(vc);
1097  return AVERROR_INVALIDDATA;
1098  }
1099  if ((ret = vorbis_parse_setup_hdr(vc))) {
1100  av_log(avctx, AV_LOG_ERROR, "Setup header corrupt.\n");
1101  vorbis_free(vc);
1102  return ret;
1103  }
1104 
1106  if (vc->audio_channels > 8) {
1108  avctx->ch_layout.nb_channels = vc->audio_channels;
1109  } else {
1110  av_channel_layout_copy(&avctx->ch_layout, &ff_vorbis_ch_layouts[vc->audio_channels - 1]);
1111  }
1112 
1113  avctx->sample_rate = vc->audio_samplerate;
1114 
1115  return 0;
1116 }
1117 
1118 // Decode audiopackets -------------------------------------------------
1119 
1120 // Read and decode floor
1121 
1122 static int vorbis_floor0_decode(vorbis_context *vc,
1123  vorbis_floor_data *vfu, float *vec)
1124 {
1125  vorbis_floor0 *vf = &vfu->t0;
1126  float *lsp = vf->lsp;
1127  unsigned book_idx;
1128  uint64_t amplitude;
1129  unsigned blockflag = vc->modes[vc->mode_number].blockflag;
1130 
1131  if (!vf->amplitude_bits)
1132  return 1;
1133 
1134  amplitude = get_bits64(&vc->gb, vf->amplitude_bits);
1135  if (amplitude > 0) {
1136  float last = 0;
1137  unsigned idx, lsp_len = 0;
1139 
1140  book_idx = get_bits(&vc->gb, ilog(vf->num_books));
1141  if (book_idx >= vf->num_books) {
1142  av_log(vc->avctx, AV_LOG_ERROR, "floor0 dec: booknumber too high!\n");
1143  book_idx = 0;
1144  }
1145  ff_dlog(NULL, "floor0 dec: booknumber: %u\n", book_idx);
1146  codebook = vc->codebooks[vf->book_list[book_idx]];
1147  /* Invalid codebook! */
1148  if (!codebook.codevectors)
1149  return AVERROR_INVALIDDATA;
1150 
1151  while (lsp_len<vf->order) {
1152  int vec_off;
1153 
1154  ff_dlog(NULL, "floor0 dec: book dimension: %d\n", codebook.dimensions);
1155  ff_dlog(NULL, "floor0 dec: maximum depth: %d\n", codebook.maxdepth);
1156  /* read temp vector */
1157  vec_off = get_vlc2(&vc->gb, codebook.vlc.table,
1158  codebook.nb_bits, 3);
1159  if (vec_off < 0)
1160  return AVERROR_INVALIDDATA;
1161  vec_off *= codebook.dimensions;
1162  ff_dlog(NULL, "floor0 dec: vector offset: %d\n", vec_off);
1163  /* copy each vector component and add last to it */
1164  for (idx = 0; idx < codebook.dimensions; ++idx)
1165  lsp[lsp_len+idx] = codebook.codevectors[vec_off+idx] + last;
1166  last = lsp[lsp_len+idx-1]; /* set last to last vector component */
1167 
1168  lsp_len += codebook.dimensions;
1169  }
1170  /* DEBUG: output lsp coeffs */
1171  {
1172  int idx;
1173  for (idx = 0; idx < lsp_len; ++idx)
1174  ff_dlog(NULL, "floor0 dec: coeff at %d is %f\n", idx, lsp[idx]);
1175  }
1176 
1177  /* synthesize floor output vector */
1178  {
1179  int i;
1180  int order = vf->order;
1181  float wstep = M_PI / vf->bark_map_size;
1182 
1183  for (i = 0; i < order; i++)
1184  lsp[i] = 2.0f * cos(lsp[i]);
1185 
1186  ff_dlog(NULL, "floor0 synth: map_size = %"PRIu32"; m = %d; wstep = %f\n",
1187  vf->map_size[blockflag], order, wstep);
1188 
1189  i = 0;
1190  while (i < vf->map_size[blockflag]) {
1191  int j, iter_cond = vf->map[blockflag][i];
1192  float p = 0.5f;
1193  float q = 0.5f;
1194  float two_cos_w = 2.0f * cos(wstep * iter_cond); // needed all times
1195 
1196  /* similar part for the q and p products */
1197  for (j = 0; j + 1 < order; j += 2) {
1198  q *= lsp[j] - two_cos_w;
1199  p *= lsp[j + 1] - two_cos_w;
1200  }
1201  if (j == order) { // even order
1202  p *= p * (2.0f - two_cos_w);
1203  q *= q * (2.0f + two_cos_w);
1204  } else { // odd order
1205  q *= two_cos_w-lsp[j]; // one more time for q
1206 
1207  /* final step and square */
1208  p *= p * (4.f - two_cos_w * two_cos_w);
1209  q *= q;
1210  }
1211 
1212  if (p + q == 0.0)
1213  return AVERROR_INVALIDDATA;
1214 
1215  /* calculate linear floor value */
1216  q = exp((((amplitude*vf->amplitude_offset) /
1217  (((1ULL << vf->amplitude_bits) - 1) * sqrt(p + q)))
1218  - vf->amplitude_offset) * .11512925f);
1219 
1220  /* fill vector */
1221  do {
1222  vec[i] = q; ++i;
1223  } while (vf->map[blockflag][i] == iter_cond);
1224  }
1225  }
1226  } else {
1227  /* this channel is unused */
1228  return 1;
1229  }
1230 
1231  ff_dlog(NULL, " Floor0 decoded\n");
1232 
1233  return 0;
1234 }
1235 
1236 static int vorbis_floor1_decode(vorbis_context *vc,
1237  vorbis_floor_data *vfu, float *vec)
1238 {
1239  vorbis_floor1 *vf = &vfu->t1;
1240  GetBitContext *gb = &vc->gb;
1241  uint16_t range_v[4] = { 256, 128, 86, 64 };
1242  unsigned range = range_v[vf->multiplier - 1];
1243  uint16_t floor1_Y[258];
1244  uint16_t floor1_Y_final[258];
1245  int floor1_flag[258];
1246  unsigned partition_class, cdim, cbits, csub, cval, offset, i, j;
1247  int book, adx, ady, dy, off, predicted, err;
1248 
1249 
1250  if (!get_bits1(gb)) // silence
1251  return 1;
1252 
1253 // Read values (or differences) for the floor's points
1254 
1255  floor1_Y[0] = get_bits(gb, ilog(range - 1));
1256  floor1_Y[1] = get_bits(gb, ilog(range - 1));
1257 
1258  ff_dlog(NULL, "floor 0 Y %d floor 1 Y %d \n", floor1_Y[0], floor1_Y[1]);
1259 
1260  offset = 2;
1261  for (i = 0; i < vf->partitions; ++i) {
1262  partition_class = vf->partition_class[i];
1263  cdim = vf->class_dimensions[partition_class];
1264  cbits = vf->class_subclasses[partition_class];
1265  csub = (1 << cbits) - 1;
1266  cval = 0;
1267 
1268  ff_dlog(NULL, "Cbits %u\n", cbits);
1269 
1270  if (cbits) // this reads all subclasses for this partition's class
1271  cval = get_vlc2(gb, vc->codebooks[vf->class_masterbook[partition_class]].vlc.table,
1272  vc->codebooks[vf->class_masterbook[partition_class]].nb_bits, 3);
1273 
1274  for (j = 0; j < cdim; ++j) {
1275  book = vf->subclass_books[partition_class][cval & csub];
1276 
1277  ff_dlog(NULL, "book %d Cbits %u cval %u bits:%d\n",
1278  book, cbits, cval, get_bits_count(gb));
1279 
1280  cval = cval >> cbits;
1281  if (book > -1) {
1282  int v = get_vlc2(gb, vc->codebooks[book].vlc.table,
1283  vc->codebooks[book].nb_bits, 3);
1284  if (v < 0)
1285  return AVERROR_INVALIDDATA;
1286  floor1_Y[offset+j] = v;
1287  } else {
1288  floor1_Y[offset+j] = 0;
1289  }
1290 
1291  ff_dlog(NULL, " floor(%d) = %d \n",
1292  vf->list[offset+j].x, floor1_Y[offset+j]);
1293  }
1294  offset+=cdim;
1295  }
1296 
1297 // Amplitude calculation from the differences
1298 
1299  floor1_flag[0] = 1;
1300  floor1_flag[1] = 1;
1301  floor1_Y_final[0] = floor1_Y[0];
1302  floor1_Y_final[1] = floor1_Y[1];
1303 
1304  for (i = 2; i < vf->x_list_dim; ++i) {
1305  unsigned val, highroom, lowroom, room, high_neigh_offs, low_neigh_offs;
1306 
1307  low_neigh_offs = vf->list[i].low;
1308  high_neigh_offs = vf->list[i].high;
1309  dy = floor1_Y_final[high_neigh_offs] - floor1_Y_final[low_neigh_offs]; // render_point begin
1310  adx = vf->list[high_neigh_offs].x - vf->list[low_neigh_offs].x;
1311  ady = FFABS(dy);
1312  err = ady * (vf->list[i].x - vf->list[low_neigh_offs].x);
1313  off = err / adx;
1314  if (dy < 0) {
1315  predicted = floor1_Y_final[low_neigh_offs] - off;
1316  } else {
1317  predicted = floor1_Y_final[low_neigh_offs] + off;
1318  } // render_point end
1319 
1320  val = floor1_Y[i];
1321  highroom = range-predicted;
1322  lowroom = predicted;
1323  if (highroom < lowroom) {
1324  room = highroom * 2;
1325  } else {
1326  room = lowroom * 2; // SPEC misspelling
1327  }
1328  if (val) {
1329  floor1_flag[low_neigh_offs] = 1;
1330  floor1_flag[high_neigh_offs] = 1;
1331  floor1_flag[i] = 1;
1332  if (val >= room) {
1333  if (highroom > lowroom) {
1334  floor1_Y_final[i] = av_clip_uint16(val - lowroom + predicted);
1335  } else {
1336  floor1_Y_final[i] = av_clip_uint16(predicted - val + highroom - 1);
1337  }
1338  } else {
1339  if (val & 1) {
1340  floor1_Y_final[i] = av_clip_uint16(predicted - (val + 1) / 2);
1341  } else {
1342  floor1_Y_final[i] = av_clip_uint16(predicted + val / 2);
1343  }
1344  }
1345  } else {
1346  floor1_flag[i] = 0;
1347  floor1_Y_final[i] = av_clip_uint16(predicted);
1348  }
1349 
1350  ff_dlog(NULL, " Decoded floor(%d) = %u / val %u\n",
1351  vf->list[i].x, floor1_Y_final[i], val);
1352  }
1353 
1354 // Curve synth - connect the calculated dots and convert from dB scale FIXME optimize ?
1355 
1356  ff_vorbis_floor1_render_list(vf->list, vf->x_list_dim, floor1_Y_final, floor1_flag, vf->multiplier, vec, vf->list[1].x);
1357 
1358  ff_dlog(NULL, " Floor decoded\n");
1359 
1360  return 0;
1361 }
1362 
1363 static av_always_inline int setup_classifs(vorbis_context *vc,
1364  vorbis_residue *vr,
1365  uint8_t *do_not_decode,
1366  unsigned ch_used,
1367  int partition_count,
1368  int ptns_to_read
1369  )
1370 {
1371  vorbis_codebook *codebook = vc->codebooks + vr->classbook;
1372  int p, j, i;
1373  unsigned c_p_c = codebook->dimensions;
1374  unsigned inverse_class = ff_inverse[vr->classifications];
1375  int temp, temp2;
1376  for (p = 0, j = 0; j < ch_used; ++j) {
1377  if (!do_not_decode[j]) {
1378  temp = get_vlc2(&vc->gb, codebook->vlc.table,
1379  codebook->nb_bits, 3);
1380 
1381  ff_dlog(NULL, "Classword: %u\n", temp);
1382 
1383  av_assert0(temp < 65536);
1384 
1385  if (temp < 0) {
1386  av_log(vc->avctx, AV_LOG_ERROR,
1387  "Invalid vlc code decoding %d channel.", j);
1388  return AVERROR_INVALIDDATA;
1389  }
1390 
1391  if (vr->classifications == 1) {
1392  for (i = partition_count + c_p_c - 1; i >= partition_count; i--) {
1393  if (i < ptns_to_read)
1394  vr->classifs[p + i] = 0;
1395  }
1396  } else {
1397  for (i = partition_count + c_p_c - 1; i >= partition_count; i--) {
1398  temp2 = (((uint64_t)temp) * inverse_class) >> 32;
1399 
1400  if (i < ptns_to_read)
1401  vr->classifs[p + i] = temp - temp2 * vr->classifications;
1402  temp = temp2;
1403  }
1404  }
1405  }
1406  p += ptns_to_read;
1407  }
1408  return 0;
1409 }
1410 // Read and decode residue
1411 
1412 static av_always_inline int vorbis_residue_decode_internal(vorbis_context *vc,
1413  vorbis_residue *vr,
1414  unsigned ch,
1415  uint8_t *do_not_decode,
1416  float *vec,
1417  unsigned vlen,
1418  unsigned ch_left,
1419  int vr_type)
1420 {
1421  GetBitContext *gb = &vc->gb;
1422  unsigned c_p_c = vc->codebooks[vr->classbook].dimensions;
1423  uint8_t *classifs = vr->classifs;
1424  unsigned pass, ch_used, i, j, k, l;
1425  unsigned max_output = (ch - 1) * vlen;
1426  int ptns_to_read = vr->ptns_to_read;
1427  int libvorbis_bug = 0;
1428 
1429  if (vr_type == 2) {
1430  for (j = 1; j < ch; ++j)
1431  do_not_decode[0] &= do_not_decode[j]; // FIXME - clobbering input
1432  if (do_not_decode[0])
1433  return 0;
1434  ch_used = 1;
1435  max_output += vr->end / ch;
1436  } else {
1437  ch_used = ch;
1438  max_output += vr->end;
1439  }
1440 
1441  if (max_output > ch_left * vlen) {
1442  if (max_output <= ch_left * vlen + vr->partition_size*ch_used/ch) {
1443  ptns_to_read--;
1444  libvorbis_bug = 1;
1445  } else {
1446  av_log(vc->avctx, AV_LOG_ERROR, "Insufficient output buffer\n");
1447  return AVERROR_INVALIDDATA;
1448  }
1449  }
1450 
1451  ff_dlog(NULL, " residue type 0/1/2 decode begin, ch: %d cpc %d \n", ch, c_p_c);
1452 
1453  for (pass = 0; pass <= vr->maxpass; ++pass) { // FIXME OPTIMIZE?
1454  int voffset, partition_count, j_times_ptns_to_read;
1455 
1456  voffset = vr->begin;
1457  for (partition_count = 0; partition_count < ptns_to_read;) { // SPEC error
1458  if (!pass) {
1459  int ret = setup_classifs(vc, vr, do_not_decode, ch_used, partition_count, ptns_to_read);
1460  if (ret < 0)
1461  return ret;
1462  }
1463  for (i = 0; (i < c_p_c) && (partition_count < ptns_to_read); ++i) {
1464  for (j_times_ptns_to_read = 0, j = 0; j < ch_used; ++j) {
1465  unsigned voffs;
1466 
1467  if (!do_not_decode[j]) {
1468  unsigned vqclass = classifs[j_times_ptns_to_read + partition_count];
1469  int vqbook = vr->books[vqclass][pass];
1470 
1471  if (vqbook >= 0 && vc->codebooks[vqbook].codevectors) {
1472  int coffs;
1473  unsigned dim = vc->codebooks[vqbook].dimensions;
1474  unsigned step = FASTDIV(vr->partition_size << 1, dim << 1);
1475  vorbis_codebook codebook = vc->codebooks[vqbook];
1476 
1477  if (get_bits_left(gb) < 0) {
1478  av_log(vc->avctx, AV_LOG_ERROR, "Overread %d bits\n", -get_bits_left(gb));
1479  return 0;
1480  }
1481 
1482  if (vr_type == 0) {
1483 
1484  voffs = voffset+j*vlen;
1485  for (k = 0; k < step; ++k) {
1486  coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3);
1487  if (coffs < 0)
1488  return coffs;
1489  coffs *= dim;
1490  for (l = 0; l < dim; ++l)
1491  vec[voffs + k + l * step] += codebook.codevectors[coffs + l];
1492  }
1493  } else if (vr_type == 1) {
1494  voffs = voffset + j * vlen;
1495  for (k = 0; k < step; ++k) {
1496  coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3);
1497  if (coffs < 0)
1498  return coffs;
1499  coffs *= dim;
1500  for (l = 0; l < dim; ++l, ++voffs) {
1501  vec[voffs]+=codebook.codevectors[coffs+l];
1502 
1503  ff_dlog(NULL, " pass %d offs: %d curr: %f change: %f cv offs.: %d \n",
1504  pass, voffs, vec[voffs], codebook.codevectors[coffs+l], coffs);
1505  }
1506  }
1507  } else if (vr_type == 2 && ch == 2 && (voffset & 1) == 0 && (dim & 1) == 0) { // most frequent case optimized
1508  voffs = voffset >> 1;
1509 
1510  if (dim == 2) {
1511  for (k = 0; k < step; ++k) {
1512  coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3);
1513  if (coffs < 0)
1514  return coffs;
1515  coffs *= 2;
1516  vec[voffs + k ] += codebook.codevectors[coffs ];
1517  vec[voffs + k + vlen] += codebook.codevectors[coffs + 1];
1518  }
1519  } else if (dim == 4) {
1520  for (k = 0; k < step; ++k, voffs += 2) {
1521  coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3);
1522  if (coffs < 0)
1523  return coffs;
1524  coffs *= 4;
1525  vec[voffs ] += codebook.codevectors[coffs ];
1526  vec[voffs + 1 ] += codebook.codevectors[coffs + 2];
1527  vec[voffs + vlen ] += codebook.codevectors[coffs + 1];
1528  vec[voffs + vlen + 1] += codebook.codevectors[coffs + 3];
1529  }
1530  } else
1531  for (k = 0; k < step; ++k) {
1532  coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3);
1533  if (coffs < 0)
1534  return coffs;
1535  coffs *= dim;
1536  for (l = 0; l < dim; l += 2, voffs++) {
1537  vec[voffs ] += codebook.codevectors[coffs + l ];
1538  vec[voffs + vlen] += codebook.codevectors[coffs + l + 1];
1539 
1540  ff_dlog(NULL, " pass %d offs: %d curr: %f change: %f cv offs.: %d+%d \n",
1541  pass, voffset / ch + (voffs % ch) * vlen,
1542  vec[voffset / ch + (voffs % ch) * vlen],
1543  codebook.codevectors[coffs + l], coffs, l);
1544  }
1545  }
1546 
1547  } else if (vr_type == 2) {
1548  unsigned voffs_div = ch == 1 ? voffset : FASTDIV(voffset, ch);
1549  unsigned voffs_mod = voffset - voffs_div * ch;
1550 
1551  for (k = 0; k < step; ++k) {
1552  coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3);
1553  if (coffs < 0)
1554  return coffs;
1555  coffs *= dim;
1556  for (l = 0; l < dim; ++l) {
1557  vec[voffs_div + voffs_mod * vlen] +=
1558  codebook.codevectors[coffs + l];
1559 
1560  ff_dlog(NULL, " pass %d offs: %d curr: %f change: %f cv offs.: %d+%d \n",
1561  pass, voffs_div + voffs_mod * vlen,
1562  vec[voffs_div + voffs_mod * vlen],
1563  codebook.codevectors[coffs + l], coffs, l);
1564 
1565  if (++voffs_mod == ch) {
1566  voffs_div++;
1567  voffs_mod = 0;
1568  }
1569  }
1570  }
1571  }
1572  }
1573  }
1574  j_times_ptns_to_read += ptns_to_read;
1575  }
1576  ++partition_count;
1577  voffset += vr->partition_size;
1578  }
1579  }
1580  if (libvorbis_bug && !pass) {
1581  for (j = 0; j < ch_used; ++j) {
1582  if (!do_not_decode[j]) {
1583  get_vlc2(&vc->gb, vc->codebooks[vr->classbook].vlc.table,
1584  vc->codebooks[vr->classbook].nb_bits, 3);
1585  }
1586  }
1587  }
1588  }
1589  return 0;
1590 }
1591 
1592 static inline int vorbis_residue_decode(vorbis_context *vc, vorbis_residue *vr,
1593  unsigned ch,
1594  uint8_t *do_not_decode,
1595  float *vec, unsigned vlen,
1596  unsigned ch_left)
1597 {
1598  if (vr->type == 2)
1599  return vorbis_residue_decode_internal(vc, vr, ch, do_not_decode, vec, vlen, ch_left, 2);
1600  else if (vr->type == 1)
1601  return vorbis_residue_decode_internal(vc, vr, ch, do_not_decode, vec, vlen, ch_left, 1);
1602  else if (vr->type == 0)
1603  return vorbis_residue_decode_internal(vc, vr, ch, do_not_decode, vec, vlen, ch_left, 0);
1604  else {
1605  av_log(vc->avctx, AV_LOG_ERROR, " Invalid residue type while residue decode?! \n");
1606  return AVERROR_INVALIDDATA;
1607  }
1608 }
1609 
1610 // Decode the audio packet using the functions above
1611 
1612 static int vorbis_parse_audio_packet(vorbis_context *vc, float **floor_ptr)
1613 {
1614  GetBitContext *gb = &vc->gb;
1615  AVTXContext *mdct;
1616  av_tx_fn mdct_fn;
1617  int previous_window = vc->previous_window;
1618  unsigned mode_number, blockflag, blocksize;
1619  int i, j;
1620  uint8_t no_residue[255];
1621  uint8_t do_not_decode[255];
1622  vorbis_mapping *mapping;
1623  float *ch_res_ptr = vc->channel_residues;
1624  uint8_t res_chan[255];
1625  unsigned res_num = 0;
1626  int retlen = 0;
1627  unsigned ch_left = vc->audio_channels;
1628  unsigned vlen;
1629 
1630  if (get_bits1(gb)) {
1631  av_log(vc->avctx, AV_LOG_ERROR, "Not a Vorbis I audio packet.\n");
1632  return AVERROR_INVALIDDATA; // packet type not audio
1633  }
1634 
1635  if (vc->mode_count == 1) {
1636  mode_number = 0;
1637  } else {
1638  GET_VALIDATED_INDEX(mode_number, ilog(vc->mode_count-1), vc->mode_count)
1639  }
1640  vc->mode_number = mode_number;
1641  mapping = &vc->mappings[vc->modes[mode_number].mapping];
1642 
1643  ff_dlog(NULL, " Mode number: %u , mapping: %d , blocktype %d\n", mode_number,
1644  vc->modes[mode_number].mapping, vc->modes[mode_number].blockflag);
1645 
1646  blockflag = vc->modes[mode_number].blockflag;
1647  blocksize = vc->blocksize[blockflag];
1648  vlen = blocksize / 2;
1649  if (blockflag) {
1650  int code = get_bits(gb, 2);
1651  if (previous_window < 0)
1652  previous_window = code>>1;
1653  } else if (previous_window < 0)
1654  previous_window = 0;
1655 
1656  memset(ch_res_ptr, 0, sizeof(float) * vc->audio_channels * vlen); //FIXME can this be removed ?
1657  for (i = 0; i < vc->audio_channels; ++i)
1658  memset(floor_ptr[i], 0, vlen * sizeof(floor_ptr[0][0])); //FIXME can this be removed ?
1659 
1660 // Decode floor
1661 
1662  for (i = 0; i < vc->audio_channels; ++i) {
1664  int ret;
1665  if (mapping->submaps > 1) {
1666  floor = &vc->floors[mapping->submap_floor[mapping->mux[i]]];
1667  } else {
1668  floor = &vc->floors[mapping->submap_floor[0]];
1669  }
1670 
1671  ret = floor->decode(vc, &floor->data, floor_ptr[i]);
1672 
1673  if (ret < 0) {
1674  av_log(vc->avctx, AV_LOG_ERROR, "Invalid codebook in vorbis_floor_decode.\n");
1675  return AVERROR_INVALIDDATA;
1676  }
1677  no_residue[i] = ret;
1678  }
1679 
1680 // Nonzero vector propagate
1681 
1682  for (i = mapping->coupling_steps - 1; i >= 0; --i) {
1683  if (!(no_residue[mapping->magnitude[i]] & no_residue[mapping->angle[i]])) {
1684  no_residue[mapping->magnitude[i]] = 0;
1685  no_residue[mapping->angle[i]] = 0;
1686  }
1687  }
1688 
1689 // Decode residue
1690 
1691  for (i = 0; i < mapping->submaps; ++i) {
1692  vorbis_residue *residue;
1693  unsigned ch = 0;
1694  int ret;
1695 
1696  for (j = 0; j < vc->audio_channels; ++j) {
1697  if ((mapping->submaps == 1) || (i == mapping->mux[j])) {
1698  res_chan[j] = res_num;
1699  if (no_residue[j]) {
1700  do_not_decode[ch] = 1;
1701  } else {
1702  do_not_decode[ch] = 0;
1703  }
1704  ++ch;
1705  ++res_num;
1706  }
1707  }
1708  residue = &vc->residues[mapping->submap_residue[i]];
1709  if (ch_left < ch) {
1710  av_log(vc->avctx, AV_LOG_ERROR, "Too many channels in vorbis_floor_decode.\n");
1711  return AVERROR_INVALIDDATA;
1712  }
1713  if (ch) {
1714  ret = vorbis_residue_decode(vc, residue, ch, do_not_decode, ch_res_ptr, vlen, ch_left);
1715  if (ret < 0)
1716  return ret;
1717  }
1718 
1719  ch_res_ptr += ch * vlen;
1720  ch_left -= ch;
1721  }
1722 
1723  if (ch_left > 0)
1724  return AVERROR_INVALIDDATA;
1725 
1726 // Inverse coupling
1727 
1728  for (i = mapping->coupling_steps - 1; i >= 0; --i) { //warning: i has to be signed
1729  float *mag, *ang;
1730 
1731  mag = vc->channel_residues+res_chan[mapping->magnitude[i]] * blocksize / 2;
1732  ang = vc->channel_residues+res_chan[mapping->angle[i]] * blocksize / 2;
1733  vc->dsp.vorbis_inverse_coupling(mag, ang, blocksize / 2);
1734  }
1735 
1736 // Dotproduct, MDCT
1737 
1738  mdct = vc->mdct[blockflag];
1739  mdct_fn = vc->mdct_fn[blockflag];
1740 
1741  for (j = vc->audio_channels-1;j >= 0; j--) {
1742  ch_res_ptr = vc->channel_residues + res_chan[j] * blocksize / 2;
1743  vc->fdsp->vector_fmul(floor_ptr[j], floor_ptr[j], ch_res_ptr, blocksize / 2);
1744  mdct_fn(mdct, ch_res_ptr, floor_ptr[j], sizeof(float));
1745  }
1746 
1747 // Overlap/add, save data for next overlapping
1748 
1749  retlen = (blocksize + vc->blocksize[previous_window]) / 4;
1750  for (j = 0; j < vc->audio_channels; j++) {
1751  unsigned bs0 = vc->blocksize[0];
1752  unsigned bs1 = vc->blocksize[1];
1753  float *residue = vc->channel_residues + res_chan[j] * blocksize / 2;
1754  float *saved = vc->saved + j * bs1 / 4;
1755  float *ret = floor_ptr[j];
1756  float *buf = residue;
1757  const float *win = vc->win[blockflag & previous_window];
1758 
1759  if (blockflag == previous_window) {
1760  vc->fdsp->vector_fmul_window(ret, saved, buf, win, blocksize / 4);
1761  } else if (blockflag > previous_window) {
1762  vc->fdsp->vector_fmul_window(ret, saved, buf, win, bs0 / 4);
1763  memcpy(ret+bs0/2, buf+bs0/4, ((bs1-bs0)/4) * sizeof(float));
1764  } else {
1765  memcpy(ret, saved, ((bs1 - bs0) / 4) * sizeof(float));
1766  vc->fdsp->vector_fmul_window(ret + (bs1 - bs0) / 4, saved + (bs1 - bs0) / 4, buf, win, bs0 / 4);
1767  }
1768  memcpy(saved, buf + blocksize / 4, blocksize / 4 * sizeof(float));
1769  }
1770 
1771  vc->previous_window = blockflag;
1772  return retlen;
1773 }
1774 
1775 // Return the decoded audio packet through the standard api
1776 
1778  int *got_frame_ptr, AVPacket *avpkt)
1779 {
1780  const uint8_t *buf = avpkt->data;
1781  int buf_size = avpkt->size;
1782  vorbis_context *vc = avctx->priv_data;
1783  GetBitContext *gb = &vc->gb;
1784  float *channel_ptrs[255];
1785  int i, len, ret;
1786 
1787  ff_dlog(NULL, "packet length %d \n", buf_size);
1788 
1789  if (*buf == 1 && buf_size > 7) {
1790  if ((ret = init_get_bits8(gb, buf + 1, buf_size - 1)) < 0)
1791  return ret;
1792 
1793  vorbis_free(vc);
1794  if ((ret = vorbis_parse_id_hdr(vc))) {
1795  av_log(avctx, AV_LOG_ERROR, "Id header corrupt.\n");
1796  vorbis_free(vc);
1797  return ret;
1798  }
1799 
1801  if (vc->audio_channels > 8) {
1803  avctx->ch_layout.nb_channels = vc->audio_channels;
1804  } else {
1805  av_channel_layout_copy(&avctx->ch_layout, &ff_vorbis_ch_layouts[vc->audio_channels - 1]);
1806  }
1807 
1808  avctx->sample_rate = vc->audio_samplerate;
1809  return buf_size;
1810  }
1811 
1812  if (*buf == 3 && buf_size > 7) {
1813  av_log(avctx, AV_LOG_DEBUG, "Ignoring comment header\n");
1814  return buf_size;
1815  }
1816 
1817  if (*buf == 5 && buf_size > 7 && vc->channel_residues && !vc->modes) {
1818  if ((ret = init_get_bits8(gb, buf + 1, buf_size - 1)) < 0)
1819  return ret;
1820 
1821  if ((ret = vorbis_parse_setup_hdr(vc))) {
1822  av_log(avctx, AV_LOG_ERROR, "Setup header corrupt.\n");
1823  vorbis_free(vc);
1824  return ret;
1825  }
1826  return buf_size;
1827  }
1828 
1829  if (!vc->channel_residues || !vc->modes) {
1830  av_log(avctx, AV_LOG_ERROR, "Data packet before valid headers\n");
1831  return AVERROR_INVALIDDATA;
1832  }
1833 
1834  /* get output buffer */
1835  frame->nb_samples = vc->blocksize[1] / 2;
1836  if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
1837  return ret;
1838 
1839  if (vc->audio_channels > 8) {
1840  for (i = 0; i < vc->audio_channels; i++)
1841  channel_ptrs[i] = (float *)frame->extended_data[i];
1842  } else {
1843  for (i = 0; i < vc->audio_channels; i++) {
1844  int ch = ff_vorbis_channel_layout_offsets[vc->audio_channels - 1][i];
1845  channel_ptrs[ch] = (float *)frame->extended_data[i];
1846  }
1847  }
1848 
1849  if ((ret = init_get_bits8(gb, buf, buf_size)) < 0)
1850  return ret;
1851 
1852  if ((len = vorbis_parse_audio_packet(vc, channel_ptrs)) <= 0)
1853  return len;
1854 
1855  if (!vc->first_frame) {
1856  vc->first_frame = 1;
1857  avctx->internal->skip_samples = len;
1858  }
1859 
1860  ff_dlog(NULL, "parsed %d bytes %d bits, returned %d samples (*ch*bits) \n",
1861  get_bits_count(gb) / 8, get_bits_count(gb) % 8, len);
1862 
1863  frame->nb_samples = len;
1864  *got_frame_ptr = 1;
1865 
1866  return buf_size;
1867 }
1868 
1869 // Close decoder
1870 
1872 {
1873  vorbis_context *vc = avctx->priv_data;
1874 
1875  vorbis_free(vc);
1876 
1877  return 0;
1878 }
1879 
1881 {
1882  vorbis_context *vc = avctx->priv_data;
1883 
1884  if (vc->saved) {
1885  memset(vc->saved, 0, (vc->blocksize[1] / 4) * vc->audio_channels *
1886  sizeof(*vc->saved));
1887  }
1888  vc->previous_window = -1;
1889  vc->first_frame = 0;
1890 }
1891 
1893  .p.name = "vorbis",
1894  CODEC_LONG_NAME("Vorbis"),
1895  .p.type = AVMEDIA_TYPE_AUDIO,
1896  .p.id = AV_CODEC_ID_VORBIS,
1897  .priv_data_size = sizeof(vorbis_context),
1901  .flush = vorbis_decode_flush,
1902  .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF,
1903  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1904 };
error
static void error(const char *err)
Definition: target_bsf_fuzzer.c:32
ff_vorbis_decoder
const FFCodec ff_vorbis_decoder
Definition: vorbisdec.c:1892
AV_SAMPLE_FMT_FLTP
@ AV_SAMPLE_FMT_FLTP
float, planar
Definition: samplefmt.h:66
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
BARK
#define BARK(x)
Definition: vorbisdec.c:165
vorbis_floor::vorbis_floor_u::vorbis_floor0_s::bark_map_size
uint16_t bark_map_size
Definition: vorbisdec.c:76
create_map
static int create_map(vorbis_context *vc, unsigned floor_number)
Definition: vorbisdec.c:860
vorbis_mapping::angle
uint8_t * angle
Definition: vorbisdec.c:116
FF_CODEC_CAP_INIT_CLEANUP
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Definition: codec_internal.h:43
vorbis_context_s::mdct
AVTXContext * mdct[2]
Definition: vorbisdec.c:135
vorbis_floor::floor_type
uint8_t floor_type
Definition: vorbisdec.c:70
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:688
vorbis_decode_close
static av_cold int vorbis_decode_close(AVCodecContext *avctx)
Definition: vorbisdec.c:1871
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
vorbis_mode
Definition: vorbisdec.c:122
vorbis_context_s::codebook_count
uint16_t codebook_count
Definition: vorbisdec.c:147
vorbis_mapping::submaps
uint8_t submaps
Definition: vorbisdec.c:113
vorbis_residue::maxpass
uint8_t maxpass
Definition: vorbisdec.c:107
AVCodecContext::sample_rate
int sample_rate
samples per second
Definition: avcodec.h:1036
cb
static double cb(void *priv, double x, double y)
Definition: vf_geq.c:247
vorbis_floor::vorbis_floor_u::t0
struct vorbis_floor::vorbis_floor_u::vorbis_floor0_s t0
vorbis_context_s::residue_count
uint8_t residue_count
Definition: vorbisdec.c:151
ff_vorbis_ready_floor1_list
int ff_vorbis_ready_floor1_list(void *logctx, vorbis_floor1_entry *list, int values)
Definition: vorbis.c:109
AVTXContext
Definition: tx_priv.h:235
AVCodecInternal::skip_samples
int skip_samples
Number of audio samples to skip at the start of the next decoded frame.
Definition: internal.h:125
get_bits_long
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
Definition: get_bits.h:424
vorbis_context_s::fdsp
AVFloatDSPContext * fdsp
Definition: vorbisdec.c:133
vorbis_context_s::version
uint32_t version
Definition: vorbisdec.c:139
vorbis_floor::vorbis_floor_u
Definition: vorbisdec.c:72
vorbis_mode::transformtype
uint16_t transformtype
Definition: vorbisdec.c:125
vorbis_floor::vorbis_floor_u::vorbis_floor0_s::map
int32_t * map[2]
Definition: vorbisdec.c:77
get_bits_count
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:254
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:434
step
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about which is also called distortion Distortion can be quantified by almost any quality measurement one chooses the sum of squared differences is used but more complex methods that consider psychovisual effects can be used as well It makes no difference in this discussion First step
Definition: rate_distortion.txt:58
internal.h
AVPacket::data
uint8_t * data
Definition: packet.h:595
GET_VALIDATED_INDEX
#define GET_VALIDATED_INDEX(idx, bits, limit)
Definition: vorbisdec.c:176
data
const char data[16]
Definition: mxf.c:149
vorbisfloat2float
static float vorbisfloat2float(unsigned val)
Definition: vorbisdec.c:182
idx_err_str
static const char idx_err_str[]
Definition: vorbisdec.c:168
vorbis_floor1
struct vorbis_floor1_s vorbis_floor1
Definition: vorbisdec.c:64
vorbis_context_s::previous_window
int8_t previous_window
Definition: vorbisdec.c:158
FFCodec
Definition: codec_internal.h:127
vorbis_floor::vorbis_floor_u::vorbis_floor1_s::class_subclasses
uint8_t class_subclasses[16]
Definition: vorbisdec.c:89
vorbis_residue_decode
static int vorbis_residue_decode(vorbis_context *vc, vorbis_residue *vr, unsigned ch, uint8_t *do_not_decode, float *vec, unsigned vlen, unsigned ch_left)
Definition: vorbisdec.c:1592
AVChannelLayout::order
enum AVChannelOrder order
Channel order used in this layout.
Definition: channel_layout.h:324
vorbis_residue::books
int16_t books[64][8]
Definition: vorbisdec.c:106
AVChannelLayout::nb_channels
int nb_channels
Number of channels in this layout.
Definition: channel_layout.h:329
ff_inverse
const uint32_t ff_inverse[257]
Definition: mathtables.c:66
vorbis_floor1_entry::x
uint16_t x
Definition: vorbis.h:27
vorbis_data.h
init_get_bits
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:517
av_tx_init
av_cold int av_tx_init(AVTXContext **ctx, av_tx_fn *tx, enum AVTXType type, int inv, int len, const void *scale, uint64_t flags)
Initialize a transform context with the given configuration (i)MDCTs with an odd length are currently...
Definition: tx.c:903
ff_vorbis_nth_root
unsigned int ff_vorbis_nth_root(unsigned int x, unsigned int n)
Definition: vorbis.c:41
vorbis_free
static void vorbis_free(vorbis_context *vc)
Definition: vorbisdec.c:194
xiph.h
win
static float win(SuperEqualizerContext *s, float n, int N)
Definition: af_superequalizer.c:119
skip_bits
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:383
close
static av_cold void close(AVCodecParserContext *s)
Definition: apv_parser.c:197
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:337
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
AVCodecContext::ch_layout
AVChannelLayout ch_layout
Audio channel layout.
Definition: avcodec.h:1051
GetBitContext
Definition: get_bits.h:109
ff_vorbis_floor1_render_list
void ff_vorbis_floor1_render_list(vorbis_floor1_entry *list, int values, uint16_t *y_list, int *flag, int multiplier, float *out, int samples)
Definition: vorbis.c:199
val
static double val(void *priv, double ch)
Definition: aeval.c:77
vorbis_floor::data
union vorbis_floor::vorbis_floor_u data
vorbis_floor_decode_func
int(* vorbis_floor_decode_func)(struct vorbis_context_s *, vorbis_floor_data *, float *)
Definition: vorbisdec.c:68
vorbis_parse_id_hdr
static int vorbis_parse_id_hdr(vorbis_context *vc)
Definition: vorbisdec.c:975
VorbisDSPContext
Definition: vorbisdsp.h:24
vorbis_context_s::gb
GetBitContext gb
Definition: vorbisdec.c:131
avassert.h
vorbis_residue::classbook
uint8_t classbook
Definition: vorbisdec.c:105
vorbis_floor::vorbis_floor_u::vorbis_floor1_s::partition_class
uint8_t partition_class[32]
Definition: vorbisdec.c:87
V_MAX_PARTITIONS
#define V_MAX_PARTITIONS
Definition: vorbisdec.c:51
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
av_cold
#define av_cold
Definition: attributes.h:111
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:544
av_tx_fn
void(* av_tx_fn)(AVTXContext *s, void *out, void *in, ptrdiff_t stride)
Function pointer to a function to perform the transform.
Definition: tx.h:151
vorbis_floor1_entry
Definition: vorbis.h:26
vorbis_context_s::mode_number
uint8_t mode_number
Definition: vorbisdec.c:157
AVCodecContext::extradata_size
int extradata_size
Definition: avcodec.h:523
AV_TX_FLOAT_MDCT
@ AV_TX_FLOAT_MDCT
Standard MDCT with a sample data type of float, double or int32_t, respectively.
Definition: tx.h:68
vorbis_context_s::audio_samplerate
uint32_t audio_samplerate
Definition: vorbisdec.c:141
FF_CODEC_DECODE_CB
#define FF_CODEC_DECODE_CB(func)
Definition: codec_internal.h:347
VLC_INIT_LE
#define VLC_INIT_LE
Definition: vlc.h:197
floor
static __device__ float floor(float a)
Definition: cuda_runtime.h:173
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:201
AV_CHANNEL_ORDER_UNSPEC
@ AV_CHANNEL_ORDER_UNSPEC
Only the channel count is specified, without any further information about the channel order.
Definition: channel_layout.h:119
vorbis_floor::vorbis_floor_u::vorbis_floor0_s::lsp
float * lsp
Definition: vorbisdec.c:83
vorbis_parse_setup_hdr_tdtransforms
static int vorbis_parse_setup_hdr_tdtransforms(vorbis_context *vc)
Definition: vorbisdec.c:483
vorbis_codebook::nb_bits
unsigned int nb_bits
Definition: vorbisdec.c:59
vorbis_parse_audio_packet
static int vorbis_parse_audio_packet(vorbis_context *vc, float **floor_ptr)
Definition: vorbisdec.c:1612
bits
uint8_t bits
Definition: vp3data.h:128
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:42
ff_vorbis_len2vlc
int ff_vorbis_len2vlc(uint8_t *bits, uint32_t *codes, unsigned num)
Definition: vorbis.c:59
vlc_init
#define vlc_init(vlc, nb_bits, nb_codes, bits, bits_wrap, bits_size, codes, codes_wrap, codes_size, flags)
Definition: vlc.h:70
vorbis_floor::vorbis_floor_u::vorbis_floor1_s::partitions
uint8_t partitions
Definition: vorbisdec.c:86
vorbis_mode::windowtype
uint16_t windowtype
Definition: vorbisdec.c:124
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
headers
FFmpeg currently uses a custom build this text attempts to document some of its obscure features and options Makefile the full command issued by make and its output will be shown on the screen DESTDIR Destination directory for the install useful to prepare packages or install FFmpeg in cross environments GEN Set to ‘1’ to generate the missing or mismatched references Makefile builds all the libraries and the executables fate Run the fate test note that you must have installed it fate list List all fate regression test targets fate list failing List the fate tests that failed the last time they were executed fate clear reports Remove the test reports from previous test libraries and programs examples Build all examples located in doc examples checkheaders Check headers dependencies alltools Build all tools in tools directory config Reconfigure the project with the current configuration tools target_dec_< decoder > _fuzzer Build fuzzer to fuzz the specified decoder tools target_bsf_< filter > _fuzzer Build fuzzer to fuzz the specified bitstream filter Useful standard make this is useful to reduce unneeded rebuilding when changing headers
Definition: build_system.txt:59
decode.h
get_bits.h
vorbis_context_s::bitrate_nominal
uint32_t bitrate_nominal
Definition: vorbisdec.c:143
isfinite
#define isfinite(x)
Definition: libm.h:361
vorbis_context_s::blocksize
uint32_t blocksize[2]
Definition: vorbisdec.c:145
av_mallocz
#define av_mallocz(s)
Definition: tableprint_vlc.h:31
vorbis_context_s::floors
vorbis_floor * floors
Definition: vorbisdec.c:150
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:332
vorbis_codebook::codevectors
float * codevectors
Definition: vorbisdec.c:58
vorbis_parse_setup_hdr_residues
static int vorbis_parse_setup_hdr_residues(vorbis_context *vc)
Definition: vorbisdec.c:699
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:74
if
if(ret)
Definition: filter_design.txt:179
ldexpf
#define ldexpf(x, exp)
Definition: libm.h:391
vorbis_residue::ptns_to_read
uint16_t ptns_to_read
Definition: vorbisdec.c:108
NULL
#define NULL
Definition: coverity.c:32
vorbis_mapping::mux
uint8_t * mux
Definition: vorbisdec.c:117
vorbis_context_s::audio_channels
uint8_t audio_channels
Definition: vorbisdec.c:140
VALIDATE_INDEX
#define VALIDATE_INDEX(idx, limit)
Definition: vorbisdec.c:169
AVCodecContext::internal
struct AVCodecInternal * internal
Private context used for internal data.
Definition: avcodec.h:474
vorbis_context_s::win
const float * win[2]
Definition: vorbisdec.c:146
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:391
vorbis_floor0_decode
static int vorbis_floor0_decode(vorbis_context *vc, vorbis_floor_data *vfu, float *vec)
Definition: vorbisdec.c:1122
vorbis_context_s::modes
vorbis_mode * modes
Definition: vorbisdec.c:156
FASTDIV
#define FASTDIV(a, b)
Definition: mathops.h:216
vorbis_floor_data
union vorbis_floor_u vorbis_floor_data
Definition: vorbisdec.c:62
vorbis_parse_setup_hdr
static int vorbis_parse_setup_hdr(vorbis_context *vc)
Definition: vorbisdec.c:929
exp
int8_t exp
Definition: eval.c:76
get_vlc2
static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, int bits, int max_depth)
Parse a vlc code.
Definition: get_bits.h:645
vorbis_mapping
Definition: vorbisdec.c:112
float_dsp.h
vorbis_floor0
struct vorbis_floor0_s vorbis_floor0
Definition: vorbisdec.c:63
vorbis_mapping::coupling_steps
uint16_t coupling_steps
Definition: vorbisdec.c:114
vorbis_decode_init
static av_cold int vorbis_decode_init(AVCodecContext *avctx)
Definition: vorbisdec.c:1055
vorbis_floor
Definition: vorbisdec.c:69
AV_CODEC_CAP_CHANNEL_CONF
#define AV_CODEC_CAP_CHANNEL_CONF
Codec should fill in channel configuration and samplerate instead of container.
Definition: codec.h:91
vorbis_mapping::submap_residue
uint8_t submap_residue[16]
Definition: vorbisdec.c:119
ff_dlog
#define ff_dlog(a,...)
Definition: tableprint_vlc.h:28
vorbis_decode_frame
static int vorbis_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt)
Definition: vorbisdec.c:1777
vorbis_floor::vorbis_floor_u::vorbis_floor0_s::amplitude_bits
uint8_t amplitude_bits
Definition: vorbisdec.c:79
f
f
Definition: af_crystalizer.c:122
ff_get_buffer
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: decode.c:1765
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:550
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
vorbis_mode::blockflag
uint8_t blockflag
Definition: vorbisdec.c:123
AVPacket::size
int size
Definition: packet.h:596
vorbis_parse_setup_hdr_floors
static int vorbis_parse_setup_hdr_floors(vorbis_context *vc)
Definition: vorbisdec.c:509
codec_internal.h
vorbis_floor::vorbis_floor_u::vorbis_floor0_s::map_size
uint32_t map_size[2]
Definition: vorbisdec.c:78
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
AVCodecContext::sample_fmt
enum AVSampleFormat sample_fmt
audio sample format
Definition: avcodec.h:1043
vorbis_floor::vorbis_floor_u::vorbis_floor1_s::multiplier
uint8_t multiplier
Definition: vorbisdec.c:92
vorbisdsp.h
vorbis_codebook::vlc
VLC vlc
Definition: vorbisdec.c:57
vorbis_floor::vorbis_floor_u::vorbis_floor1_s::class_dimensions
uint8_t class_dimensions[16]
Definition: vorbisdec.c:88
AVFloatDSPContext
Definition: float_dsp.h:24
range
enum AVColorRange range
Definition: mediacodec_wrapper.c:2594
vorbis_context_s::bitrate_minimum
uint32_t bitrate_minimum
Definition: vorbisdec.c:144
vorbis_floor::vorbis_floor_u::vorbis_floor1_s::x_list_dim
uint16_t x_list_dim
Definition: vorbisdec.c:93
vorbis_mode::mapping
uint8_t mapping
Definition: vorbisdec.c:126
vorbis_floor::vorbis_floor_u::vorbis_floor1_s::class_masterbook
uint8_t class_masterbook[16]
Definition: vorbisdec.c:90
vorbis_floor::vorbis_floor_u::vorbis_floor1_s::subclass_books
int16_t subclass_books[16][8]
Definition: vorbisdec.c:91
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
vorbis_codebook::maxdepth
uint8_t maxdepth
Definition: vorbisdec.c:56
vorbis_floor1_decode
static int vorbis_floor1_decode(vorbis_context *vc, vorbis_floor_data *vfu, float *vec)
Definition: vorbisdec.c:1236
vorbis_residue
Definition: vorbisdec.c:99
vorbis_residue::end
uint32_t end
Definition: vorbisdec.c:102
M_PI
#define M_PI
Definition: mathematics.h:67
av_tx_uninit
av_cold void av_tx_uninit(AVTXContext **ctx)
Frees a context and sets *ctx to NULL, does nothing when *ctx == NULL.
Definition: tx.c:295
ff_vorbis_channel_layout_offsets
const uint8_t ff_vorbis_channel_layout_offsets[8][8]
Definition: vorbis_data.c:26
vorbis_context_s::dsp
VorbisDSPContext dsp
Definition: vorbisdec.c:132
get_bits64
static uint64_t get_bits64(GetBitContext *s, int n)
Read 0-64 bits.
Definition: get_bits.h:456
vorbis_residue::type
uint16_t type
Definition: vorbisdec.c:100
av_malloc
#define av_malloc(s)
Definition: ops_asmgen.c:44
code
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some it can consider them to be part of the FIFO and delay acknowledging a status change accordingly Example code
Definition: filter_design.txt:178
vorbis.h
AVCodecContext::extradata
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
Definition: avcodec.h:522
vorbis_context_s::floor_count
uint8_t floor_count
Definition: vorbisdec.c:149
vorbis_context_s::codebooks
vorbis_codebook * codebooks
Definition: vorbisdec.c:148
vorbis_residue_decode_internal
static av_always_inline int vorbis_residue_decode_internal(vorbis_context *vc, vorbis_residue *vr, unsigned ch, uint8_t *do_not_decode, float *vec, unsigned vlen, unsigned ch_left, int vr_type)
Definition: vorbisdec.c:1412
av_malloc_array
#define av_malloc_array(a, b)
Definition: tableprint_vlc.h:32
V_MAX_VLCS
#define V_MAX_VLCS
Definition: vorbisdec.c:50
vorbis_context_s
Definition: vorbisdec.c:129
av_always_inline
#define av_always_inline
Definition: attributes.h:68
vorbis_parse_setup_hdr_mappings
static int vorbis_parse_setup_hdr_mappings(vorbis_context *vc)
Definition: vorbisdec.c:780
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
vorbis_context_s::residues
vorbis_residue * residues
Definition: vorbisdec.c:152
vorbis_residue::classifications
uint8_t classifications
Definition: vorbisdec.c:104
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:179
len
int len
Definition: vorbis_enc_data.h:426
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:264
vorbis_mapping::submap_floor
uint8_t submap_floor[16]
Definition: vorbisdec.c:118
avcodec.h
vorbis_floor::vorbis_floor_u::vorbis_floor1_s::list
vorbis_floor1_entry * list
Definition: vorbisdec.c:94
dim
int dim
Definition: vorbis_enc_data.h:425
V_NB_BITS
#define V_NB_BITS
Definition: vorbisdec.c:48
ff_vlc_free
void ff_vlc_free(VLC *vlc)
Definition: vlc.c:580
ret
ret
Definition: filter_design.txt:187
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:265
flag
#define flag(name)
Definition: cbs_av1.c:496
vorbis_residue::begin
uint32_t begin
Definition: vorbisdec.c:101
AVCodecContext
main external API structure.
Definition: avcodec.h:439
ilog
#define ilog(i)
Definition: vorbis.h:41
V_NB_BITS2
#define V_NB_BITS2
Definition: vorbisdec.c:49
setup_classifs
static av_always_inline int setup_classifs(vorbis_context *vc, vorbis_residue *vr, uint8_t *do_not_decode, unsigned ch_used, int partition_count, int ptns_to_read)
Definition: vorbisdec.c:1363
vorbis_context_s::avctx
AVCodecContext * avctx
Definition: vorbisdec.c:130
VLC
Definition: vlc.h:50
vorbis_context_s::channel_residues
float * channel_residues
Definition: vorbisdec.c:159
av_channel_layout_uninit
void av_channel_layout_uninit(AVChannelLayout *channel_layout)
Free any allocated data in the channel layout and reset the channel count to 0.
Definition: channel_layout.c:442
vorbis_mapping::magnitude
uint8_t * magnitude
Definition: vorbisdec.c:115
ff_vorbisdsp_init
av_cold void ff_vorbisdsp_init(VorbisDSPContext *dsp)
Definition: vorbisdsp.c:46
vorbis_context_s::mappings
vorbis_mapping * mappings
Definition: vorbisdec.c:154
temp
else temp
Definition: vf_mcdeint.c:271
vorbis_codebook
Definition: vorbisdec.c:53
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
avpriv_split_xiph_headers
int avpriv_split_xiph_headers(const uint8_t *extradata, int extradata_size, int first_header_size, const uint8_t *header_start[3], int header_len[3])
Split a single extradata buffer into the three headers that most Xiph codecs use.
Definition: xiph.c:26
av_clip_uint16
#define av_clip_uint16
Definition: common.h:112
av_channel_layout_copy
int av_channel_layout_copy(AVChannelLayout *dst, const AVChannelLayout *src)
Make a copy of a channel layout.
Definition: channel_layout.c:449
vorbis_context_s::mode_count
uint8_t mode_count
Definition: vorbisdec.c:155
vorbis_codebook::lookup_type
uint8_t lookup_type
Definition: vorbisdec.c:55
mem.h
AV_CODEC_FLAG_BITEXACT
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
Definition: avcodec.h:322
vorbis_context_s::mapping_count
uint8_t mapping_count
Definition: vorbisdec.c:153
vorbis_parse_setup_hdr_codebooks
static int vorbis_parse_setup_hdr_codebooks(vorbis_context *vc)
Definition: vorbisdec.c:244
ff_vorbis_ch_layouts
const AVChannelLayout ff_vorbis_ch_layouts[9]
Definition: vorbis_data.c:37
vorbis_floor::vorbis_floor_u::vorbis_floor0_s::order
uint8_t order
Definition: vorbisdec.c:74
map
const VDPAUPixFmtMap * map
Definition: hwcontext_vdpau.c:71
vorbis_floor::vorbis_floor_u::vorbis_floor0_s::book_list
uint8_t * book_list
Definition: vorbisdec.c:82
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
scale
static void scale(int *out, const int *in, const int w, const int h, const int shift)
Definition: intra.c:278
vorbis_floor::vorbis_floor_u::vorbis_floor1_s
Definition: vorbisdec.c:85
AVPacket
This structure stores compressed data.
Definition: packet.h:572
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:466
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
avpriv_float_dsp_alloc
av_cold AVFloatDSPContext * avpriv_float_dsp_alloc(int bit_exact)
Allocate a float DSP context.
Definition: float_dsp.c:135
vorbis_context_s::bitrate_maximum
uint32_t bitrate_maximum
Definition: vorbisdec.c:142
vorbis_floor::vorbis_floor_u::vorbis_floor0_s::amplitude_offset
uint8_t amplitude_offset
Definition: vorbisdec.c:80
int32_t
int32_t
Definition: audioconvert.c:56
vorbis_context_s::mdct_fn
av_tx_fn mdct_fn[2]
Definition: vorbisdec.c:136
ff_vorbis_vwin
const float *const ff_vorbis_vwin[8]
Definition: vorbis_data.c:2184
vorbis_floor::vorbis_floor_u::vorbis_floor0_s
Definition: vorbisdec.c:73
vorbis_context_s::saved
float * saved
Definition: vorbisdec.c:160
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
AV_CODEC_ID_VORBIS
@ AV_CODEC_ID_VORBIS
Definition: codec_id.h:465
vorbis_residue::classifs
uint8_t * classifs
Definition: vorbisdec.c:109
vorbis_context_s::first_frame
uint8_t first_frame
Definition: vorbisdec.c:138
vorbis_floor::decode
vorbis_floor_decode_func decode
Definition: vorbisdec.c:71
vf
uint8_t ptrdiff_t const uint8_t ptrdiff_t int const int8_t const int8_t * vf
Definition: dsp.h:262
vorbis_decode_flush
static av_cold void vorbis_decode_flush(AVCodecContext *avctx)
Definition: vorbisdec.c:1880
vorbis_floor::vorbis_floor_u::vorbis_floor0_s::rate
uint16_t rate
Definition: vorbisdec.c:75
vorbis_parse_setup_hdr_modes
static int vorbis_parse_setup_hdr_modes(vorbis_context *vc)
Definition: vorbisdec.c:895
vorbis_floor::vorbis_floor_u::t1
struct vorbis_floor::vorbis_floor_u::vorbis_floor1_s t1
vorbis_floor::vorbis_floor_u::vorbis_floor0_s::num_books
uint8_t num_books
Definition: vorbisdec.c:81
codebook
static const unsigned codebook[256][2]
Definition: cfhdenc.c:41
vorbis_residue::partition_size
unsigned partition_size
Definition: vorbisdec.c:103
tx.h
vorbis_codebook::dimensions
uint8_t dimensions
Definition: vorbisdec.c:54