seal 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (421) hide show
  1. data/.yardopts +1 -0
  2. data/LICENSE +13 -0
  3. data/README.md +265 -0
  4. data/ext/seal/extconf.rb +45 -0
  5. data/include/al/al.h +724 -0
  6. data/include/al/alc.h +277 -0
  7. data/include/al/efx-presets.h +402 -0
  8. data/include/al/efx.h +758 -0
  9. data/include/mpg123/mpg123.h +1034 -0
  10. data/include/ogg/config_types.h +25 -0
  11. data/include/ogg/ogg.h +210 -0
  12. data/include/ogg/os_types.h +147 -0
  13. data/include/seal.h +23 -0
  14. data/include/seal/buf.h +143 -0
  15. data/include/seal/core.h +95 -0
  16. data/include/seal/efs.h +112 -0
  17. data/include/seal/err.h +93 -0
  18. data/include/seal/fmt.h +58 -0
  19. data/include/seal/listener.h +103 -0
  20. data/include/seal/raw.h +86 -0
  21. data/include/seal/rvb.h +520 -0
  22. data/include/seal/src.h +413 -0
  23. data/include/seal/stream.h +81 -0
  24. data/include/vorbis/codec.h +243 -0
  25. data/include/vorbis/vorbisfile.h +206 -0
  26. data/mpg123/AUTHORS +150 -0
  27. data/mpg123/COPYING +773 -0
  28. data/mpg123/ChangeLog +3 -0
  29. data/mpg123/INSTALL +111 -0
  30. data/mpg123/Makefile.am +99 -0
  31. data/mpg123/Makefile.in +1043 -0
  32. data/mpg123/NEWS +1200 -0
  33. data/mpg123/NEWS.libmpg123 +133 -0
  34. data/mpg123/README +203 -0
  35. data/mpg123/TODO +38 -0
  36. data/mpg123/aclocal.m4 +1168 -0
  37. data/mpg123/build/config.guess +1530 -0
  38. data/mpg123/build/config.sub +1782 -0
  39. data/mpg123/build/depcomp +707 -0
  40. data/mpg123/build/install-sh +527 -0
  41. data/mpg123/build/ltmain.sh +9655 -0
  42. data/mpg123/build/missing +330 -0
  43. data/mpg123/configure +20267 -0
  44. data/mpg123/configure.ac +2178 -0
  45. data/mpg123/doc/ACCURACY +2 -0
  46. data/mpg123/doc/BENCHMARKING +110 -0
  47. data/mpg123/doc/BUGS +3 -0
  48. data/mpg123/doc/CONTACT +17 -0
  49. data/mpg123/doc/LICENSE +22 -0
  50. data/mpg123/doc/Makefile.am +32 -0
  51. data/mpg123/doc/Makefile.in +490 -0
  52. data/mpg123/doc/PATENTS +39 -0
  53. data/mpg123/doc/README.3DNOW +56 -0
  54. data/mpg123/doc/README.gain +171 -0
  55. data/mpg123/doc/README.remote +218 -0
  56. data/mpg123/doc/ROAD_TO_LGPL +270 -0
  57. data/mpg123/doc/THANKS +13 -0
  58. data/mpg123/doc/TODO +63 -0
  59. data/mpg123/doc/doxy_examples.c +21 -0
  60. data/mpg123/doc/doxygen.conf +41 -0
  61. data/mpg123/doc/doxyhead.xhtml +12 -0
  62. data/mpg123/doc/examples/dump_seekindex.c +41 -0
  63. data/mpg123/doc/examples/extract_frames.c +92 -0
  64. data/mpg123/doc/examples/feedseek.c +238 -0
  65. data/mpg123/doc/examples/id3dump.c +178 -0
  66. data/mpg123/doc/examples/mpg123_to_wav.c +118 -0
  67. data/mpg123/doc/examples/mpglib.c +92 -0
  68. data/mpg123/doc/examples/scan.c +47 -0
  69. data/mpg123/doc/libmpg123_speed.txt +84 -0
  70. data/mpg123/equalize.dat +37 -0
  71. data/mpg123/libmpg123.pc.in +11 -0
  72. data/mpg123/m4/addrconfig.m4 +34 -0
  73. data/mpg123/m4/libtool.m4 +7982 -0
  74. data/mpg123/m4/ltoptions.m4 +384 -0
  75. data/mpg123/m4/ltsugar.m4 +123 -0
  76. data/mpg123/m4/ltversion.m4 +23 -0
  77. data/mpg123/m4/lt~obsolete.m4 +98 -0
  78. data/mpg123/makedll.sh +19 -0
  79. data/mpg123/man1/mpg123.1 +512 -0
  80. data/mpg123/mpg123.spec +68 -0
  81. data/mpg123/mpg123.spec.in +68 -0
  82. data/mpg123/ports/MSVC++/2005/libmpg123/libmpg123.vcproj +741 -0
  83. data/mpg123/ports/MSVC++/2008/dump_seekindex/dump_seekindex.vcproj +194 -0
  84. data/mpg123/ports/MSVC++/2008/feedseek/feedseek.vcproj +195 -0
  85. data/mpg123/ports/MSVC++/2008/libmpg123/libmpg123.vcproj +1357 -0
  86. data/mpg123/ports/MSVC++/2008/mpg123.sln +44 -0
  87. data/mpg123/ports/MSVC++/2008/mpglib/mpglib.vcproj +191 -0
  88. data/mpg123/ports/MSVC++/2008/scan/scan.vcproj +195 -0
  89. data/mpg123/ports/MSVC++/2008clr/2008clr.sln +81 -0
  90. data/mpg123/ports/MSVC++/2008clr/examples/ReplaceReaderclr/Program.cs +435 -0
  91. data/mpg123/ports/MSVC++/2008clr/examples/ReplaceReaderclr/Properties/AssemblyInfo.cs +36 -0
  92. data/mpg123/ports/MSVC++/2008clr/examples/ReplaceReaderclr/ReplaceReaderclr.csproj +72 -0
  93. data/mpg123/ports/MSVC++/2008clr/examples/feedseekclr/Program.cs +331 -0
  94. data/mpg123/ports/MSVC++/2008clr/examples/feedseekclr/Properties/AssemblyInfo.cs +36 -0
  95. data/mpg123/ports/MSVC++/2008clr/examples/feedseekclr/feedseekclr.csproj +71 -0
  96. data/mpg123/ports/MSVC++/2008clr/examples/scanclr/Program.cs +79 -0
  97. data/mpg123/ports/MSVC++/2008clr/examples/scanclr/Properties/AssemblyInfo.cs +36 -0
  98. data/mpg123/ports/MSVC++/2008clr/examples/scanclr/scanclr.csproj +70 -0
  99. data/mpg123/ports/MSVC++/2008clr/mpg123clr/AssemblyInfo.cpp +76 -0
  100. data/mpg123/ports/MSVC++/2008clr/mpg123clr/ReadMe.txt +165 -0
  101. data/mpg123/ports/MSVC++/2008clr/mpg123clr/advanced.cpp +91 -0
  102. data/mpg123/ports/MSVC++/2008clr/mpg123clr/advanced.h +130 -0
  103. data/mpg123/ports/MSVC++/2008clr/mpg123clr/dllmain.cpp +19 -0
  104. data/mpg123/ports/MSVC++/2008clr/mpg123clr/enum.h +218 -0
  105. data/mpg123/ports/MSVC++/2008clr/mpg123clr/error.cpp +48 -0
  106. data/mpg123/ports/MSVC++/2008clr/mpg123clr/error.h +134 -0
  107. data/mpg123/ports/MSVC++/2008clr/mpg123clr/id3v1.cpp +92 -0
  108. data/mpg123/ports/MSVC++/2008clr/mpg123clr/id3v1.h +132 -0
  109. data/mpg123/ports/MSVC++/2008clr/mpg123clr/id3v2.cpp +138 -0
  110. data/mpg123/ports/MSVC++/2008clr/mpg123clr/id3v2.h +152 -0
  111. data/mpg123/ports/MSVC++/2008clr/mpg123clr/mpg123clr.cpp +896 -0
  112. data/mpg123/ports/MSVC++/2008clr/mpg123clr/mpg123clr.h +953 -0
  113. data/mpg123/ports/MSVC++/2008clr/mpg123clr/mpg123clr.rc +102 -0
  114. data/mpg123/ports/MSVC++/2008clr/mpg123clr/mpg123clr.vcproj +328 -0
  115. data/mpg123/ports/MSVC++/2008clr/mpg123clr/resource.h +14 -0
  116. data/mpg123/ports/MSVC++/2008clr/mpg123clr/stdafx.cpp +8 -0
  117. data/mpg123/ports/MSVC++/2008clr/mpg123clr/stdafx.h +38 -0
  118. data/mpg123/ports/MSVC++/2008clr/mpg123clr/string.cpp +166 -0
  119. data/mpg123/ports/MSVC++/2008clr/mpg123clr/string.h +265 -0
  120. data/mpg123/ports/MSVC++/2008clr/mpg123clr/targetver.h +24 -0
  121. data/mpg123/ports/MSVC++/2008clr/mpg123clr/text.cpp +67 -0
  122. data/mpg123/ports/MSVC++/2008clr/mpg123clr/text.h +111 -0
  123. data/mpg123/ports/MSVC++/2010/dump_seekindex/dump_seekindex.vcxproj +90 -0
  124. data/mpg123/ports/MSVC++/2010/dump_seekindex/dump_seekindex.vcxproj.filters +6 -0
  125. data/mpg123/ports/MSVC++/2010/feedseek/feedseek.vcxproj +95 -0
  126. data/mpg123/ports/MSVC++/2010/feedseek/feedseek.vcxproj.filters +6 -0
  127. data/mpg123/ports/MSVC++/2010/libmpg123/libmpg123.vcxproj +960 -0
  128. data/mpg123/ports/MSVC++/2010/libmpg123/libmpg123.vcxproj.user +3 -0
  129. data/mpg123/ports/MSVC++/2010/libmpg123/yasm.exe +0 -0
  130. data/mpg123/ports/MSVC++/2010/mpg123.sln +38 -0
  131. data/mpg123/ports/MSVC++/2010/scan/scan.vcxproj +93 -0
  132. data/mpg123/ports/MSVC++/2010/scan/scan.vcxproj.filters +6 -0
  133. data/mpg123/ports/MSVC++/CMP3Stream/INCLUDE/CORE/CORE_FileIn.H +15 -0
  134. data/mpg123/ports/MSVC++/CMP3Stream/INCLUDE/CORE/SourceFilter_MP3.H +139 -0
  135. data/mpg123/ports/MSVC++/CMP3Stream/INCLUDE/IIEP_Def.H +206 -0
  136. data/mpg123/ports/MSVC++/CMP3Stream/INCLUDE/IIEP_FileIn.H +167 -0
  137. data/mpg123/ports/MSVC++/CMP3Stream/README +4 -0
  138. data/mpg123/ports/MSVC++/CMP3Stream/SOURCE/CORE_FileIn.CPP +462 -0
  139. data/mpg123/ports/MSVC++/CMP3Stream/SOURCE/CORE_Log.CPP +122 -0
  140. data/mpg123/ports/MSVC++/CMP3Stream/SOURCE/CORE_Mutex.CPP +35 -0
  141. data/mpg123/ports/MSVC++/CMP3Stream/SOURCE/SourceFilter_MP3Stream.CPP +586 -0
  142. data/mpg123/ports/MSVC++/CMP3Stream/libMPG123/PLACE_LIBMPG123_SOURCES_HERE +0 -0
  143. data/mpg123/ports/MSVC++/CMP3Stream/libMPG123/libMPG123.vcproj +245 -0
  144. data/mpg123/ports/MSVC++/config.h +35 -0
  145. data/mpg123/ports/MSVC++/examples/feedseek.c +240 -0
  146. data/mpg123/ports/MSVC++/examples/scan.c +47 -0
  147. data/mpg123/ports/MSVC++/mpg123.h +46 -0
  148. data/mpg123/ports/MSVC++/msvc.c +59 -0
  149. data/mpg123/ports/README +26 -0
  150. data/mpg123/ports/Sony_PSP/Makefile.psp +38 -0
  151. data/mpg123/ports/Sony_PSP/README +11 -0
  152. data/mpg123/ports/Sony_PSP/config.h +368 -0
  153. data/mpg123/ports/Sony_PSP/readers.c.patch +2 -0
  154. data/mpg123/ports/Xcode/config.h +197 -0
  155. data/mpg123/ports/Xcode/mpg123.h +17 -0
  156. data/mpg123/ports/Xcode/mpg123.xcodeproj/project.pbxproj +670 -0
  157. data/mpg123/ports/mpg123_.pas +478 -0
  158. data/mpg123/scripts/benchmark-cpu.pl +56 -0
  159. data/mpg123/scripts/tag_lyrics.py +76 -0
  160. data/mpg123/src/Makefile.am +186 -0
  161. data/mpg123/src/Makefile.in +1097 -0
  162. data/mpg123/src/audio.c +725 -0
  163. data/mpg123/src/audio.h +106 -0
  164. data/mpg123/src/buffer.c +312 -0
  165. data/mpg123/src/buffer.h +45 -0
  166. data/mpg123/src/common.c +240 -0
  167. data/mpg123/src/common.h +29 -0
  168. data/mpg123/src/config.h.in +436 -0
  169. data/mpg123/src/control_generic.c +809 -0
  170. data/mpg123/src/equalizer.c +48 -0
  171. data/mpg123/src/genre.c +271 -0
  172. data/mpg123/src/genre.h +15 -0
  173. data/mpg123/src/getlopt.c +148 -0
  174. data/mpg123/src/getlopt.h +77 -0
  175. data/mpg123/src/httpget.c +700 -0
  176. data/mpg123/src/httpget.h +66 -0
  177. data/mpg123/src/legacy_module.c +74 -0
  178. data/mpg123/src/libmpg123/Makefile.am +141 -0
  179. data/mpg123/src/libmpg123/Makefile.in +919 -0
  180. data/mpg123/src/libmpg123/compat.c +138 -0
  181. data/mpg123/src/libmpg123/compat.h +178 -0
  182. data/mpg123/src/libmpg123/dct36_3dnow.S +505 -0
  183. data/mpg123/src/libmpg123/dct36_3dnowext.S +512 -0
  184. data/mpg123/src/libmpg123/dct64.c +174 -0
  185. data/mpg123/src/libmpg123/dct64_3dnow.S +712 -0
  186. data/mpg123/src/libmpg123/dct64_3dnowext.S +714 -0
  187. data/mpg123/src/libmpg123/dct64_altivec.c +315 -0
  188. data/mpg123/src/libmpg123/dct64_i386.c +336 -0
  189. data/mpg123/src/libmpg123/dct64_i486.c +342 -0
  190. data/mpg123/src/libmpg123/dct64_mmx.S +811 -0
  191. data/mpg123/src/libmpg123/dct64_neon.S +297 -0
  192. data/mpg123/src/libmpg123/dct64_neon_float.S +270 -0
  193. data/mpg123/src/libmpg123/dct64_sse.S +454 -0
  194. data/mpg123/src/libmpg123/dct64_sse_float.S +401 -0
  195. data/mpg123/src/libmpg123/dct64_x86_64.S +464 -0
  196. data/mpg123/src/libmpg123/dct64_x86_64_float.S +426 -0
  197. data/mpg123/src/libmpg123/debug.h +171 -0
  198. data/mpg123/src/libmpg123/decode.h +268 -0
  199. data/mpg123/src/libmpg123/dither.c +119 -0
  200. data/mpg123/src/libmpg123/dither.h +23 -0
  201. data/mpg123/src/libmpg123/equalizer.c +17 -0
  202. data/mpg123/src/libmpg123/equalizer_3dnow.S +70 -0
  203. data/mpg123/src/libmpg123/feature.c +106 -0
  204. data/mpg123/src/libmpg123/format.c +521 -0
  205. data/mpg123/src/libmpg123/frame.c +1046 -0
  206. data/mpg123/src/libmpg123/frame.h +410 -0
  207. data/mpg123/src/libmpg123/gapless.h +119 -0
  208. data/mpg123/src/libmpg123/getbits.h +100 -0
  209. data/mpg123/src/libmpg123/getcpuflags.S +91 -0
  210. data/mpg123/src/libmpg123/getcpuflags.h +47 -0
  211. data/mpg123/src/libmpg123/huffman.h +340 -0
  212. data/mpg123/src/libmpg123/icy.c +32 -0
  213. data/mpg123/src/libmpg123/icy.h +38 -0
  214. data/mpg123/src/libmpg123/icy2utf8.c +438 -0
  215. data/mpg123/src/libmpg123/icy2utf8.h +10 -0
  216. data/mpg123/src/libmpg123/id3.c +999 -0
  217. data/mpg123/src/libmpg123/id3.h +43 -0
  218. data/mpg123/src/libmpg123/index.c +134 -0
  219. data/mpg123/src/libmpg123/index.h +59 -0
  220. data/mpg123/src/libmpg123/intsym.h +256 -0
  221. data/mpg123/src/libmpg123/l12_integer_tables.h +278 -0
  222. data/mpg123/src/libmpg123/l2tables.h +164 -0
  223. data/mpg123/src/libmpg123/l3_integer_tables.h +1002 -0
  224. data/mpg123/src/libmpg123/layer1.c +155 -0
  225. data/mpg123/src/libmpg123/layer2.c +371 -0
  226. data/mpg123/src/libmpg123/layer3.c +2053 -0
  227. data/mpg123/src/libmpg123/lfs_alias.c +252 -0
  228. data/mpg123/src/libmpg123/lfs_wrap.c +751 -0
  229. data/mpg123/src/libmpg123/libmpg123.c +1607 -0
  230. data/mpg123/src/libmpg123/mangle.h +74 -0
  231. data/mpg123/src/libmpg123/mpeghead.h +87 -0
  232. data/mpg123/src/libmpg123/mpg123.h.in +1075 -0
  233. data/mpg123/src/libmpg123/mpg123lib_intern.h +338 -0
  234. data/mpg123/src/libmpg123/ntom.c +148 -0
  235. data/mpg123/src/libmpg123/optimize.c +964 -0
  236. data/mpg123/src/libmpg123/optimize.h +219 -0
  237. data/mpg123/src/libmpg123/parse.c +1179 -0
  238. data/mpg123/src/libmpg123/parse.h +25 -0
  239. data/mpg123/src/libmpg123/reader.h +137 -0
  240. data/mpg123/src/libmpg123/readers.c +1235 -0
  241. data/mpg123/src/libmpg123/sample.h +152 -0
  242. data/mpg123/src/libmpg123/stringbuf.c +163 -0
  243. data/mpg123/src/libmpg123/synth.c +816 -0
  244. data/mpg123/src/libmpg123/synth.h +196 -0
  245. data/mpg123/src/libmpg123/synth_3dnow.S +318 -0
  246. data/mpg123/src/libmpg123/synth_3dnowext.S +6 -0
  247. data/mpg123/src/libmpg123/synth_8bit.c +142 -0
  248. data/mpg123/src/libmpg123/synth_8bit.h +86 -0
  249. data/mpg123/src/libmpg123/synth_altivec.c +1057 -0
  250. data/mpg123/src/libmpg123/synth_arm.S +271 -0
  251. data/mpg123/src/libmpg123/synth_arm_accurate.S +287 -0
  252. data/mpg123/src/libmpg123/synth_i486.c +252 -0
  253. data/mpg123/src/libmpg123/synth_i586.S +336 -0
  254. data/mpg123/src/libmpg123/synth_i586_dither.S +375 -0
  255. data/mpg123/src/libmpg123/synth_mmx.S +125 -0
  256. data/mpg123/src/libmpg123/synth_mono.h +64 -0
  257. data/mpg123/src/libmpg123/synth_neon.S +123 -0
  258. data/mpg123/src/libmpg123/synth_neon_accurate.S +173 -0
  259. data/mpg123/src/libmpg123/synth_neon_float.S +149 -0
  260. data/mpg123/src/libmpg123/synth_neon_s32.S +168 -0
  261. data/mpg123/src/libmpg123/synth_ntom.h +213 -0
  262. data/mpg123/src/libmpg123/synth_real.c +404 -0
  263. data/mpg123/src/libmpg123/synth_s32.c +411 -0
  264. data/mpg123/src/libmpg123/synth_sse.S +6 -0
  265. data/mpg123/src/libmpg123/synth_sse3d.h +246 -0
  266. data/mpg123/src/libmpg123/synth_sse_accurate.S +294 -0
  267. data/mpg123/src/libmpg123/synth_sse_float.S +241 -0
  268. data/mpg123/src/libmpg123/synth_sse_s32.S +306 -0
  269. data/mpg123/src/libmpg123/synth_stereo_neon.S +175 -0
  270. data/mpg123/src/libmpg123/synth_stereo_neon_accurate.S +262 -0
  271. data/mpg123/src/libmpg123/synth_stereo_neon_float.S +220 -0
  272. data/mpg123/src/libmpg123/synth_stereo_neon_s32.S +247 -0
  273. data/mpg123/src/libmpg123/synth_stereo_sse_accurate.S +508 -0
  274. data/mpg123/src/libmpg123/synth_stereo_sse_float.S +416 -0
  275. data/mpg123/src/libmpg123/synth_stereo_sse_s32.S +540 -0
  276. data/mpg123/src/libmpg123/synth_stereo_x86_64.S +335 -0
  277. data/mpg123/src/libmpg123/synth_stereo_x86_64_accurate.S +454 -0
  278. data/mpg123/src/libmpg123/synth_stereo_x86_64_float.S +396 -0
  279. data/mpg123/src/libmpg123/synth_stereo_x86_64_s32.S +473 -0
  280. data/mpg123/src/libmpg123/synth_x86_64.S +244 -0
  281. data/mpg123/src/libmpg123/synth_x86_64_accurate.S +301 -0
  282. data/mpg123/src/libmpg123/synth_x86_64_float.S +259 -0
  283. data/mpg123/src/libmpg123/synth_x86_64_s32.S +312 -0
  284. data/mpg123/src/libmpg123/synths.h +52 -0
  285. data/mpg123/src/libmpg123/tabinit.c +294 -0
  286. data/mpg123/src/libmpg123/tabinit_mmx.S +210 -0
  287. data/mpg123/src/libmpg123/testcpu.c +35 -0
  288. data/mpg123/src/libmpg123/true.h +14 -0
  289. data/mpg123/src/local.c +63 -0
  290. data/mpg123/src/local.h +21 -0
  291. data/mpg123/src/metaprint.c +373 -0
  292. data/mpg123/src/metaprint.h +17 -0
  293. data/mpg123/src/module.c +306 -0
  294. data/mpg123/src/module.h +48 -0
  295. data/mpg123/src/mpg123.c +1405 -0
  296. data/mpg123/src/mpg123app.h +171 -0
  297. data/mpg123/src/output/Makefile.am +213 -0
  298. data/mpg123/src/output/Makefile.in +1238 -0
  299. data/mpg123/src/output/aix.c +300 -0
  300. data/mpg123/src/output/alib.c +209 -0
  301. data/mpg123/src/output/alsa.c +297 -0
  302. data/mpg123/src/output/arts.c +117 -0
  303. data/mpg123/src/output/coreaudio.c +370 -0
  304. data/mpg123/src/output/dummy.c +78 -0
  305. data/mpg123/src/output/esd.c +167 -0
  306. data/mpg123/src/output/hp.c +184 -0
  307. data/mpg123/src/output/jack.c +450 -0
  308. data/mpg123/src/output/mint.c +197 -0
  309. data/mpg123/src/output/nas.c +335 -0
  310. data/mpg123/src/output/openal.c +197 -0
  311. data/mpg123/src/output/os2.c +665 -0
  312. data/mpg123/src/output/oss.c +319 -0
  313. data/mpg123/src/output/portaudio.c +255 -0
  314. data/mpg123/src/output/pulse.c +164 -0
  315. data/mpg123/src/output/sdl.c +206 -0
  316. data/mpg123/src/output/sgi.c +213 -0
  317. data/mpg123/src/output/sndio.c +161 -0
  318. data/mpg123/src/output/sun.c +281 -0
  319. data/mpg123/src/output/win32.c +229 -0
  320. data/mpg123/src/playlist.c +596 -0
  321. data/mpg123/src/playlist.h +52 -0
  322. data/mpg123/src/resolver.c +319 -0
  323. data/mpg123/src/resolver.h +25 -0
  324. data/mpg123/src/sfifo.c +146 -0
  325. data/mpg123/src/sfifo.h +95 -0
  326. data/mpg123/src/streamdump.c +74 -0
  327. data/mpg123/src/streamdump.h +20 -0
  328. data/mpg123/src/term.c +479 -0
  329. data/mpg123/src/term.h +81 -0
  330. data/mpg123/src/tests/noise.c +52 -0
  331. data/mpg123/src/tests/plain_id3.c +109 -0
  332. data/mpg123/src/tests/seek_accuracy.c +261 -0
  333. data/mpg123/src/tests/seek_whence.c +56 -0
  334. data/mpg123/src/tests/testtext.h +34 -0
  335. data/mpg123/src/tests/text.c +80 -0
  336. data/mpg123/src/wav.c +464 -0
  337. data/mpg123/src/wavhead.h +68 -0
  338. data/mpg123/src/win32_net.c +599 -0
  339. data/mpg123/src/win32_support.c +191 -0
  340. data/mpg123/src/win32_support.h +152 -0
  341. data/mpg123/src/xfermem.c +321 -0
  342. data/mpg123/src/xfermem.h +74 -0
  343. data/mpg123/windows-builds.sh +137 -0
  344. data/msvc/lib/OpenAL32.lib +0 -0
  345. data/spec/fixtures/heal.ogg +0 -0
  346. data/spec/fixtures/tone_up.wav +0 -0
  347. data/spec/seal/buffer_spec.rb +37 -0
  348. data/spec/seal/core_spec.rb +29 -0
  349. data/spec/seal/effect_slot_spec.rb +38 -0
  350. data/spec/seal/listener_spec.rb +33 -0
  351. data/spec/seal/reverb_spec.rb +51 -0
  352. data/spec/seal/source_spec.rb +370 -0
  353. data/spec/seal/stream_spec.rb +38 -0
  354. data/spec/spec_helper.rb +45 -0
  355. data/spec/support/attribute_examples.rb +75 -0
  356. data/spec/support/audio_object_with_format.rb +27 -0
  357. data/spec/support/movable_object.rb +22 -0
  358. data/src/libogg/bitwise.c +857 -0
  359. data/src/libogg/framing.c +2093 -0
  360. data/src/libvorbis/backends.h +144 -0
  361. data/src/libvorbis/bitrate.c +253 -0
  362. data/src/libvorbis/bitrate.h +59 -0
  363. data/src/libvorbis/block.c +1046 -0
  364. data/src/libvorbis/codebook.c +484 -0
  365. data/src/libvorbis/codebook.h +119 -0
  366. data/src/libvorbis/codec_internal.h +167 -0
  367. data/src/libvorbis/envelope.c +375 -0
  368. data/src/libvorbis/envelope.h +80 -0
  369. data/src/libvorbis/floor0.c +221 -0
  370. data/src/libvorbis/floor1.c +1100 -0
  371. data/src/libvorbis/highlevel.h +58 -0
  372. data/src/libvorbis/info.c +668 -0
  373. data/src/libvorbis/lookup.c +94 -0
  374. data/src/libvorbis/lookup.h +32 -0
  375. data/src/libvorbis/lookup_data.h +192 -0
  376. data/src/libvorbis/lpc.c +160 -0
  377. data/src/libvorbis/lpc.h +29 -0
  378. data/src/libvorbis/lsp.c +456 -0
  379. data/src/libvorbis/lsp.h +28 -0
  380. data/src/libvorbis/mapping0.c +816 -0
  381. data/src/libvorbis/masking.h +785 -0
  382. data/src/libvorbis/mdct.c +563 -0
  383. data/src/libvorbis/mdct.h +71 -0
  384. data/src/libvorbis/misc.h +57 -0
  385. data/src/libvorbis/os.h +186 -0
  386. data/src/libvorbis/psy.c +1206 -0
  387. data/src/libvorbis/psy.h +154 -0
  388. data/src/libvorbis/registry.c +45 -0
  389. data/src/libvorbis/registry.h +32 -0
  390. data/src/libvorbis/res0.c +889 -0
  391. data/src/libvorbis/scales.h +90 -0
  392. data/src/libvorbis/sharedbook.c +579 -0
  393. data/src/libvorbis/smallft.c +1255 -0
  394. data/src/libvorbis/smallft.h +34 -0
  395. data/src/libvorbis/synthesis.c +184 -0
  396. data/src/libvorbis/vorbisfile.c +2337 -0
  397. data/src/libvorbis/window.c +2135 -0
  398. data/src/libvorbis/window.h +26 -0
  399. data/src/rubyext.c +2329 -0
  400. data/src/seal/buf.c +124 -0
  401. data/src/seal/core.c +283 -0
  402. data/src/seal/efs.c +74 -0
  403. data/src/seal/err.c +118 -0
  404. data/src/seal/fmt.c +86 -0
  405. data/src/seal/listener.c +111 -0
  406. data/src/seal/mpg.c +174 -0
  407. data/src/seal/mpg.h +24 -0
  408. data/src/seal/ov.c +180 -0
  409. data/src/seal/ov.h +22 -0
  410. data/src/seal/raw.c +59 -0
  411. data/src/seal/reader.c +102 -0
  412. data/src/seal/reader.h +59 -0
  413. data/src/seal/rvb.c +368 -0
  414. data/src/seal/src.c +654 -0
  415. data/src/seal/stream.c +109 -0
  416. data/src/seal/threading.c +66 -0
  417. data/src/seal/threading.h +20 -0
  418. data/src/seal/wav.c +297 -0
  419. data/src/seal/wav.h +23 -0
  420. data/src/win32api.rb +29 -0
  421. metadata +563 -0
