@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.
- package/dist/cram-bundle.js +1 -1
- package/dist/cramFile/codecs/byteArrayStop.d.ts +2 -2
- package/dist/cramFile/file.js +8 -10
- package/dist/cramFile/file.js.map +1 -1
- package/dist/cramFile/util.js.map +1 -1
- package/dist/htscodecs/arith_gen.d.ts +26 -0
- package/dist/htscodecs/arith_gen.js +558 -0
- package/dist/htscodecs/arith_gen.js.map +1 -0
- package/dist/htscodecs/arith_sh.d.ts +16 -0
- package/dist/htscodecs/arith_sh.js +128 -0
- package/dist/htscodecs/arith_sh.js.map +1 -0
- package/dist/htscodecs/byte_model.d.ts +11 -0
- package/dist/htscodecs/byte_model.js +113 -0
- package/dist/htscodecs/byte_model.js.map +1 -0
- package/dist/htscodecs/fqzcomp.d.ts +2 -0
- package/dist/htscodecs/fqzcomp.js +744 -0
- package/dist/htscodecs/fqzcomp.js.map +1 -0
- package/dist/htscodecs/index.d.ts +5 -0
- package/dist/htscodecs/index.js +70 -0
- package/dist/htscodecs/index.js.map +1 -0
- package/dist/htscodecs/iostream.d.ts +26 -0
- package/dist/htscodecs/iostream.js +242 -0
- package/dist/htscodecs/iostream.js.map +1 -0
- package/dist/htscodecs/main_arith_gen.d.ts +1 -0
- package/dist/htscodecs/main_arith_gen.js +86 -0
- package/dist/htscodecs/main_arith_gen.js.map +1 -0
- package/dist/htscodecs/main_fqzcomp.d.ts +1 -0
- package/dist/htscodecs/main_fqzcomp.js +112 -0
- package/dist/htscodecs/main_fqzcomp.js.map +1 -0
- package/dist/htscodecs/main_rans.d.ts +1 -0
- package/dist/htscodecs/main_rans.js +83 -0
- package/dist/htscodecs/main_rans.js.map +1 -0
- package/dist/htscodecs/main_rans4x16.d.ts +1 -0
- package/dist/htscodecs/main_rans4x16.js +82 -0
- package/dist/htscodecs/main_rans4x16.js.map +1 -0
- package/dist/htscodecs/main_tok3.d.ts +1 -0
- package/dist/htscodecs/main_tok3.js +84 -0
- package/dist/htscodecs/main_tok3.js.map +1 -0
- package/dist/htscodecs/rans.d.ts +2 -0
- package/dist/htscodecs/rans.js +480 -0
- package/dist/htscodecs/rans.js.map +1 -0
- package/dist/htscodecs/rans4x16.d.ts +2 -0
- package/dist/htscodecs/rans4x16.js +896 -0
- package/dist/htscodecs/rans4x16.js.map +1 -0
- package/dist/htscodecs/tok3.d.ts +2 -0
- package/dist/htscodecs/tok3.js +347 -0
- package/dist/htscodecs/tok3.js.map +1 -0
- package/esm/cramFile/codecs/byteArrayStop.d.ts +2 -2
- package/esm/cramFile/file.js +8 -10
- package/esm/cramFile/file.js.map +1 -1
- package/esm/cramFile/util.js.map +1 -1
- package/esm/htscodecs/arith_gen.d.ts +26 -0
- package/esm/htscodecs/arith_gen.js +558 -0
- package/esm/htscodecs/arith_gen.js.map +1 -0
- package/esm/htscodecs/arith_sh.d.ts +16 -0
- package/esm/htscodecs/arith_sh.js +128 -0
- package/esm/htscodecs/arith_sh.js.map +1 -0
- package/esm/htscodecs/byte_model.d.ts +11 -0
- package/esm/htscodecs/byte_model.js +113 -0
- package/esm/htscodecs/byte_model.js.map +1 -0
- package/esm/htscodecs/fqzcomp.d.ts +2 -0
- package/esm/htscodecs/fqzcomp.js +744 -0
- package/esm/htscodecs/fqzcomp.js.map +1 -0
- package/esm/htscodecs/index.d.ts +5 -0
- package/esm/htscodecs/index.js +70 -0
- package/esm/htscodecs/index.js.map +1 -0
- package/esm/htscodecs/iostream.d.ts +26 -0
- package/esm/htscodecs/iostream.js +242 -0
- package/esm/htscodecs/iostream.js.map +1 -0
- package/esm/htscodecs/main_arith_gen.d.ts +1 -0
- package/esm/htscodecs/main_arith_gen.js +86 -0
- package/esm/htscodecs/main_arith_gen.js.map +1 -0
- package/esm/htscodecs/main_fqzcomp.d.ts +1 -0
- package/esm/htscodecs/main_fqzcomp.js +112 -0
- package/esm/htscodecs/main_fqzcomp.js.map +1 -0
- package/esm/htscodecs/main_rans.d.ts +1 -0
- package/esm/htscodecs/main_rans.js +83 -0
- package/esm/htscodecs/main_rans.js.map +1 -0
- package/esm/htscodecs/main_rans4x16.d.ts +1 -0
- package/esm/htscodecs/main_rans4x16.js +82 -0
- package/esm/htscodecs/main_rans4x16.js.map +1 -0
- package/esm/htscodecs/main_tok3.d.ts +1 -0
- package/esm/htscodecs/main_tok3.js +84 -0
- package/esm/htscodecs/main_tok3.js.map +1 -0
- package/esm/htscodecs/rans.d.ts +2 -0
- package/esm/htscodecs/rans.js +480 -0
- package/esm/htscodecs/rans.js.map +1 -0
- package/esm/htscodecs/rans4x16.d.ts +2 -0
- package/esm/htscodecs/rans4x16.js +896 -0
- package/esm/htscodecs/rans4x16.js.map +1 -0
- package/esm/htscodecs/tok3.d.ts +2 -0
- package/esm/htscodecs/tok3.js +347 -0
- package/esm/htscodecs/tok3.js.map +1 -0
- package/package.json +1 -2
- package/src/cramFile/file.ts +8 -10
- package/src/cramFile/util.ts +0 -1
- package/src/htscodecs/Makefile +142 -0
- package/src/htscodecs/README.md +64 -0
- package/src/htscodecs/arith_gen.js +607 -0
- package/src/htscodecs/arith_sh.js +138 -0
- package/src/htscodecs/byte_model.js +126 -0
- package/src/htscodecs/fqzcomp.js +834 -0
- package/src/htscodecs/index.js +79 -0
- package/src/htscodecs/iostream.js +256 -0
- package/src/htscodecs/main_arith_gen.js +96 -0
- package/src/htscodecs/main_fqzcomp.js +113 -0
- package/src/htscodecs/main_rans.js +88 -0
- package/src/htscodecs/main_rans4x16.js +87 -0
- package/src/htscodecs/main_tok3.js +86 -0
- package/src/htscodecs/rans.js +545 -0
- package/src/htscodecs/rans4x16.js +1003 -0
- package/src/htscodecs/tok3.js +396 -0
- package/src/typings/htscodecs.d.ts +0 -6
|
@@ -0,0 +1,607 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2019,2020 Genome Research Ltd.
|
|
3
|
+
* Author(s): James Bonfield
|
|
4
|
+
*
|
|
5
|
+
* Redistribution and use in source and binary forms, with or without
|
|
6
|
+
* modification, are permitted provided that the following conditions are met:
|
|
7
|
+
*
|
|
8
|
+
* 1. Redistributions of source code must retain the above copyright notice,
|
|
9
|
+
* this list of conditions and the following disclaimer.
|
|
10
|
+
*
|
|
11
|
+
* 2. Redistributions in binary form must reproduce the above
|
|
12
|
+
* copyright notice, this list of conditions and the following
|
|
13
|
+
* disclaimer in the documentation and/or other materials provided
|
|
14
|
+
* with the distribution.
|
|
15
|
+
*
|
|
16
|
+
* 3. Neither the names Genome Research Ltd and Wellcome Trust Sanger
|
|
17
|
+
* Institute nor the names of its contributors may be used to endorse
|
|
18
|
+
* or promote products derived from this software without specific
|
|
19
|
+
* prior written permission.
|
|
20
|
+
*
|
|
21
|
+
* THIS SOFTWARE IS PROVIDED BY GENOME RESEARCH LTD AND CONTRIBUTORS "AS
|
|
22
|
+
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
|
23
|
+
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
|
24
|
+
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GENOME RESEARCH
|
|
25
|
+
* LTD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
26
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
27
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
28
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
29
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
30
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
31
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
const RangeCoder = require('./arith_sh')
|
|
35
|
+
const IOStream = require('./iostream')
|
|
36
|
+
const ByteModel = require('./byte_model')
|
|
37
|
+
const bzip2 = require('bzip2')
|
|
38
|
+
|
|
39
|
+
const ARITH_ORDER = 1
|
|
40
|
+
const ARITH_EXT = 4
|
|
41
|
+
const ARITH_STRIPE = 8
|
|
42
|
+
const ARITH_NOSIZE = 16
|
|
43
|
+
const ARITH_CAT = 32
|
|
44
|
+
const ARITH_RLE = 64
|
|
45
|
+
const ARITH_PACK = 128
|
|
46
|
+
|
|
47
|
+
module.exports = class RangeCoderGen {
|
|
48
|
+
decode(src) {
|
|
49
|
+
this.stream = new IOStream(src)
|
|
50
|
+
return this.decodeStream(this.stream)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
decodeStream(stream, n_out = 0) {
|
|
54
|
+
var flags = this.stream.ReadByte()
|
|
55
|
+
if (!(flags & ARITH_NOSIZE)) n_out = this.stream.ReadUint7()
|
|
56
|
+
var e_len = n_out
|
|
57
|
+
|
|
58
|
+
var order = flags & ARITH_ORDER
|
|
59
|
+
|
|
60
|
+
// 4-way recursion
|
|
61
|
+
if (flags & ARITH_STRIPE) return this.decodeStripe(this.stream, n_out)
|
|
62
|
+
|
|
63
|
+
// Meta data
|
|
64
|
+
if (flags & ARITH_PACK) {
|
|
65
|
+
var P
|
|
66
|
+
;[P, e_len] = this.decodePackMeta(this.stream)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// NOP, useful for tiny blocks
|
|
70
|
+
if (flags & ARITH_CAT) var data = this.decodeCat(this.stream, e_len)
|
|
71
|
+
// Entropy decode
|
|
72
|
+
else if (flags & ARITH_EXT) {
|
|
73
|
+
var data = this.decodeExt(this.stream, e_len)
|
|
74
|
+
} else if (flags & ARITH_RLE) {
|
|
75
|
+
var data = order
|
|
76
|
+
? this.decodeRLE1(this.stream, e_len)
|
|
77
|
+
: this.decodeRLE0(this.stream, e_len)
|
|
78
|
+
} else {
|
|
79
|
+
var data = order
|
|
80
|
+
? this.decode1(this.stream, e_len)
|
|
81
|
+
: this.decode0(this.stream, e_len)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Transforms
|
|
85
|
+
if (flags & ARITH_PACK) data = this.decodePack(data, P, n_out)
|
|
86
|
+
|
|
87
|
+
return data
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
encode(src, flags) {
|
|
91
|
+
this.stream = new IOStream('', 0, src.length * 1.1 + 100) // guestimate worst case!
|
|
92
|
+
|
|
93
|
+
this.stream.WriteByte(flags)
|
|
94
|
+
if (!(flags & ARITH_NOSIZE)) this.stream.WriteUint7(src.length)
|
|
95
|
+
|
|
96
|
+
if (flags & ARITH_STRIPE)
|
|
97
|
+
return Buffer.concat([
|
|
98
|
+
this.stream.buf.slice(0, this.stream.pos),
|
|
99
|
+
this.encodeStripe(this.stream, src, flags >> 8),
|
|
100
|
+
])
|
|
101
|
+
|
|
102
|
+
var order = flags & ARITH_ORDER
|
|
103
|
+
var e_len = src.length
|
|
104
|
+
|
|
105
|
+
// step 1: Encode meta-data
|
|
106
|
+
var pack_meta
|
|
107
|
+
if (flags & ARITH_PACK) [pack_meta, src, e_len] = this.encodePack(src)
|
|
108
|
+
|
|
109
|
+
// step 2: Write any meta data
|
|
110
|
+
if (flags & ARITH_PACK) this.stream.WriteStream(pack_meta)
|
|
111
|
+
|
|
112
|
+
// step 3: arith encoding below
|
|
113
|
+
if (flags & ARITH_RLE) {
|
|
114
|
+
return order
|
|
115
|
+
? this.encodeRLE1(src, e_len, this.stream)
|
|
116
|
+
: this.encodeRLE0(src, e_len, this.stream)
|
|
117
|
+
} else {
|
|
118
|
+
return order
|
|
119
|
+
? this.encode1(src, e_len, this.stream)
|
|
120
|
+
: this.encode0(src, e_len, this.stream)
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
//----------------------------------------------------------------------
|
|
125
|
+
// Order-0 codec
|
|
126
|
+
decode0(stream, n_out) {
|
|
127
|
+
var output = new Buffer.allocUnsafe(n_out)
|
|
128
|
+
|
|
129
|
+
var max_sym = stream.ReadByte()
|
|
130
|
+
if (max_sym == 0) max_sym = 256
|
|
131
|
+
|
|
132
|
+
var byte_model = new ByteModel(max_sym)
|
|
133
|
+
|
|
134
|
+
var rc = new RangeCoder(stream)
|
|
135
|
+
rc.RangeStartDecode(stream)
|
|
136
|
+
|
|
137
|
+
for (var i = 0; i < n_out; i++)
|
|
138
|
+
output[i] = byte_model.ModelDecode(stream, rc)
|
|
139
|
+
|
|
140
|
+
return output
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
encode0(src, n_in, out) {
|
|
144
|
+
// Count the maximum symbol present
|
|
145
|
+
var max_sym = 0
|
|
146
|
+
for (var i = 0; i < n_in; i++) if (max_sym < src[i]) max_sym = src[i]
|
|
147
|
+
max_sym++ // FIXME not what spec states!?
|
|
148
|
+
|
|
149
|
+
var byte_model = new ByteModel(max_sym)
|
|
150
|
+
out.WriteByte(max_sym)
|
|
151
|
+
var rc = new RangeCoder(out)
|
|
152
|
+
|
|
153
|
+
for (var i = 0; i < n_in; i++) byte_model.ModelEncode(out, rc, src[i])
|
|
154
|
+
rc.RangeFinishEncode(out)
|
|
155
|
+
|
|
156
|
+
return out.buf.slice(0, out.pos)
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
//----------------------------------------------------------------------
|
|
160
|
+
// Order-1 codec
|
|
161
|
+
|
|
162
|
+
decode1(stream, n_out) {
|
|
163
|
+
var output = new Buffer.allocUnsafe(n_out)
|
|
164
|
+
|
|
165
|
+
var max_sym = stream.ReadByte()
|
|
166
|
+
if (max_sym == 0) max_sym = 256
|
|
167
|
+
|
|
168
|
+
var byte_model = new Array(max_sym)
|
|
169
|
+
for (var i = 0; i < max_sym; i++) byte_model[i] = new ByteModel(max_sym)
|
|
170
|
+
|
|
171
|
+
var rc = new RangeCoder(stream)
|
|
172
|
+
rc.RangeStartDecode(stream)
|
|
173
|
+
|
|
174
|
+
var last = 0
|
|
175
|
+
for (var i = 0; i < n_out; i++) {
|
|
176
|
+
output[i] = byte_model[last].ModelDecode(stream, rc)
|
|
177
|
+
last = output[i]
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return output
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
encode1(src, n_in, out) {
|
|
184
|
+
// Count the maximum symbol present
|
|
185
|
+
var max_sym = 0
|
|
186
|
+
for (var i = 0; i < n_in; i++) if (max_sym < src[i]) max_sym = src[i]
|
|
187
|
+
max_sym++ // FIXME not what spec states!
|
|
188
|
+
|
|
189
|
+
var byte_model = new Array(max_sym)
|
|
190
|
+
for (var i = 0; i < max_sym; i++) byte_model[i] = new ByteModel(max_sym)
|
|
191
|
+
out.WriteByte(max_sym)
|
|
192
|
+
var rc = new RangeCoder(out)
|
|
193
|
+
|
|
194
|
+
var last = 0
|
|
195
|
+
for (var i = 0; i < n_in; i++) {
|
|
196
|
+
byte_model[last].ModelEncode(out, rc, src[i])
|
|
197
|
+
last = src[i]
|
|
198
|
+
}
|
|
199
|
+
rc.RangeFinishEncode(out)
|
|
200
|
+
|
|
201
|
+
return out.buf.slice(0, out.pos)
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
//----------------------------------------------------------------------
|
|
205
|
+
// External codec
|
|
206
|
+
decodeExt(stream, n_out) {
|
|
207
|
+
// Bzip2 only for now
|
|
208
|
+
var output = new Buffer.allocUnsafe(n_out)
|
|
209
|
+
var bits = bzip2.array(stream.buf.slice(stream.pos))
|
|
210
|
+
var size = bzip2.header(bits)
|
|
211
|
+
var j = 0
|
|
212
|
+
do {
|
|
213
|
+
var chunk = bzip2.decompress(bits, size)
|
|
214
|
+
if (chunk != -1) {
|
|
215
|
+
Buffer.from(chunk).copy(output, j)
|
|
216
|
+
j += chunk.length
|
|
217
|
+
size -= chunk.length
|
|
218
|
+
}
|
|
219
|
+
} while (chunk != -1)
|
|
220
|
+
|
|
221
|
+
return output
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
encodeExt(stream, n_out) {
|
|
225
|
+
// We cannot compress using Bzip2 now as it's
|
|
226
|
+
// absent from bzip2.js, but consider using
|
|
227
|
+
// https://github.com/cscott/compressjs
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
//----------------------------------------------------------------------
|
|
231
|
+
// Order-0 RLE codec
|
|
232
|
+
decodeRLE0(stream, n_out) {
|
|
233
|
+
var output = new Buffer.allocUnsafe(n_out)
|
|
234
|
+
|
|
235
|
+
var max_sym = stream.ReadByte()
|
|
236
|
+
if (max_sym == 0) max_sym = 256
|
|
237
|
+
|
|
238
|
+
var model_lit = new ByteModel(max_sym)
|
|
239
|
+
var model_run = new Array(258)
|
|
240
|
+
for (var i = 0; i <= 257; i++) model_run[i] = new ByteModel(4)
|
|
241
|
+
|
|
242
|
+
var rc = new RangeCoder(stream)
|
|
243
|
+
rc.RangeStartDecode(stream)
|
|
244
|
+
|
|
245
|
+
var i = 0
|
|
246
|
+
while (i < n_out) {
|
|
247
|
+
output[i] = model_lit.ModelDecode(stream, rc)
|
|
248
|
+
var part = model_run[output[i]].ModelDecode(stream, rc)
|
|
249
|
+
var run = part
|
|
250
|
+
var rctx = 256
|
|
251
|
+
while (part == 3) {
|
|
252
|
+
part = model_run[rctx].ModelDecode(stream, rc)
|
|
253
|
+
rctx = 257
|
|
254
|
+
run += part
|
|
255
|
+
}
|
|
256
|
+
for (var j = 1; j <= run; j++) output[i + j] = output[i]
|
|
257
|
+
i += run + 1
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
return output
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
encodeRLE0(src, n_in, out) {
|
|
264
|
+
// Count the maximum symbol present
|
|
265
|
+
var max_sym = 0
|
|
266
|
+
for (var i = 0; i < n_in; i++) if (max_sym < src[i]) max_sym = src[i]
|
|
267
|
+
max_sym++ // FIXME not what spec states!
|
|
268
|
+
|
|
269
|
+
var model_lit = new ByteModel(max_sym)
|
|
270
|
+
var model_run = new Array(258)
|
|
271
|
+
for (var i = 0; i <= 257; i++) model_run[i] = new ByteModel(4)
|
|
272
|
+
|
|
273
|
+
out.WriteByte(max_sym)
|
|
274
|
+
var rc = new RangeCoder(out)
|
|
275
|
+
|
|
276
|
+
var i = 0
|
|
277
|
+
while (i < n_in) {
|
|
278
|
+
model_lit.ModelEncode(out, rc, src[i])
|
|
279
|
+
var run = 1
|
|
280
|
+
while (i + run < n_in && src[i + run] == src[i]) run++
|
|
281
|
+
run--
|
|
282
|
+
|
|
283
|
+
var rctx = src[i]
|
|
284
|
+
var last = src[i]
|
|
285
|
+
i += run + 1
|
|
286
|
+
|
|
287
|
+
var part = run >= 3 ? 3 : run
|
|
288
|
+
model_run[rctx].ModelEncode(out, rc, part)
|
|
289
|
+
run -= part
|
|
290
|
+
rctx = 256
|
|
291
|
+
while (part == 3) {
|
|
292
|
+
part = run >= 3 ? 3 : run
|
|
293
|
+
model_run[rctx].ModelEncode(out, rc, part)
|
|
294
|
+
rctx = 257
|
|
295
|
+
run -= part
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
rc.RangeFinishEncode(out)
|
|
299
|
+
|
|
300
|
+
return out.buf.slice(0, out.pos)
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
//----------------------------------------------------------------------
|
|
304
|
+
// Order-1 RLE codec
|
|
305
|
+
|
|
306
|
+
decodeRLE1(stream, n_out) {
|
|
307
|
+
var output = new Buffer.allocUnsafe(n_out)
|
|
308
|
+
|
|
309
|
+
var max_sym = stream.ReadByte()
|
|
310
|
+
if (max_sym == 0) max_sym = 256
|
|
311
|
+
|
|
312
|
+
var model_lit = new Array(max_sym)
|
|
313
|
+
for (var i = 0; i < max_sym; i++) model_lit[i] = new ByteModel(max_sym)
|
|
314
|
+
|
|
315
|
+
var model_run = new Array(258)
|
|
316
|
+
for (var i = 0; i <= 257; i++) model_run[i] = new ByteModel(4)
|
|
317
|
+
|
|
318
|
+
var rc = new RangeCoder(stream)
|
|
319
|
+
rc.RangeStartDecode(stream)
|
|
320
|
+
|
|
321
|
+
var last = 0
|
|
322
|
+
var i = 0
|
|
323
|
+
while (i < n_out) {
|
|
324
|
+
output[i] = model_lit[last].ModelDecode(stream, rc)
|
|
325
|
+
last = output[i]
|
|
326
|
+
var part = model_run[output[i]].ModelDecode(stream, rc)
|
|
327
|
+
var run = part
|
|
328
|
+
var rctx = 256
|
|
329
|
+
while (part == 3) {
|
|
330
|
+
part = model_run[rctx].ModelDecode(stream, rc)
|
|
331
|
+
rctx = 257
|
|
332
|
+
run += part
|
|
333
|
+
}
|
|
334
|
+
for (var j = 1; j <= run; j++) output[i + j] = output[i]
|
|
335
|
+
i += run + 1
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
return output
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
encodeRLE1(src, n_in, out) {
|
|
342
|
+
// Count the maximum symbol present
|
|
343
|
+
var max_sym = 0
|
|
344
|
+
for (var i = 0; i < n_in; i++) if (max_sym < src[i]) max_sym = src[i]
|
|
345
|
+
max_sym++ // FIXME not what spec states!
|
|
346
|
+
|
|
347
|
+
var model_lit = new Array(max_sym)
|
|
348
|
+
for (var i = 0; i < max_sym; i++) model_lit[i] = new ByteModel(max_sym)
|
|
349
|
+
var model_run = new Array(258)
|
|
350
|
+
for (var i = 0; i <= 257; i++) model_run[i] = new ByteModel(4)
|
|
351
|
+
|
|
352
|
+
out.WriteByte(max_sym)
|
|
353
|
+
var rc = new RangeCoder(out)
|
|
354
|
+
|
|
355
|
+
var i = 0
|
|
356
|
+
var last = 0
|
|
357
|
+
while (i < n_in) {
|
|
358
|
+
model_lit[last].ModelEncode(out, rc, src[i])
|
|
359
|
+
var run = 1
|
|
360
|
+
while (i + run < n_in && src[i + run] == src[i]) run++
|
|
361
|
+
run--
|
|
362
|
+
|
|
363
|
+
var rctx = src[i]
|
|
364
|
+
last = src[i]
|
|
365
|
+
i += run + 1
|
|
366
|
+
|
|
367
|
+
var part = run >= 3 ? 3 : run
|
|
368
|
+
model_run[rctx].ModelEncode(out, rc, part)
|
|
369
|
+
run -= part
|
|
370
|
+
rctx = 256
|
|
371
|
+
while (part == 3) {
|
|
372
|
+
part = run >= 3 ? 3 : run
|
|
373
|
+
model_run[rctx].ModelEncode(out, rc, part)
|
|
374
|
+
rctx = 257
|
|
375
|
+
run -= part
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
rc.RangeFinishEncode(out)
|
|
379
|
+
|
|
380
|
+
return out.buf.slice(0, out.pos)
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
//----------------------------------------------------------------------
|
|
384
|
+
// Pack method
|
|
385
|
+
decodePackMeta(stream) {
|
|
386
|
+
this.nsym = stream.ReadByte()
|
|
387
|
+
|
|
388
|
+
var M = new Array(this.nsym)
|
|
389
|
+
for (var i = 0; i < this.nsym; i++) M[i] = stream.ReadByte()
|
|
390
|
+
|
|
391
|
+
var e_len = stream.ReadUint7() // Could be derived data from nsym and n_out
|
|
392
|
+
|
|
393
|
+
return [M, e_len]
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
decodePack(data, M, len) {
|
|
397
|
+
var out = new Buffer.allocUnsafe(len)
|
|
398
|
+
|
|
399
|
+
if (this.nsym <= 1) {
|
|
400
|
+
// Constant value
|
|
401
|
+
for (var i = 0; i < len; i++) out[i] = M[0]
|
|
402
|
+
} else if (this.nsym <= 2) {
|
|
403
|
+
// 1 bit per value
|
|
404
|
+
for (var i = 0, j = 0; i < len; i++) {
|
|
405
|
+
if (i % 8 == 0) var v = data[j++]
|
|
406
|
+
out[i] = M[v & 1]
|
|
407
|
+
v >>= 1
|
|
408
|
+
}
|
|
409
|
+
} else if (this.nsym <= 4) {
|
|
410
|
+
// 2 bits per value
|
|
411
|
+
for (var i = 0, j = 0; i < len; i++) {
|
|
412
|
+
if (i % 4 == 0) var v = data[j++]
|
|
413
|
+
out[i] = M[v & 3]
|
|
414
|
+
v >>= 2
|
|
415
|
+
}
|
|
416
|
+
} else if (this.nsym <= 16) {
|
|
417
|
+
// 4 bits per value
|
|
418
|
+
for (var i = 0, j = 0; i < len; i++) {
|
|
419
|
+
if (i % 2 == 0) var v = data[j++]
|
|
420
|
+
out[i] = M[v & 15]
|
|
421
|
+
v >>= 4
|
|
422
|
+
}
|
|
423
|
+
} else {
|
|
424
|
+
// 8 bits per value: NOP
|
|
425
|
+
return data
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
return out
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
// Compute M array and return meta-data stream
|
|
432
|
+
packMeta(src) {
|
|
433
|
+
var stream = new IOStream('', 0, 1024)
|
|
434
|
+
|
|
435
|
+
// Count symbols
|
|
436
|
+
var M = new Array(256)
|
|
437
|
+
for (var i = 0; i < src.length; i++) M[src[i]] = 1
|
|
438
|
+
|
|
439
|
+
// Write Map
|
|
440
|
+
for (var nsym = 0, i = 0; i < 256; i++) if (M[i]) M[i] = ++nsym // map to 1..N
|
|
441
|
+
stream.WriteByte(nsym)
|
|
442
|
+
|
|
443
|
+
// FIXME: add check for nsym > 16?
|
|
444
|
+
// Or just accept it as an inefficient waste of time.
|
|
445
|
+
for (var i = 0; i < 256; i++) {
|
|
446
|
+
if (M[i]) {
|
|
447
|
+
stream.WriteByte(i) // adjust to 0..N-1
|
|
448
|
+
M[i]--
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
return [stream, M, nsym]
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
encodePack(data) {
|
|
456
|
+
var meta, M, nsym
|
|
457
|
+
;[meta, M, nsym] = this.packMeta(data)
|
|
458
|
+
|
|
459
|
+
var len = data.length
|
|
460
|
+
var i = 0
|
|
461
|
+
if (nsym <= 1) {
|
|
462
|
+
// Constant values
|
|
463
|
+
meta.WriteUint7(0)
|
|
464
|
+
return [meta, new Buffer.allocUnsafe(0), 0]
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
if (nsym <= 2) {
|
|
468
|
+
// 1 bit per value
|
|
469
|
+
var out = new Buffer.allocUnsafe(Math.floor((len + 7) / 8))
|
|
470
|
+
for (var i = 0, j = 0; i < (len & ~7); i += 8, j++)
|
|
471
|
+
out[j] =
|
|
472
|
+
(M[data[i + 0]] << 0) +
|
|
473
|
+
(M[data[i + 1]] << 1) +
|
|
474
|
+
(M[data[i + 2]] << 2) +
|
|
475
|
+
(M[data[i + 3]] << 3) +
|
|
476
|
+
(M[data[i + 4]] << 4) +
|
|
477
|
+
(M[data[i + 5]] << 5) +
|
|
478
|
+
(M[data[i + 6]] << 6) +
|
|
479
|
+
(M[data[i + 7]] << 7)
|
|
480
|
+
if (i < len) {
|
|
481
|
+
out[j] = 0
|
|
482
|
+
var v = 0
|
|
483
|
+
while (i < len) {
|
|
484
|
+
out[j] |= M[data[i++]] << v
|
|
485
|
+
v++
|
|
486
|
+
}
|
|
487
|
+
j++
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
meta.WriteUint7(j)
|
|
491
|
+
return [meta, out, out.length]
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
if (nsym <= 4) {
|
|
495
|
+
// 2 bits per value
|
|
496
|
+
var out = new Buffer.allocUnsafe(Math.floor((len + 3) / 4))
|
|
497
|
+
for (var i = 0, j = 0; i < (len & ~3); i += 4, j++)
|
|
498
|
+
out[j] =
|
|
499
|
+
(M[data[i + 0]] << 0) +
|
|
500
|
+
(M[data[i + 1]] << 2) +
|
|
501
|
+
(M[data[i + 2]] << 4) +
|
|
502
|
+
(M[data[i + 3]] << 6)
|
|
503
|
+
|
|
504
|
+
if (i < len) {
|
|
505
|
+
out[j] = 0
|
|
506
|
+
var v = 0
|
|
507
|
+
while (i < len) {
|
|
508
|
+
out[j] |= M[data[i++]] << v
|
|
509
|
+
v += 2
|
|
510
|
+
}
|
|
511
|
+
j++
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
meta.WriteUint7(j)
|
|
515
|
+
return [meta, out, out.length]
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
if (nsym <= 16) {
|
|
519
|
+
// 4 bits per value
|
|
520
|
+
var out = new Buffer.allocUnsafe(Math.floor((len + 1) / 2))
|
|
521
|
+
for (var i = 0, j = 0; i < (len & ~1); i += 2, j++)
|
|
522
|
+
out[j] = (M[data[i + 0]] << 0) + (M[data[i + 1]] << 4)
|
|
523
|
+
if (i < len) out[j++] = M[data[i++]]
|
|
524
|
+
|
|
525
|
+
meta.WriteUint7(j)
|
|
526
|
+
return [meta, out, out.length]
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
// Otherwise an expensive NOP
|
|
530
|
+
meta.WriteUint7(data.length)
|
|
531
|
+
return [meta, data, data.length]
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
//----------------------------------------------------------------------
|
|
535
|
+
// STRIPE method
|
|
536
|
+
encodeStripe(hdr, src, N) {
|
|
537
|
+
if (N == 0) N = 4 // old default
|
|
538
|
+
|
|
539
|
+
// Split into multiple streams
|
|
540
|
+
var part = new Array(N)
|
|
541
|
+
var ulen = new Array(N)
|
|
542
|
+
for (var s = 0; s < N; s++) {
|
|
543
|
+
ulen[s] = Math.floor(src.length / N) + (src.length % N > s)
|
|
544
|
+
part[s] = new Array(ulen[s])
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
for (var x = 0, i = 0; i < src.length; i += N, x++) {
|
|
548
|
+
for (var j = 0; j < N; j++)
|
|
549
|
+
if (x < part[j].length) part[j][x] = src[i + j]
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
// Compress each part
|
|
553
|
+
var comp = new Array(N)
|
|
554
|
+
var total = 0
|
|
555
|
+
for (var s = 0; s < N; s++) {
|
|
556
|
+
// Example: try O0 and O1 and choose best
|
|
557
|
+
var comp0 = this.encode(part[s], 0)
|
|
558
|
+
var comp1 = this.encode(part[s], 1)
|
|
559
|
+
comp[s] = comp1.length < comp0.length ? comp1 : comp0
|
|
560
|
+
total += comp[s].length
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
// Serialise
|
|
564
|
+
var out = new IOStream('', 0, total + 5 * N + 1)
|
|
565
|
+
out.WriteByte(N)
|
|
566
|
+
for (var s = 0; s < N; s++) out.WriteUint7(comp[s].length)
|
|
567
|
+
|
|
568
|
+
for (var s = 0; s < N; s++) out.WriteData(comp[s], comp[s].length)
|
|
569
|
+
|
|
570
|
+
return out.buf.slice(0, out.buf.pos)
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
decodeStripe(stream, len) {
|
|
574
|
+
var N = stream.ReadByte()
|
|
575
|
+
|
|
576
|
+
// Retrieve lengths
|
|
577
|
+
var clen = new Array(N)
|
|
578
|
+
var ulen = new Array(N)
|
|
579
|
+
for (var j = 0; j < N; j++) clen[j] = stream.ReadUint7()
|
|
580
|
+
|
|
581
|
+
// Decode streams
|
|
582
|
+
var T = new Array(N)
|
|
583
|
+
for (var j = 0; j < N; j++) {
|
|
584
|
+
ulen[j] = Math.floor(len / N) + (len % N > j)
|
|
585
|
+
T[j] = this.decodeStream(stream, ulen[j])
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
// Transpose
|
|
589
|
+
var out = new Buffer.allocUnsafe(len)
|
|
590
|
+
for (var j = 0; j < N; j++) {
|
|
591
|
+
for (var i = 0; i < ulen[j]; i++) {
|
|
592
|
+
out[i * N + j] = T[j][i]
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
return out
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
//----------------------------------------------------------------------
|
|
600
|
+
// Cat method
|
|
601
|
+
decodeCat(stream, len) {
|
|
602
|
+
var out = new Buffer.allocUnsafe(len)
|
|
603
|
+
for (var i = 0; i < len; i++) out[i] = stream.ReadByte()
|
|
604
|
+
|
|
605
|
+
return out
|
|
606
|
+
}
|
|
607
|
+
}
|