4 * @author Denes Balatoni ( dbalatoni programozo hu )
6 * This file is part of Libav.
8 * Libav 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.
13 * Libav 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.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with Libav; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 //#define AV_DEBUG(...) av_log(NULL, AV_LOG_INFO, __VA_ARGS__)
29 #define ALT_BITSTREAM_READER_LE
34 #include "fmtconvert.h"
41 #define V_MAX_VLCS (1 << 16)
42 #define V_MAX_PARTITIONS (1 << 20)
52 uint_fast8_t dimensions
;
53 uint_fast8_t lookup_type
;
54 uint_fast8_t maxdepth
;
60 typedef union vorbis_floor_u vorbis_floor_data
;
61 typedef struct vorbis_floor0_s vorbis_floor0
;
62 typedef struct vorbis_floor1_s vorbis_floor1
;
63 struct vorbis_context_s
;
65 int (* vorbis_floor_decode_func
)
66 (struct vorbis_context_s
*, vorbis_floor_data
*, float *);
68 uint_fast8_t floor_type
;
69 vorbis_floor_decode_func decode
;
70 union vorbis_floor_u
{
71 struct vorbis_floor0_s
{
74 uint_fast16_t bark_map_size
;
76 uint_fast32_t map_size
[2];
77 uint_fast8_t amplitude_bits
;
78 uint_fast8_t amplitude_offset
;
79 uint_fast8_t num_books
;
80 uint_fast8_t *book_list
;
83 struct vorbis_floor1_s
{
84 uint_fast8_t partitions
;
85 uint8_t partition_class
[32];
86 uint_fast8_t class_dimensions
[16];
87 uint_fast8_t class_subclasses
[16];
88 uint_fast8_t class_masterbook
[16];
89 int_fast16_t subclass_books
[16][8];
90 uint_fast8_t multiplier
;
91 uint_fast16_t x_list_dim
;
92 vorbis_floor1_entry
*list
;
101 unsigned partition_size
;
102 uint_fast8_t classifications
;
103 uint_fast8_t classbook
;
104 int_fast16_t books
[64][8];
105 uint_fast8_t maxpass
;
106 uint_fast16_t ptns_to_read
;
111 uint_fast8_t submaps
;
112 uint_fast16_t coupling_steps
;
113 uint_fast8_t *magnitude
;
116 uint_fast8_t submap_floor
[16];
117 uint_fast8_t submap_residue
[16];
121 uint_fast8_t blockflag
;
122 uint_fast16_t windowtype
;
123 uint_fast16_t transformtype
;
124 uint_fast8_t mapping
;
127 typedef struct vorbis_context_s
{
128 AVCodecContext
*avccontext
;
131 FmtConvertContext fmt_conv
;
134 uint_fast8_t first_frame
;
135 uint_fast32_t version
;
136 uint_fast8_t audio_channels
;
137 uint_fast32_t audio_samplerate
;
138 uint_fast32_t bitrate_maximum
;
139 uint_fast32_t bitrate_nominal
;
140 uint_fast32_t bitrate_minimum
;
141 uint_fast32_t blocksize
[2];
143 uint_fast16_t codebook_count
;
144 vorbis_codebook
*codebooks
;
145 uint_fast8_t floor_count
;
146 vorbis_floor
*floors
;
147 uint_fast8_t residue_count
;
148 vorbis_residue
*residues
;
149 uint_fast8_t mapping_count
;
150 vorbis_mapping
*mappings
;
151 uint_fast8_t mode_count
;
153 uint_fast8_t mode_number
; // mode number for the current packet
154 uint_fast8_t previous_window
;
155 float *channel_residues
;
156 float *channel_floors
;
158 float scale_bias
; // for float->int conversion
161 /* Helper functions */
164 (13.1f * atan(0.00074f * (x)) + 2.24f * atan(1.85e-8f * (x) * (x)) + 1e-4f * (x))
166 static const char idx_err_str
[] = "Index value %d out of range (0 - %d) for %s at %s:%i\n";
167 #define VALIDATE_INDEX(idx, limit) \
169 av_log(vc->avccontext, AV_LOG_ERROR,\
171 (int)(idx), (int)(limit - 1), #idx, __FILE__, __LINE__);\
174 #define GET_VALIDATED_INDEX(idx, bits, limit) \
176 idx = get_bits(gb, bits);\
177 VALIDATE_INDEX(idx, limit)\
180 static float vorbisfloat2float(unsigned val
)
182 double mant
= val
& 0x1fffff;
183 long exp
= (val
& 0x7fe00000L
) >> 21;
184 if (val
& 0x80000000)
186 return ldexp(mant
, exp
- 20 - 768);
190 // Free all allocated memory -----------------------------------------
192 static void vorbis_free(vorbis_context
*vc
)
196 av_freep(&vc
->channel_residues
);
197 av_freep(&vc
->channel_floors
);
198 av_freep(&vc
->saved
);
200 for (i
= 0; i
< vc
->residue_count
; i
++)
201 av_free(vc
->residues
[i
].classifs
);
202 av_freep(&vc
->residues
);
203 av_freep(&vc
->modes
);
205 ff_mdct_end(&vc
->mdct
[0]);
206 ff_mdct_end(&vc
->mdct
[1]);
208 for (i
= 0; i
< vc
->codebook_count
; ++i
) {
209 av_free(vc
->codebooks
[i
].codevectors
);
210 free_vlc(&vc
->codebooks
[i
].vlc
);
212 av_freep(&vc
->codebooks
);
214 for (i
= 0; i
< vc
->floor_count
; ++i
) {
215 if (vc
->floors
[i
].floor_type
== 0) {
216 av_free(vc
->floors
[i
].data
.t0
.map
[0]);
217 av_free(vc
->floors
[i
].data
.t0
.map
[1]);
218 av_free(vc
->floors
[i
].data
.t0
.book_list
);
219 av_free(vc
->floors
[i
].data
.t0
.lsp
);
221 av_free(vc
->floors
[i
].data
.t1
.list
);
224 av_freep(&vc
->floors
);
226 for (i
= 0; i
< vc
->mapping_count
; ++i
) {
227 av_free(vc
->mappings
[i
].magnitude
);
228 av_free(vc
->mappings
[i
].angle
);
229 av_free(vc
->mappings
[i
].mux
);
231 av_freep(&vc
->mappings
);
234 // Parse setup header -------------------------------------------------
236 // Process codebooks part
238 static int vorbis_parse_setup_hdr_codebooks(vorbis_context
*vc
)
241 uint8_t *tmp_vlc_bits
;
242 uint32_t *tmp_vlc_codes
;
243 GetBitContext
*gb
= &vc
->gb
;
244 uint_fast16_t *codebook_multiplicands
;
246 vc
->codebook_count
= get_bits(gb
, 8) + 1;
248 AV_DEBUG(" Codebooks: %d \n", vc
->codebook_count
);
250 vc
->codebooks
= av_mallocz(vc
->codebook_count
* sizeof(*vc
->codebooks
));
251 tmp_vlc_bits
= av_mallocz(V_MAX_VLCS
* sizeof(*tmp_vlc_bits
));
252 tmp_vlc_codes
= av_mallocz(V_MAX_VLCS
* sizeof(*tmp_vlc_codes
));
253 codebook_multiplicands
= av_malloc(V_MAX_VLCS
* sizeof(*codebook_multiplicands
));
255 for (cb
= 0; cb
< vc
->codebook_count
; ++cb
) {
256 vorbis_codebook
*codebook_setup
= &vc
->codebooks
[cb
];
257 unsigned ordered
, t
, entries
, used_entries
= 0;
259 AV_DEBUG(" %u. Codebook\n", cb
);
261 if (get_bits(gb
, 24) != 0x564342) {
262 av_log(vc
->avccontext
, AV_LOG_ERROR
,
263 " %u. Codebook setup data corrupt.\n", cb
);
267 codebook_setup
->dimensions
=get_bits(gb
, 16);
268 if (codebook_setup
->dimensions
> 16 || codebook_setup
->dimensions
== 0) {
269 av_log(vc
->avccontext
, AV_LOG_ERROR
,
270 " %u. Codebook's dimension is invalid (%d).\n",
271 cb
, codebook_setup
->dimensions
);
274 entries
= get_bits(gb
, 24);
275 if (entries
> V_MAX_VLCS
) {
276 av_log(vc
->avccontext
, AV_LOG_ERROR
,
277 " %u. Codebook has too many entries (%u).\n",
282 ordered
= get_bits1(gb
);
284 AV_DEBUG(" codebook_dimensions %d, codebook_entries %u\n",
285 codebook_setup
->dimensions
, entries
);
289 unsigned sparse
= get_bits1(gb
);
291 AV_DEBUG(" not ordered \n");
294 AV_DEBUG(" sparse \n");
297 for (ce
= 0; ce
< entries
; ++ce
) {
298 flag
= get_bits1(gb
);
300 tmp_vlc_bits
[ce
] = get_bits(gb
, 5) + 1;
303 tmp_vlc_bits
[ce
] = 0;
306 AV_DEBUG(" not sparse \n");
308 used_entries
= entries
;
309 for (ce
= 0; ce
< entries
; ++ce
)
310 tmp_vlc_bits
[ce
] = get_bits(gb
, 5) + 1;
313 unsigned current_entry
= 0;
314 unsigned current_length
= get_bits(gb
, 5) + 1;
316 AV_DEBUG(" ordered, current length: %u\n", current_length
); //FIXME
318 used_entries
= entries
;
319 for (; current_entry
< used_entries
&& current_length
<= 32; ++current_length
) {
322 AV_DEBUG(" number bits: %u ", ilog(entries
- current_entry
));
324 number
= get_bits(gb
, ilog(entries
- current_entry
));
326 AV_DEBUG(" number: %u\n", number
);
328 for (i
= current_entry
; i
< number
+current_entry
; ++i
)
329 if (i
< used_entries
)
330 tmp_vlc_bits
[i
] = current_length
;
332 current_entry
+=number
;
334 if (current_entry
>used_entries
) {
335 av_log(vc
->avccontext
, AV_LOG_ERROR
, " More codelengths than codes in codebook. \n");
340 codebook_setup
->lookup_type
= get_bits(gb
, 4);
342 AV_DEBUG(" lookup type: %d : %s \n", codebook_setup
->lookup_type
, codebook_setup
->lookup_type ?
"vq" : "no lookup");
344 // If the codebook is used for (inverse) VQ, calculate codevectors.
346 if (codebook_setup
->lookup_type
== 1) {
348 unsigned codebook_lookup_values
= ff_vorbis_nth_root(entries
, codebook_setup
->dimensions
);
350 float codebook_minimum_value
= vorbisfloat2float(get_bits_long(gb
, 32));
351 float codebook_delta_value
= vorbisfloat2float(get_bits_long(gb
, 32));
352 unsigned codebook_value_bits
= get_bits(gb
, 4) + 1;
353 unsigned codebook_sequence_p
= get_bits1(gb
);
355 AV_DEBUG(" We expect %d numbers for building the codevectors. \n", codebook_lookup_values
);
356 AV_DEBUG(" delta %f minmum %f \n", codebook_delta_value
, codebook_minimum_value
);
358 for (i
= 0; i
< codebook_lookup_values
; ++i
) {
359 codebook_multiplicands
[i
] = get_bits(gb
, codebook_value_bits
);
361 AV_DEBUG(" multiplicands*delta+minmum : %e \n", (float)codebook_multiplicands
[i
]*codebook_delta_value
+codebook_minimum_value
);
362 AV_DEBUG(" multiplicand %d \n", codebook_multiplicands
[i
]);
365 // Weed out unused vlcs and build codevector vector
366 codebook_setup
->codevectors
= used_entries ?
av_mallocz(used_entries
*
367 codebook_setup
->dimensions
*
368 sizeof(*codebook_setup
->codevectors
))
370 for (j
= 0, i
= 0; i
< entries
; ++i
) {
371 unsigned dim
= codebook_setup
->dimensions
;
373 if (tmp_vlc_bits
[i
]) {
375 unsigned lookup_offset
= i
;
378 av_log(vc
->avccontext
, AV_LOG_INFO
, "Lookup offset %u ,", i
);
381 for (k
= 0; k
< dim
; ++k
) {
382 unsigned multiplicand_offset
= lookup_offset
% codebook_lookup_values
;
383 codebook_setup
->codevectors
[j
* dim
+ k
] = codebook_multiplicands
[multiplicand_offset
] * codebook_delta_value
+ codebook_minimum_value
+ last
;
384 if (codebook_sequence_p
)
385 last
= codebook_setup
->codevectors
[j
* dim
+ k
];
386 lookup_offset
/=codebook_lookup_values
;
388 tmp_vlc_bits
[j
] = tmp_vlc_bits
[i
];
391 av_log(vc
->avccontext
, AV_LOG_INFO
, "real lookup offset %u, vector: ", j
);
392 for (k
= 0; k
< dim
; ++k
)
393 av_log(vc
->avccontext
, AV_LOG_INFO
, " %f ", codebook_setup
->codevectors
[j
* dim
+ k
]);
394 av_log(vc
->avccontext
, AV_LOG_INFO
, "\n");
400 if (j
!= used_entries
) {
401 av_log(vc
->avccontext
, AV_LOG_ERROR
, "Bug in codevector vector building code. \n");
404 entries
= used_entries
;
405 } else if (codebook_setup
->lookup_type
>= 2) {
406 av_log(vc
->avccontext
, AV_LOG_ERROR
, "Codebook lookup type not supported. \n");
410 // Initialize VLC table
411 if (ff_vorbis_len2vlc(tmp_vlc_bits
, tmp_vlc_codes
, entries
)) {
412 av_log(vc
->avccontext
, AV_LOG_ERROR
, " Invalid code lengths while generating vlcs. \n");
415 codebook_setup
->maxdepth
= 0;
416 for (t
= 0; t
< entries
; ++t
)
417 if (tmp_vlc_bits
[t
] >= codebook_setup
->maxdepth
)
418 codebook_setup
->maxdepth
= tmp_vlc_bits
[t
];
420 if (codebook_setup
->maxdepth
> 3 * V_NB_BITS
)
421 codebook_setup
->nb_bits
= V_NB_BITS2
;
423 codebook_setup
->nb_bits
= V_NB_BITS
;
425 codebook_setup
->maxdepth
= (codebook_setup
->maxdepth
+codebook_setup
->nb_bits
- 1) / codebook_setup
->nb_bits
;
427 if (init_vlc(&codebook_setup
->vlc
, codebook_setup
->nb_bits
, entries
, tmp_vlc_bits
, sizeof(*tmp_vlc_bits
), sizeof(*tmp_vlc_bits
), tmp_vlc_codes
, sizeof(*tmp_vlc_codes
), sizeof(*tmp_vlc_codes
), INIT_VLC_LE
)) {
428 av_log(vc
->avccontext
, AV_LOG_ERROR
, " Error generating vlc tables. \n");
433 av_free(tmp_vlc_bits
);
434 av_free(tmp_vlc_codes
);
435 av_free(codebook_multiplicands
);
440 av_free(tmp_vlc_bits
);
441 av_free(tmp_vlc_codes
);
442 av_free(codebook_multiplicands
);
446 // Process time domain transforms part (unused in Vorbis I)
448 static int vorbis_parse_setup_hdr_tdtransforms(vorbis_context
*vc
)
450 GetBitContext
*gb
= &vc
->gb
;
451 unsigned i
, vorbis_time_count
= get_bits(gb
, 6) + 1;
453 for (i
= 0; i
< vorbis_time_count
; ++i
) {
454 unsigned vorbis_tdtransform
= get_bits(gb
, 16);
456 AV_DEBUG(" Vorbis time domain transform %u: %u\n",
457 vorbis_time_count
, vorbis_tdtransform
);
459 if (vorbis_tdtransform
) {
460 av_log(vc
->avccontext
, AV_LOG_ERROR
, "Vorbis time domain transform data nonzero. \n");
467 // Process floors part
469 static int vorbis_floor0_decode(vorbis_context
*vc
,
470 vorbis_floor_data
*vfu
, float *vec
);
471 static void create_map(vorbis_context
*vc
, unsigned floor_number
);
472 static int vorbis_floor1_decode(vorbis_context
*vc
,
473 vorbis_floor_data
*vfu
, float *vec
);
474 static int vorbis_parse_setup_hdr_floors(vorbis_context
*vc
)
476 GetBitContext
*gb
= &vc
->gb
;
479 vc
->floor_count
= get_bits(gb
, 6) + 1;
481 vc
->floors
= av_mallocz(vc
->floor_count
* sizeof(*vc
->floors
));
483 for (i
= 0; i
< vc
->floor_count
; ++i
) {
484 vorbis_floor
*floor_setup
= &vc
->floors
[i
];
486 floor_setup
->floor_type
= get_bits(gb
, 16);
488 AV_DEBUG(" %d. floor type %d \n", i
, floor_setup
->floor_type
);
490 if (floor_setup
->floor_type
== 1) {
491 int maximum_class
= -1;
492 unsigned rangebits
, rangemax
, floor1_values
= 2;
494 floor_setup
->decode
= vorbis_floor1_decode
;
496 floor_setup
->data
.t1
.partitions
= get_bits(gb
, 5);
498 AV_DEBUG(" %d.floor: %d partitions \n", i
, floor_setup
->data
.t1
.partitions
);
500 for (j
= 0; j
< floor_setup
->data
.t1
.partitions
; ++j
) {
501 floor_setup
->data
.t1
.partition_class
[j
] = get_bits(gb
, 4);
502 if (floor_setup
->data
.t1
.partition_class
[j
] > maximum_class
)
503 maximum_class
= floor_setup
->data
.t1
.partition_class
[j
];
505 AV_DEBUG(" %d. floor %d partition class %d \n", i
, j
, floor_setup
->data
.t1
.partition_class
[j
]);
509 AV_DEBUG(" maximum class %d \n", maximum_class
);
511 for (j
= 0; j
<= maximum_class
; ++j
) {
512 floor_setup
->data
.t1
.class_dimensions
[j
] = get_bits(gb
, 3) + 1;
513 floor_setup
->data
.t1
.class_subclasses
[j
] = get_bits(gb
, 2);
515 AV_DEBUG(" %d floor %d class dim: %d subclasses %d \n", i
, j
, floor_setup
->data
.t1
.class_dimensions
[j
], floor_setup
->data
.t1
.class_subclasses
[j
]);
517 if (floor_setup
->data
.t1
.class_subclasses
[j
]) {
518 GET_VALIDATED_INDEX(floor_setup
->data
.t1
.class_masterbook
[j
], 8, vc
->codebook_count
)
520 AV_DEBUG(" masterbook: %d \n", floor_setup
->data
.t1
.class_masterbook
[j
]);
523 for (k
= 0; k
< (1 << floor_setup
->data
.t1
.class_subclasses
[j
]); ++k
) {
524 int16_t bits
= get_bits(gb
, 8) - 1;
526 VALIDATE_INDEX(bits
, vc
->codebook_count
)
527 floor_setup
->data
.t1
.subclass_books
[j
][k
] = bits
;
529 AV_DEBUG(" book %d. : %d \n", k
, floor_setup
->data
.t1
.subclass_books
[j
][k
]);
533 floor_setup
->data
.t1
.multiplier
= get_bits(gb
, 2) + 1;
534 floor_setup
->data
.t1
.x_list_dim
= 2;
536 for (j
= 0; j
< floor_setup
->data
.t1
.partitions
; ++j
)
537 floor_setup
->data
.t1
.x_list_dim
+=floor_setup
->data
.t1
.class_dimensions
[floor_setup
->data
.t1
.partition_class
[j
]];
539 floor_setup
->data
.t1
.list
= av_mallocz(floor_setup
->data
.t1
.x_list_dim
*
540 sizeof(*floor_setup
->data
.t1
.list
));
543 rangebits
= get_bits(gb
, 4);
544 rangemax
= (1 << rangebits
);
545 if (rangemax
> vc
->blocksize
[1] / 2) {
546 av_log(vc
->avccontext
, AV_LOG_ERROR
,
547 "Floor value is too large for blocksize: %u (%"PRIuFAST32
")\n",
548 rangemax
, vc
->blocksize
[1] / 2);
551 floor_setup
->data
.t1
.list
[0].x
= 0;
552 floor_setup
->data
.t1
.list
[1].x
= rangemax
;
554 for (j
= 0; j
< floor_setup
->data
.t1
.partitions
; ++j
) {
555 for (k
= 0; k
< floor_setup
->data
.t1
.class_dimensions
[floor_setup
->data
.t1
.partition_class
[j
]]; ++k
, ++floor1_values
) {
556 floor_setup
->data
.t1
.list
[floor1_values
].x
= get_bits(gb
, rangebits
);
558 AV_DEBUG(" %u. floor1 Y coord. %d\n", floor1_values
,
559 floor_setup
->data
.t1
.list
[floor1_values
].x
);
563 // Precalculate order of x coordinates - needed for decode
564 ff_vorbis_ready_floor1_list(floor_setup
->data
.t1
.list
, floor_setup
->data
.t1
.x_list_dim
);
565 } else if (floor_setup
->floor_type
== 0) {
566 unsigned max_codebook_dim
= 0;
568 floor_setup
->decode
= vorbis_floor0_decode
;
570 floor_setup
->data
.t0
.order
= get_bits(gb
, 8);
571 floor_setup
->data
.t0
.rate
= get_bits(gb
, 16);
572 floor_setup
->data
.t0
.bark_map_size
= get_bits(gb
, 16);
573 floor_setup
->data
.t0
.amplitude_bits
= get_bits(gb
, 6);
574 /* zero would result in a div by zero later *
576 if (floor_setup
->data
.t0
.amplitude_bits
== 0) {
577 av_log(vc
->avccontext
, AV_LOG_ERROR
,
578 "Floor 0 amplitude bits is 0.\n");
581 floor_setup
->data
.t0
.amplitude_offset
= get_bits(gb
, 8);
582 floor_setup
->data
.t0
.num_books
= get_bits(gb
, 4) + 1;
584 /* allocate mem for booklist */
585 floor_setup
->data
.t0
.book_list
=
586 av_malloc(floor_setup
->data
.t0
.num_books
);
587 if (!floor_setup
->data
.t0
.book_list
)
589 /* read book indexes */
593 for (idx
= 0; idx
< floor_setup
->data
.t0
.num_books
; ++idx
) {
594 GET_VALIDATED_INDEX(book_idx
, 8, vc
->codebook_count
)
595 floor_setup
->data
.t0
.book_list
[idx
] = book_idx
;
596 if (vc
->codebooks
[book_idx
].dimensions
> max_codebook_dim
)
597 max_codebook_dim
= vc
->codebooks
[book_idx
].dimensions
;
603 /* codebook dim is for padding if codebook dim doesn't *
604 * divide order+1 then we need to read more data */
605 floor_setup
->data
.t0
.lsp
=
606 av_malloc((floor_setup
->data
.t0
.order
+ 1 + max_codebook_dim
)
607 * sizeof(*floor_setup
->data
.t0
.lsp
));
608 if (!floor_setup
->data
.t0
.lsp
)
611 #ifdef V_DEBUG /* debug output parsed headers */
612 AV_DEBUG("floor0 order: %u\n", floor_setup
->data
.t0
.order
);
613 AV_DEBUG("floor0 rate: %u\n", floor_setup
->data
.t0
.rate
);
614 AV_DEBUG("floor0 bark map size: %u\n",
615 floor_setup
->data
.t0
.bark_map_size
);
616 AV_DEBUG("floor0 amplitude bits: %u\n",
617 floor_setup
->data
.t0
.amplitude_bits
);
618 AV_DEBUG("floor0 amplitude offset: %u\n",
619 floor_setup
->data
.t0
.amplitude_offset
);
620 AV_DEBUG("floor0 number of books: %u\n",
621 floor_setup
->data
.t0
.num_books
);
622 AV_DEBUG("floor0 book list pointer: %p\n",
623 floor_setup
->data
.t0
.book_list
);
626 for (idx
= 0; idx
< floor_setup
->data
.t0
.num_books
; ++idx
) {
627 AV_DEBUG(" Book %d: %u\n",
629 floor_setup
->data
.t0
.book_list
[idx
]);
634 av_log(vc
->avccontext
, AV_LOG_ERROR
, "Invalid floor type!\n");
641 // Process residues part
643 static int vorbis_parse_setup_hdr_residues(vorbis_context
*vc
)
645 GetBitContext
*gb
= &vc
->gb
;
648 vc
->residue_count
= get_bits(gb
, 6)+1;
649 vc
->residues
= av_mallocz(vc
->residue_count
* sizeof(*vc
->residues
));
651 AV_DEBUG(" There are %d residues. \n", vc
->residue_count
);
653 for (i
= 0; i
< vc
->residue_count
; ++i
) {
654 vorbis_residue
*res_setup
= &vc
->residues
[i
];
655 uint_fast8_t cascade
[64];
656 unsigned high_bits
, low_bits
;
658 res_setup
->type
= get_bits(gb
, 16);
660 AV_DEBUG(" %u. residue type %d\n", i
, res_setup
->type
);
662 res_setup
->begin
= get_bits(gb
, 24);
663 res_setup
->end
= get_bits(gb
, 24);
664 res_setup
->partition_size
= get_bits(gb
, 24) + 1;
665 /* Validations to prevent a buffer overflow later. */
666 if (res_setup
->begin
>res_setup
->end
||
667 res_setup
->end
> vc
->avccontext
->channels
* vc
->blocksize
[1] / 2 ||
668 (res_setup
->end
-res_setup
->begin
) / res_setup
->partition_size
> V_MAX_PARTITIONS
) {
669 av_log(vc
->avccontext
, AV_LOG_ERROR
, "partition out of bounds: type, begin, end, size, blocksize: %"PRIdFAST16
", %"PRIdFAST32
", %"PRIdFAST32
", %u, %"PRIdFAST32
"\n", res_setup
->type
, res_setup
->begin
, res_setup
->end
, res_setup
->partition_size
, vc
->blocksize
[1] / 2);
673 res_setup
->classifications
= get_bits(gb
, 6) + 1;
674 GET_VALIDATED_INDEX(res_setup
->classbook
, 8, vc
->codebook_count
)
676 res_setup
->ptns_to_read
=
677 (res_setup
->end
- res_setup
->begin
) / res_setup
->partition_size
;
678 res_setup
->classifs
= av_malloc(res_setup
->ptns_to_read
*
680 sizeof(*res_setup
->classifs
));
681 if (!res_setup
->classifs
)
682 return AVERROR(ENOMEM
);
684 AV_DEBUG(" begin %d end %d part.size %d classif.s %d classbook %d \n", res_setup
->begin
, res_setup
->end
, res_setup
->partition_size
,
685 res_setup
->classifications
, res_setup
->classbook
);
687 for (j
= 0; j
< res_setup
->classifications
; ++j
) {
689 low_bits
= get_bits(gb
, 3);
691 high_bits
= get_bits(gb
, 5);
692 cascade
[j
] = (high_bits
<< 3) + low_bits
;
694 AV_DEBUG(" %u class cascade depth: %d\n", j
, ilog(cascade
[j
]));
697 res_setup
->maxpass
= 0;
698 for (j
= 0; j
< res_setup
->classifications
; ++j
) {
699 for (k
= 0; k
< 8; ++k
) {
700 if (cascade
[j
]&(1 << k
)) {
701 GET_VALIDATED_INDEX(res_setup
->books
[j
][k
], 8, vc
->codebook_count
)
703 AV_DEBUG(" %u class cascade depth %u book: %d\n",
704 j
, k
, res_setup
->books
[j
][k
]);
706 if (k
>res_setup
->maxpass
)
707 res_setup
->maxpass
= k
;
709 res_setup
->books
[j
][k
] = -1;
717 // Process mappings part
719 static int vorbis_parse_setup_hdr_mappings(vorbis_context
*vc
)
721 GetBitContext
*gb
= &vc
->gb
;
724 vc
->mapping_count
= get_bits(gb
, 6)+1;
725 vc
->mappings
= av_mallocz(vc
->mapping_count
* sizeof(*vc
->mappings
));
727 AV_DEBUG(" There are %d mappings. \n", vc
->mapping_count
);
729 for (i
= 0; i
< vc
->mapping_count
; ++i
) {
730 vorbis_mapping
*mapping_setup
= &vc
->mappings
[i
];
732 if (get_bits(gb
, 16)) {
733 av_log(vc
->avccontext
, AV_LOG_ERROR
, "Other mappings than type 0 are not compliant with the Vorbis I specification. \n");
737 mapping_setup
->submaps
= get_bits(gb
, 4) + 1;
739 mapping_setup
->submaps
= 1;
743 mapping_setup
->coupling_steps
= get_bits(gb
, 8) + 1;
744 mapping_setup
->magnitude
= av_mallocz(mapping_setup
->coupling_steps
*
745 sizeof(*mapping_setup
->magnitude
));
746 mapping_setup
->angle
= av_mallocz(mapping_setup
->coupling_steps
*
747 sizeof(*mapping_setup
->angle
));
748 for (j
= 0; j
< mapping_setup
->coupling_steps
; ++j
) {
749 GET_VALIDATED_INDEX(mapping_setup
->magnitude
[j
], ilog(vc
->audio_channels
- 1), vc
->audio_channels
)
750 GET_VALIDATED_INDEX(mapping_setup
->angle
[j
], ilog(vc
->audio_channels
- 1), vc
->audio_channels
)
753 mapping_setup
->coupling_steps
= 0;
756 AV_DEBUG(" %u mapping coupling steps: %d\n",
757 i
, mapping_setup
->coupling_steps
);
759 if (get_bits(gb
, 2)) {
760 av_log(vc
->avccontext
, AV_LOG_ERROR
, "%u. mapping setup data invalid.\n", i
);
761 return -1; // following spec.
764 if (mapping_setup
->submaps
>1) {
765 mapping_setup
->mux
= av_mallocz(vc
->audio_channels
*
766 sizeof(*mapping_setup
->mux
));
767 for (j
= 0; j
< vc
->audio_channels
; ++j
)
768 mapping_setup
->mux
[j
] = get_bits(gb
, 4);
771 for (j
= 0; j
< mapping_setup
->submaps
; ++j
) {
772 skip_bits(gb
, 8); // FIXME check?
773 GET_VALIDATED_INDEX(mapping_setup
->submap_floor
[j
], 8, vc
->floor_count
)
774 GET_VALIDATED_INDEX(mapping_setup
->submap_residue
[j
], 8, vc
->residue_count
)
776 AV_DEBUG(" %u mapping %u submap : floor %d, residue %d\n",
778 mapping_setup
->submap_floor
[j
],
779 mapping_setup
->submap_residue
[j
]);
785 // Process modes part
787 static void create_map(vorbis_context
*vc
, unsigned floor_number
)
789 vorbis_floor
*floors
= vc
->floors
;
795 for (blockflag
= 0; blockflag
< 2; ++blockflag
) {
796 n
= vc
->blocksize
[blockflag
] / 2;
797 floors
[floor_number
].data
.t0
.map
[blockflag
] =
798 av_malloc((n
+1) * sizeof(int_fast32_t)); // n + sentinel
800 map
= floors
[floor_number
].data
.t0
.map
[blockflag
];
801 vf
= &floors
[floor_number
].data
.t0
;
803 for (idx
= 0; idx
< n
; ++idx
) {
804 map
[idx
] = floor(BARK((vf
->rate
* idx
) / (2.0f
* n
)) *
805 ((vf
->bark_map_size
) /
806 BARK(vf
->rate
/ 2.0f
)));
807 if (vf
->bark_map_size
-1 < map
[idx
])
808 map
[idx
] = vf
->bark_map_size
- 1;
811 vf
->map_size
[blockflag
] = n
;
815 for (idx
= 0; idx
<= n
; ++idx
) {
816 AV_DEBUG("floor0 map: map at pos %d is %d\n",
822 static int vorbis_parse_setup_hdr_modes(vorbis_context
*vc
)
824 GetBitContext
*gb
= &vc
->gb
;
827 vc
->mode_count
= get_bits(gb
, 6) + 1;
828 vc
->modes
= av_mallocz(vc
->mode_count
* sizeof(*vc
->modes
));
830 AV_DEBUG(" There are %d modes.\n", vc
->mode_count
);
832 for (i
= 0; i
< vc
->mode_count
; ++i
) {
833 vorbis_mode
*mode_setup
= &vc
->modes
[i
];
835 mode_setup
->blockflag
= get_bits1(gb
);
836 mode_setup
->windowtype
= get_bits(gb
, 16); //FIXME check
837 mode_setup
->transformtype
= get_bits(gb
, 16); //FIXME check
838 GET_VALIDATED_INDEX(mode_setup
->mapping
, 8, vc
->mapping_count
);
840 AV_DEBUG(" %u mode: blockflag %d, windowtype %d, transformtype %d, mapping %d\n",
841 i
, mode_setup
->blockflag
, mode_setup
->windowtype
,
842 mode_setup
->transformtype
, mode_setup
->mapping
);
847 // Process the whole setup header using the functions above
849 static int vorbis_parse_setup_hdr(vorbis_context
*vc
)
851 GetBitContext
*gb
= &vc
->gb
;
853 if ((get_bits(gb
, 8) != 'v') || (get_bits(gb
, 8) != 'o') ||
854 (get_bits(gb
, 8) != 'r') || (get_bits(gb
, 8) != 'b') ||
855 (get_bits(gb
, 8) != 'i') || (get_bits(gb
, 8) != 's')) {
856 av_log(vc
->avccontext
, AV_LOG_ERROR
, " Vorbis setup header packet corrupt (no vorbis signature). \n");
860 if (vorbis_parse_setup_hdr_codebooks(vc
)) {
861 av_log(vc
->avccontext
, AV_LOG_ERROR
, " Vorbis setup header packet corrupt (codebooks). \n");
864 if (vorbis_parse_setup_hdr_tdtransforms(vc
)) {
865 av_log(vc
->avccontext
, AV_LOG_ERROR
, " Vorbis setup header packet corrupt (time domain transforms). \n");
868 if (vorbis_parse_setup_hdr_floors(vc
)) {
869 av_log(vc
->avccontext
, AV_LOG_ERROR
, " Vorbis setup header packet corrupt (floors). \n");
872 if (vorbis_parse_setup_hdr_residues(vc
)) {
873 av_log(vc
->avccontext
, AV_LOG_ERROR
, " Vorbis setup header packet corrupt (residues). \n");
876 if (vorbis_parse_setup_hdr_mappings(vc
)) {
877 av_log(vc
->avccontext
, AV_LOG_ERROR
, " Vorbis setup header packet corrupt (mappings). \n");
880 if (vorbis_parse_setup_hdr_modes(vc
)) {
881 av_log(vc
->avccontext
, AV_LOG_ERROR
, " Vorbis setup header packet corrupt (modes). \n");
884 if (!get_bits1(gb
)) {
885 av_log(vc
->avccontext
, AV_LOG_ERROR
, " Vorbis setup header packet corrupt (framing flag). \n");
886 return -8; // framing flag bit unset error
892 // Process the identification header
894 static int vorbis_parse_id_hdr(vorbis_context
*vc
)
896 GetBitContext
*gb
= &vc
->gb
;
899 if ((get_bits(gb
, 8) != 'v') || (get_bits(gb
, 8) != 'o') ||
900 (get_bits(gb
, 8) != 'r') || (get_bits(gb
, 8) != 'b') ||
901 (get_bits(gb
, 8) != 'i') || (get_bits(gb
, 8) != 's')) {
902 av_log(vc
->avccontext
, AV_LOG_ERROR
, " Vorbis id header packet corrupt (no vorbis signature). \n");
906 vc
->version
= get_bits_long(gb
, 32); //FIXME check 0
907 vc
->audio_channels
= get_bits(gb
, 8);
908 if (vc
->audio_channels
<= 0) {
909 av_log(vc
->avccontext
, AV_LOG_ERROR
, "Invalid number of channels\n");
912 vc
->audio_samplerate
= get_bits_long(gb
, 32);
913 if (vc
->audio_samplerate
<= 0) {
914 av_log(vc
->avccontext
, AV_LOG_ERROR
, "Invalid samplerate\n");
917 vc
->bitrate_maximum
= get_bits_long(gb
, 32);
918 vc
->bitrate_nominal
= get_bits_long(gb
, 32);
919 vc
->bitrate_minimum
= get_bits_long(gb
, 32);
920 bl0
= get_bits(gb
, 4);
921 bl1
= get_bits(gb
, 4);
922 vc
->blocksize
[0] = (1 << bl0
);
923 vc
->blocksize
[1] = (1 << bl1
);
924 if (bl0
> 13 || bl0
< 6 || bl1
> 13 || bl1
< 6 || bl1
< bl0
) {
925 av_log(vc
->avccontext
, AV_LOG_ERROR
, " Vorbis id header packet corrupt (illegal blocksize). \n");
928 // output format int16
929 if (vc
->blocksize
[1] / 2 * vc
->audio_channels
* 2 > AVCODEC_MAX_AUDIO_FRAME_SIZE
) {
930 av_log(vc
->avccontext
, AV_LOG_ERROR
, "Vorbis channel count makes "
931 "output packets too large.\n");
934 vc
->win
[0] = ff_vorbis_vwin
[bl0
- 6];
935 vc
->win
[1] = ff_vorbis_vwin
[bl1
- 6];
937 if ((get_bits1(gb
)) == 0) {
938 av_log(vc
->avccontext
, AV_LOG_ERROR
, " Vorbis id header packet corrupt (framing flag not set). \n");
942 vc
->channel_residues
= av_malloc((vc
->blocksize
[1] / 2) * vc
->audio_channels
* sizeof(*vc
->channel_residues
));
943 vc
->channel_floors
= av_malloc((vc
->blocksize
[1] / 2) * vc
->audio_channels
* sizeof(*vc
->channel_floors
));
944 vc
->saved
= av_mallocz((vc
->blocksize
[1] / 4) * vc
->audio_channels
* sizeof(*vc
->saved
));
945 vc
->previous_window
= 0;
947 ff_mdct_init(&vc
->mdct
[0], bl0
, 1, -vc
->scale_bias
);
948 ff_mdct_init(&vc
->mdct
[1], bl1
, 1, -vc
->scale_bias
);
950 AV_DEBUG(" vorbis version %d \n audio_channels %d \n audio_samplerate %d \n bitrate_max %d \n bitrate_nom %d \n bitrate_min %d \n blk_0 %d blk_1 %d \n ",
951 vc
->version
, vc
->audio_channels
, vc
->audio_samplerate
, vc
->bitrate_maximum
, vc
->bitrate_nominal
, vc
->bitrate_minimum
, vc
->blocksize
[0], vc
->blocksize
[1]);
954 BLK = vc->blocksize[0];
955 for (i = 0; i < BLK / 2; ++i) {
956 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)));
963 // Process the extradata using the functions above (identification header, setup header)
965 static av_cold
int vorbis_decode_init(AVCodecContext
*avccontext
)
967 vorbis_context
*vc
= avccontext
->priv_data
;
968 uint8_t *headers
= avccontext
->extradata
;
969 int headers_len
= avccontext
->extradata_size
;
970 uint8_t *header_start
[3];
972 GetBitContext
*gb
= &(vc
->gb
);
975 vc
->avccontext
= avccontext
;
976 dsputil_init(&vc
->dsp
, avccontext
);
977 ff_fmt_convert_init(&vc
->fmt_conv
, avccontext
);
979 vc
->scale_bias
= 32768.0f
;
982 av_log(avccontext
, AV_LOG_ERROR
, "Extradata missing.\n");
986 if (ff_split_xiph_headers(headers
, headers_len
, 30, header_start
, header_len
) < 0) {
987 av_log(avccontext
, AV_LOG_ERROR
, "Extradata corrupt.\n");
991 init_get_bits(gb
, header_start
[0], header_len
[0]*8);
992 hdr_type
= get_bits(gb
, 8);
994 av_log(avccontext
, AV_LOG_ERROR
, "First header is not the id header.\n");
997 if (vorbis_parse_id_hdr(vc
)) {
998 av_log(avccontext
, AV_LOG_ERROR
, "Id header corrupt.\n");
1003 init_get_bits(gb
, header_start
[2], header_len
[2]*8);
1004 hdr_type
= get_bits(gb
, 8);
1005 if (hdr_type
!= 5) {
1006 av_log(avccontext
, AV_LOG_ERROR
, "Third header is not the setup header.\n");
1010 if (vorbis_parse_setup_hdr(vc
)) {
1011 av_log(avccontext
, AV_LOG_ERROR
, "Setup header corrupt.\n");
1016 if (vc
->audio_channels
> 8)
1017 avccontext
->channel_layout
= 0;
1019 avccontext
->channel_layout
= ff_vorbis_channel_layouts
[vc
->audio_channels
- 1];
1021 avccontext
->channels
= vc
->audio_channels
;
1022 avccontext
->sample_rate
= vc
->audio_samplerate
;
1023 avccontext
->frame_size
= FFMIN(vc
->blocksize
[0], vc
->blocksize
[1]) >> 2;
1024 avccontext
->sample_fmt
= AV_SAMPLE_FMT_S16
;
1029 // Decode audiopackets -------------------------------------------------
1031 // Read and decode floor
1033 static int vorbis_floor0_decode(vorbis_context
*vc
,
1034 vorbis_floor_data
*vfu
, float *vec
)
1036 vorbis_floor0
*vf
= &vfu
->t0
;
1037 float *lsp
= vf
->lsp
;
1038 unsigned amplitude
, book_idx
;
1039 unsigned blockflag
= vc
->modes
[vc
->mode_number
].blockflag
;
1041 amplitude
= get_bits(&vc
->gb
, vf
->amplitude_bits
);
1042 if (amplitude
> 0) {
1044 unsigned idx
, lsp_len
= 0;
1045 vorbis_codebook codebook
;
1047 book_idx
= get_bits(&vc
->gb
, ilog(vf
->num_books
));
1048 if (book_idx
>= vf
->num_books
) {
1049 av_log(vc
->avccontext
, AV_LOG_ERROR
,
1050 "floor0 dec: booknumber too high!\n");
1053 AV_DEBUG("floor0 dec: booknumber: %u\n", book_idx
);
1054 codebook
= vc
->codebooks
[vf
->book_list
[book_idx
]];
1055 /* Invalid codebook! */
1056 if (!codebook
.codevectors
)
1059 while (lsp_len
<vf
->order
) {
1062 AV_DEBUG("floor0 dec: book dimension: %d\n", codebook
.dimensions
);
1063 AV_DEBUG("floor0 dec: maximum depth: %d\n", codebook
.maxdepth
);
1064 /* read temp vector */
1065 vec_off
= get_vlc2(&vc
->gb
, codebook
.vlc
.table
,
1066 codebook
.nb_bits
, codebook
.maxdepth
)
1067 * codebook
.dimensions
;
1068 AV_DEBUG("floor0 dec: vector offset: %d\n", vec_off
);
1069 /* copy each vector component and add last to it */
1070 for (idx
= 0; idx
< codebook
.dimensions
; ++idx
)
1071 lsp
[lsp_len
+idx
] = codebook
.codevectors
[vec_off
+idx
] + last
;
1072 last
= lsp
[lsp_len
+idx
-1]; /* set last to last vector component */
1074 lsp_len
+= codebook
.dimensions
;
1077 /* DEBUG: output lsp coeffs */
1080 for (idx
= 0; idx
< lsp_len
; ++idx
)
1081 AV_DEBUG("floor0 dec: coeff at %d is %f\n", idx
, lsp
[idx
]);
1085 /* synthesize floor output vector */
1088 int order
= vf
->order
;
1089 float wstep
= M_PI
/ vf
->bark_map_size
;
1091 for (i
= 0; i
< order
; i
++)
1092 lsp
[i
] = 2.0f
* cos(lsp
[i
]);
1094 AV_DEBUG("floor0 synth: map_size = %d; m = %d; wstep = %f\n",
1095 vf
->map_size
, order
, wstep
);
1098 while (i
< vf
->map_size
[blockflag
]) {
1099 int j
, iter_cond
= vf
->map
[blockflag
][i
];
1102 float two_cos_w
= 2.0f
* cos(wstep
* iter_cond
); // needed all times
1104 /* similar part for the q and p products */
1105 for (j
= 0; j
+ 1 < order
; j
+= 2) {
1106 q
*= lsp
[j
] - two_cos_w
;
1107 p
*= lsp
[j
+ 1] - two_cos_w
;
1109 if (j
== order
) { // even order
1110 p
*= p
* (2.0f
- two_cos_w
);
1111 q
*= q
* (2.0f
+ two_cos_w
);
1112 } else { // odd order
1113 q
*= two_cos_w
-lsp
[j
]; // one more time for q
1115 /* final step and square */
1116 p
*= p
* (4.f
- two_cos_w
* two_cos_w
);
1120 /* calculate linear floor value */
1121 q
= exp((((amplitude
*vf
->amplitude_offset
) /
1122 (((1 << vf
->amplitude_bits
) - 1) * sqrt(p
+ q
)))
1123 - vf
->amplitude_offset
) * .11512925f
);
1128 } while (vf
->map
[blockflag
][i
] == iter_cond
);
1132 /* this channel is unused */
1136 AV_DEBUG(" Floor0 decoded\n");
1141 static int vorbis_floor1_decode(vorbis_context
*vc
,
1142 vorbis_floor_data
*vfu
, float *vec
)
1144 vorbis_floor1
*vf
= &vfu
->t1
;
1145 GetBitContext
*gb
= &vc
->gb
;
1146 uint_fast16_t range_v
[4] = { 256, 128, 86, 64 };
1147 unsigned range
= range_v
[vf
->multiplier
-1];
1148 uint_fast16_t floor1_Y
[258];
1149 uint_fast16_t floor1_Y_final
[258];
1150 int floor1_flag
[258];
1151 unsigned class, cdim
, cbits
, csub
, cval
, offset
, i
, j
;
1152 int book
, adx
, ady
, dy
, off
, predicted
, err
;
1155 if (!get_bits1(gb
)) // silence
1158 // Read values (or differences) for the floor's points
1160 floor1_Y
[0] = get_bits(gb
, ilog(range
- 1));
1161 floor1_Y
[1] = get_bits(gb
, ilog(range
- 1));
1163 AV_DEBUG("floor 0 Y %d floor 1 Y %d \n", floor1_Y
[0], floor1_Y
[1]);
1166 for (i
= 0; i
< vf
->partitions
; ++i
) {
1167 class = vf
->partition_class
[i
];
1168 cdim
= vf
->class_dimensions
[class];
1169 cbits
= vf
->class_subclasses
[class];
1170 csub
= (1 << cbits
) - 1;
1173 AV_DEBUG("Cbits %u\n", cbits
);
1175 if (cbits
) // this reads all subclasses for this partition's class
1176 cval
= get_vlc2(gb
, vc
->codebooks
[vf
->class_masterbook
[class]].vlc
.table
,
1177 vc
->codebooks
[vf
->class_masterbook
[class]].nb_bits
, 3);
1179 for (j
= 0; j
< cdim
; ++j
) {
1180 book
= vf
->subclass_books
[class][cval
& csub
];
1182 AV_DEBUG("book %d Cbits %u cval %u bits:%d\n",
1183 book
, cbits
, cval
, get_bits_count(gb
));
1185 cval
= cval
>> cbits
;
1187 floor1_Y
[offset
+j
] = get_vlc2(gb
, vc
->codebooks
[book
].vlc
.table
,
1188 vc
->codebooks
[book
].nb_bits
, 3);
1190 floor1_Y
[offset
+j
] = 0;
1193 AV_DEBUG(" floor(%d) = %d \n", vf
->list
[offset
+j
].x
, floor1_Y
[offset
+j
]);
1198 // Amplitude calculation from the differences
1202 floor1_Y_final
[0] = floor1_Y
[0];
1203 floor1_Y_final
[1] = floor1_Y
[1];
1205 for (i
= 2; i
< vf
->x_list_dim
; ++i
) {
1206 unsigned val
, highroom
, lowroom
, room
, high_neigh_offs
, low_neigh_offs
;
1208 low_neigh_offs
= vf
->list
[i
].low
;
1209 high_neigh_offs
= vf
->list
[i
].high
;
1210 dy
= floor1_Y_final
[high_neigh_offs
] - floor1_Y_final
[low_neigh_offs
]; // render_point begin
1211 adx
= vf
->list
[high_neigh_offs
].x
- vf
->list
[low_neigh_offs
].x
;
1213 err
= ady
* (vf
->list
[i
].x
- vf
->list
[low_neigh_offs
].x
);
1216 predicted
= floor1_Y_final
[low_neigh_offs
] - off
;
1218 predicted
= floor1_Y_final
[low_neigh_offs
] + off
;
1219 } // render_point end
1222 highroom
= range
-predicted
;
1223 lowroom
= predicted
;
1224 if (highroom
< lowroom
) {
1225 room
= highroom
* 2;
1227 room
= lowroom
* 2; // SPEC mispelling
1230 floor1_flag
[low_neigh_offs
] = 1;
1231 floor1_flag
[high_neigh_offs
] = 1;
1234 if (highroom
> lowroom
) {
1235 floor1_Y_final
[i
] = val
- lowroom
+ predicted
;
1237 floor1_Y_final
[i
] = predicted
- val
+ highroom
- 1;
1241 floor1_Y_final
[i
] = predicted
- (val
+ 1) / 2;
1243 floor1_Y_final
[i
] = predicted
+ val
/ 2;
1248 floor1_Y_final
[i
] = predicted
;
1251 AV_DEBUG(" Decoded floor(%d) = %d / val %u\n",
1252 vf
->list
[i
].x
, floor1_Y_final
[i
], val
);
1255 // Curve synth - connect the calculated dots and convert from dB scale FIXME optimize ?
1257 ff_vorbis_floor1_render_list(vf
->list
, vf
->x_list_dim
, floor1_Y_final
, floor1_flag
, vf
->multiplier
, vec
, vf
->list
[1].x
);
1259 AV_DEBUG(" Floor decoded\n");
1264 // Read and decode residue
1266 static av_always_inline
int vorbis_residue_decode_internal(vorbis_context
*vc
,
1269 uint_fast8_t *do_not_decode
,
1274 GetBitContext
*gb
= &vc
->gb
;
1275 unsigned c_p_c
= vc
->codebooks
[vr
->classbook
].dimensions
;
1276 unsigned ptns_to_read
= vr
->ptns_to_read
;
1277 uint8_t *classifs
= vr
->classifs
;
1278 unsigned pass
, ch_used
, i
, j
, k
, l
;
1281 for (j
= 1; j
< ch
; ++j
)
1282 do_not_decode
[0] &= do_not_decode
[j
]; // FIXME - clobbering input
1283 if (do_not_decode
[0])
1290 AV_DEBUG(" residue type 0/1/2 decode begin, ch: %d cpc %d \n", ch
, c_p_c
);
1292 for (pass
= 0; pass
<= vr
->maxpass
; ++pass
) { // FIXME OPTIMIZE?
1293 uint16_t voffset
, partition_count
, j_times_ptns_to_read
;
1295 voffset
= vr
->begin
;
1296 for (partition_count
= 0; partition_count
< ptns_to_read
;) { // SPEC error
1298 unsigned inverse_class
= ff_inverse
[vr
->classifications
];
1299 for (j_times_ptns_to_read
= 0, j
= 0; j
< ch_used
; ++j
) {
1300 if (!do_not_decode
[j
]) {
1301 unsigned temp
= get_vlc2(gb
, vc
->codebooks
[vr
->classbook
].vlc
.table
,
1302 vc
->codebooks
[vr
->classbook
].nb_bits
, 3);
1304 AV_DEBUG("Classword: %u\n", temp
);
1306 assert(vr
->classifications
> 1 && temp
<= 65536); //needed for inverse[]
1307 for (i
= 0; i
< c_p_c
; ++i
) {
1310 temp2
= (((uint64_t)temp
) * inverse_class
) >> 32;
1311 if (partition_count
+ c_p_c
- 1 - i
< ptns_to_read
)
1312 classifs
[j_times_ptns_to_read
+ partition_count
+ c_p_c
- 1 - i
] = temp
- temp2
* vr
->classifications
;
1316 j_times_ptns_to_read
+= ptns_to_read
;
1319 for (i
= 0; (i
< c_p_c
) && (partition_count
< ptns_to_read
); ++i
) {
1320 for (j_times_ptns_to_read
= 0, j
= 0; j
< ch_used
; ++j
) {
1323 if (!do_not_decode
[j
]) {
1324 unsigned vqclass
= classifs
[j_times_ptns_to_read
+ partition_count
];
1325 int vqbook
= vr
->books
[vqclass
][pass
];
1327 if (vqbook
>= 0 && vc
->codebooks
[vqbook
].codevectors
) {
1329 unsigned dim
= vc
->codebooks
[vqbook
].dimensions
;
1330 unsigned step
= dim
== 1 ? vr
->partition_size
1331 : FASTDIV(vr
->partition_size
, dim
);
1332 vorbis_codebook codebook
= vc
->codebooks
[vqbook
];
1336 voffs
= voffset
+j
*vlen
;
1337 for (k
= 0; k
< step
; ++k
) {
1338 coffs
= get_vlc2(gb
, codebook
.vlc
.table
, codebook
.nb_bits
, 3) * dim
;
1339 for (l
= 0; l
< dim
; ++l
)
1340 vec
[voffs
+ k
+ l
* step
] += codebook
.codevectors
[coffs
+ l
]; // FPMATH
1342 } else if (vr_type
== 1) {
1343 voffs
= voffset
+ j
* vlen
;
1344 for (k
= 0; k
< step
; ++k
) {
1345 coffs
= get_vlc2(gb
, codebook
.vlc
.table
, codebook
.nb_bits
, 3) * dim
;
1346 for (l
= 0; l
< dim
; ++l
, ++voffs
) {
1347 vec
[voffs
]+=codebook
.codevectors
[coffs
+l
]; // FPMATH
1349 AV_DEBUG(" pass %d offs: %d curr: %f change: %f cv offs.: %d \n", pass
, voffs
, vec
[voffs
], codebook
.codevectors
[coffs
+l
], coffs
);
1352 } else if (vr_type
== 2 && ch
== 2 && (voffset
& 1) == 0 && (dim
& 1) == 0) { // most frequent case optimized
1353 voffs
= voffset
>> 1;
1356 for (k
= 0; k
< step
; ++k
) {
1357 coffs
= get_vlc2(gb
, codebook
.vlc
.table
, codebook
.nb_bits
, 3) * 2;
1358 vec
[voffs
+ k
] += codebook
.codevectors
[coffs
]; // FPMATH
1359 vec
[voffs
+ k
+ vlen
] += codebook
.codevectors
[coffs
+ 1]; // FPMATH
1361 } else if (dim
== 4) {
1362 for (k
= 0; k
< step
; ++k
, voffs
+= 2) {
1363 coffs
= get_vlc2(gb
, codebook
.vlc
.table
, codebook
.nb_bits
, 3) * 4;
1364 vec
[voffs
] += codebook
.codevectors
[coffs
]; // FPMATH
1365 vec
[voffs
+ 1 ] += codebook
.codevectors
[coffs
+ 2]; // FPMATH
1366 vec
[voffs
+ vlen
] += codebook
.codevectors
[coffs
+ 1]; // FPMATH
1367 vec
[voffs
+ vlen
+ 1] += codebook
.codevectors
[coffs
+ 3]; // FPMATH
1370 for (k
= 0; k
< step
; ++k
) {
1371 coffs
= get_vlc2(gb
, codebook
.vlc
.table
, codebook
.nb_bits
, 3) * dim
;
1372 for (l
= 0; l
< dim
; l
+= 2, voffs
++) {
1373 vec
[voffs
] += codebook
.codevectors
[coffs
+ l
]; // FPMATH
1374 vec
[voffs
+ vlen
] += codebook
.codevectors
[coffs
+ l
+ 1]; // FPMATH
1376 AV_DEBUG(" pass %d offs: %d curr: %f change: %f cv offs.: %d+%d \n", pass
, voffset
/ ch
+ (voffs
% ch
) * vlen
, vec
[voffset
/ ch
+ (voffs
% ch
) * vlen
], codebook
.codevectors
[coffs
+ l
], coffs
, l
);
1380 } else if (vr_type
== 2) {
1383 for (k
= 0; k
< step
; ++k
) {
1384 coffs
= get_vlc2(gb
, codebook
.vlc
.table
, codebook
.nb_bits
, 3) * dim
;
1385 for (l
= 0; l
< dim
; ++l
, ++voffs
) {
1386 vec
[voffs
/ ch
+ (voffs
% ch
) * vlen
] += codebook
.codevectors
[coffs
+ l
]; // FPMATH FIXME use if and counter instead of / and %
1388 AV_DEBUG(" pass %d offs: %d curr: %f change: %f cv offs.: %d+%d \n", pass
, voffset
/ ch
+ (voffs
% ch
) * vlen
, vec
[voffset
/ ch
+ (voffs
% ch
) * vlen
], codebook
.codevectors
[coffs
+ l
], coffs
, l
);
1394 j_times_ptns_to_read
+= ptns_to_read
;
1397 voffset
+= vr
->partition_size
;
1404 static inline int vorbis_residue_decode(vorbis_context
*vc
, vorbis_residue
*vr
,
1406 uint_fast8_t *do_not_decode
,
1407 float *vec
, unsigned vlen
)
1410 return vorbis_residue_decode_internal(vc
, vr
, ch
, do_not_decode
, vec
, vlen
, 2);
1411 else if (vr
->type
== 1)
1412 return vorbis_residue_decode_internal(vc
, vr
, ch
, do_not_decode
, vec
, vlen
, 1);
1413 else if (vr
->type
== 0)
1414 return vorbis_residue_decode_internal(vc
, vr
, ch
, do_not_decode
, vec
, vlen
, 0);
1416 av_log(vc
->avccontext
, AV_LOG_ERROR
, " Invalid residue type while residue decode?! \n");
1421 void vorbis_inverse_coupling(float *mag
, float *ang
, int blocksize
)
1424 for (i
= 0; i
< blocksize
; i
++) {
1427 ang
[i
] = mag
[i
] - ang
[i
];
1429 float temp
= ang
[i
];
1437 float temp
= ang
[i
];
1445 // Decode the audio packet using the functions above
1447 static int vorbis_parse_audio_packet(vorbis_context
*vc
)
1449 GetBitContext
*gb
= &vc
->gb
;
1451 unsigned previous_window
= vc
->previous_window
;
1452 unsigned mode_number
, blockflag
, blocksize
;
1454 uint_fast8_t no_residue
[255];
1455 uint_fast8_t do_not_decode
[255];
1456 vorbis_mapping
*mapping
;
1457 float *ch_res_ptr
= vc
->channel_residues
;
1458 float *ch_floor_ptr
= vc
->channel_floors
;
1459 uint_fast8_t res_chan
[255];
1460 unsigned res_num
= 0;
1463 if (get_bits1(gb
)) {
1464 av_log(vc
->avccontext
, AV_LOG_ERROR
, "Not a Vorbis I audio packet.\n");
1465 return -1; // packet type not audio
1468 if (vc
->mode_count
== 1) {
1471 GET_VALIDATED_INDEX(mode_number
, ilog(vc
->mode_count
-1), vc
->mode_count
)
1473 vc
->mode_number
= mode_number
;
1474 mapping
= &vc
->mappings
[vc
->modes
[mode_number
].mapping
];
1476 AV_DEBUG(" Mode number: %u , mapping: %d , blocktype %d\n", mode_number
,
1477 vc
->modes
[mode_number
].mapping
, vc
->modes
[mode_number
].blockflag
);
1479 blockflag
= vc
->modes
[mode_number
].blockflag
;
1480 blocksize
= vc
->blocksize
[blockflag
];
1482 skip_bits(gb
, 2); // previous_window, next_window
1484 memset(ch_res_ptr
, 0, sizeof(float) * vc
->audio_channels
* blocksize
/ 2); //FIXME can this be removed ?
1485 memset(ch_floor_ptr
, 0, sizeof(float) * vc
->audio_channels
* blocksize
/ 2); //FIXME can this be removed ?
1489 for (i
= 0; i
< vc
->audio_channels
; ++i
) {
1490 vorbis_floor
*floor
;
1492 if (mapping
->submaps
> 1) {
1493 floor
= &vc
->floors
[mapping
->submap_floor
[mapping
->mux
[i
]]];
1495 floor
= &vc
->floors
[mapping
->submap_floor
[0]];
1498 ret
= floor
->decode(vc
, &floor
->data
, ch_floor_ptr
);
1501 av_log(vc
->avccontext
, AV_LOG_ERROR
, "Invalid codebook in vorbis_floor_decode.\n");
1504 no_residue
[i
] = ret
;
1505 ch_floor_ptr
+= blocksize
/ 2;
1508 // Nonzero vector propagate
1510 for (i
= mapping
->coupling_steps
- 1; i
>= 0; --i
) {
1511 if (!(no_residue
[mapping
->magnitude
[i
]] & no_residue
[mapping
->angle
[i
]])) {
1512 no_residue
[mapping
->magnitude
[i
]] = 0;
1513 no_residue
[mapping
->angle
[i
]] = 0;
1519 for (i
= 0; i
< mapping
->submaps
; ++i
) {
1520 vorbis_residue
*residue
;
1523 for (j
= 0; j
< vc
->audio_channels
; ++j
) {
1524 if ((mapping
->submaps
== 1) || (i
== mapping
->mux
[j
])) {
1525 res_chan
[j
] = res_num
;
1526 if (no_residue
[j
]) {
1527 do_not_decode
[ch
] = 1;
1529 do_not_decode
[ch
] = 0;
1535 residue
= &vc
->residues
[mapping
->submap_residue
[i
]];
1536 vorbis_residue_decode(vc
, residue
, ch
, do_not_decode
, ch_res_ptr
, blocksize
/2);
1538 ch_res_ptr
+= ch
* blocksize
/ 2;
1543 for (i
= mapping
->coupling_steps
- 1; i
>= 0; --i
) { //warning: i has to be signed
1546 mag
= vc
->channel_residues
+res_chan
[mapping
->magnitude
[i
]] * blocksize
/ 2;
1547 ang
= vc
->channel_residues
+res_chan
[mapping
->angle
[i
]] * blocksize
/ 2;
1548 vc
->dsp
.vorbis_inverse_coupling(mag
, ang
, blocksize
/ 2);
1553 mdct
= &vc
->mdct
[blockflag
];
1555 for (j
= vc
->audio_channels
-1;j
>= 0; j
--) {
1556 ch_floor_ptr
= vc
->channel_floors
+ j
* blocksize
/ 2;
1557 ch_res_ptr
= vc
->channel_residues
+ res_chan
[j
] * blocksize
/ 2;
1558 vc
->dsp
.vector_fmul(ch_floor_ptr
, ch_floor_ptr
, ch_res_ptr
, blocksize
/ 2);
1559 mdct
->imdct_half(mdct
, ch_res_ptr
, ch_floor_ptr
);
1562 // Overlap/add, save data for next overlapping FPMATH
1564 retlen
= (blocksize
+ vc
->blocksize
[previous_window
]) / 4;
1565 for (j
= 0; j
< vc
->audio_channels
; j
++) {
1566 unsigned bs0
= vc
->blocksize
[0];
1567 unsigned bs1
= vc
->blocksize
[1];
1568 float *residue
= vc
->channel_residues
+ res_chan
[j
] * blocksize
/ 2;
1569 float *saved
= vc
->saved
+ j
* bs1
/ 4;
1570 float *ret
= vc
->channel_floors
+ j
* retlen
;
1571 float *buf
= residue
;
1572 const float *win
= vc
->win
[blockflag
& previous_window
];
1574 if (blockflag
== previous_window
) {
1575 vc
->dsp
.vector_fmul_window(ret
, saved
, buf
, win
, blocksize
/ 4);
1576 } else if (blockflag
> previous_window
) {
1577 vc
->dsp
.vector_fmul_window(ret
, saved
, buf
, win
, bs0
/ 4);
1578 memcpy(ret
+bs0
/2, buf
+bs0
/4, ((bs1
-bs0
)/4) * sizeof(float));
1580 memcpy(ret
, saved
, ((bs1
- bs0
) / 4) * sizeof(float));
1581 vc
->dsp
.vector_fmul_window(ret
+ (bs1
- bs0
) / 4, saved
+ (bs1
- bs0
) / 4, buf
, win
, bs0
/ 4);
1583 memcpy(saved
, buf
+ blocksize
/ 4, blocksize
/ 4 * sizeof(float));
1586 vc
->previous_window
= blockflag
;
1590 // Return the decoded audio packet through the standard api
1592 static int vorbis_decode_frame(AVCodecContext
*avccontext
,
1593 void *data
, int *data_size
,
1596 const uint8_t *buf
= avpkt
->data
;
1597 int buf_size
= avpkt
->size
;
1598 vorbis_context
*vc
= avccontext
->priv_data
;
1599 GetBitContext
*gb
= &(vc
->gb
);
1600 const float *channel_ptrs
[255];
1606 AV_DEBUG("packet length %d \n", buf_size
);
1608 init_get_bits(gb
, buf
, buf_size
*8);
1610 len
= vorbis_parse_audio_packet(vc
);
1617 if (!vc
->first_frame
) {
1618 vc
->first_frame
= 1;
1623 AV_DEBUG("parsed %d bytes %d bits, returned %d samples (*ch*bits) \n", get_bits_count(gb
)/8, get_bits_count(gb
)%8, len
);
1625 if (vc
->audio_channels
> 8) {
1626 for (i
= 0; i
< vc
->audio_channels
; i
++)
1627 channel_ptrs
[i
] = vc
->channel_floors
+ i
* len
;
1629 for (i
= 0; i
< vc
->audio_channels
; i
++)
1630 channel_ptrs
[i
] = vc
->channel_floors
+
1631 len
* ff_vorbis_channel_layout_offsets
[vc
->audio_channels
- 1][i
];
1634 vc
->fmt_conv
.float_to_int16_interleave(data
, channel_ptrs
, len
,
1635 vc
->audio_channels
);
1636 *data_size
= len
* 2 * vc
->audio_channels
;
1643 static av_cold
int vorbis_decode_close(AVCodecContext
*avccontext
)
1645 vorbis_context
*vc
= avccontext
->priv_data
;
1652 AVCodec ff_vorbis_decoder
= {
1656 sizeof(vorbis_context
),
1659 vorbis_decode_close
,
1660 vorbis_decode_frame
,
1661 .long_name
= NULL_IF_CONFIG_SMALL("Vorbis"),
1662 .channel_layouts
= ff_vorbis_channel_layouts
,