@gmod/cram 3.0.6 → 3.0.7

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.
Files changed (113) hide show
  1. package/dist/cram-bundle.js +1 -1
  2. package/dist/cramFile/codecs/byteArrayStop.d.ts +2 -2
  3. package/dist/cramFile/file.js +8 -10
  4. package/dist/cramFile/file.js.map +1 -1
  5. package/dist/cramFile/util.js.map +1 -1
  6. package/dist/htscodecs/arith_gen.d.ts +26 -0
  7. package/dist/htscodecs/arith_gen.js +558 -0
  8. package/dist/htscodecs/arith_gen.js.map +1 -0
  9. package/dist/htscodecs/arith_sh.d.ts +16 -0
  10. package/dist/htscodecs/arith_sh.js +128 -0
  11. package/dist/htscodecs/arith_sh.js.map +1 -0
  12. package/dist/htscodecs/byte_model.d.ts +11 -0
  13. package/dist/htscodecs/byte_model.js +113 -0
  14. package/dist/htscodecs/byte_model.js.map +1 -0
  15. package/dist/htscodecs/fqzcomp.d.ts +2 -0
  16. package/dist/htscodecs/fqzcomp.js +744 -0
  17. package/dist/htscodecs/fqzcomp.js.map +1 -0
  18. package/dist/htscodecs/index.d.ts +5 -0
  19. package/dist/htscodecs/index.js +70 -0
  20. package/dist/htscodecs/index.js.map +1 -0
  21. package/dist/htscodecs/iostream.d.ts +26 -0
  22. package/dist/htscodecs/iostream.js +242 -0
  23. package/dist/htscodecs/iostream.js.map +1 -0
  24. package/dist/htscodecs/main_arith_gen.d.ts +1 -0
  25. package/dist/htscodecs/main_arith_gen.js +86 -0
  26. package/dist/htscodecs/main_arith_gen.js.map +1 -0
  27. package/dist/htscodecs/main_fqzcomp.d.ts +1 -0
  28. package/dist/htscodecs/main_fqzcomp.js +112 -0
  29. package/dist/htscodecs/main_fqzcomp.js.map +1 -0
  30. package/dist/htscodecs/main_rans.d.ts +1 -0
  31. package/dist/htscodecs/main_rans.js +83 -0
  32. package/dist/htscodecs/main_rans.js.map +1 -0
  33. package/dist/htscodecs/main_rans4x16.d.ts +1 -0
  34. package/dist/htscodecs/main_rans4x16.js +82 -0
  35. package/dist/htscodecs/main_rans4x16.js.map +1 -0
  36. package/dist/htscodecs/main_tok3.d.ts +1 -0
  37. package/dist/htscodecs/main_tok3.js +84 -0
  38. package/dist/htscodecs/main_tok3.js.map +1 -0
  39. package/dist/htscodecs/rans.d.ts +2 -0
  40. package/dist/htscodecs/rans.js +480 -0
  41. package/dist/htscodecs/rans.js.map +1 -0
  42. package/dist/htscodecs/rans4x16.d.ts +2 -0
  43. package/dist/htscodecs/rans4x16.js +896 -0
  44. package/dist/htscodecs/rans4x16.js.map +1 -0
  45. package/dist/htscodecs/tok3.d.ts +2 -0
  46. package/dist/htscodecs/tok3.js +347 -0
  47. package/dist/htscodecs/tok3.js.map +1 -0
  48. package/esm/cramFile/codecs/byteArrayStop.d.ts +2 -2
  49. package/esm/cramFile/file.js +8 -10
  50. package/esm/cramFile/file.js.map +1 -1
  51. package/esm/cramFile/util.js.map +1 -1
  52. package/esm/htscodecs/arith_gen.d.ts +26 -0
  53. package/esm/htscodecs/arith_gen.js +558 -0
  54. package/esm/htscodecs/arith_gen.js.map +1 -0
  55. package/esm/htscodecs/arith_sh.d.ts +16 -0
  56. package/esm/htscodecs/arith_sh.js +128 -0
  57. package/esm/htscodecs/arith_sh.js.map +1 -0
  58. package/esm/htscodecs/byte_model.d.ts +11 -0
  59. package/esm/htscodecs/byte_model.js +113 -0
  60. package/esm/htscodecs/byte_model.js.map +1 -0
  61. package/esm/htscodecs/fqzcomp.d.ts +2 -0
  62. package/esm/htscodecs/fqzcomp.js +744 -0
  63. package/esm/htscodecs/fqzcomp.js.map +1 -0
  64. package/esm/htscodecs/index.d.ts +5 -0
  65. package/esm/htscodecs/index.js +70 -0
  66. package/esm/htscodecs/index.js.map +1 -0
  67. package/esm/htscodecs/iostream.d.ts +26 -0
  68. package/esm/htscodecs/iostream.js +242 -0
  69. package/esm/htscodecs/iostream.js.map +1 -0
  70. package/esm/htscodecs/main_arith_gen.d.ts +1 -0
  71. package/esm/htscodecs/main_arith_gen.js +86 -0
  72. package/esm/htscodecs/main_arith_gen.js.map +1 -0
  73. package/esm/htscodecs/main_fqzcomp.d.ts +1 -0
  74. package/esm/htscodecs/main_fqzcomp.js +112 -0
  75. package/esm/htscodecs/main_fqzcomp.js.map +1 -0
  76. package/esm/htscodecs/main_rans.d.ts +1 -0
  77. package/esm/htscodecs/main_rans.js +83 -0
  78. package/esm/htscodecs/main_rans.js.map +1 -0
  79. package/esm/htscodecs/main_rans4x16.d.ts +1 -0
  80. package/esm/htscodecs/main_rans4x16.js +82 -0
  81. package/esm/htscodecs/main_rans4x16.js.map +1 -0
  82. package/esm/htscodecs/main_tok3.d.ts +1 -0
  83. package/esm/htscodecs/main_tok3.js +84 -0
  84. package/esm/htscodecs/main_tok3.js.map +1 -0
  85. package/esm/htscodecs/rans.d.ts +2 -0
  86. package/esm/htscodecs/rans.js +480 -0
  87. package/esm/htscodecs/rans.js.map +1 -0
  88. package/esm/htscodecs/rans4x16.d.ts +2 -0
  89. package/esm/htscodecs/rans4x16.js +896 -0
  90. package/esm/htscodecs/rans4x16.js.map +1 -0
  91. package/esm/htscodecs/tok3.d.ts +2 -0
  92. package/esm/htscodecs/tok3.js +347 -0
  93. package/esm/htscodecs/tok3.js.map +1 -0
  94. package/package.json +1 -2
  95. package/src/cramFile/file.ts +8 -10
  96. package/src/cramFile/util.ts +0 -1
  97. package/src/htscodecs/Makefile +142 -0
  98. package/src/htscodecs/README.md +64 -0
  99. package/src/htscodecs/arith_gen.js +607 -0
  100. package/src/htscodecs/arith_sh.js +138 -0
  101. package/src/htscodecs/byte_model.js +126 -0
  102. package/src/htscodecs/fqzcomp.js +834 -0
  103. package/src/htscodecs/index.js +79 -0
  104. package/src/htscodecs/iostream.js +256 -0
  105. package/src/htscodecs/main_arith_gen.js +96 -0
  106. package/src/htscodecs/main_fqzcomp.js +113 -0
  107. package/src/htscodecs/main_rans.js +88 -0
  108. package/src/htscodecs/main_rans4x16.js +87 -0
  109. package/src/htscodecs/main_tok3.js +86 -0
  110. package/src/htscodecs/rans.js +545 -0
  111. package/src/htscodecs/rans4x16.js +1003 -0
  112. package/src/htscodecs/tok3.js +396 -0
  113. package/src/typings/htscodecs.d.ts +0 -6
