@gmod/cram 4.0.3 → 4.0.4
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/dist/cram-bundle.js +1 -1
- package/dist/cramFile/file.js +43 -9
- package/dist/cramFile/file.js.map +1 -1
- package/dist/cramFile/slice/decodeRecord.js +3 -3
- package/dist/cramFile/slice/decodeRecord.js.map +1 -1
- package/dist/cramFile/util.d.ts +0 -2
- package/dist/cramFile/util.js +3 -31
- package/dist/cramFile/util.js.map +1 -1
- package/dist/htscodecs/arith_gen.d.ts +5 -7
- package/dist/htscodecs/arith_gen.js +122 -105
- package/dist/htscodecs/arith_gen.js.map +1 -1
- package/dist/htscodecs/arith_sh.d.ts +1 -8
- package/dist/htscodecs/arith_sh.js +16 -10
- package/dist/htscodecs/arith_sh.js.map +1 -1
- package/dist/htscodecs/byte_model.d.ts +1 -6
- package/dist/htscodecs/byte_model.js +25 -17
- package/dist/htscodecs/byte_model.js.map +1 -1
- package/dist/htscodecs/fqzcomp.d.ts +1 -1
- package/dist/htscodecs/fqzcomp.js +98 -77
- package/dist/htscodecs/fqzcomp.js.map +1 -1
- package/dist/htscodecs/index.d.ts +5 -5
- package/dist/htscodecs/index.js +53 -16
- package/dist/htscodecs/index.js.map +1 -1
- package/dist/htscodecs/iostream.d.ts +9 -20
- package/dist/htscodecs/iostream.js +21 -116
- package/dist/htscodecs/iostream.js.map +1 -1
- package/dist/htscodecs/rans.d.ts +1 -1
- package/dist/htscodecs/rans.js +65 -54
- package/dist/htscodecs/rans.js.map +1 -1
- package/dist/htscodecs/rans4x16.d.ts +1 -1
- package/dist/htscodecs/rans4x16.js +151 -111
- package/dist/htscodecs/rans4x16.js.map +1 -1
- package/dist/htscodecs/tok3.d.ts +1 -2
- package/dist/htscodecs/tok3.js +82 -239
- package/dist/htscodecs/tok3.js.map +1 -1
- package/dist/util.d.ts +1 -0
- package/dist/util.js +20 -0
- package/dist/util.js.map +1 -0
- package/esm/cramFile/file.js +3 -2
- package/esm/cramFile/file.js.map +1 -1
- package/esm/cramFile/slice/decodeRecord.js +3 -3
- package/esm/cramFile/slice/decodeRecord.js.map +1 -1
- package/esm/cramFile/util.d.ts +0 -2
- package/esm/cramFile/util.js +3 -29
- package/esm/cramFile/util.js.map +1 -1
- package/esm/htscodecs/arith_gen.d.ts +5 -7
- package/esm/htscodecs/arith_gen.js +108 -97
- package/esm/htscodecs/arith_gen.js.map +1 -1
- package/esm/htscodecs/arith_sh.d.ts +1 -8
- package/esm/htscodecs/arith_sh.js +14 -11
- package/esm/htscodecs/arith_sh.js.map +1 -1
- package/esm/htscodecs/byte_model.d.ts +1 -6
- package/esm/htscodecs/byte_model.js +23 -18
- package/esm/htscodecs/byte_model.js.map +1 -1
- package/esm/htscodecs/fqzcomp.d.ts +1 -1
- package/esm/htscodecs/fqzcomp.js +91 -76
- package/esm/htscodecs/fqzcomp.js.map +1 -1
- package/esm/htscodecs/index.d.ts +5 -5
- package/esm/htscodecs/index.js +14 -20
- package/esm/htscodecs/index.js.map +1 -1
- package/esm/htscodecs/iostream.d.ts +9 -20
- package/esm/htscodecs/iostream.js +19 -117
- package/esm/htscodecs/iostream.js.map +1 -1
- package/esm/htscodecs/rans.d.ts +1 -1
- package/esm/htscodecs/rans.js +61 -56
- package/esm/htscodecs/rans.js.map +1 -1
- package/esm/htscodecs/rans4x16.d.ts +1 -1
- package/esm/htscodecs/rans4x16.js +143 -109
- package/esm/htscodecs/rans4x16.js.map +1 -1
- package/esm/htscodecs/tok3.d.ts +1 -2
- package/esm/htscodecs/tok3.js +41 -237
- package/esm/htscodecs/tok3.js.map +1 -1
- package/esm/util.d.ts +1 -0
- package/esm/util.js +17 -0
- package/esm/util.js.map +1 -0
- package/package.json +2 -3
- package/src/cramFile/file.ts +3 -2
- package/src/cramFile/slice/decodeRecord.ts +3 -5
- package/src/cramFile/util.ts +6 -39
- package/src/htscodecs/{arith_gen.js → arith_gen.ts} +133 -95
- package/src/htscodecs/{arith_sh.js → arith_sh.ts} +17 -9
- package/src/htscodecs/{byte_model.js → byte_model.ts} +26 -16
- package/src/htscodecs/{fqzcomp.js → fqzcomp.ts} +108 -74
- package/src/htscodecs/{index.js → index.ts} +14 -20
- package/src/htscodecs/iostream.ts +159 -0
- package/src/htscodecs/{rans.js → rans.ts} +73 -56
- package/src/htscodecs/{rans4x16.js → rans4x16.ts} +180 -111
- package/src/htscodecs/tok3.ts +197 -0
- package/src/util.ts +16 -0
- package/src/htscodecs/iostream.js +0 -257
- package/src/htscodecs/tok3.js +0 -413
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
/* eslint-disable no-var */
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
|
|
1
4
|
/*
|
|
2
5
|
* Copyright (c) 2019,2020 Genome Research Ltd.
|
|
3
6
|
* Author(s): James Bonfield
|
|
@@ -31,9 +34,9 @@
|
|
|
31
34
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
32
35
|
*/
|
|
33
36
|
|
|
34
|
-
|
|
37
|
+
import IOStream from './iostream'
|
|
35
38
|
|
|
36
|
-
|
|
39
|
+
// ----------------------------------------------------------------------
|
|
37
40
|
// rANS primitives itself
|
|
38
41
|
//
|
|
39
42
|
// RansGet* is decoder side
|
|
@@ -46,20 +49,24 @@ function RansGetSymbolFromFreq(C, f) {
|
|
|
46
49
|
// NOTE: Inefficient.
|
|
47
50
|
// In practice we would implement this via a precomputed
|
|
48
51
|
// lookup table C2S[f]; see RansBuildC2S below.
|
|
49
|
-
|
|
50
|
-
while (f >= C[s + 1])
|
|
52
|
+
let s = 0
|
|
53
|
+
while (f >= C[s + 1]) {
|
|
54
|
+
s++
|
|
55
|
+
}
|
|
51
56
|
|
|
52
|
-
//console.error(f, C, s)
|
|
57
|
+
// console.error(f, C, s)
|
|
53
58
|
|
|
54
59
|
return s
|
|
55
60
|
}
|
|
56
61
|
|
|
57
62
|
function RansBuildC2S(C, bits) {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
for (
|
|
62
|
-
while (f >= C[s + 1])
|
|
63
|
+
const max = 1 << bits
|
|
64
|
+
const C2S = new Array(max)
|
|
65
|
+
let s = 0
|
|
66
|
+
for (let f = 0; f < max; f++) {
|
|
67
|
+
while (f >= C[s + 1]) {
|
|
68
|
+
s++
|
|
69
|
+
}
|
|
63
70
|
C2S[f] = s
|
|
64
71
|
}
|
|
65
72
|
return C2S
|
|
@@ -70,46 +77,54 @@ function RansAdvanceStep(R, c, f, bits) {
|
|
|
70
77
|
}
|
|
71
78
|
|
|
72
79
|
function RansRenorm(src, R) {
|
|
73
|
-
if (R < 1 << 15)
|
|
80
|
+
if (R < 1 << 15) {
|
|
81
|
+
R = (R << 16) + src.ReadUint16()
|
|
82
|
+
}
|
|
74
83
|
|
|
75
84
|
return R
|
|
76
85
|
}
|
|
77
86
|
|
|
78
87
|
function DecodeRLEMeta(src, N) {
|
|
79
|
-
|
|
80
|
-
|
|
88
|
+
const u_meta_len = src.ReadUint7()
|
|
89
|
+
const rle_len = src.ReadUint7()
|
|
81
90
|
|
|
82
91
|
// Decode RLE lengths
|
|
83
92
|
if (u_meta_len & 1) {
|
|
84
93
|
var rle_meta = src.ReadData((u_meta_len - 1) / 2)
|
|
85
94
|
} else {
|
|
86
|
-
|
|
95
|
+
const comp_meta_len = src.ReadUint7()
|
|
87
96
|
var rle_meta = src.ReadData(comp_meta_len)
|
|
88
97
|
rle_meta = RansDecode0(new IOStream(rle_meta), u_meta_len / 2, N)
|
|
89
98
|
}
|
|
90
99
|
|
|
91
100
|
// Decode list of symbols for which RLE lengths are applied
|
|
92
101
|
var rle_meta = new IOStream(rle_meta)
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
if (n == 0)
|
|
96
|
-
|
|
102
|
+
const L = new Array(256)
|
|
103
|
+
let n = rle_meta.ReadByte()
|
|
104
|
+
if (n == 0) {
|
|
105
|
+
n = 256
|
|
106
|
+
}
|
|
107
|
+
for (let i = 0; i < n; i++) {
|
|
108
|
+
L[rle_meta.ReadByte()] = 1
|
|
109
|
+
}
|
|
97
110
|
|
|
98
111
|
return [L, rle_meta, rle_len]
|
|
99
112
|
}
|
|
100
113
|
|
|
101
114
|
function DecodeRLE(buf, L, rle_meta, len) {
|
|
102
|
-
|
|
115
|
+
const src = new IOStream(buf)
|
|
103
116
|
|
|
104
|
-
|
|
117
|
+
const out = new Uint8Array(len)
|
|
105
118
|
|
|
106
119
|
// Expand up buf+meta to out; i = buf index, j = out index
|
|
107
|
-
|
|
108
|
-
for (
|
|
109
|
-
|
|
120
|
+
let j = 0
|
|
121
|
+
for (let i = 0; j < len; i++) {
|
|
122
|
+
const sym = buf[i]
|
|
110
123
|
if (L[sym]) {
|
|
111
|
-
|
|
112
|
-
for (
|
|
124
|
+
const run = rle_meta.ReadUint7()
|
|
125
|
+
for (let r = 0; r <= run; r++) {
|
|
126
|
+
out[j++] = sym
|
|
127
|
+
}
|
|
113
128
|
} else {
|
|
114
129
|
out[j++] = sym
|
|
115
130
|
}
|
|
@@ -121,12 +136,14 @@ function DecodeRLE(buf, L, rle_meta, len) {
|
|
|
121
136
|
// Pack meta data is the number and value of distinct symbols plus
|
|
122
137
|
// the length of the packed byte stream.
|
|
123
138
|
function DecodePackMeta(src) {
|
|
124
|
-
|
|
125
|
-
|
|
139
|
+
const nsym = src.ReadByte()
|
|
140
|
+
const P = new Array(nsym)
|
|
126
141
|
|
|
127
|
-
for (
|
|
142
|
+
for (let i = 0; i < nsym; i++) {
|
|
143
|
+
P[i] = src.ReadByte()
|
|
144
|
+
}
|
|
128
145
|
|
|
129
|
-
|
|
146
|
+
const len = src.ReadUint7()
|
|
130
147
|
|
|
131
148
|
return [P, nsym, len]
|
|
132
149
|
}
|
|
@@ -134,18 +151,22 @@ function DecodePackMeta(src) {
|
|
|
134
151
|
// Extract bits from src producing output of length len.
|
|
135
152
|
// Nsym is number of distinct symbols used.
|
|
136
153
|
function DecodePack(data, P, nsym, len) {
|
|
137
|
-
|
|
138
|
-
|
|
154
|
+
const out = new Uint8Array(len)
|
|
155
|
+
let j = 0
|
|
139
156
|
|
|
140
157
|
// Constant value
|
|
141
158
|
if (nsym <= 1) {
|
|
142
|
-
for (var i = 0; i < len; i++)
|
|
159
|
+
for (var i = 0; i < len; i++) {
|
|
160
|
+
out[i] = P[0]
|
|
161
|
+
}
|
|
143
162
|
}
|
|
144
163
|
|
|
145
164
|
// 1 bit per value
|
|
146
165
|
else if (nsym <= 2) {
|
|
147
166
|
for (i = 0; i < len; i++) {
|
|
148
|
-
if (i % 8 == 0)
|
|
167
|
+
if (i % 8 == 0) {
|
|
168
|
+
var v = data[j++]
|
|
169
|
+
}
|
|
149
170
|
|
|
150
171
|
out[i] = P[v & 1]
|
|
151
172
|
v >>= 1
|
|
@@ -155,7 +176,9 @@ function DecodePack(data, P, nsym, len) {
|
|
|
155
176
|
// 2 bits per value
|
|
156
177
|
else if (nsym <= 4) {
|
|
157
178
|
for (i = 0; i < len; i++) {
|
|
158
|
-
if (i % 4 == 0)
|
|
179
|
+
if (i % 4 == 0) {
|
|
180
|
+
var v = data[j++]
|
|
181
|
+
}
|
|
159
182
|
|
|
160
183
|
out[i] = P[v & 3]
|
|
161
184
|
v >>= 2
|
|
@@ -165,7 +188,9 @@ function DecodePack(data, P, nsym, len) {
|
|
|
165
188
|
// 4 bits per value
|
|
166
189
|
else if (nsym <= 16) {
|
|
167
190
|
for (i = 0; i < len; i++) {
|
|
168
|
-
if (i % 2 == 0)
|
|
191
|
+
if (i % 2 == 0) {
|
|
192
|
+
var v = data[j++]
|
|
193
|
+
}
|
|
169
194
|
|
|
170
195
|
out[i] = P[v & 15]
|
|
171
196
|
v >>= 4
|
|
@@ -176,24 +201,26 @@ function DecodePack(data, P, nsym, len) {
|
|
|
176
201
|
}
|
|
177
202
|
|
|
178
203
|
function RansDecodeStripe(src, len) {
|
|
179
|
-
|
|
204
|
+
const N = src.ReadByte()
|
|
180
205
|
|
|
181
206
|
// Retrieve lengths
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
for (var j = 0; j < N; j++)
|
|
207
|
+
const clen = new Array(N)
|
|
208
|
+
const ulen = new Array(N)
|
|
209
|
+
for (var j = 0; j < N; j++) {
|
|
210
|
+
clen[j] = src.ReadUint7()
|
|
211
|
+
}
|
|
185
212
|
|
|
186
213
|
// Decode streams
|
|
187
|
-
|
|
214
|
+
const T = new Array(N)
|
|
188
215
|
for (var j = 0; j < N; j++) {
|
|
189
216
|
ulen[j] = Math.floor(len / N) + (len % N > j)
|
|
190
217
|
T[j] = RansDecodeStream(src, ulen[j])
|
|
191
218
|
}
|
|
192
219
|
|
|
193
220
|
// Transpose
|
|
194
|
-
|
|
221
|
+
const out = new Uint8Array(len)
|
|
195
222
|
for (var j = 0; j < N; j++) {
|
|
196
|
-
for (
|
|
223
|
+
for (let i = 0; i < ulen[j]; i++) {
|
|
197
224
|
out[i * N + j] = T[j][i]
|
|
198
225
|
}
|
|
199
226
|
}
|
|
@@ -201,30 +228,34 @@ function RansDecodeStripe(src, len) {
|
|
|
201
228
|
return out
|
|
202
229
|
}
|
|
203
230
|
|
|
204
|
-
|
|
231
|
+
// ----------------------------------------------------------------------
|
|
205
232
|
// Main rANS entry function: decodes a compressed src and
|
|
206
233
|
// returns the uncompressed buffer.
|
|
207
|
-
function decode(src) {
|
|
208
|
-
|
|
234
|
+
export function decode(src) {
|
|
235
|
+
const stream = new IOStream(src)
|
|
209
236
|
return RansDecodeStream(stream, 0)
|
|
210
237
|
}
|
|
211
238
|
|
|
212
239
|
function RansDecodeStream(stream, n_out) {
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
if (!nosz)
|
|
240
|
+
const format = stream.ReadByte()
|
|
241
|
+
const order = format & 1
|
|
242
|
+
const x32 = format & 4
|
|
243
|
+
const stripe = format & 8
|
|
244
|
+
const nosz = format & 16
|
|
245
|
+
const cat = format & 32
|
|
246
|
+
const rle = format & 64
|
|
247
|
+
const pack = format & 128
|
|
248
|
+
|
|
249
|
+
const Nway = x32 ? 32 : 4
|
|
250
|
+
|
|
251
|
+
if (!nosz) {
|
|
252
|
+
n_out = stream.ReadUint7()
|
|
253
|
+
}
|
|
225
254
|
|
|
226
255
|
// N-way interleaving
|
|
227
|
-
if (stripe)
|
|
256
|
+
if (stripe) {
|
|
257
|
+
return RansDecodeStripe(stream, n_out)
|
|
258
|
+
}
|
|
228
259
|
|
|
229
260
|
// Bit packing
|
|
230
261
|
if (pack) {
|
|
@@ -239,28 +270,38 @@ function RansDecodeStream(stream, n_out) {
|
|
|
239
270
|
}
|
|
240
271
|
|
|
241
272
|
// Uncompress data (all, packed or run literals)
|
|
242
|
-
if (cat)
|
|
243
|
-
|
|
244
|
-
else
|
|
273
|
+
if (cat) {
|
|
274
|
+
var buf = stream.ReadData(n_out)
|
|
275
|
+
} else if (order == 0) {
|
|
276
|
+
var buf = RansDecode0(stream, n_out, Nway)
|
|
277
|
+
} else {
|
|
278
|
+
var buf = RansDecode1(stream, n_out, Nway)
|
|
279
|
+
}
|
|
245
280
|
|
|
246
281
|
// Apply expansion transforms
|
|
247
|
-
if (rle)
|
|
282
|
+
if (rle) {
|
|
283
|
+
buf = DecodeRLE(buf, L, rle_meta, rle_len)
|
|
284
|
+
}
|
|
248
285
|
|
|
249
|
-
if (pack)
|
|
286
|
+
if (pack) {
|
|
287
|
+
buf = DecodePack(buf, P, nsym, pack_len)
|
|
288
|
+
}
|
|
250
289
|
|
|
251
290
|
return buf
|
|
252
291
|
}
|
|
253
292
|
|
|
254
|
-
|
|
293
|
+
// ----------------------------------------------------------------------
|
|
255
294
|
// Order-0 decoder
|
|
256
295
|
|
|
257
296
|
function ReadAlphabet(src) {
|
|
258
|
-
|
|
259
|
-
for (
|
|
297
|
+
const A = new Array(256)
|
|
298
|
+
for (let i = 0; i < 256; i++) {
|
|
299
|
+
A[i] = 0
|
|
300
|
+
}
|
|
260
301
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
302
|
+
let rle = 0
|
|
303
|
+
let sym = src.ReadByte()
|
|
304
|
+
let last_sym = sym
|
|
264
305
|
|
|
265
306
|
do {
|
|
266
307
|
A[sym] = 1
|
|
@@ -269,7 +310,9 @@ function ReadAlphabet(src) {
|
|
|
269
310
|
sym++
|
|
270
311
|
} else {
|
|
271
312
|
sym = src.ReadByte()
|
|
272
|
-
if (sym == last_sym + 1)
|
|
313
|
+
if (sym == last_sym + 1) {
|
|
314
|
+
rle = src.ReadByte()
|
|
315
|
+
}
|
|
273
316
|
}
|
|
274
317
|
last_sym = sym
|
|
275
318
|
} while (sym != 0)
|
|
@@ -281,42 +324,50 @@ function ReadAlphabet(src) {
|
|
|
281
324
|
// filling out the F and C arrays.
|
|
282
325
|
function ReadFrequencies0(src, F, C) {
|
|
283
326
|
// Initialise; not in the specification - implicit?
|
|
284
|
-
for (var i = 0; i < 256; i++)
|
|
327
|
+
for (var i = 0; i < 256; i++) {
|
|
328
|
+
F[i] = 0
|
|
329
|
+
}
|
|
285
330
|
|
|
286
331
|
// Fetch alphabet
|
|
287
|
-
|
|
332
|
+
const A = ReadAlphabet(src)
|
|
288
333
|
|
|
289
334
|
// Fetch frequencies for the symbols listed in our alphabet
|
|
290
335
|
for (var i = 0; i < 256; i++) {
|
|
291
|
-
if (A[i] > 0)
|
|
336
|
+
if (A[i] > 0) {
|
|
337
|
+
F[i] = src.ReadUint7()
|
|
338
|
+
}
|
|
292
339
|
}
|
|
293
340
|
|
|
294
341
|
NormaliseFrequencies0_Shift(F, 12)
|
|
295
342
|
|
|
296
343
|
// Compute C[] from F[]
|
|
297
344
|
C[0] = 0
|
|
298
|
-
for (var i = 0; i <= 255; i++)
|
|
345
|
+
for (var i = 0; i <= 255; i++) {
|
|
346
|
+
C[i + 1] = C[i] + F[i]
|
|
347
|
+
}
|
|
299
348
|
}
|
|
300
349
|
|
|
301
350
|
function RansDecode0(src, nbytes, N) {
|
|
302
351
|
// Decode frequencies
|
|
303
|
-
|
|
304
|
-
|
|
352
|
+
const F = new Array(256)
|
|
353
|
+
const C = new Array(256)
|
|
305
354
|
ReadFrequencies0(src, F, C)
|
|
306
355
|
|
|
307
356
|
// Fast lookup to avoid slow RansGetSymbolFromFreq
|
|
308
|
-
|
|
357
|
+
const C2S = RansBuildC2S(C, 12)
|
|
309
358
|
|
|
310
359
|
// Initialise rANS state
|
|
311
|
-
|
|
312
|
-
for (var i = 0; i < N; i++)
|
|
360
|
+
const R = new Array(N)
|
|
361
|
+
for (var i = 0; i < N; i++) {
|
|
362
|
+
R[i] = src.ReadUint32()
|
|
363
|
+
}
|
|
313
364
|
|
|
314
365
|
// Main decode loop
|
|
315
|
-
|
|
366
|
+
const output = new Uint8Array(nbytes)
|
|
316
367
|
for (var i = 0; i < nbytes; i++) {
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
368
|
+
const ix = i & (N - 1) // equiv to i%N as N is power of 2
|
|
369
|
+
const f = RansGetCumulativeFreq(R[ix], 12)
|
|
370
|
+
const s = C2S[f] // Equiv to RansGetSymbolFromFreq(C, f);
|
|
320
371
|
|
|
321
372
|
output[i] = s
|
|
322
373
|
R[ix] = RansAdvanceStep(R[ix], C[s], F[s], 12)
|
|
@@ -329,21 +380,27 @@ function RansDecode0(src, nbytes, N) {
|
|
|
329
380
|
|
|
330
381
|
function NormaliseFrequencies0_Shift(F, bits) {
|
|
331
382
|
// Compute total and number of bits to shift by
|
|
332
|
-
|
|
333
|
-
for (var i = 0; i < 256; i++)
|
|
383
|
+
let tot = 0
|
|
384
|
+
for (var i = 0; i < 256; i++) {
|
|
385
|
+
tot += F[i]
|
|
386
|
+
}
|
|
334
387
|
|
|
335
|
-
if (tot == 0 || tot == 1 << bits)
|
|
388
|
+
if (tot == 0 || tot == 1 << bits) {
|
|
389
|
+
return
|
|
390
|
+
}
|
|
336
391
|
|
|
337
|
-
|
|
392
|
+
let shift = 0
|
|
338
393
|
while (tot < 1 << bits) {
|
|
339
394
|
tot *= 2
|
|
340
395
|
shift++
|
|
341
396
|
}
|
|
342
397
|
|
|
343
398
|
// Scale total of frequencies to (1<<bits)
|
|
344
|
-
for (var i = 0; i < 256; i++)
|
|
399
|
+
for (var i = 0; i < 256; i++) {
|
|
400
|
+
F[i] <<= shift
|
|
401
|
+
}
|
|
345
402
|
}
|
|
346
|
-
|
|
403
|
+
// ----------------------------------------------------------------------
|
|
347
404
|
// Order-1 decoder
|
|
348
405
|
|
|
349
406
|
// Decode a table of order-1 frequences,
|
|
@@ -353,25 +410,33 @@ function ReadFrequencies1(src, F, C, shift) {
|
|
|
353
410
|
for (var i = 0; i < 256; i++) {
|
|
354
411
|
F[i] = new Array(256)
|
|
355
412
|
C[i] = new Array(256)
|
|
356
|
-
for (var j = 0; j < 256; j++)
|
|
413
|
+
for (var j = 0; j < 256; j++) {
|
|
414
|
+
F[i][j] = 0
|
|
415
|
+
}
|
|
357
416
|
}
|
|
358
417
|
|
|
359
418
|
// Fetch alphabet
|
|
360
|
-
|
|
419
|
+
const A = ReadAlphabet(src)
|
|
361
420
|
|
|
362
421
|
// Read F[]
|
|
363
422
|
for (var i = 0; i < 256; i++) {
|
|
364
|
-
if (!A[i])
|
|
423
|
+
if (!A[i]) {
|
|
424
|
+
continue
|
|
425
|
+
}
|
|
365
426
|
|
|
366
|
-
|
|
427
|
+
let run = 0
|
|
367
428
|
for (var j = 0; j < 256; j++) {
|
|
368
|
-
if (!A[j])
|
|
429
|
+
if (!A[j]) {
|
|
430
|
+
continue
|
|
431
|
+
}
|
|
369
432
|
|
|
370
433
|
if (run > 0) {
|
|
371
434
|
run--
|
|
372
435
|
} else {
|
|
373
436
|
F[i][j] = src.ReadUint7()
|
|
374
|
-
if (F[i][j] == 0)
|
|
437
|
+
if (F[i][j] == 0) {
|
|
438
|
+
run = src.ReadByte()
|
|
439
|
+
}
|
|
375
440
|
}
|
|
376
441
|
}
|
|
377
442
|
|
|
@@ -379,7 +444,9 @@ function ReadFrequencies1(src, F, C, shift) {
|
|
|
379
444
|
|
|
380
445
|
// Compute C[] from F[]
|
|
381
446
|
C[i][0] = 0
|
|
382
|
-
for (var j = 0; j < 256; j++)
|
|
447
|
+
for (var j = 0; j < 256; j++) {
|
|
448
|
+
C[i][j + 1] = C[i][j] + F[i][j]
|
|
449
|
+
}
|
|
383
450
|
}
|
|
384
451
|
}
|
|
385
452
|
|
|
@@ -387,43 +454,47 @@ function RansDecode1(src, nbytes, N) {
|
|
|
387
454
|
// FIXME: this bit is missing from the RansDecode0 pseudocode.
|
|
388
455
|
|
|
389
456
|
var comp = src.ReadByte()
|
|
390
|
-
|
|
457
|
+
const shift = comp >> 4
|
|
391
458
|
|
|
392
459
|
var freq_src = src
|
|
393
460
|
if (comp & 1) {
|
|
394
|
-
|
|
395
|
-
|
|
461
|
+
const ulen = src.ReadUint7()
|
|
462
|
+
const clen = src.ReadUint7()
|
|
396
463
|
var comp = new IOStream(src.ReadData(clen))
|
|
397
464
|
var freq_src = new IOStream(RansDecode0(comp, ulen, 4))
|
|
398
465
|
}
|
|
399
466
|
|
|
400
467
|
// Decode frequencies
|
|
401
|
-
|
|
402
|
-
|
|
468
|
+
const F = new Array(256)
|
|
469
|
+
const C = new Array(256)
|
|
403
470
|
ReadFrequencies1(freq_src, F, C, shift)
|
|
404
471
|
|
|
405
472
|
// Fast lookup to avoid slow RansGetSymbolFromFreq
|
|
406
|
-
|
|
407
|
-
for (
|
|
408
|
-
|
|
473
|
+
const C2S = new Array(256)
|
|
474
|
+
for (
|
|
475
|
+
var i = 0;
|
|
476
|
+
i < 256;
|
|
477
|
+
i++ // Could do only for symbols in alphabet?
|
|
478
|
+
) {
|
|
409
479
|
C2S[i] = RansBuildC2S(C[i], shift)
|
|
480
|
+
}
|
|
410
481
|
|
|
411
482
|
// Initialise rANS state
|
|
412
|
-
|
|
413
|
-
|
|
483
|
+
const R = new Array(N)
|
|
484
|
+
const L = new Array(N)
|
|
414
485
|
for (var j = 0; j < N; j++) {
|
|
415
486
|
R[j] = src.ReadUint32()
|
|
416
487
|
L[j] = 0
|
|
417
488
|
}
|
|
418
489
|
|
|
419
490
|
// Main decode loop
|
|
420
|
-
|
|
421
|
-
|
|
491
|
+
const output = new Uint8Array(nbytes)
|
|
492
|
+
const nbytesx = Math.floor(nbytes / N)
|
|
422
493
|
for (var i = 0; i < nbytesx; i++) {
|
|
423
494
|
for (var j = 0; j < N; j++) {
|
|
424
495
|
var f = RansGetCumulativeFreq(R[j], shift)
|
|
425
496
|
|
|
426
|
-
//var s = RansGetSymbolFromFreq(C[L[j]], f);
|
|
497
|
+
// var s = RansGetSymbolFromFreq(C[L[j]], f);
|
|
427
498
|
var s = C2S[L[j]][f] // Precomputed version of above
|
|
428
499
|
|
|
429
500
|
output[i + j * nbytesx] = s
|
|
@@ -448,5 +519,3 @@ function RansDecode1(src, nbytes, N) {
|
|
|
448
519
|
|
|
449
520
|
return output
|
|
450
521
|
}
|
|
451
|
-
|
|
452
|
-
module.exports = { decode }
|