@@ -0,0 +1,80 @@
1
+ /********************************************************************
2
+ * *
3
+ * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
4
+ * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
5
+ * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
6
+ * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
7
+ * *
8
+ * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
9
+ * by the Xiph.Org Foundation http://www.xiph.org/ *
10
+ * *
11
+ ********************************************************************
12
+
13
+ function: PCM data envelope analysis and manipulation
14
+ last mod: $Id: envelope.h 16227 2009-07-08 06:58:46Z xiphmont $
15
+
16
+ ********************************************************************/
17
+
18
+ #ifndef _V_ENVELOPE_
19
+ #define _V_ENVELOPE_
20
+
21
+ #include "mdct.h"
22
+
23
+ #define VE_PRE 16
24
+ #define VE_WIN 4
25
+ #define VE_POST 2
26
+ #define VE_AMP (VE_PRE+VE_POST-1)
27
+
28
+ #define VE_BANDS 7
29
+ #define VE_NEARDC 15
30
+
31
+ #define VE_MINSTRETCH 2 /* a bit less than short block */
32
+ #define VE_MAXSTRETCH 12 /* one-third full block */
33
+
34
+ typedef struct {
35
+ float ampbuf[VE_AMP];
36
+ int ampptr;
37
+
38
+ float nearDC[VE_NEARDC];
39
+ float nearDC_acc;
40
+ float nearDC_partialacc;
41
+ int nearptr;
42
+
43
+ } envelope_filter_state;
44
+
45
+ typedef struct {
46
+ int begin;
47
+ int end;
48
+ float *window;
49
+ float total;
50
+ } envelope_band;
51
+
52
+ typedef struct {
53
+ int ch;
54
+ int winlength;
55
+ int searchstep;
56
+ float minenergy;
57
+
58
+ mdct_lookup mdct;
59
+ float *mdct_win;
60
+
61
+ envelope_band band[VE_BANDS];
62
+ envelope_filter_state *filter;
63
+ int stretch;
64
+
65
+ int *mark;
66
+
67
+ long storage;
68
+ long current;
69
+ long curmark;
70
+ long cursor;
71
+ } envelope_lookup;
72
+
73
+ extern void _ve_envelope_init(envelope_lookup *e,vorbis_info *vi);
74
+ extern void _ve_envelope_clear(envelope_lookup *e);
75
+ extern long _ve_envelope_search(vorbis_dsp_state *v);
76
+ extern void _ve_envelope_shift(envelope_lookup *e,long shift);
77
+ extern int _ve_envelope_mark(vorbis_dsp_state *v);
78
+
79
+
80
+ #endif
@@ -0,0 +1,221 @@
1
+ /********************************************************************
2
+ * *
3
+ * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
4
+ * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
5
+ * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
6
+ * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
7
+ * *
8
+ * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
9
+ * by the Xiph.Org Foundation http://www.xiph.org/ *
10
+ * *
11
+ ********************************************************************
12
+
13
+ function: floor backend 0 implementation
14
+ last mod: $Id: floor0.c 18184 2012-02-03 20:55:12Z xiphmont $
15
+
16
+ ********************************************************************/
17
+
18
+ #include <stdlib.h>
19
+ #include <string.h>
20
+ #include <math.h>
21
+ #include <ogg/ogg.h>
22
+ #include "vorbis/codec.h"
23
+ #include "codec_internal.h"
24
+ #include "registry.h"
25
+ #include "lpc.h"
26
+ #include "lsp.h"
27
+ #include "codebook.h"
28
+ #include "scales.h"
29
+ #include "misc.h"
30
+ #include "os.h"
31
+
32
+ #include "misc.h"
33
+ #include <stdio.h>
34
+
35
+ typedef struct {
36
+ int ln;
37
+ int m;
38
+ int **linearmap;
39
+ int n[2];
40
+
41
+ vorbis_info_floor0 *vi;
42
+
43
+ long bits;
44
+ long frames;
45
+ } vorbis_look_floor0;
46
+
47
+
48
+ /***********************************************/
49
+
50
+ static void floor0_free_info(vorbis_info_floor *i){
51
+ vorbis_info_floor0 *info=(vorbis_info_floor0 *)i;
52
+ if(info){
53
+ memset(info,0,sizeof(*info));
54
+ _ogg_free(info);
55
+ }
56
+ }
57
+
58
+ static void floor0_free_look(vorbis_look_floor *i){
59
+ vorbis_look_floor0 *look=(vorbis_look_floor0 *)i;
60
+ if(look){
61
+
62
+ if(look->linearmap){
63
+
64
+ if(look->linearmap[0])_ogg_free(look->linearmap[0]);
65
+ if(look->linearmap[1])_ogg_free(look->linearmap[1]);
66
+
67
+ _ogg_free(look->linearmap);
68
+ }
69
+ memset(look,0,sizeof(*look));
70
+ _ogg_free(look);
71
+ }
72
+ }
73
+
74
+ static vorbis_info_floor *floor0_unpack (vorbis_info *vi,oggpack_buffer *opb){
75
+ codec_setup_info *ci=vi->codec_setup;
76
+ int j;
77
+
78
+ vorbis_info_floor0 *info=_ogg_malloc(sizeof(*info));
79
+ info->order=oggpack_read(opb,8);
80
+ info->rate=oggpack_read(opb,16);
81
+ info->barkmap=oggpack_read(opb,16);
82
+ info->ampbits=oggpack_read(opb,6);
83
+ info->ampdB=oggpack_read(opb,8);
84
+ info->numbooks=oggpack_read(opb,4)+1;
85
+
86
+ if(info->order<1)goto err_out;
87
+ if(info->rate<1)goto err_out;
88
+ if(info->barkmap<1)goto err_out;
89
+ if(info->numbooks<1)goto err_out;
90
+
91
+ for(j=0;j<info->numbooks;j++){
92
+ info->books[j]=oggpack_read(opb,8);
93
+ if(info->books[j]<0 || info->books[j]>=ci->books)goto err_out;
94
+ if(ci->book_param[info->books[j]]->maptype==0)goto err_out;
95
+ if(ci->book_param[info->books[j]]->dim<1)goto err_out;
96
+ }
97
+ return(info);
98
+
99
+ err_out:
100
+ floor0_free_info(info);
101
+ return(NULL);
102
+ }
103
+
104
+ /* initialize Bark scale and normalization lookups. We could do this
105
+ with static tables, but Vorbis allows a number of possible
106
+ combinations, so it's best to do it computationally.
107
+
108
+ The below is authoritative in terms of defining scale mapping.
109
+ Note that the scale depends on the sampling rate as well as the
110
+ linear block and mapping sizes */
111
+
112
+ static void floor0_map_lazy_init(vorbis_block *vb,
113
+ vorbis_info_floor *infoX,
114
+ vorbis_look_floor0 *look){
115
+ if(!look->linearmap[vb->W]){
116
+ vorbis_dsp_state *vd=vb->vd;
117
+ vorbis_info *vi=vd->vi;
118
+ codec_setup_info *ci=vi->codec_setup;
119
+ vorbis_info_floor0 *info=(vorbis_info_floor0 *)infoX;
120
+ int W=vb->W;
121
+ int n=ci->blocksizes[W]/2,j;
122
+
123
+ /* we choose a scaling constant so that:
124
+ floor(bark(rate/2-1)*C)=mapped-1
125
+ floor(bark(rate/2)*C)=mapped */
126
+ float scale=look->ln/toBARK(info->rate/2.f);
127
+
128
+ /* the mapping from a linear scale to a smaller bark scale is
129
+ straightforward. We do *not* make sure that the linear mapping
130
+ does not skip bark-scale bins; the decoder simply skips them and
131
+ the encoder may do what it wishes in filling them. They're
132
+ necessary in some mapping combinations to keep the scale spacing
133
+ accurate */
134
+ look->linearmap[W]=_ogg_malloc((n+1)*sizeof(**look->linearmap));
135
+ for(j=0;j<n;j++){
136
+ int val=floor( toBARK((info->rate/2.f)/n*j)
137
+ *scale); /* bark numbers represent band edges */
138
+ if(val>=look->ln)val=look->ln-1; /* guard against the approximation */
139
+ look->linearmap[W][j]=val;
140
+ }
141
+ look->linearmap[W][j]=-1;
142
+ look->n[W]=n;
143
+ }
144
+ }
145
+
146
+ static vorbis_look_floor *floor0_look(vorbis_dsp_state *vd,
147
+ vorbis_info_floor *i){
148
+ vorbis_info_floor0 *info=(vorbis_info_floor0 *)i;
149
+ vorbis_look_floor0 *look=_ogg_calloc(1,sizeof(*look));
150
+ look->m=info->order;
151
+ look->ln=info->barkmap;
152
+ look->vi=info;
153
+
154
+ look->linearmap=_ogg_calloc(2,sizeof(*look->linearmap));
155
+
156
+ return look;
157
+ }
158
+
159
+ static void *floor0_inverse1(vorbis_block *vb,vorbis_look_floor *i){
160
+ vorbis_look_floor0 *look=(vorbis_look_floor0 *)i;
161
+ vorbis_info_floor0 *info=look->vi;
162
+ int j,k;
163
+
164
+ int ampraw=oggpack_read(&vb->opb,info->ampbits);
165
+ if(ampraw>0){ /* also handles the -1 out of data case */
166
+ long maxval=(1<<info->ampbits)-1;
167
+ float amp=(float)ampraw/maxval*info->ampdB;
168
+ int booknum=oggpack_read(&vb->opb,_ilog(info->numbooks));
169
+
170
+ if(booknum!=-1 && booknum<info->numbooks){ /* be paranoid */
171
+ codec_setup_info *ci=vb->vd->vi->codec_setup;
172
+ codebook *b=ci->fullbooks+info->books[booknum];
173
+ float last=0.f;
174
+
175
+ /* the additional b->dim is a guard against any possible stack
176
+ smash; b->dim is provably more than we can overflow the
177
+ vector */
178
+ float *lsp=_vorbis_block_alloc(vb,sizeof(*lsp)*(look->m+b->dim+1));
179
+
180
+ if(vorbis_book_decodev_set(b,lsp,&vb->opb,look->m)==-1)goto eop;
181
+ for(j=0;j<look->m;){
182
+ for(k=0;j<look->m && k<b->dim;k++,j++)lsp[j]+=last;
183
+ last=lsp[j-1];
184
+ }
185
+
186
+ lsp[look->m]=amp;
187
+ return(lsp);
188
+ }
189
+ }
190
+ eop:
191
+ return(NULL);
192
+ }
193
+
194
+ static int floor0_inverse2(vorbis_block *vb,vorbis_look_floor *i,
195
+ void *memo,float *out){
196
+ vorbis_look_floor0 *look=(vorbis_look_floor0 *)i;
197
+ vorbis_info_floor0 *info=look->vi;
198
+
199
+ floor0_map_lazy_init(vb,info,look);
200
+
201
+ if(memo){
202
+ float *lsp=(float *)memo;
203
+ float amp=lsp[look->m];
204
+
205
+ /* take the coefficients back to a spectral envelope curve */
206
+ vorbis_lsp_to_curve(out,
207
+ look->linearmap[vb->W],
208
+ look->n[vb->W],
209
+ look->ln,
210
+ lsp,look->m,amp,(float)info->ampdB);
211
+ return(1);
212
+ }
213
+ memset(out,0,sizeof(*out)*look->n[vb->W]);
214
+ return(0);
215
+ }
216
+
217
+ /* export hooks */
218
+ const vorbis_func_floor floor0_exportbundle={
219
+ NULL,&floor0_unpack,&floor0_look,&floor0_free_info,
220
+ &floor0_free_look,&floor0_inverse1,&floor0_inverse2
221
+ };
@@ -0,0 +1,1100 @@
1
+ /********************************************************************
2
+ * *
3
+ * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
4
+ * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
5
+ * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
6
+ * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
7
+ * *
8
+ * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
9
+ * by the Xiph.Org Foundation http://www.xiph.org/ *
10
+ * *
11
+ ********************************************************************
12
+
13
+ function: floor backend 1 implementation
14
+ last mod: $Id: floor1.c 18151 2012-01-20 07:35:26Z xiphmont $
15
+
16
+ ********************************************************************/
17
+
18
+ #include <stdlib.h>
19
+ #include <string.h>
20
+ #include <math.h>
21
+ #include <ogg/ogg.h>
22
+ #include "vorbis/codec.h"
23
+ #include "codec_internal.h"
24
+ #include "registry.h"
25
+ #include "codebook.h"
26
+ #include "misc.h"
27
+ #include "scales.h"
28
+
29
+ #include <stdio.h>
30
+
31
+ #define floor1_rangedB 140 /* floor 1 fixed at -140dB to 0dB range */
32
+
33
+ typedef struct lsfit_acc{
34
+ int x0;
35
+ int x1;
36
+
37
+ int xa;
38
+ int ya;
39
+ int x2a;
40
+ int y2a;
41
+ int xya;
42
+ int an;
43
+
44
+ int xb;
45
+ int yb;
46
+ int x2b;
47
+ int y2b;
48
+ int xyb;
49
+ int bn;
50
+ } lsfit_acc;
51
+
52
+ /***********************************************/
53
+
54
+ static void floor1_free_info(vorbis_info_floor *i){
55
+ vorbis_info_floor1 *info=(vorbis_info_floor1 *)i;
56
+ if(info){
57
+ memset(info,0,sizeof(*info));
58
+ _ogg_free(info);
59
+ }
60
+ }
61
+
62
+ static void floor1_free_look(vorbis_look_floor *i){
63
+ vorbis_look_floor1 *look=(vorbis_look_floor1 *)i;
64
+ if(look){
65
+ /*fprintf(stderr,"floor 1 bit usage %f:%f (%f total)\n",
66
+ (float)look->phrasebits/look->frames,
67
+ (float)look->postbits/look->frames,
68
+ (float)(look->postbits+look->phrasebits)/look->frames);*/
69
+
70
+ memset(look,0,sizeof(*look));
71
+ _ogg_free(look);
72
+ }
73
+ }
74
+
75
+ static int ilog(unsigned int v){
76
+ int ret=0;
77
+ while(v){
78
+ ret++;
79
+ v>>=1;
80
+ }
81
+ return(ret);
82
+ }
83
+
84
+ static int ilog2(unsigned int v){
85
+ int ret=0;
86
+ if(v)--v;
87
+ while(v){
88
+ ret++;
89
+ v>>=1;
90
+ }
91
+ return(ret);
92
+ }
93
+
94
+ static void floor1_pack (vorbis_info_floor *i,oggpack_buffer *opb){
95
+ vorbis_info_floor1 *info=(vorbis_info_floor1 *)i;
96
+ int j,k;
97
+ int count=0;
98
+ int rangebits;
99
+ int maxposit=info->postlist[1];
100
+ int maxclass=-1;
101
+
102
+ /* save out partitions */
103
+ oggpack_write(opb,info->partitions,5); /* only 0 to 31 legal */
104
+ for(j=0;j<info->partitions;j++){
105
+ oggpack_write(opb,info->partitionclass[j],4); /* only 0 to 15 legal */
106
+ if(maxclass<info->partitionclass[j])maxclass=info->partitionclass[j];
107
+ }
108
+
109
+ /* save out partition classes */
110
+ for(j=0;j<maxclass+1;j++){
111
+ oggpack_write(opb,info->class_dim[j]-1,3); /* 1 to 8 */
112
+ oggpack_write(opb,info->class_subs[j],2); /* 0 to 3 */
113
+ if(info->class_subs[j])oggpack_write(opb,info->class_book[j],8);
114
+ for(k=0;k<(1<<info->class_subs[j]);k++)
115
+ oggpack_write(opb,info->class_subbook[j][k]+1,8);
116
+ }
117
+
118
+ /* save out the post list */
119
+ oggpack_write(opb,info->mult-1,2); /* only 1,2,3,4 legal now */
120
+ oggpack_write(opb,ilog2(maxposit),4);
121
+ rangebits=ilog2(maxposit);
122
+
123
+ for(j=0,k=0;j<info->partitions;j++){
124
+ count+=info->class_dim[info->partitionclass[j]];
125
+ for(;k<count;k++)
126
+ oggpack_write(opb,info->postlist[k+2],rangebits);
127
+ }
128
+ }
129
+
130
+ static int icomp(const void *a,const void *b){
131
+ return(**(int **)a-**(int **)b);
132
+ }
133
+
134
+ static vorbis_info_floor *floor1_unpack (vorbis_info *vi,oggpack_buffer *opb){
135
+ codec_setup_info *ci=vi->codec_setup;
136
+ int j,k,count=0,maxclass=-1,rangebits;
137
+
138
+ vorbis_info_floor1 *info=_ogg_calloc(1,sizeof(*info));
139
+ /* read partitions */
140
+ info->partitions=oggpack_read(opb,5); /* only 0 to 31 legal */
141
+ for(j=0;j<info->partitions;j++){
142
+ info->partitionclass[j]=oggpack_read(opb,4); /* only 0 to 15 legal */
143
+ if(info->partitionclass[j]<0)goto err_out;
144
+ if(maxclass<info->partitionclass[j])maxclass=info->partitionclass[j];
145
+ }
146
+
147
+ /* read partition classes */
148
+ for(j=0;j<maxclass+1;j++){
149
+ info->class_dim[j]=oggpack_read(opb,3)+1; /* 1 to 8 */
150
+ info->class_subs[j]=oggpack_read(opb,2); /* 0,1,2,3 bits */
151
+ if(info->class_subs[j]<0)
152
+ goto err_out;
153
+ if(info->class_subs[j])info->class_book[j]=oggpack_read(opb,8);
154
+ if(info->class_book[j]<0 || info->class_book[j]>=ci->books)
155
+ goto err_out;
156
+ for(k=0;k<(1<<info->class_subs[j]);k++){
157
+ info->class_subbook[j][k]=oggpack_read(opb,8)-1;
158
+ if(info->class_subbook[j][k]<-1 || info->class_subbook[j][k]>=ci->books)
159
+ goto err_out;
160
+ }
161
+ }
162
+
163
+ /* read the post list */
164
+ info->mult=oggpack_read(opb,2)+1; /* only 1,2,3,4 legal now */
165
+ rangebits=oggpack_read(opb,4);
166
+ if(rangebits<0)goto err_out;
167
+
168
+ for(j=0,k=0;j<info->partitions;j++){
169
+ count+=info->class_dim[info->partitionclass[j]];
170
+ if(count>VIF_POSIT) goto err_out;
171
+ for(;k<count;k++){
172
+ int t=info->postlist[k+2]=oggpack_read(opb,rangebits);
173
+ if(t<0 || t>=(1<<rangebits))
174
+ goto err_out;
175
+ }
176
+ }
177
+ info->postlist[0]=0;
178
+ info->postlist[1]=1<<rangebits;
179
+
180
+ /* don't allow repeated values in post list as they'd result in
181
+ zero-length segments */
182
+ {
183
+ int *sortpointer[VIF_POSIT+2];
184
+ for(j=0;j<count+2;j++)sortpointer[j]=info->postlist+j;
185
+ qsort(sortpointer,count+2,sizeof(*sortpointer),icomp);
186
+
187
+ for(j=1;j<count+2;j++)
188
+ if(*sortpointer[j-1]==*sortpointer[j])goto err_out;
189
+ }
190
+
191
+ return(info);
192
+
193
+ err_out:
194
+ floor1_free_info(info);
195
+ return(NULL);
196
+ }
197
+
198
+ static vorbis_look_floor *floor1_look(vorbis_dsp_state *vd,
199
+ vorbis_info_floor *in){
200
+
201
+ int *sortpointer[VIF_POSIT+2];
202
+ vorbis_info_floor1 *info=(vorbis_info_floor1 *)in;
203
+ vorbis_look_floor1 *look=_ogg_calloc(1,sizeof(*look));
204
+ int i,j,n=0;
205
+
206
+ look->vi=info;
207
+ look->n=info->postlist[1];
208
+
209
+ /* we drop each position value in-between already decoded values,
210
+ and use linear interpolation to predict each new value past the
211
+ edges. The positions are read in the order of the position
212
+ list... we precompute the bounding positions in the lookup. Of
213
+ course, the neighbors can change (if a position is declined), but
214
+ this is an initial mapping */
215
+
216
+ for(i=0;i<info->partitions;i++)n+=info->class_dim[info->partitionclass[i]];
217
+ n+=2;
218
+ look->posts=n;
219
+
220
+ /* also store a sorted position index */
221
+ for(i=0;i<n;i++)sortpointer[i]=info->postlist+i;
222
+ qsort(sortpointer,n,sizeof(*sortpointer),icomp);
223
+
224
+ /* points from sort order back to range number */
225
+ for(i=0;i<n;i++)look->forward_index[i]=sortpointer[i]-info->postlist;
226
+ /* points from range order to sorted position */
227
+ for(i=0;i<n;i++)look->reverse_index[look->forward_index[i]]=i;
228
+ /* we actually need the post values too */
229
+ for(i=0;i<n;i++)look->sorted_index[i]=info->postlist[look->forward_index[i]];
230
+
231
+ /* quantize values to multiplier spec */
232
+ switch(info->mult){
233
+ case 1: /* 1024 -> 256 */
234
+ look->quant_q=256;
235
+ break;
236
+ case 2: /* 1024 -> 128 */
237
+ look->quant_q=128;
238
+ break;
239
+ case 3: /* 1024 -> 86 */
240
+ look->quant_q=86;
241
+ break;
242
+ case 4: /* 1024 -> 64 */
243
+ look->quant_q=64;
244
+ break;
245
+ }
246
+
247
+ /* discover our neighbors for decode where we don't use fit flags
248
+ (that would push the neighbors outward) */
249
+ for(i=0;i<n-2;i++){
250
+ int lo=0;
251
+ int hi=1;
252
+ int lx=0;
253
+ int hx=look->n;
254
+ int currentx=info->postlist[i+2];
255
+ for(j=0;j<i+2;j++){
256
+ int x=info->postlist[j];
257
+ if(x>lx && x<currentx){
258
+ lo=j;
259
+ lx=x;
260
+ }
261
+ if(x<hx && x>currentx){
262
+ hi=j;
263
+ hx=x;
264
+ }
265
+ }
266
+ look->loneighbor[i]=lo;
267
+ look->hineighbor[i]=hi;
268
+ }
269
+
270
+ return(look);
271
+ }
272
+
273
+ static int render_point(int x0,int x1,int y0,int y1,int x){
274
+ y0&=0x7fff; /* mask off flag */
275
+ y1&=0x7fff;
276
+
277
+ {
278
+ int dy=y1-y0;
279
+ int adx=x1-x0;
280
+ int ady=abs(dy);
281
+ int err=ady*(x-x0);
282
+
283
+ int off=err/adx;
284
+ if(dy<0)return(y0-off);
285
+ return(y0+off);
286
+ }
287
+ }
288
+
289
+ static int vorbis_dBquant(const float *x){
290
+ int i= *x*7.3142857f+1023.5f;
291
+ if(i>1023)return(1023);
292
+ if(i<0)return(0);
293
+ return i;
294
+ }
295
+
296
+ static const float FLOOR1_fromdB_LOOKUP[256]={
297
+ 1.0649863e-07F, 1.1341951e-07F, 1.2079015e-07F, 1.2863978e-07F,
298
+ 1.3699951e-07F, 1.4590251e-07F, 1.5538408e-07F, 1.6548181e-07F,
299
+ 1.7623575e-07F, 1.8768855e-07F, 1.9988561e-07F, 2.128753e-07F,
300
+ 2.2670913e-07F, 2.4144197e-07F, 2.5713223e-07F, 2.7384213e-07F,
301
+ 2.9163793e-07F, 3.1059021e-07F, 3.3077411e-07F, 3.5226968e-07F,
302
+ 3.7516214e-07F, 3.9954229e-07F, 4.2550680e-07F, 4.5315863e-07F,
303
+ 4.8260743e-07F, 5.1396998e-07F, 5.4737065e-07F, 5.8294187e-07F,
304
+ 6.2082472e-07F, 6.6116941e-07F, 7.0413592e-07F, 7.4989464e-07F,
305
+ 7.9862701e-07F, 8.5052630e-07F, 9.0579828e-07F, 9.6466216e-07F,
306
+ 1.0273513e-06F, 1.0941144e-06F, 1.1652161e-06F, 1.2409384e-06F,
307
+ 1.3215816e-06F, 1.4074654e-06F, 1.4989305e-06F, 1.5963394e-06F,
308
+ 1.7000785e-06F, 1.8105592e-06F, 1.9282195e-06F, 2.0535261e-06F,
309
+ 2.1869758e-06F, 2.3290978e-06F, 2.4804557e-06F, 2.6416497e-06F,
310
+ 2.8133190e-06F, 2.9961443e-06F, 3.1908506e-06F, 3.3982101e-06F,
311
+ 3.6190449e-06F, 3.8542308e-06F, 4.1047004e-06F, 4.3714470e-06F,
312
+ 4.6555282e-06F, 4.9580707e-06F, 5.2802740e-06F, 5.6234160e-06F,
313
+ 5.9888572e-06F, 6.3780469e-06F, 6.7925283e-06F, 7.2339451e-06F,
314
+ 7.7040476e-06F, 8.2047000e-06F, 8.7378876e-06F, 9.3057248e-06F,
315
+ 9.9104632e-06F, 1.0554501e-05F, 1.1240392e-05F, 1.1970856e-05F,
316
+ 1.2748789e-05F, 1.3577278e-05F, 1.4459606e-05F, 1.5399272e-05F,
317
+ 1.6400004e-05F, 1.7465768e-05F, 1.8600792e-05F, 1.9809576e-05F,
318
+ 2.1096914e-05F, 2.2467911e-05F, 2.3928002e-05F, 2.5482978e-05F,
319
+ 2.7139006e-05F, 2.8902651e-05F, 3.0780908e-05F, 3.2781225e-05F,
320
+ 3.4911534e-05F, 3.7180282e-05F, 3.9596466e-05F, 4.2169667e-05F,
321
+ 4.4910090e-05F, 4.7828601e-05F, 5.0936773e-05F, 5.4246931e-05F,
322
+ 5.7772202e-05F, 6.1526565e-05F, 6.5524908e-05F, 6.9783085e-05F,
323
+ 7.4317983e-05F, 7.9147585e-05F, 8.4291040e-05F, 8.9768747e-05F,
324
+ 9.5602426e-05F, 0.00010181521F, 0.00010843174F, 0.00011547824F,
325
+ 0.00012298267F, 0.00013097477F, 0.00013948625F, 0.00014855085F,
326
+ 0.00015820453F, 0.00016848555F, 0.00017943469F, 0.00019109536F,
327
+ 0.00020351382F, 0.00021673929F, 0.00023082423F, 0.00024582449F,
328
+ 0.00026179955F, 0.00027881276F, 0.00029693158F, 0.00031622787F,
329
+ 0.00033677814F, 0.00035866388F, 0.00038197188F, 0.00040679456F,
330
+ 0.00043323036F, 0.00046138411F, 0.00049136745F, 0.00052329927F,
331
+ 0.00055730621F, 0.00059352311F, 0.00063209358F, 0.00067317058F,
332
+ 0.00071691700F, 0.00076350630F, 0.00081312324F, 0.00086596457F,
333
+ 0.00092223983F, 0.00098217216F, 0.0010459992F, 0.0011139742F,
334
+ 0.0011863665F, 0.0012634633F, 0.0013455702F, 0.0014330129F,
335
+ 0.0015261382F, 0.0016253153F, 0.0017309374F, 0.0018434235F,
336
+ 0.0019632195F, 0.0020908006F, 0.0022266726F, 0.0023713743F,
337
+ 0.0025254795F, 0.0026895994F, 0.0028643847F, 0.0030505286F,
338
+ 0.0032487691F, 0.0034598925F, 0.0036847358F, 0.0039241906F,
339
+ 0.0041792066F, 0.0044507950F, 0.0047400328F, 0.0050480668F,
340
+ 0.0053761186F, 0.0057254891F, 0.0060975636F, 0.0064938176F,
341
+ 0.0069158225F, 0.0073652516F, 0.0078438871F, 0.0083536271F,
342
+ 0.0088964928F, 0.009474637F, 0.010090352F, 0.010746080F,
343
+ 0.011444421F, 0.012188144F, 0.012980198F, 0.013823725F,
344
+ 0.014722068F, 0.015678791F, 0.016697687F, 0.017782797F,
345
+ 0.018938423F, 0.020169149F, 0.021479854F, 0.022875735F,
346
+ 0.024362330F, 0.025945531F, 0.027631618F, 0.029427276F,
347
+ 0.031339626F, 0.033376252F, 0.035545228F, 0.037855157F,
348
+ 0.040315199F, 0.042935108F, 0.045725273F, 0.048696758F,
349
+ 0.051861348F, 0.055231591F, 0.058820850F, 0.062643361F,
350
+ 0.066714279F, 0.071049749F, 0.075666962F, 0.080584227F,
351
+ 0.085821044F, 0.091398179F, 0.097337747F, 0.10366330F,
352
+ 0.11039993F, 0.11757434F, 0.12521498F, 0.13335215F,
353
+ 0.14201813F, 0.15124727F, 0.16107617F, 0.17154380F,
354
+ 0.18269168F, 0.19456402F, 0.20720788F, 0.22067342F,
355
+ 0.23501402F, 0.25028656F, 0.26655159F, 0.28387361F,
356
+ 0.30232132F, 0.32196786F, 0.34289114F, 0.36517414F,
357
+ 0.38890521F, 0.41417847F, 0.44109412F, 0.46975890F,
358
+ 0.50028648F, 0.53279791F, 0.56742212F, 0.60429640F,
359
+ 0.64356699F, 0.68538959F, 0.72993007F, 0.77736504F,
360
+ 0.82788260F, 0.88168307F, 0.9389798F, 1.F,
361
+ };
362
+
363
+ static void render_line(int n, int x0,int x1,int y0,int y1,float *d){
364
+ int dy=y1-y0;
365
+ int adx=x1-x0;
366
+ int ady=abs(dy);
367
+ int base=dy/adx;
368
+ int sy=(dy<0?base-1:base+1);
369
+ int x=x0;
370
+ int y=y0;
371
+ int err=0;
372
+
373
+ ady-=abs(base*adx);
374
+
375
+ if(n>x1)n=x1;
376
+
377
+ if(x<n)
378
+ d[x]*=FLOOR1_fromdB_LOOKUP[y];
379
+
380
+ while(++x<n){
381
+ err=err+ady;
382
+ if(err>=adx){
383
+ err-=adx;
384
+ y+=sy;
385
+ }else{
386
+ y+=base;
387
+ }
388
+ d[x]*=FLOOR1_fromdB_LOOKUP[y];
389
+ }
390
+ }
391
+
392
+ static void render_line0(int n, int x0,int x1,int y0,int y1,int *d){
393
+ int dy=y1-y0;
394
+ int adx=x1-x0;
395
+ int ady=abs(dy);
396
+ int base=dy/adx;
397
+ int sy=(dy<0?base-1:base+1);
398
+ int x=x0;
399
+ int y=y0;
400
+ int err=0;
401
+
402
+ ady-=abs(base*adx);
403
+
404
+ if(n>x1)n=x1;
405
+
406
+ if(x<n)
407
+ d[x]=y;
408
+
409
+ while(++x<n){
410
+ err=err+ady;
411
+ if(err>=adx){
412
+ err-=adx;
413
+ y+=sy;
414
+ }else{
415
+ y+=base;
416
+ }
417
+ d[x]=y;
418
+ }
419
+ }
420
+
421
+ /* the floor has already been filtered to only include relevant sections */
422
+ static int accumulate_fit(const float *flr,const float *mdct,
423
+ int x0, int x1,lsfit_acc *a,
424
+ int n,vorbis_info_floor1 *info){
425
+ long i;
426
+
427
+ int xa=0,ya=0,x2a=0,y2a=0,xya=0,na=0, xb=0,yb=0,x2b=0,y2b=0,xyb=0,nb=0;
428
+
429
+ memset(a,0,sizeof(*a));
430
+ a->x0=x0;
431
+ a->x1=x1;
432
+ if(x1>=n)x1=n-1;
433
+
434
+ for(i=x0;i<=x1;i++){
435
+ int quantized=vorbis_dBquant(flr+i);
436
+ if(quantized){
437
+ if(mdct[i]+info->twofitatten>=flr[i]){
438
+ xa += i;
439
+ ya += quantized;
440
+ x2a += i*i;
441
+ y2a += quantized*quantized;
442
+ xya += i*quantized;
443
+ na++;
444
+ }else{
445
+ xb += i;
446
+ yb += quantized;
447
+ x2b += i*i;
448
+ y2b += quantized*quantized;
449
+ xyb += i*quantized;
450
+ nb++;
451
+ }
452
+ }
453
+ }
454
+
455
+ a->xa=xa;
456
+ a->ya=ya;
457
+ a->x2a=x2a;
458
+ a->y2a=y2a;
459
+ a->xya=xya;
460
+ a->an=na;
461
+
462
+ a->xb=xb;
463
+ a->yb=yb;
464
+ a->x2b=x2b;
465
+ a->y2b=y2b;
466
+ a->xyb=xyb;
467
+ a->bn=nb;
468
+
469
+ return(na);
470
+ }
471
+
472
+ static int fit_line(lsfit_acc *a,int fits,int *y0,int *y1,
473
+ vorbis_info_floor1 *info){
474
+ double xb=0,yb=0,x2b=0,y2b=0,xyb=0,bn=0;
475
+ int i;
476
+ int x0=a[0].x0;
477
+ int x1=a[fits-1].x1;
478
+
479
+ for(i=0;i<fits;i++){
480
+ double weight = (a[i].bn+a[i].an)*info->twofitweight/(a[i].an+1)+1.;
481
+
482
+ xb+=a[i].xb + a[i].xa * weight;
483
+ yb+=a[i].yb + a[i].ya * weight;
484
+ x2b+=a[i].x2b + a[i].x2a * weight;
485
+ y2b+=a[i].y2b + a[i].y2a * weight;
486
+ xyb+=a[i].xyb + a[i].xya * weight;
487
+ bn+=a[i].bn + a[i].an * weight;
488
+ }
489
+
490
+ if(*y0>=0){
491
+ xb+= x0;
492
+ yb+= *y0;
493
+ x2b+= x0 * x0;
494
+ y2b+= *y0 * *y0;
495
+ xyb+= *y0 * x0;
496
+ bn++;
497
+ }
498
+
499
+ if(*y1>=0){
500
+ xb+= x1;
501
+ yb+= *y1;
502
+ x2b+= x1 * x1;
503
+ y2b+= *y1 * *y1;
504
+ xyb+= *y1 * x1;
505
+ bn++;
506
+ }
507
+
508
+ {
509
+ double denom=(bn*x2b-xb*xb);
510
+
511
+ if(denom>0.){
512
+ double a=(yb*x2b-xyb*xb)/denom;
513
+ double b=(bn*xyb-xb*yb)/denom;
514
+ *y0=rint(a+b*x0);
515
+ *y1=rint(a+b*x1);
516
+
517
+ /* limit to our range! */
518
+ if(*y0>1023)*y0=1023;
519
+ if(*y1>1023)*y1=1023;
520
+ if(*y0<0)*y0=0;
521
+ if(*y1<0)*y1=0;
522
+
523
+ return 0;
524
+ }else{
525
+ *y0=0;
526
+ *y1=0;
527
+ return 1;
528
+ }
529
+ }
530
+ }
531
+
532
+ static int inspect_error(int x0,int x1,int y0,int y1,const float *mask,
533
+ const float *mdct,
534
+ vorbis_info_floor1 *info){
535
+ int dy=y1-y0;
536
+ int adx=x1-x0;
537
+ int ady=abs(dy);
538
+ int base=dy/adx;
539
+ int sy=(dy<0?base-1:base+1);
540
+ int x=x0;
541
+ int y=y0;
542
+ int err=0;
543
+ int val=vorbis_dBquant(mask+x);
544
+ int mse=0;
545
+ int n=0;
546
+
547
+ ady-=abs(base*adx);
548
+
549
+ mse=(y-val);
550
+ mse*=mse;
551
+ n++;
552
+ if(mdct[x]+info->twofitatten>=mask[x]){
553
+ if(y+info->maxover<val)return(1);
554
+ if(y-info->maxunder>val)return(1);
555
+ }
556
+
557
+ while(++x<x1){
558
+ err=err+ady;
559
+ if(err>=adx){
560
+ err-=adx;
561
+ y+=sy;
562
+ }else{
563
+ y+=base;
564
+ }
565
+
566
+ val=vorbis_dBquant(mask+x);
567
+ mse+=((y-val)*(y-val));
568
+ n++;
569
+ if(mdct[x]+info->twofitatten>=mask[x]){
570
+ if(val){
571
+ if(y+info->maxover<val)return(1);
572
+ if(y-info->maxunder>val)return(1);
573
+ }
574
+ }
575
+ }
576
+
577
+ if(info->maxover*info->maxover/n>info->maxerr)return(0);
578
+ if(info->maxunder*info->maxunder/n>info->maxerr)return(0);
579
+ if(mse/n>info->maxerr)return(1);
580
+ return(0);
581
+ }
582
+
583
+ static int post_Y(int *A,int *B,int pos){
584
+ if(A[pos]<0)
585
+ return B[pos];
586
+ if(B[pos]<0)
587
+ return A[pos];
588
+
589
+ return (A[pos]+B[pos])>>1;
590
+ }
591
+
592
+ int *floor1_fit(vorbis_block *vb,vorbis_look_floor1 *look,
593
+ const float *logmdct, /* in */
594
+ const float *logmask){
595
+ long i,j;
596
+ vorbis_info_floor1 *info=look->vi;
597
+ long n=look->n;
598
+ long posts=look->posts;
599
+ long nonzero=0;
600
+ lsfit_acc fits[VIF_POSIT+1];
601
+ int fit_valueA[VIF_POSIT+2]; /* index by range list position */
602
+ int fit_valueB[VIF_POSIT+2]; /* index by range list position */
603
+
604
+ int loneighbor[VIF_POSIT+2]; /* sorted index of range list position (+2) */
605
+ int hineighbor[VIF_POSIT+2];
606
+ int *output=NULL;
607
+ int memo[VIF_POSIT+2];
608
+
609
+ for(i=0;i<posts;i++)fit_valueA[i]=-200; /* mark all unused */
610
+ for(i=0;i<posts;i++)fit_valueB[i]=-200; /* mark all unused */
611
+ for(i=0;i<posts;i++)loneighbor[i]=0; /* 0 for the implicit 0 post */
612
+ for(i=0;i<posts;i++)hineighbor[i]=1; /* 1 for the implicit post at n */
613
+ for(i=0;i<posts;i++)memo[i]=-1; /* no neighbor yet */
614
+
615
+ /* quantize the relevant floor points and collect them into line fit
616
+ structures (one per minimal division) at the same time */
617
+ if(posts==0){
618
+ nonzero+=accumulate_fit(logmask,logmdct,0,n,fits,n,info);
619
+ }else{
620
+ for(i=0;i<posts-1;i++)
621
+ nonzero+=accumulate_fit(logmask,logmdct,look->sorted_index[i],
622
+ look->sorted_index[i+1],fits+i,
623
+ n,info);
624
+ }
625
+
626
+ if(nonzero){
627
+ /* start by fitting the implicit base case.... */
628
+ int y0=-200;
629
+ int y1=-200;
630
+ fit_line(fits,posts-1,&y0,&y1,info);
631
+
632
+ fit_valueA[0]=y0;
633
+ fit_valueB[0]=y0;
634
+ fit_valueB[1]=y1;
635
+ fit_valueA[1]=y1;
636
+
637
+ /* Non degenerate case */
638
+ /* start progressive splitting. This is a greedy, non-optimal
639
+ algorithm, but simple and close enough to the best
640
+ answer. */
641
+ for(i=2;i<posts;i++){
642
+ int sortpos=look->reverse_index[i];
643
+ int ln=loneighbor[sortpos];
644
+ int hn=hineighbor[sortpos];
645
+
646
+ /* eliminate repeat searches of a particular range with a memo */
647
+ if(memo[ln]!=hn){
648
+ /* haven't performed this error search yet */
649
+ int lsortpos=look->reverse_index[ln];
650
+ int hsortpos=look->reverse_index[hn];
651
+ memo[ln]=hn;
652
+
653
+ {
654
+ /* A note: we want to bound/minimize *local*, not global, error */
655
+ int lx=info->postlist[ln];
656
+ int hx=info->postlist[hn];
657
+ int ly=post_Y(fit_valueA,fit_valueB,ln);
658
+ int hy=post_Y(fit_valueA,fit_valueB,hn);
659
+
660
+ if(ly==-1 || hy==-1){
661
+ exit(1);
662
+ }
663
+
664
+ if(inspect_error(lx,hx,ly,hy,logmask,logmdct,info)){
665
+ /* outside error bounds/begin search area. Split it. */
666
+ int ly0=-200;
667
+ int ly1=-200;
668
+ int hy0=-200;
669
+ int hy1=-200;
670
+ int ret0=fit_line(fits+lsortpos,sortpos-lsortpos,&ly0,&ly1,info);
671
+ int ret1=fit_line(fits+sortpos,hsortpos-sortpos,&hy0,&hy1,info);
672
+
673
+ if(ret0){
674
+ ly0=ly;
675
+ ly1=hy0;
676
+ }
677
+ if(ret1){
678
+ hy0=ly1;
679
+ hy1=hy;
680
+ }
681
+
682
+ if(ret0 && ret1){
683
+ fit_valueA[i]=-200;
684
+ fit_valueB[i]=-200;
685
+ }else{
686
+ /* store new edge values */
687
+ fit_valueB[ln]=ly0;
688
+ if(ln==0)fit_valueA[ln]=ly0;
689
+ fit_valueA[i]=ly1;
690
+ fit_valueB[i]=hy0;
691
+ fit_valueA[hn]=hy1;
692
+ if(hn==1)fit_valueB[hn]=hy1;
693
+
694
+ if(ly1>=0 || hy0>=0){
695
+ /* store new neighbor values */
696
+ for(j=sortpos-1;j>=0;j--)
697
+ if(hineighbor[j]==hn)
698
+ hineighbor[j]=i;
699
+ else
700
+ break;
701
+ for(j=sortpos+1;j<posts;j++)
702
+ if(loneighbor[j]==ln)
703
+ loneighbor[j]=i;
704
+ else
705
+ break;
706
+ }
707
+ }
708
+ }else{
709
+ fit_valueA[i]=-200;
710
+ fit_valueB[i]=-200;
711
+ }
712
+ }
713
+ }
714
+ }
715
+
716
+ output=_vorbis_block_alloc(vb,sizeof(*output)*posts);
717
+
718
+ output[0]=post_Y(fit_valueA,fit_valueB,0);
719
+ output[1]=post_Y(fit_valueA,fit_valueB,1);
720
+
721
+ /* fill in posts marked as not using a fit; we will zero
722
+ back out to 'unused' when encoding them so long as curve
723
+ interpolation doesn't force them into use */
724
+ for(i=2;i<posts;i++){
725
+ int ln=look->loneighbor[i-2];
726
+ int hn=look->hineighbor[i-2];
727
+ int x0=info->postlist[ln];
728
+ int x1=info->postlist[hn];
729
+ int y0=output[ln];
730
+ int y1=output[hn];
731
+
732
+ int predicted=render_point(x0,x1,y0,y1,info->postlist[i]);
733
+ int vx=post_Y(fit_valueA,fit_valueB,i);
734
+
735
+ if(vx>=0 && predicted!=vx){
736
+ output[i]=vx;
737
+ }else{
738
+ output[i]= predicted|0x8000;
739
+ }
740
+ }
741
+ }
742
+
743
+ return(output);
744
+
745
+ }
746
+
747
+ int *floor1_interpolate_fit(vorbis_block *vb,vorbis_look_floor1 *look,
748
+ int *A,int *B,
749
+ int del){
750
+
751
+ long i;
752
+ long posts=look->posts;
753
+ int *output=NULL;
754
+
755
+ if(A && B){
756
+ output=_vorbis_block_alloc(vb,sizeof(*output)*posts);
757
+
758
+ /* overly simpleminded--- look again post 1.2 */
759
+ for(i=0;i<posts;i++){
760
+ output[i]=((65536-del)*(A[i]&0x7fff)+del*(B[i]&0x7fff)+32768)>>16;
761
+ if(A[i]&0x8000 && B[i]&0x8000)output[i]|=0x8000;
762
+ }
763
+ }
764
+
765
+ return(output);
766
+ }
767
+
768
+
769
+ int floor1_encode(oggpack_buffer *opb,vorbis_block *vb,
770
+ vorbis_look_floor1 *look,
771
+ int *post,int *ilogmask){
772
+
773
+ long i,j;
774
+ vorbis_info_floor1 *info=look->vi;
775
+ long posts=look->posts;
776
+ codec_setup_info *ci=vb->vd->vi->codec_setup;
777
+ int out[VIF_POSIT+2];
778
+ static_codebook **sbooks=ci->book_param;
779
+ codebook *books=ci->fullbooks;
780
+
781
+ /* quantize values to multiplier spec */
782
+ if(post){
783
+ for(i=0;i<posts;i++){
784
+ int val=post[i]&0x7fff;
785
+ switch(info->mult){
786
+ case 1: /* 1024 -> 256 */
787
+ val>>=2;
788
+ break;
789
+ case 2: /* 1024 -> 128 */
790
+ val>>=3;
791
+ break;
792
+ case 3: /* 1024 -> 86 */
793
+ val/=12;
794
+ break;
795
+ case 4: /* 1024 -> 64 */
796
+ val>>=4;
797
+ break;
798
+ }
799
+ post[i]=val | (post[i]&0x8000);
800
+ }
801
+
802
+ out[0]=post[0];
803
+ out[1]=post[1];
804
+
805
+ /* find prediction values for each post and subtract them */
806
+ for(i=2;i<posts;i++){
807
+ int ln=look->loneighbor[i-2];
808
+ int hn=look->hineighbor[i-2];
809
+ int x0=info->postlist[ln];
810
+ int x1=info->postlist[hn];
811
+ int y0=post[ln];
812
+ int y1=post[hn];
813
+
814
+ int predicted=render_point(x0,x1,y0,y1,info->postlist[i]);
815
+
816
+ if((post[i]&0x8000) || (predicted==post[i])){
817
+ post[i]=predicted|0x8000; /* in case there was roundoff jitter
818
+ in interpolation */
819
+ out[i]=0;
820
+ }else{
821
+ int headroom=(look->quant_q-predicted<predicted?
822
+ look->quant_q-predicted:predicted);
823
+
824
+ int val=post[i]-predicted;
825
+
826
+ /* at this point the 'deviation' value is in the range +/- max
827
+ range, but the real, unique range can always be mapped to
828
+ only [0-maxrange). So we want to wrap the deviation into
829
+ this limited range, but do it in the way that least screws
830
+ an essentially gaussian probability distribution. */
831
+
832
+ if(val<0)
833
+ if(val<-headroom)
834
+ val=headroom-val-1;
835
+ else
836
+ val=-1-(val<<1);
837
+ else
838
+ if(val>=headroom)
839
+ val= val+headroom;
840
+ else
841
+ val<<=1;
842
+
843
+ out[i]=val;
844
+ post[ln]&=0x7fff;
845
+ post[hn]&=0x7fff;
846
+ }
847
+ }
848
+
849
+ /* we have everything we need. pack it out */
850
+ /* mark nontrivial floor */
851
+ oggpack_write(opb,1,1);
852
+
853
+ /* beginning/end post */
854
+ look->frames++;
855
+ look->postbits+=ilog(look->quant_q-1)*2;
856
+ oggpack_write(opb,out[0],ilog(look->quant_q-1));
857
+ oggpack_write(opb,out[1],ilog(look->quant_q-1));
858
+
859
+
860
+ /* partition by partition */
861
+ for(i=0,j=2;i<info->partitions;i++){
862
+ int class=info->partitionclass[i];
863
+ int cdim=info->class_dim[class];
864
+ int csubbits=info->class_subs[class];
865
+ int csub=1<<csubbits;
866
+ int bookas[8]={0,0,0,0,0,0,0,0};
867
+ int cval=0;
868
+ int cshift=0;
869
+ int k,l;
870
+
871
+ /* generate the partition's first stage cascade value */
872
+ if(csubbits){
873
+ int maxval[8];
874
+ for(k=0;k<csub;k++){
875
+ int booknum=info->class_subbook[class][k];
876
+ if(booknum<0){
877
+ maxval[k]=1;
878
+ }else{
879
+ maxval[k]=sbooks[info->class_subbook[class][k]]->entries;
880
+ }
881
+ }
882
+ for(k=0;k<cdim;k++){
883
+ for(l=0;l<csub;l++){
884
+ int val=out[j+k];
885
+ if(val<maxval[l]){
886
+ bookas[k]=l;
887
+ break;
888
+ }
889
+ }
890
+ cval|= bookas[k]<<cshift;
891
+ cshift+=csubbits;
892
+ }
893
+ /* write it */
894
+ look->phrasebits+=
895
+ vorbis_book_encode(books+info->class_book[class],cval,opb);
896
+
897
+ #ifdef TRAIN_FLOOR1
898
+ {
899
+ FILE *of;
900
+ char buffer[80];
901
+ sprintf(buffer,"line_%dx%ld_class%d.vqd",
902
+ vb->pcmend/2,posts-2,class);
903
+ of=fopen(buffer,"a");
904
+ fprintf(of,"%d\n",cval);
905
+ fclose(of);
906
+ }
907
+ #endif
908
+ }
909
+
910
+ /* write post values */
911
+ for(k=0;k<cdim;k++){
912
+ int book=info->class_subbook[class][bookas[k]];
913
+ if(book>=0){
914
+ /* hack to allow training with 'bad' books */
915
+ if(out[j+k]<(books+book)->entries)
916
+ look->postbits+=vorbis_book_encode(books+book,
917
+ out[j+k],opb);
918
+ /*else
919
+ fprintf(stderr,"+!");*/
920
+
921
+ #ifdef TRAIN_FLOOR1
922
+ {
923
+ FILE *of;
924
+ char buffer[80];
925
+ sprintf(buffer,"line_%dx%ld_%dsub%d.vqd",
926
+ vb->pcmend/2,posts-2,class,bookas[k]);
927
+ of=fopen(buffer,"a");
928
+ fprintf(of,"%d\n",out[j+k]);
929
+ fclose(of);
930
+ }
931
+ #endif
932
+ }
933
+ }
934
+ j+=cdim;
935
+ }
936
+
937
+ {
938
+ /* generate quantized floor equivalent to what we'd unpack in decode */
939
+ /* render the lines */
940
+ int hx=0;
941
+ int lx=0;
942
+ int ly=post[0]*info->mult;
943
+ int n=ci->blocksizes[vb->W]/2;
944
+
945
+ for(j=1;j<look->posts;j++){
946
+ int current=look->forward_index[j];
947
+ int hy=post[current]&0x7fff;
948
+ if(hy==post[current]){
949
+
950
+ hy*=info->mult;
951
+ hx=info->postlist[current];
952
+
953
+ render_line0(n,lx,hx,ly,hy,ilogmask);
954
+
955
+ lx=hx;
956
+ ly=hy;
957
+ }
958
+ }
959
+ for(j=hx;j<vb->pcmend/2;j++)ilogmask[j]=ly; /* be certain */
960
+ return(1);
961
+ }
962
+ }else{
963
+ oggpack_write(opb,0,1);
964
+ memset(ilogmask,0,vb->pcmend/2*sizeof(*ilogmask));
965
+ return(0);
966
+ }
967
+ }
968
+
969
+ static void *floor1_inverse1(vorbis_block *vb,vorbis_look_floor *in){
970
+ vorbis_look_floor1 *look=(vorbis_look_floor1 *)in;
971
+ vorbis_info_floor1 *info=look->vi;
972
+ codec_setup_info *ci=vb->vd->vi->codec_setup;
973
+
974
+ int i,j,k;
975
+ codebook *books=ci->fullbooks;
976
+
977
+ /* unpack wrapped/predicted values from stream */
978
+ if(oggpack_read(&vb->opb,1)==1){
979
+ int *fit_value=_vorbis_block_alloc(vb,(look->posts)*sizeof(*fit_value));
980
+
981
+ fit_value[0]=oggpack_read(&vb->opb,ilog(look->quant_q-1));
982
+ fit_value[1]=oggpack_read(&vb->opb,ilog(look->quant_q-1));
983
+
984
+ /* partition by partition */
985
+ for(i=0,j=2;i<info->partitions;i++){
986
+ int class=info->partitionclass[i];
987
+ int cdim=info->class_dim[class];
988
+ int csubbits=info->class_subs[class];
989
+ int csub=1<<csubbits;
990
+ int cval=0;
991
+
992
+ /* decode the partition's first stage cascade value */
993
+ if(csubbits){
994
+ cval=vorbis_book_decode(books+info->class_book[class],&vb->opb);
995
+
996
+ if(cval==-1)goto eop;
997
+ }
998
+
999
+ for(k=0;k<cdim;k++){
1000
+ int book=info->class_subbook[class][cval&(csub-1)];
1001
+ cval>>=csubbits;
1002
+ if(book>=0){
1003
+ if((fit_value[j+k]=vorbis_book_decode(books+book,&vb->opb))==-1)
1004
+ goto eop;
1005
+ }else{
1006
+ fit_value[j+k]=0;
1007
+ }
1008
+ }
1009
+ j+=cdim;
1010
+ }
1011
+
1012
+ /* unwrap positive values and reconsitute via linear interpolation */
1013
+ for(i=2;i<look->posts;i++){
1014
+ int predicted=render_point(info->postlist[look->loneighbor[i-2]],
1015
+ info->postlist[look->hineighbor[i-2]],
1016
+ fit_value[look->loneighbor[i-2]],
1017
+ fit_value[look->hineighbor[i-2]],
1018
+ info->postlist[i]);
1019
+ int hiroom=look->quant_q-predicted;
1020
+ int loroom=predicted;
1021
+ int room=(hiroom<loroom?hiroom:loroom)<<1;
1022
+ int val=fit_value[i];
1023
+
1024
+ if(val){
1025
+ if(val>=room){
1026
+ if(hiroom>loroom){
1027
+ val = val-loroom;
1028
+ }else{
1029
+ val = -1-(val-hiroom);
1030
+ }
1031
+ }else{
1032
+ if(val&1){
1033
+ val= -((val+1)>>1);
1034
+ }else{
1035
+ val>>=1;
1036
+ }
1037
+ }
1038
+
1039
+ fit_value[i]=(val+predicted)&0x7fff;
1040
+ fit_value[look->loneighbor[i-2]]&=0x7fff;
1041
+ fit_value[look->hineighbor[i-2]]&=0x7fff;
1042
+
1043
+ }else{
1044
+ fit_value[i]=predicted|0x8000;
1045
+ }
1046
+
1047
+ }
1048
+
1049
+ return(fit_value);
1050
+ }
1051
+ eop:
1052
+ return(NULL);
1053
+ }
1054
+
1055
+ static int floor1_inverse2(vorbis_block *vb,vorbis_look_floor *in,void *memo,
1056
+ float *out){
1057
+ vorbis_look_floor1 *look=(vorbis_look_floor1 *)in;
1058
+ vorbis_info_floor1 *info=look->vi;
1059
+
1060
+ codec_setup_info *ci=vb->vd->vi->codec_setup;
1061
+ int n=ci->blocksizes[vb->W]/2;
1062
+ int j;
1063
+
1064
+ if(memo){
1065
+ /* render the lines */
1066
+ int *fit_value=(int *)memo;
1067
+ int hx=0;
1068
+ int lx=0;
1069
+ int ly=fit_value[0]*info->mult;
1070
+ /* guard lookup against out-of-range values */
1071
+ ly=(ly<0?0:ly>255?255:ly);
1072
+
1073
+ for(j=1;j<look->posts;j++){
1074
+ int current=look->forward_index[j];
1075
+ int hy=fit_value[current]&0x7fff;
1076
+ if(hy==fit_value[current]){
1077
+
1078
+ hx=info->postlist[current];
1079
+ hy*=info->mult;
1080
+ /* guard lookup against out-of-range values */
1081
+ hy=(hy<0?0:hy>255?255:hy);
1082
+
1083
+ render_line(n,lx,hx,ly,hy,out);
1084
+
1085
+ lx=hx;
1086
+ ly=hy;
1087
+ }
1088
+ }
1089
+ for(j=hx;j<n;j++)out[j]*=FLOOR1_fromdB_LOOKUP[ly]; /* be certain */
1090
+ return(1);
1091
+ }
1092
+ memset(out,0,sizeof(*out)*n);
1093
+ return(0);
1094
+ }
1095
+
1096
+ /* export hooks */
1097
+ const vorbis_func_floor floor1_exportbundle={
1098
+ &floor1_pack,&floor1_unpack,&floor1_look,&floor1_free_info,
1099
+ &floor1_free_look,&floor1_inverse1,&floor1_inverse2
1100
+ };