@gmod/cram 3.0.7 → 4.0.0

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 (268) hide show
  1. package/dist/craiIndex.js +70 -87
  2. package/dist/craiIndex.js.map +1 -1
  3. package/dist/cram-bundle.js +1 -1
  4. package/dist/cramFile/codecs/_base.d.ts +1 -1
  5. package/dist/cramFile/codecs/beta.d.ts +2 -2
  6. package/dist/cramFile/codecs/beta.js +1 -1
  7. package/dist/cramFile/codecs/beta.js.map +1 -1
  8. package/dist/cramFile/codecs/byteArrayLength.d.ts +2 -2
  9. package/dist/cramFile/codecs/byteArrayStop.d.ts +4 -4
  10. package/dist/cramFile/codecs/byteArrayStop.js +1 -1
  11. package/dist/cramFile/codecs/byteArrayStop.js.map +1 -1
  12. package/dist/cramFile/codecs/external.d.ts +1 -1
  13. package/dist/cramFile/codecs/external.js +1 -1
  14. package/dist/cramFile/codecs/external.js.map +1 -1
  15. package/dist/cramFile/codecs/gamma.d.ts +1 -1
  16. package/dist/cramFile/codecs/gamma.js +1 -1
  17. package/dist/cramFile/codecs/gamma.js.map +1 -1
  18. package/dist/cramFile/codecs/getBits.d.ts +1 -1
  19. package/dist/cramFile/codecs/getBits.js.map +1 -1
  20. package/dist/cramFile/codecs/huffman.d.ts +1 -1
  21. package/dist/cramFile/codecs/huffman.js +1 -1
  22. package/dist/cramFile/codecs/huffman.js.map +1 -1
  23. package/dist/cramFile/codecs/index.d.ts +1 -1
  24. package/dist/cramFile/codecs/index.js +5 -5
  25. package/dist/cramFile/codecs/index.js.map +1 -1
  26. package/dist/cramFile/codecs/subexp.d.ts +2 -2
  27. package/dist/cramFile/codecs/subexp.js +1 -1
  28. package/dist/cramFile/codecs/subexp.js.map +1 -1
  29. package/dist/cramFile/container/compressionScheme.d.ts +2 -2
  30. package/dist/cramFile/container/compressionScheme.js +1 -1
  31. package/dist/cramFile/container/compressionScheme.js.map +1 -1
  32. package/dist/cramFile/container/index.d.ts +1 -2
  33. package/dist/cramFile/container/index.js +62 -79
  34. package/dist/cramFile/container/index.js.map +1 -1
  35. package/dist/cramFile/file.d.ts +9 -13
  36. package/dist/cramFile/file.js +218 -247
  37. package/dist/cramFile/file.js.map +1 -1
  38. package/dist/cramFile/record.js +2 -2
  39. package/dist/cramFile/record.js.map +1 -1
  40. package/dist/cramFile/sectionParsers.d.ts +16 -16
  41. package/dist/cramFile/sectionParsers.js +12 -9
  42. package/dist/cramFile/sectionParsers.js.map +1 -1
  43. package/dist/cramFile/slice/decodeRecord.d.ts +3 -3
  44. package/dist/cramFile/slice/decodeRecord.js +11 -11
  45. package/dist/cramFile/slice/decodeRecord.js.map +1 -1
  46. package/dist/cramFile/slice/index.d.ts +2 -2
  47. package/dist/cramFile/slice/index.js +241 -262
  48. package/dist/cramFile/slice/index.js.map +1 -1
  49. package/dist/cramFile/util.d.ts +4 -2
  50. package/dist/cramFile/util.js +29 -6
  51. package/dist/cramFile/util.js.map +1 -1
  52. package/dist/htscodecs/arith_gen.d.ts +9 -17
  53. package/dist/htscodecs/arith_gen.js +32 -272
  54. package/dist/htscodecs/arith_gen.js.map +1 -1
  55. package/dist/htscodecs/fqzcomp.d.ts +1 -2
  56. package/dist/htscodecs/fqzcomp.js +2 -421
  57. package/dist/htscodecs/fqzcomp.js.map +1 -1
  58. package/dist/htscodecs/index.d.ts +5 -5
  59. package/dist/htscodecs/index.js +10 -10
  60. package/dist/htscodecs/index.js.map +1 -1
  61. package/dist/htscodecs/iostream.d.ts +2 -1
  62. package/dist/htscodecs/iostream.js +3 -2
  63. package/dist/htscodecs/iostream.js.map +1 -1
  64. package/dist/htscodecs/rans.d.ts +1 -2
  65. package/dist/htscodecs/rans.js +3 -270
  66. package/dist/htscodecs/rans.js.map +1 -1
  67. package/dist/htscodecs/rans4x16.d.ts +0 -1
  68. package/dist/htscodecs/rans4x16.js +6 -497
  69. package/dist/htscodecs/rans4x16.js.map +1 -1
  70. package/dist/htscodecs/tok3.js +17 -1
  71. package/dist/htscodecs/tok3.js.map +1 -1
  72. package/dist/index.d.ts +1 -1
  73. package/dist/index.js +2 -2
  74. package/dist/index.js.map +1 -1
  75. package/dist/indexedCramFile.d.ts +4 -4
  76. package/dist/indexedCramFile.js +97 -108
  77. package/dist/indexedCramFile.js.map +1 -1
  78. package/dist/io/index.d.ts +2 -2
  79. package/dist/io/index.js +6 -6
  80. package/dist/io/index.js.map +1 -1
  81. package/dist/rans/constants.d.ts +1 -1
  82. package/dist/rans/constants.js +1 -1
  83. package/dist/rans/constants.js.map +1 -1
  84. package/dist/rans/d04.js.map +1 -1
  85. package/dist/rans/decoding.js.map +1 -1
  86. package/dist/rans/frequencies.js.map +1 -1
  87. package/dist/rans/index.js +5 -5
  88. package/dist/rans/index.js.map +1 -1
  89. package/dist/unzip.d.ts +1 -1
  90. package/dist/unzip.js +5 -3
  91. package/dist/unzip.js.map +1 -1
  92. package/esm/craiIndex.js +10 -12
  93. package/esm/craiIndex.js.map +1 -1
  94. package/esm/cramFile/codecs/_base.d.ts +1 -1
  95. package/esm/cramFile/codecs/beta.d.ts +2 -2
  96. package/esm/cramFile/codecs/beta.js +1 -1
  97. package/esm/cramFile/codecs/beta.js.map +1 -1
  98. package/esm/cramFile/codecs/byteArrayLength.d.ts +2 -2
  99. package/esm/cramFile/codecs/byteArrayStop.d.ts +4 -4
  100. package/esm/cramFile/codecs/byteArrayStop.js +1 -1
  101. package/esm/cramFile/codecs/byteArrayStop.js.map +1 -1
  102. package/esm/cramFile/codecs/external.d.ts +1 -1
  103. package/esm/cramFile/codecs/external.js +1 -1
  104. package/esm/cramFile/codecs/external.js.map +1 -1
  105. package/esm/cramFile/codecs/gamma.d.ts +1 -1
  106. package/esm/cramFile/codecs/gamma.js +1 -1
  107. package/esm/cramFile/codecs/gamma.js.map +1 -1
  108. package/esm/cramFile/codecs/getBits.d.ts +1 -1
  109. package/esm/cramFile/codecs/getBits.js.map +1 -1
  110. package/esm/cramFile/codecs/huffman.d.ts +1 -1
  111. package/esm/cramFile/codecs/huffman.js +1 -1
  112. package/esm/cramFile/codecs/huffman.js.map +1 -1
  113. package/esm/cramFile/codecs/index.d.ts +1 -1
  114. package/esm/cramFile/codecs/index.js +5 -5
  115. package/esm/cramFile/codecs/index.js.map +1 -1
  116. package/esm/cramFile/codecs/subexp.d.ts +2 -2
  117. package/esm/cramFile/codecs/subexp.js +1 -1
  118. package/esm/cramFile/codecs/subexp.js.map +1 -1
  119. package/esm/cramFile/container/compressionScheme.d.ts +2 -2
  120. package/esm/cramFile/container/compressionScheme.js +1 -1
  121. package/esm/cramFile/container/compressionScheme.js.map +1 -1
  122. package/esm/cramFile/container/index.d.ts +1 -2
  123. package/esm/cramFile/container/index.js +4 -7
  124. package/esm/cramFile/container/index.js.map +1 -1
  125. package/esm/cramFile/file.d.ts +9 -13
  126. package/esm/cramFile/file.js +47 -52
  127. package/esm/cramFile/file.js.map +1 -1
  128. package/esm/cramFile/record.js +2 -2
  129. package/esm/cramFile/record.js.map +1 -1
  130. package/esm/cramFile/sectionParsers.d.ts +16 -16
  131. package/esm/cramFile/sectionParsers.js +7 -7
  132. package/esm/cramFile/sectionParsers.js.map +1 -1
  133. package/esm/cramFile/slice/decodeRecord.d.ts +3 -3
  134. package/esm/cramFile/slice/decodeRecord.js +11 -11
  135. package/esm/cramFile/slice/decodeRecord.js.map +1 -1
  136. package/esm/cramFile/slice/index.d.ts +2 -2
  137. package/esm/cramFile/slice/index.js +7 -6
  138. package/esm/cramFile/slice/index.js.map +1 -1
  139. package/esm/cramFile/util.d.ts +4 -2
  140. package/esm/cramFile/util.js +19 -2
  141. package/esm/cramFile/util.js.map +1 -1
  142. package/esm/htscodecs/arith_gen.d.ts +9 -17
  143. package/esm/htscodecs/arith_gen.js +32 -272
  144. package/esm/htscodecs/arith_gen.js.map +1 -1
  145. package/esm/htscodecs/fqzcomp.d.ts +1 -2
  146. package/esm/htscodecs/fqzcomp.js +2 -421
  147. package/esm/htscodecs/fqzcomp.js.map +1 -1
  148. package/esm/htscodecs/index.d.ts +5 -5
  149. package/esm/htscodecs/index.js +10 -10
  150. package/esm/htscodecs/index.js.map +1 -1
  151. package/esm/htscodecs/iostream.d.ts +2 -1
  152. package/esm/htscodecs/iostream.js +3 -2
  153. package/esm/htscodecs/iostream.js.map +1 -1
  154. package/esm/htscodecs/rans.d.ts +1 -2
  155. package/esm/htscodecs/rans.js +3 -270
  156. package/esm/htscodecs/rans.js.map +1 -1
  157. package/esm/htscodecs/rans4x16.d.ts +0 -1
  158. package/esm/htscodecs/rans4x16.js +6 -497
  159. package/esm/htscodecs/rans4x16.js.map +1 -1
  160. package/esm/htscodecs/tok3.js +17 -1
  161. package/esm/htscodecs/tok3.js.map +1 -1
  162. package/esm/index.d.ts +1 -1
  163. package/esm/index.js +1 -1
  164. package/esm/index.js.map +1 -1
  165. package/esm/indexedCramFile.d.ts +4 -4
  166. package/esm/indexedCramFile.js +10 -10
  167. package/esm/indexedCramFile.js.map +1 -1
  168. package/esm/io/index.d.ts +2 -2
  169. package/esm/io/index.js +1 -1
  170. package/esm/io/index.js.map +1 -1
  171. package/esm/rans/constants.d.ts +1 -1
  172. package/esm/rans/constants.js +1 -1
  173. package/esm/rans/constants.js.map +1 -1
  174. package/esm/rans/d04.js.map +1 -1
  175. package/esm/rans/decoding.js.map +1 -1
  176. package/esm/rans/frequencies.js.map +1 -1
  177. package/esm/rans/index.js +5 -5
  178. package/esm/rans/index.js.map +1 -1
  179. package/esm/unzip.d.ts +1 -1
  180. package/esm/unzip.js +4 -1
  181. package/esm/unzip.js.map +1 -1
  182. package/package.json +7 -9
  183. package/src/craiIndex.ts +17 -16
  184. package/src/cramFile/codecs/_base.ts +1 -1
  185. package/src/cramFile/codecs/beta.ts +3 -3
  186. package/src/cramFile/codecs/byteArrayLength.ts +1 -1
  187. package/src/cramFile/codecs/byteArrayStop.ts +3 -4
  188. package/src/cramFile/codecs/external.ts +3 -3
  189. package/src/cramFile/codecs/gamma.ts +2 -2
  190. package/src/cramFile/codecs/getBits.ts +1 -1
  191. package/src/cramFile/codecs/huffman.ts +2 -3
  192. package/src/cramFile/codecs/index.ts +7 -8
  193. package/src/cramFile/codecs/subexp.ts +3 -3
  194. package/src/cramFile/container/compressionScheme.ts +3 -3
  195. package/src/cramFile/container/index.ts +7 -10
  196. package/src/cramFile/file.ts +71 -77
  197. package/src/cramFile/record.ts +3 -3
  198. package/src/cramFile/sectionParsers.ts +27 -22
  199. package/src/cramFile/slice/decodeRecord.ts +17 -17
  200. package/src/cramFile/slice/index.ts +8 -9
  201. package/src/cramFile/util.ts +24 -5
  202. package/src/htscodecs/arith_gen.js +33 -296
  203. package/src/htscodecs/fqzcomp.js +2 -476
  204. package/src/htscodecs/index.js +9 -11
  205. package/src/htscodecs/iostream.js +3 -2
  206. package/src/htscodecs/rans.js +3 -315
  207. package/src/htscodecs/rans4x16.js +6 -557
  208. package/src/htscodecs/tok3.js +18 -1
  209. package/src/index.ts +1 -1
  210. package/src/indexedCramFile.ts +6 -5
  211. package/src/io/index.ts +5 -4
  212. package/src/rans/constants.ts +1 -1
  213. package/src/rans/d04.ts +0 -1
  214. package/src/rans/decoding.ts +0 -1
  215. package/src/rans/frequencies.ts +0 -1
  216. package/src/rans/index.ts +5 -7
  217. package/src/unzip.ts +5 -1
  218. package/dist/cramFile/filehandle.d.ts +0 -1
  219. package/dist/cramFile/filehandle.js +0 -3
  220. package/dist/cramFile/filehandle.js.map +0 -1
  221. package/dist/htscodecs/main_arith_gen.d.ts +0 -1
  222. package/dist/htscodecs/main_arith_gen.js +0 -86
  223. package/dist/htscodecs/main_arith_gen.js.map +0 -1
  224. package/dist/htscodecs/main_fqzcomp.d.ts +0 -1
  225. package/dist/htscodecs/main_fqzcomp.js +0 -112
  226. package/dist/htscodecs/main_fqzcomp.js.map +0 -1
  227. package/dist/htscodecs/main_rans.d.ts +0 -1
  228. package/dist/htscodecs/main_rans.js +0 -83
  229. package/dist/htscodecs/main_rans.js.map +0 -1
  230. package/dist/htscodecs/main_rans4x16.d.ts +0 -1
  231. package/dist/htscodecs/main_rans4x16.js +0 -82
  232. package/dist/htscodecs/main_rans4x16.js.map +0 -1
  233. package/dist/htscodecs/main_tok3.d.ts +0 -1
  234. package/dist/htscodecs/main_tok3.js +0 -84
  235. package/dist/htscodecs/main_tok3.js.map +0 -1
  236. package/dist/unzip-pako.d.ts +0 -2
  237. package/dist/unzip-pako.js +0 -9
  238. package/dist/unzip-pako.js.map +0 -1
  239. package/esm/cramFile/filehandle.d.ts +0 -1
  240. package/esm/cramFile/filehandle.js +0 -2
  241. package/esm/cramFile/filehandle.js.map +0 -1
  242. package/esm/htscodecs/main_arith_gen.d.ts +0 -1
  243. package/esm/htscodecs/main_arith_gen.js +0 -86
  244. package/esm/htscodecs/main_arith_gen.js.map +0 -1
  245. package/esm/htscodecs/main_fqzcomp.d.ts +0 -1
  246. package/esm/htscodecs/main_fqzcomp.js +0 -112
  247. package/esm/htscodecs/main_fqzcomp.js.map +0 -1
  248. package/esm/htscodecs/main_rans.d.ts +0 -1
  249. package/esm/htscodecs/main_rans.js +0 -83
  250. package/esm/htscodecs/main_rans.js.map +0 -1
  251. package/esm/htscodecs/main_rans4x16.d.ts +0 -1
  252. package/esm/htscodecs/main_rans4x16.js +0 -82
  253. package/esm/htscodecs/main_rans4x16.js.map +0 -1
  254. package/esm/htscodecs/main_tok3.d.ts +0 -1
  255. package/esm/htscodecs/main_tok3.js +0 -84
  256. package/esm/htscodecs/main_tok3.js.map +0 -1
  257. package/esm/unzip-pako.d.ts +0 -2
  258. package/esm/unzip-pako.js +0 -6
  259. package/esm/unzip-pako.js.map +0 -1
  260. package/src/cramFile/filehandle.ts +0 -1
  261. package/src/htscodecs/Makefile +0 -142
  262. package/src/htscodecs/README.md +0 -64
  263. package/src/htscodecs/main_arith_gen.js +0 -96
  264. package/src/htscodecs/main_fqzcomp.js +0 -113
  265. package/src/htscodecs/main_rans.js +0 -88
  266. package/src/htscodecs/main_rans4x16.js +0 -87
  267. package/src/htscodecs/main_tok3.js +0 -86
  268. package/src/unzip-pako.ts +0 -6
