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
80 extern "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 
118 typedef 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 
127 typedef struct stb_vorbis stb_vorbis;
128 
129 typedef 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
142 STBVDEF stb_vorbis_info stb_vorbis_get_info(stb_vorbis *f);
143 
144 // get the last error detected (clears it, too)
145 STBVDEF int stb_vorbis_get_error(stb_vorbis *f);
146 
147 // close an ogg vorbis file and free all memory in use
148 STBVDEF 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
155 STBVDEF 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.
159 STBVDEF 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 
172 STBVDEF 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 
186 STBVDEF 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 
216 STBVDEF 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)
241 STBVDEF int stb_vorbis_decode_filename(const char *filename, int *channels, int *sample_rate, short **output);
242 #endif
243 #ifndef STB_VORBIS_NO_INTEGER_CONVERSION
244 STBVDEF 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 
251 STBVDEF 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
257 STBVDEF 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 
262 STBVDEF 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 
272 STBVDEF 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 
281 STBVDEF int stb_vorbis_seek_frame(stb_vorbis *f, unsigned int sample_number);
282 STBVDEF 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 
290 STBVDEF int stb_vorbis_seek_start(stb_vorbis *f);
291 // this function is equivalent to stb_vorbis_seek(f,0)
292 
293 STBVDEF unsigned int stb_vorbis_stream_length_in_samples(stb_vorbis *f);
294 STBVDEF float        stb_vorbis_stream_length_in_seconds(stb_vorbis *f);
295 // these functions return the total length of the vorbis stream
296 
297 STBVDEF 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
308 STBVDEF int stb_vorbis_get_frame_short_interleaved(stb_vorbis *f, int num_c, short *buffer, int num_shorts);
309 STBVDEF 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 
336 STBVDEF int stb_vorbis_get_samples_float_interleaved(stb_vorbis *f, int channels, float *buffer, int num_floats);
337 STBVDEF 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
344 STBVDEF int stb_vorbis_get_samples_short_interleaved(stb_vorbis *f, int channels, short *buffer, int num_shorts);
345 STBVDEF 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 
357 enum 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__) || defined(__APPLE__)
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 
626 typedef unsigned char  stbv_uint8;
627 typedef   signed char  stbv_int8;
628 typedef unsigned short stbv_uint16;
629 typedef   signed short stbv_int16;
630 typedef unsigned int   stbv_uint32;
631 typedef   signed int   stbv_int32;
632 
633 #ifndef TRUE
634 #define TRUE 1
635 #define FALSE 0
636 #endif
637 
638 typedef 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 
656 typedef 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 
679 typedef 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 
690 typedef 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 
706 typedef union
707 {
708    StbvFloor0 floor0;
709    StbvFloor1 floor1;
710 } StbvFloor;
711 
712 typedef 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 
722 typedef struct
723 {
724    stbv_uint8 magnitude;
725    stbv_uint8 angle;
726    stbv_uint8 mux;
727 } StbvMappingChannel;
728 
729 typedef 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 
738 typedef struct
739 {
740    stbv_uint8 blockflag;
741    stbv_uint8 mapping;
742    stbv_uint16 windowtype;
743    stbv_uint16 transformtype;
744 } StbvMode;
745 
746 typedef 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 
755 typedef struct
756 {
757    stbv_uint32 page_start, page_end;
758    stbv_uint32 last_decoded_sample;
759 } StbvProbedPage;
760 
761 struct 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 
880 typedef struct stb_vorbis stbv_vorb;
881 
stbv_error(stbv_vorb * f,enum STBVorbisError e)882 static 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
stbv_make_block_array(void * mem,int count,int size)907 static 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 
stbv_setup_malloc(stbv_vorb * f,int sz)919 static 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 
stbv_setup_free(stbv_vorb * f,void * p)932 static 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 
stbv_setup_temp_malloc(stbv_vorb * f,int sz)938 static 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 
stbv_setup_temp_free(stbv_vorb * f,void * p,int sz)949 static 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 
960 static stbv_uint32 stbv_crc_table[256];
stbv_crc32_init(void)961 static 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 
stbv_crc32_update(stbv_uint32 crc,stbv_uint8 byte)972 static __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
stbv_bit_reverse(unsigned int n)979 static 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 
stbv_square(float x)988 static 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
stbv_ilog(stbv_int32 n)996 static 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 
stbv_float32_unpack(stbv_uint32 x)1026 static 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".
stbv_add_entry(StbvCodebook * c,stbv_uint32 huff_code,int symbol,int count,int len,stbv_uint32 * values)1044 static 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 
stbv_compute_codewords(StbvCodebook * c,stbv_uint8 * len,int n,stbv_uint32 * values)1055 static 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
stbv_compute_accelerated_huffman(StbvCodebook * c)1103 static 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 
stbv_uint32_compare(const void * p,const void * q)1131 static 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 
stbv_include_in_sort(StbvCodebook * c,stbv_uint8 len)1138 static 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
stbv_compute_sorted_huffman(StbvCodebook * c,stbv_uint8 * lengths,stbv_uint32 * values)1148 static 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)
stbv_vorbis_validate(stbv_uint8 * data)1202 static 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)
stbv_lookup1_values(int entries,int dim)1210 static 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
stbv_compute_twiddle_factors(int n,float * A,float * B,float * C)1221 static 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 
stbv_compute_window(int n,float * window)1238 static 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 
stbv_compute_bitreverse(int n,stbv_uint16 * rev)1245 static 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 
stbv_init_blocksize(stbv_vorb * f,int b,int n)1253 static 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 
stbv_neighbors(stbv_uint16 * x,int n,int * plow,int * phigh)1270 static 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
1282 typedef struct
1283 {
1284    stbv_uint16 x,id;
1285 } stbv_floor_ordering;
1286 
stbv_point_compare(const void * p,const void * q)1287 static 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 
stbv_get8(stbv_vorb * z)1304 static 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 
stbv_get32(stbv_vorb * f)1320 static 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 
stbv_getn(stbv_vorb * z,stbv_uint8 * data,int n)1330 static 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 
stbv_skip(stbv_vorb * z,int n)1349 static 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 
stbv_set_file_offset(stb_vorbis * f,unsigned int loc)1364 static 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 
1396 static stbv_uint8 stbv_ogg_page_header[4] = { 0x4f, 0x67, 0x67, 0x53 };
1397 
stbv_capture_pattern(stbv_vorb * f)1398 static 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 
stbv_start_page_no_capturepattern(stbv_vorb * f)1411 static 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 
stbv_start_page(stbv_vorb * f)1464 static 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 
stbv_start_packet(stbv_vorb * f)1470 static 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 
stbv_maybe_start_packet(stbv_vorb * f)1485 static 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 
stbv_next_segment(stbv_vorb * f)1506 static 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 
stbv_get8_packet_raw(stbv_vorb * f)1530 static 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 
stbv_get8_packet(stbv_vorb * f)1542 static 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 
stbv_flush_packet(stbv_vorb * f)1549 static 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?
stbv_get_bits(stbv_vorb * f,int n)1556 static 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
stbv_prep_huffman(stbv_vorb * f)1590 static __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 
1605 enum
1606 {
1607    STBV_VORBIS_packet_id = 1,
1608    STBV_VORBIS_packet_comment = 3,
1609    STBV_VORBIS_packet_setup = 5
1610 };
1611 
stbv_codebook_decode_scalar_raw(stbv_vorb * f,StbvCodebook * c)1612 static 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 
stbv_codebook_decode_scalar(stbv_vorb * f,StbvCodebook * c)1689 static 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 
stbv_codebook_decode_start(stbv_vorb * f,StbvCodebook * c)1731 static 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 
stbv_codebook_decode(stbv_vorb * f,StbvCodebook * c,float * output,int len)1751 static 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 
stbv_codebook_decode_step(stbv_vorb * f,StbvCodebook * c,float * output,int len,int step)1790 static 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 
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)1821 static 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 
stbv_predict_point(int x,int x0,int x1,int y0,int y1)1891 static 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
1902 static 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
1987 stbv_int8 stbv_integer_divide_table[STBV_DIVTAB_NUMER][STBV_DIVTAB_DENOM]; // 2KB
1988 #endif
1989 
stbv_draw_line(float * output,int x0,int y0,int x1,int y1,int n)1990 static __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 
stbv_residue_decode(stbv_vorb * f,StbvCodebook * book,float * target,int offset,int n,int rtype)2039 static 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"
stbv_decode_residue(stbv_vorb * f,float * residue_buffers[],int ch,int n,int rn,stbv_uint8 * do_not_decode)2060 static 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
2285 void 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
inverse_mdct_slow(float * buffer,int n,stbv_vorb * f,int blocktype)2308 void 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
dct_iv_slow(float * buffer,int n)2329 void 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 
inverse_mdct_slow(float * buffer,int n,stbv_vorb * f,int blocktype)2346 void 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
2367 typedef struct
2368 {
2369   int n;
2370   int log2n;
2371 
2372   float *trig;
2373   int   *bitrev;
2374 
2375   float scale;
2376 } mdct_lookup;
2377 
2378 extern void mdct_init(mdct_lookup *lookup, int n);
2379 extern void mdct_clear(mdct_lookup *l);
2380 extern void mdct_backward(mdct_lookup *init, float *in, float *out);
2381 
2382 mdct_lookup M1,M2;
2383 
stbv_inverse_mdct(float * buffer,int n,stbv_vorb * f,int blocktype)2384 void 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.
stbv_imdct_step3_iter0_loop(int n,float * e,int i_off,int k_off,float * A)2404 static 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 
stbv_imdct_step3_inner_r_loop(int lim,float * e,int d0,int k_off,float * A,int k1)2449 static 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 
stbv_imdct_step3_inner_s_loop(int n,float * e,int i_off,int k_off,float * A,int a_off,int k0)2499 static 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 
stbv_iter_54(float * z)2550 static __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 
stbv_imdct_step3_inner_s_loop_ld654(int n,float * e,int i_off,float * A,int base_n)2582 static 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 
stbv_inverse_mdct(float * buffer,int n,stbv_vorb * f,int blocktype)2626 static 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
2930 void 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 
stbv_get_window(stbv_vorb * f,int len)3056 static 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
3066 typedef stbv_int16 STBV_YTYPE;
3067 #else
3068 typedef int STBV_YTYPE;
3069 #endif
stbv_do_floor(stbv_vorb * f,StbvMapping * map,int i,int n,float * target,STBV_YTYPE * finalY,stbv_uint8 * step2_flag)3070 static 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 
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)3121 static 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 
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)3177 static 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 
stbv_vorbis_decode_packet(stbv_vorb * f,int * len,int * p_left,int * p_right)3445 static 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 
stbv_vorbis_finish_frame(stb_vorbis * f,int len,int left,int right)3452 static 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 
stbv_vorbis_pump_first_frame(stb_vorbis * f)3504 static 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
stbv_is_whole_packet_present(stb_vorbis * f,int end_page)3514 static 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 
stbv_start_decoder(stbv_vorb * f)3579 static 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 
stbv_vorbis_deinit(stb_vorbis * p)4134 static 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 
stb_vorbis_close(stb_vorbis * p)4190 STBVDEF 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 
stbv_vorbis_init(stb_vorbis * p,const stb_vorbis_alloc * z)4197 static 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 
stb_vorbis_get_sample_offset(stb_vorbis * f)4216 STBVDEF 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 
stb_vorbis_get_info(stb_vorbis * f)4224 STBVDEF 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 
stb_vorbis_get_error(stb_vorbis * f)4236 STBVDEF 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 
stbv_vorbis_alloc(stb_vorbis * f)4243 static 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 
stb_vorbis_flush_pushdata(stb_vorbis * f)4251 STBVDEF 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 
stbv_vorbis_search_for_page_pushdata(stbv_vorb * f,stbv_uint8 * data,int data_len)4263 static 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
stb_vorbis_decode_frame_pushdata(stb_vorbis * f,const stbv_uint8 * data,int data_len,int * channels,float *** output,int * samples)4354 STBVDEF 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 
stb_vorbis_open_pushdata(const unsigned char * data,int data_len,int * data_used,int * error,const stb_vorbis_alloc * alloc)4424 STBVDEF 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 
stb_vorbis_get_file_offset(stb_vorbis * f)4454 STBVDEF 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 
stbv_vorbis_find_page(stb_vorbis * f,stbv_uint32 * end,stbv_uint32 * last)4470 static 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 
stbv_get_seek_page_info(stb_vorbis * f,StbvProbedPage * z)4552 static 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
stbv_go_to_page_before(stb_vorbis * f,unsigned int limit_offset)4584 static 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).
stbv_seek_to_sample_coarse(stb_vorbis * f,stbv_uint32 sample_number)4609 static 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 
4752 error:
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
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)4759 static 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 
stb_vorbis_seek_frame(stb_vorbis * f,unsigned int sample_number)4784 STBVDEF 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 
stb_vorbis_seek(stb_vorbis * f,unsigned int sample_number)4823 STBVDEF 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 
stb_vorbis_seek_start(stb_vorbis * f)4840 STBVDEF 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 
stb_vorbis_stream_length_in_samples(stb_vorbis * f)4850 STBVDEF 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 
stb_vorbis_stream_length_in_seconds(stb_vorbis * f)4925 STBVDEF 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 
stb_vorbis_get_frame_float(stb_vorbis * f,int * channels,float *** output)4932 STBVDEF 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 
stb_vorbis_open_file_section(FILE * file,int close_on_free,int * error,const stb_vorbis_alloc * alloc,unsigned int length)4956 STBVDEF 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 
stb_vorbis_open_file(FILE * file,int close_on_free,int * error,const stb_vorbis_alloc * alloc)4977 STBVDEF 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 
stb_vorbis_open_filename(const char * filename,int * error,const stb_vorbis_alloc * alloc)4987 STBVDEF 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 
stb_vorbis_open_memory(const unsigned char * data,int len,int * error,const stb_vorbis_alloc * alloc)4997 STBVDEF 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 
5030 static 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 
stbv_copy_samples(short * dest,float * src,int len)5060 static 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 
stbv_compute_samples(int mask,short * output,int num_c,float ** data,int d_offset,int len)5073 static 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 
stbv_compute_stereo_samples(short * output,int num_c,float ** data,int d_offset,int len)5098 static 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 
stbv_convert_samples_short(int buf_c,short ** buffer,int b_offset,int data_c,float ** data,int d_offset,int samples)5137 static 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 
stb_vorbis_get_frame_short(stb_vorbis * f,int num_c,short ** buffer,int num_samples)5153 STBVDEF 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 
stbv_convert_channels_short_interleaved(int buf_c,short * buffer,int data_c,float ** data,int d_offset,int len)5163 static 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 
stb_vorbis_get_frame_short_interleaved(stb_vorbis * f,int num_c,short * buffer,int num_shorts)5189 STBVDEF 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 
stb_vorbis_get_samples_short_interleaved(stb_vorbis * f,int channels,short * buffer,int num_shorts)5202 STBVDEF 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 
stb_vorbis_get_samples_short(stb_vorbis * f,int channels,short ** buffer,int len)5223 STBVDEF 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
stb_vorbis_decode_filename(const char * filename,int * channels,int * sample_rate,short ** output)5243 STBVDEF 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 
stb_vorbis_decode_memory(const stbv_uint8 * mem,int len,int * channels,int * sample_rate,short ** output)5283 STBVDEF 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 
stb_vorbis_get_samples_float_interleaved(stb_vorbis * f,int channels,float * buffer,int num_floats)5323 STBVDEF 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 
stb_vorbis_get_samples_float(stb_vorbis * f,int channels,float ** buffer,int num_samples)5350 STBVDEF 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 ------------------------------------------------------------------------------
5437 This software is available under 2 licenses -- choose whichever you prefer.
5438 ------------------------------------------------------------------------------
5439 ALTERNATIVE A - MIT License
5440 Copyright (c) 2017 Sean Barrett
5441 Permission is hereby granted, free of charge, to any person obtaining a copy of
5442 this software and associated documentation files (the "Software"), to deal in
5443 the Software without restriction, including without limitation the rights to
5444 use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
5445 of the Software, and to permit persons to whom the Software is furnished to do
5446 so, subject to the following conditions:
5447 The above copyright notice and this permission notice shall be included in all
5448 copies or substantial portions of the Software.
5449 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
5450 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
5451 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
5452 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
5453 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
5454 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
5455 SOFTWARE.
5456 ------------------------------------------------------------------------------
5457 ALTERNATIVE B - Public Domain (www.unlicense.org)
5458 This is free and unencumbered software released into the public domain.
5459 Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
5460 software, either in source code form or as a compiled binary, for any purpose,
5461 commercial or non-commercial, and by any means.
5462 In jurisdictions that recognize copyright laws, the author or authors of this
5463 software dedicate any and all copyright interest in the software to the public
5464 domain. We make this dedication for the benefit of the public at large and to
5465 the detriment of our heirs and successors. We intend this dedication to be an
5466 overt act of relinquishment in perpetuity of all present and future rights to
5467 this software under copyright law.
5468 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
5469 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
5470 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
5471 AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
5472 ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
5473 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
5474 ------------------------------------------------------------------------------
5475 */
5476