From 64f00204e71ed0143aa7f04568de6590ead434bf Mon Sep 17 00:00:00 2001 From: George Sokianos Date: Sun, 17 Sep 2023 17:53:43 +0100 Subject: [PATCH] Changes in the code to work on AmigaOS4 and release files added --- .gitignore | 4 + Makefile.os4 | 55 + fs.cpp | 4 + main.cpp | 8 +- release_files/REminiscence.info | Bin 0 -> 11420 bytes release_files/REminiscence/README.txt.info | Bin 0 -> 5092 bytes release_files/REminiscence/README_Amiga.md | 45 + .../REminiscence/README_Amiga.md.info | Bin 0 -> 5092 bytes release_files/REminiscence/REminiscence | 14 + release_files/REminiscence/REminiscence.info | Bin 0 -> 348258 bytes stb_vorbis.c | 5584 +++++++++++++++++ systemstub_sdl.cpp | 2 + util.cpp | 2 + 13 files changed, 5714 insertions(+), 4 deletions(-) create mode 100644 .gitignore create mode 100644 Makefile.os4 create mode 100644 release_files/REminiscence.info create mode 100644 release_files/REminiscence/README.txt.info create mode 100644 release_files/REminiscence/README_Amiga.md create mode 100644 release_files/REminiscence/README_Amiga.md.info create mode 100644 release_files/REminiscence/REminiscence create mode 100644 release_files/REminiscence/REminiscence.info create mode 100755 stb_vorbis.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8c46b9a --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.o +*.d +*.lha +rs diff --git a/Makefile.os4 b/Makefile.os4 new file mode 100644 index 0000000..6383683 --- /dev/null +++ b/Makefile.os4 @@ -0,0 +1,55 @@ + +SDL_CFLAGS := -I/sdk/local/newlib/include/SDL2 -DNDEBUG=1 +# -DUSE_STATIC_SCALER=1 +SDL_LIBS := -lSDL2_mixer -lmikmod -lmodplug -lFLAC -logg \ + -lSDL2 -lpthread -athread=native -lstdc++ + +MODPLUG_LIBS := -lmodplug +TREMOR_LIBS := #-lvorbisidec -logg +ZLIB_LIBS := -lz + +LIBS = $(SDL_LIBS) $(MODPLUG_LIBS) $(TREMOR_LIBS) $(ZLIB_LIBS) + +CXXFLAGS += -Wall -Wextra -Wno-unused-parameter -Wpedantic -MMD $(SDL_CFLAGS) -DUSE_MODPLUG -DUSE_STB_VORBIS -DUSE_ZLIB + +SRCS = collision.cpp cpc_player.cpp cutscene.cpp decode_mac.cpp file.cpp fs.cpp game.cpp graphics.cpp main.cpp \ + menu.cpp midi_parser.cpp mixer.cpp mod_player.cpp ogg_player.cpp \ + piege.cpp prf_player.cpp protection.cpp resource.cpp resource_aba.cpp \ + resource_mac.cpp scaler.cpp screenshot.cpp seq_player.cpp \ + sfx_player.cpp staticres.cpp systemstub_sdl.cpp unpack.cpp util.cpp video.cpp + +#CXXFLAGS += -DUSE_STATIC_SCALER +#SCALERS := scalers/scaler_nearest.cpp scalers/scaler_tv2x.cpp scalers/scaler_xbr.cpp + +#CXXFLAGS += -DUSE_MIDI_DRIVER +#MIDIDRIVERS := midi_driver_adlib.cpp midi_driver_mt32.cpp +#MIDI_LIBS := -lmt32emu + +LIBS = $(MIDI_LIBS) $(MODPLUG_LIBS) $(SDL_LIBS) $(TREMOR_LIBS) $(ZLIB_LIBS) + +OBJS = $(SRCS:.cpp=.o) $(SCALERS:.cpp=.o) $(MIDIDRIVERS:.cpp=.o) +DEPS = $(SRCS:.cpp=.d) $(SCALERS:.cpp=.d) $(MIDIDRIVERS:.cpp=.d) + +rs: $(OBJS) + $(CXX) $(LDFLAGS) -o $@ $(OBJS) $(LIBS) + +clean: + rm -f $(OBJS) $(DEPS) + +# prepare an archive for the program +release: + @echo "Creating release files..." + @strip rs + @mkdir -p release/ + @copy ALL release_files/ release/ QUIET + @mkdir -p release/REminiscence/data + @mkdir -p release/REminiscence/saves + @copy rs "release/REminiscence/" + @copy README.txt "release/REminiscence/" + @copy rs.cfg "release/REminiscence/" + @echo "Creating release archive..." + @lha -aeqr3 a REminiscence.lha release/ + @echo "Clean release files..." + @delete release ALL QUIET FORCE + +-include $(DEPS) diff --git a/fs.cpp b/fs.cpp index bdbf5b3..4c50f57 100644 --- a/fs.cpp +++ b/fs.cpp @@ -4,6 +4,10 @@ * Copyright (C) 2005-2019 Gregory Montoir (cyx@users.sourceforge.net) */ +#if defined(__amigaos4__) +#include +#endif + #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN #include diff --git a/main.cpp b/main.cpp index d7fb2d2..d4872b6 100644 --- a/main.cpp +++ b/main.cpp @@ -18,8 +18,8 @@ static const char *USAGE = "REminiscence - Flashback Interpreter\n" "Usage: %s [OPTIONS]...\n" - " --datapath=PATH Path to data files (default 'DATA')\n" - " --savepath=PATH Path to save files (default '.')\n" + " --datapath=PATH Path to data files (default 'data')\n" + " --savepath=PATH Path to save files (default 'saves')\n" " --levelnum=NUM Start to level, bypass introduction\n" " --fullscreen Fullscreen display\n" " --widescreen=MODE 16:9 display (adjacent,mirror,blur,none)\n" @@ -195,8 +195,8 @@ static WidescreenMode parseWidescreen(const char *mode) { } int main(int argc, char *argv[]) { - const char *dataPath = "DATA"; - const char *savePath = "."; + const char *dataPath = "data"; + const char *savePath = "saves/"; int levelNum = 0; bool fullscreen = false; bool autoSave = false; diff --git a/release_files/REminiscence.info b/release_files/REminiscence.info new file mode 100644 index 0000000000000000000000000000000000000000..d58f278b13a189da7fdbd83f537b1cf2f961a1f6 GIT binary patch literal 11420 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 literal 0 HcmV?d00001 diff --git a/release_files/REminiscence/README.txt.info b/release_files/REminiscence/README.txt.info new file mode 100644 index 0000000000000000000000000000000000000000..ff054c80c8fa7300fec938944471d379a0c47933 GIT binary patch literal 5092 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%0DAY-hwuP@9L-S`9DFIIuFqM8vsM z?04>sc578TWJty~9y#3yqP3YYem0Y6LCKu4ews+Dbug$WIDLXCVWk)thYc|*FSkxF`?o(8sY zXeI7%cvKXF92*)6ER?;^gMoDATht|(x$)9KhNX>(AgbID@^X832hB7hrx-Fx*RH+e zNRxf1(aYfv`xdMVI|sEY_Ac18_M^k4gok>b}-l0$CMUaKTTj=!CwybZHU+Dz1{A@mPKnprH~hjxt{ikCjz|Y^KsJrI0THX&X=;;Z08A@czBtVAqzpw zNFB)z(tch2;zGr>=>AYBS$}C~4$%vg8LQqkX#j{ohG1QyrmZ4%vfn>k zNNk#(1y7Qgp5w@?LdEm|G4|xXSjKK{#iKFHJw&8-ZKtuqZfx##^oru@nYF#D341eS zsMsf)dE_7Gz`Bm)@OR|FIi#vgqPf=Ahs;_-oSZHnvN;2T!K$6nX!MCxGMR0{2#*3O zXL0KbkvvTnIr>;<>PUBNz70`aG~Jz=5FRsB;rTiJ4pVEg7Q&qd*}}zpekm-Ub+HrE z`CShm%Z(bK*X=RClx5q{#E)4>TeY`e@(u1n^_SAM%?*q(i7)tulZG<}8;f(Z^BjK~ zgF75e(8}x;AAWyNm3t8!)w{lYMhdI9{n?&BwzEdq)!igc^w(9Wh`K^21 UR!61WrekG9GEt>wO~7;D545t5%>V!Z literal 0 HcmV?d00001 diff --git a/release_files/REminiscence/README_Amiga.md b/release_files/REminiscence/README_Amiga.md new file mode 100644 index 0000000..936ab13 --- /dev/null +++ b/release_files/REminiscence/README_Amiga.md @@ -0,0 +1,45 @@ +# REminiscence for AmigaOS 4.1 FE + +REminiscence is a re-implementation of the engine used in the game Flashback +made by Delphine Software and released in 1992. It is developed +by Gregory Montoir and you can find it on GitHub at +https://github.com/cyxx/REminiscence + +The icon is based on cedry2kio work as found at +https://www.deviantart.com/cedry2kio/art/Flashback-Icon-1-404447315 + +## Installation + +Extract the archive wherever you want. In the REminiscence there is the +*data* folder where you need to copy the data files for the game. The +*saves* folder is where tha saves files will be stored. + +Please read the README.txt file for more information about where to +find the data files. + +## I would like to thank + +- Gregory Montoir for developing and open sourcing REminiscence +- Capehill for his tireless work on SDL port for AmigaOS 4.1 FE + +## Known issues + +None yet. If you find any issue please let me know. + +## Support + +If you enjoy what I am doing and would like to keep me up during the night, +please consider to buy me a coffee at: +https://ko-fi.com/walkero + +## Known issues + +You can find the known issues at +https://git.walkero.gr/walkero/breakhack/issues + +# Changelog + +## [0.5.1r1] - 2023-09-17 +### Added +- First release for AmigaOS 4 + diff --git a/release_files/REminiscence/README_Amiga.md.info b/release_files/REminiscence/README_Amiga.md.info new file mode 100644 index 0000000000000000000000000000000000000000..e72a73722ba9add1a15f05183b462c88b8432431 GIT binary patch literal 5092 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%0D_bi_7M zxmEv4WFF3_?%Dtu7aQyAN0`ZIer~162iM3xDMLb>J}T9u&uJ&*6{)(DO%>=U(wrd?=xwni}0k z*c9hIzNJE^`BYF);+V6*^@Qjbqr+jFG#BDsOa{H5VE4Tuio~F5Nn{OapXT-NcWIBT zM(B?*-X6_p%U=}(nzsT>Z{ou{xE%}SMouNM)Ab3E zS#JoTi|z3KI7nXSRV@kTn`%tyAA7h3dn$elGTN#GY{iAWazJk_S7a1J8*{c4<48lCp9GqGz+CfwvMQ+ zk91ixo%B#618nEiPCVH3xFilaH8vJpEPG!71L?`PYe+DQ)8)YoYdbT3Or;Uz)vo?7 znt4=SDMU!uslV$?ll`bU$mWgv7j29<56C-qDGa}0luRAEsQj`S;OMG%$BfJjU;l!U z7SL3dLULREhKlMI9g>-iPE1VLw4NSevRVK+%S-{kwK)Ddqh5eTkOiUJ>GblBoF7u< zPCcMQ^w*+gAFIZY@i=+y;Qke7 zb!qMVhC%hD{aG?p{L^h*@-K^EJ!f*{JM!ovQe7s|+FrYRLj2o-+{*r!|sV%IBaOObv zaPhw1iz^r09K>{9&!Z=D<0j}0N6haPxpp-16Bg2b`P;8~hWDTbE9g3wh9;Qgmpmh( z(Y)c7()`>4=U=DbPREk8vj@dT-rrZ}Tmr`oZmOJ@!W!*=bL35#)(Lu=Tt%^y1 fKe*Rk1HP-UeZR-Ln6x`|tc*w|s@1IzdI9_sM9GmO literal 0 HcmV?d00001 diff --git a/release_files/REminiscence/REminiscence b/release_files/REminiscence/REminiscence new file mode 100644 index 0000000..f253dd0 --- /dev/null +++ b/release_files/REminiscence/REminiscence @@ -0,0 +1,14 @@ +stack 50000 + +Set title "REminiscence" + +Set rcnum `RequestChoice "$title" "Run in window or fullscreen?" "Window" "Fullscreen" "Oh, forget it"` + +If $rcnum EQ 1 +rs --scaler scale@3 +ENDIF + +If $rcnum EQ 2 +rs --fullscreen +ENDIF + diff --git a/release_files/REminiscence/REminiscence.info b/release_files/REminiscence/REminiscence.info new file mode 100644 index 0000000000000000000000000000000000000000..4295fb8ec4e8e6ab7b02fc3e5f7abfd71a406c32 GIT binary patch literal 348258 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 z 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�P*E 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 Q@A`E7_m2M$jCP>h0Gp4ujsO4v literal 0 HcmV?d00001 diff --git a/stb_vorbis.c b/stb_vorbis.c new file mode 100755 index 0000000..3e5c250 --- /dev/null +++ b/stb_vorbis.c @@ -0,0 +1,5584 @@ +// Ogg Vorbis audio decoder - v1.22 - public domain +// http://nothings.org/stb_vorbis/ +// +// Original version written by Sean Barrett in 2007. +// +// Originally sponsored by RAD Game Tools. Seeking implementation +// sponsored by Phillip Bennefall, Marc Andersen, Aaron Baker, +// Elias Software, Aras Pranckevicius, and Sean Barrett. +// +// LICENSE +// +// See end of file for license information. +// +// Limitations: +// +// - floor 0 not supported (used in old ogg vorbis files pre-2004) +// - lossless sample-truncation at beginning ignored +// - cannot concatenate multiple vorbis streams +// - sample positions are 32-bit, limiting seekable 192Khz +// files to around 6 hours (Ogg supports 64-bit) +// +// Feature contributors: +// Dougall Johnson (sample-exact seeking) +// +// Bugfix/warning contributors: +// Terje Mathisen Niklas Frykholm Andy Hill +// Casey Muratori John Bolton Gargaj +// Laurent Gomila Marc LeBlanc Ronny Chevalier +// Bernhard Wodo Evan Balster github:alxprd +// Tom Beaumont Ingo Leitgeb Nicolas Guillemot +// Phillip Bennefall Rohit Thiago Goulart +// github:manxorist Saga Musix github:infatum +// Timur Gagiev Maxwell Koo Peter Waller +// github:audinowho Dougall Johnson David Reid +// github:Clownacy Pedro J. Estebanez Remi Verschelde +// AnthoFoxo github:morlat Gabriel Ravier +// +// Partial history: +// 1.22 - 2021-07-11 - various small fixes +// 1.21 - 2021-07-02 - fix bug for files with no comments +// 1.20 - 2020-07-11 - several small fixes +// 1.19 - 2020-02-05 - warnings +// 1.18 - 2020-02-02 - fix seek bugs; parse header comments; misc warnings etc. +// 1.17 - 2019-07-08 - fix CVE-2019-13217..CVE-2019-13223 (by ForAllSecure) +// 1.16 - 2019-03-04 - fix warnings +// 1.15 - 2019-02-07 - explicit failure if Ogg Skeleton data is found +// 1.14 - 2018-02-11 - delete bogus dealloca usage +// 1.13 - 2018-01-29 - fix truncation of last frame (hopefully) +// 1.12 - 2017-11-21 - limit residue begin/end to blocksize/2 to avoid large temp allocs in bad/corrupt files +// 1.11 - 2017-07-23 - fix MinGW compilation +// 1.10 - 2017-03-03 - more robust seeking; fix negative ilog(); clear error in open_memory +// 1.09 - 2016-04-04 - back out 'truncation of last frame' fix from previous version +// 1.08 - 2016-04-02 - warnings; setup memory leaks; truncation of last frame +// 1.07 - 2015-01-16 - fixes for crashes on invalid files; warning fixes; const +// 1.06 - 2015-08-31 - full, correct support for seeking API (Dougall Johnson) +// some crash fixes when out of memory or with corrupt files +// fix some inappropriately signed shifts +// 1.05 - 2015-04-19 - don't define __forceinline if it's redundant +// 1.04 - 2014-08-27 - fix missing const-correct case in API +// 1.03 - 2014-08-07 - warning fixes +// 1.02 - 2014-07-09 - declare qsort comparison as explicitly _cdecl in Windows +// 1.01 - 2014-06-18 - fix stb_vorbis_get_samples_float (interleaved was correct) +// 1.0 - 2014-05-26 - fix memory leaks; fix warnings; fix bugs in >2-channel; +// (API change) report sample rate for decode-full-file funcs +// +// See end of file for full version history. + + +////////////////////////////////////////////////////////////////////////////// +// +// HEADER BEGINS HERE +// + +#ifndef STB_VORBIS_INCLUDE_STB_VORBIS_H +#define STB_VORBIS_INCLUDE_STB_VORBIS_H + +#if defined(STB_VORBIS_NO_CRT) && !defined(STB_VORBIS_NO_STDIO) +#define STB_VORBIS_NO_STDIO 1 +#endif + +#ifndef STB_VORBIS_NO_STDIO +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/////////// THREAD SAFETY + +// Individual stb_vorbis* handles are not thread-safe; you cannot decode from +// them from multiple threads at the same time. However, you can have multiple +// stb_vorbis* handles and decode from them independently in multiple thrads. + + +/////////// MEMORY ALLOCATION + +// normally stb_vorbis uses malloc() to allocate memory at startup, +// and alloca() to allocate temporary memory during a frame on the +// stack. (Memory consumption will depend on the amount of setup +// data in the file and how you set the compile flags for speed +// vs. size. In my test files the maximal-size usage is ~150KB.) +// +// You can modify the wrapper functions in the source (setup_malloc, +// setup_temp_malloc, temp_malloc) to change this behavior, or you +// can use a simpler allocation model: you pass in a buffer from +// which stb_vorbis will allocate _all_ its memory (including the +// temp memory). "open" may fail with a VORBIS_outofmem if you +// do not pass in enough data; there is no way to determine how +// much you do need except to succeed (at which point you can +// query get_info to find the exact amount required. yes I know +// this is lame). +// +// If you pass in a non-NULL buffer of the type below, allocation +// will occur from it as described above. Otherwise just pass NULL +// to use malloc()/alloca() + +typedef struct +{ + char *alloc_buffer; + int alloc_buffer_length_in_bytes; +} stb_vorbis_alloc; + + +/////////// FUNCTIONS USEABLE WITH ALL INPUT MODES + +typedef struct stb_vorbis stb_vorbis; + +typedef struct +{ + unsigned int sample_rate; + int channels; + + unsigned int setup_memory_required; + unsigned int setup_temp_memory_required; + unsigned int temp_memory_required; + + int max_frame_size; +} stb_vorbis_info; + +typedef struct +{ + char *vendor; + + int comment_list_length; + char **comment_list; +} stb_vorbis_comment; + +// get general information about the file +extern stb_vorbis_info stb_vorbis_get_info(stb_vorbis *f); + +// get ogg comments +extern stb_vorbis_comment stb_vorbis_get_comment(stb_vorbis *f); + +// get the last error detected (clears it, too) +extern int stb_vorbis_get_error(stb_vorbis *f); + +// close an ogg vorbis file and free all memory in use +extern void stb_vorbis_close(stb_vorbis *f); + +// this function returns the offset (in samples) from the beginning of the +// file that will be returned by the next decode, if it is known, or -1 +// otherwise. after a flush_pushdata() call, this may take a while before +// it becomes valid again. +// NOT WORKING YET after a seek with PULLDATA API +extern int stb_vorbis_get_sample_offset(stb_vorbis *f); + +// returns the current seek point within the file, or offset from the beginning +// of the memory buffer. In pushdata mode it returns 0. +extern unsigned int stb_vorbis_get_file_offset(stb_vorbis *f); + +/////////// PUSHDATA API + +#ifndef STB_VORBIS_NO_PUSHDATA_API + +// this API allows you to get blocks of data from any source and hand +// them to stb_vorbis. you have to buffer them; stb_vorbis will tell +// you how much it used, and you have to give it the rest next time; +// and stb_vorbis may not have enough data to work with and you will +// need to give it the same data again PLUS more. Note that the Vorbis +// specification does not bound the size of an individual frame. + +extern stb_vorbis *stb_vorbis_open_pushdata( + const unsigned char * datablock, int datablock_length_in_bytes, + int *datablock_memory_consumed_in_bytes, + int *error, + const stb_vorbis_alloc *alloc_buffer); +// create a vorbis decoder by passing in the initial data block containing +// the ogg&vorbis headers (you don't need to do parse them, just provide +// the first N bytes of the file--you're told if it's not enough, see below) +// on success, returns an stb_vorbis *, does not set error, returns the amount of +// data parsed/consumed on this call in *datablock_memory_consumed_in_bytes; +// on failure, returns NULL on error and sets *error, does not change *datablock_memory_consumed +// if returns NULL and *error is VORBIS_need_more_data, then the input block was +// incomplete and you need to pass in a larger block from the start of the file + +extern int stb_vorbis_decode_frame_pushdata( + stb_vorbis *f, + const unsigned char *datablock, int datablock_length_in_bytes, + int *channels, // place to write number of float * buffers + float ***output, // place to write float ** array of float * buffers + int *samples // place to write number of output samples + ); +// decode a frame of audio sample data if possible from the passed-in data block +// +// return value: number of bytes we used from datablock +// +// possible cases: +// 0 bytes used, 0 samples output (need more data) +// N bytes used, 0 samples output (resynching the stream, keep going) +// N bytes used, M samples output (one frame of data) +// note that after opening a file, you will ALWAYS get one N-bytes,0-sample +// frame, because Vorbis always "discards" the first frame. +// +// Note that on resynch, stb_vorbis will rarely consume all of the buffer, +// instead only datablock_length_in_bytes-3 or less. This is because it wants +// to avoid missing parts of a page header if they cross a datablock boundary, +// without writing state-machiney code to record a partial detection. +// +// The number of channels returned are stored in *channels (which can be +// NULL--it is always the same as the number of channels reported by +// get_info). *output will contain an array of float* buffers, one per +// channel. In other words, (*output)[0][0] contains the first sample from +// the first channel, and (*output)[1][0] contains the first sample from +// the second channel. +// +// *output points into stb_vorbis's internal output buffer storage; these +// buffers are owned by stb_vorbis and application code should not free +// them or modify their contents. They are transient and will be overwritten +// once you ask for more data to get decoded, so be sure to grab any data +// you need before then. + +extern void stb_vorbis_flush_pushdata(stb_vorbis *f); +// inform stb_vorbis that your next datablock will not be contiguous with +// previous ones (e.g. you've seeked in the data); future attempts to decode +// frames will cause stb_vorbis to resynchronize (as noted above), and +// once it sees a valid Ogg page (typically 4-8KB, as large as 64KB), it +// will begin decoding the _next_ frame. +// +// if you want to seek using pushdata, you need to seek in your file, then +// call stb_vorbis_flush_pushdata(), then start calling decoding, then once +// decoding is returning you data, call stb_vorbis_get_sample_offset, and +// if you don't like the result, seek your file again and repeat. +#endif + + +////////// PULLING INPUT API + +#ifndef STB_VORBIS_NO_PULLDATA_API +// This API assumes stb_vorbis is allowed to pull data from a source-- +// either a block of memory containing the _entire_ vorbis stream, or a +// FILE * that you or it create, or possibly some other reading mechanism +// if you go modify the source to replace the FILE * case with some kind +// of callback to your code. (But if you don't support seeking, you may +// just want to go ahead and use pushdata.) + +#if !defined(STB_VORBIS_NO_STDIO) && !defined(STB_VORBIS_NO_INTEGER_CONVERSION) +extern int stb_vorbis_decode_filename(const char *filename, int *channels, int *sample_rate, short **output); +#endif +#if !defined(STB_VORBIS_NO_INTEGER_CONVERSION) +extern int stb_vorbis_decode_memory(const unsigned char *mem, int len, int *channels, int *sample_rate, short **output); +#endif +// decode an entire file and output the data interleaved into a malloc()ed +// buffer stored in *output. The return value is the number of samples +// decoded, or -1 if the file could not be opened or was not an ogg vorbis file. +// When you're done with it, just free() the pointer returned in *output. + +extern stb_vorbis * stb_vorbis_open_memory(const unsigned char *data, int len, + int *error, const stb_vorbis_alloc *alloc_buffer); +// create an ogg vorbis decoder from an ogg vorbis stream in memory (note +// this must be the entire stream!). on failure, returns NULL and sets *error + +#ifndef STB_VORBIS_NO_STDIO +extern stb_vorbis * stb_vorbis_open_filename(const char *filename, + int *error, const stb_vorbis_alloc *alloc_buffer); +// create an ogg vorbis decoder from a filename via fopen(). on failure, +// returns NULL and sets *error (possibly to VORBIS_file_open_failure). + +extern stb_vorbis * stb_vorbis_open_file(FILE *f, int close_handle_on_close, + int *error, const stb_vorbis_alloc *alloc_buffer); +// create an ogg vorbis decoder from an open FILE *, looking for a stream at +// the _current_ seek point (ftell). on failure, returns NULL and sets *error. +// note that stb_vorbis must "own" this stream; if you seek it in between +// calls to stb_vorbis, it will become confused. Moreover, if you attempt to +// perform stb_vorbis_seek_*() operations on this file, it will assume it +// owns the _entire_ rest of the file after the start point. Use the next +// function, stb_vorbis_open_file_section(), to limit it. + +extern stb_vorbis * stb_vorbis_open_file_section(FILE *f, int close_handle_on_close, + int *error, const stb_vorbis_alloc *alloc_buffer, unsigned int len); +// create an ogg vorbis decoder from an open FILE *, looking for a stream at +// the _current_ seek point (ftell); the stream will be of length 'len' bytes. +// on failure, returns NULL and sets *error. note that stb_vorbis must "own" +// this stream; if you seek it in between calls to stb_vorbis, it will become +// confused. +#endif + +extern int stb_vorbis_seek_frame(stb_vorbis *f, unsigned int sample_number); +extern int stb_vorbis_seek(stb_vorbis *f, unsigned int sample_number); +// these functions seek in the Vorbis file to (approximately) 'sample_number'. +// after calling seek_frame(), the next call to get_frame_*() will include +// the specified sample. after calling stb_vorbis_seek(), the next call to +// stb_vorbis_get_samples_* will start with the specified sample. If you +// do not need to seek to EXACTLY the target sample when using get_samples_*, +// you can also use seek_frame(). + +extern int stb_vorbis_seek_start(stb_vorbis *f); +// this function is equivalent to stb_vorbis_seek(f,0) + +extern unsigned int stb_vorbis_stream_length_in_samples(stb_vorbis *f); +extern float stb_vorbis_stream_length_in_seconds(stb_vorbis *f); +// these functions return the total length of the vorbis stream + +extern int stb_vorbis_get_frame_float(stb_vorbis *f, int *channels, float ***output); +// decode the next frame and return the number of samples. the number of +// channels returned are stored in *channels (which can be NULL--it is always +// the same as the number of channels reported by get_info). *output will +// contain an array of float* buffers, one per channel. These outputs will +// be overwritten on the next call to stb_vorbis_get_frame_*. +// +// You generally should not intermix calls to stb_vorbis_get_frame_*() +// and stb_vorbis_get_samples_*(), since the latter calls the former. + +#ifndef STB_VORBIS_NO_INTEGER_CONVERSION +extern int stb_vorbis_get_frame_short_interleaved(stb_vorbis *f, int num_c, short *buffer, int num_shorts); +extern int stb_vorbis_get_frame_short (stb_vorbis *f, int num_c, short **buffer, int num_samples); +#endif +// decode the next frame and return the number of *samples* per channel. +// Note that for interleaved data, you pass in the number of shorts (the +// size of your array), but the return value is the number of samples per +// channel, not the total number of samples. +// +// The data is coerced to the number of channels you request according to the +// channel coercion rules (see below). You must pass in the size of your +// buffer(s) so that stb_vorbis will not overwrite the end of the buffer. +// The maximum buffer size needed can be gotten from get_info(); however, +// the Vorbis I specification implies an absolute maximum of 4096 samples +// per channel. + +// Channel coercion rules: +// Let M be the number of channels requested, and N the number of channels present, +// and Cn be the nth channel; let stereo L be the sum of all L and center channels, +// and stereo R be the sum of all R and center channels (channel assignment from the +// vorbis spec). +// M N output +// 1 k sum(Ck) for all k +// 2 * stereo L, stereo R +// k l k > l, the first l channels, then 0s +// k l k <= l, the first k channels +// Note that this is not _good_ surround etc. mixing at all! It's just so +// you get something useful. + +extern int stb_vorbis_get_samples_float_interleaved(stb_vorbis *f, int channels, float *buffer, int num_floats); +extern int stb_vorbis_get_samples_float(stb_vorbis *f, int channels, float **buffer, int num_samples); +// gets num_samples samples, not necessarily on a frame boundary--this requires +// buffering so you have to supply the buffers. DOES NOT APPLY THE COERCION RULES. +// Returns the number of samples stored per channel; it may be less than requested +// at the end of the file. If there are no more samples in the file, returns 0. + +#ifndef STB_VORBIS_NO_INTEGER_CONVERSION +extern int stb_vorbis_get_samples_short_interleaved(stb_vorbis *f, int channels, short *buffer, int num_shorts); +extern int stb_vorbis_get_samples_short(stb_vorbis *f, int channels, short **buffer, int num_samples); +#endif +// gets num_samples samples, not necessarily on a frame boundary--this requires +// buffering so you have to supply the buffers. Applies the coercion rules above +// to produce 'channels' channels. Returns the number of samples stored per channel; +// it may be less than requested at the end of the file. If there are no more +// samples in the file, returns 0. + +#endif + +//////// ERROR CODES + +enum STBVorbisError +{ + VORBIS__no_error, + + VORBIS_need_more_data=1, // not a real error + + VORBIS_invalid_api_mixing, // can't mix API modes + VORBIS_outofmem, // not enough memory + VORBIS_feature_not_supported, // uses floor 0 + VORBIS_too_many_channels, // STB_VORBIS_MAX_CHANNELS is too small + VORBIS_file_open_failure, // fopen() failed + VORBIS_seek_without_length, // can't seek in unknown-length file + + VORBIS_unexpected_eof=10, // file is truncated? + VORBIS_seek_invalid, // seek past EOF + + // decoding errors (corrupt/invalid stream) -- you probably + // don't care about the exact details of these + + // vorbis errors: + VORBIS_invalid_setup=20, + VORBIS_invalid_stream, + + // ogg errors: + VORBIS_missing_capture_pattern=30, + VORBIS_invalid_stream_structure_version, + VORBIS_continued_packet_flag_invalid, + VORBIS_incorrect_stream_serial_number, + VORBIS_invalid_first_page, + VORBIS_bad_packet_type, + VORBIS_cant_find_last_page, + VORBIS_seek_failed, + VORBIS_ogg_skeleton_not_supported +}; + + +#ifdef __cplusplus +} +#endif + +#endif // STB_VORBIS_INCLUDE_STB_VORBIS_H +// +// HEADER ENDS HERE +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef STB_VORBIS_HEADER_ONLY + +// global configuration settings (e.g. set these in the project/makefile), +// or just set them in this file at the top (although ideally the first few +// should be visible when the header file is compiled too, although it's not +// crucial) + +// STB_VORBIS_NO_PUSHDATA_API +// does not compile the code for the various stb_vorbis_*_pushdata() +// functions +// #define STB_VORBIS_NO_PUSHDATA_API + +// STB_VORBIS_NO_PULLDATA_API +// does not compile the code for the non-pushdata APIs +// #define STB_VORBIS_NO_PULLDATA_API + +// STB_VORBIS_NO_STDIO +// does not compile the code for the APIs that use FILE *s internally +// or externally (implied by STB_VORBIS_NO_PULLDATA_API) +// #define STB_VORBIS_NO_STDIO + +// STB_VORBIS_NO_INTEGER_CONVERSION +// does not compile the code for converting audio sample data from +// float to integer (implied by STB_VORBIS_NO_PULLDATA_API) +// #define STB_VORBIS_NO_INTEGER_CONVERSION + +// STB_VORBIS_NO_FAST_SCALED_FLOAT +// does not use a fast float-to-int trick to accelerate float-to-int on +// most platforms which requires endianness be defined correctly. +//#define STB_VORBIS_NO_FAST_SCALED_FLOAT + + +// STB_VORBIS_MAX_CHANNELS [number] +// globally define this to the maximum number of channels you need. +// The spec does not put a restriction on channels except that +// the count is stored in a byte, so 255 is the hard limit. +// Reducing this saves about 16 bytes per value, so using 16 saves +// (255-16)*16 or around 4KB. Plus anything other memory usage +// I forgot to account for. Can probably go as low as 8 (7.1 audio), +// 6 (5.1 audio), or 2 (stereo only). +#ifndef STB_VORBIS_MAX_CHANNELS +#define STB_VORBIS_MAX_CHANNELS 16 // enough for anyone? +#endif + +// STB_VORBIS_PUSHDATA_CRC_COUNT [number] +// after a flush_pushdata(), stb_vorbis begins scanning for the +// next valid page, without backtracking. when it finds something +// that looks like a page, it streams through it and verifies its +// CRC32. Should that validation fail, it keeps scanning. But it's +// possible that _while_ streaming through to check the CRC32 of +// one candidate page, it sees another candidate page. This #define +// determines how many "overlapping" candidate pages it can search +// at once. Note that "real" pages are typically ~4KB to ~8KB, whereas +// garbage pages could be as big as 64KB, but probably average ~16KB. +// So don't hose ourselves by scanning an apparent 64KB page and +// missing a ton of real ones in the interim; so minimum of 2 +#ifndef STB_VORBIS_PUSHDATA_CRC_COUNT +#define STB_VORBIS_PUSHDATA_CRC_COUNT 4 +#endif + +// STB_VORBIS_FAST_HUFFMAN_LENGTH [number] +// sets the log size of the huffman-acceleration table. Maximum +// supported value is 24. with larger numbers, more decodings are O(1), +// but the table size is larger so worse cache missing, so you'll have +// to probe (and try multiple ogg vorbis files) to find the sweet spot. +#ifndef STB_VORBIS_FAST_HUFFMAN_LENGTH +#define STB_VORBIS_FAST_HUFFMAN_LENGTH 10 +#endif + +// STB_VORBIS_FAST_BINARY_LENGTH [number] +// sets the log size of the binary-search acceleration table. this +// is used in similar fashion to the fast-huffman size to set initial +// parameters for the binary search + +// STB_VORBIS_FAST_HUFFMAN_INT +// The fast huffman tables are much more efficient if they can be +// stored as 16-bit results instead of 32-bit results. This restricts +// the codebooks to having only 65535 possible outcomes, though. +// (At least, accelerated by the huffman table.) +#ifndef STB_VORBIS_FAST_HUFFMAN_INT +#define STB_VORBIS_FAST_HUFFMAN_SHORT +#endif + +// STB_VORBIS_NO_HUFFMAN_BINARY_SEARCH +// If the 'fast huffman' search doesn't succeed, then stb_vorbis falls +// back on binary searching for the correct one. This requires storing +// extra tables with the huffman codes in sorted order. Defining this +// symbol trades off space for speed by forcing a linear search in the +// non-fast case, except for "sparse" codebooks. +// #define STB_VORBIS_NO_HUFFMAN_BINARY_SEARCH + +// STB_VORBIS_DIVIDES_IN_RESIDUE +// stb_vorbis precomputes the result of the scalar residue decoding +// that would otherwise require a divide per chunk. you can trade off +// space for time by defining this symbol. +// #define STB_VORBIS_DIVIDES_IN_RESIDUE + +// STB_VORBIS_DIVIDES_IN_CODEBOOK +// vorbis VQ codebooks can be encoded two ways: with every case explicitly +// stored, or with all elements being chosen from a small range of values, +// and all values possible in all elements. By default, stb_vorbis expands +// this latter kind out to look like the former kind for ease of decoding, +// because otherwise an integer divide-per-vector-element is required to +// unpack the index. If you define STB_VORBIS_DIVIDES_IN_CODEBOOK, you can +// trade off storage for speed. +//#define STB_VORBIS_DIVIDES_IN_CODEBOOK + +#ifdef STB_VORBIS_CODEBOOK_SHORTS +#error "STB_VORBIS_CODEBOOK_SHORTS is no longer supported as it produced incorrect results for some input formats" +#endif + +// STB_VORBIS_DIVIDE_TABLE +// this replaces small integer divides in the floor decode loop with +// table lookups. made less than 1% difference, so disabled by default. + +// STB_VORBIS_NO_INLINE_DECODE +// disables the inlining of the scalar codebook fast-huffman decode. +// might save a little codespace; useful for debugging +// #define STB_VORBIS_NO_INLINE_DECODE + +// STB_VORBIS_NO_DEFER_FLOOR +// Normally we only decode the floor without synthesizing the actual +// full curve. We can instead synthesize the curve immediately. This +// requires more memory and is very likely slower, so I don't think +// you'd ever want to do it except for debugging. +// #define STB_VORBIS_NO_DEFER_FLOOR + + + + +////////////////////////////////////////////////////////////////////////////// + +#ifdef STB_VORBIS_NO_PULLDATA_API + #define STB_VORBIS_NO_INTEGER_CONVERSION + #define STB_VORBIS_NO_STDIO +#endif + +#if defined(STB_VORBIS_NO_CRT) && !defined(STB_VORBIS_NO_STDIO) + #define STB_VORBIS_NO_STDIO 1 +#endif + +#ifndef STB_VORBIS_NO_INTEGER_CONVERSION +#ifndef STB_VORBIS_NO_FAST_SCALED_FLOAT + + // only need endianness for fast-float-to-int, which we don't + // use for pushdata + + #ifndef STB_VORBIS_BIG_ENDIAN + #define STB_VORBIS_ENDIAN 0 + #else + #define STB_VORBIS_ENDIAN 1 + #endif + +#endif +#endif + + +#ifndef STB_VORBIS_NO_STDIO +#include +#endif + +#ifndef STB_VORBIS_NO_CRT + #include + #include + #include + #include + + // find definition of alloca if it's not in stdlib.h: + #if defined(_MSC_VER) || defined(__MINGW32__) + #include + #endif + #if defined(__linux__) || defined(__linux) || defined(__sun__) || defined(__EMSCRIPTEN__) || defined(__NEWLIB__) + #include + #endif +#else // STB_VORBIS_NO_CRT + #define NULL 0 + #define malloc(s) 0 + #define free(s) ((void) 0) + #define realloc(s) 0 +#endif // STB_VORBIS_NO_CRT + +#include + +#ifdef __MINGW32__ + // eff you mingw: + // "fixed": + // http://sourceforge.net/p/mingw-w64/mailman/message/32882927/ + // "no that broke the build, reverted, who cares about C": + // http://sourceforge.net/p/mingw-w64/mailman/message/32890381/ + #ifdef __forceinline + #undef __forceinline + #endif + #define __forceinline + #ifndef alloca + #define alloca __builtin_alloca + #endif +#elif !defined(_MSC_VER) + #if __GNUC__ + #define __forceinline inline + #else + #define __forceinline + #endif +#endif + +#if STB_VORBIS_MAX_CHANNELS > 256 +#error "Value of STB_VORBIS_MAX_CHANNELS outside of allowed range" +#endif + +#if STB_VORBIS_FAST_HUFFMAN_LENGTH > 24 +#error "Value of STB_VORBIS_FAST_HUFFMAN_LENGTH outside of allowed range" +#endif + + +#if 0 +#include +#define CHECK(f) _CrtIsValidHeapPointer(f->channel_buffers[1]) +#else +#define CHECK(f) ((void) 0) +#endif + +#define MAX_BLOCKSIZE_LOG 13 // from specification +#define MAX_BLOCKSIZE (1 << MAX_BLOCKSIZE_LOG) + + +typedef unsigned char uint8; +typedef signed char int8; +typedef unsigned short uint16; +typedef signed short int16; +typedef unsigned int uint32; +typedef signed int int32; + +#ifndef TRUE +#define TRUE 1 +#define FALSE 0 +#endif + +typedef float codetype; + +#ifdef _MSC_VER +#define STBV_NOTUSED(v) (void)(v) +#else +#define STBV_NOTUSED(v) (void)sizeof(v) +#endif + +// @NOTE +// +// Some arrays below are tagged "//varies", which means it's actually +// a variable-sized piece of data, but rather than malloc I assume it's +// small enough it's better to just allocate it all together with the +// main thing +// +// Most of the variables are specified with the smallest size I could pack +// them into. It might give better performance to make them all full-sized +// integers. It should be safe to freely rearrange the structures or change +// the sizes larger--nothing relies on silently truncating etc., nor the +// order of variables. + +#define FAST_HUFFMAN_TABLE_SIZE (1 << STB_VORBIS_FAST_HUFFMAN_LENGTH) +#define FAST_HUFFMAN_TABLE_MASK (FAST_HUFFMAN_TABLE_SIZE - 1) + +typedef struct +{ + int dimensions, entries; + uint8 *codeword_lengths; + float minimum_value; + float delta_value; + uint8 value_bits; + uint8 lookup_type; + uint8 sequence_p; + uint8 sparse; + uint32 lookup_values; + codetype *multiplicands; + uint32 *codewords; + #ifdef STB_VORBIS_FAST_HUFFMAN_SHORT + int16 fast_huffman[FAST_HUFFMAN_TABLE_SIZE]; + #else + int32 fast_huffman[FAST_HUFFMAN_TABLE_SIZE]; + #endif + uint32 *sorted_codewords; + int *sorted_values; + int sorted_entries; +} Codebook; + +typedef struct +{ + uint8 order; + uint16 rate; + uint16 bark_map_size; + uint8 amplitude_bits; + uint8 amplitude_offset; + uint8 number_of_books; + uint8 book_list[16]; // varies +} Floor0; + +typedef struct +{ + uint8 partitions; + uint8 partition_class_list[32]; // varies + uint8 class_dimensions[16]; // varies + uint8 class_subclasses[16]; // varies + uint8 class_masterbooks[16]; // varies + int16 subclass_books[16][8]; // varies + uint16 Xlist[31*8+2]; // varies + uint8 sorted_order[31*8+2]; + uint8 neighbors[31*8+2][2]; + uint8 floor1_multiplier; + uint8 rangebits; + int values; +} Floor1; + +typedef union +{ + Floor0 floor0; + Floor1 floor1; +} Floor; + +typedef struct +{ + uint32 begin, end; + uint32 part_size; + uint8 classifications; + uint8 classbook; + uint8 **classdata; + int16 (*residue_books)[8]; +} Residue; + +typedef struct +{ + uint8 magnitude; + uint8 angle; + uint8 mux; +} MappingChannel; + +typedef struct +{ + uint16 coupling_steps; + MappingChannel *chan; + uint8 submaps; + uint8 submap_floor[15]; // varies + uint8 submap_residue[15]; // varies +} Mapping; + +typedef struct +{ + uint8 blockflag; + uint8 mapping; + uint16 windowtype; + uint16 transformtype; +} Mode; + +typedef struct +{ + uint32 goal_crc; // expected crc if match + int bytes_left; // bytes left in packet + uint32 crc_so_far; // running crc + int bytes_done; // bytes processed in _current_ chunk + uint32 sample_loc; // granule pos encoded in page +} CRCscan; + +typedef struct +{ + uint32 page_start, page_end; + uint32 last_decoded_sample; +} ProbedPage; + +struct stb_vorbis +{ + // user-accessible info + unsigned int sample_rate; + int channels; + + unsigned int setup_memory_required; + unsigned int temp_memory_required; + unsigned int setup_temp_memory_required; + + char *vendor; + int comment_list_length; + char **comment_list; + + // input config +#ifndef STB_VORBIS_NO_STDIO + FILE *f; + uint32 f_start; + int close_on_free; +#endif + + uint8 *stream; + uint8 *stream_start; + uint8 *stream_end; + + uint32 stream_len; + + uint8 push_mode; + + // the page to seek to when seeking to start, may be zero + uint32 first_audio_page_offset; + + // p_first is the page on which the first audio packet ends + // (but not necessarily the page on which it starts) + ProbedPage p_first, p_last; + + // memory management + stb_vorbis_alloc alloc; + int setup_offset; + int temp_offset; + + // run-time results + int eof; + enum STBVorbisError error; + + // user-useful data + + // header info + int blocksize[2]; + int blocksize_0, blocksize_1; + int codebook_count; + Codebook *codebooks; + int floor_count; + uint16 floor_types[64]; // varies + Floor *floor_config; + int residue_count; + uint16 residue_types[64]; // varies + Residue *residue_config; + int mapping_count; + Mapping *mapping; + int mode_count; + Mode mode_config[64]; // varies + + uint32 total_samples; + + // decode buffer + float *channel_buffers[STB_VORBIS_MAX_CHANNELS]; + float *outputs [STB_VORBIS_MAX_CHANNELS]; + + float *previous_window[STB_VORBIS_MAX_CHANNELS]; + int previous_length; + + #ifndef STB_VORBIS_NO_DEFER_FLOOR + int16 *finalY[STB_VORBIS_MAX_CHANNELS]; + #else + float *floor_buffers[STB_VORBIS_MAX_CHANNELS]; + #endif + + uint32 current_loc; // sample location of next frame to decode + int current_loc_valid; + + // per-blocksize precomputed data + + // twiddle factors + float *A[2],*B[2],*C[2]; + float *window[2]; + uint16 *bit_reverse[2]; + + // current page/packet/segment streaming info + uint32 serial; // stream serial number for verification + int last_page; + int segment_count; + uint8 segments[255]; + uint8 page_flag; + uint8 bytes_in_seg; + uint8 first_decode; + int next_seg; + int last_seg; // flag that we're on the last segment + int last_seg_which; // what was the segment number of the last seg? + uint32 acc; + int valid_bits; + int packet_bytes; + int end_seg_with_known_loc; + uint32 known_loc_for_packet; + int discard_samples_deferred; + uint32 samples_output; + + // push mode scanning + int page_crc_tests; // only in push_mode: number of tests active; -1 if not searching +#ifndef STB_VORBIS_NO_PUSHDATA_API + CRCscan scan[STB_VORBIS_PUSHDATA_CRC_COUNT]; +#endif + + // sample-access + int channel_buffer_start; + int channel_buffer_end; +}; + +#if defined(STB_VORBIS_NO_PUSHDATA_API) + #define IS_PUSH_MODE(f) FALSE +#elif defined(STB_VORBIS_NO_PULLDATA_API) + #define IS_PUSH_MODE(f) TRUE +#else + #define IS_PUSH_MODE(f) ((f)->push_mode) +#endif + +typedef struct stb_vorbis vorb; + +static int error(vorb *f, enum STBVorbisError e) +{ + f->error = e; + if (!f->eof && e != VORBIS_need_more_data) { + f->error=e; // breakpoint for debugging + } + return 0; +} + + +// these functions are used for allocating temporary memory +// while decoding. if you can afford the stack space, use +// alloca(); otherwise, provide a temp buffer and it will +// allocate out of those. + +#define array_size_required(count,size) (count*(sizeof(void *)+(size))) + +#define temp_alloc(f,size) (f->alloc.alloc_buffer ? setup_temp_malloc(f,size) : alloca(size)) +#define temp_free(f,p) (void)0 +#define temp_alloc_save(f) ((f)->temp_offset) +#define temp_alloc_restore(f,p) ((f)->temp_offset = (p)) + +#define temp_block_array(f,count,size) make_block_array(temp_alloc(f,array_size_required(count,size)), count, size) + +// given a sufficiently large block of memory, make an array of pointers to subblocks of it +static void *make_block_array(void *mem, int count, int size) +{ + int i; + void ** p = (void **) mem; + char *q = (char *) (p + count); + for (i=0; i < count; ++i) { + p[i] = q; + q += size; + } + return p; +} + +static void *setup_malloc(vorb *f, int sz) +{ + sz = (sz+7) & ~7; // round up to nearest 8 for alignment of future allocs. + f->setup_memory_required += sz; + if (f->alloc.alloc_buffer) { + void *p = (char *) f->alloc.alloc_buffer + f->setup_offset; + if (f->setup_offset + sz > f->temp_offset) return NULL; + f->setup_offset += sz; + return p; + } + return sz ? malloc(sz) : NULL; +} + +static void setup_free(vorb *f, void *p) +{ + if (f->alloc.alloc_buffer) return; // do nothing; setup mem is a stack + free(p); +} + +static void *setup_temp_malloc(vorb *f, int sz) +{ + sz = (sz+7) & ~7; // round up to nearest 8 for alignment of future allocs. + if (f->alloc.alloc_buffer) { + if (f->temp_offset - sz < f->setup_offset) return NULL; + f->temp_offset -= sz; + return (char *) f->alloc.alloc_buffer + f->temp_offset; + } + return malloc(sz); +} + +static void setup_temp_free(vorb *f, void *p, int sz) +{ + if (f->alloc.alloc_buffer) { + f->temp_offset += (sz+7)&~7; + return; + } + free(p); +} + +#define CRC32_POLY 0x04c11db7 // from spec + +static uint32 crc_table[256]; +static void crc32_init(void) +{ + int i,j; + uint32 s; + for(i=0; i < 256; i++) { + for (s=(uint32) i << 24, j=0; j < 8; ++j) + s = (s << 1) ^ (s >= (1U<<31) ? CRC32_POLY : 0); + crc_table[i] = s; + } +} + +static __forceinline uint32 crc32_update(uint32 crc, uint8 byte) +{ + return (crc << 8) ^ crc_table[byte ^ (crc >> 24)]; +} + + +// used in setup, and for huffman that doesn't go fast path +static unsigned int bit_reverse(unsigned int n) +{ + n = ((n & 0xAAAAAAAA) >> 1) | ((n & 0x55555555) << 1); + n = ((n & 0xCCCCCCCC) >> 2) | ((n & 0x33333333) << 2); + n = ((n & 0xF0F0F0F0) >> 4) | ((n & 0x0F0F0F0F) << 4); + n = ((n & 0xFF00FF00) >> 8) | ((n & 0x00FF00FF) << 8); + return (n >> 16) | (n << 16); +} + +static float square(float x) +{ + return x*x; +} + +// this is a weird definition of log2() for which log2(1) = 1, log2(2) = 2, log2(4) = 3 +// as required by the specification. fast(?) implementation from stb.h +// @OPTIMIZE: called multiple times per-packet with "constants"; move to setup +static int ilog(int32 n) +{ + static signed char log2_4[16] = { 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4 }; + + if (n < 0) return 0; // signed n returns 0 + + // 2 compares if n < 16, 3 compares otherwise (4 if signed or n > 1<<29) + if (n < (1 << 14)) + if (n < (1 << 4)) return 0 + log2_4[n ]; + else if (n < (1 << 9)) return 5 + log2_4[n >> 5]; + else return 10 + log2_4[n >> 10]; + else if (n < (1 << 24)) + if (n < (1 << 19)) return 15 + log2_4[n >> 15]; + else return 20 + log2_4[n >> 20]; + else if (n < (1 << 29)) return 25 + log2_4[n >> 25]; + else return 30 + log2_4[n >> 30]; +} + +#ifndef M_PI + #define M_PI 3.14159265358979323846264f // from CRC +#endif + +// code length assigned to a value with no huffman encoding +#define NO_CODE 255 + +/////////////////////// LEAF SETUP FUNCTIONS ////////////////////////// +// +// these functions are only called at setup, and only a few times +// per file + +static float float32_unpack(uint32 x) +{ + // from the specification + uint32 mantissa = x & 0x1fffff; + uint32 sign = x & 0x80000000; + uint32 exp = (x & 0x7fe00000) >> 21; + double res = sign ? -(double)mantissa : (double)mantissa; + return (float) ldexp((float)res, (int)exp-788); +} + + +// zlib & jpeg huffman tables assume that the output symbols +// can either be arbitrarily arranged, or have monotonically +// increasing frequencies--they rely on the lengths being sorted; +// this makes for a very simple generation algorithm. +// vorbis allows a huffman table with non-sorted lengths. This +// requires a more sophisticated construction, since symbols in +// order do not map to huffman codes "in order". +static void add_entry(Codebook *c, uint32 huff_code, int symbol, int count, int len, uint32 *values) +{ + if (!c->sparse) { + c->codewords [symbol] = huff_code; + } else { + c->codewords [count] = huff_code; + c->codeword_lengths[count] = len; + values [count] = symbol; + } +} + +static int compute_codewords(Codebook *c, uint8 *len, int n, uint32 *values) +{ + int i,k,m=0; + uint32 available[32]; + + memset(available, 0, sizeof(available)); + // find the first entry + for (k=0; k < n; ++k) if (len[k] < NO_CODE) break; + if (k == n) { assert(c->sorted_entries == 0); return TRUE; } + assert(len[k] < 32); // no error return required, code reading lens checks this + // add to the list + add_entry(c, 0, k, m++, len[k], values); + // add all available leaves + for (i=1; i <= len[k]; ++i) + available[i] = 1U << (32-i); + // note that the above code treats the first case specially, + // but it's really the same as the following code, so they + // could probably be combined (except the initial code is 0, + // and I use 0 in available[] to mean 'empty') + for (i=k+1; i < n; ++i) { + uint32 res; + int z = len[i], y; + if (z == NO_CODE) continue; + assert(z < 32); // no error return required, code reading lens checks this + // find lowest available leaf (should always be earliest, + // which is what the specification calls for) + // note that this property, and the fact we can never have + // more than one free leaf at a given level, isn't totally + // trivial to prove, but it seems true and the assert never + // fires, so! + while (z > 0 && !available[z]) --z; + if (z == 0) { return FALSE; } + res = available[z]; + available[z] = 0; + add_entry(c, bit_reverse(res), i, m++, len[i], values); + // propagate availability up the tree + if (z != len[i]) { + for (y=len[i]; y > z; --y) { + assert(available[y] == 0); + available[y] = res + (1 << (32-y)); + } + } + } + return TRUE; +} + +// accelerated huffman table allows fast O(1) match of all symbols +// of length <= STB_VORBIS_FAST_HUFFMAN_LENGTH +static void compute_accelerated_huffman(Codebook *c) +{ + int i, len; + for (i=0; i < FAST_HUFFMAN_TABLE_SIZE; ++i) + c->fast_huffman[i] = -1; + + len = c->sparse ? c->sorted_entries : c->entries; + #ifdef STB_VORBIS_FAST_HUFFMAN_SHORT + if (len > 32767) len = 32767; // largest possible value we can encode! + #endif + for (i=0; i < len; ++i) { + if (c->codeword_lengths[i] <= STB_VORBIS_FAST_HUFFMAN_LENGTH) { + uint32 z = c->sparse ? bit_reverse(c->sorted_codewords[i]) : c->codewords[i]; + // set table entries for all bit combinations in the higher bits + while (z < FAST_HUFFMAN_TABLE_SIZE) { + c->fast_huffman[z] = i; + z += 1 << c->codeword_lengths[i]; + } + } + } +} + +#ifdef _MSC_VER +#define STBV_CDECL __cdecl +#else +#define STBV_CDECL +#endif + +static int STBV_CDECL uint32_compare(const void *p, const void *q) +{ + uint32 x = * (uint32 *) p; + uint32 y = * (uint32 *) q; + return x < y ? -1 : x > y; +} + +static int include_in_sort(Codebook *c, uint8 len) +{ + if (c->sparse) { assert(len != NO_CODE); return TRUE; } + if (len == NO_CODE) return FALSE; + if (len > STB_VORBIS_FAST_HUFFMAN_LENGTH) return TRUE; + return FALSE; +} + +// if the fast table above doesn't work, we want to binary +// search them... need to reverse the bits +static void compute_sorted_huffman(Codebook *c, uint8 *lengths, uint32 *values) +{ + int i, len; + // build a list of all the entries + // OPTIMIZATION: don't include the short ones, since they'll be caught by FAST_HUFFMAN. + // this is kind of a frivolous optimization--I don't see any performance improvement, + // but it's like 4 extra lines of code, so. + if (!c->sparse) { + int k = 0; + for (i=0; i < c->entries; ++i) + if (include_in_sort(c, lengths[i])) + c->sorted_codewords[k++] = bit_reverse(c->codewords[i]); + assert(k == c->sorted_entries); + } else { + for (i=0; i < c->sorted_entries; ++i) + c->sorted_codewords[i] = bit_reverse(c->codewords[i]); + } + + qsort(c->sorted_codewords, c->sorted_entries, sizeof(c->sorted_codewords[0]), uint32_compare); + c->sorted_codewords[c->sorted_entries] = 0xffffffff; + + len = c->sparse ? c->sorted_entries : c->entries; + // now we need to indicate how they correspond; we could either + // #1: sort a different data structure that says who they correspond to + // #2: for each sorted entry, search the original list to find who corresponds + // #3: for each original entry, find the sorted entry + // #1 requires extra storage, #2 is slow, #3 can use binary search! + for (i=0; i < len; ++i) { + int huff_len = c->sparse ? lengths[values[i]] : lengths[i]; + if (include_in_sort(c,huff_len)) { + uint32 code = bit_reverse(c->codewords[i]); + int x=0, n=c->sorted_entries; + while (n > 1) { + // invariant: sc[x] <= code < sc[x+n] + int m = x + (n >> 1); + if (c->sorted_codewords[m] <= code) { + x = m; + n -= (n>>1); + } else { + n >>= 1; + } + } + assert(c->sorted_codewords[x] == code); + if (c->sparse) { + c->sorted_values[x] = values[i]; + c->codeword_lengths[x] = huff_len; + } else { + c->sorted_values[x] = i; + } + } + } +} + +// only run while parsing the header (3 times) +static int vorbis_validate(uint8 *data) +{ + static uint8 vorbis[6] = { 'v', 'o', 'r', 'b', 'i', 's' }; + return memcmp(data, vorbis, 6) == 0; +} + +// called from setup only, once per code book +// (formula implied by specification) +static int lookup1_values(int entries, int dim) +{ + int r = (int) floor(exp((float) log((float) entries) / dim)); + if ((int) floor(pow((float) r+1, dim)) <= entries) // (int) cast for MinGW warning; + ++r; // floor() to avoid _ftol() when non-CRT + if (pow((float) r+1, dim) <= entries) + return -1; + if ((int) floor(pow((float) r, dim)) > entries) + return -1; + return r; +} + +// called twice per file +static void compute_twiddle_factors(int n, float *A, float *B, float *C) +{ + int n4 = n >> 2, n8 = n >> 3; + int k,k2; + + for (k=k2=0; k < n4; ++k,k2+=2) { + A[k2 ] = (float) cos(4*k*M_PI/n); + A[k2+1] = (float) -sin(4*k*M_PI/n); + B[k2 ] = (float) cos((k2+1)*M_PI/n/2) * 0.5f; + B[k2+1] = (float) sin((k2+1)*M_PI/n/2) * 0.5f; + } + for (k=k2=0; k < n8; ++k,k2+=2) { + C[k2 ] = (float) cos(2*(k2+1)*M_PI/n); + C[k2+1] = (float) -sin(2*(k2+1)*M_PI/n); + } +} + +static void compute_window(int n, float *window) +{ + int n2 = n >> 1, i; + for (i=0; i < n2; ++i) + window[i] = (float) sin(0.5 * M_PI * square((float) sin((i - 0 + 0.5) / n2 * 0.5 * M_PI))); +} + +static void compute_bitreverse(int n, uint16 *rev) +{ + int ld = ilog(n) - 1; // ilog is off-by-one from normal definitions + int i, n8 = n >> 3; + for (i=0; i < n8; ++i) + rev[i] = (bit_reverse(i) >> (32-ld+3)) << 2; +} + +static int init_blocksize(vorb *f, int b, int n) +{ + int n2 = n >> 1, n4 = n >> 2, n8 = n >> 3; + f->A[b] = (float *) setup_malloc(f, sizeof(float) * n2); + f->B[b] = (float *) setup_malloc(f, sizeof(float) * n2); + f->C[b] = (float *) setup_malloc(f, sizeof(float) * n4); + if (!f->A[b] || !f->B[b] || !f->C[b]) return error(f, VORBIS_outofmem); + compute_twiddle_factors(n, f->A[b], f->B[b], f->C[b]); + f->window[b] = (float *) setup_malloc(f, sizeof(float) * n2); + if (!f->window[b]) return error(f, VORBIS_outofmem); + compute_window(n, f->window[b]); + f->bit_reverse[b] = (uint16 *) setup_malloc(f, sizeof(uint16) * n8); + if (!f->bit_reverse[b]) return error(f, VORBIS_outofmem); + compute_bitreverse(n, f->bit_reverse[b]); + return TRUE; +} + +static void neighbors(uint16 *x, int n, int *plow, int *phigh) +{ + int low = -1; + int high = 65536; + int i; + for (i=0; i < n; ++i) { + if (x[i] > low && x[i] < x[n]) { *plow = i; low = x[i]; } + if (x[i] < high && x[i] > x[n]) { *phigh = i; high = x[i]; } + } +} + +// this has been repurposed so y is now the original index instead of y +typedef struct +{ + uint16 x,id; +} stbv__floor_ordering; + +static int STBV_CDECL point_compare(const void *p, const void *q) +{ + stbv__floor_ordering *a = (stbv__floor_ordering *) p; + stbv__floor_ordering *b = (stbv__floor_ordering *) q; + return a->x < b->x ? -1 : a->x > b->x; +} + +// +/////////////////////// END LEAF SETUP FUNCTIONS ////////////////////////// + + +#if defined(STB_VORBIS_NO_STDIO) + #define USE_MEMORY(z) TRUE +#else + #define USE_MEMORY(z) ((z)->stream) +#endif + +static uint8 get8(vorb *z) +{ + if (USE_MEMORY(z)) { + if (z->stream >= z->stream_end) { z->eof = TRUE; return 0; } + return *z->stream++; + } + + #ifndef STB_VORBIS_NO_STDIO + { + int c = fgetc(z->f); + if (c == EOF) { z->eof = TRUE; return 0; } + return c; + } + #endif +} + +static uint32 get32(vorb *f) +{ + uint32 x; + x = get8(f); + x += get8(f) << 8; + x += get8(f) << 16; + x += (uint32) get8(f) << 24; + return x; +} + +static int getn(vorb *z, uint8 *data, int n) +{ + if (USE_MEMORY(z)) { + if (z->stream+n > z->stream_end) { z->eof = 1; return 0; } + memcpy(data, z->stream, n); + z->stream += n; + return 1; + } + + #ifndef STB_VORBIS_NO_STDIO + if (fread(data, n, 1, z->f) == 1) + return 1; + else { + z->eof = 1; + return 0; + } + #endif +} + +static void skip(vorb *z, int n) +{ + if (USE_MEMORY(z)) { + z->stream += n; + if (z->stream >= z->stream_end) z->eof = 1; + return; + } + #ifndef STB_VORBIS_NO_STDIO + { + long x = ftell(z->f); + fseek(z->f, x+n, SEEK_SET); + } + #endif +} + +static int set_file_offset(stb_vorbis *f, unsigned int loc) +{ + #ifndef STB_VORBIS_NO_PUSHDATA_API + if (f->push_mode) return 0; + #endif + f->eof = 0; + if (USE_MEMORY(f)) { + if (f->stream_start + loc >= f->stream_end || f->stream_start + loc < f->stream_start) { + f->stream = f->stream_end; + f->eof = 1; + return 0; + } else { + f->stream = f->stream_start + loc; + return 1; + } + } + #ifndef STB_VORBIS_NO_STDIO + if (loc + f->f_start < loc || loc >= 0x80000000) { + loc = 0x7fffffff; + f->eof = 1; + } else { + loc += f->f_start; + } + if (!fseek(f->f, loc, SEEK_SET)) + return 1; + f->eof = 1; + fseek(f->f, f->f_start, SEEK_END); + return 0; + #endif +} + + +static uint8 ogg_page_header[4] = { 0x4f, 0x67, 0x67, 0x53 }; + +static int capture_pattern(vorb *f) +{ + if (0x4f != get8(f)) return FALSE; + if (0x67 != get8(f)) return FALSE; + if (0x67 != get8(f)) return FALSE; + if (0x53 != get8(f)) return FALSE; + return TRUE; +} + +#define PAGEFLAG_continued_packet 1 +#define PAGEFLAG_first_page 2 +#define PAGEFLAG_last_page 4 + +static int start_page_no_capturepattern(vorb *f) +{ + uint32 loc0,loc1,n; + if (f->first_decode && !IS_PUSH_MODE(f)) { + f->p_first.page_start = stb_vorbis_get_file_offset(f) - 4; + } + // stream structure version + if (0 != get8(f)) return error(f, VORBIS_invalid_stream_structure_version); + // header flag + f->page_flag = get8(f); + // absolute granule position + loc0 = get32(f); + loc1 = get32(f); + // @TODO: validate loc0,loc1 as valid positions? + // stream serial number -- vorbis doesn't interleave, so discard + get32(f); + //if (f->serial != get32(f)) return error(f, VORBIS_incorrect_stream_serial_number); + // page sequence number + n = get32(f); + f->last_page = n; + // CRC32 + get32(f); + // page_segments + f->segment_count = get8(f); + if (!getn(f, f->segments, f->segment_count)) + return error(f, VORBIS_unexpected_eof); + // assume we _don't_ know any the sample position of any segments + f->end_seg_with_known_loc = -2; + if (loc0 != ~0U || loc1 != ~0U) { + int i; + // determine which packet is the last one that will complete + for (i=f->segment_count-1; i >= 0; --i) + if (f->segments[i] < 255) + break; + // 'i' is now the index of the _last_ segment of a packet that ends + if (i >= 0) { + f->end_seg_with_known_loc = i; + f->known_loc_for_packet = loc0; + } + } + if (f->first_decode) { + int i,len; + len = 0; + for (i=0; i < f->segment_count; ++i) + len += f->segments[i]; + len += 27 + f->segment_count; + f->p_first.page_end = f->p_first.page_start + len; + f->p_first.last_decoded_sample = loc0; + } + f->next_seg = 0; + return TRUE; +} + +static int start_page(vorb *f) +{ + if (!capture_pattern(f)) return error(f, VORBIS_missing_capture_pattern); + return start_page_no_capturepattern(f); +} + +static int start_packet(vorb *f) +{ + while (f->next_seg == -1) { + if (!start_page(f)) return FALSE; + if (f->page_flag & PAGEFLAG_continued_packet) + return error(f, VORBIS_continued_packet_flag_invalid); + } + f->last_seg = FALSE; + f->valid_bits = 0; + f->packet_bytes = 0; + f->bytes_in_seg = 0; + // f->next_seg is now valid + return TRUE; +} + +static int maybe_start_packet(vorb *f) +{ + if (f->next_seg == -1) { + int x = get8(f); + if (f->eof) return FALSE; // EOF at page boundary is not an error! + if (0x4f != x ) return error(f, VORBIS_missing_capture_pattern); + if (0x67 != get8(f)) return error(f, VORBIS_missing_capture_pattern); + if (0x67 != get8(f)) return error(f, VORBIS_missing_capture_pattern); + if (0x53 != get8(f)) return error(f, VORBIS_missing_capture_pattern); + if (!start_page_no_capturepattern(f)) return FALSE; + if (f->page_flag & PAGEFLAG_continued_packet) { + // set up enough state that we can read this packet if we want, + // e.g. during recovery + f->last_seg = FALSE; + f->bytes_in_seg = 0; + return error(f, VORBIS_continued_packet_flag_invalid); + } + } + return start_packet(f); +} + +static int next_segment(vorb *f) +{ + int len; + if (f->last_seg) return 0; + if (f->next_seg == -1) { + f->last_seg_which = f->segment_count-1; // in case start_page fails + if (!start_page(f)) { f->last_seg = 1; return 0; } + if (!(f->page_flag & PAGEFLAG_continued_packet)) return error(f, VORBIS_continued_packet_flag_invalid); + } + len = f->segments[f->next_seg++]; + if (len < 255) { + f->last_seg = TRUE; + f->last_seg_which = f->next_seg-1; + } + if (f->next_seg >= f->segment_count) + f->next_seg = -1; + assert(f->bytes_in_seg == 0); + f->bytes_in_seg = len; + return len; +} + +#define EOP (-1) +#define INVALID_BITS (-1) + +static int get8_packet_raw(vorb *f) +{ + if (!f->bytes_in_seg) { // CLANG! + if (f->last_seg) return EOP; + else if (!next_segment(f)) return EOP; + } + assert(f->bytes_in_seg > 0); + --f->bytes_in_seg; + ++f->packet_bytes; + return get8(f); +} + +static int get8_packet(vorb *f) +{ + int x = get8_packet_raw(f); + f->valid_bits = 0; + return x; +} + +static int get32_packet(vorb *f) +{ + uint32 x; + x = get8_packet(f); + x += get8_packet(f) << 8; + x += get8_packet(f) << 16; + x += (uint32) get8_packet(f) << 24; + return x; +} + +static void flush_packet(vorb *f) +{ + while (get8_packet_raw(f) != EOP); +} + +// @OPTIMIZE: this is the secondary bit decoder, so it's probably not as important +// as the huffman decoder? +static uint32 get_bits(vorb *f, int n) +{ + uint32 z; + + if (f->valid_bits < 0) return 0; + if (f->valid_bits < n) { + if (n > 24) { + // the accumulator technique below would not work correctly in this case + z = get_bits(f, 24); + z += get_bits(f, n-24) << 24; + return z; + } + if (f->valid_bits == 0) f->acc = 0; + while (f->valid_bits < n) { + int z = get8_packet_raw(f); + if (z == EOP) { + f->valid_bits = INVALID_BITS; + return 0; + } + f->acc += z << f->valid_bits; + f->valid_bits += 8; + } + } + + assert(f->valid_bits >= n); + z = f->acc & ((1 << n)-1); + f->acc >>= n; + f->valid_bits -= n; + return z; +} + +// @OPTIMIZE: primary accumulator for huffman +// expand the buffer to as many bits as possible without reading off end of packet +// it might be nice to allow f->valid_bits and f->acc to be stored in registers, +// e.g. cache them locally and decode locally +static __forceinline void prep_huffman(vorb *f) +{ + if (f->valid_bits <= 24) { + if (f->valid_bits == 0) f->acc = 0; + do { + int z; + if (f->last_seg && !f->bytes_in_seg) return; + z = get8_packet_raw(f); + if (z == EOP) return; + f->acc += (unsigned) z << f->valid_bits; + f->valid_bits += 8; + } while (f->valid_bits <= 24); + } +} + +enum +{ + VORBIS_packet_id = 1, + VORBIS_packet_comment = 3, + VORBIS_packet_setup = 5 +}; + +static int codebook_decode_scalar_raw(vorb *f, Codebook *c) +{ + int i; + prep_huffman(f); + + if (c->codewords == NULL && c->sorted_codewords == NULL) + return -1; + + // cases to use binary search: sorted_codewords && !c->codewords + // sorted_codewords && c->entries > 8 + if (c->entries > 8 ? c->sorted_codewords!=NULL : !c->codewords) { + // binary search + uint32 code = bit_reverse(f->acc); + int x=0, n=c->sorted_entries, len; + + while (n > 1) { + // invariant: sc[x] <= code < sc[x+n] + int m = x + (n >> 1); + if (c->sorted_codewords[m] <= code) { + x = m; + n -= (n>>1); + } else { + n >>= 1; + } + } + // x is now the sorted index + if (!c->sparse) x = c->sorted_values[x]; + // x is now sorted index if sparse, or symbol otherwise + len = c->codeword_lengths[x]; + if (f->valid_bits >= len) { + f->acc >>= len; + f->valid_bits -= len; + return x; + } + + f->valid_bits = 0; + return -1; + } + + // if small, linear search + assert(!c->sparse); + for (i=0; i < c->entries; ++i) { + if (c->codeword_lengths[i] == NO_CODE) continue; + if (c->codewords[i] == (f->acc & ((1 << c->codeword_lengths[i])-1))) { + if (f->valid_bits >= c->codeword_lengths[i]) { + f->acc >>= c->codeword_lengths[i]; + f->valid_bits -= c->codeword_lengths[i]; + return i; + } + f->valid_bits = 0; + return -1; + } + } + + error(f, VORBIS_invalid_stream); + f->valid_bits = 0; + return -1; +} + +#ifndef STB_VORBIS_NO_INLINE_DECODE + +#define DECODE_RAW(var, f,c) \ + if (f->valid_bits < STB_VORBIS_FAST_HUFFMAN_LENGTH) \ + prep_huffman(f); \ + var = f->acc & FAST_HUFFMAN_TABLE_MASK; \ + var = c->fast_huffman[var]; \ + if (var >= 0) { \ + int n = c->codeword_lengths[var]; \ + f->acc >>= n; \ + f->valid_bits -= n; \ + if (f->valid_bits < 0) { f->valid_bits = 0; var = -1; } \ + } else { \ + var = codebook_decode_scalar_raw(f,c); \ + } + +#else + +static int codebook_decode_scalar(vorb *f, Codebook *c) +{ + int i; + if (f->valid_bits < STB_VORBIS_FAST_HUFFMAN_LENGTH) + prep_huffman(f); + // fast huffman table lookup + i = f->acc & FAST_HUFFMAN_TABLE_MASK; + i = c->fast_huffman[i]; + if (i >= 0) { + f->acc >>= c->codeword_lengths[i]; + f->valid_bits -= c->codeword_lengths[i]; + if (f->valid_bits < 0) { f->valid_bits = 0; return -1; } + return i; + } + return codebook_decode_scalar_raw(f,c); +} + +#define DECODE_RAW(var,f,c) var = codebook_decode_scalar(f,c); + +#endif + +#define DECODE(var,f,c) \ + DECODE_RAW(var,f,c) \ + if (c->sparse) var = c->sorted_values[var]; + +#ifndef STB_VORBIS_DIVIDES_IN_CODEBOOK + #define DECODE_VQ(var,f,c) DECODE_RAW(var,f,c) +#else + #define DECODE_VQ(var,f,c) DECODE(var,f,c) +#endif + + + + + + +// CODEBOOK_ELEMENT_FAST is an optimization for the CODEBOOK_FLOATS case +// where we avoid one addition +#define CODEBOOK_ELEMENT(c,off) (c->multiplicands[off]) +#define CODEBOOK_ELEMENT_FAST(c,off) (c->multiplicands[off]) +#define CODEBOOK_ELEMENT_BASE(c) (0) + +static int codebook_decode_start(vorb *f, Codebook *c) +{ + int z = -1; + + // type 0 is only legal in a scalar context + if (c->lookup_type == 0) + error(f, VORBIS_invalid_stream); + else { + DECODE_VQ(z,f,c); + if (c->sparse) assert(z < c->sorted_entries); + if (z < 0) { // check for EOP + if (!f->bytes_in_seg) + if (f->last_seg) + return z; + error(f, VORBIS_invalid_stream); + } + } + return z; +} + +static int codebook_decode(vorb *f, Codebook *c, float *output, int len) +{ + int i,z = codebook_decode_start(f,c); + if (z < 0) return FALSE; + if (len > c->dimensions) len = c->dimensions; + +#ifdef STB_VORBIS_DIVIDES_IN_CODEBOOK + if (c->lookup_type == 1) { + float last = CODEBOOK_ELEMENT_BASE(c); + int div = 1; + for (i=0; i < len; ++i) { + int off = (z / div) % c->lookup_values; + float val = CODEBOOK_ELEMENT_FAST(c,off) + last; + output[i] += val; + if (c->sequence_p) last = val + c->minimum_value; + div *= c->lookup_values; + } + return TRUE; + } +#endif + + z *= c->dimensions; + if (c->sequence_p) { + float last = CODEBOOK_ELEMENT_BASE(c); + for (i=0; i < len; ++i) { + float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; + output[i] += val; + last = val + c->minimum_value; + } + } else { + float last = CODEBOOK_ELEMENT_BASE(c); + for (i=0; i < len; ++i) { + output[i] += CODEBOOK_ELEMENT_FAST(c,z+i) + last; + } + } + + return TRUE; +} + +static int codebook_decode_step(vorb *f, Codebook *c, float *output, int len, int step) +{ + int i,z = codebook_decode_start(f,c); + float last = CODEBOOK_ELEMENT_BASE(c); + if (z < 0) return FALSE; + if (len > c->dimensions) len = c->dimensions; + +#ifdef STB_VORBIS_DIVIDES_IN_CODEBOOK + if (c->lookup_type == 1) { + int div = 1; + for (i=0; i < len; ++i) { + int off = (z / div) % c->lookup_values; + float val = CODEBOOK_ELEMENT_FAST(c,off) + last; + output[i*step] += val; + if (c->sequence_p) last = val; + div *= c->lookup_values; + } + return TRUE; + } +#endif + + z *= c->dimensions; + for (i=0; i < len; ++i) { + float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; + output[i*step] += val; + if (c->sequence_p) last = val; + } + + return TRUE; +} + +static int codebook_decode_deinterleave_repeat(vorb *f, Codebook *c, float **outputs, int ch, int *c_inter_p, int *p_inter_p, int len, int total_decode) +{ + int c_inter = *c_inter_p; + int p_inter = *p_inter_p; + int i,z, effective = c->dimensions; + + // type 0 is only legal in a scalar context + if (c->lookup_type == 0) return error(f, VORBIS_invalid_stream); + + while (total_decode > 0) { + float last = CODEBOOK_ELEMENT_BASE(c); + DECODE_VQ(z,f,c); + #ifndef STB_VORBIS_DIVIDES_IN_CODEBOOK + assert(!c->sparse || z < c->sorted_entries); + #endif + if (z < 0) { + if (!f->bytes_in_seg) + if (f->last_seg) return FALSE; + return error(f, VORBIS_invalid_stream); + } + + // if this will take us off the end of the buffers, stop short! + // we check by computing the length of the virtual interleaved + // buffer (len*ch), our current offset within it (p_inter*ch)+(c_inter), + // and the length we'll be using (effective) + if (c_inter + p_inter*ch + effective > len * ch) { + effective = len*ch - (p_inter*ch - c_inter); + } + + #ifdef STB_VORBIS_DIVIDES_IN_CODEBOOK + if (c->lookup_type == 1) { + int div = 1; + for (i=0; i < effective; ++i) { + int off = (z / div) % c->lookup_values; + float val = CODEBOOK_ELEMENT_FAST(c,off) + last; + if (outputs[c_inter]) + outputs[c_inter][p_inter] += val; + if (++c_inter == ch) { c_inter = 0; ++p_inter; } + if (c->sequence_p) last = val; + div *= c->lookup_values; + } + } else + #endif + { + z *= c->dimensions; + if (c->sequence_p) { + for (i=0; i < effective; ++i) { + float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; + if (outputs[c_inter]) + outputs[c_inter][p_inter] += val; + if (++c_inter == ch) { c_inter = 0; ++p_inter; } + last = val; + } + } else { + for (i=0; i < effective; ++i) { + float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; + if (outputs[c_inter]) + outputs[c_inter][p_inter] += val; + if (++c_inter == ch) { c_inter = 0; ++p_inter; } + } + } + } + + total_decode -= effective; + } + *c_inter_p = c_inter; + *p_inter_p = p_inter; + return TRUE; +} + +static int predict_point(int x, int x0, int x1, int y0, int y1) +{ + int dy = y1 - y0; + int adx = x1 - x0; + // @OPTIMIZE: force int division to round in the right direction... is this necessary on x86? + int err = abs(dy) * (x - x0); + int off = err / adx; + return dy < 0 ? y0 - off : y0 + off; +} + +// the following table is block-copied from the specification +static float inverse_db_table[256] = +{ + 1.0649863e-07f, 1.1341951e-07f, 1.2079015e-07f, 1.2863978e-07f, + 1.3699951e-07f, 1.4590251e-07f, 1.5538408e-07f, 1.6548181e-07f, + 1.7623575e-07f, 1.8768855e-07f, 1.9988561e-07f, 2.1287530e-07f, + 2.2670913e-07f, 2.4144197e-07f, 2.5713223e-07f, 2.7384213e-07f, + 2.9163793e-07f, 3.1059021e-07f, 3.3077411e-07f, 3.5226968e-07f, + 3.7516214e-07f, 3.9954229e-07f, 4.2550680e-07f, 4.5315863e-07f, + 4.8260743e-07f, 5.1396998e-07f, 5.4737065e-07f, 5.8294187e-07f, + 6.2082472e-07f, 6.6116941e-07f, 7.0413592e-07f, 7.4989464e-07f, + 7.9862701e-07f, 8.5052630e-07f, 9.0579828e-07f, 9.6466216e-07f, + 1.0273513e-06f, 1.0941144e-06f, 1.1652161e-06f, 1.2409384e-06f, + 1.3215816e-06f, 1.4074654e-06f, 1.4989305e-06f, 1.5963394e-06f, + 1.7000785e-06f, 1.8105592e-06f, 1.9282195e-06f, 2.0535261e-06f, + 2.1869758e-06f, 2.3290978e-06f, 2.4804557e-06f, 2.6416497e-06f, + 2.8133190e-06f, 2.9961443e-06f, 3.1908506e-06f, 3.3982101e-06f, + 3.6190449e-06f, 3.8542308e-06f, 4.1047004e-06f, 4.3714470e-06f, + 4.6555282e-06f, 4.9580707e-06f, 5.2802740e-06f, 5.6234160e-06f, + 5.9888572e-06f, 6.3780469e-06f, 6.7925283e-06f, 7.2339451e-06f, + 7.7040476e-06f, 8.2047000e-06f, 8.7378876e-06f, 9.3057248e-06f, + 9.9104632e-06f, 1.0554501e-05f, 1.1240392e-05f, 1.1970856e-05f, + 1.2748789e-05f, 1.3577278e-05f, 1.4459606e-05f, 1.5399272e-05f, + 1.6400004e-05f, 1.7465768e-05f, 1.8600792e-05f, 1.9809576e-05f, + 2.1096914e-05f, 2.2467911e-05f, 2.3928002e-05f, 2.5482978e-05f, + 2.7139006e-05f, 2.8902651e-05f, 3.0780908e-05f, 3.2781225e-05f, + 3.4911534e-05f, 3.7180282e-05f, 3.9596466e-05f, 4.2169667e-05f, + 4.4910090e-05f, 4.7828601e-05f, 5.0936773e-05f, 5.4246931e-05f, + 5.7772202e-05f, 6.1526565e-05f, 6.5524908e-05f, 6.9783085e-05f, + 7.4317983e-05f, 7.9147585e-05f, 8.4291040e-05f, 8.9768747e-05f, + 9.5602426e-05f, 0.00010181521f, 0.00010843174f, 0.00011547824f, + 0.00012298267f, 0.00013097477f, 0.00013948625f, 0.00014855085f, + 0.00015820453f, 0.00016848555f, 0.00017943469f, 0.00019109536f, + 0.00020351382f, 0.00021673929f, 0.00023082423f, 0.00024582449f, + 0.00026179955f, 0.00027881276f, 0.00029693158f, 0.00031622787f, + 0.00033677814f, 0.00035866388f, 0.00038197188f, 0.00040679456f, + 0.00043323036f, 0.00046138411f, 0.00049136745f, 0.00052329927f, + 0.00055730621f, 0.00059352311f, 0.00063209358f, 0.00067317058f, + 0.00071691700f, 0.00076350630f, 0.00081312324f, 0.00086596457f, + 0.00092223983f, 0.00098217216f, 0.0010459992f, 0.0011139742f, + 0.0011863665f, 0.0012634633f, 0.0013455702f, 0.0014330129f, + 0.0015261382f, 0.0016253153f, 0.0017309374f, 0.0018434235f, + 0.0019632195f, 0.0020908006f, 0.0022266726f, 0.0023713743f, + 0.0025254795f, 0.0026895994f, 0.0028643847f, 0.0030505286f, + 0.0032487691f, 0.0034598925f, 0.0036847358f, 0.0039241906f, + 0.0041792066f, 0.0044507950f, 0.0047400328f, 0.0050480668f, + 0.0053761186f, 0.0057254891f, 0.0060975636f, 0.0064938176f, + 0.0069158225f, 0.0073652516f, 0.0078438871f, 0.0083536271f, + 0.0088964928f, 0.009474637f, 0.010090352f, 0.010746080f, + 0.011444421f, 0.012188144f, 0.012980198f, 0.013823725f, + 0.014722068f, 0.015678791f, 0.016697687f, 0.017782797f, + 0.018938423f, 0.020169149f, 0.021479854f, 0.022875735f, + 0.024362330f, 0.025945531f, 0.027631618f, 0.029427276f, + 0.031339626f, 0.033376252f, 0.035545228f, 0.037855157f, + 0.040315199f, 0.042935108f, 0.045725273f, 0.048696758f, + 0.051861348f, 0.055231591f, 0.058820850f, 0.062643361f, + 0.066714279f, 0.071049749f, 0.075666962f, 0.080584227f, + 0.085821044f, 0.091398179f, 0.097337747f, 0.10366330f, + 0.11039993f, 0.11757434f, 0.12521498f, 0.13335215f, + 0.14201813f, 0.15124727f, 0.16107617f, 0.17154380f, + 0.18269168f, 0.19456402f, 0.20720788f, 0.22067342f, + 0.23501402f, 0.25028656f, 0.26655159f, 0.28387361f, + 0.30232132f, 0.32196786f, 0.34289114f, 0.36517414f, + 0.38890521f, 0.41417847f, 0.44109412f, 0.46975890f, + 0.50028648f, 0.53279791f, 0.56742212f, 0.60429640f, + 0.64356699f, 0.68538959f, 0.72993007f, 0.77736504f, + 0.82788260f, 0.88168307f, 0.9389798f, 1.0f +}; + + +// @OPTIMIZE: if you want to replace this bresenham line-drawing routine, +// note that you must produce bit-identical output to decode correctly; +// this specific sequence of operations is specified in the spec (it's +// drawing integer-quantized frequency-space lines that the encoder +// expects to be exactly the same) +// ... also, isn't the whole point of Bresenham's algorithm to NOT +// have to divide in the setup? sigh. +#ifndef STB_VORBIS_NO_DEFER_FLOOR +#define LINE_OP(a,b) a *= b +#else +#define LINE_OP(a,b) a = b +#endif + +#ifdef STB_VORBIS_DIVIDE_TABLE +#define DIVTAB_NUMER 32 +#define DIVTAB_DENOM 64 +int8 integer_divide_table[DIVTAB_NUMER][DIVTAB_DENOM]; // 2KB +#endif + +static __forceinline void draw_line(float *output, int x0, int y0, int x1, int y1, int n) +{ + int dy = y1 - y0; + int adx = x1 - x0; + int ady = abs(dy); + int base; + int x=x0,y=y0; + int err = 0; + int sy; + +#ifdef STB_VORBIS_DIVIDE_TABLE + if (adx < DIVTAB_DENOM && ady < DIVTAB_NUMER) { + if (dy < 0) { + base = -integer_divide_table[ady][adx]; + sy = base-1; + } else { + base = integer_divide_table[ady][adx]; + sy = base+1; + } + } else { + base = dy / adx; + if (dy < 0) + sy = base - 1; + else + sy = base+1; + } +#else + base = dy / adx; + if (dy < 0) + sy = base - 1; + else + sy = base+1; +#endif + ady -= abs(base) * adx; + if (x1 > n) x1 = n; + if (x < x1) { + LINE_OP(output[x], inverse_db_table[y&255]); + for (++x; x < x1; ++x) { + err += ady; + if (err >= adx) { + err -= adx; + y += sy; + } else + y += base; + LINE_OP(output[x], inverse_db_table[y&255]); + } + } +} + +static int residue_decode(vorb *f, Codebook *book, float *target, int offset, int n, int rtype) +{ + int k; + if (rtype == 0) { + int step = n / book->dimensions; + for (k=0; k < step; ++k) + if (!codebook_decode_step(f, book, target+offset+k, n-offset-k, step)) + return FALSE; + } else { + for (k=0; k < n; ) { + if (!codebook_decode(f, book, target+offset, n-k)) + return FALSE; + k += book->dimensions; + offset += book->dimensions; + } + } + return TRUE; +} + +// n is 1/2 of the blocksize -- +// specification: "Correct per-vector decode length is [n]/2" +static void decode_residue(vorb *f, float *residue_buffers[], int ch, int n, int rn, uint8 *do_not_decode) +{ + int i,j,pass; + Residue *r = f->residue_config + rn; + int rtype = f->residue_types[rn]; + int c = r->classbook; + int classwords = f->codebooks[c].dimensions; + unsigned int actual_size = rtype == 2 ? n*2 : n; + unsigned int limit_r_begin = (r->begin < actual_size ? r->begin : actual_size); + unsigned int limit_r_end = (r->end < actual_size ? r->end : actual_size); + int n_read = limit_r_end - limit_r_begin; + int part_read = n_read / r->part_size; + int temp_alloc_point = temp_alloc_save(f); + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + uint8 ***part_classdata = (uint8 ***) temp_block_array(f,f->channels, part_read * sizeof(**part_classdata)); + #else + int **classifications = (int **) temp_block_array(f,f->channels, part_read * sizeof(**classifications)); + #endif + + CHECK(f); + + for (i=0; i < ch; ++i) + if (!do_not_decode[i]) + memset(residue_buffers[i], 0, sizeof(float) * n); + + if (rtype == 2 && ch != 1) { + for (j=0; j < ch; ++j) + if (!do_not_decode[j]) + break; + if (j == ch) + goto done; + + for (pass=0; pass < 8; ++pass) { + int pcount = 0, class_set = 0; + if (ch == 2) { + while (pcount < part_read) { + int z = r->begin + pcount*r->part_size; + int c_inter = (z & 1), p_inter = z>>1; + if (pass == 0) { + Codebook *c = f->codebooks+r->classbook; + int q; + DECODE(q,f,c); + if (q == EOP) goto done; + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + part_classdata[0][class_set] = r->classdata[q]; + #else + for (i=classwords-1; i >= 0; --i) { + classifications[0][i+pcount] = q % r->classifications; + q /= r->classifications; + } + #endif + } + for (i=0; i < classwords && pcount < part_read; ++i, ++pcount) { + int z = r->begin + pcount*r->part_size; + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + int c = part_classdata[0][class_set][i]; + #else + int c = classifications[0][pcount]; + #endif + int b = r->residue_books[c][pass]; + if (b >= 0) { + Codebook *book = f->codebooks + b; + #ifdef STB_VORBIS_DIVIDES_IN_CODEBOOK + if (!codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r->part_size)) + goto done; + #else + // saves 1% + if (!codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r->part_size)) + goto done; + #endif + } else { + z += r->part_size; + c_inter = z & 1; + p_inter = z >> 1; + } + } + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + ++class_set; + #endif + } + } else if (ch > 2) { + while (pcount < part_read) { + int z = r->begin + pcount*r->part_size; + int c_inter = z % ch, p_inter = z/ch; + if (pass == 0) { + Codebook *c = f->codebooks+r->classbook; + int q; + DECODE(q,f,c); + if (q == EOP) goto done; + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + part_classdata[0][class_set] = r->classdata[q]; + #else + for (i=classwords-1; i >= 0; --i) { + classifications[0][i+pcount] = q % r->classifications; + q /= r->classifications; + } + #endif + } + for (i=0; i < classwords && pcount < part_read; ++i, ++pcount) { + int z = r->begin + pcount*r->part_size; + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + int c = part_classdata[0][class_set][i]; + #else + int c = classifications[0][pcount]; + #endif + int b = r->residue_books[c][pass]; + if (b >= 0) { + Codebook *book = f->codebooks + b; + if (!codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r->part_size)) + goto done; + } else { + z += r->part_size; + c_inter = z % ch; + p_inter = z / ch; + } + } + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + ++class_set; + #endif + } + } + } + goto done; + } + CHECK(f); + + for (pass=0; pass < 8; ++pass) { + int pcount = 0, class_set=0; + while (pcount < part_read) { + if (pass == 0) { + for (j=0; j < ch; ++j) { + if (!do_not_decode[j]) { + Codebook *c = f->codebooks+r->classbook; + int temp; + DECODE(temp,f,c); + if (temp == EOP) goto done; + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + part_classdata[j][class_set] = r->classdata[temp]; + #else + for (i=classwords-1; i >= 0; --i) { + classifications[j][i+pcount] = temp % r->classifications; + temp /= r->classifications; + } + #endif + } + } + } + for (i=0; i < classwords && pcount < part_read; ++i, ++pcount) { + for (j=0; j < ch; ++j) { + if (!do_not_decode[j]) { + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + int c = part_classdata[j][class_set][i]; + #else + int c = classifications[j][pcount]; + #endif + int b = r->residue_books[c][pass]; + if (b >= 0) { + float *target = residue_buffers[j]; + int offset = r->begin + pcount * r->part_size; + int n = r->part_size; + Codebook *book = f->codebooks + b; + if (!residue_decode(f, book, target, offset, n, rtype)) + goto done; + } + } + } + } + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + ++class_set; + #endif + } + } + done: + CHECK(f); + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + temp_free(f,part_classdata); + #else + temp_free(f,classifications); + #endif + temp_alloc_restore(f,temp_alloc_point); +} + + +#if 0 +// slow way for debugging +void inverse_mdct_slow(float *buffer, int n) +{ + int i,j; + int n2 = n >> 1; + float *x = (float *) malloc(sizeof(*x) * n2); + memcpy(x, buffer, sizeof(*x) * n2); + for (i=0; i < n; ++i) { + float acc = 0; + for (j=0; j < n2; ++j) + // formula from paper: + //acc += n/4.0f * x[j] * (float) cos(M_PI / 2 / n * (2 * i + 1 + n/2.0)*(2*j+1)); + // formula from wikipedia + //acc += 2.0f / n2 * x[j] * (float) cos(M_PI/n2 * (i + 0.5 + n2/2)*(j + 0.5)); + // these are equivalent, except the formula from the paper inverts the multiplier! + // however, what actually works is NO MULTIPLIER!?! + //acc += 64 * 2.0f / n2 * x[j] * (float) cos(M_PI/n2 * (i + 0.5 + n2/2)*(j + 0.5)); + acc += x[j] * (float) cos(M_PI / 2 / n * (2 * i + 1 + n/2.0)*(2*j+1)); + buffer[i] = acc; + } + free(x); +} +#elif 0 +// same as above, but just barely able to run in real time on modern machines +void inverse_mdct_slow(float *buffer, int n, vorb *f, int blocktype) +{ + float mcos[16384]; + int i,j; + int n2 = n >> 1, nmask = (n << 2) -1; + float *x = (float *) malloc(sizeof(*x) * n2); + memcpy(x, buffer, sizeof(*x) * n2); + for (i=0; i < 4*n; ++i) + mcos[i] = (float) cos(M_PI / 2 * i / n); + + for (i=0; i < n; ++i) { + float acc = 0; + for (j=0; j < n2; ++j) + acc += x[j] * mcos[(2 * i + 1 + n2)*(2*j+1) & nmask]; + buffer[i] = acc; + } + free(x); +} +#elif 0 +// transform to use a slow dct-iv; this is STILL basically trivial, +// but only requires half as many ops +void dct_iv_slow(float *buffer, int n) +{ + float mcos[16384]; + float x[2048]; + int i,j; + int n2 = n >> 1, nmask = (n << 3) - 1; + memcpy(x, buffer, sizeof(*x) * n); + for (i=0; i < 8*n; ++i) + mcos[i] = (float) cos(M_PI / 4 * i / n); + for (i=0; i < n; ++i) { + float acc = 0; + for (j=0; j < n; ++j) + acc += x[j] * mcos[((2 * i + 1)*(2*j+1)) & nmask]; + buffer[i] = acc; + } +} + +void inverse_mdct_slow(float *buffer, int n, vorb *f, int blocktype) +{ + int i, n4 = n >> 2, n2 = n >> 1, n3_4 = n - n4; + float temp[4096]; + + memcpy(temp, buffer, n2 * sizeof(float)); + dct_iv_slow(temp, n2); // returns -c'-d, a-b' + + for (i=0; i < n4 ; ++i) buffer[i] = temp[i+n4]; // a-b' + for ( ; i < n3_4; ++i) buffer[i] = -temp[n3_4 - i - 1]; // b-a', c+d' + for ( ; i < n ; ++i) buffer[i] = -temp[i - n3_4]; // c'+d +} +#endif + +#ifndef LIBVORBIS_MDCT +#define LIBVORBIS_MDCT 0 +#endif + +#if LIBVORBIS_MDCT +// directly call the vorbis MDCT using an interface documented +// by Jeff Roberts... useful for performance comparison +typedef struct +{ + int n; + int log2n; + + float *trig; + int *bitrev; + + float scale; +} mdct_lookup; + +extern void mdct_init(mdct_lookup *lookup, int n); +extern void mdct_clear(mdct_lookup *l); +extern void mdct_backward(mdct_lookup *init, float *in, float *out); + +mdct_lookup M1,M2; + +void inverse_mdct(float *buffer, int n, vorb *f, int blocktype) +{ + mdct_lookup *M; + if (M1.n == n) M = &M1; + else if (M2.n == n) M = &M2; + else if (M1.n == 0) { mdct_init(&M1, n); M = &M1; } + else { + if (M2.n) __asm int 3; + mdct_init(&M2, n); + M = &M2; + } + + mdct_backward(M, buffer, buffer); +} +#endif + + +// the following were split out into separate functions while optimizing; +// they could be pushed back up but eh. __forceinline showed no change; +// they're probably already being inlined. +static void imdct_step3_iter0_loop(int n, float *e, int i_off, int k_off, float *A) +{ + float *ee0 = e + i_off; + float *ee2 = ee0 + k_off; + int i; + + assert((n & 3) == 0); + for (i=(n>>2); i > 0; --i) { + float k00_20, k01_21; + k00_20 = ee0[ 0] - ee2[ 0]; + k01_21 = ee0[-1] - ee2[-1]; + ee0[ 0] += ee2[ 0];//ee0[ 0] = ee0[ 0] + ee2[ 0]; + ee0[-1] += ee2[-1];//ee0[-1] = ee0[-1] + ee2[-1]; + ee2[ 0] = k00_20 * A[0] - k01_21 * A[1]; + ee2[-1] = k01_21 * A[0] + k00_20 * A[1]; + A += 8; + + k00_20 = ee0[-2] - ee2[-2]; + k01_21 = ee0[-3] - ee2[-3]; + ee0[-2] += ee2[-2];//ee0[-2] = ee0[-2] + ee2[-2]; + ee0[-3] += ee2[-3];//ee0[-3] = ee0[-3] + ee2[-3]; + ee2[-2] = k00_20 * A[0] - k01_21 * A[1]; + ee2[-3] = k01_21 * A[0] + k00_20 * A[1]; + A += 8; + + k00_20 = ee0[-4] - ee2[-4]; + k01_21 = ee0[-5] - ee2[-5]; + ee0[-4] += ee2[-4];//ee0[-4] = ee0[-4] + ee2[-4]; + ee0[-5] += ee2[-5];//ee0[-5] = ee0[-5] + ee2[-5]; + ee2[-4] = k00_20 * A[0] - k01_21 * A[1]; + ee2[-5] = k01_21 * A[0] + k00_20 * A[1]; + A += 8; + + k00_20 = ee0[-6] - ee2[-6]; + k01_21 = ee0[-7] - ee2[-7]; + ee0[-6] += ee2[-6];//ee0[-6] = ee0[-6] + ee2[-6]; + ee0[-7] += ee2[-7];//ee0[-7] = ee0[-7] + ee2[-7]; + ee2[-6] = k00_20 * A[0] - k01_21 * A[1]; + ee2[-7] = k01_21 * A[0] + k00_20 * A[1]; + A += 8; + ee0 -= 8; + ee2 -= 8; + } +} + +static void imdct_step3_inner_r_loop(int lim, float *e, int d0, int k_off, float *A, int k1) +{ + int i; + float k00_20, k01_21; + + float *e0 = e + d0; + float *e2 = e0 + k_off; + + for (i=lim >> 2; i > 0; --i) { + k00_20 = e0[-0] - e2[-0]; + k01_21 = e0[-1] - e2[-1]; + e0[-0] += e2[-0];//e0[-0] = e0[-0] + e2[-0]; + e0[-1] += e2[-1];//e0[-1] = e0[-1] + e2[-1]; + e2[-0] = (k00_20)*A[0] - (k01_21) * A[1]; + e2[-1] = (k01_21)*A[0] + (k00_20) * A[1]; + + A += k1; + + k00_20 = e0[-2] - e2[-2]; + k01_21 = e0[-3] - e2[-3]; + e0[-2] += e2[-2];//e0[-2] = e0[-2] + e2[-2]; + e0[-3] += e2[-3];//e0[-3] = e0[-3] + e2[-3]; + e2[-2] = (k00_20)*A[0] - (k01_21) * A[1]; + e2[-3] = (k01_21)*A[0] + (k00_20) * A[1]; + + A += k1; + + k00_20 = e0[-4] - e2[-4]; + k01_21 = e0[-5] - e2[-5]; + e0[-4] += e2[-4];//e0[-4] = e0[-4] + e2[-4]; + e0[-5] += e2[-5];//e0[-5] = e0[-5] + e2[-5]; + e2[-4] = (k00_20)*A[0] - (k01_21) * A[1]; + e2[-5] = (k01_21)*A[0] + (k00_20) * A[1]; + + A += k1; + + k00_20 = e0[-6] - e2[-6]; + k01_21 = e0[-7] - e2[-7]; + e0[-6] += e2[-6];//e0[-6] = e0[-6] + e2[-6]; + e0[-7] += e2[-7];//e0[-7] = e0[-7] + e2[-7]; + e2[-6] = (k00_20)*A[0] - (k01_21) * A[1]; + e2[-7] = (k01_21)*A[0] + (k00_20) * A[1]; + + e0 -= 8; + e2 -= 8; + + A += k1; + } +} + +static void imdct_step3_inner_s_loop(int n, float *e, int i_off, int k_off, float *A, int a_off, int k0) +{ + int i; + float A0 = A[0]; + float A1 = A[0+1]; + float A2 = A[0+a_off]; + float A3 = A[0+a_off+1]; + float A4 = A[0+a_off*2+0]; + float A5 = A[0+a_off*2+1]; + float A6 = A[0+a_off*3+0]; + float A7 = A[0+a_off*3+1]; + + float k00,k11; + + float *ee0 = e +i_off; + float *ee2 = ee0+k_off; + + for (i=n; i > 0; --i) { + k00 = ee0[ 0] - ee2[ 0]; + k11 = ee0[-1] - ee2[-1]; + ee0[ 0] = ee0[ 0] + ee2[ 0]; + ee0[-1] = ee0[-1] + ee2[-1]; + ee2[ 0] = (k00) * A0 - (k11) * A1; + ee2[-1] = (k11) * A0 + (k00) * A1; + + k00 = ee0[-2] - ee2[-2]; + k11 = ee0[-3] - ee2[-3]; + ee0[-2] = ee0[-2] + ee2[-2]; + ee0[-3] = ee0[-3] + ee2[-3]; + ee2[-2] = (k00) * A2 - (k11) * A3; + ee2[-3] = (k11) * A2 + (k00) * A3; + + k00 = ee0[-4] - ee2[-4]; + k11 = ee0[-5] - ee2[-5]; + ee0[-4] = ee0[-4] + ee2[-4]; + ee0[-5] = ee0[-5] + ee2[-5]; + ee2[-4] = (k00) * A4 - (k11) * A5; + ee2[-5] = (k11) * A4 + (k00) * A5; + + k00 = ee0[-6] - ee2[-6]; + k11 = ee0[-7] - ee2[-7]; + ee0[-6] = ee0[-6] + ee2[-6]; + ee0[-7] = ee0[-7] + ee2[-7]; + ee2[-6] = (k00) * A6 - (k11) * A7; + ee2[-7] = (k11) * A6 + (k00) * A7; + + ee0 -= k0; + ee2 -= k0; + } +} + +static __forceinline void iter_54(float *z) +{ + float k00,k11,k22,k33; + float y0,y1,y2,y3; + + k00 = z[ 0] - z[-4]; + y0 = z[ 0] + z[-4]; + y2 = z[-2] + z[-6]; + k22 = z[-2] - z[-6]; + + z[-0] = y0 + y2; // z0 + z4 + z2 + z6 + z[-2] = y0 - y2; // z0 + z4 - z2 - z6 + + // done with y0,y2 + + k33 = z[-3] - z[-7]; + + z[-4] = k00 + k33; // z0 - z4 + z3 - z7 + z[-6] = k00 - k33; // z0 - z4 - z3 + z7 + + // done with k33 + + k11 = z[-1] - z[-5]; + y1 = z[-1] + z[-5]; + y3 = z[-3] + z[-7]; + + z[-1] = y1 + y3; // z1 + z5 + z3 + z7 + z[-3] = y1 - y3; // z1 + z5 - z3 - z7 + z[-5] = k11 - k22; // z1 - z5 + z2 - z6 + z[-7] = k11 + k22; // z1 - z5 - z2 + z6 +} + +static void imdct_step3_inner_s_loop_ld654(int n, float *e, int i_off, float *A, int base_n) +{ + int a_off = base_n >> 3; + float A2 = A[0+a_off]; + float *z = e + i_off; + float *base = z - 16 * n; + + while (z > base) { + float k00,k11; + float l00,l11; + + k00 = z[-0] - z[ -8]; + k11 = z[-1] - z[ -9]; + l00 = z[-2] - z[-10]; + l11 = z[-3] - z[-11]; + z[ -0] = z[-0] + z[ -8]; + z[ -1] = z[-1] + z[ -9]; + z[ -2] = z[-2] + z[-10]; + z[ -3] = z[-3] + z[-11]; + z[ -8] = k00; + z[ -9] = k11; + z[-10] = (l00+l11) * A2; + z[-11] = (l11-l00) * A2; + + k00 = z[ -4] - z[-12]; + k11 = z[ -5] - z[-13]; + l00 = z[ -6] - z[-14]; + l11 = z[ -7] - z[-15]; + z[ -4] = z[ -4] + z[-12]; + z[ -5] = z[ -5] + z[-13]; + z[ -6] = z[ -6] + z[-14]; + z[ -7] = z[ -7] + z[-15]; + z[-12] = k11; + z[-13] = -k00; + z[-14] = (l11-l00) * A2; + z[-15] = (l00+l11) * -A2; + + iter_54(z); + iter_54(z-8); + z -= 16; + } +} + +static void inverse_mdct(float *buffer, int n, vorb *f, int blocktype) +{ + int n2 = n >> 1, n4 = n >> 2, n8 = n >> 3, l; + int ld; + // @OPTIMIZE: reduce register pressure by using fewer variables? + int save_point = temp_alloc_save(f); + float *buf2 = (float *) temp_alloc(f, n2 * sizeof(*buf2)); + float *u=NULL,*v=NULL; + // twiddle factors + float *A = f->A[blocktype]; + + // IMDCT algorithm from "The use of multirate filter banks for coding of high quality digital audio" + // See notes about bugs in that paper in less-optimal implementation 'inverse_mdct_old' after this function. + + // kernel from paper + + + // merged: + // copy and reflect spectral data + // step 0 + + // note that it turns out that the items added together during + // this step are, in fact, being added to themselves (as reflected + // by step 0). inexplicable inefficiency! this became obvious + // once I combined the passes. + + // so there's a missing 'times 2' here (for adding X to itself). + // this propagates through linearly to the end, where the numbers + // are 1/2 too small, and need to be compensated for. + + { + float *d,*e, *AA, *e_stop; + d = &buf2[n2-2]; + AA = A; + e = &buffer[0]; + e_stop = &buffer[n2]; + while (e != e_stop) { + d[1] = (e[0] * AA[0] - e[2]*AA[1]); + d[0] = (e[0] * AA[1] + e[2]*AA[0]); + d -= 2; + AA += 2; + e += 4; + } + + e = &buffer[n2-3]; + while (d >= buf2) { + d[1] = (-e[2] * AA[0] - -e[0]*AA[1]); + d[0] = (-e[2] * AA[1] + -e[0]*AA[0]); + d -= 2; + AA += 2; + e -= 4; + } + } + + // now we use symbolic names for these, so that we can + // possibly swap their meaning as we change which operations + // are in place + + u = buffer; + v = buf2; + + // step 2 (paper output is w, now u) + // this could be in place, but the data ends up in the wrong + // place... _somebody_'s got to swap it, so this is nominated + { + float *AA = &A[n2-8]; + float *d0,*d1, *e0, *e1; + + e0 = &v[n4]; + e1 = &v[0]; + + d0 = &u[n4]; + d1 = &u[0]; + + while (AA >= A) { + float v40_20, v41_21; + + v41_21 = e0[1] - e1[1]; + v40_20 = e0[0] - e1[0]; + d0[1] = e0[1] + e1[1]; + d0[0] = e0[0] + e1[0]; + d1[1] = v41_21*AA[4] - v40_20*AA[5]; + d1[0] = v40_20*AA[4] + v41_21*AA[5]; + + v41_21 = e0[3] - e1[3]; + v40_20 = e0[2] - e1[2]; + d0[3] = e0[3] + e1[3]; + d0[2] = e0[2] + e1[2]; + d1[3] = v41_21*AA[0] - v40_20*AA[1]; + d1[2] = v40_20*AA[0] + v41_21*AA[1]; + + AA -= 8; + + d0 += 4; + d1 += 4; + e0 += 4; + e1 += 4; + } + } + + // step 3 + ld = ilog(n) - 1; // ilog is off-by-one from normal definitions + + // optimized step 3: + + // the original step3 loop can be nested r inside s or s inside r; + // it's written originally as s inside r, but this is dumb when r + // iterates many times, and s few. So I have two copies of it and + // switch between them halfway. + + // this is iteration 0 of step 3 + imdct_step3_iter0_loop(n >> 4, u, n2-1-n4*0, -(n >> 3), A); + imdct_step3_iter0_loop(n >> 4, u, n2-1-n4*1, -(n >> 3), A); + + // this is iteration 1 of step 3 + imdct_step3_inner_r_loop(n >> 5, u, n2-1 - n8*0, -(n >> 4), A, 16); + imdct_step3_inner_r_loop(n >> 5, u, n2-1 - n8*1, -(n >> 4), A, 16); + imdct_step3_inner_r_loop(n >> 5, u, n2-1 - n8*2, -(n >> 4), A, 16); + imdct_step3_inner_r_loop(n >> 5, u, n2-1 - n8*3, -(n >> 4), A, 16); + + l=2; + for (; l < (ld-3)>>1; ++l) { + int k0 = n >> (l+2), k0_2 = k0>>1; + int lim = 1 << (l+1); + int i; + for (i=0; i < lim; ++i) + imdct_step3_inner_r_loop(n >> (l+4), u, n2-1 - k0*i, -k0_2, A, 1 << (l+3)); + } + + for (; l < ld-6; ++l) { + int k0 = n >> (l+2), k1 = 1 << (l+3), k0_2 = k0>>1; + int rlim = n >> (l+6), r; + int lim = 1 << (l+1); + int i_off; + float *A0 = A; + i_off = n2-1; + for (r=rlim; r > 0; --r) { + imdct_step3_inner_s_loop(lim, u, i_off, -k0_2, A0, k1, k0); + A0 += k1*4; + i_off -= 8; + } + } + + // iterations with count: + // ld-6,-5,-4 all interleaved together + // the big win comes from getting rid of needless flops + // due to the constants on pass 5 & 4 being all 1 and 0; + // combining them to be simultaneous to improve cache made little difference + imdct_step3_inner_s_loop_ld654(n >> 5, u, n2-1, A, n); + + // output is u + + // step 4, 5, and 6 + // cannot be in-place because of step 5 + { + uint16 *bitrev = f->bit_reverse[blocktype]; + // weirdly, I'd have thought reading sequentially and writing + // erratically would have been better than vice-versa, but in + // fact that's not what my testing showed. (That is, with + // j = bitreverse(i), do you read i and write j, or read j and write i.) + + float *d0 = &v[n4-4]; + float *d1 = &v[n2-4]; + while (d0 >= v) { + int k4; + + k4 = bitrev[0]; + d1[3] = u[k4+0]; + d1[2] = u[k4+1]; + d0[3] = u[k4+2]; + d0[2] = u[k4+3]; + + k4 = bitrev[1]; + d1[1] = u[k4+0]; + d1[0] = u[k4+1]; + d0[1] = u[k4+2]; + d0[0] = u[k4+3]; + + d0 -= 4; + d1 -= 4; + bitrev += 2; + } + } + // (paper output is u, now v) + + + // data must be in buf2 + assert(v == buf2); + + // step 7 (paper output is v, now v) + // this is now in place + { + float *C = f->C[blocktype]; + float *d, *e; + + d = v; + e = v + n2 - 4; + + while (d < e) { + float a02,a11,b0,b1,b2,b3; + + a02 = d[0] - e[2]; + a11 = d[1] + e[3]; + + b0 = C[1]*a02 + C[0]*a11; + b1 = C[1]*a11 - C[0]*a02; + + b2 = d[0] + e[ 2]; + b3 = d[1] - e[ 3]; + + d[0] = b2 + b0; + d[1] = b3 + b1; + e[2] = b2 - b0; + e[3] = b1 - b3; + + a02 = d[2] - e[0]; + a11 = d[3] + e[1]; + + b0 = C[3]*a02 + C[2]*a11; + b1 = C[3]*a11 - C[2]*a02; + + b2 = d[2] + e[ 0]; + b3 = d[3] - e[ 1]; + + d[2] = b2 + b0; + d[3] = b3 + b1; + e[0] = b2 - b0; + e[1] = b1 - b3; + + C += 4; + d += 4; + e -= 4; + } + } + + // data must be in buf2 + + + // step 8+decode (paper output is X, now buffer) + // this generates pairs of data a la 8 and pushes them directly through + // the decode kernel (pushing rather than pulling) to avoid having + // to make another pass later + + // this cannot POSSIBLY be in place, so we refer to the buffers directly + + { + float *d0,*d1,*d2,*d3; + + float *B = f->B[blocktype] + n2 - 8; + float *e = buf2 + n2 - 8; + d0 = &buffer[0]; + d1 = &buffer[n2-4]; + d2 = &buffer[n2]; + d3 = &buffer[n-4]; + while (e >= v) { + float p0,p1,p2,p3; + + p3 = e[6]*B[7] - e[7]*B[6]; + p2 = -e[6]*B[6] - e[7]*B[7]; + + d0[0] = p3; + d1[3] = - p3; + d2[0] = p2; + d3[3] = p2; + + p1 = e[4]*B[5] - e[5]*B[4]; + p0 = -e[4]*B[4] - e[5]*B[5]; + + d0[1] = p1; + d1[2] = - p1; + d2[1] = p0; + d3[2] = p0; + + p3 = e[2]*B[3] - e[3]*B[2]; + p2 = -e[2]*B[2] - e[3]*B[3]; + + d0[2] = p3; + d1[1] = - p3; + d2[2] = p2; + d3[1] = p2; + + p1 = e[0]*B[1] - e[1]*B[0]; + p0 = -e[0]*B[0] - e[1]*B[1]; + + d0[3] = p1; + d1[0] = - p1; + d2[3] = p0; + d3[0] = p0; + + B -= 8; + e -= 8; + d0 += 4; + d2 += 4; + d1 -= 4; + d3 -= 4; + } + } + + temp_free(f,buf2); + temp_alloc_restore(f,save_point); +} + +#if 0 +// this is the original version of the above code, if you want to optimize it from scratch +void inverse_mdct_naive(float *buffer, int n) +{ + float s; + float A[1 << 12], B[1 << 12], C[1 << 11]; + int i,k,k2,k4, n2 = n >> 1, n4 = n >> 2, n8 = n >> 3, l; + int n3_4 = n - n4, ld; + // how can they claim this only uses N words?! + // oh, because they're only used sparsely, whoops + float u[1 << 13], X[1 << 13], v[1 << 13], w[1 << 13]; + // set up twiddle factors + + for (k=k2=0; k < n4; ++k,k2+=2) { + A[k2 ] = (float) cos(4*k*M_PI/n); + A[k2+1] = (float) -sin(4*k*M_PI/n); + B[k2 ] = (float) cos((k2+1)*M_PI/n/2); + B[k2+1] = (float) sin((k2+1)*M_PI/n/2); + } + for (k=k2=0; k < n8; ++k,k2+=2) { + C[k2 ] = (float) cos(2*(k2+1)*M_PI/n); + C[k2+1] = (float) -sin(2*(k2+1)*M_PI/n); + } + + // IMDCT algorithm from "The use of multirate filter banks for coding of high quality digital audio" + // Note there are bugs in that pseudocode, presumably due to them attempting + // to rename the arrays nicely rather than representing the way their actual + // implementation bounces buffers back and forth. As a result, even in the + // "some formulars corrected" version, a direct implementation fails. These + // are noted below as "paper bug". + + // copy and reflect spectral data + for (k=0; k < n2; ++k) u[k] = buffer[k]; + for ( ; k < n ; ++k) u[k] = -buffer[n - k - 1]; + // kernel from paper + // step 1 + for (k=k2=k4=0; k < n4; k+=1, k2+=2, k4+=4) { + v[n-k4-1] = (u[k4] - u[n-k4-1]) * A[k2] - (u[k4+2] - u[n-k4-3])*A[k2+1]; + v[n-k4-3] = (u[k4] - u[n-k4-1]) * A[k2+1] + (u[k4+2] - u[n-k4-3])*A[k2]; + } + // step 2 + for (k=k4=0; k < n8; k+=1, k4+=4) { + w[n2+3+k4] = v[n2+3+k4] + v[k4+3]; + w[n2+1+k4] = v[n2+1+k4] + v[k4+1]; + 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]; + 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]; + } + // step 3 + ld = ilog(n) - 1; // ilog is off-by-one from normal definitions + for (l=0; l < ld-3; ++l) { + int k0 = n >> (l+2), k1 = 1 << (l+3); + int rlim = n >> (l+4), r4, r; + int s2lim = 1 << (l+2), s2; + for (r=r4=0; r < rlim; r4+=4,++r) { + for (s2=0; s2 < s2lim; s2+=2) { + u[n-1-k0*s2-r4] = w[n-1-k0*s2-r4] + w[n-1-k0*(s2+1)-r4]; + u[n-3-k0*s2-r4] = w[n-3-k0*s2-r4] + w[n-3-k0*(s2+1)-r4]; + u[n-1-k0*(s2+1)-r4] = (w[n-1-k0*s2-r4] - w[n-1-k0*(s2+1)-r4]) * A[r*k1] + - (w[n-3-k0*s2-r4] - w[n-3-k0*(s2+1)-r4]) * A[r*k1+1]; + u[n-3-k0*(s2+1)-r4] = (w[n-3-k0*s2-r4] - w[n-3-k0*(s2+1)-r4]) * A[r*k1] + + (w[n-1-k0*s2-r4] - w[n-1-k0*(s2+1)-r4]) * A[r*k1+1]; + } + } + if (l+1 < ld-3) { + // paper bug: ping-ponging of u&w here is omitted + memcpy(w, u, sizeof(u)); + } + } + + // step 4 + for (i=0; i < n8; ++i) { + int j = bit_reverse(i) >> (32-ld+3); + assert(j < n8); + if (i == j) { + // paper bug: original code probably swapped in place; if copying, + // need to directly copy in this case + int i8 = i << 3; + v[i8+1] = u[i8+1]; + v[i8+3] = u[i8+3]; + v[i8+5] = u[i8+5]; + v[i8+7] = u[i8+7]; + } else if (i < j) { + int i8 = i << 3, j8 = j << 3; + v[j8+1] = u[i8+1], v[i8+1] = u[j8 + 1]; + v[j8+3] = u[i8+3], v[i8+3] = u[j8 + 3]; + v[j8+5] = u[i8+5], v[i8+5] = u[j8 + 5]; + v[j8+7] = u[i8+7], v[i8+7] = u[j8 + 7]; + } + } + // step 5 + for (k=0; k < n2; ++k) { + w[k] = v[k*2+1]; + } + // step 6 + for (k=k2=k4=0; k < n8; ++k, k2 += 2, k4 += 4) { + u[n-1-k2] = w[k4]; + u[n-2-k2] = w[k4+1]; + u[n3_4 - 1 - k2] = w[k4+2]; + u[n3_4 - 2 - k2] = w[k4+3]; + } + // step 7 + for (k=k2=0; k < n8; ++k, k2 += 2) { + 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; + 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; + 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; + 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; + } + // step 8 + for (k=k2=0; k < n4; ++k,k2 += 2) { + X[k] = v[k2+n2]*B[k2 ] + v[k2+1+n2]*B[k2+1]; + X[n2-1-k] = v[k2+n2]*B[k2+1] - v[k2+1+n2]*B[k2 ]; + } + + // decode kernel to output + // determined the following value experimentally + // (by first figuring out what made inverse_mdct_slow work); then matching that here + // (probably vorbis encoder premultiplies by n or n/2, to save it on the decoder?) + s = 0.5; // theoretically would be n4 + + // [[[ note! the s value of 0.5 is compensated for by the B[] in the current code, + // so it needs to use the "old" B values to behave correctly, or else + // set s to 1.0 ]]] + for (i=0; i < n4 ; ++i) buffer[i] = s * X[i+n4]; + for ( ; i < n3_4; ++i) buffer[i] = -s * X[n3_4 - i - 1]; + for ( ; i < n ; ++i) buffer[i] = -s * X[i - n3_4]; +} +#endif + +static float *get_window(vorb *f, int len) +{ + len <<= 1; + if (len == f->blocksize_0) return f->window[0]; + if (len == f->blocksize_1) return f->window[1]; + return NULL; +} + +#ifndef STB_VORBIS_NO_DEFER_FLOOR +typedef int16 YTYPE; +#else +typedef int YTYPE; +#endif +static int do_floor(vorb *f, Mapping *map, int i, int n, float *target, YTYPE *finalY, uint8 *step2_flag) +{ + int n2 = n >> 1; + int s = map->chan[i].mux, floor; + floor = map->submap_floor[s]; + if (f->floor_types[floor] == 0) { + return error(f, VORBIS_invalid_stream); + } else { + Floor1 *g = &f->floor_config[floor].floor1; + int j,q; + int lx = 0, ly = finalY[0] * g->floor1_multiplier; + for (q=1; q < g->values; ++q) { + j = g->sorted_order[q]; + #ifndef STB_VORBIS_NO_DEFER_FLOOR + STBV_NOTUSED(step2_flag); + if (finalY[j] >= 0) + #else + if (step2_flag[j]) + #endif + { + int hy = finalY[j] * g->floor1_multiplier; + int hx = g->Xlist[j]; + if (lx != hx) + draw_line(target, lx,ly, hx,hy, n2); + CHECK(f); + lx = hx, ly = hy; + } + } + if (lx < n2) { + // optimization of: draw_line(target, lx,ly, n,ly, n2); + for (j=lx; j < n2; ++j) + LINE_OP(target[j], inverse_db_table[ly]); + CHECK(f); + } + } + return TRUE; +} + +// The meaning of "left" and "right" +// +// For a given frame: +// we compute samples from 0..n +// window_center is n/2 +// we'll window and mix the samples from left_start to left_end with data from the previous frame +// all of the samples from left_end to right_start can be output without mixing; however, +// this interval is 0-length except when transitioning between short and long frames +// all of the samples from right_start to right_end need to be mixed with the next frame, +// which we don't have, so those get saved in a buffer +// frame N's right_end-right_start, the number of samples to mix with the next frame, +// has to be the same as frame N+1's left_end-left_start (which they are by +// construction) + +static int vorbis_decode_initial(vorb *f, int *p_left_start, int *p_left_end, int *p_right_start, int *p_right_end, int *mode) +{ + Mode *m; + int i, n, prev, next, window_center; + f->channel_buffer_start = f->channel_buffer_end = 0; + + retry: + if (f->eof) return FALSE; + if (!maybe_start_packet(f)) + return FALSE; + // check packet type + if (get_bits(f,1) != 0) { + if (IS_PUSH_MODE(f)) + return error(f,VORBIS_bad_packet_type); + while (EOP != get8_packet(f)); + goto retry; + } + + if (f->alloc.alloc_buffer) + assert(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset); + + i = get_bits(f, ilog(f->mode_count-1)); + if (i == EOP) return FALSE; + if (i >= f->mode_count) return FALSE; + *mode = i; + m = f->mode_config + i; + if (m->blockflag) { + n = f->blocksize_1; + prev = get_bits(f,1); + next = get_bits(f,1); + } else { + prev = next = 0; + n = f->blocksize_0; + } + +// WINDOWING + + window_center = n >> 1; + if (m->blockflag && !prev) { + *p_left_start = (n - f->blocksize_0) >> 2; + *p_left_end = (n + f->blocksize_0) >> 2; + } else { + *p_left_start = 0; + *p_left_end = window_center; + } + if (m->blockflag && !next) { + *p_right_start = (n*3 - f->blocksize_0) >> 2; + *p_right_end = (n*3 + f->blocksize_0) >> 2; + } else { + *p_right_start = window_center; + *p_right_end = n; + } + + return TRUE; +} + +static int vorbis_decode_packet_rest(vorb *f, int *len, Mode *m, int left_start, int left_end, int right_start, int right_end, int *p_left) +{ + Mapping *map; + int i,j,k,n,n2; + int zero_channel[256]; + int really_zero_channel[256]; + +// WINDOWING + + STBV_NOTUSED(left_end); + n = f->blocksize[m->blockflag]; + map = &f->mapping[m->mapping]; + +// FLOORS + n2 = n >> 1; + + CHECK(f); + + for (i=0; i < f->channels; ++i) { + int s = map->chan[i].mux, floor; + zero_channel[i] = FALSE; + floor = map->submap_floor[s]; + if (f->floor_types[floor] == 0) { + return error(f, VORBIS_invalid_stream); + } else { + Floor1 *g = &f->floor_config[floor].floor1; + if (get_bits(f, 1)) { + short *finalY; + uint8 step2_flag[256]; + static int range_list[4] = { 256, 128, 86, 64 }; + int range = range_list[g->floor1_multiplier-1]; + int offset = 2; + finalY = f->finalY[i]; + finalY[0] = get_bits(f, ilog(range)-1); + finalY[1] = get_bits(f, ilog(range)-1); + for (j=0; j < g->partitions; ++j) { + int pclass = g->partition_class_list[j]; + int cdim = g->class_dimensions[pclass]; + int cbits = g->class_subclasses[pclass]; + int csub = (1 << cbits)-1; + int cval = 0; + if (cbits) { + Codebook *c = f->codebooks + g->class_masterbooks[pclass]; + DECODE(cval,f,c); + } + for (k=0; k < cdim; ++k) { + int book = g->subclass_books[pclass][cval & csub]; + cval = cval >> cbits; + if (book >= 0) { + int temp; + Codebook *c = f->codebooks + book; + DECODE(temp,f,c); + finalY[offset++] = temp; + } else + finalY[offset++] = 0; + } + } + if (f->valid_bits == INVALID_BITS) goto error; // behavior according to spec + step2_flag[0] = step2_flag[1] = 1; + for (j=2; j < g->values; ++j) { + int low, high, pred, highroom, lowroom, room, val; + low = g->neighbors[j][0]; + high = g->neighbors[j][1]; + //neighbors(g->Xlist, j, &low, &high); + pred = predict_point(g->Xlist[j], g->Xlist[low], g->Xlist[high], finalY[low], finalY[high]); + val = finalY[j]; + highroom = range - pred; + lowroom = pred; + if (highroom < lowroom) + room = highroom * 2; + else + room = lowroom * 2; + if (val) { + step2_flag[low] = step2_flag[high] = 1; + step2_flag[j] = 1; + if (val >= room) + if (highroom > lowroom) + finalY[j] = val - lowroom + pred; + else + finalY[j] = pred - val + highroom - 1; + else + if (val & 1) + finalY[j] = pred - ((val+1)>>1); + else + finalY[j] = pred + (val>>1); + } else { + step2_flag[j] = 0; + finalY[j] = pred; + } + } + +#ifdef STB_VORBIS_NO_DEFER_FLOOR + do_floor(f, map, i, n, f->floor_buffers[i], finalY, step2_flag); +#else + // defer final floor computation until _after_ residue + for (j=0; j < g->values; ++j) { + if (!step2_flag[j]) + finalY[j] = -1; + } +#endif + } else { + error: + zero_channel[i] = TRUE; + } + // So we just defer everything else to later + + // at this point we've decoded the floor into buffer + } + } + CHECK(f); + // at this point we've decoded all floors + + if (f->alloc.alloc_buffer) + assert(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset); + + // re-enable coupled channels if necessary + memcpy(really_zero_channel, zero_channel, sizeof(really_zero_channel[0]) * f->channels); + for (i=0; i < map->coupling_steps; ++i) + if (!zero_channel[map->chan[i].magnitude] || !zero_channel[map->chan[i].angle]) { + zero_channel[map->chan[i].magnitude] = zero_channel[map->chan[i].angle] = FALSE; + } + + CHECK(f); +// RESIDUE DECODE + for (i=0; i < map->submaps; ++i) { + float *residue_buffers[STB_VORBIS_MAX_CHANNELS]; + int r; + uint8 do_not_decode[256]; + int ch = 0; + for (j=0; j < f->channels; ++j) { + if (map->chan[j].mux == i) { + if (zero_channel[j]) { + do_not_decode[ch] = TRUE; + residue_buffers[ch] = NULL; + } else { + do_not_decode[ch] = FALSE; + residue_buffers[ch] = f->channel_buffers[j]; + } + ++ch; + } + } + r = map->submap_residue[i]; + decode_residue(f, residue_buffers, ch, n2, r, do_not_decode); + } + + if (f->alloc.alloc_buffer) + assert(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset); + CHECK(f); + +// INVERSE COUPLING + for (i = map->coupling_steps-1; i >= 0; --i) { + int n2 = n >> 1; + float *m = f->channel_buffers[map->chan[i].magnitude]; + float *a = f->channel_buffers[map->chan[i].angle ]; + for (j=0; j < n2; ++j) { + float a2,m2; + if (m[j] > 0) + if (a[j] > 0) + m2 = m[j], a2 = m[j] - a[j]; + else + a2 = m[j], m2 = m[j] + a[j]; + else + if (a[j] > 0) + m2 = m[j], a2 = m[j] + a[j]; + else + a2 = m[j], m2 = m[j] - a[j]; + m[j] = m2; + a[j] = a2; + } + } + CHECK(f); + + // finish decoding the floors +#ifndef STB_VORBIS_NO_DEFER_FLOOR + for (i=0; i < f->channels; ++i) { + if (really_zero_channel[i]) { + memset(f->channel_buffers[i], 0, sizeof(*f->channel_buffers[i]) * n2); + } else { + do_floor(f, map, i, n, f->channel_buffers[i], f->finalY[i], NULL); + } + } +#else + for (i=0; i < f->channels; ++i) { + if (really_zero_channel[i]) { + memset(f->channel_buffers[i], 0, sizeof(*f->channel_buffers[i]) * n2); + } else { + for (j=0; j < n2; ++j) + f->channel_buffers[i][j] *= f->floor_buffers[i][j]; + } + } +#endif + +// INVERSE MDCT + CHECK(f); + for (i=0; i < f->channels; ++i) + inverse_mdct(f->channel_buffers[i], n, f, m->blockflag); + CHECK(f); + + // this shouldn't be necessary, unless we exited on an error + // and want to flush to get to the next packet + flush_packet(f); + + if (f->first_decode) { + // assume we start so first non-discarded sample is sample 0 + // this isn't to spec, but spec would require us to read ahead + // and decode the size of all current frames--could be done, + // but presumably it's not a commonly used feature + f->current_loc = 0u - n2; // start of first frame is positioned for discard (NB this is an intentional unsigned overflow/wrap-around) + // we might have to discard samples "from" the next frame too, + // if we're lapping a large block then a small at the start? + f->discard_samples_deferred = n - right_end; + f->current_loc_valid = TRUE; + f->first_decode = FALSE; + } else if (f->discard_samples_deferred) { + if (f->discard_samples_deferred >= right_start - left_start) { + f->discard_samples_deferred -= (right_start - left_start); + left_start = right_start; + *p_left = left_start; + } else { + left_start += f->discard_samples_deferred; + *p_left = left_start; + f->discard_samples_deferred = 0; + } + } else if (f->previous_length == 0 && f->current_loc_valid) { + // we're recovering from a seek... that means we're going to discard + // the samples from this packet even though we know our position from + // the last page header, so we need to update the position based on + // the discarded samples here + // but wait, the code below is going to add this in itself even + // on a discard, so we don't need to do it here... + } + + // check if we have ogg information about the sample # for this packet + if (f->last_seg_which == f->end_seg_with_known_loc) { + // if we have a valid current loc, and this is final: + if (f->current_loc_valid && (f->page_flag & PAGEFLAG_last_page)) { + uint32 current_end = f->known_loc_for_packet; + // then let's infer the size of the (probably) short final frame + if (current_end < f->current_loc + (right_end-left_start)) { + if (current_end < f->current_loc) { + // negative truncation, that's impossible! + *len = 0; + } else { + *len = current_end - f->current_loc; + } + *len += left_start; // this doesn't seem right, but has no ill effect on my test files + if (*len > right_end) *len = right_end; // this should never happen + f->current_loc += *len; + return TRUE; + } + } + // otherwise, just set our sample loc + // guess that the ogg granule pos refers to the _middle_ of the + // last frame? + // set f->current_loc to the position of left_start + f->current_loc = f->known_loc_for_packet - (n2-left_start); + f->current_loc_valid = TRUE; + } + if (f->current_loc_valid) + f->current_loc += (right_start - left_start); + + if (f->alloc.alloc_buffer) + assert(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset); + *len = right_end; // ignore samples after the window goes to 0 + CHECK(f); + + return TRUE; +} + +static int vorbis_decode_packet(vorb *f, int *len, int *p_left, int *p_right) +{ + int mode, left_end, right_end; + if (!vorbis_decode_initial(f, p_left, &left_end, p_right, &right_end, &mode)) return 0; + return vorbis_decode_packet_rest(f, len, f->mode_config + mode, *p_left, left_end, *p_right, right_end, p_left); +} + +static int vorbis_finish_frame(stb_vorbis *f, int len, int left, int right) +{ + int prev,i,j; + // we use right&left (the start of the right- and left-window sin()-regions) + // to determine how much to return, rather than inferring from the rules + // (same result, clearer code); 'left' indicates where our sin() window + // starts, therefore where the previous window's right edge starts, and + // therefore where to start mixing from the previous buffer. 'right' + // indicates where our sin() ending-window starts, therefore that's where + // we start saving, and where our returned-data ends. + + // mixin from previous window + if (f->previous_length) { + int i,j, n = f->previous_length; + float *w = get_window(f, n); + if (w == NULL) return 0; + for (i=0; i < f->channels; ++i) { + for (j=0; j < n; ++j) + f->channel_buffers[i][left+j] = + f->channel_buffers[i][left+j]*w[ j] + + f->previous_window[i][ j]*w[n-1-j]; + } + } + + prev = f->previous_length; + + // last half of this data becomes previous window + f->previous_length = len - right; + + // @OPTIMIZE: could avoid this copy by double-buffering the + // output (flipping previous_window with channel_buffers), but + // then previous_window would have to be 2x as large, and + // channel_buffers couldn't be temp mem (although they're NOT + // currently temp mem, they could be (unless we want to level + // performance by spreading out the computation)) + for (i=0; i < f->channels; ++i) + for (j=0; right+j < len; ++j) + f->previous_window[i][j] = f->channel_buffers[i][right+j]; + + if (!prev) + // there was no previous packet, so this data isn't valid... + // this isn't entirely true, only the would-have-overlapped data + // isn't valid, but this seems to be what the spec requires + return 0; + + // truncate a short frame + if (len < right) right = len; + + f->samples_output += right-left; + + return right - left; +} + +static int vorbis_pump_first_frame(stb_vorbis *f) +{ + int len, right, left, res; + res = vorbis_decode_packet(f, &len, &left, &right); + if (res) + vorbis_finish_frame(f, len, left, right); + return res; +} + +#ifndef STB_VORBIS_NO_PUSHDATA_API +static int is_whole_packet_present(stb_vorbis *f) +{ + // make sure that we have the packet available before continuing... + // this requires a full ogg parse, but we know we can fetch from f->stream + + // instead of coding this out explicitly, we could save the current read state, + // read the next packet with get8() until end-of-packet, check f->eof, then + // reset the state? but that would be slower, esp. since we'd have over 256 bytes + // of state to restore (primarily the page segment table) + + int s = f->next_seg, first = TRUE; + uint8 *p = f->stream; + + if (s != -1) { // if we're not starting the packet with a 'continue on next page' flag + for (; s < f->segment_count; ++s) { + p += f->segments[s]; + if (f->segments[s] < 255) // stop at first short segment + break; + } + // either this continues, or it ends it... + if (s == f->segment_count) + s = -1; // set 'crosses page' flag + if (p > f->stream_end) return error(f, VORBIS_need_more_data); + first = FALSE; + } + for (; s == -1;) { + uint8 *q; + int n; + + // check that we have the page header ready + if (p + 26 >= f->stream_end) return error(f, VORBIS_need_more_data); + // validate the page + if (memcmp(p, ogg_page_header, 4)) return error(f, VORBIS_invalid_stream); + if (p[4] != 0) return error(f, VORBIS_invalid_stream); + if (first) { // the first segment must NOT have 'continued_packet', later ones MUST + if (f->previous_length) + if ((p[5] & PAGEFLAG_continued_packet)) return error(f, VORBIS_invalid_stream); + // if no previous length, we're resynching, so we can come in on a continued-packet, + // which we'll just drop + } else { + if (!(p[5] & PAGEFLAG_continued_packet)) return error(f, VORBIS_invalid_stream); + } + n = p[26]; // segment counts + q = p+27; // q points to segment table + p = q + n; // advance past header + // make sure we've read the segment table + if (p > f->stream_end) return error(f, VORBIS_need_more_data); + for (s=0; s < n; ++s) { + p += q[s]; + if (q[s] < 255) + break; + } + if (s == n) + s = -1; // set 'crosses page' flag + if (p > f->stream_end) return error(f, VORBIS_need_more_data); + first = FALSE; + } + return TRUE; +} +#endif // !STB_VORBIS_NO_PUSHDATA_API + +static int start_decoder(vorb *f) +{ + uint8 header[6], x,y; + int len,i,j,k, max_submaps = 0; + int longest_floorlist=0; + + // first page, first packet + f->first_decode = TRUE; + + if (!start_page(f)) return FALSE; + // validate page flag + if (!(f->page_flag & PAGEFLAG_first_page)) return error(f, VORBIS_invalid_first_page); + if (f->page_flag & PAGEFLAG_last_page) return error(f, VORBIS_invalid_first_page); + if (f->page_flag & PAGEFLAG_continued_packet) return error(f, VORBIS_invalid_first_page); + // check for expected packet length + if (f->segment_count != 1) return error(f, VORBIS_invalid_first_page); + if (f->segments[0] != 30) { + // check for the Ogg skeleton fishead identifying header to refine our error + if (f->segments[0] == 64 && + getn(f, header, 6) && + header[0] == 'f' && + header[1] == 'i' && + header[2] == 's' && + header[3] == 'h' && + header[4] == 'e' && + header[5] == 'a' && + get8(f) == 'd' && + get8(f) == '\0') return error(f, VORBIS_ogg_skeleton_not_supported); + else + return error(f, VORBIS_invalid_first_page); + } + + // read packet + // check packet header + if (get8(f) != VORBIS_packet_id) return error(f, VORBIS_invalid_first_page); + if (!getn(f, header, 6)) return error(f, VORBIS_unexpected_eof); + if (!vorbis_validate(header)) return error(f, VORBIS_invalid_first_page); + // vorbis_version + if (get32(f) != 0) return error(f, VORBIS_invalid_first_page); + f->channels = get8(f); if (!f->channels) return error(f, VORBIS_invalid_first_page); + if (f->channels > STB_VORBIS_MAX_CHANNELS) return error(f, VORBIS_too_many_channels); + f->sample_rate = get32(f); if (!f->sample_rate) return error(f, VORBIS_invalid_first_page); + get32(f); // bitrate_maximum + get32(f); // bitrate_nominal + get32(f); // bitrate_minimum + x = get8(f); + { + int log0,log1; + log0 = x & 15; + log1 = x >> 4; + f->blocksize_0 = 1 << log0; + f->blocksize_1 = 1 << log1; + if (log0 < 6 || log0 > 13) return error(f, VORBIS_invalid_setup); + if (log1 < 6 || log1 > 13) return error(f, VORBIS_invalid_setup); + if (log0 > log1) return error(f, VORBIS_invalid_setup); + } + + // framing_flag + x = get8(f); + if (!(x & 1)) return error(f, VORBIS_invalid_first_page); + + // second packet! + if (!start_page(f)) return FALSE; + + if (!start_packet(f)) return FALSE; + + if (!next_segment(f)) return FALSE; + + if (get8_packet(f) != VORBIS_packet_comment) return error(f, VORBIS_invalid_setup); + for (i=0; i < 6; ++i) header[i] = get8_packet(f); + if (!vorbis_validate(header)) return error(f, VORBIS_invalid_setup); + //file vendor + len = get32_packet(f); + f->vendor = (char*)setup_malloc(f, sizeof(char) * (len+1)); + if (f->vendor == NULL) return error(f, VORBIS_outofmem); + for(i=0; i < len; ++i) { + f->vendor[i] = get8_packet(f); + } + f->vendor[len] = (char)'\0'; + //user comments + f->comment_list_length = get32_packet(f); + f->comment_list = NULL; + if (f->comment_list_length > 0) + { + f->comment_list = (char**) setup_malloc(f, sizeof(char*) * (f->comment_list_length)); + if (f->comment_list == NULL) return error(f, VORBIS_outofmem); + } + + for(i=0; i < f->comment_list_length; ++i) { + len = get32_packet(f); + f->comment_list[i] = (char*)setup_malloc(f, sizeof(char) * (len+1)); + if (f->comment_list[i] == NULL) return error(f, VORBIS_outofmem); + + for(j=0; j < len; ++j) { + f->comment_list[i][j] = get8_packet(f); + } + f->comment_list[i][len] = (char)'\0'; + } + + // framing_flag + x = get8_packet(f); + if (!(x & 1)) return error(f, VORBIS_invalid_setup); + + + skip(f, f->bytes_in_seg); + f->bytes_in_seg = 0; + + do { + len = next_segment(f); + skip(f, len); + f->bytes_in_seg = 0; + } while (len); + + // third packet! + if (!start_packet(f)) return FALSE; + + #ifndef STB_VORBIS_NO_PUSHDATA_API + if (IS_PUSH_MODE(f)) { + if (!is_whole_packet_present(f)) { + // convert error in ogg header to write type + if (f->error == VORBIS_invalid_stream) + f->error = VORBIS_invalid_setup; + return FALSE; + } + } + #endif + + crc32_init(); // always init it, to avoid multithread race conditions + + if (get8_packet(f) != VORBIS_packet_setup) return error(f, VORBIS_invalid_setup); + for (i=0; i < 6; ++i) header[i] = get8_packet(f); + if (!vorbis_validate(header)) return error(f, VORBIS_invalid_setup); + + // codebooks + + f->codebook_count = get_bits(f,8) + 1; + f->codebooks = (Codebook *) setup_malloc(f, sizeof(*f->codebooks) * f->codebook_count); + if (f->codebooks == NULL) return error(f, VORBIS_outofmem); + memset(f->codebooks, 0, sizeof(*f->codebooks) * f->codebook_count); + for (i=0; i < f->codebook_count; ++i) { + uint32 *values; + int ordered, sorted_count; + int total=0; + uint8 *lengths; + Codebook *c = f->codebooks+i; + CHECK(f); + x = get_bits(f, 8); if (x != 0x42) return error(f, VORBIS_invalid_setup); + x = get_bits(f, 8); if (x != 0x43) return error(f, VORBIS_invalid_setup); + x = get_bits(f, 8); if (x != 0x56) return error(f, VORBIS_invalid_setup); + x = get_bits(f, 8); + c->dimensions = (get_bits(f, 8)<<8) + x; + x = get_bits(f, 8); + y = get_bits(f, 8); + c->entries = (get_bits(f, 8)<<16) + (y<<8) + x; + ordered = get_bits(f,1); + c->sparse = ordered ? 0 : get_bits(f,1); + + if (c->dimensions == 0 && c->entries != 0) return error(f, VORBIS_invalid_setup); + + if (c->sparse) + lengths = (uint8 *) setup_temp_malloc(f, c->entries); + else + lengths = c->codeword_lengths = (uint8 *) setup_malloc(f, c->entries); + + if (!lengths) return error(f, VORBIS_outofmem); + + if (ordered) { + int current_entry = 0; + int current_length = get_bits(f,5) + 1; + while (current_entry < c->entries) { + int limit = c->entries - current_entry; + int n = get_bits(f, ilog(limit)); + if (current_length >= 32) return error(f, VORBIS_invalid_setup); + if (current_entry + n > (int) c->entries) { return error(f, VORBIS_invalid_setup); } + memset(lengths + current_entry, current_length, n); + current_entry += n; + ++current_length; + } + } else { + for (j=0; j < c->entries; ++j) { + int present = c->sparse ? get_bits(f,1) : 1; + if (present) { + lengths[j] = get_bits(f, 5) + 1; + ++total; + if (lengths[j] == 32) + return error(f, VORBIS_invalid_setup); + } else { + lengths[j] = NO_CODE; + } + } + } + + if (c->sparse && total >= c->entries >> 2) { + // convert sparse items to non-sparse! + if (c->entries > (int) f->setup_temp_memory_required) + f->setup_temp_memory_required = c->entries; + + c->codeword_lengths = (uint8 *) setup_malloc(f, c->entries); + if (c->codeword_lengths == NULL) return error(f, VORBIS_outofmem); + memcpy(c->codeword_lengths, lengths, c->entries); + setup_temp_free(f, lengths, c->entries); // note this is only safe if there have been no intervening temp mallocs! + lengths = c->codeword_lengths; + c->sparse = 0; + } + + // compute the size of the sorted tables + if (c->sparse) { + sorted_count = total; + } else { + sorted_count = 0; + #ifndef STB_VORBIS_NO_HUFFMAN_BINARY_SEARCH + for (j=0; j < c->entries; ++j) + if (lengths[j] > STB_VORBIS_FAST_HUFFMAN_LENGTH && lengths[j] != NO_CODE) + ++sorted_count; + #endif + } + + c->sorted_entries = sorted_count; + values = NULL; + + CHECK(f); + if (!c->sparse) { + c->codewords = (uint32 *) setup_malloc(f, sizeof(c->codewords[0]) * c->entries); + if (!c->codewords) return error(f, VORBIS_outofmem); + } else { + unsigned int size; + if (c->sorted_entries) { + c->codeword_lengths = (uint8 *) setup_malloc(f, c->sorted_entries); + if (!c->codeword_lengths) return error(f, VORBIS_outofmem); + c->codewords = (uint32 *) setup_temp_malloc(f, sizeof(*c->codewords) * c->sorted_entries); + if (!c->codewords) return error(f, VORBIS_outofmem); + values = (uint32 *) setup_temp_malloc(f, sizeof(*values) * c->sorted_entries); + if (!values) return error(f, VORBIS_outofmem); + } + size = c->entries + (sizeof(*c->codewords) + sizeof(*values)) * c->sorted_entries; + if (size > f->setup_temp_memory_required) + f->setup_temp_memory_required = size; + } + + if (!compute_codewords(c, lengths, c->entries, values)) { + if (c->sparse) setup_temp_free(f, values, 0); + return error(f, VORBIS_invalid_setup); + } + + if (c->sorted_entries) { + // allocate an extra slot for sentinels + c->sorted_codewords = (uint32 *) setup_malloc(f, sizeof(*c->sorted_codewords) * (c->sorted_entries+1)); + if (c->sorted_codewords == NULL) return error(f, VORBIS_outofmem); + // allocate an extra slot at the front so that c->sorted_values[-1] is defined + // so that we can catch that case without an extra if + c->sorted_values = ( int *) setup_malloc(f, sizeof(*c->sorted_values ) * (c->sorted_entries+1)); + if (c->sorted_values == NULL) return error(f, VORBIS_outofmem); + ++c->sorted_values; + c->sorted_values[-1] = -1; + compute_sorted_huffman(c, lengths, values); + } + + if (c->sparse) { + setup_temp_free(f, values, sizeof(*values)*c->sorted_entries); + setup_temp_free(f, c->codewords, sizeof(*c->codewords)*c->sorted_entries); + setup_temp_free(f, lengths, c->entries); + c->codewords = NULL; + } + + compute_accelerated_huffman(c); + + CHECK(f); + c->lookup_type = get_bits(f, 4); + if (c->lookup_type > 2) return error(f, VORBIS_invalid_setup); + if (c->lookup_type > 0) { + uint16 *mults; + c->minimum_value = float32_unpack(get_bits(f, 32)); + c->delta_value = float32_unpack(get_bits(f, 32)); + c->value_bits = get_bits(f, 4)+1; + c->sequence_p = get_bits(f,1); + if (c->lookup_type == 1) { + int values = lookup1_values(c->entries, c->dimensions); + if (values < 0) return error(f, VORBIS_invalid_setup); + c->lookup_values = (uint32) values; + } else { + c->lookup_values = c->entries * c->dimensions; + } + if (c->lookup_values == 0) return error(f, VORBIS_invalid_setup); + mults = (uint16 *) setup_temp_malloc(f, sizeof(mults[0]) * c->lookup_values); + if (mults == NULL) return error(f, VORBIS_outofmem); + for (j=0; j < (int) c->lookup_values; ++j) { + int q = get_bits(f, c->value_bits); + if (q == EOP) { setup_temp_free(f,mults,sizeof(mults[0])*c->lookup_values); return error(f, VORBIS_invalid_setup); } + mults[j] = q; + } + +#ifndef STB_VORBIS_DIVIDES_IN_CODEBOOK + if (c->lookup_type == 1) { + int len, sparse = c->sparse; + float last=0; + // pre-expand the lookup1-style multiplicands, to avoid a divide in the inner loop + if (sparse) { + if (c->sorted_entries == 0) goto skip; + c->multiplicands = (codetype *) setup_malloc(f, sizeof(c->multiplicands[0]) * c->sorted_entries * c->dimensions); + } else + c->multiplicands = (codetype *) setup_malloc(f, sizeof(c->multiplicands[0]) * c->entries * c->dimensions); + if (c->multiplicands == NULL) { setup_temp_free(f,mults,sizeof(mults[0])*c->lookup_values); return error(f, VORBIS_outofmem); } + len = sparse ? c->sorted_entries : c->entries; + for (j=0; j < len; ++j) { + unsigned int z = sparse ? c->sorted_values[j] : j; + unsigned int div=1; + for (k=0; k < c->dimensions; ++k) { + int off = (z / div) % c->lookup_values; + float val = mults[off]*c->delta_value + c->minimum_value + last; + c->multiplicands[j*c->dimensions + k] = val; + if (c->sequence_p) + last = val; + if (k+1 < c->dimensions) { + if (div > UINT_MAX / (unsigned int) c->lookup_values) { + setup_temp_free(f, mults,sizeof(mults[0])*c->lookup_values); + return error(f, VORBIS_invalid_setup); + } + div *= c->lookup_values; + } + } + } + c->lookup_type = 2; + } + else +#endif + { + float last=0; + CHECK(f); + c->multiplicands = (codetype *) setup_malloc(f, sizeof(c->multiplicands[0]) * c->lookup_values); + if (c->multiplicands == NULL) { setup_temp_free(f, mults,sizeof(mults[0])*c->lookup_values); return error(f, VORBIS_outofmem); } + for (j=0; j < (int) c->lookup_values; ++j) { + float val = mults[j] * c->delta_value + c->minimum_value + last; + c->multiplicands[j] = val; + if (c->sequence_p) + last = val; + } + } +#ifndef STB_VORBIS_DIVIDES_IN_CODEBOOK + skip:; +#endif + setup_temp_free(f, mults, sizeof(mults[0])*c->lookup_values); + + CHECK(f); + } + CHECK(f); + } + + // time domain transfers (notused) + + x = get_bits(f, 6) + 1; + for (i=0; i < x; ++i) { + uint32 z = get_bits(f, 16); + if (z != 0) return error(f, VORBIS_invalid_setup); + } + + // Floors + f->floor_count = get_bits(f, 6)+1; + f->floor_config = (Floor *) setup_malloc(f, f->floor_count * sizeof(*f->floor_config)); + if (f->floor_config == NULL) return error(f, VORBIS_outofmem); + for (i=0; i < f->floor_count; ++i) { + f->floor_types[i] = get_bits(f, 16); + if (f->floor_types[i] > 1) return error(f, VORBIS_invalid_setup); + if (f->floor_types[i] == 0) { + Floor0 *g = &f->floor_config[i].floor0; + g->order = get_bits(f,8); + g->rate = get_bits(f,16); + g->bark_map_size = get_bits(f,16); + g->amplitude_bits = get_bits(f,6); + g->amplitude_offset = get_bits(f,8); + g->number_of_books = get_bits(f,4) + 1; + for (j=0; j < g->number_of_books; ++j) + g->book_list[j] = get_bits(f,8); + return error(f, VORBIS_feature_not_supported); + } else { + stbv__floor_ordering p[31*8+2]; + Floor1 *g = &f->floor_config[i].floor1; + int max_class = -1; + g->partitions = get_bits(f, 5); + for (j=0; j < g->partitions; ++j) { + g->partition_class_list[j] = get_bits(f, 4); + if (g->partition_class_list[j] > max_class) + max_class = g->partition_class_list[j]; + } + for (j=0; j <= max_class; ++j) { + g->class_dimensions[j] = get_bits(f, 3)+1; + g->class_subclasses[j] = get_bits(f, 2); + if (g->class_subclasses[j]) { + g->class_masterbooks[j] = get_bits(f, 8); + if (g->class_masterbooks[j] >= f->codebook_count) return error(f, VORBIS_invalid_setup); + } + for (k=0; k < 1 << g->class_subclasses[j]; ++k) { + g->subclass_books[j][k] = (int16)get_bits(f,8)-1; + if (g->subclass_books[j][k] >= f->codebook_count) return error(f, VORBIS_invalid_setup); + } + } + g->floor1_multiplier = get_bits(f,2)+1; + g->rangebits = get_bits(f,4); + g->Xlist[0] = 0; + g->Xlist[1] = 1 << g->rangebits; + g->values = 2; + for (j=0; j < g->partitions; ++j) { + int c = g->partition_class_list[j]; + for (k=0; k < g->class_dimensions[c]; ++k) { + g->Xlist[g->values] = get_bits(f, g->rangebits); + ++g->values; + } + } + // precompute the sorting + for (j=0; j < g->values; ++j) { + p[j].x = g->Xlist[j]; + p[j].id = j; + } + qsort(p, g->values, sizeof(p[0]), point_compare); + for (j=0; j < g->values-1; ++j) + if (p[j].x == p[j+1].x) + return error(f, VORBIS_invalid_setup); + for (j=0; j < g->values; ++j) + g->sorted_order[j] = (uint8) p[j].id; + // precompute the neighbors + for (j=2; j < g->values; ++j) { + int low = 0,hi = 0; + neighbors(g->Xlist, j, &low,&hi); + g->neighbors[j][0] = low; + g->neighbors[j][1] = hi; + } + + if (g->values > longest_floorlist) + longest_floorlist = g->values; + } + } + + // Residue + f->residue_count = get_bits(f, 6)+1; + f->residue_config = (Residue *) setup_malloc(f, f->residue_count * sizeof(f->residue_config[0])); + if (f->residue_config == NULL) return error(f, VORBIS_outofmem); + memset(f->residue_config, 0, f->residue_count * sizeof(f->residue_config[0])); + for (i=0; i < f->residue_count; ++i) { + uint8 residue_cascade[64]; + Residue *r = f->residue_config+i; + f->residue_types[i] = get_bits(f, 16); + if (f->residue_types[i] > 2) return error(f, VORBIS_invalid_setup); + r->begin = get_bits(f, 24); + r->end = get_bits(f, 24); + if (r->end < r->begin) return error(f, VORBIS_invalid_setup); + r->part_size = get_bits(f,24)+1; + r->classifications = get_bits(f,6)+1; + r->classbook = get_bits(f,8); + if (r->classbook >= f->codebook_count) return error(f, VORBIS_invalid_setup); + for (j=0; j < r->classifications; ++j) { + uint8 high_bits=0; + uint8 low_bits=get_bits(f,3); + if (get_bits(f,1)) + high_bits = get_bits(f,5); + residue_cascade[j] = high_bits*8 + low_bits; + } + r->residue_books = (short (*)[8]) setup_malloc(f, sizeof(r->residue_books[0]) * r->classifications); + if (r->residue_books == NULL) return error(f, VORBIS_outofmem); + for (j=0; j < r->classifications; ++j) { + for (k=0; k < 8; ++k) { + if (residue_cascade[j] & (1 << k)) { + r->residue_books[j][k] = get_bits(f, 8); + if (r->residue_books[j][k] >= f->codebook_count) return error(f, VORBIS_invalid_setup); + } else { + r->residue_books[j][k] = -1; + } + } + } + // precompute the classifications[] array to avoid inner-loop mod/divide + // call it 'classdata' since we already have r->classifications + r->classdata = (uint8 **) setup_malloc(f, sizeof(*r->classdata) * f->codebooks[r->classbook].entries); + if (!r->classdata) return error(f, VORBIS_outofmem); + memset(r->classdata, 0, sizeof(*r->classdata) * f->codebooks[r->classbook].entries); + for (j=0; j < f->codebooks[r->classbook].entries; ++j) { + int classwords = f->codebooks[r->classbook].dimensions; + int temp = j; + r->classdata[j] = (uint8 *) setup_malloc(f, sizeof(r->classdata[j][0]) * classwords); + if (r->classdata[j] == NULL) return error(f, VORBIS_outofmem); + for (k=classwords-1; k >= 0; --k) { + r->classdata[j][k] = temp % r->classifications; + temp /= r->classifications; + } + } + } + + f->mapping_count = get_bits(f,6)+1; + f->mapping = (Mapping *) setup_malloc(f, f->mapping_count * sizeof(*f->mapping)); + if (f->mapping == NULL) return error(f, VORBIS_outofmem); + memset(f->mapping, 0, f->mapping_count * sizeof(*f->mapping)); + for (i=0; i < f->mapping_count; ++i) { + Mapping *m = f->mapping + i; + int mapping_type = get_bits(f,16); + if (mapping_type != 0) return error(f, VORBIS_invalid_setup); + m->chan = (MappingChannel *) setup_malloc(f, f->channels * sizeof(*m->chan)); + if (m->chan == NULL) return error(f, VORBIS_outofmem); + if (get_bits(f,1)) + m->submaps = get_bits(f,4)+1; + else + m->submaps = 1; + if (m->submaps > max_submaps) + max_submaps = m->submaps; + if (get_bits(f,1)) { + m->coupling_steps = get_bits(f,8)+1; + if (m->coupling_steps > f->channels) return error(f, VORBIS_invalid_setup); + for (k=0; k < m->coupling_steps; ++k) { + m->chan[k].magnitude = get_bits(f, ilog(f->channels-1)); + m->chan[k].angle = get_bits(f, ilog(f->channels-1)); + if (m->chan[k].magnitude >= f->channels) return error(f, VORBIS_invalid_setup); + if (m->chan[k].angle >= f->channels) return error(f, VORBIS_invalid_setup); + if (m->chan[k].magnitude == m->chan[k].angle) return error(f, VORBIS_invalid_setup); + } + } else + m->coupling_steps = 0; + + // reserved field + if (get_bits(f,2)) return error(f, VORBIS_invalid_setup); + if (m->submaps > 1) { + for (j=0; j < f->channels; ++j) { + m->chan[j].mux = get_bits(f, 4); + if (m->chan[j].mux >= m->submaps) return error(f, VORBIS_invalid_setup); + } + } else + // @SPECIFICATION: this case is missing from the spec + for (j=0; j < f->channels; ++j) + m->chan[j].mux = 0; + + for (j=0; j < m->submaps; ++j) { + get_bits(f,8); // discard + m->submap_floor[j] = get_bits(f,8); + m->submap_residue[j] = get_bits(f,8); + if (m->submap_floor[j] >= f->floor_count) return error(f, VORBIS_invalid_setup); + if (m->submap_residue[j] >= f->residue_count) return error(f, VORBIS_invalid_setup); + } + } + + // Modes + f->mode_count = get_bits(f, 6)+1; + for (i=0; i < f->mode_count; ++i) { + Mode *m = f->mode_config+i; + m->blockflag = get_bits(f,1); + m->windowtype = get_bits(f,16); + m->transformtype = get_bits(f,16); + m->mapping = get_bits(f,8); + if (m->windowtype != 0) return error(f, VORBIS_invalid_setup); + if (m->transformtype != 0) return error(f, VORBIS_invalid_setup); + if (m->mapping >= f->mapping_count) return error(f, VORBIS_invalid_setup); + } + + flush_packet(f); + + f->previous_length = 0; + + for (i=0; i < f->channels; ++i) { + f->channel_buffers[i] = (float *) setup_malloc(f, sizeof(float) * f->blocksize_1); + f->previous_window[i] = (float *) setup_malloc(f, sizeof(float) * f->blocksize_1/2); + f->finalY[i] = (int16 *) setup_malloc(f, sizeof(int16) * longest_floorlist); + if (f->channel_buffers[i] == NULL || f->previous_window[i] == NULL || f->finalY[i] == NULL) return error(f, VORBIS_outofmem); + memset(f->channel_buffers[i], 0, sizeof(float) * f->blocksize_1); + #ifdef STB_VORBIS_NO_DEFER_FLOOR + f->floor_buffers[i] = (float *) setup_malloc(f, sizeof(float) * f->blocksize_1/2); + if (f->floor_buffers[i] == NULL) return error(f, VORBIS_outofmem); + #endif + } + + if (!init_blocksize(f, 0, f->blocksize_0)) return FALSE; + if (!init_blocksize(f, 1, f->blocksize_1)) return FALSE; + f->blocksize[0] = f->blocksize_0; + f->blocksize[1] = f->blocksize_1; + +#ifdef STB_VORBIS_DIVIDE_TABLE + if (integer_divide_table[1][1]==0) + for (i=0; i < DIVTAB_NUMER; ++i) + for (j=1; j < DIVTAB_DENOM; ++j) + integer_divide_table[i][j] = i / j; +#endif + + // compute how much temporary memory is needed + + // 1. + { + uint32 imdct_mem = (f->blocksize_1 * sizeof(float) >> 1); + uint32 classify_mem; + int i,max_part_read=0; + for (i=0; i < f->residue_count; ++i) { + Residue *r = f->residue_config + i; + unsigned int actual_size = f->blocksize_1 / 2; + unsigned int limit_r_begin = r->begin < actual_size ? r->begin : actual_size; + unsigned int limit_r_end = r->end < actual_size ? r->end : actual_size; + int n_read = limit_r_end - limit_r_begin; + int part_read = n_read / r->part_size; + if (part_read > max_part_read) + max_part_read = part_read; + } + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + classify_mem = f->channels * (sizeof(void*) + max_part_read * sizeof(uint8 *)); + #else + classify_mem = f->channels * (sizeof(void*) + max_part_read * sizeof(int *)); + #endif + + // maximum reasonable partition size is f->blocksize_1 + + f->temp_memory_required = classify_mem; + if (imdct_mem > f->temp_memory_required) + f->temp_memory_required = imdct_mem; + } + + + if (f->alloc.alloc_buffer) { + assert(f->temp_offset == f->alloc.alloc_buffer_length_in_bytes); + // check if there's enough temp memory so we don't error later + if (f->setup_offset + sizeof(*f) + f->temp_memory_required > (unsigned) f->temp_offset) + return error(f, VORBIS_outofmem); + } + + // @TODO: stb_vorbis_seek_start expects first_audio_page_offset to point to a page + // without PAGEFLAG_continued_packet, so this either points to the first page, or + // the page after the end of the headers. It might be cleaner to point to a page + // in the middle of the headers, when that's the page where the first audio packet + // starts, but we'd have to also correctly skip the end of any continued packet in + // stb_vorbis_seek_start. + if (f->next_seg == -1) { + f->first_audio_page_offset = stb_vorbis_get_file_offset(f); + } else { + f->first_audio_page_offset = 0; + } + + return TRUE; +} + +static void vorbis_deinit(stb_vorbis *p) +{ + int i,j; + + setup_free(p, p->vendor); + for (i=0; i < p->comment_list_length; ++i) { + setup_free(p, p->comment_list[i]); + } + setup_free(p, p->comment_list); + + if (p->residue_config) { + for (i=0; i < p->residue_count; ++i) { + Residue *r = p->residue_config+i; + if (r->classdata) { + for (j=0; j < p->codebooks[r->classbook].entries; ++j) + setup_free(p, r->classdata[j]); + setup_free(p, r->classdata); + } + setup_free(p, r->residue_books); + } + } + + if (p->codebooks) { + CHECK(p); + for (i=0; i < p->codebook_count; ++i) { + Codebook *c = p->codebooks + i; + setup_free(p, c->codeword_lengths); + setup_free(p, c->multiplicands); + setup_free(p, c->codewords); + setup_free(p, c->sorted_codewords); + // c->sorted_values[-1] is the first entry in the array + setup_free(p, c->sorted_values ? c->sorted_values-1 : NULL); + } + setup_free(p, p->codebooks); + } + setup_free(p, p->floor_config); + setup_free(p, p->residue_config); + if (p->mapping) { + for (i=0; i < p->mapping_count; ++i) + setup_free(p, p->mapping[i].chan); + setup_free(p, p->mapping); + } + CHECK(p); + for (i=0; i < p->channels && i < STB_VORBIS_MAX_CHANNELS; ++i) { + setup_free(p, p->channel_buffers[i]); + setup_free(p, p->previous_window[i]); + #ifdef STB_VORBIS_NO_DEFER_FLOOR + setup_free(p, p->floor_buffers[i]); + #endif + setup_free(p, p->finalY[i]); + } + for (i=0; i < 2; ++i) { + setup_free(p, p->A[i]); + setup_free(p, p->B[i]); + setup_free(p, p->C[i]); + setup_free(p, p->window[i]); + setup_free(p, p->bit_reverse[i]); + } + #ifndef STB_VORBIS_NO_STDIO + if (p->close_on_free) fclose(p->f); + #endif +} + +void stb_vorbis_close(stb_vorbis *p) +{ + if (p == NULL) return; + vorbis_deinit(p); + setup_free(p,p); +} + +static void vorbis_init(stb_vorbis *p, const stb_vorbis_alloc *z) +{ + memset(p, 0, sizeof(*p)); // NULL out all malloc'd pointers to start + if (z) { + p->alloc = *z; + p->alloc.alloc_buffer_length_in_bytes &= ~7; + p->temp_offset = p->alloc.alloc_buffer_length_in_bytes; + } + p->eof = 0; + p->error = VORBIS__no_error; + p->stream = NULL; + p->codebooks = NULL; + p->page_crc_tests = -1; + #ifndef STB_VORBIS_NO_STDIO + p->close_on_free = FALSE; + p->f = NULL; + #endif +} + +int stb_vorbis_get_sample_offset(stb_vorbis *f) +{ + if (f->current_loc_valid) + return f->current_loc; + else + return -1; +} + +stb_vorbis_info stb_vorbis_get_info(stb_vorbis *f) +{ + stb_vorbis_info d; + d.channels = f->channels; + d.sample_rate = f->sample_rate; + d.setup_memory_required = f->setup_memory_required; + d.setup_temp_memory_required = f->setup_temp_memory_required; + d.temp_memory_required = f->temp_memory_required; + d.max_frame_size = f->blocksize_1 >> 1; + return d; +} + +stb_vorbis_comment stb_vorbis_get_comment(stb_vorbis *f) +{ + stb_vorbis_comment d; + d.vendor = f->vendor; + d.comment_list_length = f->comment_list_length; + d.comment_list = f->comment_list; + return d; +} + +int stb_vorbis_get_error(stb_vorbis *f) +{ + int e = f->error; + f->error = VORBIS__no_error; + return e; +} + +static stb_vorbis * vorbis_alloc(stb_vorbis *f) +{ + stb_vorbis *p = (stb_vorbis *) setup_malloc(f, sizeof(*p)); + return p; +} + +#ifndef STB_VORBIS_NO_PUSHDATA_API + +void stb_vorbis_flush_pushdata(stb_vorbis *f) +{ + f->previous_length = 0; + f->page_crc_tests = 0; + f->discard_samples_deferred = 0; + f->current_loc_valid = FALSE; + f->first_decode = FALSE; + f->samples_output = 0; + f->channel_buffer_start = 0; + f->channel_buffer_end = 0; +} + +static int vorbis_search_for_page_pushdata(vorb *f, uint8 *data, int data_len) +{ + int i,n; + for (i=0; i < f->page_crc_tests; ++i) + f->scan[i].bytes_done = 0; + + // if we have room for more scans, search for them first, because + // they may cause us to stop early if their header is incomplete + if (f->page_crc_tests < STB_VORBIS_PUSHDATA_CRC_COUNT) { + if (data_len < 4) return 0; + data_len -= 3; // need to look for 4-byte sequence, so don't miss + // one that straddles a boundary + for (i=0; i < data_len; ++i) { + if (data[i] == 0x4f) { + if (0==memcmp(data+i, ogg_page_header, 4)) { + int j,len; + uint32 crc; + // make sure we have the whole page header + if (i+26 >= data_len || i+27+data[i+26] >= data_len) { + // only read up to this page start, so hopefully we'll + // have the whole page header start next time + data_len = i; + break; + } + // ok, we have it all; compute the length of the page + len = 27 + data[i+26]; + for (j=0; j < data[i+26]; ++j) + len += data[i+27+j]; + // scan everything up to the embedded crc (which we must 0) + crc = 0; + for (j=0; j < 22; ++j) + crc = crc32_update(crc, data[i+j]); + // now process 4 0-bytes + for ( ; j < 26; ++j) + crc = crc32_update(crc, 0); + // len is the total number of bytes we need to scan + n = f->page_crc_tests++; + f->scan[n].bytes_left = len-j; + f->scan[n].crc_so_far = crc; + f->scan[n].goal_crc = data[i+22] + (data[i+23] << 8) + (data[i+24]<<16) + (data[i+25]<<24); + // if the last frame on a page is continued to the next, then + // we can't recover the sample_loc immediately + if (data[i+27+data[i+26]-1] == 255) + f->scan[n].sample_loc = ~0; + else + f->scan[n].sample_loc = data[i+6] + (data[i+7] << 8) + (data[i+ 8]<<16) + (data[i+ 9]<<24); + f->scan[n].bytes_done = i+j; + if (f->page_crc_tests == STB_VORBIS_PUSHDATA_CRC_COUNT) + break; + // keep going if we still have room for more + } + } + } + } + + for (i=0; i < f->page_crc_tests;) { + uint32 crc; + int j; + int n = f->scan[i].bytes_done; + int m = f->scan[i].bytes_left; + if (m > data_len - n) m = data_len - n; + // m is the bytes to scan in the current chunk + crc = f->scan[i].crc_so_far; + for (j=0; j < m; ++j) + crc = crc32_update(crc, data[n+j]); + f->scan[i].bytes_left -= m; + f->scan[i].crc_so_far = crc; + if (f->scan[i].bytes_left == 0) { + // does it match? + if (f->scan[i].crc_so_far == f->scan[i].goal_crc) { + // Houston, we have page + data_len = n+m; // consumption amount is wherever that scan ended + f->page_crc_tests = -1; // drop out of page scan mode + f->previous_length = 0; // decode-but-don't-output one frame + f->next_seg = -1; // start a new page + f->current_loc = f->scan[i].sample_loc; // set the current sample location + // to the amount we'd have decoded had we decoded this page + f->current_loc_valid = f->current_loc != ~0U; + return data_len; + } + // delete entry + f->scan[i] = f->scan[--f->page_crc_tests]; + } else { + ++i; + } + } + + return data_len; +} + +// return value: number of bytes we used +int stb_vorbis_decode_frame_pushdata( + stb_vorbis *f, // the file we're decoding + const uint8 *data, int data_len, // the memory available for decoding + int *channels, // place to write number of float * buffers + float ***output, // place to write float ** array of float * buffers + int *samples // place to write number of output samples + ) +{ + int i; + int len,right,left; + + if (!IS_PUSH_MODE(f)) return error(f, VORBIS_invalid_api_mixing); + + if (f->page_crc_tests >= 0) { + *samples = 0; + return vorbis_search_for_page_pushdata(f, (uint8 *) data, data_len); + } + + f->stream = (uint8 *) data; + f->stream_end = (uint8 *) data + data_len; + f->error = VORBIS__no_error; + + // check that we have the entire packet in memory + if (!is_whole_packet_present(f)) { + *samples = 0; + return 0; + } + + if (!vorbis_decode_packet(f, &len, &left, &right)) { + // save the actual error we encountered + enum STBVorbisError error = f->error; + if (error == VORBIS_bad_packet_type) { + // flush and resynch + f->error = VORBIS__no_error; + while (get8_packet(f) != EOP) + if (f->eof) break; + *samples = 0; + return (int) (f->stream - data); + } + if (error == VORBIS_continued_packet_flag_invalid) { + if (f->previous_length == 0) { + // we may be resynching, in which case it's ok to hit one + // of these; just discard the packet + f->error = VORBIS__no_error; + while (get8_packet(f) != EOP) + if (f->eof) break; + *samples = 0; + return (int) (f->stream - data); + } + } + // if we get an error while parsing, what to do? + // well, it DEFINITELY won't work to continue from where we are! + stb_vorbis_flush_pushdata(f); + // restore the error that actually made us bail + f->error = error; + *samples = 0; + return 1; + } + + // success! + len = vorbis_finish_frame(f, len, left, right); + for (i=0; i < f->channels; ++i) + f->outputs[i] = f->channel_buffers[i] + left; + + if (channels) *channels = f->channels; + *samples = len; + *output = f->outputs; + return (int) (f->stream - data); +} + +stb_vorbis *stb_vorbis_open_pushdata( + const unsigned char *data, int data_len, // the memory available for decoding + int *data_used, // only defined if result is not NULL + int *error, const stb_vorbis_alloc *alloc) +{ + stb_vorbis *f, p; + vorbis_init(&p, alloc); + p.stream = (uint8 *) data; + p.stream_end = (uint8 *) data + data_len; + p.push_mode = TRUE; + if (!start_decoder(&p)) { + if (p.eof) + *error = VORBIS_need_more_data; + else + *error = p.error; + vorbis_deinit(&p); + return NULL; + } + f = vorbis_alloc(&p); + if (f) { + *f = p; + *data_used = (int) (f->stream - data); + *error = 0; + return f; + } else { + vorbis_deinit(&p); + return NULL; + } +} +#endif // STB_VORBIS_NO_PUSHDATA_API + +unsigned int stb_vorbis_get_file_offset(stb_vorbis *f) +{ + #ifndef STB_VORBIS_NO_PUSHDATA_API + if (f->push_mode) return 0; + #endif + if (USE_MEMORY(f)) return (unsigned int) (f->stream - f->stream_start); + #ifndef STB_VORBIS_NO_STDIO + return (unsigned int) (ftell(f->f) - f->f_start); + #endif +} + +#ifndef STB_VORBIS_NO_PULLDATA_API +// +// DATA-PULLING API +// + +static uint32 vorbis_find_page(stb_vorbis *f, uint32 *end, uint32 *last) +{ + for(;;) { + int n; + if (f->eof) return 0; + n = get8(f); + if (n == 0x4f) { // page header candidate + unsigned int retry_loc = stb_vorbis_get_file_offset(f); + int i; + // check if we're off the end of a file_section stream + if (retry_loc - 25 > f->stream_len) + return 0; + // check the rest of the header + for (i=1; i < 4; ++i) + if (get8(f) != ogg_page_header[i]) + break; + if (f->eof) return 0; + if (i == 4) { + uint8 header[27]; + uint32 i, crc, goal, len; + for (i=0; i < 4; ++i) + header[i] = ogg_page_header[i]; + for (; i < 27; ++i) + header[i] = get8(f); + if (f->eof) return 0; + if (header[4] != 0) goto invalid; + goal = header[22] + (header[23] << 8) + (header[24]<<16) + ((uint32)header[25]<<24); + for (i=22; i < 26; ++i) + header[i] = 0; + crc = 0; + for (i=0; i < 27; ++i) + crc = crc32_update(crc, header[i]); + len = 0; + for (i=0; i < header[26]; ++i) { + int s = get8(f); + crc = crc32_update(crc, s); + len += s; + } + if (len && f->eof) return 0; + for (i=0; i < len; ++i) + crc = crc32_update(crc, get8(f)); + // finished parsing probable page + if (crc == goal) { + // we could now check that it's either got the last + // page flag set, OR it's followed by the capture + // pattern, but I guess TECHNICALLY you could have + // a file with garbage between each ogg page and recover + // from it automatically? So even though that paranoia + // might decrease the chance of an invalid decode by + // another 2^32, not worth it since it would hose those + // invalid-but-useful files? + if (end) + *end = stb_vorbis_get_file_offset(f); + if (last) { + if (header[5] & 0x04) + *last = 1; + else + *last = 0; + } + set_file_offset(f, retry_loc-1); + return 1; + } + } + invalid: + // not a valid page, so rewind and look for next one + set_file_offset(f, retry_loc); + } + } +} + + +#define SAMPLE_unknown 0xffffffff + +// seeking is implemented with a binary search, which narrows down the range to +// 64K, before using a linear search (because finding the synchronization +// pattern can be expensive, and the chance we'd find the end page again is +// relatively high for small ranges) +// +// two initial interpolation-style probes are used at the start of the search +// to try to bound either side of the binary search sensibly, while still +// working in O(log n) time if they fail. + +static int get_seek_page_info(stb_vorbis *f, ProbedPage *z) +{ + uint8 header[27], lacing[255]; + int i,len; + + // record where the page starts + z->page_start = stb_vorbis_get_file_offset(f); + + // parse the header + getn(f, header, 27); + if (header[0] != 'O' || header[1] != 'g' || header[2] != 'g' || header[3] != 'S') + return 0; + getn(f, lacing, header[26]); + + // determine the length of the payload + len = 0; + for (i=0; i < header[26]; ++i) + len += lacing[i]; + + // this implies where the page ends + z->page_end = z->page_start + 27 + header[26] + len; + + // read the last-decoded sample out of the data + z->last_decoded_sample = header[6] + (header[7] << 8) + (header[8] << 16) + (header[9] << 24); + + // restore file state to where we were + set_file_offset(f, z->page_start); + return 1; +} + +// rarely used function to seek back to the preceding page while finding the +// start of a packet +static int go_to_page_before(stb_vorbis *f, unsigned int limit_offset) +{ + unsigned int previous_safe, end; + + // now we want to seek back 64K from the limit + if (limit_offset >= 65536 && limit_offset-65536 >= f->first_audio_page_offset) + previous_safe = limit_offset - 65536; + else + previous_safe = f->first_audio_page_offset; + + set_file_offset(f, previous_safe); + + while (vorbis_find_page(f, &end, NULL)) { + if (end >= limit_offset && stb_vorbis_get_file_offset(f) < limit_offset) + return 1; + set_file_offset(f, end); + } + + return 0; +} + +// implements the search logic for finding a page and starting decoding. if +// the function succeeds, current_loc_valid will be true and current_loc will +// be less than or equal to the provided sample number (the closer the +// better). +static int seek_to_sample_coarse(stb_vorbis *f, uint32 sample_number) +{ + ProbedPage left, right, mid; + int i, start_seg_with_known_loc, end_pos, page_start; + uint32 delta, stream_length, padding, last_sample_limit; + double offset = 0.0, bytes_per_sample = 0.0; + int probe = 0; + + // find the last page and validate the target sample + stream_length = stb_vorbis_stream_length_in_samples(f); + if (stream_length == 0) return error(f, VORBIS_seek_without_length); + if (sample_number > stream_length) return error(f, VORBIS_seek_invalid); + + // this is the maximum difference between the window-center (which is the + // actual granule position value), and the right-start (which the spec + // indicates should be the granule position (give or take one)). + padding = ((f->blocksize_1 - f->blocksize_0) >> 2); + if (sample_number < padding) + last_sample_limit = 0; + else + last_sample_limit = sample_number - padding; + + left = f->p_first; + while (left.last_decoded_sample == ~0U) { + // (untested) the first page does not have a 'last_decoded_sample' + set_file_offset(f, left.page_end); + if (!get_seek_page_info(f, &left)) goto error; + } + + right = f->p_last; + assert(right.last_decoded_sample != ~0U); + + // starting from the start is handled differently + if (last_sample_limit <= left.last_decoded_sample) { + if (stb_vorbis_seek_start(f)) { + if (f->current_loc > sample_number) + return error(f, VORBIS_seek_failed); + return 1; + } + return 0; + } + + while (left.page_end != right.page_start) { + assert(left.page_end < right.page_start); + // search range in bytes + delta = right.page_start - left.page_end; + if (delta <= 65536) { + // there's only 64K left to search - handle it linearly + set_file_offset(f, left.page_end); + } else { + if (probe < 2) { + if (probe == 0) { + // first probe (interpolate) + double data_bytes = right.page_end - left.page_start; + bytes_per_sample = data_bytes / right.last_decoded_sample; + offset = left.page_start + bytes_per_sample * (last_sample_limit - left.last_decoded_sample); + } else { + // second probe (try to bound the other side) + double error = ((double) last_sample_limit - mid.last_decoded_sample) * bytes_per_sample; + if (error >= 0 && error < 8000) error = 8000; + if (error < 0 && error > -8000) error = -8000; + offset += error * 2; + } + + // ensure the offset is valid + if (offset < left.page_end) + offset = left.page_end; + if (offset > right.page_start - 65536) + offset = right.page_start - 65536; + + set_file_offset(f, (unsigned int) offset); + } else { + // binary search for large ranges (offset by 32K to ensure + // we don't hit the right page) + set_file_offset(f, left.page_end + (delta / 2) - 32768); + } + + if (!vorbis_find_page(f, NULL, NULL)) goto error; + } + + for (;;) { + if (!get_seek_page_info(f, &mid)) goto error; + if (mid.last_decoded_sample != ~0U) break; + // (untested) no frames end on this page + set_file_offset(f, mid.page_end); + assert(mid.page_start < right.page_start); + } + + // if we've just found the last page again then we're in a tricky file, + // and we're close enough (if it wasn't an interpolation probe). + if (mid.page_start == right.page_start) { + if (probe >= 2 || delta <= 65536) + break; + } else { + if (last_sample_limit < mid.last_decoded_sample) + right = mid; + else + left = mid; + } + + ++probe; + } + + // seek back to start of the last packet + page_start = left.page_start; + set_file_offset(f, page_start); + if (!start_page(f)) return error(f, VORBIS_seek_failed); + end_pos = f->end_seg_with_known_loc; + assert(end_pos >= 0); + + for (;;) { + for (i = end_pos; i > 0; --i) + if (f->segments[i-1] != 255) + break; + + start_seg_with_known_loc = i; + + if (start_seg_with_known_loc > 0 || !(f->page_flag & PAGEFLAG_continued_packet)) + break; + + // (untested) the final packet begins on an earlier page + if (!go_to_page_before(f, page_start)) + goto error; + + page_start = stb_vorbis_get_file_offset(f); + if (!start_page(f)) goto error; + end_pos = f->segment_count - 1; + } + + // prepare to start decoding + f->current_loc_valid = FALSE; + f->last_seg = FALSE; + f->valid_bits = 0; + f->packet_bytes = 0; + f->bytes_in_seg = 0; + f->previous_length = 0; + f->next_seg = start_seg_with_known_loc; + + for (i = 0; i < start_seg_with_known_loc; i++) + skip(f, f->segments[i]); + + // start decoding (optimizable - this frame is generally discarded) + if (!vorbis_pump_first_frame(f)) + return 0; + if (f->current_loc > sample_number) + return error(f, VORBIS_seek_failed); + return 1; + +error: + // try to restore the file to a valid state + stb_vorbis_seek_start(f); + return error(f, VORBIS_seek_failed); +} + +// the same as vorbis_decode_initial, but without advancing +static int peek_decode_initial(vorb *f, int *p_left_start, int *p_left_end, int *p_right_start, int *p_right_end, int *mode) +{ + int bits_read, bytes_read; + + if (!vorbis_decode_initial(f, p_left_start, p_left_end, p_right_start, p_right_end, mode)) + return 0; + + // either 1 or 2 bytes were read, figure out which so we can rewind + bits_read = 1 + ilog(f->mode_count-1); + if (f->mode_config[*mode].blockflag) + bits_read += 2; + bytes_read = (bits_read + 7) / 8; + + f->bytes_in_seg += bytes_read; + f->packet_bytes -= bytes_read; + skip(f, -bytes_read); + if (f->next_seg == -1) + f->next_seg = f->segment_count - 1; + else + f->next_seg--; + f->valid_bits = 0; + + return 1; +} + +int stb_vorbis_seek_frame(stb_vorbis *f, unsigned int sample_number) +{ + uint32 max_frame_samples; + + if (IS_PUSH_MODE(f)) return error(f, VORBIS_invalid_api_mixing); + + // fast page-level search + if (!seek_to_sample_coarse(f, sample_number)) + return 0; + + assert(f->current_loc_valid); + assert(f->current_loc <= sample_number); + + // linear search for the relevant packet + max_frame_samples = (f->blocksize_1*3 - f->blocksize_0) >> 2; + while (f->current_loc < sample_number) { + int left_start, left_end, right_start, right_end, mode, frame_samples; + if (!peek_decode_initial(f, &left_start, &left_end, &right_start, &right_end, &mode)) + return error(f, VORBIS_seek_failed); + // calculate the number of samples returned by the next frame + frame_samples = right_start - left_start; + if (f->current_loc + frame_samples > sample_number) { + return 1; // the next frame will contain the sample + } else if (f->current_loc + frame_samples + max_frame_samples > sample_number) { + // there's a chance the frame after this could contain the sample + vorbis_pump_first_frame(f); + } else { + // this frame is too early to be relevant + f->current_loc += frame_samples; + f->previous_length = 0; + maybe_start_packet(f); + flush_packet(f); + } + } + // the next frame should start with the sample + if (f->current_loc != sample_number) return error(f, VORBIS_seek_failed); + return 1; +} + +int stb_vorbis_seek(stb_vorbis *f, unsigned int sample_number) +{ + if (!stb_vorbis_seek_frame(f, sample_number)) + return 0; + + if (sample_number != f->current_loc) { + int n; + uint32 frame_start = f->current_loc; + stb_vorbis_get_frame_float(f, &n, NULL); + assert(sample_number > frame_start); + assert(f->channel_buffer_start + (int) (sample_number-frame_start) <= f->channel_buffer_end); + f->channel_buffer_start += (sample_number - frame_start); + } + + return 1; +} + +int stb_vorbis_seek_start(stb_vorbis *f) +{ + if (IS_PUSH_MODE(f)) { return error(f, VORBIS_invalid_api_mixing); } + set_file_offset(f, f->first_audio_page_offset); + f->previous_length = 0; + f->first_decode = TRUE; + f->next_seg = -1; + return vorbis_pump_first_frame(f); +} + +unsigned int stb_vorbis_stream_length_in_samples(stb_vorbis *f) +{ + unsigned int restore_offset, previous_safe; + unsigned int end, last_page_loc; + + if (IS_PUSH_MODE(f)) return error(f, VORBIS_invalid_api_mixing); + if (!f->total_samples) { + unsigned int last; + uint32 lo,hi; + char header[6]; + + // first, store the current decode position so we can restore it + restore_offset = stb_vorbis_get_file_offset(f); + + // now we want to seek back 64K from the end (the last page must + // be at most a little less than 64K, but let's allow a little slop) + if (f->stream_len >= 65536 && f->stream_len-65536 >= f->first_audio_page_offset) + previous_safe = f->stream_len - 65536; + else + previous_safe = f->first_audio_page_offset; + + set_file_offset(f, previous_safe); + // previous_safe is now our candidate 'earliest known place that seeking + // to will lead to the final page' + + if (!vorbis_find_page(f, &end, &last)) { + // if we can't find a page, we're hosed! + f->error = VORBIS_cant_find_last_page; + f->total_samples = 0xffffffff; + goto done; + } + + // check if there are more pages + last_page_loc = stb_vorbis_get_file_offset(f); + + // stop when the last_page flag is set, not when we reach eof; + // this allows us to stop short of a 'file_section' end without + // explicitly checking the length of the section + while (!last) { + set_file_offset(f, end); + if (!vorbis_find_page(f, &end, &last)) { + // the last page we found didn't have the 'last page' flag + // set. whoops! + break; + } + //previous_safe = last_page_loc+1; // NOTE: not used after this point, but note for debugging + last_page_loc = stb_vorbis_get_file_offset(f); + } + + set_file_offset(f, last_page_loc); + + // parse the header + getn(f, (unsigned char *)header, 6); + // extract the absolute granule position + lo = get32(f); + hi = get32(f); + if (lo == 0xffffffff && hi == 0xffffffff) { + f->error = VORBIS_cant_find_last_page; + f->total_samples = SAMPLE_unknown; + goto done; + } + if (hi) + lo = 0xfffffffe; // saturate + f->total_samples = lo; + + f->p_last.page_start = last_page_loc; + f->p_last.page_end = end; + f->p_last.last_decoded_sample = lo; + + done: + set_file_offset(f, restore_offset); + } + return f->total_samples == SAMPLE_unknown ? 0 : f->total_samples; +} + +float stb_vorbis_stream_length_in_seconds(stb_vorbis *f) +{ + return stb_vorbis_stream_length_in_samples(f) / (float) f->sample_rate; +} + + + +int stb_vorbis_get_frame_float(stb_vorbis *f, int *channels, float ***output) +{ + int len, right,left,i; + if (IS_PUSH_MODE(f)) return error(f, VORBIS_invalid_api_mixing); + + if (!vorbis_decode_packet(f, &len, &left, &right)) { + f->channel_buffer_start = f->channel_buffer_end = 0; + return 0; + } + + len = vorbis_finish_frame(f, len, left, right); + for (i=0; i < f->channels; ++i) + f->outputs[i] = f->channel_buffers[i] + left; + + f->channel_buffer_start = left; + f->channel_buffer_end = left+len; + + if (channels) *channels = f->channels; + if (output) *output = f->outputs; + return len; +} + +#ifndef STB_VORBIS_NO_STDIO + +stb_vorbis * stb_vorbis_open_file_section(FILE *file, int close_on_free, int *error, const stb_vorbis_alloc *alloc, unsigned int length) +{ + stb_vorbis *f, p; + vorbis_init(&p, alloc); + p.f = file; + p.f_start = (uint32) ftell(file); + p.stream_len = length; + p.close_on_free = close_on_free; + if (start_decoder(&p)) { + f = vorbis_alloc(&p); + if (f) { + *f = p; + vorbis_pump_first_frame(f); + return f; + } + } + if (error) *error = p.error; + vorbis_deinit(&p); + return NULL; +} + +stb_vorbis * stb_vorbis_open_file(FILE *file, int close_on_free, int *error, const stb_vorbis_alloc *alloc) +{ + unsigned int len, start; + start = (unsigned int) ftell(file); + fseek(file, 0, SEEK_END); + len = (unsigned int) (ftell(file) - start); + fseek(file, start, SEEK_SET); + return stb_vorbis_open_file_section(file, close_on_free, error, alloc, len); +} + +stb_vorbis * stb_vorbis_open_filename(const char *filename, int *error, const stb_vorbis_alloc *alloc) +{ + FILE *f; +#if defined(_WIN32) && defined(__STDC_WANT_SECURE_LIB__) + if (0 != fopen_s(&f, filename, "rb")) + f = NULL; +#else + f = fopen(filename, "rb"); +#endif + if (f) + return stb_vorbis_open_file(f, TRUE, error, alloc); + if (error) *error = VORBIS_file_open_failure; + return NULL; +} +#endif // STB_VORBIS_NO_STDIO + +stb_vorbis * stb_vorbis_open_memory(const unsigned char *data, int len, int *error, const stb_vorbis_alloc *alloc) +{ + stb_vorbis *f, p; + if (!data) { + if (error) *error = VORBIS_unexpected_eof; + return NULL; + } + vorbis_init(&p, alloc); + p.stream = (uint8 *) data; + p.stream_end = (uint8 *) data + len; + p.stream_start = (uint8 *) p.stream; + p.stream_len = len; + p.push_mode = FALSE; + if (start_decoder(&p)) { + f = vorbis_alloc(&p); + if (f) { + *f = p; + vorbis_pump_first_frame(f); + if (error) *error = VORBIS__no_error; + return f; + } + } + if (error) *error = p.error; + vorbis_deinit(&p); + return NULL; +} + +#ifndef STB_VORBIS_NO_INTEGER_CONVERSION +#define PLAYBACK_MONO 1 +#define PLAYBACK_LEFT 2 +#define PLAYBACK_RIGHT 4 + +#define L (PLAYBACK_LEFT | PLAYBACK_MONO) +#define C (PLAYBACK_LEFT | PLAYBACK_RIGHT | PLAYBACK_MONO) +#define R (PLAYBACK_RIGHT | PLAYBACK_MONO) + +static int8 channel_position[7][6] = +{ + { 0 }, + { C }, + { L, R }, + { L, C, R }, + { L, R, L, R }, + { L, C, R, L, R }, + { L, C, R, L, R, C }, +}; + + +#ifndef STB_VORBIS_NO_FAST_SCALED_FLOAT + typedef union { + float f; + int i; + } float_conv; + typedef char stb_vorbis_float_size_test[sizeof(float)==4 && sizeof(int) == 4]; + #define FASTDEF(x) float_conv x + // add (1<<23) to convert to int, then divide by 2^SHIFT, then add 0.5/2^SHIFT to round + #define MAGIC(SHIFT) (1.5f * (1 << (23-SHIFT)) + 0.5f/(1 << SHIFT)) + #define ADDEND(SHIFT) (((150-SHIFT) << 23) + (1 << 22)) + #define FAST_SCALED_FLOAT_TO_INT(temp,x,s) (temp.f = (x) + MAGIC(s), temp.i - ADDEND(s)) + #define check_endianness() +#else + #define FAST_SCALED_FLOAT_TO_INT(temp,x,s) ((int) ((x) * (1 << (s)))) + #define check_endianness() + #define FASTDEF(x) +#endif + +static void copy_samples(short *dest, float *src, int len) +{ + int i; + check_endianness(); + for (i=0; i < len; ++i) { + FASTDEF(temp); + int v = FAST_SCALED_FLOAT_TO_INT(temp, src[i],15); + if ((unsigned int) (v + 32768) > 65535) + v = v < 0 ? -32768 : 32767; + dest[i] = v; + } +} + +static void compute_samples(int mask, short *output, int num_c, float **data, int d_offset, int len) +{ + #define STB_BUFFER_SIZE 32 + float buffer[STB_BUFFER_SIZE]; + int i,j,o,n = STB_BUFFER_SIZE; + check_endianness(); + for (o = 0; o < len; o += STB_BUFFER_SIZE) { + memset(buffer, 0, sizeof(buffer)); + if (o + n > len) n = len - o; + for (j=0; j < num_c; ++j) { + if (channel_position[num_c][j] & mask) { + for (i=0; i < n; ++i) + buffer[i] += data[j][d_offset+o+i]; + } + } + for (i=0; i < n; ++i) { + FASTDEF(temp); + int v = FAST_SCALED_FLOAT_TO_INT(temp,buffer[i],15); + if ((unsigned int) (v + 32768) > 65535) + v = v < 0 ? -32768 : 32767; + output[o+i] = v; + } + } + #undef STB_BUFFER_SIZE +} + +static void compute_stereo_samples(short *output, int num_c, float **data, int d_offset, int len) +{ + #define STB_BUFFER_SIZE 32 + float buffer[STB_BUFFER_SIZE]; + int i,j,o,n = STB_BUFFER_SIZE >> 1; + // o is the offset in the source data + check_endianness(); + for (o = 0; o < len; o += STB_BUFFER_SIZE >> 1) { + // o2 is the offset in the output data + int o2 = o << 1; + memset(buffer, 0, sizeof(buffer)); + if (o + n > len) n = len - o; + for (j=0; j < num_c; ++j) { + int m = channel_position[num_c][j] & (PLAYBACK_LEFT | PLAYBACK_RIGHT); + if (m == (PLAYBACK_LEFT | PLAYBACK_RIGHT)) { + for (i=0; i < n; ++i) { + buffer[i*2+0] += data[j][d_offset+o+i]; + buffer[i*2+1] += data[j][d_offset+o+i]; + } + } else if (m == PLAYBACK_LEFT) { + for (i=0; i < n; ++i) { + buffer[i*2+0] += data[j][d_offset+o+i]; + } + } else if (m == PLAYBACK_RIGHT) { + for (i=0; i < n; ++i) { + buffer[i*2+1] += data[j][d_offset+o+i]; + } + } + } + for (i=0; i < (n<<1); ++i) { + FASTDEF(temp); + int v = FAST_SCALED_FLOAT_TO_INT(temp,buffer[i],15); + if ((unsigned int) (v + 32768) > 65535) + v = v < 0 ? -32768 : 32767; + output[o2+i] = v; + } + } + #undef STB_BUFFER_SIZE +} + +static void convert_samples_short(int buf_c, short **buffer, int b_offset, int data_c, float **data, int d_offset, int samples) +{ + int i; + if (buf_c != data_c && buf_c <= 2 && data_c <= 6) { + static int channel_selector[3][2] = { {0}, {PLAYBACK_MONO}, {PLAYBACK_LEFT, PLAYBACK_RIGHT} }; + for (i=0; i < buf_c; ++i) + compute_samples(channel_selector[buf_c][i], buffer[i]+b_offset, data_c, data, d_offset, samples); + } else { + int limit = buf_c < data_c ? buf_c : data_c; + for (i=0; i < limit; ++i) + copy_samples(buffer[i]+b_offset, data[i]+d_offset, samples); + for ( ; i < buf_c; ++i) + memset(buffer[i]+b_offset, 0, sizeof(short) * samples); + } +} + +int stb_vorbis_get_frame_short(stb_vorbis *f, int num_c, short **buffer, int num_samples) +{ + float **output = NULL; + int len = stb_vorbis_get_frame_float(f, NULL, &output); + if (len > num_samples) len = num_samples; + if (len) + convert_samples_short(num_c, buffer, 0, f->channels, output, 0, len); + return len; +} + +static void convert_channels_short_interleaved(int buf_c, short *buffer, int data_c, float **data, int d_offset, int len) +{ + int i; + check_endianness(); + if (buf_c != data_c && buf_c <= 2 && data_c <= 6) { + assert(buf_c == 2); + for (i=0; i < buf_c; ++i) + compute_stereo_samples(buffer, data_c, data, d_offset, len); + } else { + int limit = buf_c < data_c ? buf_c : data_c; + int j; + for (j=0; j < len; ++j) { + for (i=0; i < limit; ++i) { + FASTDEF(temp); + float f = data[i][d_offset+j]; + int v = FAST_SCALED_FLOAT_TO_INT(temp, f,15);//data[i][d_offset+j],15); + if ((unsigned int) (v + 32768) > 65535) + v = v < 0 ? -32768 : 32767; + *buffer++ = v; + } + for ( ; i < buf_c; ++i) + *buffer++ = 0; + } + } +} + +int stb_vorbis_get_frame_short_interleaved(stb_vorbis *f, int num_c, short *buffer, int num_shorts) +{ + float **output; + int len; + if (num_c == 1) return stb_vorbis_get_frame_short(f,num_c,&buffer, num_shorts); + len = stb_vorbis_get_frame_float(f, NULL, &output); + if (len) { + if (len*num_c > num_shorts) len = num_shorts / num_c; + convert_channels_short_interleaved(num_c, buffer, f->channels, output, 0, len); + } + return len; +} + +int stb_vorbis_get_samples_short_interleaved(stb_vorbis *f, int channels, short *buffer, int num_shorts) +{ + float **outputs; + int len = num_shorts / channels; + int n=0; + while (n < len) { + int k = f->channel_buffer_end - f->channel_buffer_start; + if (n+k >= len) k = len - n; + if (k) + convert_channels_short_interleaved(channels, buffer, f->channels, f->channel_buffers, f->channel_buffer_start, k); + buffer += k*channels; + n += k; + f->channel_buffer_start += k; + if (n == len) break; + if (!stb_vorbis_get_frame_float(f, NULL, &outputs)) break; + } + return n; +} + +int stb_vorbis_get_samples_short(stb_vorbis *f, int channels, short **buffer, int len) +{ + float **outputs; + int n=0; + while (n < len) { + int k = f->channel_buffer_end - f->channel_buffer_start; + if (n+k >= len) k = len - n; + if (k) + convert_samples_short(channels, buffer, n, f->channels, f->channel_buffers, f->channel_buffer_start, k); + n += k; + f->channel_buffer_start += k; + if (n == len) break; + if (!stb_vorbis_get_frame_float(f, NULL, &outputs)) break; + } + return n; +} + +#ifndef STB_VORBIS_NO_STDIO +int stb_vorbis_decode_filename(const char *filename, int *channels, int *sample_rate, short **output) +{ + int data_len, offset, total, limit, error; + short *data; + stb_vorbis *v = stb_vorbis_open_filename(filename, &error, NULL); + if (v == NULL) return -1; + limit = v->channels * 4096; + *channels = v->channels; + if (sample_rate) + *sample_rate = v->sample_rate; + offset = data_len = 0; + total = limit; + data = (short *) malloc(total * sizeof(*data)); + if (data == NULL) { + stb_vorbis_close(v); + return -2; + } + for (;;) { + int n = stb_vorbis_get_frame_short_interleaved(v, v->channels, data+offset, total-offset); + if (n == 0) break; + data_len += n; + offset += n * v->channels; + if (offset + limit > total) { + short *data2; + total *= 2; + data2 = (short *) realloc(data, total * sizeof(*data)); + if (data2 == NULL) { + free(data); + stb_vorbis_close(v); + return -2; + } + data = data2; + } + } + *output = data; + stb_vorbis_close(v); + return data_len; +} +#endif // NO_STDIO + +int stb_vorbis_decode_memory(const uint8 *mem, int len, int *channels, int *sample_rate, short **output) +{ + int data_len, offset, total, limit, error; + short *data; + stb_vorbis *v = stb_vorbis_open_memory(mem, len, &error, NULL); + if (v == NULL) return -1; + limit = v->channels * 4096; + *channels = v->channels; + if (sample_rate) + *sample_rate = v->sample_rate; + offset = data_len = 0; + total = limit; + data = (short *) malloc(total * sizeof(*data)); + if (data == NULL) { + stb_vorbis_close(v); + return -2; + } + for (;;) { + int n = stb_vorbis_get_frame_short_interleaved(v, v->channels, data+offset, total-offset); + if (n == 0) break; + data_len += n; + offset += n * v->channels; + if (offset + limit > total) { + short *data2; + total *= 2; + data2 = (short *) realloc(data, total * sizeof(*data)); + if (data2 == NULL) { + free(data); + stb_vorbis_close(v); + return -2; + } + data = data2; + } + } + *output = data; + stb_vorbis_close(v); + return data_len; +} +#endif // STB_VORBIS_NO_INTEGER_CONVERSION + +int stb_vorbis_get_samples_float_interleaved(stb_vorbis *f, int channels, float *buffer, int num_floats) +{ + float **outputs; + int len = num_floats / channels; + int n=0; + int z = f->channels; + if (z > channels) z = channels; + while (n < len) { + int i,j; + int k = f->channel_buffer_end - f->channel_buffer_start; + if (n+k >= len) k = len - n; + for (j=0; j < k; ++j) { + for (i=0; i < z; ++i) + *buffer++ = f->channel_buffers[i][f->channel_buffer_start+j]; + for ( ; i < channels; ++i) + *buffer++ = 0; + } + n += k; + f->channel_buffer_start += k; + if (n == len) + break; + if (!stb_vorbis_get_frame_float(f, NULL, &outputs)) + break; + } + return n; +} + +int stb_vorbis_get_samples_float(stb_vorbis *f, int channels, float **buffer, int num_samples) +{ + float **outputs; + int n=0; + int z = f->channels; + if (z > channels) z = channels; + while (n < num_samples) { + int i; + int k = f->channel_buffer_end - f->channel_buffer_start; + if (n+k >= num_samples) k = num_samples - n; + if (k) { + for (i=0; i < z; ++i) + memcpy(buffer[i]+n, f->channel_buffers[i]+f->channel_buffer_start, sizeof(float)*k); + for ( ; i < channels; ++i) + memset(buffer[i]+n, 0, sizeof(float) * k); + } + n += k; + f->channel_buffer_start += k; + if (n == num_samples) + break; + if (!stb_vorbis_get_frame_float(f, NULL, &outputs)) + break; + } + return n; +} +#endif // STB_VORBIS_NO_PULLDATA_API + +/* Version history + 1.17 - 2019-07-08 - fix CVE-2019-13217, -13218, -13219, -13220, -13221, -13222, -13223 + found with Mayhem by ForAllSecure + 1.16 - 2019-03-04 - fix warnings + 1.15 - 2019-02-07 - explicit failure if Ogg Skeleton data is found + 1.14 - 2018-02-11 - delete bogus dealloca usage + 1.13 - 2018-01-29 - fix truncation of last frame (hopefully) + 1.12 - 2017-11-21 - limit residue begin/end to blocksize/2 to avoid large temp allocs in bad/corrupt files + 1.11 - 2017-07-23 - fix MinGW compilation + 1.10 - 2017-03-03 - more robust seeking; fix negative ilog(); clear error in open_memory + 1.09 - 2016-04-04 - back out 'avoid discarding last frame' fix from previous version + 1.08 - 2016-04-02 - fixed multiple warnings; fix setup memory leaks; + avoid discarding last frame of audio data + 1.07 - 2015-01-16 - fixed some warnings, fix mingw, const-correct API + some more crash fixes when out of memory or with corrupt files + 1.06 - 2015-08-31 - full, correct support for seeking API (Dougall Johnson) + some crash fixes when out of memory or with corrupt files + 1.05 - 2015-04-19 - don't define __forceinline if it's redundant + 1.04 - 2014-08-27 - fix missing const-correct case in API + 1.03 - 2014-08-07 - Warning fixes + 1.02 - 2014-07-09 - Declare qsort compare function _cdecl on windows + 1.01 - 2014-06-18 - fix stb_vorbis_get_samples_float + 1.0 - 2014-05-26 - fix memory leaks; fix warnings; fix bugs in multichannel + (API change) report sample rate for decode-full-file funcs + 0.99996 - bracket #include for macintosh compilation by Laurent Gomila + 0.99995 - use union instead of pointer-cast for fast-float-to-int to avoid alias-optimization problem + 0.99994 - change fast-float-to-int to work in single-precision FPU mode, remove endian-dependence + 0.99993 - remove assert that fired on legal files with empty tables + 0.99992 - rewind-to-start + 0.99991 - bugfix to stb_vorbis_get_samples_short by Bernhard Wodo + 0.9999 - (should have been 0.99990) fix no-CRT support, compiling as C++ + 0.9998 - add a full-decode function with a memory source + 0.9997 - fix a bug in the read-from-FILE case in 0.9996 addition + 0.9996 - query length of vorbis stream in samples/seconds + 0.9995 - bugfix to another optimization that only happened in certain files + 0.9994 - bugfix to one of the optimizations that caused significant (but inaudible?) errors + 0.9993 - performance improvements; runs in 99% to 104% of time of reference implementation + 0.9992 - performance improvement of IMDCT; now performs close to reference implementation + 0.9991 - performance improvement of IMDCT + 0.999 - (should have been 0.9990) performance improvement of IMDCT + 0.998 - no-CRT support from Casey Muratori + 0.997 - bugfixes for bugs found by Terje Mathisen + 0.996 - bugfix: fast-huffman decode initialized incorrectly for sparse codebooks; fixing gives 10% speedup - found by Terje Mathisen + 0.995 - bugfix: fix to 'effective' overrun detection - found by Terje Mathisen + 0.994 - bugfix: garbage decode on final VQ symbol of a non-multiple - found by Terje Mathisen + 0.993 - bugfix: pushdata API required 1 extra byte for empty page (failed to consume final page if empty) - found by Terje Mathisen + 0.992 - fixes for MinGW warning + 0.991 - turn fast-float-conversion on by default + 0.990 - fix push-mode seek recovery if you seek into the headers + 0.98b - fix to bad release of 0.98 + 0.98 - fix push-mode seek recovery; robustify float-to-int and support non-fast mode + 0.97 - builds under c++ (typecasting, don't use 'class' keyword) + 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 + 0.95 - clamping code for 16-bit functions + 0.94 - not publically released + 0.93 - fixed all-zero-floor case (was decoding garbage) + 0.92 - fixed a memory leak + 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 + 0.90 - first public release +*/ + +#endif // STB_VORBIS_HEADER_ONLY + + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/systemstub_sdl.cpp b/systemstub_sdl.cpp index a41e92f..78fd8de 100644 --- a/systemstub_sdl.cpp +++ b/systemstub_sdl.cpp @@ -608,6 +608,7 @@ void SystemStub_SDL::processEvent(const SDL_Event &ev, bool &paused) { _pi.quit = true; break; case SDL_WINDOWEVENT: + #if !defined(__amigaos4__) switch (ev.window.event) { case SDL_WINDOWEVENT_FOCUS_GAINED: case SDL_WINDOWEVENT_FOCUS_LOST: @@ -615,6 +616,7 @@ void SystemStub_SDL::processEvent(const SDL_Event &ev, bool &paused) { SDL_PauseAudio(paused); break; } + #endif break; case SDL_JOYHATMOTION: if (_joystick) { diff --git a/util.cpp b/util.cpp index 51c4f01..557892a 100644 --- a/util.cpp +++ b/util.cpp @@ -18,6 +18,7 @@ uint16_t g_debugMask; +#ifndef NDEBUG void debug(uint16_t cm, const char *msg, ...) { char buf[1024]; if (cm & g_debugMask) { @@ -32,6 +33,7 @@ void debug(uint16_t cm, const char *msg, ...) { #endif } } +#endif void error(const char *msg, ...) { char buf[1024];