first commit
Build AsminVoicechat / prepare-release (push) Successful in 14s
Build AsminVoicechat / build-and-test (17) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (18) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (19) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (20) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (21) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (22) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (23) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (24) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (25) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (26) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (27-ea) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (16) (push) Canceled after 38s

This commit is contained in:
asminme committed 2026-10-24 15:18:03 +02:00
commit bbccd4a815
454 files changed
+45050

No files matched your search

@@ -0,0 +1,986 @@
/*
* Decompiled with CFR 0.152.
*/
package de.maxhenkel.voicechat.concentus;
import de.maxhenkel.voicechat.concentus.Arrays;
import de.maxhenkel.voicechat.concentus.BoxedValueInt;
import de.maxhenkel.voicechat.concentus.CeltMode;
import de.maxhenkel.voicechat.concentus.CeltTables;
import de.maxhenkel.voicechat.concentus.EntropyCoder;
import de.maxhenkel.voicechat.concentus.Inlines;
import de.maxhenkel.voicechat.concentus.Kernels;
import de.maxhenkel.voicechat.concentus.Rate;
import de.maxhenkel.voicechat.concentus.VQ;
class Bands {
private static final byte[] bit_interleave_table = new byte[]{0, 1, 1, 1, 2, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3};
private static final short[] bit_deinterleave_table = new short[]{0, 3, 12, 15, 48, 51, 60, 63, 192, 195, 204, 207, 240, 243, 252, 255};
Bands() {
}
static int hysteresis_decision(int val, int[] thresholds, int[] hysteresis, int N, int prev) {
int i;
for (i = 0; i < N && val >= thresholds[i]; ++i) {
}
if (i > prev && val < thresholds[prev] + hysteresis[prev]) {
i = prev;
}
if (i < prev && val > thresholds[prev - 1] - hysteresis[prev - 1]) {
i = prev;
}
return i;
}
static int celt_lcg_rand(int seed) {
return 1664525 * seed + 1013904223;
}
static int bitexact_cos(int x) {
int tmp = 4096 + x * x >> 13;
Inlines.OpusAssert(tmp <= Short.MAX_VALUE);
int x2 = tmp;
x2 = Short.MAX_VALUE - x2 + Inlines.FRAC_MUL16(x2, -7651 + Inlines.FRAC_MUL16(x2, 8277 + Inlines.FRAC_MUL16(-626, x2)));
Inlines.OpusAssert(x2 <= 32766);
return 1 + x2;
}
static int bitexact_log2tan(int isin, int icos) {
int lc = Inlines.EC_ILOG(icos);
int ls = Inlines.EC_ILOG(isin);
return (ls - lc) * 2048 + Inlines.FRAC_MUL16(isin <<= 15 - ls, Inlines.FRAC_MUL16(isin, -2597) + 7932) - Inlines.FRAC_MUL16(icos <<= 15 - lc, Inlines.FRAC_MUL16(icos, -2597) + 7932);
}
static void compute_band_energies(CeltMode m, int[][] X, int[][] bandE, int end, int C, int LM) {
short[] eBands = m.eBands;
int N = m.shortMdctSize << LM;
int c = 0;
do {
for (int i = 0; i < end; ++i) {
int maxval = 0;
int sum = 0;
maxval = Inlines.celt_maxabs32(X[c], eBands[i] << LM, eBands[i + 1] - eBands[i] << LM);
if (maxval > 0) {
int shift = Inlines.celt_ilog2(maxval) - 14 + ((m.logN[i] >> 3) + LM + 1 >> 1);
int j = eBands[i] << LM;
if (shift > 0) {
do {
sum = Inlines.MAC16_16(sum, Inlines.EXTRACT16(Inlines.SHR32(X[c][j], shift)), Inlines.EXTRACT16(Inlines.SHR32(X[c][j], shift)));
} while (++j < eBands[i + 1] << LM);
} else {
do {
sum = Inlines.MAC16_16(sum, Inlines.EXTRACT16(Inlines.SHL32(X[c][j], -shift)), Inlines.EXTRACT16(Inlines.SHL32(X[c][j], -shift)));
} while (++j < eBands[i + 1] << LM);
}
bandE[c][i] = 1 + Inlines.VSHR32(Inlines.celt_sqrt(sum), -shift);
continue;
}
bandE[c][i] = 1;
}
} while (++c < C);
}
static void normalise_bands(CeltMode m, int[][] freq, int[][] X, int[][] bandE, int end, int C, int M) {
short[] eBands = m.eBands;
int c = 0;
do {
int i = 0;
do {
int shift = Inlines.celt_zlog2(bandE[c][i]) - 13;
int E = Inlines.VSHR32(bandE[c][i], shift);
short g = Inlines.EXTRACT16(Inlines.celt_rcp(Inlines.SHL32(E, 3)));
int j = M * eBands[i];
do {
X[c][j] = Inlines.MULT16_16_Q15(Inlines.VSHR32(freq[c][j], shift - 1), (int)g);
} while (++j < M * eBands[i + 1]);
} while (++i < end);
} while (++c < C);
}
static void denormalise_bands(CeltMode m, int[] X, int[] freq, int freq_ptr, int[] bandLogE, int bandLogE_ptr, int start, int end, int M, int downsample, int silence) {
int i;
short[] eBands = m.eBands;
int N = M * m.shortMdctSize;
int bound = M * eBands[end];
if (downsample != 1) {
bound = Inlines.IMIN(bound, N / downsample);
}
if (silence != 0) {
bound = 0;
end = 0;
start = 0;
}
int f = freq_ptr;
int x = M * eBands[start];
for (i = 0; i < M * eBands[start]; ++i) {
freq[f++] = 0;
}
for (i = start; i < end; ++i) {
int g;
int j = M * eBands[i];
int band_end = M * eBands[i + 1];
int lg = Inlines.ADD16(bandLogE[bandLogE_ptr + i], (int)Inlines.SHL16(CeltTables.eMeans[i], 6));
int shift = 16 - (lg >> 10);
if (shift > 31) {
shift = 0;
g = 0;
} else {
g = Inlines.celt_exp2_frac(lg & 0x3FF);
}
if (shift < 0) {
if (shift < -2) {
g = Short.MAX_VALUE;
shift = -2;
}
do {
freq[f] = Inlines.SHR32(Inlines.MULT16_16(X[x], g), -shift);
} while (++j < band_end);
continue;
}
do {
freq[f++] = Inlines.SHR32(Inlines.MULT16_16(X[x++], g), shift);
} while (++j < band_end);
}
Inlines.OpusAssert(start <= end);
Arrays.MemSetWithOffset(freq, 0, freq_ptr + bound, N - bound);
}
static void anti_collapse(CeltMode m, int[][] X_, short[] collapse_masks, int LM, int C, int size, int start, int end, int[] logE, int[] prev1logE, int[] prev2logE, int[] pulses, int seed) {
for (int i = start; i < end; ++i) {
int N0 = m.eBands[i + 1] - m.eBands[i];
Inlines.OpusAssert(pulses[i] >= 0);
int depth = Inlines.celt_udiv(1 + pulses[i], m.eBands[i + 1] - m.eBands[i]) >> LM;
int thresh32 = Inlines.SHR32(Inlines.celt_exp2(0 - Inlines.SHL16(depth, 7)), 1);
int thresh = Inlines.MULT16_32_Q15((short)16384, Inlines.MIN32(Short.MAX_VALUE, thresh32));
int t = N0 << LM;
int shift = Inlines.celt_ilog2(t) >> 1;
t = Inlines.SHL32(t, 7 - shift << 1);
int sqrt_1 = Inlines.celt_rsqrt_norm(t);
int c = 0;
do {
int r;
boolean renormalize = false;
int prev1 = prev1logE[c * m.nbEBands + i];
int prev2 = prev2logE[c * m.nbEBands + i];
if (C == 1) {
prev1 = Inlines.MAX16(prev1, prev1logE[m.nbEBands + i]);
prev2 = Inlines.MAX16(prev2, prev2logE[m.nbEBands + i]);
}
int Ediff = Inlines.EXTEND32(logE[c * m.nbEBands + i]) - Inlines.EXTEND32(Inlines.MIN16(prev1, prev2));
if ((Ediff = Inlines.MAX32(0, Ediff)) < 16384) {
int r32 = Inlines.SHR32(Inlines.celt_exp2((short)(0 - Inlines.EXTRACT16(Ediff))), 1);
r = 2 * Inlines.MIN16(16383, r32);
} else {
r = 0;
}
if (LM == 3) {
r = Inlines.MULT16_16_Q14(23170, Inlines.MIN32(23169, r));
}
r = Inlines.SHR16(Inlines.MIN16(thresh, r), 1);
r = Inlines.SHR32(Inlines.MULT16_16_Q15(sqrt_1, r), shift);
int X = m.eBands[i] << LM;
for (int k = 0; k < 1 << LM; ++k) {
if ((collapse_masks[i * C + c] & 1 << k) != 0) continue;
int Xk = X + k;
for (int j = 0; j < N0; ++j) {
seed = Bands.celt_lcg_rand(seed);
X_[c][Xk + (j << LM)] = (seed & 0x8000) != 0 ? r : 0 - r;
}
renormalize = true;
}
if (!renormalize) continue;
VQ.renormalise_vector(X_[c], X, N0 << LM, Short.MAX_VALUE);
} while (++c < C);
}
}
static void intensity_stereo(CeltMode m, int[] X, int X_ptr, int[] Y, int Y_ptr, int[][] bandE, int bandID, int N) {
int i = bandID;
int shift = Inlines.celt_zlog2(Inlines.MAX32(bandE[0][i], bandE[1][i])) - 13;
int left = Inlines.VSHR32(bandE[0][i], shift);
int right = Inlines.VSHR32(bandE[1][i], shift);
int norm = 1 + Inlines.celt_sqrt(1 + Inlines.MULT16_16(left, left) + Inlines.MULT16_16(right, right));
int a1 = Inlines.DIV32_16(Inlines.SHL32(left, 14), norm);
int a2 = Inlines.DIV32_16(Inlines.SHL32(right, 14), norm);
for (int j = 0; j < N; ++j) {
int l = X[X_ptr + j];
int r = Y[Y_ptr + j];
X[X_ptr + j] = Inlines.EXTRACT16(Inlines.SHR32(Inlines.MAC16_16(Inlines.MULT16_16(a1, l), a2, r), 14));
}
}
static void stereo_split(int[] X, int X_ptr, int[] Y, int Y_ptr, int N) {
for (int j = 0; j < N; ++j) {
int l = Inlines.MULT16_16(23170, X[X_ptr + j]);
int r = Inlines.MULT16_16(23170, Y[Y_ptr + j]);
X[X_ptr + j] = Inlines.EXTRACT16(Inlines.SHR32(Inlines.ADD32(l, r), 15));
Y[Y_ptr + j] = Inlines.EXTRACT16(Inlines.SHR32(Inlines.SUB32(r, l), 15));
}
}
static void stereo_merge(int[] X, int X_ptr, int[] Y, int Y_ptr, int mid, int N) {
BoxedValueInt xp = new BoxedValueInt(0);
BoxedValueInt side = new BoxedValueInt(0);
Kernels.dual_inner_prod(Y, Y_ptr, X, X_ptr, Y, Y_ptr, N, xp, side);
xp.Val = Inlines.MULT16_32_Q15(mid, xp.Val);
int mid2 = Inlines.SHR16(mid, 1);
int El = Inlines.MULT16_16(mid2, mid2) + side.Val - 2 * xp.Val;
int Er = Inlines.MULT16_16(mid2, mid2) + side.Val + 2 * xp.Val;
if (Er < 161061 || El < 161061) {
System.arraycopy(X, X_ptr, Y, Y_ptr, N);
return;
}
int kl = Inlines.celt_ilog2(El) >> 1;
int kr = Inlines.celt_ilog2(Er) >> 1;
int t = Inlines.VSHR32(El, kl - 7 << 1);
int lgain = Inlines.celt_rsqrt_norm(t);
t = Inlines.VSHR32(Er, kr - 7 << 1);
int rgain = Inlines.celt_rsqrt_norm(t);
if (kl < 7) {
kl = 7;
}
if (kr < 7) {
kr = 7;
}
for (int j = 0; j < N; ++j) {
int l = Inlines.MULT16_16_P15(mid, X[X_ptr + j]);
int r = Y[Y_ptr + j];
X[X_ptr + j] = Inlines.EXTRACT16(Inlines.PSHR32(Inlines.MULT16_16(lgain, Inlines.SUB16(l, r)), kl + 1));
Y[Y_ptr + j] = Inlines.EXTRACT16(Inlines.PSHR32(Inlines.MULT16_16(rgain, Inlines.ADD16(l, r)), kr + 1));
}
}
static int spreading_decision(CeltMode m, int[][] X, BoxedValueInt average, int last_decision, BoxedValueInt hf_average, BoxedValueInt tapset_decision, int update_hf, int end, int C, int M) {
int sum = 0;
int nbBands = 0;
short[] eBands = m.eBands;
int hf_sum = 0;
Inlines.OpusAssert(end > 0);
if (M * (eBands[end] - eBands[end - 1]) <= 8) {
return 0;
}
int c = 0;
do {
for (int i = 0; i < end; ++i) {
int tmp = 0;
int[] tcount = new int[]{0, 0, 0};
int[] x = X[c];
int x_ptr = M * eBands[i];
int N = M * (eBands[i + 1] - eBands[i]);
if (N <= 8) continue;
for (int j = x_ptr; j < N + x_ptr; ++j) {
int x2N = Inlines.MULT16_16(Inlines.MULT16_16_Q15(x[j], x[j]), N);
if (x2N < 2048) {
tcount[0] = tcount[0] + 1;
}
if (x2N < 512) {
tcount[1] = tcount[1] + 1;
}
if (x2N >= 128) continue;
tcount[2] = tcount[2] + 1;
}
if (i > m.nbEBands - 4) {
hf_sum += Inlines.celt_udiv(32 * (tcount[1] + tcount[0]), N);
}
tmp = (2 * tcount[2] >= N ? 1 : 0) + (2 * tcount[1] >= N ? 1 : 0) + (2 * tcount[0] >= N ? 1 : 0);
sum += tmp * 256;
++nbBands;
}
} while (++c < C);
if (update_hf != 0) {
if (hf_sum != 0) {
hf_sum = Inlines.celt_udiv(hf_sum, C * (4 - m.nbEBands + end));
}
hf_sum = hf_average.Val = hf_average.Val + hf_sum >> 1;
if (tapset_decision.Val == 2) {
hf_sum += 4;
} else if (tapset_decision.Val == 0) {
hf_sum -= 4;
}
tapset_decision.Val = hf_sum > 22 ? 2 : (hf_sum > 18 ? 1 : 0);
}
Inlines.OpusAssert(nbBands > 0);
Inlines.OpusAssert(sum >= 0);
sum = Inlines.celt_udiv(sum, nbBands);
average.Val = sum = sum + average.Val >> 1;
sum = 3 * sum + ((3 - last_decision << 7) + 64) + 2 >> 2;
int decision = sum < 80 ? 3 : (sum < 256 ? 2 : (sum < 384 ? 1 : 0));
return decision;
}
static void deinterleave_hadamard(int[] X, int X_ptr, int N0, int stride, int hadamard) {
int N = N0 * stride;
int[] tmp = new int[N];
Inlines.OpusAssert(stride > 0);
if (hadamard != 0) {
int ordery = stride - 2;
for (int i = 0; i < stride; ++i) {
for (int j = 0; j < N0; ++j) {
tmp[CeltTables.ordery_table[ordery + i] * N0 + j] = X[j * stride + i + X_ptr];
}
}
} else {
for (int i = 0; i < stride; ++i) {
for (int j = 0; j < N0; ++j) {
tmp[i * N0 + j] = X[j * stride + i + X_ptr];
}
}
}
System.arraycopy(tmp, 0, X, X_ptr, N);
}
static void interleave_hadamard(int[] X, int X_ptr, int N0, int stride, int hadamard) {
int N = N0 * stride;
int[] tmp = new int[N];
if (hadamard != 0) {
int ordery = stride - 2;
for (int i = 0; i < stride; ++i) {
for (int j = 0; j < N0; ++j) {
tmp[j * stride + i] = X[CeltTables.ordery_table[ordery + i] * N0 + j + X_ptr];
}
}
} else {
for (int i = 0; i < stride; ++i) {
for (int j = 0; j < N0; ++j) {
tmp[j * stride + i] = X[i * N0 + j + X_ptr];
}
}
}
System.arraycopy(tmp, 0, X, X_ptr, N);
}
static void haar1(int[] X, int X_ptr, int N0, int stride) {
N0 >>= 1;
for (int i = 0; i < stride; ++i) {
for (int j = 0; j < N0; ++j) {
int tmpidx = X_ptr + i + stride * 2 * j;
int tmp1 = Inlines.MULT16_16(23170, X[tmpidx]);
int tmp2 = Inlines.MULT16_16(23170, X[tmpidx + stride]);
X[tmpidx] = Inlines.EXTRACT16(Inlines.PSHR32(Inlines.ADD32(tmp1, tmp2), 15));
X[tmpidx + stride] = Inlines.EXTRACT16(Inlines.PSHR32(Inlines.SUB32(tmp1, tmp2), 15));
}
}
}
static void haar1ZeroOffset(int[] X, int N0, int stride) {
N0 >>= 1;
for (int i = 0; i < stride; ++i) {
for (int j = 0; j < N0; ++j) {
int tmpidx = i + stride * 2 * j;
int tmp1 = Inlines.MULT16_16(23170, X[tmpidx]);
int tmp2 = Inlines.MULT16_16(23170, X[tmpidx + stride]);
X[tmpidx] = Inlines.EXTRACT16(Inlines.PSHR32(Inlines.ADD32(tmp1, tmp2), 15));
X[tmpidx + stride] = Inlines.EXTRACT16(Inlines.PSHR32(Inlines.SUB32(tmp1, tmp2), 15));
}
}
}
static int compute_qn(int N, int b, int offset, int pulse_cap, int stereo) {
int qn;
short[] exp2_table8 = new short[]{16384, 17866, 19483, 21247, 23170, 25267, 27554, 30048};
int N2 = 2 * N - 1;
if (stereo != 0 && N == 2) {
--N2;
}
int qb = Inlines.celt_sudiv(b + N2 * offset, N2);
qb = Inlines.IMIN(b - pulse_cap - 32, qb);
if ((qb = Inlines.IMIN(64, qb)) < 4) {
qn = 1;
} else {
qn = exp2_table8[qb & 7] >> 14 - (qb >> 3);
qn = qn + 1 >> 1 << 1;
}
Inlines.OpusAssert(qn <= 256);
return qn;
}
static void compute_theta(band_ctx ctx, split_ctx sctx, int[] X, int X_ptr, int[] Y, int Y_ptr, int N, BoxedValueInt b, int B, int B0, int LM, int stereo, BoxedValueInt fill) {
int delta;
int iside;
int imid;
int itheta = 0;
int inv = 0;
int encode = ctx.encode;
CeltMode m = ctx.m;
int i = ctx.i;
int intensity = ctx.intensity;
EntropyCoder ec = ctx.ec;
int[][] bandE = ctx.bandE;
int pulse_cap = m.logN[i] + LM * 8;
int offset = (pulse_cap >> 1) - (stereo != 0 && N == 2 ? 16 : 4);
int qn = Bands.compute_qn(N, b.Val, offset, pulse_cap, stereo);
if (stereo != 0 && i >= intensity) {
qn = 1;
}
if (encode != 0) {
itheta = VQ.stereo_itheta(X, X_ptr, Y, Y_ptr, stereo, N);
}
int tell = ec.tell_frac();
if (qn != 1) {
if (encode != 0) {
itheta = itheta * qn + 8192 >> 14;
}
if (stereo != 0 && N > 2) {
int p0 = 3;
int x = itheta;
int x0 = qn / 2;
long ft = Inlines.CapToUInt32(p0 * (x0 + 1) + x0);
if (encode != 0) {
ec.encode(x <= x0 ? p0 * x : x - 1 - x0 + (x0 + 1) * p0, x <= x0 ? p0 * (x + 1) : x - x0 + (x0 + 1) * p0, ft);
} else {
int fs = (int)ec.decode(ft);
x = fs < (x0 + 1) * p0 ? fs / p0 : x0 + 1 + (fs - (x0 + 1) * p0);
ec.dec_update(x <= x0 ? p0 * x : x - 1 - x0 + (x0 + 1) * p0, x <= x0 ? p0 * (x + 1) : x - x0 + (x0 + 1) * p0, ft);
itheta = x;
}
} else if (B0 > 1 || stereo != 0) {
if (encode != 0) {
ec.enc_uint(itheta, qn + 1);
} else {
itheta = (int)ec.dec_uint(qn + 1);
}
} else {
int fs = 1;
int ft = ((qn >> 1) + 1) * ((qn >> 1) + 1);
if (encode != 0) {
fs = itheta <= qn >> 1 ? itheta + 1 : qn + 1 - itheta;
int fl = itheta <= qn >> 1 ? itheta * (itheta + 1) >> 1 : ft - ((qn + 1 - itheta) * (qn + 2 - itheta) >> 1);
ec.encode(fl, fl + fs, ft);
} else {
int fl = 0;
int fm = (int)ec.decode(ft);
if (fm < (qn >> 1) * ((qn >> 1) + 1) >> 1) {
itheta = Inlines.isqrt32(8 * fm + 1) - 1 >> 1;
fs = itheta + 1;
fl = itheta * (itheta + 1) >> 1;
} else {
itheta = 2 * (qn + 1) - Inlines.isqrt32(8 * (ft - fm - 1) + 1) >> 1;
fs = qn + 1 - itheta;
fl = ft - ((qn + 1 - itheta) * (qn + 2 - itheta) >> 1);
}
ec.dec_update(fl, fl + fs, ft);
}
}
Inlines.OpusAssert(itheta >= 0);
itheta = Inlines.celt_udiv(itheta * 16384, qn);
if (encode != 0 && stereo != 0) {
if (itheta == 0) {
Bands.intensity_stereo(m, X, X_ptr, Y, Y_ptr, bandE, i, N);
} else {
Bands.stereo_split(X, X_ptr, Y, Y_ptr, N);
}
}
} else if (stereo != 0) {
if (encode != 0) {
int n = inv = itheta > 8192 ? 1 : 0;
if (inv != 0) {
for (int j = 0; j < N; ++j) {
Y[Y_ptr + j] = 0 - Y[Y_ptr + j];
}
}
Bands.intensity_stereo(m, X, X_ptr, Y, Y_ptr, bandE, i, N);
}
if (b.Val > 16 && ctx.remaining_bits > 16) {
if (encode != 0) {
ec.enc_bit_logp(inv, 2);
} else {
inv = ec.dec_bit_logp(2L);
}
} else {
inv = 0;
}
itheta = 0;
}
int qalloc = ec.tell_frac() - tell;
b.Val -= qalloc;
if (itheta == 0) {
imid = Short.MAX_VALUE;
iside = 0;
fill.Val &= (1 << B) - 1;
delta = -16384;
} else if (itheta == 16384) {
imid = 0;
iside = Short.MAX_VALUE;
fill.Val &= (1 << B) - 1 << B;
delta = 16384;
} else {
imid = Bands.bitexact_cos((short)itheta);
iside = Bands.bitexact_cos((short)(16384 - itheta));
delta = Inlines.FRAC_MUL16(N - 1 << 7, Bands.bitexact_log2tan(iside, imid));
}
sctx.inv = inv;
sctx.imid = imid;
sctx.iside = iside;
sctx.delta = delta;
sctx.itheta = itheta;
sctx.qalloc = qalloc;
}
static int quant_band_n1(band_ctx ctx, int[] X, int X_ptr, int[] Y, int Y_ptr, int b, int[] lowband_out, int lowband_out_ptr) {
boolean resynth = ctx.encode == 0;
int[] x = X;
int x_ptr = X_ptr;
int encode = ctx.encode;
EntropyCoder ec = ctx.ec;
int stereo = Y != null ? 1 : 0;
int c = 0;
do {
int sign = 0;
if (ctx.remaining_bits >= 8) {
if (encode != 0) {
sign = x[x_ptr] < 0 ? 1 : 0;
ec.enc_bits(sign, 1);
} else {
sign = ec.dec_bits(1);
}
ctx.remaining_bits -= 8;
b -= 8;
}
if (resynth) {
x[x_ptr] = sign != 0 ? -16384 : 16384;
}
x = Y;
x_ptr = Y_ptr;
} while (++c < 1 + stereo);
if (lowband_out != null) {
lowband_out[lowband_out_ptr] = Inlines.SHR16(X[X_ptr], 4);
}
return 1;
}
static int quant_partition(band_ctx ctx, int[] X, int X_ptr, int N, int b, int B, int[] lowband, int lowband_ptr, int LM, int gain, int fill) {
int imid = 0;
int iside = 0;
int B0 = B;
int mid = 0;
int side = 0;
int cm = 0;
boolean resynth = ctx.encode == 0;
int Y = 0;
int encode = ctx.encode;
CeltMode m = ctx.m;
int i = ctx.i;
int spread = ctx.spread;
EntropyCoder ec = ctx.ec;
short[] cache = m.cache.bits;
short cache_ptr = m.cache.index[(LM + 1) * m.nbEBands + i];
if (LM != -1 && b > cache[cache_ptr + cache[cache_ptr]] + 12 && N > 2) {
split_ctx sctx = new split_ctx();
int next_lowband2 = 0;
Y = X_ptr + (N >>= 1);
--LM;
if (B == 1) {
fill = fill & 1 | fill << 1;
}
B = B + 1 >> 1;
BoxedValueInt boxed_b = new BoxedValueInt(b);
BoxedValueInt boxed_fill = new BoxedValueInt(fill);
Bands.compute_theta(ctx, sctx, X, X_ptr, X, Y, N, boxed_b, B, B0, LM, 0, boxed_fill);
b = boxed_b.Val;
fill = boxed_fill.Val;
imid = sctx.imid;
iside = sctx.iside;
int delta = sctx.delta;
int itheta = sctx.itheta;
int qalloc = sctx.qalloc;
mid = imid;
side = iside;
if (B0 > 1 && (itheta & 0x3FFF) != 0) {
delta = itheta > 8192 ? (delta -= delta >> 4 - LM) : Inlines.IMIN(0, delta + (N << 3 >> 5 - LM));
}
int mbits = Inlines.IMAX(0, Inlines.IMIN(b, (b - delta) / 2));
int sbits = b - mbits;
ctx.remaining_bits -= qalloc;
if (lowband != null) {
next_lowband2 = lowband_ptr + N;
}
int rebalance = ctx.remaining_bits;
if (mbits >= sbits) {
cm = Bands.quant_partition(ctx, X, X_ptr, N, mbits, B, lowband, lowband_ptr, LM, Inlines.MULT16_16_P15(gain, mid), fill);
if ((rebalance = mbits - (rebalance - ctx.remaining_bits)) > 24 && itheta != 0) {
sbits += rebalance - 24;
}
cm |= Bands.quant_partition(ctx, X, Y, N, sbits, B, lowband, next_lowband2, LM, Inlines.MULT16_16_P15(gain, side), fill >> B) << (B0 >> 1);
} else {
cm = Bands.quant_partition(ctx, X, Y, N, sbits, B, lowband, next_lowband2, LM, Inlines.MULT16_16_P15(gain, side), fill >> B) << (B0 >> 1);
if ((rebalance = sbits - (rebalance - ctx.remaining_bits)) > 24 && itheta != 16384) {
mbits += rebalance - 24;
}
cm |= Bands.quant_partition(ctx, X, X_ptr, N, mbits, B, lowband, lowband_ptr, LM, Inlines.MULT16_16_P15(gain, mid), fill);
}
} else {
int q = Rate.bits2pulses(m, i, LM, b);
int curr_bits = Rate.pulses2bits(m, i, LM, q);
ctx.remaining_bits -= curr_bits;
while (ctx.remaining_bits < 0 && q > 0) {
ctx.remaining_bits += curr_bits;
curr_bits = Rate.pulses2bits(m, i, LM, --q);
ctx.remaining_bits -= curr_bits;
}
if (q != 0) {
int K = Rate.get_pulses(q);
cm = encode != 0 ? VQ.alg_quant(X, X_ptr, N, K, spread, B, ec) : VQ.alg_unquant(X, X_ptr, N, K, spread, B, ec, gain);
} else if (resynth) {
int cm_mask = (1 << B) - 1;
if ((fill &= cm_mask) == 0) {
Arrays.MemSetWithOffset(X, 0, X_ptr, N);
} else {
if (lowband == null) {
for (int j = 0; j < N; ++j) {
ctx.seed = Bands.celt_lcg_rand(ctx.seed);
X[X_ptr + j] = ctx.seed >> 20;
}
cm = cm_mask;
} else {
for (int j = 0; j < N; ++j) {
ctx.seed = Bands.celt_lcg_rand(ctx.seed);
int tmp = 4;
tmp = (ctx.seed & 0x8000) != 0 ? tmp : 0 - tmp;
X[X_ptr + j] = lowband[lowband_ptr + j] + tmp;
}
cm = fill;
}
VQ.renormalise_vector(X, X_ptr, N, gain);
}
}
}
return cm;
}
static int quant_band(band_ctx ctx, int[] X, int X_ptr, int N, int b, int B, int[] lowband, int lowband_ptr, int LM, int[] lowband_out, int lowband_out_ptr, int gain, int[] lowband_scratch, int lowband_scratch_ptr, int fill) {
int k;
int N0 = N;
int N_B = N;
int B0 = B;
int time_divide = 0;
int recombine = 0;
int cm = 0;
boolean resynth = ctx.encode == 0;
int encode = ctx.encode;
int tf_change = ctx.tf_change;
int longBlocks = B0 == 1 ? 1 : 0;
N_B = Inlines.celt_udiv(N_B, B);
if (N == 1) {
return Bands.quant_band_n1(ctx, X, X_ptr, null, 0, b, lowband_out, lowband_out_ptr);
}
if (tf_change > 0) {
recombine = tf_change;
}
if (lowband_scratch != null && lowband != null && (recombine != 0 || (N_B & 1) == 0 && tf_change < 0 || B0 > 1)) {
System.arraycopy(lowband, lowband_ptr, lowband_scratch, lowband_scratch_ptr, N);
lowband = lowband_scratch;
lowband_ptr = lowband_scratch_ptr;
}
for (k = 0; k < recombine; ++k) {
if (encode != 0) {
Bands.haar1(X, X_ptr, N >> k, 1 << k);
}
if (lowband != null) {
Bands.haar1(lowband, lowband_ptr, N >> k, 1 << k);
}
int idx1 = fill & 0xF;
int idx2 = fill >> 4;
if (idx1 < 0) {
System.out.println("e");
}
if (idx2 < 0) {
System.out.println("e");
}
fill = bit_interleave_table[fill & 0xF] | bit_interleave_table[fill >> 4] << 2;
}
B >>= recombine;
N_B <<= recombine;
while ((N_B & 1) == 0 && tf_change < 0) {
if (encode != 0) {
Bands.haar1(X, X_ptr, N_B, B);
}
if (lowband != null) {
Bands.haar1(lowband, lowband_ptr, N_B, B);
}
fill |= fill << B;
B <<= 1;
N_B >>= 1;
++time_divide;
++tf_change;
}
B0 = B;
int N_B0 = N_B;
if (B0 > 1) {
if (encode != 0) {
Bands.deinterleave_hadamard(X, X_ptr, N_B >> recombine, B0 << recombine, longBlocks);
}
if (lowband != null) {
Bands.deinterleave_hadamard(lowband, lowband_ptr, N_B >> recombine, B0 << recombine, longBlocks);
}
}
cm = Bands.quant_partition(ctx, X, X_ptr, N, b, B, lowband, lowband_ptr, LM, gain, fill);
if (resynth) {
if (B0 > 1) {
Bands.interleave_hadamard(X, X_ptr, N_B >> recombine, B0 << recombine, longBlocks);
}
N_B = N_B0;
B = B0;
for (k = 0; k < time_divide; ++k) {
cm |= cm >> (B >>= 1);
Bands.haar1(X, X_ptr, N_B <<= 1, B);
}
for (k = 0; k < recombine; ++k) {
cm = bit_deinterleave_table[cm];
Bands.haar1(X, X_ptr, N0 >> k, 1 << k);
}
B <<= recombine;
if (lowband_out != null) {
int n = Inlines.celt_sqrt(Inlines.SHL32(N0, 22));
for (int j = 0; j < N0; ++j) {
lowband_out[lowband_out_ptr + j] = Inlines.MULT16_16_Q15(n, X[X_ptr + j]);
}
}
cm &= (1 << B) - 1;
}
return cm;
}
static int quant_band_stereo(band_ctx ctx, int[] X, int X_ptr, int[] Y, int Y_ptr, int N, int b, int B, int[] lowband, int lowband_ptr, int LM, int[] lowband_out, int lowband_out_ptr, int[] lowband_scratch, int lowband_scratch_ptr, int fill) {
int sbits;
int mbits;
int imid = 0;
int iside = 0;
int inv = 0;
int mid = 0;
int side = 0;
int cm = 0;
boolean resynth = ctx.encode == 0;
split_ctx sctx = new split_ctx();
int encode = ctx.encode;
EntropyCoder ec = ctx.ec;
if (N == 1) {
return Bands.quant_band_n1(ctx, X, X_ptr, Y, Y_ptr, b, lowband_out, lowband_out_ptr);
}
int orig_fill = fill;
BoxedValueInt boxed_b = new BoxedValueInt(b);
BoxedValueInt boxed_fill = new BoxedValueInt(fill);
Bands.compute_theta(ctx, sctx, X, X_ptr, Y, Y_ptr, N, boxed_b, B, B, LM, 1, boxed_fill);
b = boxed_b.Val;
fill = boxed_fill.Val;
inv = sctx.inv;
imid = sctx.imid;
iside = sctx.iside;
int delta = sctx.delta;
int itheta = sctx.itheta;
int qalloc = sctx.qalloc;
mid = imid;
side = iside;
if (N == 2) {
int y2_ptr;
int[] y2;
int x2_ptr;
int[] x2;
int sign = 0;
mbits = b;
sbits = 0;
if (itheta != 0 && itheta != 16384) {
sbits = 8;
}
mbits -= sbits;
boolean c = itheta > 8192;
ctx.remaining_bits -= qalloc + sbits;
if (c) {
x2 = Y;
x2_ptr = Y_ptr;
y2 = X;
y2_ptr = X_ptr;
} else {
x2 = X;
x2_ptr = X_ptr;
y2 = Y;
y2_ptr = Y_ptr;
}
if (sbits != 0) {
if (encode != 0) {
sign = x2[x2_ptr] * y2[Y_ptr + 1] - x2[x2_ptr + 1] * y2[Y_ptr] < 0 ? 1 : 0;
ec.enc_bits(sign, 1);
} else {
sign = ec.dec_bits(1);
}
}
sign = 1 - 2 * sign;
cm = Bands.quant_band(ctx, x2, x2_ptr, N, mbits, B, lowband, lowband_ptr, LM, lowband_out, lowband_out_ptr, Short.MAX_VALUE, lowband_scratch, lowband_scratch_ptr, orig_fill);
y2[Y_ptr] = (0 - sign) * x2[x2_ptr + 1];
y2[Y_ptr + 1] = sign * x2[x2_ptr];
if (resynth) {
X[X_ptr] = Inlines.MULT16_16_Q15(mid, X[X_ptr]);
X[X_ptr + 1] = Inlines.MULT16_16_Q15(mid, X[X_ptr + 1]);
Y[Y_ptr] = Inlines.MULT16_16_Q15(side, Y[Y_ptr]);
Y[Y_ptr + 1] = Inlines.MULT16_16_Q15(side, Y[Y_ptr + 1]);
int tmp = X[X_ptr];
X[X_ptr] = Inlines.SUB16(tmp, Y[Y_ptr]);
Y[Y_ptr] = Inlines.ADD16(tmp, Y[Y_ptr]);
tmp = X[X_ptr + 1];
X[X_ptr + 1] = Inlines.SUB16(tmp, Y[Y_ptr + 1]);
Y[Y_ptr + 1] = Inlines.ADD16(tmp, Y[Y_ptr + 1]);
}
} else {
mbits = Inlines.IMAX(0, Inlines.IMIN(b, (b - delta) / 2));
sbits = b - mbits;
ctx.remaining_bits -= qalloc;
int rebalance = ctx.remaining_bits;
if (mbits >= sbits) {
cm = Bands.quant_band(ctx, X, X_ptr, N, mbits, B, lowband, lowband_ptr, LM, lowband_out, lowband_out_ptr, Short.MAX_VALUE, lowband_scratch, lowband_scratch_ptr, fill);
if ((rebalance = mbits - (rebalance - ctx.remaining_bits)) > 24 && itheta != 0) {
sbits += rebalance - 24;
}
cm |= Bands.quant_band(ctx, Y, Y_ptr, N, sbits, B, null, 0, LM, null, 0, side, null, 0, fill >> B);
} else {
cm = Bands.quant_band(ctx, Y, Y_ptr, N, sbits, B, null, 0, LM, null, 0, side, null, 0, fill >> B);
if ((rebalance = sbits - (rebalance - ctx.remaining_bits)) > 24 && itheta != 16384) {
mbits += rebalance - 24;
}
cm |= Bands.quant_band(ctx, X, X_ptr, N, mbits, B, lowband, lowband_ptr, LM, lowband_out, lowband_out_ptr, Short.MAX_VALUE, lowband_scratch, lowband_scratch_ptr, fill);
}
}
if (resynth) {
if (N != 2) {
Bands.stereo_merge(X, X_ptr, Y, Y_ptr, mid, N);
}
if (inv != 0) {
for (int j = Y_ptr; j < N + Y_ptr; ++j) {
Y[j] = (short)(0 - Y[j]);
}
}
}
return cm;
}
static void quant_all_bands(int encode, CeltMode m, int start, int end, int[] X_, int[] Y_, short[] collapse_masks, int[][] bandE, int[] pulses, int shortBlocks, int spread, int dual_stereo, int intensity, int[] tf_res, int total_bits, int balance, EntropyCoder ec, int LM, int codedBands, BoxedValueInt seed) {
short[] eBands = m.eBands;
boolean update_lowband = true;
int C = Y_ != null ? 2 : 1;
boolean resynth = encode == 0;
band_ctx ctx = new band_ctx();
int M = 1 << LM;
int B = shortBlocks != 0 ? M : 1;
int norm_offset = M * eBands[start];
int[] norm = new int[C * (M * eBands[m.nbEBands - 1] - norm_offset)];
int norm2 = M * eBands[m.nbEBands - 1] - norm_offset;
int[] lowband_scratch = X_;
int lowband_scratch_ptr = M * eBands[m.nbEBands - 1];
int lowband_offset = 0;
ctx.bandE = bandE;
ctx.ec = ec;
ctx.encode = encode;
ctx.intensity = intensity;
ctx.m = m;
ctx.seed = seed.Val;
ctx.spread = spread;
for (int i = start; i < end; ++i) {
long x_cm;
long y_cm;
int b;
int remaining_bits;
int[] Y;
int effective_lowband = -1;
int Y_ptr = 0;
int tf_change = 0;
ctx.i = i;
boolean last = i == end - 1;
int[] X = X_;
int X_ptr = M * eBands[i];
if (Y_ != null) {
Y = Y_;
Y_ptr = M * eBands[i];
} else {
Y = null;
}
int N = M * eBands[i + 1] - M * eBands[i];
int tell = ec.tell_frac();
if (i != start) {
balance -= tell;
}
ctx.remaining_bits = remaining_bits = total_bits - tell - 1;
if (i <= codedBands - 1) {
int curr_balance = Inlines.celt_sudiv(balance, Inlines.IMIN(3, codedBands - i));
b = Inlines.IMAX(0, Inlines.IMIN(16383, Inlines.IMIN(remaining_bits + 1, pulses[i] + curr_balance)));
} else {
b = 0;
}
if (resynth && M * eBands[i] - N >= M * eBands[start] && (update_lowband || lowband_offset == 0)) {
lowband_offset = i;
}
ctx.tf_change = tf_change = tf_res[i];
if (i >= m.effEBands) {
X = norm;
X_ptr = 0;
if (Y_ != null) {
Y = norm;
Y_ptr = 0;
}
lowband_scratch = null;
}
if (i == end - 1) {
lowband_scratch = null;
}
if (lowband_offset != 0 && (spread != 3 || B > 1 || tf_change < 0)) {
effective_lowband = Inlines.IMAX(0, M * eBands[lowband_offset] - norm_offset - N);
int fold_start = lowband_offset;
while (M * eBands[--fold_start] > effective_lowband + norm_offset) {
}
int fold_end = lowband_offset - 1;
while (M * eBands[++fold_end] < effective_lowband + norm_offset + N) {
}
y_cm = 0L;
x_cm = 0L;
int fold_i = fold_start;
do {
x_cm |= (long)collapse_masks[fold_i * C + 0];
y_cm |= (long)collapse_masks[fold_i * C + C - 1];
} while (++fold_i < fold_end);
} else {
x_cm = y_cm = (long)((1 << B) - 1);
}
if (dual_stereo != 0 && i == intensity) {
dual_stereo = 0;
if (resynth) {
for (int j = 0; j < M * eBands[i] - norm_offset; ++j) {
norm[j] = Inlines.HALF32(norm[j] + norm[norm2 + j]);
}
}
}
if (dual_stereo != 0) {
x_cm = Bands.quant_band(ctx, X, X_ptr, N, b / 2, B, (int[])(effective_lowband != -1 ? norm : null), effective_lowband, LM, last ? null : norm, M * eBands[i] - norm_offset, Short.MAX_VALUE, lowband_scratch, lowband_scratch_ptr, (int)x_cm);
y_cm = Bands.quant_band(ctx, Y, Y_ptr, N, b / 2, B, (int[])(effective_lowband != -1 ? norm : null), norm2 + effective_lowband, LM, last ? null : norm, norm2 + (M * eBands[i] - norm_offset), Short.MAX_VALUE, lowband_scratch, lowband_scratch_ptr, (int)y_cm);
} else {
x_cm = Y != null ? (long)Bands.quant_band_stereo(ctx, X, X_ptr, Y, Y_ptr, N, b, B, (int[])(effective_lowband != -1 ? norm : null), effective_lowband, LM, last ? null : norm, M * eBands[i] - norm_offset, lowband_scratch, lowband_scratch_ptr, (int)(x_cm | y_cm)) : (long)Bands.quant_band(ctx, X, X_ptr, N, b, B, (int[])(effective_lowband != -1 ? norm : null), effective_lowband, LM, last ? null : norm, M * eBands[i] - norm_offset, Short.MAX_VALUE, lowband_scratch, lowband_scratch_ptr, (int)(x_cm | y_cm));
y_cm = x_cm;
}
collapse_masks[i * C + 0] = (short)(x_cm & 0xFFL);
collapse_masks[i * C + C - 1] = (short)(y_cm & 0xFFL);
balance += pulses[i] + tell;
update_lowband = b > N << 3;
}
seed.Val = ctx.seed;
}
public static class band_ctx {
public int encode;
public CeltMode m;
public int i;
public int intensity;
public int spread;
public int tf_change;
public EntropyCoder ec;
public int remaining_bits;
public int[][] bandE;
public int seed;
}
public static class split_ctx {
public int inv;
public int imid;
public int iside;
public int delta;
public int itheta;
public int qalloc;
}
}