1// Ogg Vorbis audio decoder - v1.14 - public domain
2// http://nothings.org/stb_vorbis/
3//
4// Original version written by Sean Barrett in 2007.
5//
6// Originally sponsored by RAD Game Tools. Seeking implementation
7// sponsored by Phillip Bennefall, Marc Andersen, Aaron Baker,
8// Elias Software, Aras Pranckevicius, and Sean Barrett.
9//
10// LICENSE
11//
12// See end of file for license information.
13//
14// Limitations:
15//
16// - floor 0 not supported (used in old ogg vorbis files pre-2004)
17// - lossless sample-truncation at beginning ignored
18// - cannot concatenate multiple vorbis streams
19// - sample positions are 32-bit, limiting seekable 192Khz
20// files to around 6 hours (Ogg supports 64-bit)
21//
22// Feature contributors:
23// Dougall Johnson (sample-exact seeking)
24//
25// Bugfix/warning contributors:
26// Terje Mathisen Niklas Frykholm Andy Hill
27// Casey Muratori John Bolton Gargaj
28// Laurent Gomila Marc LeBlanc Ronny Chevalier
29// Bernhard Wodo Evan Balster alxprd@github
30// Tom Beaumont Ingo Leitgeb Nicolas Guillemot
31// Phillip Bennefall Rohit Thiago Goulart
32// manxorist@github saga musix github:infatum
33// Timur Gagiev BareRose
34//
35// Partial history:
36// 1.14 - 2018-02-11 - delete bogus dealloca usage
37// 1.13 - 2018-01-29 - fix truncation of last frame (hopefully)
38// 1.12 - 2017-11-21 - limit residue begin/end to blocksize/2 to avoid large temp allocs in bad/corrupt files
39// 1.11 - 2017-07-23 - fix MinGW compilation
40// 1.10 - 2017-03-03 - more robust seeking; fix negative stbv_ilog(); clear error in open_memory
41// 1.09 - 2016-04-04 - back out 'truncation of last frame' fix from previous version
42// 1.08 - 2016-04-02 - warnings; setup memory leaks; truncation of last frame
43// 1.07 - 2015-01-16 - fixes for crashes on invalid files; warning fixes; const
44// 1.06 - 2015-08-31 - full, correct support for seeking API (Dougall Johnson)
45// some crash fixes when out of memory or with corrupt files
46// fix some inappropriately signed shifts
47// 1.05 - 2015-04-19 - don't define __forceinline if it's redundant
48// 1.04 - 2014-08-27 - fix missing const-correct case in API
49// 1.03 - 2014-08-07 - warning fixes
50// 1.02 - 2014-07-09 - declare qsort comparison as explicitly _cdecl in Windows
51// 1.01 - 2014-06-18 - fix stb_vorbis_get_samples_float (interleaved was correct)
52// 1.0 - 2014-05-26 - fix memory leaks; fix warnings; fix bugs in >2-channel;
53// (API change) report sample rate for decode-full-file funcs
54//
55// See end of file for full version history.
56
57
58//////////////////////////////////////////////////////////////////////////////
59//
60// HEADER BEGINS HERE
61//
62
63#ifndef STB_VORBIS_INCLUDE_STB_VORBIS_H
64#define STB_VORBIS_INCLUDE_STB_VORBIS_H
65
66#if defined(STB_VORBIS_NO_CRT) && !defined(STB_VORBIS_NO_STDIO)
67#define STB_VORBIS_NO_STDIO
68#endif
69
70#ifndef STB_VORBIS_NO_STDIO
71#include <stdio.h>
72#endif
73
74// NOTE: Added to work with raylib on Android
75#if defined(PLATFORM_ANDROID)
76 #include "utils.h" // Android fopen function map
77#endif
78
79#ifdef __cplusplus
80extern "C" {
81#endif
82
83#ifdef STB_VORBIS_STATIC
84#define STBVDEF static
85#else
86#define STBVDEF extern
87#endif
88
89/////////// THREAD SAFETY
90
91// Individual stb_vorbis* handles are not thread-safe; you cannot decode from
92// them from multiple threads at the same time. However, you can have multiple
93// stb_vorbis* handles and decode from them independently in multiple thrads.
94
95
96/////////// MEMORY ALLOCATION
97
98// normally stb_vorbis uses malloc() to allocate memory at startup,
99// and alloca() to allocate temporary memory during a frame on the
100// stack. (Memory consumption will depend on the amount of setup
101// data in the file and how you set the compile flags for speed
102// vs. size. In my test files the maximal-size usage is ~150KB.)
103//
104// You can modify the wrapper functions in the source (stbv_setup_malloc,
105// stbv_setup_temp_malloc, temp_malloc) to change this behavior, or you
106// can use a simpler allocation model: you pass in a buffer from
107// which stb_vorbis will allocate _all_ its memory (including the
108// temp memory). "open" may fail with a VORBIS_outofmem if you
109// do not pass in enough data; there is no way to determine how
110// much you do need except to succeed (at which point you can
111// query get_info to find the exact amount required. yes I know
112// this is lame).
113//
114// If you pass in a non-NULL buffer of the type below, allocation
115// will occur from it as described above. Otherwise just pass NULL
116// to use malloc()/alloca()
117
118typedef struct
119{
120 char *alloc_buffer;
121 int alloc_buffer_length_in_bytes;
122} stb_vorbis_alloc;
123
124
125/////////// FUNCTIONS USEABLE WITH ALL INPUT MODES
126
127typedef struct stb_vorbis stb_vorbis;
128
129typedef struct
130{
131 unsigned int sample_rate;
132 int channels;
133
134 unsigned int setup_memory_required;
135 unsigned int setup_temp_memory_required;
136 unsigned int temp_memory_required;
137
138 int max_frame_size;
139} stb_vorbis_info;
140
141// get general information about the file
142STBVDEF stb_vorbis_info stb_vorbis_get_info(stb_vorbis *f);
143
144// get the last error detected (clears it, too)
145STBVDEF int stb_vorbis_get_error(stb_vorbis *f);
146
147// close an ogg vorbis file and free all memory in use
148STBVDEF void stb_vorbis_close(stb_vorbis *f);
149
150// this function returns the offset (in samples) from the beginning of the
151// file that will be returned by the next decode, if it is known, or -1
152// otherwise. after a flush_pushdata() call, this may take a while before
153// it becomes valid again.
154// NOT WORKING YET after a seek with PULLDATA API
155STBVDEF int stb_vorbis_get_sample_offset(stb_vorbis *f);
156
157// returns the current seek point within the file, or offset from the beginning
158// of the memory buffer. In pushdata mode it returns 0.
159STBVDEF unsigned int stb_vorbis_get_file_offset(stb_vorbis *f);
160
161/////////// PUSHDATA API
162
163#ifndef STB_VORBIS_NO_PUSHDATA_API
164
165// this API allows you to get blocks of data from any source and hand
166// them to stb_vorbis. you have to buffer them; stb_vorbis will tell
167// you how much it used, and you have to give it the rest next time;
168// and stb_vorbis may not have enough data to work with and you will
169// need to give it the same data again PLUS more. Note that the Vorbis
170// specification does not bound the size of an individual frame.
171
172STBVDEF stb_vorbis *stb_vorbis_open_pushdata(
173 const unsigned char * datablock, int datablock_length_in_bytes,
174 int *datablock_memory_consumed_in_bytes,
175 int *error,
176 const stb_vorbis_alloc *alloc_buffer);
177// create a vorbis decoder by passing in the initial data block containing
178// the ogg&vorbis headers (you don't need to do parse them, just provide
179// the first N bytes of the file--you're told if it's not enough, see below)
180// on success, returns an stb_vorbis *, does not set error, returns the amount of
181// data parsed/consumed on this call in *datablock_memory_consumed_in_bytes;
182// on failure, returns NULL on error and sets *error, does not change *datablock_memory_consumed
183// if returns NULL and *error is VORBIS_need_more_data, then the input block was
184// incomplete and you need to pass in a larger block from the start of the file
185
186STBVDEF int stb_vorbis_decode_frame_pushdata(
187 stb_vorbis *f,
188 const unsigned char *datablock, int datablock_length_in_bytes,
189 int *channels, // place to write number of float * buffers
190 float ***output, // place to write float ** array of float * buffers
191 int *samples // place to write number of output samples
192 );
193// decode a frame of audio sample data if possible from the passed-in data block
194//
195// return value: number of bytes we used from datablock
196//
197// possible cases:
198// 0 bytes used, 0 samples output (need more data)
199// N bytes used, 0 samples output (resynching the stream, keep going)
200// N bytes used, M samples output (one frame of data)
201// note that after opening a file, you will ALWAYS get one N-bytes,0-sample
202// frame, because Vorbis always "discards" the first frame.
203//
204// Note that on resynch, stb_vorbis will rarely consume all of the buffer,
205// instead only datablock_length_in_bytes-3 or less. This is because it wants
206// to avoid missing parts of a page header if they cross a datablock boundary,
207// without writing state-machiney code to record a partial detection.
208//
209// The number of channels returned are stored in *channels (which can be
210// NULL--it is always the same as the number of channels reported by
211// get_info). *output will contain an array of float* buffers, one per
212// channel. In other words, (*output)[0][0] contains the first sample from
213// the first channel, and (*output)[1][0] contains the first sample from
214// the second channel.
215
216STBVDEF void stb_vorbis_flush_pushdata(stb_vorbis *f);
217// inform stb_vorbis that your next datablock will not be contiguous with
218// previous ones (e.g. you've seeked in the data); future attempts to decode
219// frames will cause stb_vorbis to resynchronize (as noted above), and
220// once it sees a valid Ogg page (typically 4-8KB, as large as 64KB), it
221// will begin decoding the _next_ frame.
222//
223// if you want to seek using pushdata, you need to seek in your file, then
224// call stb_vorbis_flush_pushdata(), then start calling decoding, then once
225// decoding is returning you data, call stb_vorbis_get_sample_offset, and
226// if you don't like the result, seek your file again and repeat.
227#endif
228
229
230////////// PULLING INPUT API
231
232#ifndef STB_VORBIS_NO_PULLDATA_API
233// This API assumes stb_vorbis is allowed to pull data from a source--
234// either a block of memory containing the _entire_ vorbis stream, or a
235// FILE * that you or it create, or possibly some other reading mechanism
236// if you go modify the source to replace the FILE * case with some kind
237// of callback to your code. (But if you don't support seeking, you may
238// just want to go ahead and use pushdata.)
239
240#if !defined(STB_VORBIS_NO_STDIO) && !defined(STB_VORBIS_NO_INTEGER_CONVERSION)
241STBVDEF int stb_vorbis_decode_filename(const char *filename, int *channels, int *sample_rate, short **output);
242#endif
243#ifndef STB_VORBIS_NO_INTEGER_CONVERSION
244STBVDEF int stb_vorbis_decode_memory(const unsigned char *mem, int len, int *channels, int *sample_rate, short **output);
245#endif
246// decode an entire file and output the data interleaved into a malloc()ed
247// buffer stored in *output. The return value is the number of samples
248// decoded, or -1 if the file could not be opened or was not an ogg vorbis file.
249// When you're done with it, just free() the pointer returned in *output.
250
251STBVDEF stb_vorbis * stb_vorbis_open_memory(const unsigned char *data, int len,
252 int *error, const stb_vorbis_alloc *alloc_buffer);
253// create an ogg vorbis decoder from an ogg vorbis stream in memory (note
254// this must be the entire stream!). on failure, returns NULL and sets *error
255
256#ifndef STB_VORBIS_NO_STDIO
257STBVDEF stb_vorbis * stb_vorbis_open_filename(const char *filename,
258 int *error, const stb_vorbis_alloc *alloc_buffer);
259// create an ogg vorbis decoder from a filename via fopen(). on failure,
260// returns NULL and sets *error (possibly to VORBIS_file_open_failure).
261
262STBVDEF stb_vorbis * stb_vorbis_open_file(FILE *f, int close_handle_on_close,
263 int *error, const stb_vorbis_alloc *alloc_buffer);
264// create an ogg vorbis decoder from an open FILE *, looking for a stream at
265// the _current_ seek point (ftell). on failure, returns NULL and sets *error.
266// note that stb_vorbis must "own" this stream; if you seek it in between
267// calls to stb_vorbis, it will become confused. Morever, if you attempt to
268// perform stb_vorbis_seek_*() operations on this file, it will assume it
269// owns the _entire_ rest of the file after the start point. Use the next
270// function, stb_vorbis_open_file_section(), to limit it.
271
272STBVDEF stb_vorbis * stb_vorbis_open_file_section(FILE *f, int close_handle_on_close,
273 int *error, const stb_vorbis_alloc *alloc_buffer, unsigned int len);
274// create an ogg vorbis decoder from an open FILE *, looking for a stream at
275// the _current_ seek point (ftell); the stream will be of length 'len' bytes.
276// on failure, returns NULL and sets *error. note that stb_vorbis must "own"
277// this stream; if you seek it in between calls to stb_vorbis, it will become
278// confused.
279#endif
280
281STBVDEF int stb_vorbis_seek_frame(stb_vorbis *f, unsigned int sample_number);
282STBVDEF int stb_vorbis_seek(stb_vorbis *f, unsigned int sample_number);
283// these functions seek in the Vorbis file to (approximately) 'sample_number'.
284// after calling seek_frame(), the next call to get_frame_*() will include
285// the specified sample. after calling stb_vorbis_seek(), the next call to
286// stb_vorbis_get_samples_* will start with the specified sample. If you
287// do not need to seek to EXACTLY the target sample when using get_samples_*,
288// you can also use seek_frame().
289
290STBVDEF int stb_vorbis_seek_start(stb_vorbis *f);
291// this function is equivalent to stb_vorbis_seek(f,0)
292
293STBVDEF unsigned int stb_vorbis_stream_length_in_samples(stb_vorbis *f);
294STBVDEF float stb_vorbis_stream_length_in_seconds(stb_vorbis *f);
295// these functions return the total length of the vorbis stream
296
297STBVDEF int stb_vorbis_get_frame_float(stb_vorbis *f, int *channels, float ***output);
298// decode the next frame and return the number of samples. the number of
299// channels returned are stored in *channels (which can be NULL--it is always
300// the same as the number of channels reported by get_info). *output will
301// contain an array of float* buffers, one per channel. These outputs will
302// be overwritten on the next call to stb_vorbis_get_frame_*.
303//
304// You generally should not intermix calls to stb_vorbis_get_frame_*()
305// and stb_vorbis_get_samples_*(), since the latter calls the former.
306
307#ifndef STB_VORBIS_NO_INTEGER_CONVERSION
308STBVDEF int stb_vorbis_get_frame_short_interleaved(stb_vorbis *f, int num_c, short *buffer, int num_shorts);
309STBVDEF int stb_vorbis_get_frame_short (stb_vorbis *f, int num_c, short **buffer, int num_samples);
310#endif
311// decode the next frame and return the number of *samples* per channel.
312// Note that for interleaved data, you pass in the number of shorts (the
313// size of your array), but the return value is the number of samples per
314// channel, not the total number of samples.
315//
316// The data is coerced to the number of channels you request according to the
317// channel coercion rules (see below). You must pass in the size of your
318// buffer(s) so that stb_vorbis will not overwrite the end of the buffer.
319// The maximum buffer size needed can be gotten from get_info(); however,
320// the Vorbis I specification implies an absolute maximum of 4096 samples
321// per channel.
322
323// Channel coercion rules:
324// Let M be the number of channels requested, and N the number of channels present,
325// and Cn be the nth channel; let stereo L be the sum of all L and center channels,
326// and stereo R be the sum of all R and center channels (channel assignment from the
327// vorbis spec).
328// M N output
329// 1 k sum(Ck) for all k
330// 2 * stereo L, stereo R
331// k l k > l, the first l channels, then 0s
332// k l k <= l, the first k channels
333// Note that this is not _good_ surround etc. mixing at all! It's just so
334// you get something useful.
335
336STBVDEF int stb_vorbis_get_samples_float_interleaved(stb_vorbis *f, int channels, float *buffer, int num_floats);
337STBVDEF int stb_vorbis_get_samples_float(stb_vorbis *f, int channels, float **buffer, int num_samples);
338// gets num_samples samples, not necessarily on a frame boundary--this requires
339// buffering so you have to supply the buffers. DOES NOT APPLY THE COERCION RULES.
340// Returns the number of samples stored per channel; it may be less than requested
341// at the end of the file. If there are no more samples in the file, returns 0.
342
343#ifndef STB_VORBIS_NO_INTEGER_CONVERSION
344STBVDEF int stb_vorbis_get_samples_short_interleaved(stb_vorbis *f, int channels, short *buffer, int num_shorts);
345STBVDEF int stb_vorbis_get_samples_short(stb_vorbis *f, int channels, short **buffer, int num_samples);
346#endif
347// gets num_samples samples, not necessarily on a frame boundary--this requires
348// buffering so you have to supply the buffers. Applies the coercion rules above
349// to produce 'channels' channels. Returns the number of samples stored per channel;
350// it may be less than requested at the end of the file. If there are no more
351// samples in the file, returns 0.
352
353#endif
354
355//////// ERROR CODES
356
357enum STBVorbisError
358{
359 VORBIS__no_error,
360
361 VORBIS_need_more_data=1, // not a real error
362
363 VORBIS_invalid_api_mixing, // can't mix API modes
364 VORBIS_outofmem, // not enough memory
365 VORBIS_feature_not_supported, // uses floor 0
366 VORBIS_too_many_channels, // STB_VORBIS_MAX_CHANNELS is too small
367 VORBIS_file_open_failure, // fopen() failed
368 VORBIS_seek_without_length, // can't seek in unknown-length file
369
370 VORBIS_unexpected_eof=10, // file is truncated?
371 VORBIS_seek_invalid, // seek past EOF
372
373 // decoding errors (corrupt/invalid stream) -- you probably
374 // don't care about the exact details of these
375
376 // vorbis errors:
377 VORBIS_invalid_setup=20,
378 VORBIS_invalid_stream,
379
380 // ogg errors:
381 VORBIS_missing_capture_pattern=30,
382 VORBIS_invalid_stream_structure_version,
383 VORBIS_continued_packet_flag_invalid,
384 VORBIS_incorrect_stream_serial_number,
385 VORBIS_invalid_first_page,
386 VORBIS_bad_packet_type,
387 VORBIS_cant_find_last_page,
388 VORBIS_seek_failed
389};
390
391
392#ifdef __cplusplus
393}
394#endif
395
396#endif // STB_VORBIS_INCLUDE_STB_VORBIS_H
397//
398// HEADER ENDS HERE
399//
400//////////////////////////////////////////////////////////////////////////////
401
402#ifdef STB_VORBIS_IMPLEMENTATION
403
404// global configuration settings (e.g. set these in the project/makefile),
405// or just set them in this file at the top (although ideally the first few
406// should be visible when the header file is compiled too, although it's not
407// crucial)
408
409// STB_VORBIS_NO_PUSHDATA_API
410// does not compile the code for the various stb_vorbis_*_pushdata()
411// functions
412// #define STB_VORBIS_NO_PUSHDATA_API
413
414// STB_VORBIS_NO_PULLDATA_API
415// does not compile the code for the non-pushdata APIs
416// #define STB_VORBIS_NO_PULLDATA_API
417
418// STB_VORBIS_NO_STDIO
419// does not compile the code for the APIs that use FILE *s internally
420// or externally (implied by STB_VORBIS_NO_PULLDATA_API)
421// #define STB_VORBIS_NO_STDIO
422
423// STB_VORBIS_NO_INTEGER_CONVERSION
424// does not compile the code for converting audio sample data from
425// float to integer (implied by STB_VORBIS_NO_PULLDATA_API)
426// #define STB_VORBIS_NO_INTEGER_CONVERSION
427
428// STB_VORBIS_NO_FAST_SCALED_FLOAT
429// does not use a fast float-to-int trick to accelerate float-to-int on
430// most platforms which requires endianness be defined correctly.
431// #define STB_VORBIS_NO_FAST_SCALED_FLOAT
432
433
434// STB_VORBIS_MAX_CHANNELS [number]
435// globally define this to the maximum number of channels you need.
436// The spec does not put a restriction on channels except that
437// the count is stored in a byte, so 255 is the hard limit.
438// Reducing this saves about 16 bytes per value, so using 16 saves
439// (255-16)*16 or around 4KB. Plus anything other memory usage
440// I forgot to account for. Can probably go as low as 8 (7.1 audio),
441// 6 (5.1 audio), or 2 (stereo only).
442#ifndef STB_VORBIS_MAX_CHANNELS
443#define STB_VORBIS_MAX_CHANNELS 16 // enough for anyone?
444#endif
445
446// STB_VORBIS_PUSHDATA_CRC_COUNT [number]
447// after a flush_pushdata(), stb_vorbis begins scanning for the
448// next valid page, without backtracking. when it finds something
449// that looks like a page, it streams through it and verifies its
450// CRC32. Should that validation fail, it keeps scanning. But it's
451// possible that _while_ streaming through to check the CRC32 of
452// one candidate page, it sees another candidate page. This #define
453// determines how many "overlapping" candidate pages it can search
454// at once. Note that "real" pages are typically ~4KB to ~8KB, whereas
455// garbage pages could be as big as 64KB, but probably average ~16KB.
456// So don't hose ourselves by scanning an apparent 64KB page and
457// missing a ton of real ones in the interim; so minimum of 2
458#ifndef STB_VORBIS_PUSHDATA_CRC_COUNT
459#define STB_VORBIS_PUSHDATA_CRC_COUNT 4
460#endif
461
462// STB_VORBIS_FAST_HUFFMAN_LENGTH [number]
463// sets the log size of the huffman-acceleration table. Maximum
464// supported value is 24. with larger numbers, more decodings are O(1),
465// but the table size is larger so worse cache missing, so you'll have
466// to probe (and try multiple ogg vorbis files) to find the sweet spot.
467#ifndef STB_VORBIS_FAST_HUFFMAN_LENGTH
468#define STB_VORBIS_FAST_HUFFMAN_LENGTH 10
469#endif
470
471// STB_VORBIS_FAST_BINARY_LENGTH [number]
472// sets the log size of the binary-search acceleration table. this
473// is used in similar fashion to the fast-huffman size to set initial
474// parameters for the binary search
475
476// STB_VORBIS_FAST_HUFFMAN_INT
477// The fast huffman tables are much more efficient if they can be
478// stored as 16-bit results instead of 32-bit results. This restricts
479// the codebooks to having only 65535 possible outcomes, though.
480// (At least, accelerated by the huffman table.)
481#ifndef STB_VORBIS_FAST_HUFFMAN_INT
482#define STB_VORBIS_FAST_HUFFMAN_SHORT
483#endif
484
485// STB_VORBIS_NO_HUFFMAN_BINARY_SEARCH
486// If the 'fast huffman' search doesn't succeed, then stb_vorbis falls
487// back on binary searching for the correct one. This requires storing
488// extra tables with the huffman codes in sorted order. Defining this
489// symbol trades off space for speed by forcing a linear search in the
490// non-fast case, except for "sparse" codebooks.
491// #define STB_VORBIS_NO_HUFFMAN_BINARY_SEARCH
492
493// STB_VORBIS_DIVIDES_IN_RESIDUE
494// stb_vorbis precomputes the result of the scalar residue decoding
495// that would otherwise require a divide per chunk. you can trade off
496// space for time by defining this symbol.
497// #define STB_VORBIS_DIVIDES_IN_RESIDUE
498
499// STB_VORBIS_DIVIDES_IN_CODEBOOK
500// vorbis VQ codebooks can be encoded two ways: with every case explicitly
501// stored, or with all elements being chosen from a small range of values,
502// and all values possible in all elements. By default, stb_vorbis expands
503// this latter kind out to look like the former kind for ease of decoding,
504// because otherwise an integer divide-per-vector-element is required to
505// unpack the index. If you define STB_VORBIS_DIVIDES_IN_CODEBOOK, you can
506// trade off storage for speed.
507//#define STB_VORBIS_DIVIDES_IN_CODEBOOK
508
509#ifdef STB_VORBIS_CODEBOOK_SHORTS
510#error "STB_VORBIS_CODEBOOK_SHORTS is no longer supported as it produced incorrect results for some input formats"
511#endif
512
513// STB_VORBIS_DIVIDE_TABLE
514// this replaces small integer divides in the floor decode loop with
515// table lookups. made less than 1% difference, so disabled by default.
516
517// STB_VORBIS_NO_INLINE_DECODE
518// disables the inlining of the scalar codebook fast-huffman decode.
519// might save a little codespace; useful for debugging
520// #define STB_VORBIS_NO_INLINE_DECODE
521
522// STB_VORBIS_NO_DEFER_FLOOR
523// Normally we only decode the floor without synthesizing the actual
524// full curve. We can instead synthesize the curve immediately. This
525// requires more memory and is very likely slower, so I don't think
526// you'd ever want to do it except for debugging.
527// #define STB_VORBIS_NO_DEFER_FLOOR
528
529
530
531
532//////////////////////////////////////////////////////////////////////////////
533
534#ifdef STB_VORBIS_NO_PULLDATA_API
535 #define STB_VORBIS_NO_INTEGER_CONVERSION
536 #define STB_VORBIS_NO_STDIO
537#endif
538
539#if defined(STB_VORBIS_NO_CRT) && !defined(STB_VORBIS_NO_STDIO)
540 #define STB_VORBIS_NO_STDIO 1
541#endif
542
543#ifndef STB_VORBIS_NO_INTEGER_CONVERSION
544#ifndef STB_VORBIS_NO_FAST_SCALED_FLOAT
545
546 // only need endianness for fast-float-to-int, which we don't
547 // use for pushdata
548
549 #ifndef STB_VORBIS_BIG_ENDIAN
550 #define STB_VORBIS_ENDIAN 0
551 #else
552 #define STB_VORBIS_ENDIAN 1
553 #endif
554
555#endif
556#endif
557
558
559#ifndef STB_VORBIS_NO_STDIO
560#include <stdio.h>
561#endif
562
563#ifndef STB_VORBIS_NO_CRT
564 #include <stdlib.h>
565 #include <string.h>
566 #include <assert.h>
567 #include <math.h>
568
569 // find definition of alloca if it's not in stdlib.h:
570 #if defined(_MSC_VER) || defined(__MINGW32__)
571 #include <malloc.h>
572 #endif
573 #if defined(__linux__) || defined(__linux) || defined(__EMSCRIPTEN__)
574 #include <alloca.h>
575 #endif
576#else // STB_VORBIS_NO_CRT
577 #define NULL 0
578 #define malloc(s) 0
579 #define free(s) ((void) 0)
580 #define realloc(s) 0
581#endif // STB_VORBIS_NO_CRT
582
583#include <limits.h>
584
585#ifdef __MINGW32__
586 // eff you mingw:
587 // "fixed":
588 // http://sourceforge.net/p/mingw-w64/mailman/message/32882927/
589 // "no that broke the build, reverted, who cares about C":
590 // http://sourceforge.net/p/mingw-w64/mailman/message/32890381/
591 #ifdef __forceinline
592 #undef __forceinline
593 #endif
594 #define __forceinline
595 #ifndef alloca
596 #define alloca(s) __builtin_alloca(s)
597 #endif
598#elif !defined(_MSC_VER)
599 #if __GNUC__
600 #define __forceinline inline
601 #else
602 #define __forceinline
603 #endif
604#endif
605
606#if STB_VORBIS_MAX_CHANNELS > 256
607#error "Value of STB_VORBIS_MAX_CHANNELS outside of allowed range"
608#endif
609
610#if STB_VORBIS_FAST_HUFFMAN_LENGTH > 24
611#error "Value of STB_VORBIS_FAST_HUFFMAN_LENGTH outside of allowed range"
612#endif
613
614
615#if 0
616#include <crtdbg.h>
617#define STBV_CHECK(f) _CrtIsValidHeapPointer(f->channel_buffers[1])
618#else
619#define STBV_CHECK(f) ((void) 0)
620#endif
621
622#define STBV_MAX_BLOCKSIZE_LOG 13 // from specification
623#define STBV_MAX_BLOCKSIZE (1 << STBV_MAX_BLOCKSIZE_LOG)
624
625
626typedef unsigned char stbv_uint8;
627typedef signed char stbv_int8;
628typedef unsigned short stbv_uint16;
629typedef signed short stbv_int16;
630typedef unsigned int stbv_uint32;
631typedef signed int stbv_int32;
632
633#ifndef TRUE
634#define TRUE 1
635#define FALSE 0
636#endif
637
638typedef float stbv_codetype;
639
640// @NOTE
641//
642// Some arrays below are tagged "//varies", which means it's actually
643// a variable-sized piece of data, but rather than malloc I assume it's
644// small enough it's better to just allocate it all together with the
645// main thing
646//
647// Most of the variables are specified with the smallest size I could pack
648// them into. It might give better performance to make them all full-sized
649// integers. It should be safe to freely rearrange the structures or change
650// the sizes larger--nothing relies on silently truncating etc., nor the
651// order of variables.
652
653#define STBV_FAST_HUFFMAN_TABLE_SIZE (1 << STB_VORBIS_FAST_HUFFMAN_LENGTH)
654#define STBV_FAST_HUFFMAN_TABLE_MASK (STBV_FAST_HUFFMAN_TABLE_SIZE - 1)
655
656typedef struct
657{
658 int dimensions, entries;
659 stbv_uint8 *codeword_lengths;
660 float minimum_value;
661 float delta_value;
662 stbv_uint8 value_bits;
663 stbv_uint8 lookup_type;
664 stbv_uint8 sequence_p;
665 stbv_uint8 sparse;
666 stbv_uint32 lookup_values;
667 stbv_codetype *multiplicands;
668 stbv_uint32 *codewords;
669 #ifdef STB_VORBIS_FAST_HUFFMAN_SHORT
670 stbv_int16 fast_huffman[STBV_FAST_HUFFMAN_TABLE_SIZE];
671 #else
672 stbv_int32 fast_huffman[STBV_FAST_HUFFMAN_TABLE_SIZE];
673 #endif
674 stbv_uint32 *sorted_codewords;
675 int *sorted_values;
676 int sorted_entries;
677} StbvCodebook;
678
679typedef struct
680{
681 stbv_uint8 order;
682 stbv_uint16 rate;
683 stbv_uint16 bark_map_size;
684 stbv_uint8 amplitude_bits;
685 stbv_uint8 amplitude_offset;
686 stbv_uint8 number_of_books;
687 stbv_uint8 book_list[16]; // varies
688} StbvFloor0;
689
690typedef struct
691{
692 stbv_uint8 partitions;
693 stbv_uint8 partition_class_list[32]; // varies
694 stbv_uint8 class_dimensions[16]; // varies
695 stbv_uint8 class_subclasses[16]; // varies
696 stbv_uint8 class_masterbooks[16]; // varies
697 stbv_int16 subclass_books[16][8]; // varies
698 stbv_uint16 Xlist[31*8+2]; // varies
699 stbv_uint8 sorted_order[31*8+2];
700 stbv_uint8 stbv_neighbors[31*8+2][2];
701 stbv_uint8 floor1_multiplier;
702 stbv_uint8 rangebits;
703 int values;
704} StbvFloor1;
705
706typedef union
707{
708 StbvFloor0 floor0;
709 StbvFloor1 floor1;
710} StbvFloor;
711
712typedef struct
713{
714 stbv_uint32 begin, end;
715 stbv_uint32 part_size;
716 stbv_uint8 classifications;
717 stbv_uint8 classbook;
718 stbv_uint8 **classdata;
719 stbv_int16 (*residue_books)[8];
720} StbvResidue;
721
722typedef struct
723{
724 stbv_uint8 magnitude;
725 stbv_uint8 angle;
726 stbv_uint8 mux;
727} StbvMappingChannel;
728
729typedef struct
730{
731 stbv_uint16 coupling_steps;
732 StbvMappingChannel *chan;
733 stbv_uint8 submaps;
734 stbv_uint8 submap_floor[15]; // varies
735 stbv_uint8 submap_residue[15]; // varies
736} StbvMapping;
737
738typedef struct
739{
740 stbv_uint8 blockflag;
741 stbv_uint8 mapping;
742 stbv_uint16 windowtype;
743 stbv_uint16 transformtype;
744} StbvMode;
745
746typedef struct
747{
748 stbv_uint32 goal_crc; // expected crc if match
749 int bytes_left; // bytes left in packet
750 stbv_uint32 crc_so_far; // running crc
751 int bytes_done; // bytes processed in _current_ chunk
752 stbv_uint32 sample_loc; // granule pos encoded in page
753} StbvCRCscan;
754
755typedef struct
756{
757 stbv_uint32 page_start, page_end;
758 stbv_uint32 last_decoded_sample;
759} StbvProbedPage;
760
761struct stb_vorbis
762{
763 // user-accessible info
764 unsigned int sample_rate;
765 int channels;
766
767 unsigned int setup_memory_required;
768 unsigned int temp_memory_required;
769 unsigned int setup_temp_memory_required;
770
771 // input config
772#ifndef STB_VORBIS_NO_STDIO
773 FILE *f;
774 stbv_uint32 f_start;
775 int close_on_free;
776#endif
777
778 stbv_uint8 *stream;
779 stbv_uint8 *stream_start;
780 stbv_uint8 *stream_end;
781
782 stbv_uint32 stream_len;
783
784 stbv_uint8 push_mode;
785
786 stbv_uint32 first_audio_page_offset;
787
788 StbvProbedPage p_first, p_last;
789
790 // memory management
791 stb_vorbis_alloc alloc;
792 int setup_offset;
793 int temp_offset;
794
795 // run-time results
796 int eof;
797 enum STBVorbisError error;
798
799 // user-useful data
800
801 // header info
802 int blocksize[2];
803 int blocksize_0, blocksize_1;
804 int codebook_count;
805 StbvCodebook *codebooks;
806 int floor_count;
807 stbv_uint16 floor_types[64]; // varies
808 StbvFloor *floor_config;
809 int residue_count;
810 stbv_uint16 residue_types[64]; // varies
811 StbvResidue *residue_config;
812 int mapping_count;
813 StbvMapping *mapping;
814 int mode_count;
815 StbvMode mode_config[64]; // varies
816
817 stbv_uint32 total_samples;
818
819 // decode buffer
820 float *channel_buffers[STB_VORBIS_MAX_CHANNELS];
821 float *outputs [STB_VORBIS_MAX_CHANNELS];
822
823 float *previous_window[STB_VORBIS_MAX_CHANNELS];
824 int previous_length;
825
826 #ifndef STB_VORBIS_NO_DEFER_FLOOR
827 stbv_int16 *finalY[STB_VORBIS_MAX_CHANNELS];
828 #else
829 float *floor_buffers[STB_VORBIS_MAX_CHANNELS];
830 #endif
831
832 stbv_uint32 current_loc; // sample location of next frame to decode
833 int current_loc_valid;
834
835 // per-blocksize precomputed data
836
837 // twiddle factors
838 float *A[2],*B[2],*C[2];
839 float *window[2];
840 stbv_uint16 *stbv_bit_reverse[2];
841
842 // current page/packet/segment streaming info
843 stbv_uint32 serial; // stream serial number for verification
844 int last_page;
845 int segment_count;
846 stbv_uint8 segments[255];
847 stbv_uint8 page_flag;
848 stbv_uint8 bytes_in_seg;
849 stbv_uint8 first_decode;
850 int next_seg;
851 int last_seg; // flag that we're on the last segment
852 int last_seg_which; // what was the segment number of the last seg?
853 stbv_uint32 acc;
854 int valid_bits;
855 int packet_bytes;
856 int end_seg_with_known_loc;
857 stbv_uint32 known_loc_for_packet;
858 int discard_samples_deferred;
859 stbv_uint32 samples_output;
860
861 // push mode scanning
862 int page_crc_tests; // only in push_mode: number of tests active; -1 if not searching
863#ifndef STB_VORBIS_NO_PUSHDATA_API
864 StbvCRCscan scan[STB_VORBIS_PUSHDATA_CRC_COUNT];
865#endif
866
867 // sample-access
868 int channel_buffer_start;
869 int channel_buffer_end;
870};
871
872#if defined(STB_VORBIS_NO_PUSHDATA_API)
873 #define STBV_IS_PUSH_MODE(f) FALSE
874#elif defined(STB_VORBIS_NO_PULLDATA_API)
875 #define STBV_IS_PUSH_MODE(f) TRUE
876#else
877 #define STBV_IS_PUSH_MODE(f) ((f)->push_mode)
878#endif
879
880typedef struct stb_vorbis stbv_vorb;
881
882static int stbv_error(stbv_vorb *f, enum STBVorbisError e)
883{
884 f->error = e;
885 if (!f->eof && e != VORBIS_need_more_data) {
886 f->error=e; // breakpoint for debugging
887 }
888 return 0;
889}
890
891
892// these functions are used for allocating temporary memory
893// while decoding. if you can afford the stack space, use
894// alloca(); otherwise, provide a temp buffer and it will
895// allocate out of those.
896
897#define stbv_array_size_required(count,size) (count*(sizeof(void *)+(size)))
898
899#define stbv_temp_alloc(f,size) (f->alloc.alloc_buffer ? stbv_setup_temp_malloc(f,size) : alloca(size))
900#define stbv_temp_free(f,p) 0
901#define stbv_temp_alloc_save(f) ((f)->temp_offset)
902#define stbv_temp_alloc_restore(f,p) ((f)->temp_offset = (p))
903
904#define stbv_temp_block_array(f,count,size) stbv_make_block_array(stbv_temp_alloc(f,stbv_array_size_required(count,size)), count, size)
905
906// given a sufficiently large block of memory, make an array of pointers to subblocks of it
907static void *stbv_make_block_array(void *mem, int count, int size)
908{
909 int i;
910 void ** p = (void **) mem;
911 char *q = (char *) (p + count);
912 for (i=0; i < count; ++i) {
913 p[i] = q;
914 q += size;
915 }
916 return p;
917}
918
919static void *stbv_setup_malloc(stbv_vorb *f, int sz)
920{
921 sz = (sz+3) & ~3;
922 f->setup_memory_required += sz;
923 if (f->alloc.alloc_buffer) {
924 void *p = (char *) f->alloc.alloc_buffer + f->setup_offset;
925 if (f->setup_offset + sz > f->temp_offset) return NULL;
926 f->setup_offset += sz;
927 return p;
928 }
929 return sz ? malloc(sz) : NULL;
930}
931
932static void stbv_setup_free(stbv_vorb *f, void *p)
933{
934 if (f->alloc.alloc_buffer) return; // do nothing; setup mem is a stack
935 free(p);
936}
937
938static void *stbv_setup_temp_malloc(stbv_vorb *f, int sz)
939{
940 sz = (sz+3) & ~3;
941 if (f->alloc.alloc_buffer) {
942 if (f->temp_offset - sz < f->setup_offset) return NULL;
943 f->temp_offset -= sz;
944 return (char *) f->alloc.alloc_buffer + f->temp_offset;
945 }
946 return malloc(sz);
947}
948
949static void stbv_setup_temp_free(stbv_vorb *f, void *p, int sz)
950{
951 if (f->alloc.alloc_buffer) {
952 f->temp_offset += (sz+3)&~3;
953 return;
954 }
955 free(p);
956}
957
958#define STBV_CRC32_POLY 0x04c11db7 // from spec
959
960static stbv_uint32 stbv_crc_table[256];
961static void stbv_crc32_init(void)
962{
963 int i,j;
964 stbv_uint32 s;
965 for(i=0; i < 256; i++) {
966 for (s=(stbv_uint32) i << 24, j=0; j < 8; ++j)
967 s = (s << 1) ^ (s >= (1U<<31) ? STBV_CRC32_POLY : 0);
968 stbv_crc_table[i] = s;
969 }
970}
971
972static __forceinline stbv_uint32 stbv_crc32_update(stbv_uint32 crc, stbv_uint8 byte)
973{
974 return (crc << 8) ^ stbv_crc_table[byte ^ (crc >> 24)];
975}
976
977
978// used in setup, and for huffman that doesn't go fast path
979static unsigned int stbv_bit_reverse(unsigned int n)
980{
981 n = ((n & 0xAAAAAAAA) >> 1) | ((n & 0x55555555) << 1);
982 n = ((n & 0xCCCCCCCC) >> 2) | ((n & 0x33333333) << 2);
983 n = ((n & 0xF0F0F0F0) >> 4) | ((n & 0x0F0F0F0F) << 4);
984 n = ((n & 0xFF00FF00) >> 8) | ((n & 0x00FF00FF) << 8);
985 return (n >> 16) | (n << 16);
986}
987
988static float stbv_square(float x)
989{
990 return x*x;
991}
992
993// this is a weird definition of log2() for which log2(1) = 1, log2(2) = 2, log2(4) = 3
994// as required by the specification. fast(?) implementation from stb.h
995// @OPTIMIZE: called multiple times per-packet with "constants"; move to setup
996static int stbv_ilog(stbv_int32 n)
997{
998 static signed char log2_4[16] = { 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4 };
999
1000 if (n < 0) return 0; // signed n returns 0
1001
1002 // 2 compares if n < 16, 3 compares otherwise (4 if signed or n > 1<<29)
1003 if (n < (1 << 14))
1004 if (n < (1 << 4)) return 0 + log2_4[n ];
1005 else if (n < (1 << 9)) return 5 + log2_4[n >> 5];
1006 else return 10 + log2_4[n >> 10];
1007 else if (n < (1 << 24))
1008 if (n < (1 << 19)) return 15 + log2_4[n >> 15];
1009 else return 20 + log2_4[n >> 20];
1010 else if (n < (1 << 29)) return 25 + log2_4[n >> 25];
1011 else return 30 + log2_4[n >> 30];
1012}
1013
1014#ifndef M_PI
1015 #define M_PI 3.14159265358979323846264f // from CRC
1016#endif
1017
1018// code length assigned to a value with no huffman encoding
1019#define NO_CODE 255
1020
1021/////////////////////// LEAF SETUP FUNCTIONS //////////////////////////
1022//
1023// these functions are only called at setup, and only a few times
1024// per file
1025
1026static float stbv_float32_unpack(stbv_uint32 x)
1027{
1028 // from the specification
1029 stbv_uint32 mantissa = x & 0x1fffff;
1030 stbv_uint32 sign = x & 0x80000000;
1031 stbv_uint32 exp = (x & 0x7fe00000) >> 21;
1032 double res = sign ? -(double)mantissa : (double)mantissa;
1033 return (float) ldexp((float)res, exp-788);
1034}
1035
1036
1037// zlib & jpeg huffman tables assume that the output symbols
1038// can either be arbitrarily arranged, or have monotonically
1039// increasing frequencies--they rely on the lengths being sorted;
1040// this makes for a very simple generation algorithm.
1041// vorbis allows a huffman table with non-sorted lengths. This
1042// requires a more sophisticated construction, since symbols in
1043// order do not map to huffman codes "in order".
1044static void stbv_add_entry(StbvCodebook *c, stbv_uint32 huff_code, int symbol, int count, int len, stbv_uint32 *values)
1045{
1046 if (!c->sparse) {
1047 c->codewords [symbol] = huff_code;
1048 } else {
1049 c->codewords [count] = huff_code;
1050 c->codeword_lengths[count] = len;
1051 values [count] = symbol;
1052 }
1053}
1054
1055static int stbv_compute_codewords(StbvCodebook *c, stbv_uint8 *len, int n, stbv_uint32 *values)
1056{
1057 int i,k,m=0;
1058 stbv_uint32 available[32];
1059
1060 memset(available, 0, sizeof(available));
1061 // find the first entry
1062 for (k=0; k < n; ++k) if (len[k] < NO_CODE) break;
1063 if (k == n) { assert(c->sorted_entries == 0); return TRUE; }
1064 // add to the list
1065 stbv_add_entry(c, 0, k, m++, len[k], values);
1066 // add all available leaves
1067 for (i=1; i <= len[k]; ++i)
1068 available[i] = 1U << (32-i);
1069 // note that the above code treats the first case specially,
1070 // but it's really the same as the following code, so they
1071 // could probably be combined (except the initial code is 0,
1072 // and I use 0 in available[] to mean 'empty')
1073 for (i=k+1; i < n; ++i) {
1074 stbv_uint32 res;
1075 int z = len[i], y;
1076 if (z == NO_CODE) continue;
1077 // find lowest available leaf (should always be earliest,
1078 // which is what the specification calls for)
1079 // note that this property, and the fact we can never have
1080 // more than one free leaf at a given level, isn't totally
1081 // trivial to prove, but it seems true and the assert never
1082 // fires, so!
1083 while (z > 0 && !available[z]) --z;
1084 if (z == 0) { return FALSE; }
1085 res = available[z];
1086 assert(z >= 0 && z < 32);
1087 available[z] = 0;
1088 stbv_add_entry(c, stbv_bit_reverse(res), i, m++, len[i], values);
1089 // propogate availability up the tree
1090 if (z != len[i]) {
1091 assert(len[i] >= 0 && len[i] < 32);
1092 for (y=len[i]; y > z; --y) {
1093 assert(available[y] == 0);
1094 available[y] = res + (1 << (32-y));
1095 }
1096 }
1097 }
1098 return TRUE;
1099}
1100
1101// accelerated huffman table allows fast O(1) match of all symbols
1102// of length <= STB_VORBIS_FAST_HUFFMAN_LENGTH
1103static void stbv_compute_accelerated_huffman(StbvCodebook *c)
1104{
1105 int i, len;
1106 for (i=0; i < STBV_FAST_HUFFMAN_TABLE_SIZE; ++i)
1107 c->fast_huffman[i] = -1;
1108
1109 len = c->sparse ? c->sorted_entries : c->entries;
1110 #ifdef STB_VORBIS_FAST_HUFFMAN_SHORT
1111 if (len > 32767) len = 32767; // largest possible value we can encode!
1112 #endif
1113 for (i=0; i < len; ++i) {
1114 if (c->codeword_lengths[i] <= STB_VORBIS_FAST_HUFFMAN_LENGTH) {
1115 stbv_uint32 z = c->sparse ? stbv_bit_reverse(c->sorted_codewords[i]) : c->codewords[i];
1116 // set table entries for all bit combinations in the higher bits
1117 while (z < STBV_FAST_HUFFMAN_TABLE_SIZE) {
1118 c->fast_huffman[z] = i;
1119 z += 1 << c->codeword_lengths[i];
1120 }
1121 }
1122 }
1123}
1124
1125#ifdef _MSC_VER
1126#define STBV_CDECL __cdecl
1127#else
1128#define STBV_CDECL
1129#endif
1130
1131static int STBV_CDECL stbv_uint32_compare(const void *p, const void *q)
1132{
1133 stbv_uint32 x = * (stbv_uint32 *) p;
1134 stbv_uint32 y = * (stbv_uint32 *) q;
1135 return x < y ? -1 : x > y;
1136}
1137
1138static int stbv_include_in_sort(StbvCodebook *c, stbv_uint8 len)
1139{
1140 if (c->sparse) { assert(len != NO_CODE); return TRUE; }
1141 if (len == NO_CODE) return FALSE;
1142 if (len > STB_VORBIS_FAST_HUFFMAN_LENGTH) return TRUE;
1143 return FALSE;
1144}
1145
1146// if the fast table above doesn't work, we want to binary
1147// search them... need to reverse the bits
1148static void stbv_compute_sorted_huffman(StbvCodebook *c, stbv_uint8 *lengths, stbv_uint32 *values)
1149{
1150 int i, len;
1151 // build a list of all the entries
1152 // OPTIMIZATION: don't include the short ones, since they'll be caught by FAST_HUFFMAN.
1153 // this is kind of a frivolous optimization--I don't see any performance improvement,
1154 // but it's like 4 extra lines of code, so.
1155 if (!c->sparse) {
1156 int k = 0;
1157 for (i=0; i < c->entries; ++i)
1158 if (stbv_include_in_sort(c, lengths[i]))
1159 c->sorted_codewords[k++] = stbv_bit_reverse(c->codewords[i]);
1160 assert(k == c->sorted_entries);
1161 } else {
1162 for (i=0; i < c->sorted_entries; ++i)
1163 c->sorted_codewords[i] = stbv_bit_reverse(c->codewords[i]);
1164 }
1165
1166 qsort(c->sorted_codewords, c->sorted_entries, sizeof(c->sorted_codewords[0]), stbv_uint32_compare);
1167 c->sorted_codewords[c->sorted_entries] = 0xffffffff;
1168
1169 len = c->sparse ? c->sorted_entries : c->entries;
1170 // now we need to indicate how they correspond; we could either
1171 // #1: sort a different data structure that says who they correspond to
1172 // #2: for each sorted entry, search the original list to find who corresponds
1173 // #3: for each original entry, find the sorted entry
1174 // #1 requires extra storage, #2 is slow, #3 can use binary search!
1175 for (i=0; i < len; ++i) {
1176 int huff_len = c->sparse ? lengths[values[i]] : lengths[i];
1177 if (stbv_include_in_sort(c,huff_len)) {
1178 stbv_uint32 code = stbv_bit_reverse(c->codewords[i]);
1179 int x=0, n=c->sorted_entries;
1180 while (n > 1) {
1181 // invariant: sc[x] <= code < sc[x+n]
1182 int m = x + (n >> 1);
1183 if (c->sorted_codewords[m] <= code) {
1184 x = m;
1185 n -= (n>>1);
1186 } else {
1187 n >>= 1;
1188 }
1189 }
1190 assert(c->sorted_codewords[x] == code);
1191 if (c->sparse) {
1192 c->sorted_values[x] = values[i];
1193 c->codeword_lengths[x] = huff_len;
1194 } else {
1195 c->sorted_values[x] = i;
1196 }
1197 }
1198 }
1199}
1200
1201// only run while parsing the header (3 times)
1202static int stbv_vorbis_validate(stbv_uint8 *data)
1203{
1204 static stbv_uint8 vorbis[6] = { 'v', 'o', 'r', 'b', 'i', 's' };
1205 return memcmp(data, vorbis, 6) == 0;
1206}
1207
1208// called from setup only, once per code book
1209// (formula implied by specification)
1210static int stbv_lookup1_values(int entries, int dim)
1211{
1212 int r = (int) floor(exp((float) log((float) entries) / dim));
1213 if ((int) floor(pow((float) r+1, dim)) <= entries) // (int) cast for MinGW warning;
1214 ++r; // floor() to avoid _ftol() when non-CRT
1215 assert(pow((float) r+1, dim) > entries);
1216 assert((int) floor(pow((float) r, dim)) <= entries); // (int),floor() as above
1217 return r;
1218}
1219
1220// called twice per file
1221static void stbv_compute_twiddle_factors(int n, float *A, float *B, float *C)
1222{
1223 int n4 = n >> 2, n8 = n >> 3;
1224 int k,k2;
1225
1226 for (k=k2=0; k < n4; ++k,k2+=2) {
1227 A[k2 ] = (float) cos(4*k*M_PI/n);
1228 A[k2+1] = (float) -sin(4*k*M_PI/n);
1229 B[k2 ] = (float) cos((k2+1)*M_PI/n/2) * 0.5f;
1230 B[k2+1] = (float) sin((k2+1)*M_PI/n/2) * 0.5f;
1231 }
1232 for (k=k2=0; k < n8; ++k,k2+=2) {
1233 C[k2 ] = (float) cos(2*(k2+1)*M_PI/n);
1234 C[k2+1] = (float) -sin(2*(k2+1)*M_PI/n);
1235 }
1236}
1237
1238static void stbv_compute_window(int n, float *window)
1239{
1240 int n2 = n >> 1, i;
1241 for (i=0; i < n2; ++i)
1242 window[i] = (float) sin(0.5 * M_PI * stbv_square((float) sin((i - 0 + 0.5) / n2 * 0.5 * M_PI)));
1243}
1244
1245static void stbv_compute_bitreverse(int n, stbv_uint16 *rev)
1246{
1247 int ld = stbv_ilog(n) - 1; // stbv_ilog is off-by-one from normal definitions
1248 int i, n8 = n >> 3;
1249 for (i=0; i < n8; ++i)
1250 rev[i] = (stbv_bit_reverse(i) >> (32-ld+3)) << 2;
1251}
1252
1253static int stbv_init_blocksize(stbv_vorb *f, int b, int n)
1254{
1255 int n2 = n >> 1, n4 = n >> 2, n8 = n >> 3;
1256 f->A[b] = (float *) stbv_setup_malloc(f, sizeof(float) * n2);
1257 f->B[b] = (float *) stbv_setup_malloc(f, sizeof(float) * n2);
1258 f->C[b] = (float *) stbv_setup_malloc(f, sizeof(float) * n4);
1259 if (!f->A[b] || !f->B[b] || !f->C[b]) return stbv_error(f, VORBIS_outofmem);
1260 stbv_compute_twiddle_factors(n, f->A[b], f->B[b], f->C[b]);
1261 f->window[b] = (float *) stbv_setup_malloc(f, sizeof(float) * n2);
1262 if (!f->window[b]) return stbv_error(f, VORBIS_outofmem);
1263 stbv_compute_window(n, f->window[b]);
1264 f->stbv_bit_reverse[b] = (stbv_uint16 *) stbv_setup_malloc(f, sizeof(stbv_uint16) * n8);
1265 if (!f->stbv_bit_reverse[b]) return stbv_error(f, VORBIS_outofmem);
1266 stbv_compute_bitreverse(n, f->stbv_bit_reverse[b]);
1267 return TRUE;
1268}
1269
1270static void stbv_neighbors(stbv_uint16 *x, int n, int *plow, int *phigh)
1271{
1272 int low = -1;
1273 int high = 65536;
1274 int i;
1275 for (i=0; i < n; ++i) {
1276 if (x[i] > low && x[i] < x[n]) { *plow = i; low = x[i]; }
1277 if (x[i] < high && x[i] > x[n]) { *phigh = i; high = x[i]; }
1278 }
1279}
1280
1281// this has been repurposed so y is now the original index instead of y
1282typedef struct
1283{
1284 stbv_uint16 x,id;
1285} stbv_floor_ordering;
1286
1287static int STBV_CDECL stbv_point_compare(const void *p, const void *q)
1288{
1289 stbv_floor_ordering *a = (stbv_floor_ordering *) p;
1290 stbv_floor_ordering *b = (stbv_floor_ordering *) q;
1291 return a->x < b->x ? -1 : a->x > b->x;
1292}
1293
1294//
1295/////////////////////// END LEAF SETUP FUNCTIONS //////////////////////////
1296
1297
1298#if defined(STB_VORBIS_NO_STDIO)
1299 #define STBV_USE_MEMORY(z) TRUE
1300#else
1301 #define STBV_USE_MEMORY(z) ((z)->stream)
1302#endif
1303
1304static stbv_uint8 stbv_get8(stbv_vorb *z)
1305{
1306 if (STBV_USE_MEMORY(z)) {
1307 if (z->stream >= z->stream_end) { z->eof = TRUE; return 0; }
1308 return *z->stream++;
1309 }
1310
1311 #ifndef STB_VORBIS_NO_STDIO
1312 {
1313 int c = fgetc(z->f);
1314 if (c == EOF) { z->eof = TRUE; return 0; }
1315 return c;
1316 }
1317 #endif
1318}
1319
1320static stbv_uint32 stbv_get32(stbv_vorb *f)
1321{
1322 stbv_uint32 x;
1323 x = stbv_get8(f);
1324 x += stbv_get8(f) << 8;
1325 x += stbv_get8(f) << 16;
1326 x += (stbv_uint32) stbv_get8(f) << 24;
1327 return x;
1328}
1329
1330static int stbv_getn(stbv_vorb *z, stbv_uint8 *data, int n)
1331{
1332 if (STBV_USE_MEMORY(z)) {
1333 if (z->stream+n > z->stream_end) { z->eof = 1; return 0; }
1334 memcpy(data, z->stream, n);
1335 z->stream += n;
1336 return 1;
1337 }
1338
1339 #ifndef STB_VORBIS_NO_STDIO
1340 if (fread(data, n, 1, z->f) == 1)
1341 return 1;
1342 else {
1343 z->eof = 1;
1344 return 0;
1345 }
1346 #endif
1347}
1348
1349static void stbv_skip(stbv_vorb *z, int n)
1350{
1351 if (STBV_USE_MEMORY(z)) {
1352 z->stream += n;
1353 if (z->stream >= z->stream_end) z->eof = 1;
1354 return;
1355 }
1356 #ifndef STB_VORBIS_NO_STDIO
1357 {
1358 long x = ftell(z->f);
1359 fseek(z->f, x+n, SEEK_SET);
1360 }
1361 #endif
1362}
1363
1364static int stbv_set_file_offset(stb_vorbis *f, unsigned int loc)
1365{
1366 #ifndef STB_VORBIS_NO_PUSHDATA_API
1367 if (f->push_mode) return 0;
1368 #endif
1369 f->eof = 0;
1370 if (STBV_USE_MEMORY(f)) {
1371 if (f->stream_start + loc >= f->stream_end || f->stream_start + loc < f->stream_start) {
1372 f->stream = f->stream_end;
1373 f->eof = 1;
1374 return 0;
1375 } else {
1376 f->stream = f->stream_start + loc;
1377 return 1;
1378 }
1379 }
1380 #ifndef STB_VORBIS_NO_STDIO
1381 if (loc + f->f_start < loc || loc >= 0x80000000) {
1382 loc = 0x7fffffff;
1383 f->eof = 1;
1384 } else {
1385 loc += f->f_start;
1386 }
1387 if (!fseek(f->f, loc, SEEK_SET))
1388 return 1;
1389 f->eof = 1;
1390 fseek(f->f, f->f_start, SEEK_END);
1391 return 0;
1392 #endif
1393}
1394
1395
1396static stbv_uint8 stbv_ogg_page_header[4] = { 0x4f, 0x67, 0x67, 0x53 };
1397
1398static int stbv_capture_pattern(stbv_vorb *f)
1399{
1400 if (0x4f != stbv_get8(f)) return FALSE;
1401 if (0x67 != stbv_get8(f)) return FALSE;
1402 if (0x67 != stbv_get8(f)) return FALSE;
1403 if (0x53 != stbv_get8(f)) return FALSE;
1404 return TRUE;
1405}
1406
1407#define STBV_PAGEFLAG_continued_packet 1
1408#define STBV_PAGEFLAG_first_page 2
1409#define STBV_PAGEFLAG_last_page 4
1410
1411static int stbv_start_page_no_capturepattern(stbv_vorb *f)
1412{
1413 stbv_uint32 loc0,loc1,n;
1414 // stream structure version
1415 if (0 != stbv_get8(f)) return stbv_error(f, VORBIS_invalid_stream_structure_version);
1416 // header flag
1417 f->page_flag = stbv_get8(f);
1418 // absolute granule position
1419 loc0 = stbv_get32(f);
1420 loc1 = stbv_get32(f);
1421 // @TODO: validate loc0,loc1 as valid positions?
1422 // stream serial number -- vorbis doesn't interleave, so discard
1423 stbv_get32(f);
1424 //if (f->serial != stbv_get32(f)) return stbv_error(f, VORBIS_incorrect_stream_serial_number);
1425 // page sequence number
1426 n = stbv_get32(f);
1427 f->last_page = n;
1428 // CRC32
1429 stbv_get32(f);
1430 // page_segments
1431 f->segment_count = stbv_get8(f);
1432 if (!stbv_getn(f, f->segments, f->segment_count))
1433 return stbv_error(f, VORBIS_unexpected_eof);
1434 // assume we _don't_ know any the sample position of any segments
1435 f->end_seg_with_known_loc = -2;
1436 if (loc0 != ~0U || loc1 != ~0U) {
1437 int i;
1438 // determine which packet is the last one that will complete
1439 for (i=f->segment_count-1; i >= 0; --i)
1440 if (f->segments[i] < 255)
1441 break;
1442 // 'i' is now the index of the _last_ segment of a packet that ends
1443 if (i >= 0) {
1444 f->end_seg_with_known_loc = i;
1445 f->known_loc_for_packet = loc0;
1446 }
1447 }
1448 if (f->first_decode) {
1449 int i,len;
1450 StbvProbedPage p;
1451 len = 0;
1452 for (i=0; i < f->segment_count; ++i)
1453 len += f->segments[i];
1454 len += 27 + f->segment_count;
1455 p.page_start = f->first_audio_page_offset;
1456 p.page_end = p.page_start + len;
1457 p.last_decoded_sample = loc0;
1458 f->p_first = p;
1459 }
1460 f->next_seg = 0;
1461 return TRUE;
1462}
1463
1464static int stbv_start_page(stbv_vorb *f)
1465{
1466 if (!stbv_capture_pattern(f)) return stbv_error(f, VORBIS_missing_capture_pattern);
1467 return stbv_start_page_no_capturepattern(f);
1468}
1469
1470static int stbv_start_packet(stbv_vorb *f)
1471{
1472 while (f->next_seg == -1) {
1473 if (!stbv_start_page(f)) return FALSE;
1474 if (f->page_flag & STBV_PAGEFLAG_continued_packet)
1475 return stbv_error(f, VORBIS_continued_packet_flag_invalid);
1476 }
1477 f->last_seg = FALSE;
1478 f->valid_bits = 0;
1479 f->packet_bytes = 0;
1480 f->bytes_in_seg = 0;
1481 // f->next_seg is now valid
1482 return TRUE;
1483}
1484
1485static int stbv_maybe_start_packet(stbv_vorb *f)
1486{
1487 if (f->next_seg == -1) {
1488 int x = stbv_get8(f);
1489 if (f->eof) return FALSE; // EOF at page boundary is not an error!
1490 if (0x4f != x ) return stbv_error(f, VORBIS_missing_capture_pattern);
1491 if (0x67 != stbv_get8(f)) return stbv_error(f, VORBIS_missing_capture_pattern);
1492 if (0x67 != stbv_get8(f)) return stbv_error(f, VORBIS_missing_capture_pattern);
1493 if (0x53 != stbv_get8(f)) return stbv_error(f, VORBIS_missing_capture_pattern);
1494 if (!stbv_start_page_no_capturepattern(f)) return FALSE;
1495 if (f->page_flag & STBV_PAGEFLAG_continued_packet) {
1496 // set up enough state that we can read this packet if we want,
1497 // e.g. during recovery
1498 f->last_seg = FALSE;
1499 f->bytes_in_seg = 0;
1500 return stbv_error(f, VORBIS_continued_packet_flag_invalid);
1501 }
1502 }
1503 return stbv_start_packet(f);
1504}
1505
1506static int stbv_next_segment(stbv_vorb *f)
1507{
1508 int len;
1509 if (f->last_seg) return 0;
1510 if (f->next_seg == -1) {
1511 f->last_seg_which = f->segment_count-1; // in case stbv_start_page fails
1512 if (!stbv_start_page(f)) { f->last_seg = 1; return 0; }
1513 if (!(f->page_flag & STBV_PAGEFLAG_continued_packet)) return stbv_error(f, VORBIS_continued_packet_flag_invalid);
1514 }
1515 len = f->segments[f->next_seg++];
1516 if (len < 255) {
1517 f->last_seg = TRUE;
1518 f->last_seg_which = f->next_seg-1;
1519 }
1520 if (f->next_seg >= f->segment_count)
1521 f->next_seg = -1;
1522 assert(f->bytes_in_seg == 0);
1523 f->bytes_in_seg = len;
1524 return len;
1525}
1526
1527#define STBV_EOP (-1)
1528#define STBV_INVALID_BITS (-1)
1529
1530static int stbv_get8_packet_raw(stbv_vorb *f)
1531{
1532 if (!f->bytes_in_seg) { // CLANG!
1533 if (f->last_seg) return STBV_EOP;
1534 else if (!stbv_next_segment(f)) return STBV_EOP;
1535 }
1536 assert(f->bytes_in_seg > 0);
1537 --f->bytes_in_seg;
1538 ++f->packet_bytes;
1539 return stbv_get8(f);
1540}
1541
1542static int stbv_get8_packet(stbv_vorb *f)
1543{
1544 int x = stbv_get8_packet_raw(f);
1545 f->valid_bits = 0;
1546 return x;
1547}
1548
1549static void stbv_flush_packet(stbv_vorb *f)
1550{
1551 while (stbv_get8_packet_raw(f) != STBV_EOP);
1552}
1553
1554// @OPTIMIZE: this is the secondary bit decoder, so it's probably not as important
1555// as the huffman decoder?
1556static stbv_uint32 stbv_get_bits(stbv_vorb *f, int n)
1557{
1558 stbv_uint32 z;
1559
1560 if (f->valid_bits < 0) return 0;
1561 if (f->valid_bits < n) {
1562 if (n > 24) {
1563 // the accumulator technique below would not work correctly in this case
1564 z = stbv_get_bits(f, 24);
1565 z += stbv_get_bits(f, n-24) << 24;
1566 return z;
1567 }
1568 if (f->valid_bits == 0) f->acc = 0;
1569 while (f->valid_bits < n) {
1570 int z = stbv_get8_packet_raw(f);
1571 if (z == STBV_EOP) {
1572 f->valid_bits = STBV_INVALID_BITS;
1573 return 0;
1574 }
1575 f->acc += z << f->valid_bits;
1576 f->valid_bits += 8;
1577 }
1578 }
1579 if (f->valid_bits < 0) return 0;
1580 z = f->acc & ((1 << n)-1);
1581 f->acc >>= n;
1582 f->valid_bits -= n;
1583 return z;
1584}
1585
1586// @OPTIMIZE: primary accumulator for huffman
1587// expand the buffer to as many bits as possible without reading off end of packet
1588// it might be nice to allow f->valid_bits and f->acc to be stored in registers,
1589// e.g. cache them locally and decode locally
1590static __forceinline void stbv_prep_huffman(stbv_vorb *f)
1591{
1592 if (f->valid_bits <= 24) {
1593 if (f->valid_bits == 0) f->acc = 0;
1594 do {
1595 int z;
1596 if (f->last_seg && !f->bytes_in_seg) return;
1597 z = stbv_get8_packet_raw(f);
1598 if (z == STBV_EOP) return;
1599 f->acc += (unsigned) z << f->valid_bits;
1600 f->valid_bits += 8;
1601 } while (f->valid_bits <= 24);
1602 }
1603}
1604
1605enum
1606{
1607 STBV_VORBIS_packet_id = 1,
1608 STBV_VORBIS_packet_comment = 3,
1609 STBV_VORBIS_packet_setup = 5
1610};
1611
1612static int stbv_codebook_decode_scalar_raw(stbv_vorb *f, StbvCodebook *c)
1613{
1614 int i;
1615 stbv_prep_huffman(f);
1616
1617 if (c->codewords == NULL && c->sorted_codewords == NULL)
1618 return -1;
1619
1620 // cases to use binary search: sorted_codewords && !c->codewords
1621 // sorted_codewords && c->entries > 8
1622 if (c->entries > 8 ? c->sorted_codewords!=NULL : !c->codewords) {
1623 // binary search
1624 stbv_uint32 code = stbv_bit_reverse(f->acc);
1625 int x=0, n=c->sorted_entries, len;
1626
1627 while (n > 1) {
1628 // invariant: sc[x] <= code < sc[x+n]
1629 int m = x + (n >> 1);
1630 if (c->sorted_codewords[m] <= code) {
1631 x = m;
1632 n -= (n>>1);
1633 } else {
1634 n >>= 1;
1635 }
1636 }
1637 // x is now the sorted index
1638 if (!c->sparse) x = c->sorted_values[x];
1639 // x is now sorted index if sparse, or symbol otherwise
1640 len = c->codeword_lengths[x];
1641 if (f->valid_bits >= len) {
1642 f->acc >>= len;
1643 f->valid_bits -= len;
1644 return x;
1645 }
1646
1647 f->valid_bits = 0;
1648 return -1;
1649 }
1650
1651 // if small, linear search
1652 assert(!c->sparse);
1653 for (i=0; i < c->entries; ++i) {
1654 if (c->codeword_lengths[i] == NO_CODE) continue;
1655 if (c->codewords[i] == (f->acc & ((1 << c->codeword_lengths[i])-1))) {
1656 if (f->valid_bits >= c->codeword_lengths[i]) {
1657 f->acc >>= c->codeword_lengths[i];
1658 f->valid_bits -= c->codeword_lengths[i];
1659 return i;
1660 }
1661 f->valid_bits = 0;
1662 return -1;
1663 }
1664 }
1665
1666 stbv_error(f, VORBIS_invalid_stream);
1667 f->valid_bits = 0;
1668 return -1;
1669}
1670
1671#ifndef STB_VORBIS_NO_INLINE_DECODE
1672
1673#define STBV_DECODE_RAW(var, f,c) \
1674 if (f->valid_bits < STB_VORBIS_FAST_HUFFMAN_LENGTH) \
1675 stbv_prep_huffman(f); \
1676 var = f->acc & STBV_FAST_HUFFMAN_TABLE_MASK; \
1677 var = c->fast_huffman[var]; \
1678 if (var >= 0) { \
1679 int n = c->codeword_lengths[var]; \
1680 f->acc >>= n; \
1681 f->valid_bits -= n; \
1682 if (f->valid_bits < 0) { f->valid_bits = 0; var = -1; } \
1683 } else { \
1684 var = stbv_codebook_decode_scalar_raw(f,c); \
1685 }
1686
1687#else
1688
1689static int stbv_codebook_decode_scalar(stbv_vorb *f, StbvCodebook *c)
1690{
1691 int i;
1692 if (f->valid_bits < STB_VORBIS_FAST_HUFFMAN_LENGTH)
1693 stbv_prep_huffman(f);
1694 // fast huffman table lookup
1695 i = f->acc & STBV_FAST_HUFFMAN_TABLE_MASK;
1696 i = c->fast_huffman[i];
1697 if (i >= 0) {
1698 f->acc >>= c->codeword_lengths[i];
1699 f->valid_bits -= c->codeword_lengths[i];
1700 if (f->valid_bits < 0) { f->valid_bits = 0; return -1; }
1701 return i;
1702 }
1703 return stbv_codebook_decode_scalar_raw(f,c);
1704}
1705
1706#define STBV_DECODE_RAW(var,f,c) var = stbv_codebook_decode_scalar(f,c);
1707
1708#endif
1709
1710#define STBV_DECODE(var,f,c) \
1711 STBV_DECODE_RAW(var,f,c) \
1712 if (c->sparse) var = c->sorted_values[var];
1713
1714#ifndef STB_VORBIS_DIVIDES_IN_CODEBOOK
1715 #define DECODE_VQ(var,f,c) STBV_DECODE_RAW(var,f,c)
1716#else
1717 #define DECODE_VQ(var,f,c) STBV_DECODE(var,f,c)
1718#endif
1719
1720
1721
1722
1723
1724
1725// STBV_CODEBOOK_ELEMENT_FAST is an optimization for the CODEBOOK_FLOATS case
1726// where we avoid one addition
1727#define STBV_CODEBOOK_ELEMENT(c,off) (c->multiplicands[off])
1728#define STBV_CODEBOOK_ELEMENT_FAST(c,off) (c->multiplicands[off])
1729#define STBV_CODEBOOK_ELEMENT_BASE(c) (0)
1730
1731static int stbv_codebook_decode_start(stbv_vorb *f, StbvCodebook *c)
1732{
1733 int z = -1;
1734
1735 // type 0 is only legal in a scalar context
1736 if (c->lookup_type == 0)
1737 stbv_error(f, VORBIS_invalid_stream);
1738 else {
1739 DECODE_VQ(z,f,c);
1740 if (c->sparse) assert(z < c->sorted_entries);
1741 if (z < 0) { // check for STBV_EOP
1742 if (!f->bytes_in_seg)
1743 if (f->last_seg)
1744 return z;
1745 stbv_error(f, VORBIS_invalid_stream);
1746 }
1747 }
1748 return z;
1749}
1750
1751static int stbv_codebook_decode(stbv_vorb *f, StbvCodebook *c, float *output, int len)
1752{
1753 int i,z = stbv_codebook_decode_start(f,c);
1754 if (z < 0) return FALSE;
1755 if (len > c->dimensions) len = c->dimensions;
1756
1757#ifdef STB_VORBIS_DIVIDES_IN_CODEBOOK
1758 if (c->lookup_type == 1) {
1759 float last = STBV_CODEBOOK_ELEMENT_BASE(c);
1760 int div = 1;
1761 for (i=0; i < len; ++i) {
1762 int off = (z / div) % c->lookup_values;
1763 float val = STBV_CODEBOOK_ELEMENT_FAST(c,off) + last;
1764 output[i] += val;
1765 if (c->sequence_p) last = val + c->minimum_value;
1766 div *= c->lookup_values;
1767 }
1768 return TRUE;
1769 }
1770#endif
1771
1772 z *= c->dimensions;
1773 if (c->sequence_p) {
1774 float last = STBV_CODEBOOK_ELEMENT_BASE(c);
1775 for (i=0; i < len; ++i) {
1776 float val = STBV_CODEBOOK_ELEMENT_FAST(c,z+i) + last;
1777 output[i] += val;
1778 last = val + c->minimum_value;
1779 }
1780 } else {
1781 float last = STBV_CODEBOOK_ELEMENT_BASE(c);
1782 for (i=0; i < len; ++i) {
1783 output[i] += STBV_CODEBOOK_ELEMENT_FAST(c,z+i) + last;
1784 }
1785 }
1786
1787 return TRUE;
1788}
1789
1790static int stbv_codebook_decode_step(stbv_vorb *f, StbvCodebook *c, float *output, int len, int step)
1791{
1792 int i,z = stbv_codebook_decode_start(f,c);
1793 float last = STBV_CODEBOOK_ELEMENT_BASE(c);
1794 if (z < 0) return FALSE;
1795 if (len > c->dimensions) len = c->dimensions;
1796
1797#ifdef STB_VORBIS_DIVIDES_IN_CODEBOOK
1798 if (c->lookup_type == 1) {
1799 int div = 1;
1800 for (i=0; i < len; ++i) {
1801 int off = (z / div) % c->lookup_values;
1802 float val = STBV_CODEBOOK_ELEMENT_FAST(c,off) + last;
1803 output[i*step] += val;
1804 if (c->sequence_p) last = val;
1805 div *= c->lookup_values;
1806 }
1807 return TRUE;
1808 }
1809#endif
1810
1811 z *= c->dimensions;
1812 for (i=0; i < len; ++i) {
1813 float val = STBV_CODEBOOK_ELEMENT_FAST(c,z+i) + last;
1814 output[i*step] += val;
1815 if (c->sequence_p) last = val;
1816 }
1817
1818 return TRUE;
1819}
1820
1821static int stbv_codebook_decode_deinterleave_repeat(stbv_vorb *f, StbvCodebook *c, float **outputs, int ch, int *c_inter_p, int *p_inter_p, int len, int total_decode)
1822{
1823 int c_inter = *c_inter_p;
1824 int p_inter = *p_inter_p;
1825 int i,z, effective = c->dimensions;
1826
1827 // type 0 is only legal in a scalar context
1828 if (c->lookup_type == 0) return stbv_error(f, VORBIS_invalid_stream);
1829
1830 while (total_decode > 0) {
1831 float last = STBV_CODEBOOK_ELEMENT_BASE(c);
1832 DECODE_VQ(z,f,c);
1833 #ifndef STB_VORBIS_DIVIDES_IN_CODEBOOK
1834 assert(!c->sparse || z < c->sorted_entries);
1835 #endif
1836 if (z < 0) {
1837 if (!f->bytes_in_seg)
1838 if (f->last_seg) return FALSE;
1839 return stbv_error(f, VORBIS_invalid_stream);
1840 }
1841
1842 // if this will take us off the end of the buffers, stop short!
1843 // we check by computing the length of the virtual interleaved
1844 // buffer (len*ch), our current offset within it (p_inter*ch)+(c_inter),
1845 // and the length we'll be using (effective)
1846 if (c_inter + p_inter*ch + effective > len * ch) {
1847 effective = len*ch - (p_inter*ch - c_inter);
1848 }
1849
1850 #ifdef STB_VORBIS_DIVIDES_IN_CODEBOOK
1851 if (c->lookup_type == 1) {
1852 int div = 1;
1853 for (i=0; i < effective; ++i) {
1854 int off = (z / div) % c->lookup_values;
1855 float val = STBV_CODEBOOK_ELEMENT_FAST(c,off) + last;
1856 if (outputs[c_inter])
1857 outputs[c_inter][p_inter] += val;
1858 if (++c_inter == ch) { c_inter = 0; ++p_inter; }
1859 if (c->sequence_p) last = val;
1860 div *= c->lookup_values;
1861 }
1862 } else
1863 #endif
1864 {
1865 z *= c->dimensions;
1866 if (c->sequence_p) {
1867 for (i=0; i < effective; ++i) {
1868 float val = STBV_CODEBOOK_ELEMENT_FAST(c,z+i) + last;
1869 if (outputs[c_inter])
1870 outputs[c_inter][p_inter] += val;
1871 if (++c_inter == ch) { c_inter = 0; ++p_inter; }
1872 last = val;
1873 }
1874 } else {
1875 for (i=0; i < effective; ++i) {
1876 float val = STBV_CODEBOOK_ELEMENT_FAST(c,z+i) + last;
1877 if (outputs[c_inter])
1878 outputs[c_inter][p_inter] += val;
1879 if (++c_inter == ch) { c_inter = 0; ++p_inter; }
1880 }
1881 }
1882 }
1883
1884 total_decode -= effective;
1885 }
1886 *c_inter_p = c_inter;
1887 *p_inter_p = p_inter;
1888 return TRUE;
1889}
1890
1891static int stbv_predict_point(int x, int x0, int x1, int y0, int y1)
1892{
1893 int dy = y1 - y0;
1894 int adx = x1 - x0;
1895 // @OPTIMIZE: force int division to round in the right direction... is this necessary on x86?
1896 int err = abs(dy) * (x - x0);
1897 int off = err / adx;
1898 return dy < 0 ? y0 - off : y0 + off;
1899}
1900
1901// the following table is block-copied from the specification
1902static float stbv_inverse_db_table[256] =
1903{
1904 1.0649863e-07f, 1.1341951e-07f, 1.2079015e-07f, 1.2863978e-07f,
1905 1.3699951e-07f, 1.4590251e-07f, 1.5538408e-07f, 1.6548181e-07f,
1906 1.7623575e-07f, 1.8768855e-07f, 1.9988561e-07f, 2.1287530e-07f,
1907 2.2670913e-07f, 2.4144197e-07f, 2.5713223e-07f, 2.7384213e-07f,
1908 2.9163793e-07f, 3.1059021e-07f, 3.3077411e-07f, 3.5226968e-07f,
1909 3.7516214e-07f, 3.9954229e-07f, 4.2550680e-07f, 4.5315863e-07f,
1910 4.8260743e-07f, 5.1396998e-07f, 5.4737065e-07f, 5.8294187e-07f,
1911 6.2082472e-07f, 6.6116941e-07f, 7.0413592e-07f, 7.4989464e-07f,
1912 7.9862701e-07f, 8.5052630e-07f, 9.0579828e-07f, 9.6466216e-07f,
1913 1.0273513e-06f, 1.0941144e-06f, 1.1652161e-06f, 1.2409384e-06f,
1914 1.3215816e-06f, 1.4074654e-06f, 1.4989305e-06f, 1.5963394e-06f,
1915 1.7000785e-06f, 1.8105592e-06f, 1.9282195e-06f, 2.0535261e-06f,
1916 2.1869758e-06f, 2.3290978e-06f, 2.4804557e-06f, 2.6416497e-06f,
1917 2.8133190e-06f, 2.9961443e-06f, 3.1908506e-06f, 3.3982101e-06f,
1918 3.6190449e-06f, 3.8542308e-06f, 4.1047004e-06f, 4.3714470e-06f,
1919 4.6555282e-06f, 4.9580707e-06f, 5.2802740e-06f, 5.6234160e-06f,
1920 5.9888572e-06f, 6.3780469e-06f, 6.7925283e-06f, 7.2339451e-06f,
1921 7.7040476e-06f, 8.2047000e-06f, 8.7378876e-06f, 9.3057248e-06f,
1922 9.9104632e-06f, 1.0554501e-05f, 1.1240392e-05f, 1.1970856e-05f,
1923 1.2748789e-05f, 1.3577278e-05f, 1.4459606e-05f, 1.5399272e-05f,
1924 1.6400004e-05f, 1.7465768e-05f, 1.8600792e-05f, 1.9809576e-05f,
1925 2.1096914e-05f, 2.2467911e-05f, 2.3928002e-05f, 2.5482978e-05f,
1926 2.7139006e-05f, 2.8902651e-05f, 3.0780908e-05f, 3.2781225e-05f,
1927 3.4911534e-05f, 3.7180282e-05f, 3.9596466e-05f, 4.2169667e-05f,
1928 4.4910090e-05f, 4.7828601e-05f, 5.0936773e-05f, 5.4246931e-05f,
1929 5.7772202e-05f, 6.1526565e-05f, 6.5524908e-05f, 6.9783085e-05f,
1930 7.4317983e-05f, 7.9147585e-05f, 8.4291040e-05f, 8.9768747e-05f,
1931 9.5602426e-05f, 0.00010181521f, 0.00010843174f, 0.00011547824f,
1932 0.00012298267f, 0.00013097477f, 0.00013948625f, 0.00014855085f,
1933 0.00015820453f, 0.00016848555f, 0.00017943469f, 0.00019109536f,
1934 0.00020351382f, 0.00021673929f, 0.00023082423f, 0.00024582449f,
1935 0.00026179955f, 0.00027881276f, 0.00029693158f, 0.00031622787f,
1936 0.00033677814f, 0.00035866388f, 0.00038197188f, 0.00040679456f,
1937 0.00043323036f, 0.00046138411f, 0.00049136745f, 0.00052329927f,
1938 0.00055730621f, 0.00059352311f, 0.00063209358f, 0.00067317058f,
1939 0.00071691700f, 0.00076350630f, 0.00081312324f, 0.00086596457f,
1940 0.00092223983f, 0.00098217216f, 0.0010459992f, 0.0011139742f,
1941 0.0011863665f, 0.0012634633f, 0.0013455702f, 0.0014330129f,
1942 0.0015261382f, 0.0016253153f, 0.0017309374f, 0.0018434235f,
1943 0.0019632195f, 0.0020908006f, 0.0022266726f, 0.0023713743f,
1944 0.0025254795f, 0.0026895994f, 0.0028643847f, 0.0030505286f,
1945 0.0032487691f, 0.0034598925f, 0.0036847358f, 0.0039241906f,
1946 0.0041792066f, 0.0044507950f, 0.0047400328f, 0.0050480668f,
1947 0.0053761186f, 0.0057254891f, 0.0060975636f, 0.0064938176f,
1948 0.0069158225f, 0.0073652516f, 0.0078438871f, 0.0083536271f,
1949 0.0088964928f, 0.009474637f, 0.010090352f, 0.010746080f,
1950 0.011444421f, 0.012188144f, 0.012980198f, 0.013823725f,
1951 0.014722068f, 0.015678791f, 0.016697687f, 0.017782797f,
1952 0.018938423f, 0.020169149f, 0.021479854f, 0.022875735f,
1953 0.024362330f, 0.025945531f, 0.027631618f, 0.029427276f,
1954 0.031339626f, 0.033376252f, 0.035545228f, 0.037855157f,
1955 0.040315199f, 0.042935108f, 0.045725273f, 0.048696758f,
1956 0.051861348f, 0.055231591f, 0.058820850f, 0.062643361f,
1957 0.066714279f, 0.071049749f, 0.075666962f, 0.080584227f,
1958 0.085821044f, 0.091398179f, 0.097337747f, 0.10366330f,
1959 0.11039993f, 0.11757434f, 0.12521498f, 0.13335215f,
1960 0.14201813f, 0.15124727f, 0.16107617f, 0.17154380f,
1961 0.18269168f, 0.19456402f, 0.20720788f, 0.22067342f,
1962 0.23501402f, 0.25028656f, 0.26655159f, 0.28387361f,
1963 0.30232132f, 0.32196786f, 0.34289114f, 0.36517414f,
1964 0.38890521f, 0.41417847f, 0.44109412f, 0.46975890f,
1965 0.50028648f, 0.53279791f, 0.56742212f, 0.60429640f,
1966 0.64356699f, 0.68538959f, 0.72993007f, 0.77736504f,
1967 0.82788260f, 0.88168307f, 0.9389798f, 1.0f
1968};
1969
1970
1971// @OPTIMIZE: if you want to replace this bresenham line-drawing routine,
1972// note that you must produce bit-identical output to decode correctly;
1973// this specific sequence of operations is specified in the spec (it's
1974// drawing integer-quantized frequency-space lines that the encoder
1975// expects to be exactly the same)
1976// ... also, isn't the whole point of Bresenham's algorithm to NOT
1977// have to divide in the setup? sigh.
1978#ifndef STB_VORBIS_NO_DEFER_FLOOR
1979#define STBV_LINE_OP(a,b) a *= b
1980#else
1981#define STBV_LINE_OP(a,b) a = b
1982#endif
1983
1984#ifdef STB_VORBIS_DIVIDE_TABLE
1985#define STBV_DIVTAB_NUMER 32
1986#define STBV_DIVTAB_DENOM 64
1987stbv_int8 stbv_integer_divide_table[STBV_DIVTAB_NUMER][STBV_DIVTAB_DENOM]; // 2KB
1988#endif
1989
1990static __forceinline void stbv_draw_line(float *output, int x0, int y0, int x1, int y1, int n)
1991{
1992 int dy = y1 - y0;
1993 int adx = x1 - x0;
1994 int ady = abs(dy);
1995 int base;
1996 int x=x0,y=y0;
1997 int err = 0;
1998 int sy;
1999
2000#ifdef STB_VORBIS_DIVIDE_TABLE
2001 if (adx < STBV_DIVTAB_DENOM && ady < STBV_DIVTAB_NUMER) {
2002 if (dy < 0) {
2003 base = -stbv_integer_divide_table[ady][adx];
2004 sy = base-1;
2005 } else {
2006 base = stbv_integer_divide_table[ady][adx];
2007 sy = base+1;
2008 }
2009 } else {
2010 base = dy / adx;
2011 if (dy < 0)
2012 sy = base - 1;
2013 else
2014 sy = base+1;
2015 }
2016#else
2017 base = dy / adx;
2018 if (dy < 0)
2019 sy = base - 1;
2020 else
2021 sy = base+1;
2022#endif
2023 ady -= abs(base) * adx;
2024 if (x1 > n) x1 = n;
2025 if (x < x1) {
2026 STBV_LINE_OP(output[x], stbv_inverse_db_table[y]);
2027 for (++x; x < x1; ++x) {
2028 err += ady;
2029 if (err >= adx) {
2030 err -= adx;
2031 y += sy;
2032 } else
2033 y += base;
2034 STBV_LINE_OP(output[x], stbv_inverse_db_table[y]);
2035 }
2036 }
2037}
2038
2039static int stbv_residue_decode(stbv_vorb *f, StbvCodebook *book, float *target, int offset, int n, int rtype)
2040{
2041 int k;
2042 if (rtype == 0) {
2043 int step = n / book->dimensions;
2044 for (k=0; k < step; ++k)
2045 if (!stbv_codebook_decode_step(f, book, target+offset+k, n-offset-k, step))
2046 return FALSE;
2047 } else {
2048 for (k=0; k < n; ) {
2049 if (!stbv_codebook_decode(f, book, target+offset, n-k))
2050 return FALSE;
2051 k += book->dimensions;
2052 offset += book->dimensions;
2053 }
2054 }
2055 return TRUE;
2056}
2057
2058// n is 1/2 of the blocksize --
2059// specification: "Correct per-vector decode length is [n]/2"
2060static void stbv_decode_residue(stbv_vorb *f, float *residue_buffers[], int ch, int n, int rn, stbv_uint8 *do_not_decode)
2061{
2062 int i,j,pass;
2063 StbvResidue *r = f->residue_config + rn;
2064 int rtype = f->residue_types[rn];
2065 int c = r->classbook;
2066 int classwords = f->codebooks[c].dimensions;
2067 unsigned int actual_size = rtype == 2 ? n*2 : n;
2068 unsigned int limit_r_begin = (r->begin < actual_size ? r->begin : actual_size);
2069 unsigned int limit_r_end = (r->end < actual_size ? r->end : actual_size);
2070 int n_read = limit_r_end - limit_r_begin;
2071 int part_read = n_read / r->part_size;
2072 int temp_alloc_point = stbv_temp_alloc_save(f);
2073 #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE
2074 stbv_uint8 ***part_classdata = (stbv_uint8 ***) stbv_temp_block_array(f,f->channels, part_read * sizeof(**part_classdata));
2075 #else
2076 int **classifications = (int **) stbv_temp_block_array(f,f->channels, part_read * sizeof(**classifications));
2077 #endif
2078
2079 STBV_CHECK(f);
2080
2081 for (i=0; i < ch; ++i)
2082 if (!do_not_decode[i])
2083 memset(residue_buffers[i], 0, sizeof(float) * n);
2084
2085 if (rtype == 2 && ch != 1) {
2086 for (j=0; j < ch; ++j)
2087 if (!do_not_decode[j])
2088 break;
2089 if (j == ch)
2090 goto done;
2091
2092 for (pass=0; pass < 8; ++pass) {
2093 int pcount = 0, class_set = 0;
2094 if (ch == 2) {
2095 while (pcount < part_read) {
2096 int z = r->begin + pcount*r->part_size;
2097 int c_inter = (z & 1), p_inter = z>>1;
2098 if (pass == 0) {
2099 StbvCodebook *c = f->codebooks+r->classbook;
2100 int q;
2101 STBV_DECODE(q,f,c);
2102 if (q == STBV_EOP) goto done;
2103 #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE
2104 part_classdata[0][class_set] = r->classdata[q];
2105 #else
2106 for (i=classwords-1; i >= 0; --i) {
2107 classifications[0][i+pcount] = q % r->classifications;
2108 q /= r->classifications;
2109 }
2110 #endif
2111 }
2112 for (i=0; i < classwords && pcount < part_read; ++i, ++pcount) {
2113 int z = r->begin + pcount*r->part_size;
2114 #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE
2115 int c = part_classdata[0][class_set][i];
2116 #else
2117 int c = classifications[0][pcount];
2118 #endif
2119 int b = r->residue_books[c][pass];
2120 if (b >= 0) {
2121 StbvCodebook *book = f->codebooks + b;
2122 #ifdef STB_VORBIS_DIVIDES_IN_CODEBOOK
2123 if (!stbv_codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r->part_size))
2124 goto done;
2125 #else
2126 // saves 1%
2127 if (!stbv_codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r->part_size))
2128 goto done;
2129 #endif
2130 } else {
2131 z += r->part_size;
2132 c_inter = z & 1;
2133 p_inter = z >> 1;
2134 }
2135 }
2136 #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE
2137 ++class_set;
2138 #endif
2139 }
2140 } else if (ch == 1) {
2141 while (pcount < part_read) {
2142 int z = r->begin + pcount*r->part_size;
2143 int c_inter = 0, p_inter = z;
2144 if (pass == 0) {
2145 StbvCodebook *c = f->codebooks+r->classbook;
2146 int q;
2147 STBV_DECODE(q,f,c);
2148 if (q == STBV_EOP) goto done;
2149 #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE
2150 part_classdata[0][class_set] = r->classdata[q];
2151 #else
2152 for (i=classwords-1; i >= 0; --i) {
2153 classifications[0][i+pcount] = q % r->classifications;
2154 q /= r->classifications;
2155 }
2156 #endif
2157 }
2158 for (i=0; i < classwords && pcount < part_read; ++i, ++pcount) {
2159 int z = r->begin + pcount*r->part_size;
2160 #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE
2161 int c = part_classdata[0][class_set][i];
2162 #else
2163 int c = classifications[0][pcount];
2164 #endif
2165 int b = r->residue_books[c][pass];
2166 if (b >= 0) {
2167 StbvCodebook *book = f->codebooks + b;
2168 if (!stbv_codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r->part_size))
2169 goto done;
2170 } else {
2171 z += r->part_size;
2172 c_inter = 0;
2173 p_inter = z;
2174 }
2175 }
2176 #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE
2177 ++class_set;
2178 #endif
2179 }
2180 } else {
2181 while (pcount < part_read) {
2182 int z = r->begin + pcount*r->part_size;
2183 int c_inter = z % ch, p_inter = z/ch;
2184 if (pass == 0) {
2185 StbvCodebook *c = f->codebooks+r->classbook;
2186 int q;
2187 STBV_DECODE(q,f,c);
2188 if (q == STBV_EOP) goto done;
2189 #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE
2190 part_classdata[0][class_set] = r->classdata[q];
2191 #else
2192 for (i=classwords-1; i >= 0; --i) {
2193 classifications[0][i+pcount] = q % r->classifications;
2194 q /= r->classifications;
2195 }
2196 #endif
2197 }
2198 for (i=0; i < classwords && pcount < part_read; ++i, ++pcount) {
2199 int z = r->begin + pcount*r->part_size;
2200 #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE
2201 int c = part_classdata[0][class_set][i];
2202 #else
2203 int c = classifications[0][pcount];
2204 #endif
2205 int b = r->residue_books[c][pass];
2206 if (b >= 0) {
2207 StbvCodebook *book = f->codebooks + b;
2208 if (!stbv_codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r->part_size))
2209 goto done;
2210 } else {
2211 z += r->part_size;
2212 c_inter = z % ch;
2213 p_inter = z / ch;
2214 }
2215 }
2216 #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE
2217 ++class_set;
2218 #endif
2219 }
2220 }
2221 }
2222 goto done;
2223 }
2224 STBV_CHECK(f);
2225
2226 for (pass=0; pass < 8; ++pass) {
2227 int pcount = 0, class_set=0;
2228 while (pcount < part_read) {
2229 if (pass == 0) {
2230 for (j=0; j < ch; ++j) {
2231 if (!do_not_decode[j]) {
2232 StbvCodebook *c = f->codebooks+r->classbook;
2233 int temp;
2234 STBV_DECODE(temp,f,c);
2235 if (temp == STBV_EOP) goto done;
2236 #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE
2237 part_classdata[j][class_set] = r->classdata[temp];
2238 #else
2239 for (i=classwords-1; i >= 0; --i) {
2240 classifications[j][i+pcount] = temp % r->classifications;
2241 temp /= r->classifications;
2242 }
2243 #endif
2244 }
2245 }
2246 }
2247 for (i=0; i < classwords && pcount < part_read; ++i, ++pcount) {
2248 for (j=0; j < ch; ++j) {
2249 if (!do_not_decode[j]) {
2250 #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE
2251 int c = part_classdata[j][class_set][i];
2252 #else
2253 int c = classifications[j][pcount];
2254 #endif
2255 int b = r->residue_books[c][pass];
2256 if (b >= 0) {
2257 float *target = residue_buffers[j];
2258 int offset = r->begin + pcount * r->part_size;
2259 int n = r->part_size;
2260 StbvCodebook *book = f->codebooks + b;
2261 if (!stbv_residue_decode(f, book, target, offset, n, rtype))
2262 goto done;
2263 }
2264 }
2265 }
2266 }
2267 #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE
2268 ++class_set;
2269 #endif
2270 }
2271 }
2272 done:
2273 STBV_CHECK(f);
2274 #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE
2275 stbv_temp_free(f,part_classdata);
2276 #else
2277 stbv_temp_free(f,classifications);
2278 #endif
2279 stbv_temp_alloc_restore(f,temp_alloc_point);
2280}
2281
2282
2283#if 0
2284// slow way for debugging
2285void inverse_mdct_slow(float *buffer, int n)
2286{
2287 int i,j;
2288 int n2 = n >> 1;
2289 float *x = (float *) malloc(sizeof(*x) * n2);
2290 memcpy(x, buffer, sizeof(*x) * n2);
2291 for (i=0; i < n; ++i) {
2292 float acc = 0;
2293 for (j=0; j < n2; ++j)
2294 // formula from paper:
2295 //acc += n/4.0f * x[j] * (float) cos(M_PI / 2 / n * (2 * i + 1 + n/2.0)*(2*j+1));
2296 // formula from wikipedia
2297 //acc += 2.0f / n2 * x[j] * (float) cos(M_PI/n2 * (i + 0.5 + n2/2)*(j + 0.5));
2298 // these are equivalent, except the formula from the paper inverts the multiplier!
2299 // however, what actually works is NO MULTIPLIER!?!
2300 //acc += 64 * 2.0f / n2 * x[j] * (float) cos(M_PI/n2 * (i + 0.5 + n2/2)*(j + 0.5));
2301 acc += x[j] * (float) cos(M_PI / 2 / n * (2 * i + 1 + n/2.0)*(2*j+1));
2302 buffer[i] = acc;
2303 }
2304 free(x);
2305}
2306#elif 0
2307// same as above, but just barely able to run in real time on modern machines
2308void inverse_mdct_slow(float *buffer, int n, stbv_vorb *f, int blocktype)
2309{
2310 float mcos[16384];
2311 int i,j;
2312 int n2 = n >> 1, nmask = (n << 2) -1;
2313 float *x = (float *) malloc(sizeof(*x) * n2);
2314 memcpy(x, buffer, sizeof(*x) * n2);
2315 for (i=0; i < 4*n; ++i)
2316 mcos[i] = (float) cos(M_PI / 2 * i / n);
2317
2318 for (i=0; i < n; ++i) {
2319 float acc = 0;
2320 for (j=0; j < n2; ++j)
2321 acc += x[j] * mcos[(2 * i + 1 + n2)*(2*j+1) & nmask];
2322 buffer[i] = acc;
2323 }
2324 free(x);
2325}
2326#elif 0
2327// transform to use a slow dct-iv; this is STILL basically trivial,
2328// but only requires half as many ops
2329void dct_iv_slow(float *buffer, int n)
2330{
2331 float mcos[16384];
2332 float x[2048];
2333 int i,j;
2334 int n2 = n >> 1, nmask = (n << 3) - 1;
2335 memcpy(x, buffer, sizeof(*x) * n);
2336 for (i=0; i < 8*n; ++i)
2337 mcos[i] = (float) cos(M_PI / 4 * i / n);
2338 for (i=0; i < n; ++i) {
2339 float acc = 0;
2340 for (j=0; j < n; ++j)
2341 acc += x[j] * mcos[((2 * i + 1)*(2*j+1)) & nmask];
2342 buffer[i] = acc;
2343 }
2344}
2345
2346void inverse_mdct_slow(float *buffer, int n, stbv_vorb *f, int blocktype)
2347{
2348 int i, n4 = n >> 2, n2 = n >> 1, n3_4 = n - n4;
2349 float temp[4096];
2350
2351 memcpy(temp, buffer, n2 * sizeof(float));
2352 dct_iv_slow(temp, n2); // returns -c'-d, a-b'
2353
2354 for (i=0; i < n4 ; ++i) buffer[i] = temp[i+n4]; // a-b'
2355 for ( ; i < n3_4; ++i) buffer[i] = -temp[n3_4 - i - 1]; // b-a', c+d'
2356 for ( ; i < n ; ++i) buffer[i] = -temp[i - n3_4]; // c'+d
2357}
2358#endif
2359
2360#ifndef LIBVORBIS_MDCT
2361#define LIBVORBIS_MDCT 0
2362#endif
2363
2364#if LIBVORBIS_MDCT
2365// directly call the vorbis MDCT using an interface documented
2366// by Jeff Roberts... useful for performance comparison
2367typedef struct
2368{
2369 int n;
2370 int log2n;
2371
2372 float *trig;
2373 int *bitrev;
2374
2375 float scale;
2376} mdct_lookup;
2377
2378extern void mdct_init(mdct_lookup *lookup, int n);
2379extern void mdct_clear(mdct_lookup *l);
2380extern void mdct_backward(mdct_lookup *init, float *in, float *out);
2381
2382mdct_lookup M1,M2;
2383
2384void stbv_inverse_mdct(float *buffer, int n, stbv_vorb *f, int blocktype)
2385{
2386 mdct_lookup *M;
2387 if (M1.n == n) M = &M1;
2388 else if (M2.n == n) M = &M2;
2389 else if (M1.n == 0) { mdct_init(&M1, n); M = &M1; }
2390 else {
2391 if (M2.n) __asm int 3;
2392 mdct_init(&M2, n);
2393 M = &M2;
2394 }
2395
2396 mdct_backward(M, buffer, buffer);
2397}
2398#endif
2399
2400
2401// the following were split out into separate functions while optimizing;
2402// they could be pushed back up but eh. __forceinline showed no change;
2403// they're probably already being inlined.
2404static void stbv_imdct_step3_iter0_loop(int n, float *e, int i_off, int k_off, float *A)
2405{
2406 float *ee0 = e + i_off;
2407 float *ee2 = ee0 + k_off;
2408 int i;
2409
2410 assert((n & 3) == 0);
2411 for (i=(n>>2); i > 0; --i) {
2412 float k00_20, k01_21;
2413 k00_20 = ee0[ 0] - ee2[ 0];
2414 k01_21 = ee0[-1] - ee2[-1];
2415 ee0[ 0] += ee2[ 0];//ee0[ 0] = ee0[ 0] + ee2[ 0];
2416 ee0[-1] += ee2[-1];//ee0[-1] = ee0[-1] + ee2[-1];
2417 ee2[ 0] = k00_20 * A[0] - k01_21 * A[1];
2418 ee2[-1] = k01_21 * A[0] + k00_20 * A[1];
2419 A += 8;
2420
2421 k00_20 = ee0[-2] - ee2[-2];
2422 k01_21 = ee0[-3] - ee2[-3];
2423 ee0[-2] += ee2[-2];//ee0[-2] = ee0[-2] + ee2[-2];
2424 ee0[-3] += ee2[-3];//ee0[-3] = ee0[-3] + ee2[-3];
2425 ee2[-2] = k00_20 * A[0] - k01_21 * A[1];
2426 ee2[-3] = k01_21 * A[0] + k00_20 * A[1];
2427 A += 8;
2428
2429 k00_20 = ee0[-4] - ee2[-4];
2430 k01_21 = ee0[-5] - ee2[-5];
2431 ee0[-4] += ee2[-4];//ee0[-4] = ee0[-4] + ee2[-4];
2432 ee0[-5] += ee2[-5];//ee0[-5] = ee0[-5] + ee2[-5];
2433 ee2[-4] = k00_20 * A[0] - k01_21 * A[1];
2434 ee2[-5] = k01_21 * A[0] + k00_20 * A[1];
2435 A += 8;
2436
2437 k00_20 = ee0[-6] - ee2[-6];
2438 k01_21 = ee0[-7] - ee2[-7];
2439 ee0[-6] += ee2[-6];//ee0[-6] = ee0[-6] + ee2[-6];
2440 ee0[-7] += ee2[-7];//ee0[-7] = ee0[-7] + ee2[-7];
2441 ee2[-6] = k00_20 * A[0] - k01_21 * A[1];
2442 ee2[-7] = k01_21 * A[0] + k00_20 * A[1];
2443 A += 8;
2444 ee0 -= 8;
2445 ee2 -= 8;
2446 }
2447}
2448
2449static void stbv_imdct_step3_inner_r_loop(int lim, float *e, int d0, int k_off, float *A, int k1)
2450{
2451 int i;
2452 float k00_20, k01_21;
2453
2454 float *e0 = e + d0;
2455 float *e2 = e0 + k_off;
2456
2457 for (i=lim >> 2; i > 0; --i) {
2458 k00_20 = e0[-0] - e2[-0];
2459 k01_21 = e0[-1] - e2[-1];
2460 e0[-0] += e2[-0];//e0[-0] = e0[-0] + e2[-0];
2461 e0[-1] += e2[-1];//e0[-1] = e0[-1] + e2[-1];
2462 e2[-0] = (k00_20)*A[0] - (k01_21) * A[1];
2463 e2[-1] = (k01_21)*A[0] + (k00_20) * A[1];
2464
2465 A += k1;
2466
2467 k00_20 = e0[-2] - e2[-2];
2468 k01_21 = e0[-3] - e2[-3];
2469 e0[-2] += e2[-2];//e0[-2] = e0[-2] + e2[-2];
2470 e0[-3] += e2[-3];//e0[-3] = e0[-3] + e2[-3];
2471 e2[-2] = (k00_20)*A[0] - (k01_21) * A[1];
2472 e2[-3] = (k01_21)*A[0] + (k00_20) * A[1];
2473
2474 A += k1;
2475
2476 k00_20 = e0[-4] - e2[-4];
2477 k01_21 = e0[-5] - e2[-5];
2478 e0[-4] += e2[-4];//e0[-4] = e0[-4] + e2[-4];
2479 e0[-5] += e2[-5];//e0[-5] = e0[-5] + e2[-5];
2480 e2[-4] = (k00_20)*A[0] - (k01_21) * A[1];
2481 e2[-5] = (k01_21)*A[0] + (k00_20) * A[1];
2482
2483 A += k1;
2484
2485 k00_20 = e0[-6] - e2[-6];
2486 k01_21 = e0[-7] - e2[-7];
2487 e0[-6] += e2[-6];//e0[-6] = e0[-6] + e2[-6];
2488 e0[-7] += e2[-7];//e0[-7] = e0[-7] + e2[-7];
2489 e2[-6] = (k00_20)*A[0] - (k01_21) * A[1];
2490 e2[-7] = (k01_21)*A[0] + (k00_20) * A[1];
2491
2492 e0 -= 8;
2493 e2 -= 8;
2494
2495 A += k1;
2496 }
2497}
2498
2499static void stbv_imdct_step3_inner_s_loop(int n, float *e, int i_off, int k_off, float *A, int a_off, int k0)
2500{
2501 int i;
2502 float A0 = A[0];
2503 float A1 = A[0+1];
2504 float A2 = A[0+a_off];
2505 float A3 = A[0+a_off+1];
2506 float A4 = A[0+a_off*2+0];
2507 float A5 = A[0+a_off*2+1];
2508 float A6 = A[0+a_off*3+0];
2509 float A7 = A[0+a_off*3+1];
2510
2511 float k00,k11;
2512
2513 float *ee0 = e +i_off;
2514 float *ee2 = ee0+k_off;
2515
2516 for (i=n; i > 0; --i) {
2517 k00 = ee0[ 0] - ee2[ 0];
2518 k11 = ee0[-1] - ee2[-1];
2519 ee0[ 0] = ee0[ 0] + ee2[ 0];
2520 ee0[-1] = ee0[-1] + ee2[-1];
2521 ee2[ 0] = (k00) * A0 - (k11) * A1;
2522 ee2[-1] = (k11) * A0 + (k00) * A1;
2523
2524 k00 = ee0[-2] - ee2[-2];
2525 k11 = ee0[-3] - ee2[-3];
2526 ee0[-2] = ee0[-2] + ee2[-2];
2527 ee0[-3] = ee0[-3] + ee2[-3];
2528 ee2[-2] = (k00) * A2 - (k11) * A3;
2529 ee2[-3] = (k11) * A2 + (k00) * A3;
2530
2531 k00 = ee0[-4] - ee2[-4];
2532 k11 = ee0[-5] - ee2[-5];
2533 ee0[-4] = ee0[-4] + ee2[-4];
2534 ee0[-5] = ee0[-5] + ee2[-5];
2535 ee2[-4] = (k00) * A4 - (k11) * A5;
2536 ee2[-5] = (k11) * A4 + (k00) * A5;
2537
2538 k00 = ee0[-6] - ee2[-6];
2539 k11 = ee0[-7] - ee2[-7];
2540 ee0[-6] = ee0[-6] + ee2[-6];
2541 ee0[-7] = ee0[-7] + ee2[-7];
2542 ee2[-6] = (k00) * A6 - (k11) * A7;
2543 ee2[-7] = (k11) * A6 + (k00) * A7;
2544
2545 ee0 -= k0;
2546 ee2 -= k0;
2547 }
2548}
2549
2550static __forceinline void stbv_iter_54(float *z)
2551{
2552 float k00,k11,k22,k33;
2553 float y0,y1,y2,y3;
2554
2555 k00 = z[ 0] - z[-4];
2556 y0 = z[ 0] + z[-4];
2557 y2 = z[-2] + z[-6];
2558 k22 = z[-2] - z[-6];
2559
2560 z[-0] = y0 + y2; // z0 + z4 + z2 + z6
2561 z[-2] = y0 - y2; // z0 + z4 - z2 - z6
2562
2563 // done with y0,y2
2564
2565 k33 = z[-3] - z[-7];
2566
2567 z[-4] = k00 + k33; // z0 - z4 + z3 - z7
2568 z[-6] = k00 - k33; // z0 - z4 - z3 + z7
2569
2570 // done with k33
2571
2572 k11 = z[-1] - z[-5];
2573 y1 = z[-1] + z[-5];
2574 y3 = z[-3] + z[-7];
2575
2576 z[-1] = y1 + y3; // z1 + z5 + z3 + z7
2577 z[-3] = y1 - y3; // z1 + z5 - z3 - z7
2578 z[-5] = k11 - k22; // z1 - z5 + z2 - z6
2579 z[-7] = k11 + k22; // z1 - z5 - z2 + z6
2580}
2581
2582static void stbv_imdct_step3_inner_s_loop_ld654(int n, float *e, int i_off, float *A, int base_n)
2583{
2584 int a_off = base_n >> 3;
2585 float A2 = A[0+a_off];
2586 float *z = e + i_off;
2587 float *base = z - 16 * n;
2588
2589 while (z > base) {
2590 float k00,k11;
2591
2592 k00 = z[-0] - z[-8];
2593 k11 = z[-1] - z[-9];
2594 z[-0] = z[-0] + z[-8];
2595 z[-1] = z[-1] + z[-9];
2596 z[-8] = k00;
2597 z[-9] = k11 ;
2598
2599 k00 = z[ -2] - z[-10];
2600 k11 = z[ -3] - z[-11];
2601 z[ -2] = z[ -2] + z[-10];
2602 z[ -3] = z[ -3] + z[-11];
2603 z[-10] = (k00+k11) * A2;
2604 z[-11] = (k11-k00) * A2;
2605
2606 k00 = z[-12] - z[ -4]; // reverse to avoid a unary negation
2607 k11 = z[ -5] - z[-13];
2608 z[ -4] = z[ -4] + z[-12];
2609 z[ -5] = z[ -5] + z[-13];
2610 z[-12] = k11;
2611 z[-13] = k00;
2612
2613 k00 = z[-14] - z[ -6]; // reverse to avoid a unary negation
2614 k11 = z[ -7] - z[-15];
2615 z[ -6] = z[ -6] + z[-14];
2616 z[ -7] = z[ -7] + z[-15];
2617 z[-14] = (k00+k11) * A2;
2618 z[-15] = (k00-k11) * A2;
2619
2620 stbv_iter_54(z);
2621 stbv_iter_54(z-8);
2622 z -= 16;
2623 }
2624}
2625
2626static void stbv_inverse_mdct(float *buffer, int n, stbv_vorb *f, int blocktype)
2627{
2628 int n2 = n >> 1, n4 = n >> 2, n8 = n >> 3, l;
2629 int ld;
2630 // @OPTIMIZE: reduce register pressure by using fewer variables?
2631 int save_point = stbv_temp_alloc_save(f);
2632 float *buf2 = (float *) stbv_temp_alloc(f, n2 * sizeof(*buf2));
2633 float *u=NULL,*v=NULL;
2634 // twiddle factors
2635 float *A = f->A[blocktype];
2636
2637 // IMDCT algorithm from "The use of multirate filter banks for coding of high quality digital audio"
2638 // See notes about bugs in that paper in less-optimal implementation 'inverse_mdct_old' after this function.
2639
2640 // kernel from paper
2641
2642
2643 // merged:
2644 // copy and reflect spectral data
2645 // step 0
2646
2647 // note that it turns out that the items added together during
2648 // this step are, in fact, being added to themselves (as reflected
2649 // by step 0). inexplicable inefficiency! this became obvious
2650 // once I combined the passes.
2651
2652 // so there's a missing 'times 2' here (for adding X to itself).
2653 // this propogates through linearly to the end, where the numbers
2654 // are 1/2 too small, and need to be compensated for.
2655
2656 {
2657 float *d,*e, *AA, *e_stop;
2658 d = &buf2[n2-2];
2659 AA = A;
2660 e = &buffer[0];
2661 e_stop = &buffer[n2];
2662 while (e != e_stop) {
2663 d[1] = (e[0] * AA[0] - e[2]*AA[1]);
2664 d[0] = (e[0] * AA[1] + e[2]*AA[0]);
2665 d -= 2;
2666 AA += 2;
2667 e += 4;
2668 }
2669
2670 e = &buffer[n2-3];
2671 while (d >= buf2) {
2672 d[1] = (-e[2] * AA[0] - -e[0]*AA[1]);
2673 d[0] = (-e[2] * AA[1] + -e[0]*AA[0]);
2674 d -= 2;
2675 AA += 2;
2676 e -= 4;
2677 }
2678 }
2679
2680 // now we use symbolic names for these, so that we can
2681 // possibly swap their meaning as we change which operations
2682 // are in place
2683
2684 u = buffer;
2685 v = buf2;
2686
2687 // step 2 (paper output is w, now u)
2688 // this could be in place, but the data ends up in the wrong
2689 // place... _somebody_'s got to swap it, so this is nominated
2690 {
2691 float *AA = &A[n2-8];
2692 float *d0,*d1, *e0, *e1;
2693
2694 e0 = &v[n4];
2695 e1 = &v[0];
2696
2697 d0 = &u[n4];
2698 d1 = &u[0];
2699
2700 while (AA >= A) {
2701 float v40_20, v41_21;
2702
2703 v41_21 = e0[1] - e1[1];
2704 v40_20 = e0[0] - e1[0];
2705 d0[1] = e0[1] + e1[1];
2706 d0[0] = e0[0] + e1[0];
2707 d1[1] = v41_21*AA[4] - v40_20*AA[5];
2708 d1[0] = v40_20*AA[4] + v41_21*AA[5];
2709
2710 v41_21 = e0[3] - e1[3];
2711 v40_20 = e0[2] - e1[2];
2712 d0[3] = e0[3] + e1[3];
2713 d0[2] = e0[2] + e1[2];
2714 d1[3] = v41_21*AA[0] - v40_20*AA[1];
2715 d1[2] = v40_20*AA[0] + v41_21*AA[1];
2716
2717 AA -= 8;
2718
2719 d0 += 4;
2720 d1 += 4;
2721 e0 += 4;
2722 e1 += 4;
2723 }
2724 }
2725
2726 // step 3
2727 ld = stbv_ilog(n) - 1; // stbv_ilog is off-by-one from normal definitions
2728
2729 // optimized step 3:
2730
2731 // the original step3 loop can be nested r inside s or s inside r;
2732 // it's written originally as s inside r, but this is dumb when r
2733 // iterates many times, and s few. So I have two copies of it and
2734 // switch between them halfway.
2735
2736 // this is iteration 0 of step 3
2737 stbv_imdct_step3_iter0_loop(n >> 4, u, n2-1-n4*0, -(n >> 3), A);
2738 stbv_imdct_step3_iter0_loop(n >> 4, u, n2-1-n4*1, -(n >> 3), A);
2739
2740 // this is iteration 1 of step 3
2741 stbv_imdct_step3_inner_r_loop(n >> 5, u, n2-1 - n8*0, -(n >> 4), A, 16);
2742 stbv_imdct_step3_inner_r_loop(n >> 5, u, n2-1 - n8*1, -(n >> 4), A, 16);
2743 stbv_imdct_step3_inner_r_loop(n >> 5, u, n2-1 - n8*2, -(n >> 4), A, 16);
2744 stbv_imdct_step3_inner_r_loop(n >> 5, u, n2-1 - n8*3, -(n >> 4), A, 16);
2745
2746 l=2;
2747 for (; l < (ld-3)>>1; ++l) {
2748 int k0 = n >> (l+2), k0_2 = k0>>1;
2749 int lim = 1 << (l+1);
2750 int i;
2751 for (i=0; i < lim; ++i)
2752 stbv_imdct_step3_inner_r_loop(n >> (l+4), u, n2-1 - k0*i, -k0_2, A, 1 << (l+3));
2753 }
2754
2755 for (; l < ld-6; ++l) {
2756 int k0 = n >> (l+2), k1 = 1 << (l+3), k0_2 = k0>>1;
2757 int rlim = n >> (l+6), r;
2758 int lim = 1 << (l+1);
2759 int i_off;
2760 float *A0 = A;
2761 i_off = n2-1;
2762 for (r=rlim; r > 0; --r) {
2763 stbv_imdct_step3_inner_s_loop(lim, u, i_off, -k0_2, A0, k1, k0);
2764 A0 += k1*4;
2765 i_off -= 8;
2766 }
2767 }
2768
2769 // iterations with count:
2770 // ld-6,-5,-4 all interleaved together
2771 // the big win comes from getting rid of needless flops
2772 // due to the constants on pass 5 & 4 being all 1 and 0;
2773 // combining them to be simultaneous to improve cache made little difference
2774 stbv_imdct_step3_inner_s_loop_ld654(n >> 5, u, n2-1, A, n);
2775
2776 // output is u
2777
2778 // step 4, 5, and 6
2779 // cannot be in-place because of step 5
2780 {
2781 stbv_uint16 *bitrev = f->stbv_bit_reverse[blocktype];
2782 // weirdly, I'd have thought reading sequentially and writing
2783 // erratically would have been better than vice-versa, but in
2784 // fact that's not what my testing showed. (That is, with
2785 // j = bitreverse(i), do you read i and write j, or read j and write i.)
2786
2787 float *d0 = &v[n4-4];
2788 float *d1 = &v[n2-4];
2789 while (d0 >= v) {
2790 int k4;
2791
2792 k4 = bitrev[0];
2793 d1[3] = u[k4+0];
2794 d1[2] = u[k4+1];
2795 d0[3] = u[k4+2];
2796 d0[2] = u[k4+3];
2797
2798 k4 = bitrev[1];
2799 d1[1] = u[k4+0];
2800 d1[0] = u[k4+1];
2801 d0[1] = u[k4+2];
2802 d0[0] = u[k4+3];
2803
2804 d0 -= 4;
2805 d1 -= 4;
2806 bitrev += 2;
2807 }
2808 }
2809 // (paper output is u, now v)
2810
2811
2812 // data must be in buf2
2813 assert(v == buf2);
2814
2815 // step 7 (paper output is v, now v)
2816 // this is now in place
2817 {
2818 float *C = f->C[blocktype];
2819 float *d, *e;
2820
2821 d = v;
2822 e = v + n2 - 4;
2823
2824 while (d < e) {
2825 float a02,a11,b0,b1,b2,b3;
2826
2827 a02 = d[0] - e[2];
2828 a11 = d[1] + e[3];
2829
2830 b0 = C[1]*a02 + C[0]*a11;
2831 b1 = C[1]*a11 - C[0]*a02;
2832
2833 b2 = d[0] + e[ 2];
2834 b3 = d[1] - e[ 3];
2835
2836 d[0] = b2 + b0;
2837 d[1] = b3 + b1;
2838 e[2] = b2 - b0;
2839 e[3] = b1 - b3;
2840
2841 a02 = d[2] - e[0];
2842 a11 = d[3] + e[1];
2843
2844 b0 = C[3]*a02 + C[2]*a11;
2845 b1 = C[3]*a11 - C[2]*a02;
2846
2847 b2 = d[2] + e[ 0];
2848 b3 = d[3] - e[ 1];
2849
2850 d[2] = b2 + b0;
2851 d[3] = b3 + b1;
2852 e[0] = b2 - b0;
2853 e[1] = b1 - b3;
2854
2855 C += 4;
2856 d += 4;
2857 e -= 4;
2858 }
2859 }
2860
2861 // data must be in buf2
2862
2863
2864 // step 8+decode (paper output is X, now buffer)
2865 // this generates pairs of data a la 8 and pushes them directly through
2866 // the decode kernel (pushing rather than pulling) to avoid having
2867 // to make another pass later
2868
2869 // this cannot POSSIBLY be in place, so we refer to the buffers directly
2870
2871 {
2872 float *d0,*d1,*d2,*d3;
2873
2874 float *B = f->B[blocktype] + n2 - 8;
2875 float *e = buf2 + n2 - 8;
2876 d0 = &buffer[0];
2877 d1 = &buffer[n2-4];
2878 d2 = &buffer[n2];
2879 d3 = &buffer[n-4];
2880 while (e >= v) {
2881 float p0,p1,p2,p3;
2882
2883 p3 = e[6]*B[7] - e[7]*B[6];
2884 p2 = -e[6]*B[6] - e[7]*B[7];
2885
2886 d0[0] = p3;
2887 d1[3] = - p3;
2888 d2[0] = p2;
2889 d3[3] = p2;
2890
2891 p1 = e[4]*B[5] - e[5]*B[4];
2892 p0 = -e[4]*B[4] - e[5]*B[5];
2893
2894 d0[1] = p1;
2895 d1[2] = - p1;
2896 d2[1] = p0;
2897 d3[2] = p0;
2898
2899 p3 = e[2]*B[3] - e[3]*B[2];
2900 p2 = -e[2]*B[2] - e[3]*B[3];
2901
2902 d0[2] = p3;
2903 d1[1] = - p3;
2904 d2[2] = p2;
2905 d3[1] = p2;
2906
2907 p1 = e[0]*B[1] - e[1]*B[0];
2908 p0 = -e[0]*B[0] - e[1]*B[1];
2909
2910 d0[3] = p1;
2911 d1[0] = - p1;
2912 d2[3] = p0;
2913 d3[0] = p0;
2914
2915 B -= 8;
2916 e -= 8;
2917 d0 += 4;
2918 d2 += 4;
2919 d1 -= 4;
2920 d3 -= 4;
2921 }
2922 }
2923
2924 stbv_temp_free(f,buf2);
2925 stbv_temp_alloc_restore(f,save_point);
2926}
2927
2928#if 0
2929// this is the original version of the above code, if you want to optimize it from scratch
2930void inverse_mdct_naive(float *buffer, int n)
2931{
2932 float s;
2933 float A[1 << 12], B[1 << 12], C[1 << 11];
2934 int i,k,k2,k4, n2 = n >> 1, n4 = n >> 2, n8 = n >> 3, l;
2935 int n3_4 = n - n4, ld;
2936 // how can they claim this only uses N words?!
2937 // oh, because they're only used sparsely, whoops
2938 float u[1 << 13], X[1 << 13], v[1 << 13], w[1 << 13];
2939 // set up twiddle factors
2940
2941 for (k=k2=0; k < n4; ++k,k2+=2) {
2942 A[k2 ] = (float) cos(4*k*M_PI/n);
2943 A[k2+1] = (float) -sin(4*k*M_PI/n);
2944 B[k2 ] = (float) cos((k2+1)*M_PI/n/2);
2945 B[k2+1] = (float) sin((k2+1)*M_PI/n/2);
2946 }
2947 for (k=k2=0; k < n8; ++k,k2+=2) {
2948 C[k2 ] = (float) cos(2*(k2+1)*M_PI/n);
2949 C[k2+1] = (float) -sin(2*(k2+1)*M_PI/n);
2950 }
2951
2952 // IMDCT algorithm from "The use of multirate filter banks for coding of high quality digital audio"
2953 // Note there are bugs in that pseudocode, presumably due to them attempting
2954 // to rename the arrays nicely rather than representing the way their actual
2955 // implementation bounces buffers back and forth. As a result, even in the
2956 // "some formulars corrected" version, a direct implementation fails. These
2957 // are noted below as "paper bug".
2958
2959 // copy and reflect spectral data
2960 for (k=0; k < n2; ++k) u[k] = buffer[k];
2961 for ( ; k < n ; ++k) u[k] = -buffer[n - k - 1];
2962 // kernel from paper
2963 // step 1
2964 for (k=k2=k4=0; k < n4; k+=1, k2+=2, k4+=4) {
2965 v[n-k4-1] = (u[k4] - u[n-k4-1]) * A[k2] - (u[k4+2] - u[n-k4-3])*A[k2+1];
2966 v[n-k4-3] = (u[k4] - u[n-k4-1]) * A[k2+1] + (u[k4+2] - u[n-k4-3])*A[k2];
2967 }
2968 // step 2
2969 for (k=k4=0; k < n8; k+=1, k4+=4) {
2970 w[n2+3+k4] = v[n2+3+k4] + v[k4+3];
2971 w[n2+1+k4] = v[n2+1+k4] + v[k4+1];
2972 w[k4+3] = (v[n2+3+k4] - v[k4+3])*A[n2-4-k4] - (v[n2+1+k4]-v[k4+1])*A[n2-3-k4];
2973 w[k4+1] = (v[n2+1+k4] - v[k4+1])*A[n2-4-k4] + (v[n2+3+k4]-v[k4+3])*A[n2-3-k4];
2974 }
2975 // step 3
2976 ld = stbv_ilog(n) - 1; // stbv_ilog is off-by-one from normal definitions
2977 for (l=0; l < ld-3; ++l) {
2978 int k0 = n >> (l+2), k1 = 1 << (l+3);
2979 int rlim = n >> (l+4), r4, r;
2980 int s2lim = 1 << (l+2), s2;
2981 for (r=r4=0; r < rlim; r4+=4,++r) {
2982 for (s2=0; s2 < s2lim; s2+=2) {
2983 u[n-1-k0*s2-r4] = w[n-1-k0*s2-r4] + w[n-1-k0*(s2+1)-r4];
2984 u[n-3-k0*s2-r4] = w[n-3-k0*s2-r4] + w[n-3-k0*(s2+1)-r4];
2985 u[n-1-k0*(s2+1)-r4] = (w[n-1-k0*s2-r4] - w[n-1-k0*(s2+1)-r4]) * A[r*k1]
2986 - (w[n-3-k0*s2-r4] - w[n-3-k0*(s2+1)-r4]) * A[r*k1+1];
2987 u[n-3-k0*(s2+1)-r4] = (w[n-3-k0*s2-r4] - w[n-3-k0*(s2+1)-r4]) * A[r*k1]
2988 + (w[n-1-k0*s2-r4] - w[n-1-k0*(s2+1)-r4]) * A[r*k1+1];
2989 }
2990 }
2991 if (l+1 < ld-3) {
2992 // paper bug: ping-ponging of u&w here is omitted
2993 memcpy(w, u, sizeof(u));
2994 }
2995 }
2996
2997 // step 4
2998 for (i=0; i < n8; ++i) {
2999 int j = stbv_bit_reverse(i) >> (32-ld+3);
3000 assert(j < n8);
3001 if (i == j) {
3002 // paper bug: original code probably swapped in place; if copying,
3003 // need to directly copy in this case
3004 int i8 = i << 3;
3005 v[i8+1] = u[i8+1];
3006 v[i8+3] = u[i8+3];
3007 v[i8+5] = u[i8+5];
3008 v[i8+7] = u[i8+7];
3009 } else if (i < j) {
3010 int i8 = i << 3, j8 = j << 3;
3011 v[j8+1] = u[i8+1], v[i8+1] = u[j8 + 1];
3012 v[j8+3] = u[i8+3], v[i8+3] = u[j8 + 3];
3013 v[j8+5] = u[i8+5], v[i8+5] = u[j8 + 5];
3014 v[j8+7] = u[i8+7], v[i8+7] = u[j8 + 7];
3015 }
3016 }
3017 // step 5
3018 for (k=0; k < n2; ++k) {
3019 w[k] = v[k*2+1];
3020 }
3021 // step 6
3022 for (k=k2=k4=0; k < n8; ++k, k2 += 2, k4 += 4) {
3023 u[n-1-k2] = w[k4];
3024 u[n-2-k2] = w[k4+1];
3025 u[n3_4 - 1 - k2] = w[k4+2];
3026 u[n3_4 - 2 - k2] = w[k4+3];
3027 }
3028 // step 7
3029 for (k=k2=0; k < n8; ++k, k2 += 2) {
3030 v[n2 + k2 ] = ( u[n2 + k2] + u[n-2-k2] + C[k2+1]*(u[n2+k2]-u[n-2-k2]) + C[k2]*(u[n2+k2+1]+u[n-2-k2+1]))/2;
3031 v[n-2 - k2] = ( u[n2 + k2] + u[n-2-k2] - C[k2+1]*(u[n2+k2]-u[n-2-k2]) - C[k2]*(u[n2+k2+1]+u[n-2-k2+1]))/2;
3032 v[n2+1+ k2] = ( u[n2+1+k2] - u[n-1-k2] + C[k2+1]*(u[n2+1+k2]+u[n-1-k2]) - C[k2]*(u[n2+k2]-u[n-2-k2]))/2;
3033 v[n-1 - k2] = (-u[n2+1+k2] + u[n-1-k2] + C[k2+1]*(u[n2+1+k2]+u[n-1-k2]) - C[k2]*(u[n2+k2]-u[n-2-k2]))/2;
3034 }
3035 // step 8
3036 for (k=k2=0; k < n4; ++k,k2 += 2) {
3037 X[k] = v[k2+n2]*B[k2 ] + v[k2+1+n2]*B[k2+1];
3038 X[n2-1-k] = v[k2+n2]*B[k2+1] - v[k2+1+n2]*B[k2 ];
3039 }
3040
3041 // decode kernel to output
3042 // determined the following value experimentally
3043 // (by first figuring out what made inverse_mdct_slow work); then matching that here
3044 // (probably vorbis encoder premultiplies by n or n/2, to save it on the decoder?)
3045 s = 0.5; // theoretically would be n4
3046
3047 // [[[ note! the s value of 0.5 is compensated for by the B[] in the current code,
3048 // so it needs to use the "old" B values to behave correctly, or else
3049 // set s to 1.0 ]]]
3050 for (i=0; i < n4 ; ++i) buffer[i] = s * X[i+n4];
3051 for ( ; i < n3_4; ++i) buffer[i] = -s * X[n3_4 - i - 1];
3052 for ( ; i < n ; ++i) buffer[i] = -s * X[i - n3_4];
3053}
3054#endif
3055
3056static float *stbv_get_window(stbv_vorb *f, int len)
3057{
3058 len <<= 1;
3059 if (len == f->blocksize_0) return f->window[0];
3060 if (len == f->blocksize_1) return f->window[1];
3061 assert(0);
3062 return NULL;
3063}
3064
3065#ifndef STB_VORBIS_NO_DEFER_FLOOR
3066typedef stbv_int16 STBV_YTYPE;
3067#else
3068typedef int STBV_YTYPE;
3069#endif
3070static int stbv_do_floor(stbv_vorb *f, StbvMapping *map, int i, int n, float *target, STBV_YTYPE *finalY, stbv_uint8 *step2_flag)
3071{
3072 int n2 = n >> 1;
3073 int s = map->chan[i].mux, floor;
3074 floor = map->submap_floor[s];
3075 if (f->floor_types[floor] == 0) {
3076 return stbv_error(f, VORBIS_invalid_stream);
3077 } else {
3078 StbvFloor1 *g = &f->floor_config[floor].floor1;
3079 int j,q;
3080 int lx = 0, ly = finalY[0] * g->floor1_multiplier;
3081 for (q=1; q < g->values; ++q) {
3082 j = g->sorted_order[q];
3083 #ifndef STB_VORBIS_NO_DEFER_FLOOR
3084 if (finalY[j] >= 0)
3085 #else
3086 if (step2_flag[j])
3087 #endif
3088 {
3089 int hy = finalY[j] * g->floor1_multiplier;
3090 int hx = g->Xlist[j];
3091 if (lx != hx)
3092 stbv_draw_line(target, lx,ly, hx,hy, n2);
3093 STBV_CHECK(f);
3094 lx = hx, ly = hy;
3095 }
3096 }
3097 if (lx < n2) {
3098 // optimization of: stbv_draw_line(target, lx,ly, n,ly, n2);
3099 for (j=lx; j < n2; ++j)
3100 STBV_LINE_OP(target[j], stbv_inverse_db_table[ly]);
3101 STBV_CHECK(f);
3102 }
3103 }
3104 return TRUE;
3105}
3106
3107// The meaning of "left" and "right"
3108//
3109// For a given frame:
3110// we compute samples from 0..n
3111// window_center is n/2
3112// we'll window and mix the samples from left_start to left_end with data from the previous frame
3113// all of the samples from left_end to right_start can be output without mixing; however,
3114// this interval is 0-length except when transitioning between short and long frames
3115// all of the samples from right_start to right_end need to be mixed with the next frame,
3116// which we don't have, so those get saved in a buffer
3117// frame N's right_end-right_start, the number of samples to mix with the next frame,
3118// has to be the same as frame N+1's left_end-left_start (which they are by
3119// construction)
3120
3121static int stbv_vorbis_decode_initial(stbv_vorb *f, int *p_left_start, int *p_left_end, int *p_right_start, int *p_right_end, int *mode)
3122{
3123 StbvMode *m;
3124 int i, n, prev, next, window_center;
3125 f->channel_buffer_start = f->channel_buffer_end = 0;
3126
3127 retry:
3128 if (f->eof) return FALSE;
3129 if (!stbv_maybe_start_packet(f))
3130 return FALSE;
3131 // check packet type
3132 if (stbv_get_bits(f,1) != 0) {
3133 if (STBV_IS_PUSH_MODE(f))
3134 return stbv_error(f,VORBIS_bad_packet_type);
3135 while (STBV_EOP != stbv_get8_packet(f));
3136 goto retry;
3137 }
3138
3139 if (f->alloc.alloc_buffer)
3140 assert(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset);
3141
3142 i = stbv_get_bits(f, stbv_ilog(f->mode_count-1));
3143 if (i == STBV_EOP) return FALSE;
3144 if (i >= f->mode_count) return FALSE;
3145 *mode = i;
3146 m = f->mode_config + i;
3147 if (m->blockflag) {
3148 n = f->blocksize_1;
3149 prev = stbv_get_bits(f,1);
3150 next = stbv_get_bits(f,1);
3151 } else {
3152 prev = next = 0;
3153 n = f->blocksize_0;
3154 }
3155
3156// WINDOWING
3157
3158 window_center = n >> 1;
3159 if (m->blockflag && !prev) {
3160 *p_left_start = (n - f->blocksize_0) >> 2;
3161 *p_left_end = (n + f->blocksize_0) >> 2;
3162 } else {
3163 *p_left_start = 0;
3164 *p_left_end = window_center;
3165 }
3166 if (m->blockflag && !next) {
3167 *p_right_start = (n*3 - f->blocksize_0) >> 2;
3168 *p_right_end = (n*3 + f->blocksize_0) >> 2;
3169 } else {
3170 *p_right_start = window_center;
3171 *p_right_end = n;
3172 }
3173
3174 return TRUE;
3175}
3176
3177static int stbv_vorbis_decode_packet_rest(stbv_vorb *f, int *len, StbvMode *m, int left_start, int left_end, int right_start, int right_end, int *p_left)
3178{
3179 StbvMapping *map;
3180 int i,j,k,n,n2;
3181 int zero_channel[256];
3182 int really_zero_channel[256];
3183
3184// WINDOWING
3185
3186 n = f->blocksize[m->blockflag];
3187 map = &f->mapping[m->mapping];
3188
3189// FLOORS
3190 n2 = n >> 1;
3191
3192 STBV_CHECK(f);
3193
3194 for (i=0; i < f->channels; ++i) {
3195 int s = map->chan[i].mux, floor;
3196 zero_channel[i] = FALSE;
3197 floor = map->submap_floor[s];
3198 if (f->floor_types[floor] == 0) {
3199 return stbv_error(f, VORBIS_invalid_stream);
3200 } else {
3201 StbvFloor1 *g = &f->floor_config[floor].floor1;
3202 if (stbv_get_bits(f, 1)) {
3203 short *finalY;
3204 stbv_uint8 step2_flag[256];
3205 static int range_list[4] = { 256, 128, 86, 64 };
3206 int range = range_list[g->floor1_multiplier-1];
3207 int offset = 2;
3208 finalY = f->finalY[i];
3209 finalY[0] = stbv_get_bits(f, stbv_ilog(range)-1);
3210 finalY[1] = stbv_get_bits(f, stbv_ilog(range)-1);
3211 for (j=0; j < g->partitions; ++j) {
3212 int pclass = g->partition_class_list[j];
3213 int cdim = g->class_dimensions[pclass];
3214 int cbits = g->class_subclasses[pclass];
3215 int csub = (1 << cbits)-1;
3216 int cval = 0;
3217 if (cbits) {
3218 StbvCodebook *c = f->codebooks + g->class_masterbooks[pclass];
3219 STBV_DECODE(cval,f,c);
3220 }
3221 for (k=0; k < cdim; ++k) {
3222 int book = g->subclass_books[pclass][cval & csub];
3223 cval = cval >> cbits;
3224 if (book >= 0) {
3225 int temp;
3226 StbvCodebook *c = f->codebooks + book;
3227 STBV_DECODE(temp,f,c);
3228 finalY[offset++] = temp;
3229 } else
3230 finalY[offset++] = 0;
3231 }
3232 }
3233 if (f->valid_bits == STBV_INVALID_BITS) goto error; // behavior according to spec
3234 step2_flag[0] = step2_flag[1] = 1;
3235 for (j=2; j < g->values; ++j) {
3236 int low, high, pred, highroom, lowroom, room, val;
3237 low = g->stbv_neighbors[j][0];
3238 high = g->stbv_neighbors[j][1];
3239 //stbv_neighbors(g->Xlist, j, &low, &high);
3240 pred = stbv_predict_point(g->Xlist[j], g->Xlist[low], g->Xlist[high], finalY[low], finalY[high]);
3241 val = finalY[j];
3242 highroom = range - pred;
3243 lowroom = pred;
3244 if (highroom < lowroom)
3245 room = highroom * 2;
3246 else
3247 room = lowroom * 2;
3248 if (val) {
3249 step2_flag[low] = step2_flag[high] = 1;
3250 step2_flag[j] = 1;
3251 if (val >= room)
3252 if (highroom > lowroom)
3253 finalY[j] = val - lowroom + pred;
3254 else
3255 finalY[j] = pred - val + highroom - 1;
3256 else
3257 if (val & 1)
3258 finalY[j] = pred - ((val+1)>>1);
3259 else
3260 finalY[j] = pred + (val>>1);
3261 } else {
3262 step2_flag[j] = 0;
3263 finalY[j] = pred;
3264 }
3265 }
3266
3267#ifdef STB_VORBIS_NO_DEFER_FLOOR
3268 stbv_do_floor(f, map, i, n, f->floor_buffers[i], finalY, step2_flag);
3269#else
3270 // defer final floor computation until _after_ residue
3271 for (j=0; j < g->values; ++j) {
3272 if (!step2_flag[j])
3273 finalY[j] = -1;
3274 }
3275#endif
3276 } else {
3277 error:
3278 zero_channel[i] = TRUE;
3279 }
3280 // So we just defer everything else to later
3281
3282 // at this point we've decoded the floor into buffer
3283 }
3284 }
3285 STBV_CHECK(f);
3286 // at this point we've decoded all floors
3287
3288 if (f->alloc.alloc_buffer)
3289 assert(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset);
3290
3291 // re-enable coupled channels if necessary
3292 memcpy(really_zero_channel, zero_channel, sizeof(really_zero_channel[0]) * f->channels);
3293 for (i=0; i < map->coupling_steps; ++i)
3294 if (!zero_channel[map->chan[i].magnitude] || !zero_channel[map->chan[i].angle]) {
3295 zero_channel[map->chan[i].magnitude] = zero_channel[map->chan[i].angle] = FALSE;
3296 }
3297
3298 STBV_CHECK(f);
3299// RESIDUE STBV_DECODE
3300 for (i=0; i < map->submaps; ++i) {
3301 float *residue_buffers[STB_VORBIS_MAX_CHANNELS];
3302 int r;
3303 stbv_uint8 do_not_decode[256];
3304 int ch = 0;
3305 for (j=0; j < f->channels; ++j) {
3306 if (map->chan[j].mux == i) {
3307 if (zero_channel[j]) {
3308 do_not_decode[ch] = TRUE;
3309 residue_buffers[ch] = NULL;
3310 } else {
3311 do_not_decode[ch] = FALSE;
3312 residue_buffers[ch] = f->channel_buffers[j];
3313 }
3314 ++ch;
3315 }
3316 }
3317 r = map->submap_residue[i];
3318 stbv_decode_residue(f, residue_buffers, ch, n2, r, do_not_decode);
3319 }
3320
3321 if (f->alloc.alloc_buffer)
3322 assert(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset);
3323 STBV_CHECK(f);
3324
3325// INVERSE COUPLING
3326 for (i = map->coupling_steps-1; i >= 0; --i) {
3327 int n2 = n >> 1;
3328 float *m = f->channel_buffers[map->chan[i].magnitude];
3329 float *a = f->channel_buffers[map->chan[i].angle ];
3330 for (j=0; j < n2; ++j) {
3331 float a2,m2;
3332 if (m[j] > 0)
3333 if (a[j] > 0)
3334 m2 = m[j], a2 = m[j] - a[j];
3335 else
3336 a2 = m[j], m2 = m[j] + a[j];
3337 else
3338 if (a[j] > 0)
3339 m2 = m[j], a2 = m[j] + a[j];
3340 else
3341 a2 = m[j], m2 = m[j] - a[j];
3342 m[j] = m2;
3343 a[j] = a2;
3344 }
3345 }
3346 STBV_CHECK(f);
3347
3348 // finish decoding the floors
3349#ifndef STB_VORBIS_NO_DEFER_FLOOR
3350 for (i=0; i < f->channels; ++i) {
3351 if (really_zero_channel[i]) {
3352 memset(f->channel_buffers[i], 0, sizeof(*f->channel_buffers[i]) * n2);
3353 } else {
3354 stbv_do_floor(f, map, i, n, f->channel_buffers[i], f->finalY[i], NULL);
3355 }
3356 }
3357#else
3358 for (i=0; i < f->channels; ++i) {
3359 if (really_zero_channel[i]) {
3360 memset(f->channel_buffers[i], 0, sizeof(*f->channel_buffers[i]) * n2);
3361 } else {
3362 for (j=0; j < n2; ++j)
3363 f->channel_buffers[i][j] *= f->floor_buffers[i][j];
3364 }
3365 }
3366#endif
3367
3368// INVERSE MDCT
3369 STBV_CHECK(f);
3370 for (i=0; i < f->channels; ++i)
3371 stbv_inverse_mdct(f->channel_buffers[i], n, f, m->blockflag);
3372 STBV_CHECK(f);
3373
3374 // this shouldn't be necessary, unless we exited on an error
3375 // and want to flush to get to the next packet
3376 stbv_flush_packet(f);
3377
3378 if (f->first_decode) {
3379 // assume we start so first non-discarded sample is sample 0
3380 // this isn't to spec, but spec would require us to read ahead
3381 // and decode the size of all current frames--could be done,
3382 // but presumably it's not a commonly used feature
3383 f->current_loc = -n2; // start of first frame is positioned for discard
3384 // we might have to discard samples "from" the next frame too,
3385 // if we're lapping a large block then a small at the start?
3386 f->discard_samples_deferred = n - right_end;
3387 f->current_loc_valid = TRUE;
3388 f->first_decode = FALSE;
3389 } else if (f->discard_samples_deferred) {
3390 if (f->discard_samples_deferred >= right_start - left_start) {
3391 f->discard_samples_deferred -= (right_start - left_start);
3392 left_start = right_start;
3393 *p_left = left_start;
3394 } else {
3395 left_start += f->discard_samples_deferred;
3396 *p_left = left_start;
3397 f->discard_samples_deferred = 0;
3398 }
3399 } else if (f->previous_length == 0 && f->current_loc_valid) {
3400 // we're recovering from a seek... that means we're going to discard
3401 // the samples from this packet even though we know our position from
3402 // the last page header, so we need to update the position based on
3403 // the discarded samples here
3404 // but wait, the code below is going to add this in itself even
3405 // on a discard, so we don't need to do it here...
3406 }
3407
3408 // check if we have ogg information about the sample # for this packet
3409 if (f->last_seg_which == f->end_seg_with_known_loc) {
3410 // if we have a valid current loc, and this is final:
3411 if (f->current_loc_valid && (f->page_flag & STBV_PAGEFLAG_last_page)) {
3412 stbv_uint32 current_end = f->known_loc_for_packet;
3413 // then let's infer the size of the (probably) short final frame
3414 if (current_end < f->current_loc + (right_end-left_start)) {
3415 if (current_end < f->current_loc) {
3416 // negative truncation, that's impossible!
3417 *len = 0;
3418 } else {
3419 *len = current_end - f->current_loc;
3420 }
3421 *len += left_start; // this doesn't seem right, but has no ill effect on my test files
3422 if (*len > right_end) *len = right_end; // this should never happen
3423 f->current_loc += *len;
3424 return TRUE;
3425 }
3426 }
3427 // otherwise, just set our sample loc
3428 // guess that the ogg granule pos refers to the _middle_ of the
3429 // last frame?
3430 // set f->current_loc to the position of left_start
3431 f->current_loc = f->known_loc_for_packet - (n2-left_start);
3432 f->current_loc_valid = TRUE;
3433 }
3434 if (f->current_loc_valid)
3435 f->current_loc += (right_start - left_start);
3436
3437 if (f->alloc.alloc_buffer)
3438 assert(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset);
3439 *len = right_end; // ignore samples after the window goes to 0
3440 STBV_CHECK(f);
3441
3442 return TRUE;
3443}
3444
3445static int stbv_vorbis_decode_packet(stbv_vorb *f, int *len, int *p_left, int *p_right)
3446{
3447 int mode, left_end, right_end;
3448 if (!stbv_vorbis_decode_initial(f, p_left, &left_end, p_right, &right_end, &mode)) return 0;
3449 return stbv_vorbis_decode_packet_rest(f, len, f->mode_config + mode, *p_left, left_end, *p_right, right_end, p_left);
3450}
3451
3452static int stbv_vorbis_finish_frame(stb_vorbis *f, int len, int left, int right)
3453{
3454 int prev,i,j;
3455 // we use right&left (the start of the right- and left-window sin()-regions)
3456 // to determine how much to return, rather than inferring from the rules
3457 // (same result, clearer code); 'left' indicates where our sin() window
3458 // starts, therefore where the previous window's right edge starts, and
3459 // therefore where to start mixing from the previous buffer. 'right'
3460 // indicates where our sin() ending-window starts, therefore that's where
3461 // we start saving, and where our returned-data ends.
3462
3463 // mixin from previous window
3464 if (f->previous_length) {
3465 int i,j, n = f->previous_length;
3466 float *w = stbv_get_window(f, n);
3467 for (i=0; i < f->channels; ++i) {
3468 for (j=0; j < n; ++j)
3469 f->channel_buffers[i][left+j] =
3470 f->channel_buffers[i][left+j]*w[ j] +
3471 f->previous_window[i][ j]*w[n-1-j];
3472 }
3473 }
3474
3475 prev = f->previous_length;
3476
3477 // last half of this data becomes previous window
3478 f->previous_length = len - right;
3479
3480 // @OPTIMIZE: could avoid this copy by double-buffering the
3481 // output (flipping previous_window with channel_buffers), but
3482 // then previous_window would have to be 2x as large, and
3483 // channel_buffers couldn't be temp mem (although they're NOT
3484 // currently temp mem, they could be (unless we want to level
3485 // performance by spreading out the computation))
3486 for (i=0; i < f->channels; ++i)
3487 for (j=0; right+j < len; ++j)
3488 f->previous_window[i][j] = f->channel_buffers[i][right+j];
3489
3490 if (!prev)
3491 // there was no previous packet, so this data isn't valid...
3492 // this isn't entirely true, only the would-have-overlapped data
3493 // isn't valid, but this seems to be what the spec requires
3494 return 0;
3495
3496 // truncate a short frame
3497 if (len < right) right = len;
3498
3499 f->samples_output += right-left;
3500
3501 return right - left;
3502}
3503
3504static int stbv_vorbis_pump_first_frame(stb_vorbis *f)
3505{
3506 int len, right, left, res;
3507 res = stbv_vorbis_decode_packet(f, &len, &left, &right);
3508 if (res)
3509 stbv_vorbis_finish_frame(f, len, left, right);
3510 return res;
3511}
3512
3513#ifndef STB_VORBIS_NO_PUSHDATA_API
3514static int stbv_is_whole_packet_present(stb_vorbis *f, int end_page)
3515{
3516 // make sure that we have the packet available before continuing...
3517 // this requires a full ogg parse, but we know we can fetch from f->stream
3518
3519 // instead of coding this out explicitly, we could save the current read state,
3520 // read the next packet with stbv_get8() until end-of-packet, check f->eof, then
3521 // reset the state? but that would be slower, esp. since we'd have over 256 bytes
3522 // of state to restore (primarily the page segment table)
3523
3524 int s = f->next_seg, first = TRUE;
3525 stbv_uint8 *p = f->stream;
3526
3527 if (s != -1) { // if we're not starting the packet with a 'continue on next page' flag
3528 for (; s < f->segment_count; ++s) {
3529 p += f->segments[s];
3530 if (f->segments[s] < 255) // stop at first short segment
3531 break;
3532 }
3533 // either this continues, or it ends it...
3534 if (end_page)
3535 if (s < f->segment_count-1) return stbv_error(f, VORBIS_invalid_stream);
3536 if (s == f->segment_count)
3537 s = -1; // set 'crosses page' flag
3538 if (p > f->stream_end) return stbv_error(f, VORBIS_need_more_data);
3539 first = FALSE;
3540 }
3541 for (; s == -1;) {
3542 stbv_uint8 *q;
3543 int n;
3544
3545 // check that we have the page header ready
3546 if (p + 26 >= f->stream_end) return stbv_error(f, VORBIS_need_more_data);
3547 // validate the page
3548 if (memcmp(p, stbv_ogg_page_header, 4)) return stbv_error(f, VORBIS_invalid_stream);
3549 if (p[4] != 0) return stbv_error(f, VORBIS_invalid_stream);
3550 if (first) { // the first segment must NOT have 'continued_packet', later ones MUST
3551 if (f->previous_length)
3552 if ((p[5] & STBV_PAGEFLAG_continued_packet)) return stbv_error(f, VORBIS_invalid_stream);
3553 // if no previous length, we're resynching, so we can come in on a continued-packet,
3554 // which we'll just drop
3555 } else {
3556 if (!(p[5] & STBV_PAGEFLAG_continued_packet)) return stbv_error(f, VORBIS_invalid_stream);
3557 }
3558 n = p[26]; // segment counts
3559 q = p+27; // q points to segment table
3560 p = q + n; // advance past header
3561 // make sure we've read the segment table
3562 if (p > f->stream_end) return stbv_error(f, VORBIS_need_more_data);
3563 for (s=0; s < n; ++s) {
3564 p += q[s];
3565 if (q[s] < 255)
3566 break;
3567 }
3568 if (end_page)
3569 if (s < n-1) return stbv_error(f, VORBIS_invalid_stream);
3570 if (s == n)
3571 s = -1; // set 'crosses page' flag
3572 if (p > f->stream_end) return stbv_error(f, VORBIS_need_more_data);
3573 first = FALSE;
3574 }
3575 return TRUE;
3576}
3577#endif // !STB_VORBIS_NO_PUSHDATA_API
3578
3579static int stbv_start_decoder(stbv_vorb *f)
3580{
3581 stbv_uint8 header[6], x,y;
3582 int len,i,j,k, max_submaps = 0;
3583 int longest_floorlist=0;
3584
3585 // first page, first packet
3586
3587 if (!stbv_start_page(f)) return FALSE;
3588 // validate page flag
3589 if (!(f->page_flag & STBV_PAGEFLAG_first_page)) return stbv_error(f, VORBIS_invalid_first_page);
3590 if (f->page_flag & STBV_PAGEFLAG_last_page) return stbv_error(f, VORBIS_invalid_first_page);
3591 if (f->page_flag & STBV_PAGEFLAG_continued_packet) return stbv_error(f, VORBIS_invalid_first_page);
3592 // check for expected packet length
3593 if (f->segment_count != 1) return stbv_error(f, VORBIS_invalid_first_page);
3594 if (f->segments[0] != 30) return stbv_error(f, VORBIS_invalid_first_page);
3595 // read packet
3596 // check packet header
3597 if (stbv_get8(f) != STBV_VORBIS_packet_id) return stbv_error(f, VORBIS_invalid_first_page);
3598 if (!stbv_getn(f, header, 6)) return stbv_error(f, VORBIS_unexpected_eof);
3599 if (!stbv_vorbis_validate(header)) return stbv_error(f, VORBIS_invalid_first_page);
3600 // vorbis_version
3601 if (stbv_get32(f) != 0) return stbv_error(f, VORBIS_invalid_first_page);
3602 f->channels = stbv_get8(f); if (!f->channels) return stbv_error(f, VORBIS_invalid_first_page);
3603 if (f->channels > STB_VORBIS_MAX_CHANNELS) return stbv_error(f, VORBIS_too_many_channels);
3604 f->sample_rate = stbv_get32(f); if (!f->sample_rate) return stbv_error(f, VORBIS_invalid_first_page);
3605 stbv_get32(f); // bitrate_maximum
3606 stbv_get32(f); // bitrate_nominal
3607 stbv_get32(f); // bitrate_minimum
3608 x = stbv_get8(f);
3609 {
3610 int log0,log1;
3611 log0 = x & 15;
3612 log1 = x >> 4;
3613 f->blocksize_0 = 1 << log0;
3614 f->blocksize_1 = 1 << log1;
3615 if (log0 < 6 || log0 > 13) return stbv_error(f, VORBIS_invalid_setup);
3616 if (log1 < 6 || log1 > 13) return stbv_error(f, VORBIS_invalid_setup);
3617 if (log0 > log1) return stbv_error(f, VORBIS_invalid_setup);
3618 }
3619
3620 // framing_flag
3621 x = stbv_get8(f);
3622 if (!(x & 1)) return stbv_error(f, VORBIS_invalid_first_page);
3623
3624 // second packet!
3625 if (!stbv_start_page(f)) return FALSE;
3626
3627 if (!stbv_start_packet(f)) return FALSE;
3628 do {
3629 len = stbv_next_segment(f);
3630 stbv_skip(f, len);
3631 f->bytes_in_seg = 0;
3632 } while (len);
3633
3634 // third packet!
3635 if (!stbv_start_packet(f)) return FALSE;
3636
3637 #ifndef STB_VORBIS_NO_PUSHDATA_API
3638 if (STBV_IS_PUSH_MODE(f)) {
3639 if (!stbv_is_whole_packet_present(f, TRUE)) {
3640 // convert error in ogg header to write type
3641 if (f->error == VORBIS_invalid_stream)
3642 f->error = VORBIS_invalid_setup;
3643 return FALSE;
3644 }
3645 }
3646 #endif
3647
3648 stbv_crc32_init(); // always init it, to avoid multithread race conditions
3649
3650 if (stbv_get8_packet(f) != STBV_VORBIS_packet_setup) return stbv_error(f, VORBIS_invalid_setup);
3651 for (i=0; i < 6; ++i) header[i] = stbv_get8_packet(f);
3652 if (!stbv_vorbis_validate(header)) return stbv_error(f, VORBIS_invalid_setup);
3653
3654 // codebooks
3655
3656 f->codebook_count = stbv_get_bits(f,8) + 1;
3657 f->codebooks = (StbvCodebook *) stbv_setup_malloc(f, sizeof(*f->codebooks) * f->codebook_count);
3658 if (f->codebooks == NULL) return stbv_error(f, VORBIS_outofmem);
3659 memset(f->codebooks, 0, sizeof(*f->codebooks) * f->codebook_count);
3660 for (i=0; i < f->codebook_count; ++i) {
3661 stbv_uint32 *values;
3662 int ordered, sorted_count;
3663 int total=0;
3664 stbv_uint8 *lengths;
3665 StbvCodebook *c = f->codebooks+i;
3666 STBV_CHECK(f);
3667 x = stbv_get_bits(f, 8); if (x != 0x42) return stbv_error(f, VORBIS_invalid_setup);
3668 x = stbv_get_bits(f, 8); if (x != 0x43) return stbv_error(f, VORBIS_invalid_setup);
3669 x = stbv_get_bits(f, 8); if (x != 0x56) return stbv_error(f, VORBIS_invalid_setup);
3670 x = stbv_get_bits(f, 8);
3671 c->dimensions = (stbv_get_bits(f, 8)<<8) + x;
3672 x = stbv_get_bits(f, 8);
3673 y = stbv_get_bits(f, 8);
3674 c->entries = (stbv_get_bits(f, 8)<<16) + (y<<8) + x;
3675 ordered = stbv_get_bits(f,1);
3676 c->sparse = ordered ? 0 : stbv_get_bits(f,1);
3677
3678 if (c->dimensions == 0 && c->entries != 0) return stbv_error(f, VORBIS_invalid_setup);
3679
3680 if (c->sparse)
3681 lengths = (stbv_uint8 *) stbv_setup_temp_malloc(f, c->entries);
3682 else
3683 lengths = c->codeword_lengths = (stbv_uint8 *) stbv_setup_malloc(f, c->entries);
3684
3685 if (!lengths) return stbv_error(f, VORBIS_outofmem);
3686
3687 if (ordered) {
3688 int current_entry = 0;
3689 int current_length = stbv_get_bits(f,5) + 1;
3690 while (current_entry < c->entries) {
3691 int limit = c->entries - current_entry;
3692 int n = stbv_get_bits(f, stbv_ilog(limit));
3693 if (current_entry + n > (int) c->entries) { return stbv_error(f, VORBIS_invalid_setup); }
3694 memset(lengths + current_entry, current_length, n);
3695 current_entry += n;
3696 ++current_length;
3697 }
3698 } else {
3699 for (j=0; j < c->entries; ++j) {
3700 int present = c->sparse ? stbv_get_bits(f,1) : 1;
3701 if (present) {
3702 lengths[j] = stbv_get_bits(f, 5) + 1;
3703 ++total;
3704 if (lengths[j] == 32)
3705 return stbv_error(f, VORBIS_invalid_setup);
3706 } else {
3707 lengths[j] = NO_CODE;
3708 }
3709 }
3710 }
3711
3712 if (c->sparse && total >= c->entries >> 2) {
3713 // convert sparse items to non-sparse!
3714 if (c->entries > (int) f->setup_temp_memory_required)
3715 f->setup_temp_memory_required = c->entries;
3716
3717 c->codeword_lengths = (stbv_uint8 *) stbv_setup_malloc(f, c->entries);
3718 if (c->codeword_lengths == NULL) return stbv_error(f, VORBIS_outofmem);
3719 memcpy(c->codeword_lengths, lengths, c->entries);
3720 stbv_setup_temp_free(f, lengths, c->entries); // note this is only safe if there have been no intervening temp mallocs!
3721 lengths = c->codeword_lengths;
3722 c->sparse = 0;
3723 }
3724
3725 // compute the size of the sorted tables
3726 if (c->sparse) {
3727 sorted_count = total;
3728 } else {
3729 sorted_count = 0;
3730 #ifndef STB_VORBIS_NO_HUFFMAN_BINARY_SEARCH
3731 for (j=0; j < c->entries; ++j)
3732 if (lengths[j] > STB_VORBIS_FAST_HUFFMAN_LENGTH && lengths[j] != NO_CODE)
3733 ++sorted_count;
3734 #endif
3735 }
3736
3737 c->sorted_entries = sorted_count;
3738 values = NULL;
3739
3740 STBV_CHECK(f);
3741 if (!c->sparse) {
3742 c->codewords = (stbv_uint32 *) stbv_setup_malloc(f, sizeof(c->codewords[0]) * c->entries);
3743 if (!c->codewords) return stbv_error(f, VORBIS_outofmem);
3744 } else {
3745 unsigned int size;
3746 if (c->sorted_entries) {
3747 c->codeword_lengths = (stbv_uint8 *) stbv_setup_malloc(f, c->sorted_entries);
3748 if (!c->codeword_lengths) return stbv_error(f, VORBIS_outofmem);
3749 c->codewords = (stbv_uint32 *) stbv_setup_temp_malloc(f, sizeof(*c->codewords) * c->sorted_entries);
3750 if (!c->codewords) return stbv_error(f, VORBIS_outofmem);
3751 values = (stbv_uint32 *) stbv_setup_temp_malloc(f, sizeof(*values) * c->sorted_entries);
3752 if (!values) return stbv_error(f, VORBIS_outofmem);
3753 }
3754 size = c->entries + (sizeof(*c->codewords) + sizeof(*values)) * c->sorted_entries;
3755 if (size > f->setup_temp_memory_required)
3756 f->setup_temp_memory_required = size;
3757 }
3758
3759 if (!stbv_compute_codewords(c, lengths, c->entries, values)) {
3760 if (c->sparse) stbv_setup_temp_free(f, values, 0);
3761 return stbv_error(f, VORBIS_invalid_setup);
3762 }
3763
3764 if (c->sorted_entries) {
3765 // allocate an extra slot for sentinels
3766 c->sorted_codewords = (stbv_uint32 *) stbv_setup_malloc(f, sizeof(*c->sorted_codewords) * (c->sorted_entries+1));
3767 if (c->sorted_codewords == NULL) return stbv_error(f, VORBIS_outofmem);
3768 // allocate an extra slot at the front so that c->sorted_values[-1] is defined
3769 // so that we can catch that case without an extra if
3770 c->sorted_values = ( int *) stbv_setup_malloc(f, sizeof(*c->sorted_values ) * (c->sorted_entries+1));
3771 if (c->sorted_values == NULL) return stbv_error(f, VORBIS_outofmem);
3772 ++c->sorted_values;
3773 c->sorted_values[-1] = -1;
3774 stbv_compute_sorted_huffman(c, lengths, values);
3775 }
3776
3777 if (c->sparse) {
3778 stbv_setup_temp_free(f, values, sizeof(*values)*c->sorted_entries);
3779 stbv_setup_temp_free(f, c->codewords, sizeof(*c->codewords)*c->sorted_entries);
3780 stbv_setup_temp_free(f, lengths, c->entries);
3781 c->codewords = NULL;
3782 }
3783
3784 stbv_compute_accelerated_huffman(c);
3785
3786 STBV_CHECK(f);
3787 c->lookup_type = stbv_get_bits(f, 4);
3788 if (c->lookup_type > 2) return stbv_error(f, VORBIS_invalid_setup);
3789 if (c->lookup_type > 0) {
3790 stbv_uint16 *mults;
3791 c->minimum_value = stbv_float32_unpack(stbv_get_bits(f, 32));
3792 c->delta_value = stbv_float32_unpack(stbv_get_bits(f, 32));
3793 c->value_bits = stbv_get_bits(f, 4)+1;
3794 c->sequence_p = stbv_get_bits(f,1);
3795 if (c->lookup_type == 1) {
3796 c->lookup_values = stbv_lookup1_values(c->entries, c->dimensions);
3797 } else {
3798 c->lookup_values = c->entries * c->dimensions;
3799 }
3800 if (c->lookup_values == 0) return stbv_error(f, VORBIS_invalid_setup);
3801 mults = (stbv_uint16 *) stbv_setup_temp_malloc(f, sizeof(mults[0]) * c->lookup_values);
3802 if (mults == NULL) return stbv_error(f, VORBIS_outofmem);
3803 for (j=0; j < (int) c->lookup_values; ++j) {
3804 int q = stbv_get_bits(f, c->value_bits);
3805 if (q == STBV_EOP) { stbv_setup_temp_free(f,mults,sizeof(mults[0])*c->lookup_values); return stbv_error(f, VORBIS_invalid_setup); }
3806 mults[j] = q;
3807 }
3808
3809#ifndef STB_VORBIS_DIVIDES_IN_CODEBOOK
3810 if (c->lookup_type == 1) {
3811 int len, sparse = c->sparse;
3812 float last=0;
3813 // pre-expand the lookup1-style multiplicands, to avoid a divide in the inner loop
3814 if (sparse) {
3815 if (c->sorted_entries == 0) goto stbv_skip;
3816 c->multiplicands = (stbv_codetype *) stbv_setup_malloc(f, sizeof(c->multiplicands[0]) * c->sorted_entries * c->dimensions);
3817 } else
3818 c->multiplicands = (stbv_codetype *) stbv_setup_malloc(f, sizeof(c->multiplicands[0]) * c->entries * c->dimensions);
3819 if (c->multiplicands == NULL) { stbv_setup_temp_free(f,mults,sizeof(mults[0])*c->lookup_values); return stbv_error(f, VORBIS_outofmem); }
3820 len = sparse ? c->sorted_entries : c->entries;
3821 for (j=0; j < len; ++j) {
3822 unsigned int z = sparse ? c->sorted_values[j] : j;
3823 unsigned int div=1;
3824 for (k=0; k < c->dimensions; ++k) {
3825 int off = (z / div) % c->lookup_values;
3826 float val = mults[off];
3827 val = mults[off]*c->delta_value + c->minimum_value + last;
3828 c->multiplicands[j*c->dimensions + k] = val;
3829 if (c->sequence_p)
3830 last = val;
3831 if (k+1 < c->dimensions) {
3832 if (div > UINT_MAX / (unsigned int) c->lookup_values) {
3833 stbv_setup_temp_free(f, mults,sizeof(mults[0])*c->lookup_values);
3834 return stbv_error(f, VORBIS_invalid_setup);
3835 }
3836 div *= c->lookup_values;
3837 }
3838 }
3839 }
3840 c->lookup_type = 2;
3841 }
3842 else
3843#endif
3844 {
3845 float last=0;
3846 STBV_CHECK(f);
3847 c->multiplicands = (stbv_codetype *) stbv_setup_malloc(f, sizeof(c->multiplicands[0]) * c->lookup_values);
3848 if (c->multiplicands == NULL) { stbv_setup_temp_free(f, mults,sizeof(mults[0])*c->lookup_values); return stbv_error(f, VORBIS_outofmem); }
3849 for (j=0; j < (int) c->lookup_values; ++j) {
3850 float val = mults[j] * c->delta_value + c->minimum_value + last;
3851 c->multiplicands[j] = val;
3852 if (c->sequence_p)
3853 last = val;
3854 }
3855 }
3856#ifndef STB_VORBIS_DIVIDES_IN_CODEBOOK
3857 stbv_skip:;
3858#endif
3859 stbv_setup_temp_free(f, mults, sizeof(mults[0])*c->lookup_values);
3860
3861 STBV_CHECK(f);
3862 }
3863 STBV_CHECK(f);
3864 }
3865
3866 // time domain transfers (notused)
3867
3868 x = stbv_get_bits(f, 6) + 1;
3869 for (i=0; i < x; ++i) {
3870 stbv_uint32 z = stbv_get_bits(f, 16);
3871 if (z != 0) return stbv_error(f, VORBIS_invalid_setup);
3872 }
3873
3874 // Floors
3875 f->floor_count = stbv_get_bits(f, 6)+1;
3876 f->floor_config = (StbvFloor *) stbv_setup_malloc(f, f->floor_count * sizeof(*f->floor_config));
3877 if (f->floor_config == NULL) return stbv_error(f, VORBIS_outofmem);
3878 for (i=0; i < f->floor_count; ++i) {
3879 f->floor_types[i] = stbv_get_bits(f, 16);
3880 if (f->floor_types[i] > 1) return stbv_error(f, VORBIS_invalid_setup);
3881 if (f->floor_types[i] == 0) {
3882 StbvFloor0 *g = &f->floor_config[i].floor0;
3883 g->order = stbv_get_bits(f,8);
3884 g->rate = stbv_get_bits(f,16);
3885 g->bark_map_size = stbv_get_bits(f,16);
3886 g->amplitude_bits = stbv_get_bits(f,6);
3887 g->amplitude_offset = stbv_get_bits(f,8);
3888 g->number_of_books = stbv_get_bits(f,4) + 1;
3889 for (j=0; j < g->number_of_books; ++j)
3890 g->book_list[j] = stbv_get_bits(f,8);
3891 return stbv_error(f, VORBIS_feature_not_supported);
3892 } else {
3893 stbv_floor_ordering p[31*8+2];
3894 StbvFloor1 *g = &f->floor_config[i].floor1;
3895 int max_class = -1;
3896 g->partitions = stbv_get_bits(f, 5);
3897 for (j=0; j < g->partitions; ++j) {
3898 g->partition_class_list[j] = stbv_get_bits(f, 4);
3899 if (g->partition_class_list[j] > max_class)
3900 max_class = g->partition_class_list[j];
3901 }
3902 for (j=0; j <= max_class; ++j) {
3903 g->class_dimensions[j] = stbv_get_bits(f, 3)+1;
3904 g->class_subclasses[j] = stbv_get_bits(f, 2);
3905 if (g->class_subclasses[j]) {
3906 g->class_masterbooks[j] = stbv_get_bits(f, 8);
3907 if (g->class_masterbooks[j] >= f->codebook_count) return stbv_error(f, VORBIS_invalid_setup);
3908 }
3909 for (k=0; k < 1 << g->class_subclasses[j]; ++k) {
3910 g->subclass_books[j][k] = stbv_get_bits(f,8)-1;
3911 if (g->subclass_books[j][k] >= f->codebook_count) return stbv_error(f, VORBIS_invalid_setup);
3912 }
3913 }
3914 g->floor1_multiplier = stbv_get_bits(f,2)+1;
3915 g->rangebits = stbv_get_bits(f,4);
3916 g->Xlist[0] = 0;
3917 g->Xlist[1] = 1 << g->rangebits;
3918 g->values = 2;
3919 for (j=0; j < g->partitions; ++j) {
3920 int c = g->partition_class_list[j];
3921 for (k=0; k < g->class_dimensions[c]; ++k) {
3922 g->Xlist[g->values] = stbv_get_bits(f, g->rangebits);
3923 ++g->values;
3924 }
3925 }
3926 // precompute the sorting
3927 for (j=0; j < g->values; ++j) {
3928 p[j].x = g->Xlist[j];
3929 p[j].id = j;
3930 }
3931 qsort(p, g->values, sizeof(p[0]), stbv_point_compare);
3932 for (j=0; j < g->values; ++j)
3933 g->sorted_order[j] = (stbv_uint8) p[j].id;
3934 // precompute the stbv_neighbors
3935 for (j=2; j < g->values; ++j) {
3936 int low,hi;
3937 stbv_neighbors(g->Xlist, j, &low,&hi);
3938 g->stbv_neighbors[j][0] = low;
3939 g->stbv_neighbors[j][1] = hi;
3940 }
3941
3942 if (g->values > longest_floorlist)
3943 longest_floorlist = g->values;
3944 }
3945 }
3946
3947 // StbvResidue
3948 f->residue_count = stbv_get_bits(f, 6)+1;
3949 f->residue_config = (StbvResidue *) stbv_setup_malloc(f, f->residue_count * sizeof(f->residue_config[0]));
3950 if (f->residue_config == NULL) return stbv_error(f, VORBIS_outofmem);
3951 memset(f->residue_config, 0, f->residue_count * sizeof(f->residue_config[0]));
3952 for (i=0; i < f->residue_count; ++i) {
3953 stbv_uint8 residue_cascade[64];
3954 StbvResidue *r = f->residue_config+i;
3955 f->residue_types[i] = stbv_get_bits(f, 16);
3956 if (f->residue_types[i] > 2) return stbv_error(f, VORBIS_invalid_setup);
3957 r->begin = stbv_get_bits(f, 24);
3958 r->end = stbv_get_bits(f, 24);
3959 if (r->end < r->begin) return stbv_error(f, VORBIS_invalid_setup);
3960 r->part_size = stbv_get_bits(f,24)+1;
3961 r->classifications = stbv_get_bits(f,6)+1;
3962 r->classbook = stbv_get_bits(f,8);
3963 if (r->classbook >= f->codebook_count) return stbv_error(f, VORBIS_invalid_setup);
3964 for (j=0; j < r->classifications; ++j) {
3965 stbv_uint8 high_bits=0;
3966 stbv_uint8 low_bits=stbv_get_bits(f,3);
3967 if (stbv_get_bits(f,1))
3968 high_bits = stbv_get_bits(f,5);
3969 residue_cascade[j] = high_bits*8 + low_bits;
3970 }
3971 r->residue_books = (short (*)[8]) stbv_setup_malloc(f, sizeof(r->residue_books[0]) * r->classifications);
3972 if (r->residue_books == NULL) return stbv_error(f, VORBIS_outofmem);
3973 for (j=0; j < r->classifications; ++j) {
3974 for (k=0; k < 8; ++k) {
3975 if (residue_cascade[j] & (1 << k)) {
3976 r->residue_books[j][k] = stbv_get_bits(f, 8);
3977 if (r->residue_books[j][k] >= f->codebook_count) return stbv_error(f, VORBIS_invalid_setup);
3978 } else {
3979 r->residue_books[j][k] = -1;
3980 }
3981 }
3982 }
3983 // precompute the classifications[] array to avoid inner-loop mod/divide
3984 // call it 'classdata' since we already have r->classifications
3985 r->classdata = (stbv_uint8 **) stbv_setup_malloc(f, sizeof(*r->classdata) * f->codebooks[r->classbook].entries);
3986 if (!r->classdata) return stbv_error(f, VORBIS_outofmem);
3987 memset(r->classdata, 0, sizeof(*r->classdata) * f->codebooks[r->classbook].entries);
3988 for (j=0; j < f->codebooks[r->classbook].entries; ++j) {
3989 int classwords = f->codebooks[r->classbook].dimensions;
3990 int temp = j;
3991 r->classdata[j] = (stbv_uint8 *) stbv_setup_malloc(f, sizeof(r->classdata[j][0]) * classwords);
3992 if (r->classdata[j] == NULL) return stbv_error(f, VORBIS_outofmem);
3993 for (k=classwords-1; k >= 0; --k) {
3994 r->classdata[j][k] = temp % r->classifications;
3995 temp /= r->classifications;
3996 }
3997 }
3998 }
3999
4000 f->mapping_count = stbv_get_bits(f,6)+1;
4001 f->mapping = (StbvMapping *) stbv_setup_malloc(f, f->mapping_count * sizeof(*f->mapping));
4002 if (f->mapping == NULL) return stbv_error(f, VORBIS_outofmem);
4003 memset(f->mapping, 0, f->mapping_count * sizeof(*f->mapping));
4004 for (i=0; i < f->mapping_count; ++i) {
4005 StbvMapping *m = f->mapping + i;
4006 int mapping_type = stbv_get_bits(f,16);
4007 if (mapping_type != 0) return stbv_error(f, VORBIS_invalid_setup);
4008 m->chan = (StbvMappingChannel *) stbv_setup_malloc(f, f->channels * sizeof(*m->chan));
4009 if (m->chan == NULL) return stbv_error(f, VORBIS_outofmem);
4010 if (stbv_get_bits(f,1))
4011 m->submaps = stbv_get_bits(f,4)+1;
4012 else
4013 m->submaps = 1;
4014 if (m->submaps > max_submaps)
4015 max_submaps = m->submaps;
4016 if (stbv_get_bits(f,1)) {
4017 m->coupling_steps = stbv_get_bits(f,8)+1;
4018 for (k=0; k < m->coupling_steps; ++k) {
4019 m->chan[k].magnitude = stbv_get_bits(f, stbv_ilog(f->channels-1));
4020 m->chan[k].angle = stbv_get_bits(f, stbv_ilog(f->channels-1));
4021 if (m->chan[k].magnitude >= f->channels) return stbv_error(f, VORBIS_invalid_setup);
4022 if (m->chan[k].angle >= f->channels) return stbv_error(f, VORBIS_invalid_setup);
4023 if (m->chan[k].magnitude == m->chan[k].angle) return stbv_error(f, VORBIS_invalid_setup);
4024 }
4025 } else
4026 m->coupling_steps = 0;
4027
4028 // reserved field
4029 if (stbv_get_bits(f,2)) return stbv_error(f, VORBIS_invalid_setup);
4030 if (m->submaps > 1) {
4031 for (j=0; j < f->channels; ++j) {
4032 m->chan[j].mux = stbv_get_bits(f, 4);
4033 if (m->chan[j].mux >= m->submaps) return stbv_error(f, VORBIS_invalid_setup);
4034 }
4035 } else
4036 // @SPECIFICATION: this case is missing from the spec
4037 for (j=0; j < f->channels; ++j)
4038 m->chan[j].mux = 0;
4039
4040 for (j=0; j < m->submaps; ++j) {
4041 stbv_get_bits(f,8); // discard
4042 m->submap_floor[j] = stbv_get_bits(f,8);
4043 m->submap_residue[j] = stbv_get_bits(f,8);
4044 if (m->submap_floor[j] >= f->floor_count) return stbv_error(f, VORBIS_invalid_setup);
4045 if (m->submap_residue[j] >= f->residue_count) return stbv_error(f, VORBIS_invalid_setup);
4046 }
4047 }
4048
4049 // Modes
4050 f->mode_count = stbv_get_bits(f, 6)+1;
4051 for (i=0; i < f->mode_count; ++i) {
4052 StbvMode *m = f->mode_config+i;
4053 m->blockflag = stbv_get_bits(f,1);
4054 m->windowtype = stbv_get_bits(f,16);
4055 m->transformtype = stbv_get_bits(f,16);
4056 m->mapping = stbv_get_bits(f,8);
4057 if (m->windowtype != 0) return stbv_error(f, VORBIS_invalid_setup);
4058 if (m->transformtype != 0) return stbv_error(f, VORBIS_invalid_setup);
4059 if (m->mapping >= f->mapping_count) return stbv_error(f, VORBIS_invalid_setup);
4060 }
4061
4062 stbv_flush_packet(f);
4063
4064 f->previous_length = 0;
4065
4066 for (i=0; i < f->channels; ++i) {
4067 f->channel_buffers[i] = (float *) stbv_setup_malloc(f, sizeof(float) * f->blocksize_1);
4068 f->previous_window[i] = (float *) stbv_setup_malloc(f, sizeof(float) * f->blocksize_1/2);
4069 f->finalY[i] = (stbv_int16 *) stbv_setup_malloc(f, sizeof(stbv_int16) * longest_floorlist);
4070 if (f->channel_buffers[i] == NULL || f->previous_window[i] == NULL || f->finalY[i] == NULL) return stbv_error(f, VORBIS_outofmem);
4071 memset(f->channel_buffers[i], 0, sizeof(float) * f->blocksize_1);
4072 #ifdef STB_VORBIS_NO_DEFER_FLOOR
4073 f->floor_buffers[i] = (float *) stbv_setup_malloc(f, sizeof(float) * f->blocksize_1/2);
4074 if (f->floor_buffers[i] == NULL) return stbv_error(f, VORBIS_outofmem);
4075 #endif
4076 }
4077
4078 if (!stbv_init_blocksize(f, 0, f->blocksize_0)) return FALSE;
4079 if (!stbv_init_blocksize(f, 1, f->blocksize_1)) return FALSE;
4080 f->blocksize[0] = f->blocksize_0;
4081 f->blocksize[1] = f->blocksize_1;
4082
4083#ifdef STB_VORBIS_DIVIDE_TABLE
4084 if (stbv_integer_divide_table[1][1]==0)
4085 for (i=0; i < STBV_DIVTAB_NUMER; ++i)
4086 for (j=1; j < STBV_DIVTAB_DENOM; ++j)
4087 stbv_integer_divide_table[i][j] = i / j;
4088#endif
4089
4090 // compute how much temporary memory is needed
4091
4092 // 1.
4093 {
4094 stbv_uint32 imdct_mem = (f->blocksize_1 * sizeof(float) >> 1);
4095 stbv_uint32 classify_mem;
4096 int i,max_part_read=0;
4097 for (i=0; i < f->residue_count; ++i) {
4098 StbvResidue *r = f->residue_config + i;
4099 unsigned int actual_size = f->blocksize_1 / 2;
4100 unsigned int limit_r_begin = r->begin < actual_size ? r->begin : actual_size;
4101 unsigned int limit_r_end = r->end < actual_size ? r->end : actual_size;
4102 int n_read = limit_r_end - limit_r_begin;
4103 int part_read = n_read / r->part_size;
4104 if (part_read > max_part_read)
4105 max_part_read = part_read;
4106 }
4107 #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE
4108 classify_mem = f->channels * (sizeof(void*) + max_part_read * sizeof(stbv_uint8 *));
4109 #else
4110 classify_mem = f->channels * (sizeof(void*) + max_part_read * sizeof(int *));
4111 #endif
4112
4113 // maximum reasonable partition size is f->blocksize_1
4114
4115 f->temp_memory_required = classify_mem;
4116 if (imdct_mem > f->temp_memory_required)
4117 f->temp_memory_required = imdct_mem;
4118 }
4119
4120 f->first_decode = TRUE;
4121
4122 if (f->alloc.alloc_buffer) {
4123 assert(f->temp_offset == f->alloc.alloc_buffer_length_in_bytes);
4124 // check if there's enough temp memory so we don't error later
4125 if (f->setup_offset + sizeof(*f) + f->temp_memory_required > (unsigned) f->temp_offset)
4126 return stbv_error(f, VORBIS_outofmem);
4127 }
4128
4129 f->first_audio_page_offset = stb_vorbis_get_file_offset(f);
4130
4131 return TRUE;
4132}
4133
4134static void stbv_vorbis_deinit(stb_vorbis *p)
4135{
4136 int i,j;
4137 if (p->residue_config) {
4138 for (i=0; i < p->residue_count; ++i) {
4139 StbvResidue *r = p->residue_config+i;
4140 if (r->classdata) {
4141 for (j=0; j < p->codebooks[r->classbook].entries; ++j)
4142 stbv_setup_free(p, r->classdata[j]);
4143 stbv_setup_free(p, r->classdata);
4144 }
4145 stbv_setup_free(p, r->residue_books);
4146 }
4147 }
4148
4149 if (p->codebooks) {
4150 STBV_CHECK(p);
4151 for (i=0; i < p->codebook_count; ++i) {
4152 StbvCodebook *c = p->codebooks + i;
4153 stbv_setup_free(p, c->codeword_lengths);
4154 stbv_setup_free(p, c->multiplicands);
4155 stbv_setup_free(p, c->codewords);
4156 stbv_setup_free(p, c->sorted_codewords);
4157 // c->sorted_values[-1] is the first entry in the array
4158 stbv_setup_free(p, c->sorted_values ? c->sorted_values-1 : NULL);
4159 }
4160 stbv_setup_free(p, p->codebooks);
4161 }
4162 stbv_setup_free(p, p->floor_config);
4163 stbv_setup_free(p, p->residue_config);
4164 if (p->mapping) {
4165 for (i=0; i < p->mapping_count; ++i)
4166 stbv_setup_free(p, p->mapping[i].chan);
4167 stbv_setup_free(p, p->mapping);
4168 }
4169 STBV_CHECK(p);
4170 for (i=0; i < p->channels && i < STB_VORBIS_MAX_CHANNELS; ++i) {
4171 stbv_setup_free(p, p->channel_buffers[i]);
4172 stbv_setup_free(p, p->previous_window[i]);
4173 #ifdef STB_VORBIS_NO_DEFER_FLOOR
4174 stbv_setup_free(p, p->floor_buffers[i]);
4175 #endif
4176 stbv_setup_free(p, p->finalY[i]);
4177 }
4178 for (i=0; i < 2; ++i) {
4179 stbv_setup_free(p, p->A[i]);
4180 stbv_setup_free(p, p->B[i]);
4181 stbv_setup_free(p, p->C[i]);
4182 stbv_setup_free(p, p->window[i]);
4183 stbv_setup_free(p, p->stbv_bit_reverse[i]);
4184 }
4185 #ifndef STB_VORBIS_NO_STDIO
4186 if (p->close_on_free) fclose(p->f);
4187 #endif
4188}
4189
4190STBVDEF void stb_vorbis_close(stb_vorbis *p)
4191{
4192 if (p == NULL) return;
4193 stbv_vorbis_deinit(p);
4194 stbv_setup_free(p,p);
4195}
4196
4197static void stbv_vorbis_init(stb_vorbis *p, const stb_vorbis_alloc *z)
4198{
4199 memset(p, 0, sizeof(*p)); // NULL out all malloc'd pointers to start
4200 if (z) {
4201 p->alloc = *z;
4202 p->alloc.alloc_buffer_length_in_bytes = (p->alloc.alloc_buffer_length_in_bytes+3) & ~3;
4203 p->temp_offset = p->alloc.alloc_buffer_length_in_bytes;
4204 }
4205 p->eof = 0;
4206 p->error = VORBIS__no_error;
4207 p->stream = NULL;
4208 p->codebooks = NULL;
4209 p->page_crc_tests = -1;
4210 #ifndef STB_VORBIS_NO_STDIO
4211 p->close_on_free = FALSE;
4212 p->f = NULL;
4213 #endif
4214}
4215
4216STBVDEF int stb_vorbis_get_sample_offset(stb_vorbis *f)
4217{
4218 if (f->current_loc_valid)
4219 return f->current_loc;
4220 else
4221 return -1;
4222}
4223
4224STBVDEF stb_vorbis_info stb_vorbis_get_info(stb_vorbis *f)
4225{
4226 stb_vorbis_info d;
4227 d.channels = f->channels;
4228 d.sample_rate = f->sample_rate;
4229 d.setup_memory_required = f->setup_memory_required;
4230 d.setup_temp_memory_required = f->setup_temp_memory_required;
4231 d.temp_memory_required = f->temp_memory_required;
4232 d.max_frame_size = f->blocksize_1 >> 1;
4233 return d;
4234}
4235
4236STBVDEF int stb_vorbis_get_error(stb_vorbis *f)
4237{
4238 int e = f->error;
4239 f->error = VORBIS__no_error;
4240 return e;
4241}
4242
4243static stb_vorbis * stbv_vorbis_alloc(stb_vorbis *f)
4244{
4245 stb_vorbis *p = (stb_vorbis *) stbv_setup_malloc(f, sizeof(*p));
4246 return p;
4247}
4248
4249#ifndef STB_VORBIS_NO_PUSHDATA_API
4250
4251STBVDEF void stb_vorbis_flush_pushdata(stb_vorbis *f)
4252{
4253 f->previous_length = 0;
4254 f->page_crc_tests = 0;
4255 f->discard_samples_deferred = 0;
4256 f->current_loc_valid = FALSE;
4257 f->first_decode = FALSE;
4258 f->samples_output = 0;
4259 f->channel_buffer_start = 0;
4260 f->channel_buffer_end = 0;
4261}
4262
4263static int stbv_vorbis_search_for_page_pushdata(stbv_vorb *f, stbv_uint8 *data, int data_len)
4264{
4265 int i,n;
4266 for (i=0; i < f->page_crc_tests; ++i)
4267 f->scan[i].bytes_done = 0;
4268
4269 // if we have room for more scans, search for them first, because
4270 // they may cause us to stop early if their header is incomplete
4271 if (f->page_crc_tests < STB_VORBIS_PUSHDATA_CRC_COUNT) {
4272 if (data_len < 4) return 0;
4273 data_len -= 3; // need to look for 4-byte sequence, so don't miss
4274 // one that straddles a boundary
4275 for (i=0; i < data_len; ++i) {
4276 if (data[i] == 0x4f) {
4277 if (0==memcmp(data+i, stbv_ogg_page_header, 4)) {
4278 int j,len;
4279 stbv_uint32 crc;
4280 // make sure we have the whole page header
4281 if (i+26 >= data_len || i+27+data[i+26] >= data_len) {
4282 // only read up to this page start, so hopefully we'll
4283 // have the whole page header start next time
4284 data_len = i;
4285 break;
4286 }
4287 // ok, we have it all; compute the length of the page
4288 len = 27 + data[i+26];
4289 for (j=0; j < data[i+26]; ++j)
4290 len += data[i+27+j];
4291 // scan everything up to the embedded crc (which we must 0)
4292 crc = 0;
4293 for (j=0; j < 22; ++j)
4294 crc = stbv_crc32_update(crc, data[i+j]);
4295 // now process 4 0-bytes
4296 for ( ; j < 26; ++j)
4297 crc = stbv_crc32_update(crc, 0);
4298 // len is the total number of bytes we need to scan
4299 n = f->page_crc_tests++;
4300 f->scan[n].bytes_left = len-j;
4301 f->scan[n].crc_so_far = crc;
4302 f->scan[n].goal_crc = data[i+22] + (data[i+23] << 8) + (data[i+24]<<16) + (data[i+25]<<24);
4303 // if the last frame on a page is continued to the next, then
4304 // we can't recover the sample_loc immediately
4305 if (data[i+27+data[i+26]-1] == 255)
4306 f->scan[n].sample_loc = ~0;
4307 else
4308 f->scan[n].sample_loc = data[i+6] + (data[i+7] << 8) + (data[i+ 8]<<16) + (data[i+ 9]<<24);
4309 f->scan[n].bytes_done = i+j;
4310 if (f->page_crc_tests == STB_VORBIS_PUSHDATA_CRC_COUNT)
4311 break;
4312 // keep going if we still have room for more
4313 }
4314 }
4315 }
4316 }
4317
4318 for (i=0; i < f->page_crc_tests;) {
4319 stbv_uint32 crc;
4320 int j;
4321 int n = f->scan[i].bytes_done;
4322 int m = f->scan[i].bytes_left;
4323 if (m > data_len - n) m = data_len - n;
4324 // m is the bytes to scan in the current chunk
4325 crc = f->scan[i].crc_so_far;
4326 for (j=0; j < m; ++j)
4327 crc = stbv_crc32_update(crc, data[n+j]);
4328 f->scan[i].bytes_left -= m;
4329 f->scan[i].crc_so_far = crc;
4330 if (f->scan[i].bytes_left == 0) {
4331 // does it match?
4332 if (f->scan[i].crc_so_far == f->scan[i].goal_crc) {
4333 // Houston, we have page
4334 data_len = n+m; // consumption amount is wherever that scan ended
4335 f->page_crc_tests = -1; // drop out of page scan mode
4336 f->previous_length = 0; // decode-but-don't-output one frame
4337 f->next_seg = -1; // start a new page
4338 f->current_loc = f->scan[i].sample_loc; // set the current sample location
4339 // to the amount we'd have decoded had we decoded this page
4340 f->current_loc_valid = f->current_loc != ~0U;
4341 return data_len;
4342 }
4343 // delete entry
4344 f->scan[i] = f->scan[--f->page_crc_tests];
4345 } else {
4346 ++i;
4347 }
4348 }
4349
4350 return data_len;
4351}
4352
4353// return value: number of bytes we used
4354STBVDEF int stb_vorbis_decode_frame_pushdata(
4355 stb_vorbis *f, // the file we're decoding
4356 const stbv_uint8 *data, int data_len, // the memory available for decoding
4357 int *channels, // place to write number of float * buffers
4358 float ***output, // place to write float ** array of float * buffers
4359 int *samples // place to write number of output samples
4360 )
4361{
4362 int i;
4363 int len,right,left;
4364
4365 if (!STBV_IS_PUSH_MODE(f)) return stbv_error(f, VORBIS_invalid_api_mixing);
4366
4367 if (f->page_crc_tests >= 0) {
4368 *samples = 0;
4369 return stbv_vorbis_search_for_page_pushdata(f, (stbv_uint8 *) data, data_len);
4370 }
4371
4372 f->stream = (stbv_uint8 *) data;
4373 f->stream_end = (stbv_uint8 *) data + data_len;
4374 f->error = VORBIS__no_error;
4375
4376 // check that we have the entire packet in memory
4377 if (!stbv_is_whole_packet_present(f, FALSE)) {
4378 *samples = 0;
4379 return 0;
4380 }
4381
4382 if (!stbv_vorbis_decode_packet(f, &len, &left, &right)) {
4383 // save the actual error we encountered
4384 enum STBVorbisError error = f->error;
4385 if (error == VORBIS_bad_packet_type) {
4386 // flush and resynch
4387 f->error = VORBIS__no_error;
4388 while (stbv_get8_packet(f) != STBV_EOP)
4389 if (f->eof) break;
4390 *samples = 0;
4391 return (int) (f->stream - data);
4392 }
4393 if (error == VORBIS_continued_packet_flag_invalid) {
4394 if (f->previous_length == 0) {
4395 // we may be resynching, in which case it's ok to hit one
4396 // of these; just discard the packet
4397 f->error = VORBIS__no_error;
4398 while (stbv_get8_packet(f) != STBV_EOP)
4399 if (f->eof) break;
4400 *samples = 0;
4401 return (int) (f->stream - data);
4402 }
4403 }
4404 // if we get an error while parsing, what to do?
4405 // well, it DEFINITELY won't work to continue from where we are!
4406 stb_vorbis_flush_pushdata(f);
4407 // restore the error that actually made us bail
4408 f->error = error;
4409 *samples = 0;
4410 return 1;
4411 }
4412
4413 // success!
4414 len = stbv_vorbis_finish_frame(f, len, left, right);
4415 for (i=0; i < f->channels; ++i)
4416 f->outputs[i] = f->channel_buffers[i] + left;
4417
4418 if (channels) *channels = f->channels;
4419 *samples = len;
4420 *output = f->outputs;
4421 return (int) (f->stream - data);
4422}
4423
4424STBVDEF stb_vorbis *stb_vorbis_open_pushdata(
4425 const unsigned char *data, int data_len, // the memory available for decoding
4426 int *data_used, // only defined if result is not NULL
4427 int *error, const stb_vorbis_alloc *alloc)
4428{
4429 stb_vorbis *f, p;
4430 stbv_vorbis_init(&p, alloc);
4431 p.stream = (stbv_uint8 *) data;
4432 p.stream_end = (stbv_uint8 *) data + data_len;
4433 p.push_mode = TRUE;
4434 if (!stbv_start_decoder(&p)) {
4435 if (p.eof)
4436 *error = VORBIS_need_more_data;
4437 else
4438 *error = p.error;
4439 return NULL;
4440 }
4441 f = stbv_vorbis_alloc(&p);
4442 if (f) {
4443 *f = p;
4444 *data_used = (int) (f->stream - data);
4445 *error = 0;
4446 return f;
4447 } else {
4448 stbv_vorbis_deinit(&p);
4449 return NULL;
4450 }
4451}
4452#endif // STB_VORBIS_NO_PUSHDATA_API
4453
4454STBVDEF unsigned int stb_vorbis_get_file_offset(stb_vorbis *f)
4455{
4456 #ifndef STB_VORBIS_NO_PUSHDATA_API
4457 if (f->push_mode) return 0;
4458 #endif
4459 if (STBV_USE_MEMORY(f)) return (unsigned int) (f->stream - f->stream_start);
4460 #ifndef STB_VORBIS_NO_STDIO
4461 return (unsigned int) (ftell(f->f) - f->f_start);
4462 #endif
4463}
4464
4465#ifndef STB_VORBIS_NO_PULLDATA_API
4466//
4467// DATA-PULLING API
4468//
4469
4470static stbv_uint32 stbv_vorbis_find_page(stb_vorbis *f, stbv_uint32 *end, stbv_uint32 *last)
4471{
4472 for(;;) {
4473 int n;
4474 if (f->eof) return 0;
4475 n = stbv_get8(f);
4476 if (n == 0x4f) { // page header candidate
4477 unsigned int retry_loc = stb_vorbis_get_file_offset(f);
4478 int i;
4479 // check if we're off the end of a file_section stream
4480 if (retry_loc - 25 > f->stream_len)
4481 return 0;
4482 // check the rest of the header
4483 for (i=1; i < 4; ++i)
4484 if (stbv_get8(f) != stbv_ogg_page_header[i])
4485 break;
4486 if (f->eof) return 0;
4487 if (i == 4) {
4488 stbv_uint8 header[27];
4489 stbv_uint32 i, crc, goal, len;
4490 for (i=0; i < 4; ++i)
4491 header[i] = stbv_ogg_page_header[i];
4492 for (; i < 27; ++i)
4493 header[i] = stbv_get8(f);
4494 if (f->eof) return 0;
4495 if (header[4] != 0) goto invalid;
4496 goal = header[22] + (header[23] << 8) + (header[24]<<16) + (header[25]<<24);
4497 for (i=22; i < 26; ++i)
4498 header[i] = 0;
4499 crc = 0;
4500 for (i=0; i < 27; ++i)
4501 crc = stbv_crc32_update(crc, header[i]);
4502 len = 0;
4503 for (i=0; i < header[26]; ++i) {
4504 int s = stbv_get8(f);
4505 crc = stbv_crc32_update(crc, s);
4506 len += s;
4507 }
4508 if (len && f->eof) return 0;
4509 for (i=0; i < len; ++i)
4510 crc = stbv_crc32_update(crc, stbv_get8(f));
4511 // finished parsing probable page
4512 if (crc == goal) {
4513 // we could now check that it's either got the last
4514 // page flag set, OR it's followed by the capture
4515 // pattern, but I guess TECHNICALLY you could have
4516 // a file with garbage between each ogg page and recover
4517 // from it automatically? So even though that paranoia
4518 // might decrease the chance of an invalid decode by
4519 // another 2^32, not worth it since it would hose those
4520 // invalid-but-useful files?
4521 if (end)
4522 *end = stb_vorbis_get_file_offset(f);
4523 if (last) {
4524 if (header[5] & 0x04)
4525 *last = 1;
4526 else
4527 *last = 0;
4528 }
4529 stbv_set_file_offset(f, retry_loc-1);
4530 return 1;
4531 }
4532 }
4533 invalid:
4534 // not a valid page, so rewind and look for next one
4535 stbv_set_file_offset(f, retry_loc);
4536 }
4537 }
4538}
4539
4540
4541#define STBV_SAMPLE_unknown 0xffffffff
4542
4543// seeking is implemented with a binary search, which narrows down the range to
4544// 64K, before using a linear search (because finding the synchronization
4545// pattern can be expensive, and the chance we'd find the end page again is
4546// relatively high for small ranges)
4547//
4548// two initial interpolation-style probes are used at the start of the search
4549// to try to bound either side of the binary search sensibly, while still
4550// working in O(log n) time if they fail.
4551
4552static int stbv_get_seek_page_info(stb_vorbis *f, StbvProbedPage *z)
4553{
4554 stbv_uint8 header[27], lacing[255];
4555 int i,len;
4556
4557 // record where the page starts
4558 z->page_start = stb_vorbis_get_file_offset(f);
4559
4560 // parse the header
4561 stbv_getn(f, header, 27);
4562 if (header[0] != 'O' || header[1] != 'g' || header[2] != 'g' || header[3] != 'S')
4563 return 0;
4564 stbv_getn(f, lacing, header[26]);
4565
4566 // determine the length of the payload
4567 len = 0;
4568 for (i=0; i < header[26]; ++i)
4569 len += lacing[i];
4570
4571 // this implies where the page ends
4572 z->page_end = z->page_start + 27 + header[26] + len;
4573
4574 // read the last-decoded sample out of the data
4575 z->last_decoded_sample = header[6] + (header[7] << 8) + (header[8] << 16) + (header[9] << 24);
4576
4577 // restore file state to where we were
4578 stbv_set_file_offset(f, z->page_start);
4579 return 1;
4580}
4581
4582// rarely used function to seek back to the preceeding page while finding the
4583// start of a packet
4584static int stbv_go_to_page_before(stb_vorbis *f, unsigned int limit_offset)
4585{
4586 unsigned int previous_safe, end;
4587
4588 // now we want to seek back 64K from the limit
4589 if (limit_offset >= 65536 && limit_offset-65536 >= f->first_audio_page_offset)
4590 previous_safe = limit_offset - 65536;
4591 else
4592 previous_safe = f->first_audio_page_offset;
4593
4594 stbv_set_file_offset(f, previous_safe);
4595
4596 while (stbv_vorbis_find_page(f, &end, NULL)) {
4597 if (end >= limit_offset && stb_vorbis_get_file_offset(f) < limit_offset)
4598 return 1;
4599 stbv_set_file_offset(f, end);
4600 }
4601
4602 return 0;
4603}
4604
4605// implements the search logic for finding a page and starting decoding. if
4606// the function succeeds, current_loc_valid will be true and current_loc will
4607// be less than or equal to the provided sample number (the closer the
4608// better).
4609static int stbv_seek_to_sample_coarse(stb_vorbis *f, stbv_uint32 sample_number)
4610{
4611 StbvProbedPage left, right, mid;
4612 int i, start_seg_with_known_loc, end_pos, page_start;
4613 stbv_uint32 delta, stream_length, padding;
4614 double offset, bytes_per_sample;
4615 int probe = 0;
4616
4617 // find the last page and validate the target sample
4618 stream_length = stb_vorbis_stream_length_in_samples(f);
4619 if (stream_length == 0) return stbv_error(f, VORBIS_seek_without_length);
4620 if (sample_number > stream_length) return stbv_error(f, VORBIS_seek_invalid);
4621
4622 // this is the maximum difference between the window-center (which is the
4623 // actual granule position value), and the right-start (which the spec
4624 // indicates should be the granule position (give or take one)).
4625 padding = ((f->blocksize_1 - f->blocksize_0) >> 2);
4626 if (sample_number < padding)
4627 sample_number = 0;
4628 else
4629 sample_number -= padding;
4630
4631 left = f->p_first;
4632 while (left.last_decoded_sample == ~0U) {
4633 // (untested) the first page does not have a 'last_decoded_sample'
4634 stbv_set_file_offset(f, left.page_end);
4635 if (!stbv_get_seek_page_info(f, &left)) goto error;
4636 }
4637
4638 right = f->p_last;
4639 assert(right.last_decoded_sample != ~0U);
4640
4641 // starting from the start is handled differently
4642 if (sample_number <= left.last_decoded_sample) {
4643 if (stb_vorbis_seek_start(f))
4644 return 1;
4645 return 0;
4646 }
4647
4648 while (left.page_end != right.page_start) {
4649 assert(left.page_end < right.page_start);
4650 // search range in bytes
4651 delta = right.page_start - left.page_end;
4652 if (delta <= 65536) {
4653 // there's only 64K left to search - handle it linearly
4654 stbv_set_file_offset(f, left.page_end);
4655 } else {
4656 if (probe < 2) {
4657 if (probe == 0) {
4658 // first probe (interpolate)
4659 double data_bytes = right.page_end - left.page_start;
4660 bytes_per_sample = data_bytes / right.last_decoded_sample;
4661 offset = left.page_start + bytes_per_sample * (sample_number - left.last_decoded_sample);
4662 } else {
4663 // second probe (try to bound the other side)
4664 double error = ((double) sample_number - mid.last_decoded_sample) * bytes_per_sample;
4665 if (error >= 0 && error < 8000) error = 8000;
4666 if (error < 0 && error > -8000) error = -8000;
4667 offset += error * 2;
4668 }
4669
4670 // ensure the offset is valid
4671 if (offset < left.page_end)
4672 offset = left.page_end;
4673 if (offset > right.page_start - 65536)
4674 offset = right.page_start - 65536;
4675
4676 stbv_set_file_offset(f, (unsigned int) offset);
4677 } else {
4678 // binary search for large ranges (offset by 32K to ensure
4679 // we don't hit the right page)
4680 stbv_set_file_offset(f, left.page_end + (delta / 2) - 32768);
4681 }
4682
4683 if (!stbv_vorbis_find_page(f, NULL, NULL)) goto error;
4684 }
4685
4686 for (;;) {
4687 if (!stbv_get_seek_page_info(f, &mid)) goto error;
4688 if (mid.last_decoded_sample != ~0U) break;
4689 // (untested) no frames end on this page
4690 stbv_set_file_offset(f, mid.page_end);
4691 assert(mid.page_start < right.page_start);
4692 }
4693
4694 // if we've just found the last page again then we're in a tricky file,
4695 // and we're close enough.
4696 if (mid.page_start == right.page_start)
4697 break;
4698
4699 if (sample_number < mid.last_decoded_sample)
4700 right = mid;
4701 else
4702 left = mid;
4703
4704 ++probe;
4705 }
4706
4707 // seek back to start of the last packet
4708 page_start = left.page_start;
4709 stbv_set_file_offset(f, page_start);
4710 if (!stbv_start_page(f)) return stbv_error(f, VORBIS_seek_failed);
4711 end_pos = f->end_seg_with_known_loc;
4712 assert(end_pos >= 0);
4713
4714 for (;;) {
4715 for (i = end_pos; i > 0; --i)
4716 if (f->segments[i-1] != 255)
4717 break;
4718
4719 start_seg_with_known_loc = i;
4720
4721 if (start_seg_with_known_loc > 0 || !(f->page_flag & STBV_PAGEFLAG_continued_packet))
4722 break;
4723
4724 // (untested) the final packet begins on an earlier page
4725 if (!stbv_go_to_page_before(f, page_start))
4726 goto error;
4727
4728 page_start = stb_vorbis_get_file_offset(f);
4729 if (!stbv_start_page(f)) goto error;
4730 end_pos = f->segment_count - 1;
4731 }
4732
4733 // prepare to start decoding
4734 f->current_loc_valid = FALSE;
4735 f->last_seg = FALSE;
4736 f->valid_bits = 0;
4737 f->packet_bytes = 0;
4738 f->bytes_in_seg = 0;
4739 f->previous_length = 0;
4740 f->next_seg = start_seg_with_known_loc;
4741
4742 for (i = 0; i < start_seg_with_known_loc; i++)
4743 stbv_skip(f, f->segments[i]);
4744
4745 // start decoding (optimizable - this frame is generally discarded)
4746 if (!stbv_vorbis_pump_first_frame(f))
4747 return 0;
4748 if (f->current_loc > sample_number)
4749 return stbv_error(f, VORBIS_seek_failed);
4750 return 1;
4751
4752error:
4753 // try to restore the file to a valid state
4754 stb_vorbis_seek_start(f);
4755 return stbv_error(f, VORBIS_seek_failed);
4756}
4757
4758// the same as stbv_vorbis_decode_initial, but without advancing
4759static int stbv_peek_decode_initial(stbv_vorb *f, int *p_left_start, int *p_left_end, int *p_right_start, int *p_right_end, int *mode)
4760{
4761 int bits_read, bytes_read;
4762
4763 if (!stbv_vorbis_decode_initial(f, p_left_start, p_left_end, p_right_start, p_right_end, mode))
4764 return 0;
4765
4766 // either 1 or 2 bytes were read, figure out which so we can rewind
4767 bits_read = 1 + stbv_ilog(f->mode_count-1);
4768 if (f->mode_config[*mode].blockflag)
4769 bits_read += 2;
4770 bytes_read = (bits_read + 7) / 8;
4771
4772 f->bytes_in_seg += bytes_read;
4773 f->packet_bytes -= bytes_read;
4774 stbv_skip(f, -bytes_read);
4775 if (f->next_seg == -1)
4776 f->next_seg = f->segment_count - 1;
4777 else
4778 f->next_seg--;
4779 f->valid_bits = 0;
4780
4781 return 1;
4782}
4783
4784STBVDEF int stb_vorbis_seek_frame(stb_vorbis *f, unsigned int sample_number)
4785{
4786 stbv_uint32 max_frame_samples;
4787
4788 if (STBV_IS_PUSH_MODE(f)) return stbv_error(f, VORBIS_invalid_api_mixing);
4789
4790 // fast page-level search
4791 if (!stbv_seek_to_sample_coarse(f, sample_number))
4792 return 0;
4793
4794 assert(f->current_loc_valid);
4795 assert(f->current_loc <= sample_number);
4796
4797 // linear search for the relevant packet
4798 max_frame_samples = (f->blocksize_1*3 - f->blocksize_0) >> 2;
4799 while (f->current_loc < sample_number) {
4800 int left_start, left_end, right_start, right_end, mode, frame_samples;
4801 if (!stbv_peek_decode_initial(f, &left_start, &left_end, &right_start, &right_end, &mode))
4802 return stbv_error(f, VORBIS_seek_failed);
4803 // calculate the number of samples returned by the next frame
4804 frame_samples = right_start - left_start;
4805 if (f->current_loc + frame_samples > sample_number) {
4806 return 1; // the next frame will contain the sample
4807 } else if (f->current_loc + frame_samples + max_frame_samples > sample_number) {
4808 // there's a chance the frame after this could contain the sample
4809 stbv_vorbis_pump_first_frame(f);
4810 } else {
4811 // this frame is too early to be relevant
4812 f->current_loc += frame_samples;
4813 f->previous_length = 0;
4814 stbv_maybe_start_packet(f);
4815 stbv_flush_packet(f);
4816 }
4817 }
4818 // the next frame will start with the sample
4819 assert(f->current_loc == sample_number);
4820 return 1;
4821}
4822
4823STBVDEF int stb_vorbis_seek(stb_vorbis *f, unsigned int sample_number)
4824{
4825 if (!stb_vorbis_seek_frame(f, sample_number))
4826 return 0;
4827
4828 if (sample_number != f->current_loc) {
4829 int n;
4830 stbv_uint32 frame_start = f->current_loc;
4831 stb_vorbis_get_frame_float(f, &n, NULL);
4832 assert(sample_number > frame_start);
4833 assert(f->channel_buffer_start + (int) (sample_number-frame_start) <= f->channel_buffer_end);
4834 f->channel_buffer_start += (sample_number - frame_start);
4835 }
4836
4837 return 1;
4838}
4839
4840STBVDEF int stb_vorbis_seek_start(stb_vorbis *f)
4841{
4842 if (STBV_IS_PUSH_MODE(f)) { return stbv_error(f, VORBIS_invalid_api_mixing); }
4843 stbv_set_file_offset(f, f->first_audio_page_offset);
4844 f->previous_length = 0;
4845 f->first_decode = TRUE;
4846 f->next_seg = -1;
4847 return stbv_vorbis_pump_first_frame(f);
4848}
4849
4850STBVDEF unsigned int stb_vorbis_stream_length_in_samples(stb_vorbis *f)
4851{
4852 unsigned int restore_offset, previous_safe;
4853 unsigned int end, last_page_loc;
4854
4855 if (STBV_IS_PUSH_MODE(f)) return stbv_error(f, VORBIS_invalid_api_mixing);
4856 if (!f->total_samples) {
4857 unsigned int last;
4858 stbv_uint32 lo,hi;
4859 char header[6];
4860
4861 // first, store the current decode position so we can restore it
4862 restore_offset = stb_vorbis_get_file_offset(f);
4863
4864 // now we want to seek back 64K from the end (the last page must
4865 // be at most a little less than 64K, but let's allow a little slop)
4866 if (f->stream_len >= 65536 && f->stream_len-65536 >= f->first_audio_page_offset)
4867 previous_safe = f->stream_len - 65536;
4868 else
4869 previous_safe = f->first_audio_page_offset;
4870
4871 stbv_set_file_offset(f, previous_safe);
4872 // previous_safe is now our candidate 'earliest known place that seeking
4873 // to will lead to the final page'
4874
4875 if (!stbv_vorbis_find_page(f, &end, &last)) {
4876 // if we can't find a page, we're hosed!
4877 f->error = VORBIS_cant_find_last_page;
4878 f->total_samples = 0xffffffff;
4879 goto done;
4880 }
4881
4882 // check if there are more pages
4883 last_page_loc = stb_vorbis_get_file_offset(f);
4884
4885 // stop when the last_page flag is set, not when we reach eof;
4886 // this allows us to stop short of a 'file_section' end without
4887 // explicitly checking the length of the section
4888 while (!last) {
4889 stbv_set_file_offset(f, end);
4890 if (!stbv_vorbis_find_page(f, &end, &last)) {
4891 // the last page we found didn't have the 'last page' flag
4892 // set. whoops!
4893 break;
4894 }
4895 previous_safe = last_page_loc+1;
4896 last_page_loc = stb_vorbis_get_file_offset(f);
4897 }
4898
4899 stbv_set_file_offset(f, last_page_loc);
4900
4901 // parse the header
4902 stbv_getn(f, (unsigned char *)header, 6);
4903 // extract the absolute granule position
4904 lo = stbv_get32(f);
4905 hi = stbv_get32(f);
4906 if (lo == 0xffffffff && hi == 0xffffffff) {
4907 f->error = VORBIS_cant_find_last_page;
4908 f->total_samples = STBV_SAMPLE_unknown;
4909 goto done;
4910 }
4911 if (hi)
4912 lo = 0xfffffffe; // saturate
4913 f->total_samples = lo;
4914
4915 f->p_last.page_start = last_page_loc;
4916 f->p_last.page_end = end;
4917 f->p_last.last_decoded_sample = lo;
4918
4919 done:
4920 stbv_set_file_offset(f, restore_offset);
4921 }
4922 return f->total_samples == STBV_SAMPLE_unknown ? 0 : f->total_samples;
4923}
4924
4925STBVDEF float stb_vorbis_stream_length_in_seconds(stb_vorbis *f)
4926{
4927 return stb_vorbis_stream_length_in_samples(f) / (float) f->sample_rate;
4928}
4929
4930
4931
4932STBVDEF int stb_vorbis_get_frame_float(stb_vorbis *f, int *channels, float ***output)
4933{
4934 int len, right,left,i;
4935 if (STBV_IS_PUSH_MODE(f)) return stbv_error(f, VORBIS_invalid_api_mixing);
4936
4937 if (!stbv_vorbis_decode_packet(f, &len, &left, &right)) {
4938 f->channel_buffer_start = f->channel_buffer_end = 0;
4939 return 0;
4940 }
4941
4942 len = stbv_vorbis_finish_frame(f, len, left, right);
4943 for (i=0; i < f->channels; ++i)
4944 f->outputs[i] = f->channel_buffers[i] + left;
4945
4946 f->channel_buffer_start = left;
4947 f->channel_buffer_end = left+len;
4948
4949 if (channels) *channels = f->channels;
4950 if (output) *output = f->outputs;
4951 return len;
4952}
4953
4954#ifndef STB_VORBIS_NO_STDIO
4955
4956STBVDEF stb_vorbis * stb_vorbis_open_file_section(FILE *file, int close_on_free, int *error, const stb_vorbis_alloc *alloc, unsigned int length)
4957{
4958 stb_vorbis *f, p;
4959 stbv_vorbis_init(&p, alloc);
4960 p.f = file;
4961 p.f_start = (stbv_uint32) ftell(file);
4962 p.stream_len = length;
4963 p.close_on_free = close_on_free;
4964 if (stbv_start_decoder(&p)) {
4965 f = stbv_vorbis_alloc(&p);
4966 if (f) {
4967 *f = p;
4968 stbv_vorbis_pump_first_frame(f);
4969 return f;
4970 }
4971 }
4972 if (error) *error = p.error;
4973 stbv_vorbis_deinit(&p);
4974 return NULL;
4975}
4976
4977STBVDEF stb_vorbis * stb_vorbis_open_file(FILE *file, int close_on_free, int *error, const stb_vorbis_alloc *alloc)
4978{
4979 unsigned int len, start;
4980 start = (unsigned int) ftell(file);
4981 fseek(file, 0, SEEK_END);
4982 len = (unsigned int) (ftell(file) - start);
4983 fseek(file, start, SEEK_SET);
4984 return stb_vorbis_open_file_section(file, close_on_free, error, alloc, len);
4985}
4986
4987STBVDEF stb_vorbis * stb_vorbis_open_filename(const char *filename, int *error, const stb_vorbis_alloc *alloc)
4988{
4989 FILE *f = fopen(filename, "rb");
4990 if (f)
4991 return stb_vorbis_open_file(f, TRUE, error, alloc);
4992 if (error) *error = VORBIS_file_open_failure;
4993 return NULL;
4994}
4995#endif // STB_VORBIS_NO_STDIO
4996
4997STBVDEF stb_vorbis * stb_vorbis_open_memory(const unsigned char *data, int len, int *error, const stb_vorbis_alloc *alloc)
4998{
4999 stb_vorbis *f, p;
5000 if (data == NULL) return NULL;
5001 stbv_vorbis_init(&p, alloc);
5002 p.stream = (stbv_uint8 *) data;
5003 p.stream_end = (stbv_uint8 *) data + len;
5004 p.stream_start = (stbv_uint8 *) p.stream;
5005 p.stream_len = len;
5006 p.push_mode = FALSE;
5007 if (stbv_start_decoder(&p)) {
5008 f = stbv_vorbis_alloc(&p);
5009 if (f) {
5010 *f = p;
5011 stbv_vorbis_pump_first_frame(f);
5012 if (error) *error = VORBIS__no_error;
5013 return f;
5014 }
5015 }
5016 if (error) *error = p.error;
5017 stbv_vorbis_deinit(&p);
5018 return NULL;
5019}
5020
5021#ifndef STB_VORBIS_NO_INTEGER_CONVERSION
5022#define STBV_PLAYBACK_MONO 1
5023#define STBV_PLAYBACK_LEFT 2
5024#define STBV_PLAYBACK_RIGHT 4
5025
5026#define STBV_L (STBV_PLAYBACK_LEFT | STBV_PLAYBACK_MONO)
5027#define STBV_C (STBV_PLAYBACK_LEFT | STBV_PLAYBACK_RIGHT | STBV_PLAYBACK_MONO)
5028#define STBV_R (STBV_PLAYBACK_RIGHT | STBV_PLAYBACK_MONO)
5029
5030static stbv_int8 stbv_channel_position[7][6] =
5031{
5032 { 0 },
5033 { STBV_C },
5034 { STBV_L, STBV_R },
5035 { STBV_L, STBV_C, STBV_R },
5036 { STBV_L, STBV_R, STBV_L, STBV_R },
5037 { STBV_L, STBV_C, STBV_R, STBV_L, STBV_R },
5038 { STBV_L, STBV_C, STBV_R, STBV_L, STBV_R, STBV_C },
5039};
5040
5041
5042#ifndef STB_VORBIS_NO_FAST_SCALED_FLOAT
5043 typedef union {
5044 float f;
5045 int i;
5046 } stbv_float_conv;
5047 typedef char stb_vorbis_float_size_test[sizeof(float)==4 && sizeof(int) == 4];
5048 #define STBV_FASTDEF(x) stbv_float_conv x
5049 // add (1<<23) to convert to int, then divide by 2^SHIFT, then add 0.5/2^SHIFT to round
5050 #define STBV_MAGIC(SHIFT) (1.5f * (1 << (23-SHIFT)) + 0.5f/(1 << SHIFT))
5051 #define STBV_ADDEND(SHIFT) (((150-SHIFT) << 23) + (1 << 22))
5052 #define STBV_FAST_SCALED_FLOAT_TO_INT(temp,x,s) (temp.f = (x) + STBV_MAGIC(s), temp.i - STBV_ADDEND(s))
5053 #define stbv_check_endianness()
5054#else
5055 #define STBV_FAST_SCALED_FLOAT_TO_INT(temp,x,s) ((int) ((x) * (1 << (s))))
5056 #define stbv_check_endianness()
5057 #define STBV_FASTDEF(x)
5058#endif
5059
5060static void stbv_copy_samples(short *dest, float *src, int len)
5061{
5062 int i;
5063 stbv_check_endianness();
5064 for (i=0; i < len; ++i) {
5065 STBV_FASTDEF(temp);
5066 int v = STBV_FAST_SCALED_FLOAT_TO_INT(temp, src[i],15);
5067 if ((unsigned int) (v + 32768) > 65535)
5068 v = v < 0 ? -32768 : 32767;
5069 dest[i] = v;
5070 }
5071}
5072
5073static void stbv_compute_samples(int mask, short *output, int num_c, float **data, int d_offset, int len)
5074{
5075 #define BUFFER_SIZE 32
5076 float buffer[BUFFER_SIZE];
5077 int i,j,o,n = BUFFER_SIZE;
5078 stbv_check_endianness();
5079 for (o = 0; o < len; o += BUFFER_SIZE) {
5080 memset(buffer, 0, sizeof(buffer));
5081 if (o + n > len) n = len - o;
5082 for (j=0; j < num_c; ++j) {
5083 if (stbv_channel_position[num_c][j] & mask) {
5084 for (i=0; i < n; ++i)
5085 buffer[i] += data[j][d_offset+o+i];
5086 }
5087 }
5088 for (i=0; i < n; ++i) {
5089 STBV_FASTDEF(temp);
5090 int v = STBV_FAST_SCALED_FLOAT_TO_INT(temp,buffer[i],15);
5091 if ((unsigned int) (v + 32768) > 65535)
5092 v = v < 0 ? -32768 : 32767;
5093 output[o+i] = v;
5094 }
5095 }
5096}
5097
5098static void stbv_compute_stereo_samples(short *output, int num_c, float **data, int d_offset, int len)
5099{
5100 #define BUFFER_SIZE 32
5101 float buffer[BUFFER_SIZE];
5102 int i,j,o,n = BUFFER_SIZE >> 1;
5103 // o is the offset in the source data
5104 stbv_check_endianness();
5105 for (o = 0; o < len; o += BUFFER_SIZE >> 1) {
5106 // o2 is the offset in the output data
5107 int o2 = o << 1;
5108 memset(buffer, 0, sizeof(buffer));
5109 if (o + n > len) n = len - o;
5110 for (j=0; j < num_c; ++j) {
5111 int m = stbv_channel_position[num_c][j] & (STBV_PLAYBACK_LEFT | STBV_PLAYBACK_RIGHT);
5112 if (m == (STBV_PLAYBACK_LEFT | STBV_PLAYBACK_RIGHT)) {
5113 for (i=0; i < n; ++i) {
5114 buffer[i*2+0] += data[j][d_offset+o+i];
5115 buffer[i*2+1] += data[j][d_offset+o+i];
5116 }
5117 } else if (m == STBV_PLAYBACK_LEFT) {
5118 for (i=0; i < n; ++i) {
5119 buffer[i*2+0] += data[j][d_offset+o+i];
5120 }
5121 } else if (m == STBV_PLAYBACK_RIGHT) {
5122 for (i=0; i < n; ++i) {
5123 buffer[i*2+1] += data[j][d_offset+o+i];
5124 }
5125 }
5126 }
5127 for (i=0; i < (n<<1); ++i) {
5128 STBV_FASTDEF(temp);
5129 int v = STBV_FAST_SCALED_FLOAT_TO_INT(temp,buffer[i],15);
5130 if ((unsigned int) (v + 32768) > 65535)
5131 v = v < 0 ? -32768 : 32767;
5132 output[o2+i] = v;
5133 }
5134 }
5135}
5136
5137static void stbv_convert_samples_short(int buf_c, short **buffer, int b_offset, int data_c, float **data, int d_offset, int samples)
5138{
5139 int i;
5140 if (buf_c != data_c && buf_c <= 2 && data_c <= 6) {
5141 static int channel_selector[3][2] = { {0}, {STBV_PLAYBACK_MONO}, {STBV_PLAYBACK_LEFT, STBV_PLAYBACK_RIGHT} };
5142 for (i=0; i < buf_c; ++i)
5143 stbv_compute_samples(channel_selector[buf_c][i], buffer[i]+b_offset, data_c, data, d_offset, samples);
5144 } else {
5145 int limit = buf_c < data_c ? buf_c : data_c;
5146 for (i=0; i < limit; ++i)
5147 stbv_copy_samples(buffer[i]+b_offset, data[i]+d_offset, samples);
5148 for ( ; i < buf_c; ++i)
5149 memset(buffer[i]+b_offset, 0, sizeof(short) * samples);
5150 }
5151}
5152
5153STBVDEF int stb_vorbis_get_frame_short(stb_vorbis *f, int num_c, short **buffer, int num_samples)
5154{
5155 float **output;
5156 int len = stb_vorbis_get_frame_float(f, NULL, &output);
5157 if (len > num_samples) len = num_samples;
5158 if (len)
5159 stbv_convert_samples_short(num_c, buffer, 0, f->channels, output, 0, len);
5160 return len;
5161}
5162
5163static void stbv_convert_channels_short_interleaved(int buf_c, short *buffer, int data_c, float **data, int d_offset, int len)
5164{
5165 int i;
5166 stbv_check_endianness();
5167 if (buf_c != data_c && buf_c <= 2 && data_c <= 6) {
5168 assert(buf_c == 2);
5169 for (i=0; i < buf_c; ++i)
5170 stbv_compute_stereo_samples(buffer, data_c, data, d_offset, len);
5171 } else {
5172 int limit = buf_c < data_c ? buf_c : data_c;
5173 int j;
5174 for (j=0; j < len; ++j) {
5175 for (i=0; i < limit; ++i) {
5176 STBV_FASTDEF(temp);
5177 float f = data[i][d_offset+j];
5178 int v = STBV_FAST_SCALED_FLOAT_TO_INT(temp, f,15);//data[i][d_offset+j],15);
5179 if ((unsigned int) (v + 32768) > 65535)
5180 v = v < 0 ? -32768 : 32767;
5181 *buffer++ = v;
5182 }
5183 for ( ; i < buf_c; ++i)
5184 *buffer++ = 0;
5185 }
5186 }
5187}
5188
5189STBVDEF int stb_vorbis_get_frame_short_interleaved(stb_vorbis *f, int num_c, short *buffer, int num_shorts)
5190{
5191 float **output;
5192 int len;
5193 if (num_c == 1) return stb_vorbis_get_frame_short(f,num_c,&buffer, num_shorts);
5194 len = stb_vorbis_get_frame_float(f, NULL, &output);
5195 if (len) {
5196 if (len*num_c > num_shorts) len = num_shorts / num_c;
5197 stbv_convert_channels_short_interleaved(num_c, buffer, f->channels, output, 0, len);
5198 }
5199 return len;
5200}
5201
5202STBVDEF int stb_vorbis_get_samples_short_interleaved(stb_vorbis *f, int channels, short *buffer, int num_shorts)
5203{
5204 float **outputs;
5205 int len = num_shorts / channels;
5206 int n=0;
5207 int z = f->channels;
5208 if (z > channels) z = channels;
5209 while (n < len) {
5210 int k = f->channel_buffer_end - f->channel_buffer_start;
5211 if (n+k >= len) k = len - n;
5212 if (k)
5213 stbv_convert_channels_short_interleaved(channels, buffer, f->channels, f->channel_buffers, f->channel_buffer_start, k);
5214 buffer += k*channels;
5215 n += k;
5216 f->channel_buffer_start += k;
5217 if (n == len) break;
5218 if (!stb_vorbis_get_frame_float(f, NULL, &outputs)) break;
5219 }
5220 return n;
5221}
5222
5223STBVDEF int stb_vorbis_get_samples_short(stb_vorbis *f, int channels, short **buffer, int len)
5224{
5225 float **outputs;
5226 int n=0;
5227 int z = f->channels;
5228 if (z > channels) z = channels;
5229 while (n < len) {
5230 int k = f->channel_buffer_end - f->channel_buffer_start;
5231 if (n+k >= len) k = len - n;
5232 if (k)
5233 stbv_convert_samples_short(channels, buffer, n, f->channels, f->channel_buffers, f->channel_buffer_start, k);
5234 n += k;
5235 f->channel_buffer_start += k;
5236 if (n == len) break;
5237 if (!stb_vorbis_get_frame_float(f, NULL, &outputs)) break;
5238 }
5239 return n;
5240}
5241
5242#ifndef STB_VORBIS_NO_STDIO
5243STBVDEF int stb_vorbis_decode_filename(const char *filename, int *channels, int *sample_rate, short **output)
5244{
5245 int data_len, offset, total, limit, error;
5246 short *data;
5247 stb_vorbis *v = stb_vorbis_open_filename(filename, &error, NULL);
5248 if (v == NULL) return -1;
5249 limit = v->channels * 4096;
5250 *channels = v->channels;
5251 if (sample_rate)
5252 *sample_rate = v->sample_rate;
5253 offset = data_len = 0;
5254 total = limit;
5255 data = (short *) malloc(total * sizeof(*data));
5256 if (data == NULL) {
5257 stb_vorbis_close(v);
5258 return -2;
5259 }
5260 for (;;) {
5261 int n = stb_vorbis_get_frame_short_interleaved(v, v->channels, data+offset, total-offset);
5262 if (n == 0) break;
5263 data_len += n;
5264 offset += n * v->channels;
5265 if (offset + limit > total) {
5266 short *data2;
5267 total *= 2;
5268 data2 = (short *) realloc(data, total * sizeof(*data));
5269 if (data2 == NULL) {
5270 free(data);
5271 stb_vorbis_close(v);
5272 return -2;
5273 }
5274 data = data2;
5275 }
5276 }
5277 *output = data;
5278 stb_vorbis_close(v);
5279 return data_len;
5280}
5281#endif // NO_STDIO
5282
5283STBVDEF int stb_vorbis_decode_memory(const stbv_uint8 *mem, int len, int *channels, int *sample_rate, short **output)
5284{
5285 int data_len, offset, total, limit, error;
5286 short *data;
5287 stb_vorbis *v = stb_vorbis_open_memory(mem, len, &error, NULL);
5288 if (v == NULL) return -1;
5289 limit = v->channels * 4096;
5290 *channels = v->channels;
5291 if (sample_rate)
5292 *sample_rate = v->sample_rate;
5293 offset = data_len = 0;
5294 total = limit;
5295 data = (short *) malloc(total * sizeof(*data));
5296 if (data == NULL) {
5297 stb_vorbis_close(v);
5298 return -2;
5299 }
5300 for (;;) {
5301 int n = stb_vorbis_get_frame_short_interleaved(v, v->channels, data+offset, total-offset);
5302 if (n == 0) break;
5303 data_len += n;
5304 offset += n * v->channels;
5305 if (offset + limit > total) {
5306 short *data2;
5307 total *= 2;
5308 data2 = (short *) realloc(data, total * sizeof(*data));
5309 if (data2 == NULL) {
5310 free(data);
5311 stb_vorbis_close(v);
5312 return -2;
5313 }
5314 data = data2;
5315 }
5316 }
5317 *output = data;
5318 stb_vorbis_close(v);
5319 return data_len;
5320}
5321#endif // STB_VORBIS_NO_INTEGER_CONVERSION
5322
5323STBVDEF int stb_vorbis_get_samples_float_interleaved(stb_vorbis *f, int channels, float *buffer, int num_floats)
5324{
5325 float **outputs;
5326 int len = num_floats / channels;
5327 int n=0;
5328 int z = f->channels;
5329 if (z > channels) z = channels;
5330 while (n < len) {
5331 int i,j;
5332 int k = f->channel_buffer_end - f->channel_buffer_start;
5333 if (n+k >= len) k = len - n;
5334 for (j=0; j < k; ++j) {
5335 for (i=0; i < z; ++i)
5336 *buffer++ = f->channel_buffers[i][f->channel_buffer_start+j];
5337 for ( ; i < channels; ++i)
5338 *buffer++ = 0;
5339 }
5340 n += k;
5341 f->channel_buffer_start += k;
5342 if (n == len)
5343 break;
5344 if (!stb_vorbis_get_frame_float(f, NULL, &outputs))
5345 break;
5346 }
5347 return n;
5348}
5349
5350STBVDEF int stb_vorbis_get_samples_float(stb_vorbis *f, int channels, float **buffer, int num_samples)
5351{
5352 float **outputs;
5353 int n=0;
5354 int z = f->channels;
5355 if (z > channels) z = channels;
5356 while (n < num_samples) {
5357 int i;
5358 int k = f->channel_buffer_end - f->channel_buffer_start;
5359 if (n+k >= num_samples) k = num_samples - n;
5360 if (k) {
5361 for (i=0; i < z; ++i)
5362 memcpy(buffer[i]+n, f->channel_buffers[i]+f->channel_buffer_start, sizeof(float)*k);
5363 for ( ; i < channels; ++i)
5364 memset(buffer[i]+n, 0, sizeof(float) * k);
5365 }
5366 n += k;
5367 f->channel_buffer_start += k;
5368 if (n == num_samples)
5369 break;
5370 if (!stb_vorbis_get_frame_float(f, NULL, &outputs))
5371 break;
5372 }
5373 return n;
5374}
5375#endif // STB_VORBIS_NO_PULLDATA_API
5376
5377/* Version history
5378 1.12 - 2017-11-21 - limit residue begin/end to blocksize/2 to avoid large temp allocs in bad/corrupt files
5379 1.11 - 2017-07-23 - fix MinGW compilation
5380 1.10 - 2017-03-03 - more robust seeking; fix negative stbv_ilog(); clear error in open_memory
5381 1.09 - 2016-04-04 - back out 'avoid discarding last frame' fix from previous version
5382 1.08 - 2016-04-02 - fixed multiple warnings; fix setup memory leaks;
5383 avoid discarding last frame of audio data
5384 1.07 - 2015-01-16 - fixed some warnings, fix mingw, const-correct API
5385 some more crash fixes when out of memory or with corrupt files
5386 1.06 - 2015-08-31 - full, correct support for seeking API (Dougall Johnson)
5387 some crash fixes when out of memory or with corrupt files
5388 1.05 - 2015-04-19 - don't define __forceinline if it's redundant
5389 1.04 - 2014-08-27 - fix missing const-correct case in API
5390 1.03 - 2014-08-07 - Warning fixes
5391 1.02 - 2014-07-09 - Declare qsort compare function _cdecl on windows
5392 1.01 - 2014-06-18 - fix stb_vorbis_get_samples_float
5393 1.0 - 2014-05-26 - fix memory leaks; fix warnings; fix bugs in multichannel
5394 (API change) report sample rate for decode-full-file funcs
5395 0.99996 - bracket #include <malloc.h> for macintosh compilation by Laurent Gomila
5396 0.99995 - use union instead of pointer-cast for fast-float-to-int to avoid alias-optimization problem
5397 0.99994 - change fast-float-to-int to work in single-precision FPU mode, remove endian-dependence
5398 0.99993 - remove assert that fired on legal files with empty tables
5399 0.99992 - rewind-to-start
5400 0.99991 - bugfix to stb_vorbis_get_samples_short by Bernhard Wodo
5401 0.9999 - (should have been 0.99990) fix no-CRT support, compiling as C++
5402 0.9998 - add a full-decode function with a memory source
5403 0.9997 - fix a bug in the read-from-FILE case in 0.9996 addition
5404 0.9996 - query length of vorbis stream in samples/seconds
5405 0.9995 - bugfix to another optimization that only happened in certain files
5406 0.9994 - bugfix to one of the optimizations that caused significant (but inaudible?) errors
5407 0.9993 - performance improvements; runs in 99% to 104% of time of reference implementation
5408 0.9992 - performance improvement of IMDCT; now performs close to reference implementation
5409 0.9991 - performance improvement of IMDCT
5410 0.999 - (should have been 0.9990) performance improvement of IMDCT
5411 0.998 - no-CRT support from Casey Muratori
5412 0.997 - bugfixes for bugs found by Terje Mathisen
5413 0.996 - bugfix: fast-huffman decode initialized incorrectly for sparse codebooks; fixing gives 10% speedup - found by Terje Mathisen
5414 0.995 - bugfix: fix to 'effective' overrun detection - found by Terje Mathisen
5415 0.994 - bugfix: garbage decode on final VQ symbol of a non-multiple - found by Terje Mathisen
5416 0.993 - bugfix: pushdata API required 1 extra byte for empty page (failed to consume final page if empty) - found by Terje Mathisen
5417 0.992 - fixes for MinGW warning
5418 0.991 - turn fast-float-conversion on by default
5419 0.990 - fix push-mode seek recovery if you seek into the headers
5420 0.98b - fix to bad release of 0.98
5421 0.98 - fix push-mode seek recovery; robustify float-to-int and support non-fast mode
5422 0.97 - builds under c++ (typecasting, don't use 'class' keyword)
5423 0.96 - somehow MY 0.95 was right, but the web one was wrong, so here's my 0.95 rereleased as 0.96, fixes a typo in the clamping code
5424 0.95 - clamping code for 16-bit functions
5425 0.94 - not publically released
5426 0.93 - fixed all-zero-floor case (was decoding garbage)
5427 0.92 - fixed a memory leak
5428 0.91 - conditional compiles to omit parts of the API and the infrastructure to support them: STB_VORBIS_NO_PULLDATA_API, STB_VORBIS_NO_PUSHDATA_API, STB_VORBIS_NO_STDIO, STB_VORBIS_NO_INTEGER_CONVERSION
5429 0.90 - first public release
5430*/
5431
5432#endif // STB_VORBIS_IMPLEMENTATION
5433
5434
5435/*
5436------------------------------------------------------------------------------
5437This software is available under 2 licenses -- choose whichever you prefer.
5438------------------------------------------------------------------------------
5439ALTERNATIVE A - MIT License
5440Copyright (c) 2017 Sean Barrett
5441Permission is hereby granted, free of charge, to any person obtaining a copy of
5442this software and associated documentation files (the "Software"), to deal in
5443the Software without restriction, including without limitation the rights to
5444use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
5445of the Software, and to permit persons to whom the Software is furnished to do
5446so, subject to the following conditions:
5447The above copyright notice and this permission notice shall be included in all
5448copies or substantial portions of the Software.
5449THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
5450IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
5451FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
5452AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
5453LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
5454OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
5455SOFTWARE.
5456------------------------------------------------------------------------------
5457ALTERNATIVE B - Public Domain (www.unlicense.org)
5458This is free and unencumbered software released into the public domain.
5459Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
5460software, either in source code form or as a compiled binary, for any purpose,
5461commercial or non-commercial, and by any means.
5462In jurisdictions that recognize copyright laws, the author or authors of this
5463software dedicate any and all copyright interest in the software to the public
5464domain. We make this dedication for the benefit of the public at large and to
5465the detriment of our heirs and successors. We intend this dedication to be an
5466overt act of relinquishment in perpetuity of all present and future rights to
5467this software under copyright law.
5468THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
5469IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
5470FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
5471AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
5472ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
5473WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
5474------------------------------------------------------------------------------
5475*/
5476