github.com/Konstantin8105/c4go@v0.0.0-20240505174241-768bb1c65a51/tests/raylib/external/stb_vorbis.h (about) 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__) || defined(__CYGWIN__) 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 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 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 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 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 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 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]; 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 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 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 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 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 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". 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 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 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 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 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 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) 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) 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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? 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 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 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 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 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 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 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 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 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 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 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" 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 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 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 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 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. 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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). 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 */