@@ -277,7 +277,7 @@ function decode_fqz(src, q_lens) {
277
277
  // Create our entropy encoder and output buffers
278
278
  var rc = new RangeCoder(src)
279
279
  rc.RangeStartDecode(src)
280
- var output = new Buffer.allocUnsafe(n_out)
280
+ var output = new Uint8Array(n_out)
281
281
 
282
282
  // Internal FQZ state
283
283
  var state = {
@@ -357,478 +357,4 @@ function decode(src, q_lens) {
357
357
  return decode_fqz(stream, q_lens)
358
358
  }
359
359
 
360
- //----------------------------------------------------------------------
361
- // FQZComp encoder.
362
-
363
- function pick_fqz_params(src, q_lens, q_dirs, qhist) {
364
- // Find cardinality of q_dirs
365
- var qd_last = q_dirs[0]
366
- for (var i = 0; i < q_dirs.length; i++) if (q_dirs[i] != qd_last) break
367
- var qd_fixed = i == q_dirs.length ? 1 : 0
368
-
369
- // Scan input to find number of symbols and max symbol
370
- var nsym = 0
371
- var max_sym = 0
372
-
373
- // selector == 0: Assume one single input dataset
374
- for (var i = 0; i < 256; i++) qhist[0][i] = 0
375
-
376
- var rec = 0
377
- var len = 0
378
- for (var i = 0; i < src.length; i++) {
379
- if (len == 0) {
380
- len = q_lens[rec < q_lens.length - 1 ? rec++ : rec]
381
- }
382
- qhist[0][src[i]]++
383
- len--
384
- }
385
- for (var i = 0; i < 256; i++) {
386
- if (!qhist[0][i]) continue
387
- if (max_sym < i) max_sym = i
388
- nsym++
389
- }
390
-
391
- var qshift = 5
392
- var do_qmap = 0
393
- // Reduced symbol frequencies implies lower qshift and
394
- // a lookup table to go from qual to Q
395
- if (nsym <= 16) {
396
- do_qmap = 1 // based on qhist
397
- if (nsym <= 2) qshift = 1
398
- else if (nsym <= 4) qshift = 2
399
- else if (nsym <= 8) qshift = 3
400
- else qshift = 4
401
- }
402
-
403
- // // Two params and a 1-bit selector.
404
- // // This is 1% overhead vs two data sets compressed independently.
405
- // // It's 6.9% smaller than compressing both together with 1 param.
406
- // if (0) return [{
407
- // // q4
408
- // qbits: 8,
409
- // qshift: 2,
410
- // qloc: 7,
411
- //
412
- // pbits: 7,
413
- // pshift: 1,
414
- // ploc: 0,
415
- //
416
- // dbits: 0,
417
- // dshift: 0,
418
- // dloc: 0,
419
- //
420
- // sbits: 0,
421
- // sloc: 0,
422
- //
423
- // //sbits: 2,
424
- // //do_stab: 1,
425
- // sbits: 1,
426
- // do_stab: 0,
427
- // context: (0<<15),
428
- //
429
- // max_sym: 36,
430
- // nsym: 4,
431
- //
432
- // do_qmap: 1,
433
- // do_dedup: 0,
434
- // fixed_len: 1,
435
- // do_sel: 0,
436
- // do_rev: 0,
437
- // do_pos: 1,
438
- // do_delta: 0,
439
- // do_qtab: 0
440
- // }, {
441
- // //q40
442
- // qbits: 9,
443
- // qshift: 5,
444
- // qloc: 7,
445
- //
446
- // pbits: 7,
447
- // pshift: 0,
448
- // ploc: 0,
449
- //
450
- // dbits: 0,
451
- // dshift: 0,
452
- // dloc: 0,
453
- //
454
- // sbits: 0,
455
- // sloc: 0,
456
- //
457
- // //sbits: 2,
458
- // //do_stab: 1,
459
- // sbits: 1,
460
- // do_stab: 0,
461
- // context: (1<<15),
462
- //
463
- // max_sym: 44,
464
- // nsym: 45,
465
- //
466
- // do_qmap: 0,
467
- // do_dedup: 0,
468
- // fixed_len: 1,
469
- // do_sel: 0,
470
- // do_rev: 0,
471
- // do_pos: 1,
472
- // do_delta: 0,
473
- // do_qtab: 0
474
- // }]
475
-
476
- return [
477
- {
478
- qbits: 8 + (qshift > 4),
479
- qshift: qshift,
480
- qloc: 7,
481
-
482
- pbits: 7,
483
- pshift: q_lens[0] > 128 ? 1 : 0,
484
- ploc: 0,
485
-
486
- dbits: qshift > 4 ? 0 : 1,
487
- dshift: 3,
488
- dloc: 15,
489
-
490
- // NB: Also useful as a way of embedding sel and doing sel
491
- // specific contexts. Identical bar context. Eg 0<<15 or 1<<15.
492
- sbits: 0,
493
- sloc: 15,
494
- do_stab: 0,
495
- context: 0 << 15,
496
-
497
- max_sym: max_sym,
498
- nsym: nsym,
499
-
500
- do_qmap: do_qmap,
501
- do_dedup: 0,
502
- fixed_len: q_lens.length == 1 ? 1 : 0,
503
- do_sel: 0,
504
- do_rev: 0,
505
- do_pos: 1,
506
- do_delta: qshift <= 4 ? 1 : 0,
507
- do_qtab: 0,
508
-
509
- // Override above with some attempt at using selectors
510
- // when the q_dirs are specific and non-fixed.
511
- qbits: 8 + (qshift > 4) - (qd_fixed == 0),
512
- sbits: 1,
513
- sloc: 15 - (qshift <= 4), // read1 vs read2
514
- do_stab: 1,
515
- do_sel: 1,
516
-
517
- // // q4+dir: 7245769 with, 7353962 without. 1.5% saving
518
- // qbits: 6,
519
- // dbits: 2,
520
- // dshift: 2,
521
- // dloc: 13,
522
- // sbits: 1,
523
- // sloc: 15,
524
- // do_stab: 1,
525
- // do_sel: 1,
526
-
527
- // with 20 bits of context, q40 = 31741545
528
- // qbits 10, dbits 2, pbits 7, sbits 1
529
- },
530
- ]
531
- }
532
-
533
- function store_array(out, tab, size) {
534
- var i = 0 // index into tab
535
- var j = 0 // current value in tab[i]
536
-
537
- var tmp1 = new Array(size * 2)
538
- var sz1 = 0
539
-
540
- // First level of RLE. Replace all runs of 'j' values
541
- // with run-lengths, including zeros for missing values.
542
- // Eg 0 1 2 2 2 3 3 3 4 4 4 5 5 5 5 7 7
543
- // to 1 1 3 3 3 4 0 2
544
- while (i < size) {
545
- // Length of j^{th} element
546
- var i_start = i
547
- while (i < size && tab[i] == j) i++
548
- var run_len = i - i_start
549
-
550
- // Encode run length to tmp array
551
- do {
552
- var r = Math.min(255, run_len)
553
- tmp1[sz1++] = r
554
- run_len -= r
555
- } while (r == 255)
556
- j++
557
- }
558
-
559
- // Second round of RLE on our tmp array, using a different
560
- // RLE algorithm.
561
- // Eg 1 1 3 3 3 4 0 2
562
- // to 1 1 +0 3 3 +1 4 0 2
563
- var last = -1
564
- var tmp2 = new Array(size * 2)
565
- var sz2 = 0
566
- i = 0 // index into tmp1]
567
- // k is used size of tmp1[]
568
- while (i < sz1) {
569
- var curr = tmp1[i++]
570
- tmp2[sz2++] = curr
571
- if (curr == last) {
572
- var i_start = i
573
- while (i < sz1 && tmp1[i] == last && i - i_start < 255) i++
574
- tmp2[sz2++] = i - i_start
575
- } else {
576
- last = curr
577
- }
578
- }
579
-
580
- // Append 2nd RLE, tmp2, to out.
581
- out.WriteData(tmp2, sz2)
582
- }
583
-
584
- // q_lens is an array of quality lengths per record.
585
- // (If they're all the same, just set one value.)
586
- function encode_fqz_params(out, params, qhist, qtab, ptab, dtab, stab) {
587
- var dsqr = [
588
- 0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4,
589
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7,
590
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
591
- ]
592
-
593
- for (var i = 0; i < params.length; i++) stab[i] = i // 1 parameter set per selector value
594
- for (; i < 256; i++) stab[i] = params.length - 1
595
-
596
- // Store global meta-data
597
- out.WriteByte(5) // FQZ format number
598
- var gflags =
599
- (params.length > 1 ? GFLAG_MULTI_PARAM : 0) |
600
- (params[0].do_stab ? GFLAG_HAVE_STAB : 0)
601
- out.WriteByte(gflags)
602
-
603
- if (gflags & GFLAG_MULTI_PARAM) out.WriteByte(params.length) // Number of parameter blocks.
604
-
605
- if (gflags & GFLAG_HAVE_STAB) {
606
- var max_sel = 1 << params[0].sbits
607
- if (max_sel > 0) max_sel--
608
- out.WriteByte(max_sel)
609
- store_array(out, stab, 256)
610
- }
611
-
612
- // Store per-param meta-data
613
- for (var p = 0; p < params.length; p++) {
614
- out.WriteUint16(params[p].context)
615
- out.WriteByte(
616
- (params[p].do_qtab ? FLAG_QTAB : 0) | // FLAG
617
- (params[p].do_delta ? FLAG_DTAB : 0) |
618
- (params[p].do_pos ? FLAG_PTAB : 0) |
619
- (params[p].do_qmap ? FLAG_QMAP : 0) |
620
- (params[p].do_sel ? FLAG_SEL : 0) |
621
- (params[p].fixed_len ? FLAG_FLEN : 0) |
622
- (params[p].do_dedup ? FLAG_DEDUP : 0),
623
- )
624
- if (params[p].do_qmap) out.WriteByte(params[p].nsym)
625
- else out.WriteByte(params[p].max_sym)
626
- out.WriteByte((params[p].qbits << 4) | params[p].qshift)
627
- out.WriteByte((params[p].qloc << 4) | params[p].sloc)
628
- out.WriteByte((params[p].ploc << 4) | params[p].dloc)
629
-
630
- if (params[p].do_qmap) {
631
- params[p].max_sym = params[p].nsym
632
- var n = 0
633
- for (var i = 0; i < 256; i++) {
634
- if (qhist[p][i]) {
635
- out.WriteByte(i)
636
- qhist[p][i] = n++
637
- }
638
- }
639
- // Ensure we have all matched input params
640
- for (; n < params[p].nsym; n++) out.WriteByte(0)
641
- } else {
642
- //params[p].nsym = 255;
643
- for (var i = 0; i < 256; i++) qhist[p][i] = i // NOP
644
- }
645
-
646
- if (params[p].qbits > 0) {
647
- // // Eg map 0-44 to a smaller range, to improve context usage.
648
- // // Makes q40 test set go from 33596471 to 33450075 (-0.4%)
649
- // params[p].do_qtab = 1;
650
- // for (var j = i = 0; i < params[p].max_sym; i++) {
651
- // qtab[i]=j;
652
- // if ((i%3)!=0 | i >= 28) j++
653
- // console.log("qtab[",i,"]=",qtab[i]);
654
- // }
655
- // for (; i < 256; i++)
656
- // qtab[i] = qtab[params[p].max_sym-1]
657
-
658
- for (var i = 0; i < 256; i++) qtab[p][i] = i // NOP for now
659
-
660
- if (params[p].do_qtab) store_array(out, qtab[p], 256)
661
- }
662
-
663
- if (params[p].pbits > 0) {
664
- for (var i = 0; i < 1024; i++)
665
- ptab[p][i] = Math.min((1 << params[p].pbits) - 1, i >> params[p].pshift)
666
-
667
- store_array(out, ptab[p], 1024)
668
- }
669
-
670
- if (params[p].dbits > 0) {
671
- for (var i = 0; i < 256; i++)
672
- if (dsqr[i] > (1 << params[p].dbits) - 1)
673
- dsqr[i] = (1 << params[p].dbits) - 1
674
- for (var i = 0; i < 256; i++)
675
- dtab[p][i] = dsqr[Math.min(dsqr.length - 1, i >> params[p].dshift)]
676
-
677
- store_array(out, dtab[p], 256)
678
- }
679
- }
680
-
681
- return out
682
- }
683
-
684
- function encode_fqz(
685
- out,
686
- src,
687
- q_lens,
688
- q_dirs,
689
- params,
690
- qhist,
691
- qtab,
692
- ptab,
693
- dtab,
694
- stab,
695
- ) {
696
- //console.error("0:",params[0])
697
- //console.error("1:",params[1])
698
-
699
- var max_sel = 1 << params[0].sbits
700
- if (max_sel > 0) max_sel--
701
- var n_in = src.length
702
-
703
- // Create the models
704
- var max_sym = 0
705
- for (var p = 0; p < params.length; p++)
706
- if (max_sym < params[p].max_sym) max_sym = params[p].max_sym
707
-
708
- var model_qual = new Array(1 << 16)
709
- for (var i = 0; i < 1 << 16; i++) model_qual[i] = new ByteModel(max_sym + 1)
710
-
711
- var model_len = new Array(4)
712
- for (var i = 0; i < 4; i++) model_len[i] = new ByteModel(256)
713
-
714
- var model_rev = new ByteModel(2)
715
- var model_dup = new ByteModel(2)
716
- var model_sel = new ByteModel(max_sel + 1)
717
-
718
- // Note: our JavaScript encoder doesn't have a way for reversing
719
- // some quality strings, so we ignore do_rev for now.
720
- var rc = new RangeCoder(src)
721
-
722
- // The main encoding loop
723
- var p = 0 // remaining position along current record
724
- var i = 0 // index in src data
725
- var rec = 0
726
-
727
- while (i < n_in) {
728
- if (p == 0) {
729
- //var s = 0 // single non-mixed sample
730
- var s = q_dirs[rec]
731
- if (params[0].sbits > 0) {
732
- // FIXME: check All params[].do_stab / sbits must be identical
733
- //console.log("Ssel", s)
734
- model_sel.ModelEncode(out, rc, s)
735
- }
736
- var x = stab[s]
737
-
738
- // Reset contexts at the statr of each new record
739
- var len = q_lens[Math.min(q_lens.length - 1, rec++)]
740
- if (params[x].fixed_len) {
741
- if (params[x].fixed_len > 0) {
742
- // First length
743
- //console.log("Len", len)
744
- model_len[0].ModelEncode(out, rc, len & 0xff)
745
- model_len[1].ModelEncode(out, rc, (len >> 8) & 0xff)
746
- model_len[2].ModelEncode(out, rc, (len >> 16) & 0xff)
747
- model_len[3].ModelEncode(out, rc, (len >> 24) & 0xff)
748
- params[x].fixed_len = -1 // indicate we've stored it once
749
- }
750
- } else {
751
- //console.log("len", len)
752
- model_len[0].ModelEncode(out, rc, len & 0xff)
753
- model_len[1].ModelEncode(out, rc, (len >> 8) & 0xff)
754
- model_len[2].ModelEncode(out, rc, (len >> 16) & 0xff)
755
- model_len[3].ModelEncode(out, rc, (len >> 24) & 0xff)
756
- }
757
-
758
- if (params[x].do_dedup) process.exit(1) // FIXME
759
-
760
- p = len
761
- var delta = 0
762
- //var last = 0
763
- var last = params[x].context
764
- var qlast = 0
765
- var q1 = 0
766
- }
767
-
768
- // Encode current quality
769
- var q = src[i++]
770
- var Q = qhist[x][q]
771
- model_qual[last].ModelEncode(out, rc, Q)
772
- //console.log("Ctx",last,qhist[x][q])
773
-
774
- // Update contexts for next quality
775
- qlast = (qlast << params[x].qshift) + qtab[x][Q]
776
- last = params[x].context
777
- last += (qlast & ((1 << params[x].qbits) - 1)) << params[x].qloc
778
-
779
- // 46.6-48.6 billion cycles with ifs + "<< params[x].?loc" shifts
780
- // 47.3-47.3 billion cycles with ifs
781
- // 47.1-47.9 billion cycles without ifs
782
- if (params[x].pbits > 0)
783
- last += ptab[x][Math.min(p, 1023)] << params[x].ploc
784
-
785
- if (params[x].dbits > 0) {
786
- last += dtab[x][Math.min(delta, 255)] << params[x].dloc
787
- delta += q1 != Q ? 1 : 0
788
- q1 = Q
789
- }
790
-
791
- if (params[x].do_sel) last += s << params[x].sloc
792
-
793
- last = last & 0xffff
794
- p--
795
- }
796
-
797
- rc.RangeFinishEncode(out)
798
- return out.buf.slice(0, out.pos)
799
- }
800
-
801
- function encode(src, q_lens, q_dirs) {
802
- var qhist = new Array(2)
803
- var qtab = new Array(2)
804
- var ptab = new Array(2)
805
- var dtab = new Array(2)
806
- var stab = new Array(256)
807
-
808
- for (var s = 0; s < 2; s++) {
809
- qhist[s] = new Array(256)
810
- qtab[s] = new Array(256)
811
- ptab[s] = new Array(1024)
812
- dtab[s] = new Array(256)
813
- }
814
-
815
- var out = new IOStream('', 0, src.length * 1.1 + 100) // FIXME: guestimate worst case
816
-
817
- out.WriteUint7(src.length)
818
- var params = pick_fqz_params(src, q_lens, q_dirs, qhist)
819
- var out = encode_fqz_params(out, params, qhist, qtab, ptab, dtab, stab)
820
- return encode_fqz(
821
- out,
822
- src,
823
- q_lens,
824
- q_dirs,
825
- params,
826
- qhist,
827
- qtab,
828
- ptab,
829
- dtab,
830
- stab,
831
- )
832
- }
833
-
834
- module.exports = { decode, encode }
360
+ module.exports = { decode }
@@ -37,8 +37,6 @@
37
37
  // This JavaScript file is not part of the reference implementation
38
38
  // and is simply and interface to get a consistent interface for cram-js.
39
39
 
40
- 'use strict'
41
-
42
40
  var r4x8 = require('./rans')
43
41
  var r4x16 = require('./rans4x16')
44
42
  var arith = require('./arith_gen')
@@ -46,28 +44,28 @@ var fqzcomp = require('./fqzcomp')
46
44
  var tok3 = require('./tok3')
47
45
 
48
46
  function r4x8_uncompress(inputBuffer, outputBuffer) {
49
- r4x8.decode(inputBuffer).copy(outputBuffer, 0, 0)
47
+ return r4x8.decode(inputBuffer)
50
48
  }
51
49
 
52
- function r4x16_uncompress(inputBuffer, outputBuffer) {
53
- r4x16.decode(inputBuffer).copy(outputBuffer, 0, 0)
50
+ function r4x16_uncompress(inputBuffer) {
51
+ return r4x16.decode(inputBuffer)
54
52
  }
55
53
 
56
- function arith_uncompress(inputBuffer, outputBuffer) {
54
+ function arith_uncompress(inputBuffer) {
57
55
  // fix by @cmdcolin for CRAM 3.1
58
56
  // xref https://github.com/jkbonfield/htscodecs/pull/1/files
59
- return new arith().decode(inputBuffer).copy(outputBuffer, 0, 0)
57
+ return new arith().decode(inputBuffer)
60
58
  }
61
59
 
62
- function fqzcomp_uncompress(inputBuffer, outputBuffer) {
60
+ function fqzcomp_uncompress(inputBuffer) {
63
61
  var q_lens = new Array()
64
- fqzcomp.decode(inputBuffer, q_lens).copy(outputBuffer, 0, 0)
62
+ return fqzcomp.decode(inputBuffer, q_lens)
65
63
  }
66
64
 
67
- function tok3_uncompress(inputBuffer, outputBuffer) {
65
+ function tok3_uncompress(inputBuffer) {
68
66
  // Returns in string form instead of buffer
69
67
  var out = tok3.decode(inputBuffer, 0, '\0')
70
- Buffer.from(out, 'binary').copy(outputBuffer, 0, 0)
68
+ return Uint8Array.from(Array.from(out).map(letter => letter.charCodeAt(0)))
71
69
  }
72
70
 
73
71
  module.exports = {
@@ -36,12 +36,13 @@
36
36
  module.exports = class IOStream {
37
37
  constructor(buf, start_pos = 0, size = 0) {
38
38
  if (size != 0) {
39
- this.buf = Buffer.allocUnsafe(size)
39
+ this.buf = new Uint8Array(size)
40
40
  this.length = size
41
41
  } else {
42
42
  this.buf = buf
43
43
  this.length = buf.length
44
44
  }
45
+ this.dataView = new DataView(this.buf.buffer)
45
46
  this.pos = start_pos
46
47
  }
47
48
 
@@ -76,7 +77,7 @@ module.exports = class IOStream {
76
77
  }
77
78
 
78
79
  ReadUint32() {
79
- const i = this.buf.readInt32LE(this.pos)
80
+ const i = this.dataView.getInt32(this.pos, true)
80
81
  this.pos += 4
81
82
  return i
82
83
  }