@@ -0,0 +1,896 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright (c) 2019,2020 Genome Research Ltd.
4
+ * Author(s): James Bonfield
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted provided that the following conditions are met:
8
+ *
9
+ * 1. Redistributions of source code must retain the above copyright notice,
10
+ * this list of conditions and the following disclaimer.
11
+ *
12
+ * 2. Redistributions in binary form must reproduce the above
13
+ * copyright notice, this list of conditions and the following
14
+ * disclaimer in the documentation and/or other materials provided
15
+ * with the distribution.
16
+ *
17
+ * 3. Neither the names Genome Research Ltd and Wellcome Trust Sanger
18
+ * Institute nor the names of its contributors may be used to endorse
19
+ * or promote products derived from this software without specific
20
+ * prior written permission.
21
+ *
22
+ * THIS SOFTWARE IS PROVIDED BY GENOME RESEARCH LTD AND CONTRIBUTORS "AS
23
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
24
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
25
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GENOME RESEARCH
26
+ * LTD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33
+ */
34
+ const IOStream = require('./iostream');
35
+ //----------------------------------------------------------------------
36
+ // rANS primitives itself
37
+ //
38
+ // RansGet* is decoder side
39
+ function RansGetCumulativeFreq(R, bits) {
40
+ return R & ((1 << bits) - 1);
41
+ }
42
+ function RansGetSymbolFromFreq(C, f) {
43
+ // NOTE: Inefficient.
44
+ // In practice we would implement this via a precomputed
45
+ // lookup table C2S[f]; see RansBuildC2S below.
46
+ var s = 0;
47
+ while (f >= C[s + 1])
48
+ s++;
49
+ //console.error(f, C, s)
50
+ return s;
51
+ }
52
+ function RansBuildC2S(C, bits) {
53
+ var max = 1 << bits;
54
+ var C2S = new Array(max);
55
+ var s = 0;
56
+ for (var f = 0; f < max; f++) {
57
+ while (f >= C[s + 1])
58
+ s++;
59
+ C2S[f] = s;
60
+ }
61
+ return C2S;
62
+ }
63
+ function RansAdvanceStep(R, c, f, bits) {
64
+ return f * (R >> bits) + (R & ((1 << bits) - 1)) - c;
65
+ }
66
+ function RansRenorm(src, R) {
67
+ if (R < 1 << 15)
68
+ R = (R << 16) + src.ReadUint16();
69
+ return R;
70
+ }
71
+ // RanEnc* is for encoder
72
+ function RansEncInit() {
73
+ return 1 << 15;
74
+ }
75
+ function RansEncFlush(R, dst) {
76
+ dst.WriteByteNeg((R >> 24) & 0xff);
77
+ dst.WriteByteNeg((R >> 16) & 0xff);
78
+ dst.WriteByteNeg((R >> 8) & 0xff);
79
+ dst.WriteByteNeg((R >> 0) & 0xff);
80
+ }
81
+ function RansEncRenorm(R, dst, freq, scale_bits) {
82
+ //var R_max = (((1 << 15) >> scale_bits) << 16) * freq;
83
+ var R_max = (1 << (31 - scale_bits)) * freq;
84
+ while (R >= R_max) {
85
+ dst.WriteByteNeg((R >> 8) & 0xff);
86
+ dst.WriteByteNeg(R & 0xff);
87
+ R >>= 16;
88
+ }
89
+ return R;
90
+ }
91
+ // Puts a symbol with frequency freq, cumulative freq start
92
+ // and total freq 1<<scale_bits.
93
+ //
94
+ // Note with static probabilities, /freq and %freq could be
95
+ // precomputed via multiplies and shifts.
96
+ function RansEncPut(R, dst, start, freq, scale_bits) {
97
+ var scale = 1 << scale_bits;
98
+ R = RansEncRenorm(R, dst, freq, scale_bits);
99
+ R = (Math.floor(R / freq) << scale_bits) + (R % freq) + start;
100
+ return R;
101
+ }
102
+ //----------------------------------------------------------------------
103
+ // Run length encoding
104
+ function EncodeRLE(src, N) {
105
+ // Step 1: find which symbols benefit from RLE
106
+ var L = new Array(256);
107
+ for (var i = 0; i < 256; i++)
108
+ L[i] = 0;
109
+ var last = -1;
110
+ for (var i = 0; i < src.length; i++) {
111
+ L[src[i]] += src[i] == last ? 1 : -1;
112
+ last = src[i];
113
+ }
114
+ var nrle = 0;
115
+ for (var i = 0; i < 256; i++)
116
+ if (L[i] > 0)
117
+ nrle++;
118
+ if (!nrle) {
119
+ // Format cannot cope with zero RLE symbols, so pick one!
120
+ nrle = 1;
121
+ L[0] = 1;
122
+ }
123
+ // Start meta-data as list of symbols to RLE
124
+ var meta = new IOStream('', 0, nrle + 1 + src.length);
125
+ meta.WriteByte(nrle);
126
+ for (var i = 0; i < 256; i++)
127
+ if (L[i] > 0)
128
+ meta.WriteByte(i);
129
+ // Step 2: Now apply RLE itself
130
+ var data = new Buffer.allocUnsafe(src.length);
131
+ var dpos = 0;
132
+ for (var i = 0; i < src.length; i++) {
133
+ data[dpos++] = src[i];
134
+ if (L[src[i]] > 0) {
135
+ last = src[i];
136
+ var run = 0;
137
+ while (i + run + 1 < src.length && src[i + run + 1] == last)
138
+ run++;
139
+ meta.WriteUint7(run);
140
+ i += run;
141
+ }
142
+ }
143
+ // Compress the meta-data
144
+ var cmeta = RansEncode0(meta.buf.slice(0, meta.pos), N);
145
+ var hdr = new IOStream('', 0, 16);
146
+ hdr.WriteUint7(meta.pos * 2); // Uncompressed meta-data length + compressed-bit-flag(0)
147
+ hdr.WriteUint7(dpos); // Length of RLE encoded data
148
+ hdr.WriteUint7(cmeta.length); // Compressed meta-data length
149
+ var meta = Buffer.concat([hdr.buf.slice(0, hdr.pos), cmeta]);
150
+ return [meta, data.slice(0, dpos)];
151
+ }
152
+ function DecodeRLEMeta(src, N) {
153
+ var u_meta_len = src.ReadUint7();
154
+ var rle_len = src.ReadUint7();
155
+ // Decode RLE lengths
156
+ if (u_meta_len & 1) {
157
+ var rle_meta = src.ReadData((u_meta_len - 1) / 2);
158
+ }
159
+ else {
160
+ var comp_meta_len = src.ReadUint7();
161
+ var rle_meta = src.ReadData(comp_meta_len);
162
+ rle_meta = RansDecode0(new IOStream(rle_meta), u_meta_len / 2, N);
163
+ }
164
+ // Decode list of symbols for which RLE lengths are applied
165
+ var rle_meta = new IOStream(rle_meta);
166
+ var L = new Array(256);
167
+ var n = rle_meta.ReadByte();
168
+ if (n == 0)
169
+ n = 256;
170
+ for (var i = 0; i < n; i++)
171
+ L[rle_meta.ReadByte()] = 1;
172
+ return [L, rle_meta, rle_len];
173
+ }
174
+ function DecodeRLE(buf, L, rle_meta, len) {
175
+ var src = new IOStream(buf);
176
+ var out = new Buffer.allocUnsafe(len);
177
+ // Expand up buf+meta to out; i = buf index, j = out index
178
+ var j = 0;
179
+ for (var i = 0; j < len; i++) {
180
+ var sym = buf[i];
181
+ if (L[sym]) {
182
+ var run = rle_meta.ReadUint7();
183
+ for (var r = 0; r <= run; r++)
184
+ out[j++] = sym;
185
+ }
186
+ else {
187
+ out[j++] = sym;
188
+ }
189
+ }
190
+ return out;
191
+ }
192
+ //----------------------------------------------------------------------
193
+ // Bit packing
194
+ function EncodePack(src) {
195
+ // Step 1: identify number of distinct symbols
196
+ var F = new Array(256);
197
+ for (var i = 0; i < 256; i++)
198
+ F[i] = 0;
199
+ for (var i = 0; i < src.length; i++)
200
+ F[src[i]]++;
201
+ var P = new Array(256);
202
+ var nsym = 0;
203
+ for (var i = 0; i < 256; i++)
204
+ if (F[i] > 0)
205
+ P[i] = nsym++;
206
+ if (nsym > 16) {
207
+ //console.error("Too many symbols to pack:",nsym)
208
+ return;
209
+ }
210
+ // Pack data
211
+ if (nsym <= 1) {
212
+ // Constant
213
+ var data = new Buffer.allocUnsafe(0);
214
+ }
215
+ else if (nsym <= 2) {
216
+ // 1 bit per value
217
+ var data = new Buffer.allocUnsafe(Math.ceil(src.length / 8));
218
+ var j = -1;
219
+ for (i = 0; i < src.length; i++) {
220
+ if (i % 8 == 0)
221
+ data[++j] = 0;
222
+ data[j] += P[src[i]] << i % 8;
223
+ }
224
+ }
225
+ else if (nsym <= 4) {
226
+ // 2 bits per value
227
+ var data = new Buffer.allocUnsafe(Math.ceil(src.length / 4));
228
+ var j = -1;
229
+ for (i = 0; i < src.length; i++) {
230
+ if (i % 4 == 0)
231
+ data[++j] = 0;
232
+ data[j] += P[src[i]] << ((i % 4) * 2);
233
+ }
234
+ }
235
+ else {
236
+ // 4 bits per value
237
+ var data = new Buffer.allocUnsafe(Math.ceil(src.length / 2));
238
+ var j = -1;
239
+ for (i = 0; i < src.length; i++) {
240
+ if (i % 2 == 0)
241
+ data[++j] = 0;
242
+ data[j] += P[src[i]] << ((i % 2) * 4);
243
+ }
244
+ }
245
+ // Produce pack meta-data
246
+ var meta = new IOStream('', 0, nsym + 5);
247
+ meta.WriteByte(nsym);
248
+ var j = 0;
249
+ for (var i = 0; i < 256; i++) {
250
+ if (F[i] > 0) {
251
+ F[i] = j++;
252
+ meta.WriteByte(i);
253
+ }
254
+ }
255
+ meta.WriteUint7(data.length);
256
+ return [meta.buf.slice(0, meta.pos), data];
257
+ }
258
+ // Pack meta data is the number and value of distinct symbols plus
259
+ // the length of the packed byte stream.
260
+ function DecodePackMeta(src) {
261
+ var nsym = src.ReadByte();
262
+ var P = new Array(nsym);
263
+ for (var i = 0; i < nsym; i++)
264
+ P[i] = src.ReadByte();
265
+ var len = src.ReadUint7();
266
+ return [P, nsym, len];
267
+ }
268
+ // Extract bits from src producing output of length len.
269
+ // Nsym is number of distinct symbols used.
270
+ function DecodePack(data, P, nsym, len) {
271
+ var out = new Buffer.allocUnsafe(len);
272
+ var j = 0;
273
+ // Constant value
274
+ if (nsym <= 1) {
275
+ for (var i = 0; i < len; i++)
276
+ out[i] = P[0];
277
+ }
278
+ // 1 bit per value
279
+ else if (nsym <= 2) {
280
+ for (i = 0; i < len; i++) {
281
+ if (i % 8 == 0)
282
+ var v = data[j++];
283
+ out[i] = P[v & 1];
284
+ v >>= 1;
285
+ }
286
+ }
287
+ // 2 bits per value
288
+ else if (nsym <= 4) {
289
+ for (i = 0; i < len; i++) {
290
+ if (i % 4 == 0)
291
+ var v = data[j++];
292
+ out[i] = P[v & 3];
293
+ v >>= 2;
294
+ }
295
+ }
296
+ // 4 bits per value
297
+ else if (nsym <= 16) {
298
+ for (i = 0; i < len; i++) {
299
+ if (i % 2 == 0)
300
+ var v = data[j++];
301
+ out[i] = P[v & 15];
302
+ v >>= 4;
303
+ }
304
+ }
305
+ return out;
306
+ }
307
+ //----------------------------------------------------------------------
308
+ // 4 way interleaving.
309
+ // This is simply 4 rANS streams interleaved to form bytes 0,4,8...,
310
+ // 1,5,9..., 2,6,10... and 3,7,11...
311
+ //
312
+ // It works well when the distributions differ for each of the 4 bytes,
313
+ // for example when compressing a series of 32-bit integers.
314
+ //
315
+ // Maybe make this more general purpose of X* where we specify the stripe
316
+ // size instead of fixing it at 4?
317
+ function RansEncodeStripe(hdr, src, N) {
318
+ if (N == 0)
319
+ N = 4; // old default
320
+ // Split into multiple streams
321
+ var part = new Array(N);
322
+ var ulen = new Array(N);
323
+ for (var s = 0; s < N; s++) {
324
+ ulen[s] = Math.floor(src.length / N) + (src.length % N > s);
325
+ part[s] = new Array(ulen[s]);
326
+ }
327
+ for (var x = 0, i = 0; i < src.length; i += N, x++) {
328
+ for (var j = 0; j < N; j++)
329
+ if (x < part[j].length)
330
+ part[j][x] = src[i + j];
331
+ }
332
+ // Compress each part
333
+ var comp = new Array(N);
334
+ var total = 0;
335
+ for (var s = 0; s < N; s++) {
336
+ // Example: try O0 and O1 and choose best
337
+ var comp0 = encode(part[s], 0);
338
+ var comp1 = encode(part[s], 1);
339
+ comp[s] = comp1.length < comp0.length ? comp1 : comp0;
340
+ total += comp[s].length;
341
+ }
342
+ // Serialise
343
+ var out = new IOStream('', 0, total + 5 * N + 1);
344
+ out.WriteByte(N);
345
+ for (var s = 0; s < N; s++)
346
+ out.WriteUint7(comp[s].length);
347
+ for (var s = 0; s < N; s++)
348
+ out.WriteData(comp[s], comp[s].length);
349
+ return out.buf.slice(0, out.buf.pos);
350
+ }
351
+ function RansDecodeStripe(src, len) {
352
+ var N = src.ReadByte();
353
+ // Retrieve lengths
354
+ var clen = new Array(N);
355
+ var ulen = new Array(N);
356
+ for (var j = 0; j < N; j++)
357
+ clen[j] = src.ReadUint7();
358
+ // Decode streams
359
+ var T = new Array(N);
360
+ for (var j = 0; j < N; j++) {
361
+ ulen[j] = Math.floor(len / N) + (len % N > j);
362
+ T[j] = RansDecodeStream(src, ulen[j]);
363
+ }
364
+ // Transpose
365
+ var out = new Buffer.allocUnsafe(len);
366
+ for (var j = 0; j < N; j++) {
367
+ for (var i = 0; i < ulen[j]; i++) {
368
+ out[i * N + j] = T[j][i];
369
+ }
370
+ }
371
+ return out;
372
+ }
373
+ //----------------------------------------------------------------------
374
+ // Main rANS entry function: decodes a compressed src and
375
+ // returns the uncompressed buffer.
376
+ function decode(src) {
377
+ var stream = new IOStream(src);
378
+ return RansDecodeStream(stream, 0);
379
+ }
380
+ function RansDecodeStream(stream, n_out) {
381
+ var format = stream.ReadByte();
382
+ var order = format & 1;
383
+ var x32 = format & 4;
384
+ var stripe = format & 8;
385
+ var nosz = format & 16;
386
+ var cat = format & 32;
387
+ var rle = format & 64;
388
+ var pack = format & 128;
389
+ var Nway = x32 ? 32 : 4;
390
+ if (!nosz)
391
+ n_out = stream.ReadUint7();
392
+ // N-way interleaving
393
+ if (stripe)
394
+ return RansDecodeStripe(stream, n_out);
395
+ // Bit packing
396
+ if (pack) {
397
+ var pack_len = n_out;
398
+ var [P, nsym, n_out] = DecodePackMeta(stream);
399
+ }
400
+ // Run length encoding
401
+ if (rle) {
402
+ var rle_len = n_out;
403
+ var [L, rle_meta, n_out] = DecodeRLEMeta(stream, Nway);
404
+ }
405
+ // Uncompress data (all, packed or run literals)
406
+ if (cat)
407
+ var buf = stream.ReadData(n_out);
408
+ else if (order == 0)
409
+ var buf = RansDecode0(stream, n_out, Nway);
410
+ else
411
+ var buf = RansDecode1(stream, n_out, Nway);
412
+ // Apply expansion transforms
413
+ if (rle)
414
+ buf = DecodeRLE(buf, L, rle_meta, rle_len);
415
+ if (pack)
416
+ buf = DecodePack(buf, P, nsym, pack_len);
417
+ return buf;
418
+ }
419
+ function encode(src, format) {
420
+ var hdr = new IOStream('', 0, 10);
421
+ hdr.WriteByte(format);
422
+ var order = format & 1;
423
+ var x32 = format & 4;
424
+ var stripe = format & 8;
425
+ var nosz = format & 16;
426
+ var cat = format & 32;
427
+ var rle = format & 64;
428
+ var pack = format & 128;
429
+ var Nway = x32 ? 32 : 4; // interleaving amount
430
+ var N = format >> 8; // stripe size
431
+ if (!nosz)
432
+ hdr.WriteUint7(src.length);
433
+ if (stripe)
434
+ return Buffer.concat([
435
+ hdr.buf.slice(0, hdr.pos),
436
+ RansEncodeStripe(hdr, src, N),
437
+ ]);
438
+ var pack_meta = new Buffer.alloc(0);
439
+ if (pack)
440
+ [pack_meta, src] = EncodePack(src);
441
+ var rle_meta = new Buffer.alloc(0);
442
+ if (rle)
443
+ [rle_meta, src] = EncodeRLE(src, Nway);
444
+ if (src.length < 4 && order == 1) {
445
+ // Protect against short order-1 data due to RLE/Pack
446
+ order = 0;
447
+ hdr.buf[0] &= ~1;
448
+ }
449
+ if (cat)
450
+ var comp = src;
451
+ else if (order == 0)
452
+ var comp = RansEncode0(src, Nway);
453
+ else
454
+ var comp = RansEncode1(src, Nway);
455
+ return Buffer.concat([hdr.buf.slice(0, hdr.pos), pack_meta, rle_meta, comp]);
456
+ }
457
+ //----------------------------------------------------------------------
458
+ // Order-0 decoder
459
+ function ReadAlphabet(src) {
460
+ var A = new Array(256);
461
+ for (var i = 0; i < 256; i++)
462
+ A[i] = 0;
463
+ var rle = 0;
464
+ var sym = src.ReadByte();
465
+ var last_sym = sym;
466
+ do {
467
+ A[sym] = 1;
468
+ if (rle > 0) {
469
+ rle--;
470
+ sym++;
471
+ }
472
+ else {
473
+ sym = src.ReadByte();
474
+ if (sym == last_sym + 1)
475
+ rle = src.ReadByte();
476
+ }
477
+ last_sym = sym;
478
+ } while (sym != 0);
479
+ return A;
480
+ }
481
+ // Decode a single table of order-0 frequences,
482
+ // filling out the F and C arrays.
483
+ function ReadFrequencies0(src, F, C) {
484
+ // Initialise; not in the specification - implicit?
485
+ for (var i = 0; i < 256; i++)
486
+ F[i] = 0;
487
+ // Fetch alphabet
488
+ var A = ReadAlphabet(src);
489
+ // Fetch frequencies for the symbols listed in our alphabet
490
+ for (var i = 0; i < 256; i++) {
491
+ if (A[i] > 0)
492
+ F[i] = src.ReadUint7();
493
+ }
494
+ NormaliseFrequencies0_Shift(F, 12);
495
+ // Compute C[] from F[]
496
+ C[0] = 0;
497
+ for (var i = 0; i <= 255; i++)
498
+ C[i + 1] = C[i] + F[i];
499
+ }
500
+ function RansDecode0(src, nbytes, N) {
501
+ // Decode frequencies
502
+ var F = new Array(256);
503
+ var C = new Array(256);
504
+ ReadFrequencies0(src, F, C);
505
+ // Fast lookup to avoid slow RansGetSymbolFromFreq
506
+ var C2S = RansBuildC2S(C, 12);
507
+ // Initialise rANS state
508
+ var R = new Array(N);
509
+ for (var i = 0; i < N; i++)
510
+ R[i] = src.ReadUint32();
511
+ // Main decode loop
512
+ var output = new Buffer.allocUnsafe(nbytes);
513
+ for (var i = 0; i < nbytes; i++) {
514
+ var ix = i & (N - 1); // equiv to i%N as N is power of 2
515
+ var f = RansGetCumulativeFreq(R[ix], 12);
516
+ var s = C2S[f]; // Equiv to RansGetSymbolFromFreq(C, f);
517
+ output[i] = s;
518
+ R[ix] = RansAdvanceStep(R[ix], C[s], F[s], 12);
519
+ R[ix] = RansRenorm(src, R[ix]);
520
+ }
521
+ // Main decode loop
522
+ return output;
523
+ }
524
+ //----------------------------------------------------------------------
525
+ // Order-0 encoder
526
+ function BuildFrequencies0(src, F) {
527
+ for (var i = 0; i < 256; i++)
528
+ F[i] = 0;
529
+ for (var i = 0; i < src.length; i++)
530
+ F[src[i]]++;
531
+ }
532
+ function NormaliseFrequencies0(F, bits) {
533
+ // Compute total
534
+ var tot = 0;
535
+ for (var i = 0; i < 256; i++)
536
+ tot += F[i];
537
+ // Scale total of frequencies to max
538
+ const max = 1 << bits;
539
+ var scale = max / tot;
540
+ do {
541
+ var max_val = 0;
542
+ var max_idx = 0;
543
+ var renorm = 0;
544
+ tot = 0;
545
+ for (var i = 0; i < 256; i++) {
546
+ if (F[i] == 0)
547
+ continue;
548
+ if (max_val < F[i]) {
549
+ max_val = F[i];
550
+ max_idx = i;
551
+ }
552
+ F[i] = Math.floor(F[i] * scale);
553
+ if (F[i] == 0)
554
+ F[i] = 1;
555
+ tot += F[i];
556
+ }
557
+ // Adjust new tot to ensure it matches.
558
+ if (tot < max) {
559
+ // Too low, boost the most common symbol
560
+ F[max_idx] += max - tot;
561
+ }
562
+ else if (tot - max < F[max_idx] / 2 && F[max_idx] > 2) {
563
+ // Too high, reduce the common symbol
564
+ F[max_idx] -= tot - max;
565
+ }
566
+ else if (tot != max) {
567
+ // Much too high, fudge scale and try again.
568
+ scale = max / tot;
569
+ renorm = 1;
570
+ }
571
+ } while (renorm);
572
+ }
573
+ function NormaliseFrequencies0_Shift(F, bits) {
574
+ // Compute total and number of bits to shift by
575
+ var tot = 0;
576
+ for (var i = 0; i < 256; i++)
577
+ tot += F[i];
578
+ if (tot == 0 || tot == 1 << bits)
579
+ return;
580
+ var shift = 0;
581
+ while (tot < 1 << bits) {
582
+ tot *= 2;
583
+ shift++;
584
+ }
585
+ // Scale total of frequencies to (1<<bits)
586
+ for (var i = 0; i < 256; i++)
587
+ F[i] <<= shift;
588
+ }
589
+ function WriteAlphabet(out, F) {
590
+ var rle = 0;
591
+ for (var i = 0; i < 256; i++) {
592
+ if (!F[i])
593
+ continue;
594
+ if (rle > 0)
595
+ rle--;
596
+ else {
597
+ out.WriteByte(i);
598
+ if (i > 0 && F[i - 1] > 0) {
599
+ // We've encoded two symbol frequencies in a row.
600
+ // How many more are there? Store that count so
601
+ // we can avoid writing consecutive symbols.
602
+ for (rle = i + 1; rle < 256 && F[rle]; rle++)
603
+ ;
604
+ rle -= i + 1;
605
+ out.WriteByte(rle);
606
+ }
607
+ }
608
+ }
609
+ out.WriteByte(0);
610
+ }
611
+ function WriteFrequencies0(out, F) {
612
+ WriteAlphabet(out, F);
613
+ for (var i = 0; i < 256; i++) {
614
+ if (F[i])
615
+ out.WriteUint7(F[i]);
616
+ }
617
+ }
618
+ function RansEncode0(src, N) {
619
+ const nbytes = src.length;
620
+ var output = new IOStream('', 0, 257 * 3 + 9);
621
+ // Compute frequencies
622
+ var F = new Array(256);
623
+ BuildFrequencies0(src, F);
624
+ var bit_size = Math.ceil(Math.log2(nbytes));
625
+ if (bit_size > 12)
626
+ bit_size = 12;
627
+ NormaliseFrequencies0(F, bit_size);
628
+ WriteFrequencies0(output, F);
629
+ NormaliseFrequencies0(F, 12);
630
+ // Compute cumulative frequencies
631
+ var C = new Array(256);
632
+ C[0] = 0;
633
+ for (var i = 1; i < 256; i++)
634
+ C[i] = C[i - 1] + F[i - 1];
635
+ // Initialise rANS state
636
+ var R = new Array(N);
637
+ for (var i = 0; i < N; i++)
638
+ R[i] = RansEncInit();
639
+ // Allow expansion room if trying to compress random data.
640
+ var rans_out = new IOStream('', (nbytes * 1.05 + 100) >> 0, (nbytes * 1.05 + 100) >> 0);
641
+ // Main encode loop
642
+ for (var i = nbytes - 1; i >= 0; i--)
643
+ R[i % N] = RansEncPut(R[i % N], rans_out, C[src[i]], F[src[i]], 12);
644
+ for (var i = N - 1; i >= 0; i--)
645
+ RansEncFlush(R[i], rans_out);
646
+ // Stitch blocks together into final output buffer
647
+ //console.error("pos=",rans_out.pos, " len=",rans_out.length)
648
+ //console.error(rans_out.buf.slice(rans_out.pos, rans_out.length))
649
+ return Buffer.concat([
650
+ output.buf.slice(0, output.pos),
651
+ rans_out.buf.slice(rans_out.pos, rans_out.length),
652
+ ], output.pos + rans_out.length - rans_out.pos);
653
+ }
654
+ //----------------------------------------------------------------------
655
+ // Order-1 decoder
656
+ // Decode a table of order-1 frequences,
657
+ // filling out the F and C arrays.
658
+ function ReadFrequencies1(src, F, C, shift) {
659
+ // Initialise; not in the specification - implicit?
660
+ for (var i = 0; i < 256; i++) {
661
+ F[i] = new Array(256);
662
+ C[i] = new Array(256);
663
+ for (var j = 0; j < 256; j++)
664
+ F[i][j] = 0;
665
+ }
666
+ // Fetch alphabet
667
+ var A = ReadAlphabet(src);
668
+ // Read F[]
669
+ for (var i = 0; i < 256; i++) {
670
+ if (!A[i])
671
+ continue;
672
+ var run = 0;
673
+ for (var j = 0; j < 256; j++) {
674
+ if (!A[j])
675
+ continue;
676
+ if (run > 0) {
677
+ run--;
678
+ }
679
+ else {
680
+ F[i][j] = src.ReadUint7();
681
+ if (F[i][j] == 0)
682
+ run = src.ReadByte();
683
+ }
684
+ }
685
+ NormaliseFrequencies0_Shift(F[i], shift);
686
+ // Compute C[] from F[]
687
+ C[i][0] = 0;
688
+ for (var j = 0; j < 256; j++)
689
+ C[i][j + 1] = C[i][j] + F[i][j];
690
+ }
691
+ }
692
+ function RansDecode1(src, nbytes, N) {
693
+ // FIXME: this bit is missing from the RansDecode0 pseudocode.
694
+ var comp = src.ReadByte();
695
+ var shift = comp >> 4;
696
+ var freq_src = src;
697
+ if (comp & 1) {
698
+ var ulen = src.ReadUint7();
699
+ var clen = src.ReadUint7();
700
+ var comp = new IOStream(src.ReadData(clen));
701
+ var freq_src = new IOStream(RansDecode0(comp, ulen, 4));
702
+ }
703
+ // Decode frequencies
704
+ var F = new Array(256);
705
+ var C = new Array(256);
706
+ ReadFrequencies1(freq_src, F, C, shift);
707
+ // Fast lookup to avoid slow RansGetSymbolFromFreq
708
+ var C2S = new Array(256);
709
+ for (var i = 0; i < 256; i++)
710
+ // Could do only for symbols in alphabet?
711
+ C2S[i] = RansBuildC2S(C[i], shift);
712
+ // Initialise rANS state
713
+ var R = new Array(N);
714
+ var L = new Array(N);
715
+ for (var j = 0; j < N; j++) {
716
+ R[j] = src.ReadUint32();
717
+ L[j] = 0;
718
+ }
719
+ // Main decode loop
720
+ var output = new Buffer.allocUnsafe(nbytes);
721
+ var nbytesx = Math.floor(nbytes / N);
722
+ for (var i = 0; i < nbytesx; i++) {
723
+ for (var j = 0; j < N; j++) {
724
+ var f = RansGetCumulativeFreq(R[j], shift);
725
+ //var s = RansGetSymbolFromFreq(C[L[j]], f);
726
+ var s = C2S[L[j]][f]; // Precomputed version of above
727
+ output[i + j * nbytesx] = s;
728
+ R[j] = RansAdvanceStep(R[j], C[L[j]][s], F[L[j]][s], shift);
729
+ R[j] = RansRenorm(src, R[j]);
730
+ L[j] = s;
731
+ }
732
+ }
733
+ // Now deal with the remainder if buffer size is not a multiple of N,
734
+ // using the last rANS state exclusively. (It'd have been nice to have
735
+ // designed this to just act as if we kept going with a bail out.)
736
+ i = N * i;
737
+ while (i < nbytes) {
738
+ var f = RansGetCumulativeFreq(R[N - 1], shift);
739
+ var s = RansGetSymbolFromFreq(C[L[N - 1]], f);
740
+ output[i++] = s;
741
+ R[N - 1] = RansAdvanceStep(R[N - 1], C[L[N - 1]][s], F[L[N - 1]][s], shift);
742
+ R[N - 1] = RansRenorm(src, R[N - 1]);
743
+ L[N - 1] = s;
744
+ }
745
+ return output;
746
+ }
747
+ //----------------------------------------------------------------------
748
+ // Order-1 encoder
749
+ function BuildFrequencies1(src, F, F0, N) {
750
+ for (var i = 0; i < 256; i++) {
751
+ F0[i] = 0;
752
+ for (var j = 0; j < 256; j++)
753
+ F[i][j] = 0;
754
+ }
755
+ var last = 0;
756
+ for (var i = 0; i < src.length; i++) {
757
+ F0[last]++;
758
+ F[last][src[i]]++;
759
+ last = src[i];
760
+ }
761
+ F0[last]++;
762
+ // Also accept we'll be starting at N points, not just byte 0
763
+ for (var i = 1; i < N; i++)
764
+ F[0][src[i * Math.floor(src.length / N)]]++;
765
+ F0[0] += N - 1;
766
+ }
767
+ function NormaliseFrequencies1(F, F0, shift) {
768
+ for (var i = 0; i < 256; i++) {
769
+ if (!F0[i])
770
+ continue;
771
+ var bit_size = Math.ceil(Math.log2(F0[i]));
772
+ if (bit_size > shift)
773
+ bit_size = shift;
774
+ NormaliseFrequencies0(F[i], bit_size);
775
+ }
776
+ }
777
+ function NormaliseFrequencies1_Shift(F, F0, shift) {
778
+ for (var i = 0; i < 256; i++)
779
+ if (F0[i])
780
+ NormaliseFrequencies0_Shift(F[i], shift);
781
+ }
782
+ function WriteFrequencies1(out, F, F0) {
783
+ WriteAlphabet(out, F0);
784
+ for (var i = 0; i < 256; i++) {
785
+ if (!F0[i])
786
+ continue;
787
+ var run = 0;
788
+ for (var j = 0; j < 256; j++) {
789
+ if (!F0[j])
790
+ continue;
791
+ if (run) {
792
+ run--;
793
+ }
794
+ else {
795
+ out.WriteUint7(F[i][j]);
796
+ if (!F[i][j]) {
797
+ // Count how many more zero-freqs we have
798
+ for (var k = j + 1; k < 256; k++) {
799
+ if (!F0[k])
800
+ continue;
801
+ if (F[i][k] == 0)
802
+ run++;
803
+ else
804
+ break;
805
+ }
806
+ out.WriteByte(run);
807
+ }
808
+ }
809
+ }
810
+ }
811
+ }
812
+ function RansEncode1(src, N) {
813
+ const nbytes = src.length;
814
+ var output = new IOStream('', 0, 257 * 257 * 3 + 9);
815
+ // Compute frequencies
816
+ var F0 = new Array(256);
817
+ var F = new Array(256);
818
+ var C = new Array(256);
819
+ for (var i = 0; i < 256; i++) {
820
+ F[i] = new Array(256);
821
+ C[i] = new Array(256);
822
+ }
823
+ // Frequency precision
824
+ var shift = 12;
825
+ BuildFrequencies1(src, F, F0, N);
826
+ NormaliseFrequencies1(F, F0, shift);
827
+ // Store frequencies, possibly compressed
828
+ var freq = new IOStream('', 0, 257 * 257 * 3 + 9);
829
+ WriteFrequencies1(freq, F, F0);
830
+ var cfreq = RansEncode0(freq.buf.slice(0, freq.pos), 4);
831
+ if (cfreq.length < freq.pos) {
832
+ output.WriteByte(1 | (shift << 4));
833
+ output.WriteUint7(freq.pos);
834
+ output.WriteUint7(cfreq.length);
835
+ output.WriteData(cfreq, cfreq.length);
836
+ }
837
+ else {
838
+ output.WriteByte(0 | (shift << 4));
839
+ output.WriteData(freq.buf, freq.pos);
840
+ }
841
+ // Normalise and compute cumulative frequencies
842
+ NormaliseFrequencies1_Shift(F, F0, shift);
843
+ for (var i = 0; i < 256; i++) {
844
+ if (!F0[i])
845
+ continue;
846
+ C[i][0] = 0;
847
+ for (var j = 1; j < 256; j++)
848
+ C[i][j] = C[i][j - 1] + F[i][j - 1];
849
+ }
850
+ // Initialise rANS state
851
+ var R = new Array(N);
852
+ var L = new Array(N);
853
+ for (var j = 0; j < N; j++) {
854
+ R[j] = RansEncInit();
855
+ L[j] = 0;
856
+ }
857
+ var rans_out = new IOStream('', (nbytes * 1.05 + 100) >> 0, (nbytes * 1.05 + 100) >> 0);
858
+ // We have N rans codecs running in parallel on its own 1/Nth of buffer
859
+ var nbytesx = Math.floor(nbytes / N);
860
+ var idx = new Array(N);
861
+ var last = new Array(N);
862
+ for (var j = 0; j < N; j++) {
863
+ idx[j] = (j + 1) * nbytesx - 2;
864
+ last[j] = src[idx[j] + 1];
865
+ }
866
+ // Deal with the remainder if not a multiple of N
867
+ last[N - 1] = src[nbytes - 1];
868
+ for (var i = nbytes - 2; i > N * nbytesx - 2; i--) {
869
+ R[N - 1] = RansEncPut(R[N - 1], rans_out, C[src[i]][last[N - 1]], F[src[i]][last[N - 1]], shift);
870
+ last[N - 1] = src[i];
871
+ }
872
+ // Main encode loop
873
+ var s = new Array(N);
874
+ while (idx[0] >= 0) {
875
+ // Separate loop as a speed optimisation
876
+ for (var j = N - 1; j >= 0; j--)
877
+ s[j] = src[idx[j]];
878
+ for (var j = N - 1; j >= 0; j--) {
879
+ R[j] = RansEncPut(R[j], rans_out, C[s[j]][last[j]], F[s[j]][last[j]], shift);
880
+ last[j] = s[j];
881
+ idx[j]--;
882
+ }
883
+ }
884
+ for (var j = N - 1; j >= 0; j--) {
885
+ R[j] = RansEncPut(R[j], rans_out, C[0][last[j]], F[0][last[j]], shift);
886
+ }
887
+ for (var i = N - 1; i >= 0; i--)
888
+ RansEncFlush(R[i], rans_out);
889
+ // Stitch blocks together into final output buffer
890
+ return Buffer.concat([
891
+ output.buf.slice(0, output.pos),
892
+ rans_out.buf.slice(rans_out.pos, rans_out.length),
893
+ ], output.pos + rans_out.length - rans_out.pos);
894
+ }
895
+ module.exports = { decode, encode };
896
+ //# sourceMappingURL=rans4x16.js.map