@modplayjs/stb-vorbis 0.0.0-stage → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,3 +1,31 @@
1
- # Temporary Holding Version
1
+ # @modplayjs/stb-vorbis
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ **Ogg Vorbis decoder** — a 1:1 TypeScript port of stb_vorbis.c from the
4
+ OpenMPT reference bundle (`reference/openmpt/include/stb_vorbis/`).
5
+
6
+ **Verified bit-exact** against the compiled C reference: max sample
7
+ difference 4.8e-7 over a 1.33-million-frame render, byte-identical int16
8
+ output across the full test corpus.
9
+
10
+ Used by `@modplayjs/fmt-mo3` (MO3 v5 Ogg-compressed samples, incl.
11
+ shared-Ogg-header remux) and `@modplayjs/stream-audio` (.ogg files).
12
+
13
+ ## Install
14
+
15
+ ```sh
16
+ npm install @modplayjs/stb-vorbis
17
+ ```
18
+
19
+ ## Usage
20
+
21
+ ```ts
22
+ import { stbVorbisOpenMemory, stbVorbisGetFrameFloat } from '@modplayjs/stb-vorbis';
23
+
24
+ const v = stbVorbisOpenMemory(bytes);
25
+ // then pull interleaved float frames per audio block
26
+ ```
27
+
28
+ stb_vorbis is public domain (Sean Barrett); see [NOTICE](../../NOTICE).
29
+
30
+ Part of the [modplayjs monorepo](../../README.md). BSD-3-Clause for the
31
+ port.
@@ -0,0 +1,19 @@
1
+ import { type Vorb, type Codebook } from './types.js';
2
+ import { getBits } from './stream.js';
3
+ export declare function bitReverse(n: number): number;
4
+ export declare function ilog(n: number): number;
5
+ export declare function float32Unpack(x: number): number;
6
+ export declare function lookup1Values(entries: number, dim: number): number;
7
+ export declare function computeCodewords(c: Codebook, len: Uint8Array, n: number, values: Uint32Array | null): boolean;
8
+ export declare function computeAcceleratedHuffman(c: Codebook): void;
9
+ export declare function computeSortedHuffman(c: Codebook, lengths: Uint8Array, values: Uint32Array | null): void;
10
+ export declare function decodeRawShared(z: Vorb, c: Codebook): number;
11
+ export declare function codebookDecode(z: Vorb, c: Codebook, output: Float32Array, len0: number): boolean;
12
+ export declare function codebookDecodeStep(z: Vorb, c: Codebook, output: Float32Array, off: number, len0: number, step: number): boolean;
13
+ export declare function codebookDecodeDeinterleaveRepeat(z: Vorb, c: Codebook, outputs: Array<Float32Array | null>, ch: number, cInterP: {
14
+ v: number;
15
+ }, pInterP: {
16
+ v: number;
17
+ }, len: number, totalDecode0: number): boolean;
18
+ export { getBits };
19
+ //# sourceMappingURL=codebook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codebook.d.ts","sourceRoot":"","sources":["../src/codebook.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,IAAI,EAAE,KAAK,QAAQ,EAEzB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAe,OAAO,EAAE,MAAM,aAAa,CAAC;AAEnD,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAM5C;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAYtC;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAM/C;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAMlE;AAYD,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,CAuB7G;AAED,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAY3D;AAQD,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,CAmCvG;AAyCD,wBAAgB,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAE5D;AA+BD,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAkBhG;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAY/H;AAED,wBAAgB,gCAAgC,CAC9C,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EACrE,OAAO,EAAE;IAAE,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,OAAO,EAAE;IAAE,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAChF,OAAO,CAuCT;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
@@ -0,0 +1,332 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Ported from stb_vorbis.c — codebooks: codeword computation, accelerated
3
+ // huffman, sorted tables, VQ lookup expansion, and scalar decode.
4
+ import { NO_CODE, FAST_HUFFMAN_TABLE_SIZE, FAST_HUFFMAN_TABLE_MASK, STB_VORBIS_FAST_HUFFMAN_LENGTH, } from './types.js';
5
+ import { prepHuffman, getBits } from './stream.js';
6
+ export function bitReverse(n) {
7
+ n = ((n & 0xaaaaaaaa) >>> 1) | ((n & 0x55555555) << 1);
8
+ n = ((n & 0xcccccccc) >>> 2) | ((n & 0x33333333) << 2);
9
+ n = ((n & 0xf0f0f0f0) >>> 4) | ((n & 0x0f0f0f0f) << 4);
10
+ n = ((n & 0xff00ff00) >>> 8) | ((n & 0x00ff00ff) << 8);
11
+ return (n >>> 16 | n << 16) >>> 0;
12
+ }
13
+ export function ilog(n) {
14
+ const log2_4 = [0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4];
15
+ if (n < 0)
16
+ return 0;
17
+ if (n < (1 << 14)) {
18
+ if (n < (1 << 4))
19
+ return 0 + log2_4[n];
20
+ else if (n < (1 << 9))
21
+ return 5 + log2_4[n >> 5];
22
+ else
23
+ return 10 + log2_4[n >> 10];
24
+ }
25
+ else if (n < (1 << 24)) {
26
+ if (n < (1 << 19))
27
+ return 15 + log2_4[n >> 15];
28
+ else
29
+ return 20 + log2_4[n >> 20];
30
+ }
31
+ else if (n < (1 << 29))
32
+ return 25 + log2_4[n >> 25];
33
+ else
34
+ return 30 + log2_4[n >>> 30];
35
+ }
36
+ export function float32Unpack(x) {
37
+ const mantissa = x & 0x1fffff;
38
+ const sign = x & 0x80000000;
39
+ const exp = (x & 0x7fe00000) >> 21;
40
+ const res = sign ? -mantissa : mantissa;
41
+ return Math.fround(res * Math.pow(2, exp - 788));
42
+ }
43
+ export function lookup1Values(entries, dim) {
44
+ let r = Math.floor(Math.exp(Math.log(entries) / dim));
45
+ if (Math.floor(Math.pow(r + 1, dim)) <= entries)
46
+ ++r;
47
+ if (Math.pow(r + 1, dim) <= entries)
48
+ return -1;
49
+ if (Math.floor(Math.pow(r, dim)) > entries)
50
+ return -1;
51
+ return r;
52
+ }
53
+ function addEntry(c, huffCode, symbol, count, len, values) {
54
+ if (!c.sparse) {
55
+ c.codewords[symbol] = huffCode;
56
+ }
57
+ else {
58
+ c.codewords[count] = huffCode;
59
+ c.codewordLengths[count] = len;
60
+ values[count] = symbol;
61
+ }
62
+ }
63
+ export function computeCodewords(c, len, n, values) {
64
+ let m = 0;
65
+ const available = new Uint32Array(32);
66
+ let k = 0;
67
+ for (; k < n; ++k)
68
+ if (len[k] < NO_CODE)
69
+ break;
70
+ if (k === n)
71
+ return true;
72
+ addEntry(c, 0, k, m++, len[k], values);
73
+ for (let i = 1; i <= len[k]; ++i)
74
+ available[i] = (1 << (32 - i)) >>> 0;
75
+ for (let i = k + 1; i < n; ++i) {
76
+ let z = len[i];
77
+ if (z === NO_CODE)
78
+ continue;
79
+ while (z > 0 && available[z] === 0)
80
+ --z;
81
+ if (z === 0)
82
+ return false;
83
+ const res = available[z];
84
+ available[z] = 0;
85
+ addEntry(c, bitReverse(res), i, m++, len[i], values);
86
+ if (z !== len[i]) {
87
+ for (let y = len[i]; y > z; --y) {
88
+ available[y] = (res + (1 << (32 - y))) >>> 0;
89
+ }
90
+ }
91
+ }
92
+ return true;
93
+ }
94
+ export function computeAcceleratedHuffman(c) {
95
+ for (let i = 0; i < FAST_HUFFMAN_TABLE_SIZE; ++i)
96
+ c.fastHuffman[i] = -1;
97
+ const len = c.sparse ? c.sortedEntries : c.entries;
98
+ for (let i = 0; i < len; ++i) {
99
+ if (c.codewordLengths[i] <= STB_VORBIS_FAST_HUFFMAN_LENGTH) {
100
+ let z = c.sparse ? bitReverse(c.sortedCodewords[i]) : c.codewords[i];
101
+ while (z < FAST_HUFFMAN_TABLE_SIZE) {
102
+ c.fastHuffman[z] = i;
103
+ z += 1 << c.codewordLengths[i];
104
+ }
105
+ }
106
+ }
107
+ }
108
+ function includeInSort(c, len) {
109
+ if (c.sparse)
110
+ return true;
111
+ if (len === NO_CODE)
112
+ return false;
113
+ return len > STB_VORBIS_FAST_HUFFMAN_LENGTH;
114
+ }
115
+ export function computeSortedHuffman(c, lengths, values) {
116
+ if (!c.sparse) {
117
+ let k = 0;
118
+ for (let i = 0; i < c.entries; ++i) {
119
+ if (includeInSort(c, lengths[i]))
120
+ c.sortedCodewords[k++] = bitReverse(c.codewords[i]);
121
+ }
122
+ }
123
+ else {
124
+ for (let i = 0; i < c.sortedEntries; ++i) {
125
+ c.sortedCodewords[i] = bitReverse(c.codewords[i]);
126
+ }
127
+ }
128
+ const arr = c.sortedCodewords;
129
+ const sub = arr.subarray(0, c.sortedEntries);
130
+ Array.prototype.sort.call(sub, (a, b) => a - b);
131
+ arr.subarray(0, c.sortedEntries).set(sub);
132
+ arr[c.sortedEntries] = 0xffffffff;
133
+ const len = c.sparse ? c.sortedEntries : c.entries;
134
+ for (let i = 0; i < len; ++i) {
135
+ const huffLen = c.sparse ? lengths[values[i]] : lengths[i];
136
+ if (includeInSort(c, huffLen)) {
137
+ const code = bitReverse(c.codewords[i]);
138
+ let x = 0, n = c.sortedEntries;
139
+ while (n > 1) {
140
+ const m = x + (n >> 1);
141
+ if (c.sortedCodewords[m] <= code) {
142
+ x = m;
143
+ n -= n >> 1;
144
+ }
145
+ else
146
+ n >>= 1;
147
+ }
148
+ if (c.sparse) {
149
+ c.sortedValues[x] = values[i];
150
+ c.codewordLengths[x] = huffLen;
151
+ }
152
+ else {
153
+ c.sortedValues[x] = i;
154
+ }
155
+ }
156
+ }
157
+ }
158
+ // huffman scalar decode (stb_vorbis.c:1665-1783)
159
+ function codebookDecodeScalarRaw(z, c) {
160
+ prepHuffman(z);
161
+ if (c.codewords === null && c.sortedCodewords === null)
162
+ return -1;
163
+ if (c.entries > 8 ? c.sortedCodewords !== null : c.codewords === null) {
164
+ const code = bitReverse(z.acc);
165
+ let x = 0, n = c.sortedEntries;
166
+ while (n > 1) {
167
+ const m = x + (n >> 1);
168
+ if (c.sortedCodewords[m] <= code) {
169
+ x = m;
170
+ n -= n >> 1;
171
+ }
172
+ else
173
+ n >>= 1;
174
+ }
175
+ if (!c.sparse)
176
+ x = c.sortedValues[x];
177
+ const len = c.codewordLengths[x];
178
+ if (z.validBits >= len) {
179
+ z.acc >>>= len;
180
+ z.validBits -= len;
181
+ return x;
182
+ }
183
+ z.validBits = 0;
184
+ return -1;
185
+ }
186
+ for (let i = 0; i < c.entries; ++i) {
187
+ if (c.codewordLengths[i] === NO_CODE)
188
+ continue;
189
+ if (c.codewords[i] === (z.acc & ((1 << c.codewordLengths[i]) - 1))) {
190
+ if (z.validBits >= c.codewordLengths[i]) {
191
+ z.acc >>>= c.codewordLengths[i];
192
+ z.validBits -= c.codewordLengths[i];
193
+ return i;
194
+ }
195
+ z.validBits = 0;
196
+ return -1;
197
+ }
198
+ }
199
+ z.error = 11;
200
+ z.validBits = 0;
201
+ return -1;
202
+ }
203
+ export function decodeRawShared(z, c) {
204
+ return decodeRaw(z, c);
205
+ }
206
+ function decodeRaw(z, c) {
207
+ if (z.validBits < STB_VORBIS_FAST_HUFFMAN_LENGTH)
208
+ prepHuffman(z);
209
+ const v0 = z.acc & FAST_HUFFMAN_TABLE_MASK;
210
+ let v = c.fastHuffman[v0] ?? -1;
211
+ if (v >= 0) {
212
+ const n = c.codewordLengths[v];
213
+ z.acc >>>= n;
214
+ z.validBits -= n;
215
+ if (z.validBits < 0) {
216
+ z.validBits = 0;
217
+ v = -1;
218
+ }
219
+ }
220
+ else {
221
+ v = codebookDecodeScalarRaw(z, c);
222
+ }
223
+ return v;
224
+ }
225
+ function codebookDecodeStart(z, c) {
226
+ if (c.lookupType === 0) {
227
+ z.error = 11;
228
+ return -1;
229
+ }
230
+ let zz = decodeRaw(z, c);
231
+ if (c.sparse)
232
+ zz = c.sortedValues[zz];
233
+ if (zz < 0) {
234
+ if (z.bytesInSeg === 0 && z.lastSeg)
235
+ return zz;
236
+ z.error = 11;
237
+ }
238
+ return zz;
239
+ }
240
+ export function codebookDecode(z, c, output, len0) {
241
+ let zz = codebookDecodeStart(z, c);
242
+ if (zz < 0)
243
+ return false;
244
+ let len = len0 > c.dimensions ? c.dimensions : len0;
245
+ zz *= c.dimensions;
246
+ if (c.sequenceP) {
247
+ let last = 0;
248
+ for (let i = 0; i < len; ++i) {
249
+ const val = c.multiplicands[zz + i] + last;
250
+ output[i] = (output[i] ?? 0) + val;
251
+ last = val + c.minimumValue;
252
+ }
253
+ }
254
+ else {
255
+ for (let i = 0; i < len; ++i) {
256
+ output[i] = (output[i] ?? 0) + c.multiplicands[zz + i];
257
+ }
258
+ }
259
+ return true;
260
+ }
261
+ export function codebookDecodeStep(z, c, output, off, len0, step) {
262
+ let zz = codebookDecodeStart(z, c);
263
+ let last = 0;
264
+ if (zz < 0)
265
+ return false;
266
+ let len = len0 > c.dimensions ? c.dimensions : len0;
267
+ zz *= c.dimensions;
268
+ for (let i = 0; i < len; ++i) {
269
+ const val = c.multiplicands[zz + i] + last;
270
+ output[off + i * step] = (output[off + i * step] ?? 0) + val;
271
+ if (c.sequenceP)
272
+ last = val;
273
+ }
274
+ return true;
275
+ }
276
+ export function codebookDecodeDeinterleaveRepeat(z, c, outputs, ch, cInterP, pInterP, len, totalDecode0) {
277
+ let cInter = cInterP.v;
278
+ let pInter = pInterP.v;
279
+ let totalDecode = totalDecode0;
280
+ if (c.lookupType === 0) {
281
+ z.error = 11;
282
+ return false;
283
+ }
284
+ while (totalDecode > 0) {
285
+ let last = 0;
286
+ let zz = decodeRaw(z, c);
287
+ if (zz < 0) {
288
+ if (z.bytesInSeg === 0 && z.lastSeg)
289
+ return false;
290
+ z.error = 11;
291
+ return false;
292
+ }
293
+ let effective = c.dimensions;
294
+ if (cInter + pInter * ch + effective > len * ch) {
295
+ // C: effective = len*ch - (p_inter*ch - c_inter) — note the minus
296
+ // binds inside the parens (stb_vorbis.c:2275-2278).
297
+ effective = len * ch - (pInter * ch - cInter);
298
+ }
299
+ zz *= c.dimensions;
300
+ if (c.sequenceP) {
301
+ for (let i = 0; i < effective; ++i) {
302
+ const val = c.multiplicands[zz + i] + last;
303
+ const ob = outputs[cInter];
304
+ if (ob)
305
+ ob[pInter] = (ob[pInter] ?? 0) + val;
306
+ if (++cInter === ch) {
307
+ cInter = 0;
308
+ ++pInter;
309
+ }
310
+ last = val;
311
+ }
312
+ }
313
+ else {
314
+ for (let i = 0; i < effective; ++i) {
315
+ const val = c.multiplicands[zz + i] + last;
316
+ const ob = outputs[cInter];
317
+ if (ob)
318
+ ob[pInter] = (ob[pInter] ?? 0) + val;
319
+ if (++cInter === ch) {
320
+ cInter = 0;
321
+ ++pInter;
322
+ }
323
+ }
324
+ }
325
+ totalDecode -= effective;
326
+ }
327
+ cInterP.v = cInter;
328
+ pInterP.v = pInter;
329
+ return true;
330
+ }
331
+ export { getBits };
332
+ //# sourceMappingURL=codebook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codebook.js","sourceRoot":"","sources":["../src/codebook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function crc32Init(): void;
2
+ /** Running CRC update (C crc32_update in stb_vorbis.c seek section). */
3
+ export declare function crcUpdate(crc: number, byte: number): number;
4
+ //# sourceMappingURL=crc32.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crc32.d.ts","sourceRoot":"","sources":["../src/crc32.ts"],"names":[],"mappings":"AAMA,wBAAgB,SAAS,IAAI,IAAI,CAUhC;AAED,wEAAwE;AACxE,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAG3D"}
package/dist/crc32.js ADDED
@@ -0,0 +1,22 @@
1
+ // CRC32 (stb_vorbis.c:1000-1026) — the Ogg CRC, polynomial 0x04c11db7.
2
+ const CRC32_POLY = 0x04c11db7;
3
+ const crcTable = new Uint32Array(256);
4
+ let crcInitialized = false;
5
+ export function crc32Init() {
6
+ if (crcInitialized)
7
+ return;
8
+ for (let i = 0; i < 256; ++i) {
9
+ let s = i << 24;
10
+ for (let j = 0; j < 8; ++j) {
11
+ s = (s << 1) ^ (s >= 0x80000000 ? CRC32_POLY : 0);
12
+ }
13
+ crcTable[i] = s >>> 0;
14
+ }
15
+ crcInitialized = true;
16
+ }
17
+ /** Running CRC update (C crc32_update in stb_vorbis.c seek section). */
18
+ export function crcUpdate(crc, byte) {
19
+ crc = ((crc << 8) ^ (crcTable[byte ^ (crc >>> 24)] ?? 0)) >>> 0;
20
+ return crc;
21
+ }
22
+ //# sourceMappingURL=crc32.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crc32.js","sourceRoot":"","sources":["../src/crc32.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,MAAM,UAAU,GAAG,UAAU,CAAC;AAE9B,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;AACtC,IAAI,cAAc,GAAG,KAAK,CAAC;AAE3B,MAAM,UAAU,SAAS;IACvB,IAAI,cAAc;QAAE,OAAO;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YAC3B,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC;QACD,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IACD,cAAc,GAAG,IAAI,CAAC;AACxB,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,IAAY;IACjD,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAChE,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare function computeTwiddleFactors(n: number, A: Float32Array, B: Float32Array, C: Float32Array): void;
2
+ export declare function computeWindow(n: number, window: Float32Array): void;
3
+ export declare function computeBitReverse(n: number, rev: Uint16Array): void;
4
+ declare function imdctStep3Iter0Loop(n: number, e: Float32Array, base: number, iOff: number, kOff: number, A: Float32Array): void;
5
+ declare function imdctStep3InnerRLoop(lim: number, e: Float32Array, base: number, d0Off: number, kOff: number, A: Float32Array, k1: number): void;
6
+ declare function imdctStep3InnerSLoop(n: number, e: Float32Array, base: number, iOff: number, kOff: number, A: Float32Array, aOff0: number, aOff: number, k0: number): void;
7
+ declare function imdctStep3InnerSLoopLd654(n: number, e: Float32Array, base: number, iOff: number, A: Float32Array, baseN: number): void;
8
+ export { imdctStep3Iter0Loop, imdctStep3InnerRLoop, imdctStep3InnerSLoop, imdctStep3InnerSLoopLd654 };
9
+ //# sourceMappingURL=imdct.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imdct.d.ts","sourceRoot":"","sources":["../src/imdct.ts"],"names":[],"mappings":"AAIA,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,IAAI,CAYxG;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAYnE;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAMnE;AAyBD,iBAAS,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,GAAG,IAAI,CAoBxH;AAGD,iBAAS,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAmBxI;AAGD,iBAAS,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CA2BlK;AAGD,iBAAS,yBAAyB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CA8D/H;AAED,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,CAAC"}
package/dist/imdct.js ADDED
@@ -0,0 +1,197 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Ported from stb_vorbis.c — inverse MDCT (the fast bit-reverse variant)
3
+ // plus twiddle/window/bitreverse setup.
4
+ export function computeTwiddleFactors(n, A, B, C) {
5
+ const n4 = n >> 2, n8 = n >> 3;
6
+ for (let k = 0, k2 = 0; k < n4; ++k, k2 += 2) {
7
+ A[k2] = Math.cos((4 * k * Math.PI) / n);
8
+ A[k2 + 1] = -Math.sin((4 * k * Math.PI) / n);
9
+ B[k2] = Math.cos((((k2 + 1) * Math.PI) / n / 2)) * 0.5;
10
+ B[k2 + 1] = Math.sin((((k2 + 1) * Math.PI) / n / 2)) * 0.5;
11
+ }
12
+ for (let k = 0, k2 = 0; k < n8; ++k, k2 += 2) {
13
+ C[k2] = Math.cos((2 * (k2 + 1) * Math.PI) / n);
14
+ C[k2 + 1] = -Math.sin((2 * (k2 + 1) * Math.PI) / n);
15
+ }
16
+ }
17
+ export function computeWindow(n, window) {
18
+ const n2 = n >> 1;
19
+ // stb_vorbis.c:1336-1341 — window[i] = (float) sin(0.5*M_PI *
20
+ // square((float) sin((i+0.5)/n2 * 0.5*M_PI))). The two sin() calls and
21
+ // the 0.5*M_PI multiply are double math with float32 casts at the
22
+ // boundaries; square() is a float32 multiply. Math.fround at exactly
23
+ // those points reproduces the C bits.
24
+ for (let i = 0; i < n2; ++i) {
25
+ const s = Math.fround(Math.sin(((i + 0.5) / n2) * 0.5 * Math.PI));
26
+ const sq = Math.fround(s * s);
27
+ window[i] = Math.fround(Math.sin(0.5 * Math.PI * sq));
28
+ }
29
+ }
30
+ export function computeBitReverse(n, rev) {
31
+ const ld = ilog(n) - 1;
32
+ const n8 = n >> 3;
33
+ for (let i = 0; i < n8; ++i) {
34
+ rev[i] = ((bitReverseLocal(i) >>> (32 - ld + 3)) << 2) & 0xffff;
35
+ }
36
+ }
37
+ function bitReverseLocal(n) {
38
+ n = ((n & 0xaaaaaaaa) >>> 1) | ((n & 0x55555555) << 1);
39
+ n = ((n & 0xcccccccc) >>> 2) | ((n & 0x33333333) << 2);
40
+ n = ((n & 0xf0f0f0f0) >>> 4) | ((n & 0x0f0f0f0f) << 4);
41
+ n = ((n & 0xff00ff00) >>> 8) | ((n & 0x00ff00ff) << 8);
42
+ return (n >>> 16 | n << 16) >>> 0;
43
+ }
44
+ function ilog(n) {
45
+ const log2_4 = [0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4];
46
+ if (n < 0)
47
+ return 0;
48
+ if (n < (1 << 14)) {
49
+ if (n < (1 << 4))
50
+ return log2_4[n];
51
+ else if (n < (1 << 9))
52
+ return 5 + log2_4[n >> 5];
53
+ else
54
+ return 10 + log2_4[n >> 10];
55
+ }
56
+ else if (n < (1 << 24)) {
57
+ if (n < (1 << 19))
58
+ return 15 + log2_4[n >> 15];
59
+ else
60
+ return 20 + log2_4[n >> 20];
61
+ }
62
+ else if (n < (1 << 29))
63
+ return 25 + log2_4[n >> 25];
64
+ else
65
+ return 30 + log2_4[n >>> 30];
66
+ }
67
+ // imdct_step3_iter0_loop (stb_vorbis.c:2417-2460)
68
+ function imdctStep3Iter0Loop(n, e, base, iOff, kOff, A) {
69
+ let aOff = 0;
70
+ let eOff = base + iOff;
71
+ let e2Off = eOff + kOff;
72
+ for (let i = n >> 2; i > 0; --i) {
73
+ // 4 unrolled pairs
74
+ for (let q = 0; q < 4; ++q) {
75
+ const d0 = eOff - 2 * q;
76
+ const d2 = e2Off - 2 * q;
77
+ const k00e = e[d0] - e[d2];
78
+ const k01e = e[d0 - 1] - e[d2 - 1];
79
+ e[d0] = e[d0] + e[d2];
80
+ e[d0 - 1] = e[d0 - 1] + e[d2 - 1];
81
+ e[d2] = k00e * A[aOff] - k01e * A[aOff + 1];
82
+ e[d2 - 1] = k01e * A[aOff] + k00e * A[aOff + 1];
83
+ aOff += 8;
84
+ }
85
+ eOff -= 8;
86
+ e2Off -= 8;
87
+ }
88
+ }
89
+ // imdct_step3_inner_r_loop (stb_vorbis.c:2462-2510)
90
+ function imdctStep3InnerRLoop(lim, e, base, d0Off, kOff, A, k1) {
91
+ let aOff = 0;
92
+ let e0Off = base + d0Off;
93
+ let e2Off = e0Off + kOff;
94
+ for (let i = lim >> 2; i > 0; --i) {
95
+ for (let q = 0; q < 4; ++q) {
96
+ const d0 = e0Off - 2 * q;
97
+ const d2 = e2Off - 2 * q;
98
+ const k00e = e[d0] - e[d2];
99
+ const k01e = e[d0 - 1] - e[d2 - 1];
100
+ e[d0] = e[d0] + e[d2];
101
+ e[d0 - 1] = e[d0 - 1] + e[d2 - 1];
102
+ e[d2] = k00e * A[aOff] - k01e * A[aOff + 1];
103
+ e[d2 - 1] = k01e * A[aOff] + k00e * A[aOff + 1];
104
+ aOff += k1;
105
+ }
106
+ e0Off -= 8;
107
+ e2Off -= 8;
108
+ }
109
+ }
110
+ // imdct_step3_inner_s_loop (stb_vorbis.c:2512-2594)
111
+ function imdctStep3InnerSLoop(n, e, base, iOff, kOff, A, aOff0, aOff, k0) {
112
+ // C (stb_vorbis.c:2512-2520 + caller :2770-2777) passes an ADVANCED base
113
+ // pointer A0 (= A + k1*4*r) plus a_off = k1 and reads A0[0], A0[1],
114
+ // A0[a_off], A0[a_off*2], A0[a_off*3]; the outer loop strides by k0.
115
+ const b = aOff0;
116
+ const A0 = A[b], A1 = A[b + 1];
117
+ const A2 = A[b + aOff], A3 = A[b + aOff + 1];
118
+ const A4 = A[b + aOff * 2], A5 = A[b + aOff * 2 + 1];
119
+ const A6 = A[b + aOff * 3], A7 = A[b + aOff * 3 + 1];
120
+ let e0Off = base + iOff;
121
+ let e2Off = e0Off + kOff;
122
+ for (let i = n; i > 0; --i) {
123
+ for (let q = 0; q < 4; ++q) {
124
+ const d0 = e0Off - 2 * q;
125
+ const d2 = e2Off - 2 * q;
126
+ const k00 = e[d0] - e[d2];
127
+ const k11 = e[d0 - 1] - e[d2 - 1];
128
+ e[d0] = e[d0] + e[d2];
129
+ e[d0 - 1] = e[d0 - 1] + e[d2 - 1];
130
+ e[d2] = k00 * [A0, A2, A4, A6][q] - k11 * [A1, A3, A5, A7][q];
131
+ e[d2 - 1] = k11 * [A0, A2, A4, A6][q] + k00 * [A1, A3, A5, A7][q];
132
+ }
133
+ // C strides by k0 per outer iteration (stb_vorbis.c:2558-2559:
134
+ // `ee0 -= k0; ee2 -= k0;`), NOT by 8.
135
+ e0Off -= k0;
136
+ e2Off -= k0;
137
+ }
138
+ }
139
+ // imdct_step3_inner_s_loop_ld654 (stb_vorbis.c:2595-2637)
140
+ function imdctStep3InnerSLoopLd654(n, e, base, iOff, A, baseN) {
141
+ const aOff = baseN >> 3;
142
+ const A2 = A[aOff];
143
+ let z = base + iOff;
144
+ const baseZ = z - 16 * n;
145
+ const iter54 = (z) => {
146
+ // C iter_54(float *z): z[0..-7] are e[zo], e[zo-1], ..., e[zo-7]
147
+ const k00 = e[z - 0] - e[z - 4];
148
+ const y0 = e[z - 0] + e[z - 4];
149
+ const y2 = e[z - 2] + e[z - 6];
150
+ const k22 = e[z - 2] - e[z - 6];
151
+ e[z - 0] = y0 + y2;
152
+ e[z - 2] = y0 - y2;
153
+ const k33 = e[z - 3] - e[z - 7];
154
+ e[z - 4] = k00 + k33;
155
+ e[z - 6] = k00 - k33;
156
+ const k11 = e[z - 1] - e[z - 5];
157
+ const y1 = e[z - 1] + e[z - 5];
158
+ const y3 = e[z - 3] + e[z - 7];
159
+ e[z - 1] = y1 + y3;
160
+ e[z - 3] = y1 - y3;
161
+ e[z - 5] = k11 - k22;
162
+ e[z - 7] = k11 + k22;
163
+ };
164
+ while (z > baseZ) {
165
+ const zo = z - base;
166
+ let k00 = e[zo - 0] - e[zo - 8];
167
+ let k11 = e[zo - 1] - e[zo - 9];
168
+ let l00 = e[zo - 2] - e[zo - 10];
169
+ let l11 = e[zo - 3] - e[zo - 11];
170
+ e[zo - 0] = e[zo - 0] + e[zo - 8];
171
+ e[zo - 1] = e[zo - 1] + e[zo - 9];
172
+ e[zo - 2] = e[zo - 2] + e[zo - 10];
173
+ e[zo - 3] = e[zo - 3] + e[zo - 11];
174
+ e[zo - 8] = k00;
175
+ e[zo - 9] = k11;
176
+ e[zo - 10] = (l00 + l11) * A2;
177
+ e[zo - 11] = (l11 - l00) * A2;
178
+ k00 = e[zo - 4] - e[zo - 12];
179
+ k11 = e[zo - 5] - e[zo - 13];
180
+ l00 = e[zo - 6] - e[zo - 14];
181
+ l11 = e[zo - 7] - e[zo - 15];
182
+ e[zo - 4] = e[zo - 4] + e[zo - 12];
183
+ e[zo - 5] = e[zo - 5] + e[zo - 13];
184
+ e[zo - 6] = e[zo - 6] + e[zo - 14];
185
+ e[zo - 7] = e[zo - 7] + e[zo - 15];
186
+ e[zo - 12] = k11;
187
+ e[zo - 13] = -k00;
188
+ e[zo - 14] = (l11 - l00) * A2;
189
+ e[zo - 15] = (l00 + l11) * -A2;
190
+ // iter_54(z); iter_54(z-8);
191
+ iter54(zo);
192
+ iter54(zo - 8);
193
+ z -= 16;
194
+ }
195
+ }
196
+ export { imdctStep3Iter0Loop, imdctStep3InnerRLoop, imdctStep3InnerSLoop, imdctStep3InnerSLoopLd654 };
197
+ //# sourceMappingURL=imdct.js.map