imagescript 3.2.1 → 3.4.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.
- package/README.md +35 -10
- package/THIRD_PARTY_NOTICES.md +298 -2
- package/dist/animation.d.ts +25 -8
- package/dist/animation.js +44 -13
- package/dist/codecs/av1/cdef.js +197 -0
- package/dist/codecs/av1/data.js +141 -0
- package/dist/codecs/av1/decode.js +1769 -0
- package/dist/codecs/av1/filmgrain.js +219 -0
- package/dist/codecs/av1/frame.js +114 -0
- package/dist/codecs/av1/ipred.js +491 -0
- package/dist/codecs/av1/itx.js +950 -0
- package/dist/codecs/av1/loopfilter.js +149 -0
- package/dist/codecs/av1/msac.js +161 -0
- package/dist/codecs/av1/obu.js +516 -0
- package/dist/codecs/av1/postfilter.js +28 -0
- package/dist/codecs/av1/restoration.js +193 -0
- package/dist/codecs/av1/tables.js +160 -0
- package/dist/codecs/avif.js +581 -0
- package/dist/codecs/bmp.js +317 -0
- package/dist/codecs/crc.js +5 -0
- package/dist/codecs/gif.js +10 -35
- package/dist/codecs/hdr.d.ts +25 -0
- package/dist/codecs/hdr.js +201 -0
- package/dist/codecs/ico.js +48 -0
- package/dist/codecs/jpeg.js +11 -28
- package/dist/codecs/jxl/bits.js +126 -0
- package/dist/codecs/jxl/blend.js +117 -0
- package/dist/codecs/jxl/color.js +116 -0
- package/dist/codecs/jxl/dct.js +404 -0
- package/dist/codecs/jxl/entropy.js +556 -0
- package/dist/codecs/jxl/features.js +325 -0
- package/dist/codecs/jxl/filters.js +119 -0
- package/dist/codecs/jxl/frame-header.js +195 -0
- package/dist/codecs/jxl/frame.js +319 -0
- package/dist/codecs/jxl/headers.js +249 -0
- package/dist/codecs/jxl/idct.js +484 -0
- package/dist/codecs/jxl/modular.js +688 -0
- package/dist/codecs/jxl/quant.js +219 -0
- package/dist/codecs/jxl/upsample.js +52 -0
- package/dist/codecs/jxl/vardct.js +472 -0
- package/dist/codecs/jxl.js +89 -0
- package/dist/codecs/netpbm.js +239 -0
- package/dist/codecs/png.js +22 -10
- package/dist/codecs/qoi.js +150 -0
- package/dist/codecs/tga.js +3 -1
- package/dist/codecs/tiff.js +7 -2
- package/dist/codecs/vp8-enc-dsp.js +932 -0
- package/dist/codecs/vp8-enc-tables.js +78 -0
- package/dist/codecs/vp8-enc.js +1930 -0
- package/dist/codecs/vp8.js +3 -1
- package/dist/codecs/vp8l.js +126 -58
- package/dist/codecs/webp.js +47 -11
- package/dist/codecs/zlib.js +81 -69
- package/dist/frame.d.ts +1 -0
- package/dist/frame.js +4 -2
- package/dist/gif.d.ts +1 -0
- package/dist/gif.js +2 -2
- package/dist/image-type.d.ts +15 -1
- package/dist/image-type.js +45 -2
- package/dist/image.d.ts +89 -13
- package/dist/image.js +266 -113
- package/dist/index.d.ts +3 -2
- package/dist/index.js +4 -4
- package/dist/render/bidi.js +350 -0
- package/dist/render/buffer.js +362 -0
- package/dist/render/color.js +164 -0
- package/dist/render/colr.js +523 -0
- package/dist/render/font.js +173 -241
- package/dist/render/hinting.js +38 -22
- package/dist/render/layout.js +1553 -0
- package/dist/render/linebreak.js +210 -0
- package/dist/render/segment.js +106 -0
- package/dist/render/shape.js +984 -0
- package/dist/render/shapers/arabic.js +284 -0
- package/dist/render/shapers/hangul.js +142 -0
- package/dist/render/shapers/hebrew.js +49 -0
- package/dist/render/shapers/index.js +52 -0
- package/dist/render/shapers/indic.js +579 -0
- package/dist/render/shapers/khmer.js +104 -0
- package/dist/render/shapers/machine.js +129 -0
- package/dist/render/shapers/myanmar.js +121 -0
- package/dist/render/shapers/syllabic.js +100 -0
- package/dist/render/shapers/thai.js +125 -0
- package/dist/render/shapers/use.js +235 -0
- package/dist/render/svg.js +102 -23
- package/dist/render/text.js +373 -103
- package/dist/render/unicode-data.js +63 -0
- package/dist/render/unicode.js +50 -0
- package/dist/text-layout.d.ts +4 -1
- package/dist/text-layout.js +2 -2
- package/dist/util/alpha.js +43 -0
- package/dist/util/blur.js +20 -33
- package/dist/util/bytes.js +40 -0
- package/dist/util/limits.js +34 -0
- package/dist/util/options.js +7 -0
- package/dist/util/resample.js +126 -7
- package/dist/util/rotate.js +43 -0
- package/dist/version.js +1 -1
- package/licenses/HarfBuzz.txt +42 -0
- package/licenses/Unicode-3.0.txt +39 -0
- package/package.json +25 -2
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* The AV1 deblocking filter: every transform block edge of intra frames, filtered with the filters of dav1d
|
|
3
|
+
* (src/loopfilter_tmpl.c, src/lf_mask.c). Copyright (c) 2018-2021, VideoLAN and dav1d authors, Copyright (c) 2018,
|
|
4
|
+
* Two Orioles, LLC, BSD-2-Clause License (see THIRD_PARTY_NOTICES.md)
|
|
5
|
+
*/
|
|
6
|
+
export function deblock(f) {
|
|
7
|
+
const lf = f.hdr.loopFilter;
|
|
8
|
+
if (!lf.levelY[0] && !lf.levelY[1])
|
|
9
|
+
return;
|
|
10
|
+
const sharp = lf.sharpness;
|
|
11
|
+
const I = new Uint8Array(64), E = new Uint8Array(64);
|
|
12
|
+
for (let level = 0; level < 64; level++) {
|
|
13
|
+
let limit = level;
|
|
14
|
+
if (sharp > 0)
|
|
15
|
+
limit = Math.min(limit >> (sharp + 3 >> 2), 9 - sharp);
|
|
16
|
+
I[level] = Math.max(limit, 1);
|
|
17
|
+
E[level] = 2 * (level + 2) + I[level];
|
|
18
|
+
}
|
|
19
|
+
const s4 = f.b4Stride;
|
|
20
|
+
for (let plane = 0; plane < f.planes.length; plane++) {
|
|
21
|
+
if (plane && !(plane === 1 ? lf.levelU : lf.levelV))
|
|
22
|
+
continue;
|
|
23
|
+
const subX = plane ? f.ssx : 0, subY = plane ? f.ssy : 0;
|
|
24
|
+
const txW = plane ? f.uvTxW : f.txW, txH = plane ? f.uvTxH : f.txH;
|
|
25
|
+
const pic = f.planes[plane], stride = f.strides[plane];
|
|
26
|
+
for (let pass = 0; pass < 2; pass++) {
|
|
27
|
+
const dx = pass ? 0 : 1, dy = pass;
|
|
28
|
+
const tx = pass ? txH : txW;
|
|
29
|
+
const level = plane ? plane + 1 : pass;
|
|
30
|
+
for (let row = 0; row < f.bh; row += 1 << subY) {
|
|
31
|
+
const y = row * 4;
|
|
32
|
+
if (y >= f.height || pass && !y)
|
|
33
|
+
continue;
|
|
34
|
+
for (let col = 0; col < f.bw; col += 1 << subX) {
|
|
35
|
+
const x = col * 4;
|
|
36
|
+
if (x >= f.width || !pass && !x)
|
|
37
|
+
continue;
|
|
38
|
+
const r = row | subY, c = col | subX;
|
|
39
|
+
const xP = x >> subX, yP = y >> subY;
|
|
40
|
+
const cur = (r >> subY) * s4 + (c >> subX);
|
|
41
|
+
const prevR = r - (dy << subY), prevC = c - (dx << subX);
|
|
42
|
+
const prev = (prevR >> subY) * s4 + (prevC >> subX);
|
|
43
|
+
const size = 4 << tx[cur];
|
|
44
|
+
if ((pass ? yP : xP) % size)
|
|
45
|
+
continue;
|
|
46
|
+
const filterSize = Math.min(plane ? 8 : 16, size, 4 << tx[prev]);
|
|
47
|
+
let lvl = f.lfLevels[(r * s4 + c) * 4 + level];
|
|
48
|
+
if (!lvl)
|
|
49
|
+
lvl = f.lfLevels[(prevR * s4 + prevC) * 4 + level];
|
|
50
|
+
if (!lvl)
|
|
51
|
+
continue;
|
|
52
|
+
const wd = plane && filterSize === 8 ? 6 : filterSize;
|
|
53
|
+
filter(pic, yP * stride + xP, E[lvl], I[lvl], lvl >> 4, pass ? 1 : stride, pass ? stride : 1, wd, f.bitdepth);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function filter(dst, d, E, I, H, stridea, strideb, wd, bitdepth) {
|
|
60
|
+
const shift = bitdepth - 8, F = 1 << shift;
|
|
61
|
+
E <<= shift;
|
|
62
|
+
I <<= shift;
|
|
63
|
+
H <<= shift;
|
|
64
|
+
const max = (1 << bitdepth) - 1;
|
|
65
|
+
const pix = (v) => v < 0 ? 0 : v > max ? max : v;
|
|
66
|
+
const diffMin = -128 * (1 << shift), diffMax = 128 * (1 << shift) - 1;
|
|
67
|
+
const clipDiff = (v) => v < diffMin ? diffMin : v > diffMax ? diffMax : v;
|
|
68
|
+
const abs = Math.abs;
|
|
69
|
+
for (let i = 0; i < 4; i++, d += stridea) {
|
|
70
|
+
let p6 = 0, p5 = 0, p4 = 0, p3 = 0, p2 = 0, q2 = 0, q3 = 0, q4 = 0, q5 = 0, q6 = 0;
|
|
71
|
+
const p1 = dst[d - 2 * strideb], p0 = dst[d - strideb], q0 = dst[d], q1 = dst[d + strideb];
|
|
72
|
+
let fm = abs(p1 - p0) <= I && abs(q1 - q0) <= I && abs(p0 - q0) * 2 + (abs(p1 - q1) >> 1) <= E;
|
|
73
|
+
if (wd > 4) {
|
|
74
|
+
p2 = dst[d - 3 * strideb];
|
|
75
|
+
q2 = dst[d + 2 * strideb];
|
|
76
|
+
fm &&= abs(p2 - p1) <= I && abs(q2 - q1) <= I;
|
|
77
|
+
if (wd > 6) {
|
|
78
|
+
p3 = dst[d - 4 * strideb];
|
|
79
|
+
q3 = dst[d + 3 * strideb];
|
|
80
|
+
fm &&= abs(p3 - p2) <= I && abs(q3 - q2) <= I;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (!fm)
|
|
84
|
+
continue;
|
|
85
|
+
let flat8out = false, flat8in = false;
|
|
86
|
+
if (wd >= 16) {
|
|
87
|
+
p6 = dst[d - 7 * strideb];
|
|
88
|
+
p5 = dst[d - 6 * strideb];
|
|
89
|
+
p4 = dst[d - 5 * strideb];
|
|
90
|
+
q4 = dst[d + 4 * strideb];
|
|
91
|
+
q5 = dst[d + 5 * strideb];
|
|
92
|
+
q6 = dst[d + 6 * strideb];
|
|
93
|
+
flat8out = abs(p6 - p0) <= F && abs(p5 - p0) <= F && abs(p4 - p0) <= F && abs(q4 - q0) <= F &&
|
|
94
|
+
abs(q5 - q0) <= F && abs(q6 - q0) <= F;
|
|
95
|
+
}
|
|
96
|
+
if (wd >= 6)
|
|
97
|
+
flat8in = abs(p2 - p0) <= F && abs(p1 - p0) <= F && abs(q1 - q0) <= F && abs(q2 - q0) <= F;
|
|
98
|
+
if (wd >= 8)
|
|
99
|
+
flat8in &&= abs(p3 - p0) <= F && abs(q3 - q0) <= F;
|
|
100
|
+
if (wd >= 16 && flat8out && flat8in) {
|
|
101
|
+
dst[d - 6 * strideb] = (p6 * 7 + p5 * 2 + p4 * 2 + p3 + p2 + p1 + p0 + q0 + 8) >> 4;
|
|
102
|
+
dst[d - 5 * strideb] = (p6 * 5 + p5 * 2 + p4 * 2 + p3 * 2 + p2 + p1 + p0 + q0 + q1 + 8) >> 4;
|
|
103
|
+
dst[d - 4 * strideb] = (p6 * 4 + p5 + p4 * 2 + p3 * 2 + p2 * 2 + p1 + p0 + q0 + q1 + q2 + 8) >> 4;
|
|
104
|
+
dst[d - 3 * strideb] = (p6 * 3 + p5 + p4 + p3 * 2 + p2 * 2 + p1 * 2 + p0 + q0 + q1 + q2 + q3 + 8) >> 4;
|
|
105
|
+
dst[d - 2 * strideb] = (p6 * 2 + p5 + p4 + p3 + p2 * 2 + p1 * 2 + p0 * 2 + q0 + q1 + q2 + q3 + q4 + 8) >> 4;
|
|
106
|
+
dst[d - strideb] = (p6 + p5 + p4 + p3 + p2 + p1 * 2 + p0 * 2 + q0 * 2 + q1 + q2 + q3 + q4 + q5 + 8) >> 4;
|
|
107
|
+
dst[d] = (p5 + p4 + p3 + p2 + p1 + p0 * 2 + q0 * 2 + q1 * 2 + q2 + q3 + q4 + q5 + q6 + 8) >> 4;
|
|
108
|
+
dst[d + strideb] = (p4 + p3 + p2 + p1 + p0 + q0 * 2 + q1 * 2 + q2 * 2 + q3 + q4 + q5 + q6 * 2 + 8) >> 4;
|
|
109
|
+
dst[d + 2 * strideb] = (p3 + p2 + p1 + p0 + q0 + q1 * 2 + q2 * 2 + q3 * 2 + q4 + q5 + q6 * 3 + 8) >> 4;
|
|
110
|
+
dst[d + 3 * strideb] = (p2 + p1 + p0 + q0 + q1 + q2 * 2 + q3 * 2 + q4 * 2 + q5 + q6 * 4 + 8) >> 4;
|
|
111
|
+
dst[d + 4 * strideb] = (p1 + p0 + q0 + q1 + q2 + q3 * 2 + q4 * 2 + q5 * 2 + q6 * 5 + 8) >> 4;
|
|
112
|
+
dst[d + 5 * strideb] = (p0 + q0 + q1 + q2 + q3 + q4 * 2 + q5 * 2 + q6 * 7 + 8) >> 4;
|
|
113
|
+
}
|
|
114
|
+
else if (wd >= 8 && flat8in) {
|
|
115
|
+
dst[d - 3 * strideb] = (p3 * 3 + 2 * p2 + p1 + p0 + q0 + 4) >> 3;
|
|
116
|
+
dst[d - 2 * strideb] = (p3 * 2 + p2 + 2 * p1 + p0 + q0 + q1 + 4) >> 3;
|
|
117
|
+
dst[d - strideb] = (p3 + p2 + p1 + 2 * p0 + q0 + q1 + q2 + 4) >> 3;
|
|
118
|
+
dst[d] = (p2 + p1 + p0 + 2 * q0 + q1 + q2 + q3 + 4) >> 3;
|
|
119
|
+
dst[d + strideb] = (p1 + p0 + q0 + 2 * q1 + q2 + q3 * 2 + 4) >> 3;
|
|
120
|
+
dst[d + 2 * strideb] = (p0 + q0 + q1 + 2 * q2 + q3 * 3 + 4) >> 3;
|
|
121
|
+
}
|
|
122
|
+
else if (wd === 6 && flat8in) {
|
|
123
|
+
dst[d - 2 * strideb] = (p2 * 3 + 2 * p1 + 2 * p0 + q0 + 4) >> 3;
|
|
124
|
+
dst[d - strideb] = (p2 + 2 * p1 + 2 * p0 + 2 * q0 + q1 + 4) >> 3;
|
|
125
|
+
dst[d] = (p1 + 2 * p0 + 2 * q0 + 2 * q1 + q2 + 4) >> 3;
|
|
126
|
+
dst[d + strideb] = (p0 + 2 * q0 + 2 * q1 + q2 * 3 + 4) >> 3;
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
const hev = abs(p1 - p0) > H || abs(q1 - q0) > H;
|
|
130
|
+
const top = (128 << shift) - 1;
|
|
131
|
+
if (hev) {
|
|
132
|
+
let f = clipDiff(p1 - q1);
|
|
133
|
+
f = clipDiff(3 * (q0 - p0) + f);
|
|
134
|
+
const f1 = Math.min(f + 4, top) >> 3, f2 = Math.min(f + 3, top) >> 3;
|
|
135
|
+
dst[d - strideb] = pix(p0 + f2);
|
|
136
|
+
dst[d] = pix(q0 - f1);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
const f = clipDiff(3 * (q0 - p0));
|
|
140
|
+
const f1 = Math.min(f + 4, top) >> 3, f2 = Math.min(f + 3, top) >> 3;
|
|
141
|
+
dst[d - strideb] = pix(p0 + f2);
|
|
142
|
+
dst[d] = pix(q0 - f1);
|
|
143
|
+
const g = (f1 + 1) >> 1;
|
|
144
|
+
dst[d - 2 * strideb] = pix(p1 + g);
|
|
145
|
+
dst[d + strideb] = pix(q1 - g);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* The AV1 symbol decoder (a multi-symbol arithmetic decoder with adapting CDFs), ported from dav1d (src/msac.c).
|
|
3
|
+
* Copyright (c) 2018-2021, VideoLAN and dav1d authors, Copyright (c) 2018, Two Orioles, LLC, BSD-2-Clause License
|
|
4
|
+
* (see THIRD_PARTY_NOTICES.md)
|
|
5
|
+
*/
|
|
6
|
+
const PROB_SHIFT = 6, MIN_PROB = 4;
|
|
7
|
+
const WIN = 32;
|
|
8
|
+
export class SymbolDecoder {
|
|
9
|
+
data;
|
|
10
|
+
end;
|
|
11
|
+
allowUpdate;
|
|
12
|
+
pos;
|
|
13
|
+
dif = 0;
|
|
14
|
+
rng = 0x8000;
|
|
15
|
+
cnt = -15;
|
|
16
|
+
constructor(data, start, end, allowUpdate) {
|
|
17
|
+
this.data = data;
|
|
18
|
+
this.end = end;
|
|
19
|
+
this.allowUpdate = allowUpdate;
|
|
20
|
+
this.pos = start;
|
|
21
|
+
this.refill();
|
|
22
|
+
}
|
|
23
|
+
refill() {
|
|
24
|
+
let c = WIN - this.cnt - 24;
|
|
25
|
+
let dif = this.dif;
|
|
26
|
+
do {
|
|
27
|
+
if (this.pos >= this.end) {
|
|
28
|
+
dif = (dif | ~(~0xff << c)) >>> 0;
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
dif = (dif | (this.data[this.pos++] ^ 0xff) << c) >>> 0;
|
|
32
|
+
c -= 8;
|
|
33
|
+
} while (c >= 0);
|
|
34
|
+
this.dif = dif;
|
|
35
|
+
this.cnt = WIN - c - 24;
|
|
36
|
+
}
|
|
37
|
+
norm(dif, rng) {
|
|
38
|
+
const d = 15 ^ (31 ^ Math.clz32(rng));
|
|
39
|
+
const cnt = this.cnt;
|
|
40
|
+
this.dif = (dif << d) >>> 0;
|
|
41
|
+
this.rng = rng << d;
|
|
42
|
+
this.cnt = cnt - d;
|
|
43
|
+
if (cnt >= 0 && cnt < d)
|
|
44
|
+
this.refill();
|
|
45
|
+
}
|
|
46
|
+
bool() {
|
|
47
|
+
const r = this.rng;
|
|
48
|
+
let dif = this.dif;
|
|
49
|
+
let v = (r >> 8 << 7) + MIN_PROB;
|
|
50
|
+
const vw = v * 65536;
|
|
51
|
+
const ret = dif >= vw ? 1 : 0;
|
|
52
|
+
if (ret) {
|
|
53
|
+
dif -= vw;
|
|
54
|
+
v = r - v;
|
|
55
|
+
}
|
|
56
|
+
this.norm(dif, v);
|
|
57
|
+
return ret ^ 1;
|
|
58
|
+
}
|
|
59
|
+
boolProb(f) {
|
|
60
|
+
const r = this.rng;
|
|
61
|
+
let dif = this.dif;
|
|
62
|
+
let v = ((r >> 8) * (f >> PROB_SHIFT) >> (7 - PROB_SHIFT)) + MIN_PROB;
|
|
63
|
+
const vw = v * 65536;
|
|
64
|
+
const ret = dif >= vw ? 1 : 0;
|
|
65
|
+
if (ret) {
|
|
66
|
+
dif -= vw;
|
|
67
|
+
v = r - v;
|
|
68
|
+
}
|
|
69
|
+
this.norm(dif, v);
|
|
70
|
+
return ret ^ 1;
|
|
71
|
+
}
|
|
72
|
+
bools(n) {
|
|
73
|
+
let v = 0;
|
|
74
|
+
while (n--)
|
|
75
|
+
v = v << 1 | this.bool();
|
|
76
|
+
return v;
|
|
77
|
+
}
|
|
78
|
+
uniform(n) {
|
|
79
|
+
const l = 32 - Math.clz32(n);
|
|
80
|
+
const m = (1 << l) - n;
|
|
81
|
+
const v = this.bools(l - 1);
|
|
82
|
+
return v < m ? v : (v << 1) - m + this.bool();
|
|
83
|
+
}
|
|
84
|
+
symbol(cdf, o, n) {
|
|
85
|
+
const c = this.dif >>> 16, r = this.rng >> 8;
|
|
86
|
+
let u, v = this.rng, val = -1;
|
|
87
|
+
do {
|
|
88
|
+
val++;
|
|
89
|
+
u = v;
|
|
90
|
+
v = r * (cdf[o + val] >> PROB_SHIFT) >> (7 - PROB_SHIFT);
|
|
91
|
+
v += MIN_PROB * (n - val);
|
|
92
|
+
} while (c < v);
|
|
93
|
+
this.norm(this.dif - v * 65536, u - v);
|
|
94
|
+
if (this.allowUpdate) {
|
|
95
|
+
const count = cdf[o + n];
|
|
96
|
+
const rate = 4 + (count >> 4) + (n > 2 ? 1 : 0);
|
|
97
|
+
let i = 0;
|
|
98
|
+
for (; i < val; i++)
|
|
99
|
+
cdf[o + i] += 32768 - cdf[o + i] >> rate;
|
|
100
|
+
for (; i < n; i++)
|
|
101
|
+
cdf[o + i] -= cdf[o + i] >> rate;
|
|
102
|
+
cdf[o + n] = count + (count < 32 ? 1 : 0);
|
|
103
|
+
}
|
|
104
|
+
return val;
|
|
105
|
+
}
|
|
106
|
+
boolAdapt(cdf, o) {
|
|
107
|
+
const bit = this.boolProb(cdf[o]);
|
|
108
|
+
if (this.allowUpdate) {
|
|
109
|
+
const count = cdf[o + 1];
|
|
110
|
+
const rate = 4 + (count >> 4);
|
|
111
|
+
if (bit)
|
|
112
|
+
cdf[o] += 32768 - cdf[o] >> rate;
|
|
113
|
+
else
|
|
114
|
+
cdf[o] -= cdf[o] >> rate;
|
|
115
|
+
cdf[o + 1] = count + (count < 32 ? 1 : 0);
|
|
116
|
+
}
|
|
117
|
+
return bit;
|
|
118
|
+
}
|
|
119
|
+
hiTok(cdf, o) {
|
|
120
|
+
let br = this.symbol(cdf, o, 3);
|
|
121
|
+
let tok = 3 + br;
|
|
122
|
+
if (br === 3) {
|
|
123
|
+
br = this.symbol(cdf, o, 3);
|
|
124
|
+
tok = 6 + br;
|
|
125
|
+
if (br === 3) {
|
|
126
|
+
br = this.symbol(cdf, o, 3);
|
|
127
|
+
tok = 9 + br;
|
|
128
|
+
if (br === 3)
|
|
129
|
+
tok = 12 + this.symbol(cdf, o, 3);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return tok;
|
|
133
|
+
}
|
|
134
|
+
golomb() {
|
|
135
|
+
let len = 0;
|
|
136
|
+
while (!this.bool() && len < 32)
|
|
137
|
+
len++;
|
|
138
|
+
let v = 1;
|
|
139
|
+
while (len--)
|
|
140
|
+
v = v * 2 + this.bool();
|
|
141
|
+
return v - 1;
|
|
142
|
+
}
|
|
143
|
+
subexp(ref, n, k) {
|
|
144
|
+
let a = 0;
|
|
145
|
+
if (this.bool()) {
|
|
146
|
+
if (this.bool())
|
|
147
|
+
k += this.bool() + 1;
|
|
148
|
+
a = 1 << k;
|
|
149
|
+
}
|
|
150
|
+
const v = this.bools(k) + a;
|
|
151
|
+
return ref * 2 <= n ? inverseRecenter(ref, v) : n - 1 - inverseRecenter(n - 1 - ref, v);
|
|
152
|
+
}
|
|
153
|
+
get overread() {
|
|
154
|
+
return this.cnt <= -15;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
function inverseRecenter(r, v) {
|
|
158
|
+
if (v > r << 1)
|
|
159
|
+
return v;
|
|
160
|
+
return v & 1 ? r - (v + 1 >> 1) : r + (v >> 1);
|
|
161
|
+
}
|