Making stereo code a bit more generic
This commit is contained in:
parent
06073824a5
commit
80e56f1a2e
1 changed files with 137 additions and 122 deletions
259
libcelt/bands.c
259
libcelt/bands.c
|
@ -465,24 +465,144 @@ void quant_band(const CELTMode *m, int i, celt_norm *X, int N, int bits, int spr
|
||||||
alg_quant(X, N, q, spread, lowband, resynth, enc);
|
alg_quant(X, N, q, spread, lowband, resynth, enc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void unquant_band(const CELTMode *m, int i, celt_norm *X, int N, int bits,
|
void unquant_band(const CELTMode *m, int i, celt_norm *X, celt_norm *Y, int N, int b,
|
||||||
int spread, celt_norm *lowband, ec_dec *dec,
|
int spread, celt_norm *lowband, ec_dec *dec,
|
||||||
celt_int32 *remaining_bits, int LM)
|
celt_int32 *remaining_bits, int LM, celt_norm *lowband_out)
|
||||||
{
|
{
|
||||||
int q;
|
int q;
|
||||||
int curr_bits;
|
int curr_bits;
|
||||||
|
int stereo;
|
||||||
|
int imid=0, iside=0;
|
||||||
|
|
||||||
q = bits2pulses(m, m->bits[LM][i], N, bits);
|
stereo = Y != NULL;
|
||||||
curr_bits = pulses2bits(m->bits[LM][i], N, q);
|
|
||||||
*remaining_bits -= curr_bits;
|
if (stereo)
|
||||||
while (*remaining_bits < 0 && q > 0)
|
|
||||||
{
|
{
|
||||||
*remaining_bits += curr_bits;
|
int itheta;
|
||||||
q--;
|
int mbits, sbits, delta;
|
||||||
|
int qalloc, qb;
|
||||||
|
qb = (b-2*(N-1)*(QTHETA_OFFSET-m->logN[i]-(LM<<BITRES)))/(32*(N-1));
|
||||||
|
if (qb > (b>>BITRES)-1)
|
||||||
|
qb = (b>>BITRES)-1;
|
||||||
|
if (qb>14)
|
||||||
|
qb = 14;
|
||||||
|
if (qb<0)
|
||||||
|
qb = 0;
|
||||||
|
qalloc = log2_frac((1<<qb)+1,BITRES);
|
||||||
|
if (qb==0)
|
||||||
|
{
|
||||||
|
itheta=0;
|
||||||
|
} else {
|
||||||
|
int shift;
|
||||||
|
shift = 14-qb;
|
||||||
|
itheta = ec_dec_uint(dec, (1<<qb)+1);
|
||||||
|
itheta <<= shift;
|
||||||
|
}
|
||||||
|
if (itheta == 0)
|
||||||
|
{
|
||||||
|
imid = 32767;
|
||||||
|
iside = 0;
|
||||||
|
delta = -10000;
|
||||||
|
} else if (itheta == 16384)
|
||||||
|
{
|
||||||
|
imid = 0;
|
||||||
|
iside = 32767;
|
||||||
|
delta = 10000;
|
||||||
|
} else {
|
||||||
|
imid = bitexact_cos(itheta);
|
||||||
|
iside = bitexact_cos(16384-itheta);
|
||||||
|
delta = (N-1)*(log2_frac(iside,BITRES+2)-log2_frac(imid,BITRES+2))>>2;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
if (N==2)
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
int sign=1;
|
||||||
|
celt_norm v[2], w[2];
|
||||||
|
celt_norm *x2, *y2;
|
||||||
|
mbits = b-qalloc;
|
||||||
|
sbits = 0;
|
||||||
|
if (itheta != 0 && itheta != 16384)
|
||||||
|
sbits = 1<<BITRES;
|
||||||
|
mbits -= sbits;
|
||||||
|
c = itheta > 8192 ? 1 : 0;
|
||||||
|
|
||||||
|
x2 = X;
|
||||||
|
y2 = Y;
|
||||||
|
*remaining_bits -= qalloc+sbits;
|
||||||
|
unquant_band(m, i, v, NULL, N, mbits, spread, lowband, dec, remaining_bits, LM, lowband_out);
|
||||||
|
if (sbits)
|
||||||
|
sign = 2*ec_dec_bits(dec, 1)-1;
|
||||||
|
else
|
||||||
|
sign = 1;
|
||||||
|
w[0] = -sign*v[1];
|
||||||
|
w[1] = sign*v[0];
|
||||||
|
if (c==0)
|
||||||
|
{
|
||||||
|
x2[0] = v[0];
|
||||||
|
x2[1] = v[1];
|
||||||
|
y2[0] = w[0];
|
||||||
|
y2[1] = w[1];
|
||||||
|
} else {
|
||||||
|
x2[0] = w[0];
|
||||||
|
x2[1] = w[1];
|
||||||
|
y2[0] = v[0];
|
||||||
|
y2[1] = v[1];
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
mbits = (b-qalloc/2-delta)/2;
|
||||||
|
if (mbits > b-qalloc)
|
||||||
|
mbits = b-qalloc;
|
||||||
|
if (mbits<0)
|
||||||
|
mbits=0;
|
||||||
|
sbits = b-qalloc-mbits;
|
||||||
|
*remaining_bits -= qalloc;
|
||||||
|
unquant_band(m, i, X, NULL, N, mbits, spread, lowband, dec, remaining_bits, LM, lowband_out);
|
||||||
|
unquant_band(m, i, Y, NULL, N, sbits, spread, NULL, dec, remaining_bits, LM, NULL);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
q = bits2pulses(m, m->bits[LM][i], N, b);
|
||||||
curr_bits = pulses2bits(m->bits[LM][i], N, q);
|
curr_bits = pulses2bits(m->bits[LM][i], N, q);
|
||||||
*remaining_bits -= curr_bits;
|
*remaining_bits -= curr_bits;
|
||||||
|
while (*remaining_bits < 0 && q > 0)
|
||||||
|
{
|
||||||
|
*remaining_bits += curr_bits;
|
||||||
|
q--;
|
||||||
|
curr_bits = pulses2bits(m->bits[LM][i], N, q);
|
||||||
|
*remaining_bits -= curr_bits;
|
||||||
|
}
|
||||||
|
alg_unquant(X, N, q, spread, lowband, dec);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lowband_out)
|
||||||
|
{
|
||||||
|
celt_word16 n;
|
||||||
|
int j;
|
||||||
|
n = celt_sqrt(SHL32(EXTEND32(N),22));
|
||||||
|
for (j=0;j<N;j++)
|
||||||
|
lowband_out[j] = MULT16_16_Q15(n,X[j]);
|
||||||
|
}
|
||||||
|
if (stereo)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
celt_word16 mid, side;
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
mid = imid;
|
||||||
|
side = iside;
|
||||||
|
#else
|
||||||
|
mid = (1.f/32768)*imid;
|
||||||
|
side = (1.f/32768)*iside;
|
||||||
|
#endif
|
||||||
|
for (j=0;j<N;j++)
|
||||||
|
X[j] = MULT16_16_Q15(X[j], mid);
|
||||||
|
for (j=0;j<N;j++)
|
||||||
|
Y[j] = MULT16_16_Q15(Y[j], side);
|
||||||
|
|
||||||
}
|
}
|
||||||
alg_unquant(X, N, q, spread, lowband, dec);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Quantisation of the residual */
|
/* Quantisation of the residual */
|
||||||
|
@ -524,7 +644,7 @@ void quant_all_bands(const CELTMode *m, int start, celt_norm * restrict X, const
|
||||||
curr_balance = 3;
|
curr_balance = 3;
|
||||||
curr_balance = balance / curr_balance;
|
curr_balance = balance / curr_balance;
|
||||||
|
|
||||||
quant_band(m, i, X+M*eBands[i], N, pulses[i]+curr_balance, spread, norm+eBands[start], resynth, enc, &remaining_bits, LM);
|
quant_band(m, i, X+M*eBands[i], N, pulses[i]+curr_balance, spread, norm+M*eBands[start], resynth, enc, &remaining_bits, LM);
|
||||||
|
|
||||||
balance += pulses[i] + tell;
|
balance += pulses[i] + tell;
|
||||||
if (resynth)
|
if (resynth)
|
||||||
|
@ -541,7 +661,7 @@ void quant_all_bands(const CELTMode *m, int start, celt_norm * restrict X, const
|
||||||
/* Decoding of the residual */
|
/* Decoding of the residual */
|
||||||
void unquant_all_bands(const CELTMode *m, int start, celt_norm * restrict X, const celt_ener *bandE, int *pulses, int shortBlocks, int fold, int total_bits, int encode, ec_dec *dec, int LM)
|
void unquant_all_bands(const CELTMode *m, int start, celt_norm * restrict X, const celt_ener *bandE, int *pulses, int shortBlocks, int fold, int total_bits, int encode, ec_dec *dec, int LM)
|
||||||
{
|
{
|
||||||
int i, j, remaining_bits, balance;
|
int i, remaining_bits, balance;
|
||||||
const celt_int16 * restrict eBands = m->eBands;
|
const celt_int16 * restrict eBands = m->eBands;
|
||||||
celt_norm * restrict norm;
|
celt_norm * restrict norm;
|
||||||
VARDECL(celt_norm, _norm);
|
VARDECL(celt_norm, _norm);
|
||||||
|
@ -563,7 +683,6 @@ void unquant_all_bands(const CELTMode *m, int start, celt_norm * restrict X, con
|
||||||
for (i=start;i<m->nbEBands;i++)
|
for (i=start;i<m->nbEBands;i++)
|
||||||
{
|
{
|
||||||
int tell;
|
int tell;
|
||||||
celt_word16 n;
|
|
||||||
int N;
|
int N;
|
||||||
int curr_balance;
|
int curr_balance;
|
||||||
|
|
||||||
|
@ -578,12 +697,9 @@ void unquant_all_bands(const CELTMode *m, int start, celt_norm * restrict X, con
|
||||||
curr_balance = 3;
|
curr_balance = 3;
|
||||||
curr_balance = balance / curr_balance;
|
curr_balance = balance / curr_balance;
|
||||||
|
|
||||||
unquant_band(m, i, X+M*eBands[i], N, pulses[i]+curr_balance, spread, norm+eBands[start], dec, &remaining_bits, LM);
|
unquant_band(m, i, X+M*eBands[i], NULL, N, pulses[i]+curr_balance, spread, norm+M*eBands[start], dec, &remaining_bits, LM, norm+M*eBands[i]);
|
||||||
|
|
||||||
balance += pulses[i] + tell;
|
balance += pulses[i] + tell;
|
||||||
n = celt_sqrt(SHL32(EXTEND32(N),22));
|
|
||||||
for (j=M*eBands[i];j<M*eBands[i+1];j++)
|
|
||||||
norm[j] = MULT16_16_Q15(n,X[j]);
|
|
||||||
}
|
}
|
||||||
RESTORE_STACK;
|
RESTORE_STACK;
|
||||||
}
|
}
|
||||||
|
@ -713,7 +829,7 @@ void quant_bands_stereo(const CELTMode *m, int start, celt_norm *_X, const celt_
|
||||||
w[1] = x2[1];
|
w[1] = x2[1];
|
||||||
}
|
}
|
||||||
remaining_bits -= qalloc+sbits;
|
remaining_bits -= qalloc+sbits;
|
||||||
quant_band(m, i, v, N, mbits, spread, norm+eBands[start], resynth, enc, &remaining_bits, LM);
|
quant_band(m, i, v, N, mbits, spread, norm+M*eBands[start], resynth, enc, &remaining_bits, LM);
|
||||||
if (sbits)
|
if (sbits)
|
||||||
{
|
{
|
||||||
if (v[0]*w[1] - v[1]*w[0] > 0)
|
if (v[0]*w[1] - v[1]*w[0] > 0)
|
||||||
|
@ -749,7 +865,7 @@ void quant_bands_stereo(const CELTMode *m, int start, celt_norm *_X, const celt_
|
||||||
mbits=0;
|
mbits=0;
|
||||||
sbits = b-qalloc-mbits;
|
sbits = b-qalloc-mbits;
|
||||||
remaining_bits -= qalloc;
|
remaining_bits -= qalloc;
|
||||||
quant_band(m, i, X, N, mbits, spread, norm+eBands[start], resynth, enc, &remaining_bits, LM);
|
quant_band(m, i, X, N, mbits, spread, norm+M*eBands[start], resynth, enc, &remaining_bits, LM);
|
||||||
quant_band(m, i, Y, N, sbits, spread, NULL, resynth, enc, &remaining_bits, LM);
|
quant_band(m, i, Y, N, sbits, spread, NULL, resynth, enc, &remaining_bits, LM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -788,12 +904,11 @@ void quant_bands_stereo(const CELTMode *m, int start, celt_norm *_X, const celt_
|
||||||
|
|
||||||
void unquant_bands_stereo(const CELTMode *m, int start, celt_norm *_X, const celt_ener *bandE, int *pulses, int shortBlocks, int fold, int total_bits, ec_dec *dec, int LM)
|
void unquant_bands_stereo(const CELTMode *m, int start, celt_norm *_X, const celt_ener *bandE, int *pulses, int shortBlocks, int fold, int total_bits, ec_dec *dec, int LM)
|
||||||
{
|
{
|
||||||
int i, j, remaining_bits, balance;
|
int i, remaining_bits, balance;
|
||||||
const celt_int16 * restrict eBands = m->eBands;
|
const celt_int16 * restrict eBands = m->eBands;
|
||||||
celt_norm * restrict norm;
|
celt_norm * restrict norm;
|
||||||
VARDECL(celt_norm, _norm);
|
VARDECL(celt_norm, _norm);
|
||||||
int B;
|
int B;
|
||||||
celt_word16 mid, side;
|
|
||||||
int M;
|
int M;
|
||||||
int spread;
|
int spread;
|
||||||
SAVE_STACK;
|
SAVE_STACK;
|
||||||
|
@ -811,13 +926,9 @@ void unquant_bands_stereo(const CELTMode *m, int start, celt_norm *_X, const cel
|
||||||
for (i=start;i<m->nbEBands;i++)
|
for (i=start;i<m->nbEBands;i++)
|
||||||
{
|
{
|
||||||
int tell;
|
int tell;
|
||||||
celt_word16 n;
|
int b;
|
||||||
int b, qb;
|
|
||||||
int N;
|
int N;
|
||||||
int curr_balance;
|
int curr_balance;
|
||||||
int imid, iside, itheta;
|
|
||||||
int mbits, sbits, delta;
|
|
||||||
int qalloc;
|
|
||||||
celt_norm * restrict X, * restrict Y;
|
celt_norm * restrict X, * restrict Y;
|
||||||
|
|
||||||
X = _X+M*eBands[i];
|
X = _X+M*eBands[i];
|
||||||
|
@ -836,106 +947,10 @@ void unquant_bands_stereo(const CELTMode *m, int start, celt_norm *_X, const cel
|
||||||
if (b<0)
|
if (b<0)
|
||||||
b = 0;
|
b = 0;
|
||||||
|
|
||||||
qb = (b-2*(N-1)*(QTHETA_OFFSET-m->logN[i]-(LM<<BITRES)))/(32*(N-1));
|
unquant_band(m, i, X, Y, N, b, spread, norm+M*eBands[start], dec, &remaining_bits, LM, norm+M*eBands[i]);
|
||||||
if (qb > (b>>BITRES)-1)
|
|
||||||
qb = (b>>BITRES)-1;
|
|
||||||
if (qb>14)
|
|
||||||
qb = 14;
|
|
||||||
if (qb<0)
|
|
||||||
qb = 0;
|
|
||||||
qalloc = log2_frac((1<<qb)+1,BITRES);
|
|
||||||
if (qb==0)
|
|
||||||
{
|
|
||||||
itheta=0;
|
|
||||||
} else {
|
|
||||||
int shift;
|
|
||||||
shift = 14-qb;
|
|
||||||
itheta = ec_dec_uint(dec, (1<<qb)+1);
|
|
||||||
itheta <<= shift;
|
|
||||||
}
|
|
||||||
if (itheta == 0)
|
|
||||||
{
|
|
||||||
imid = 32767;
|
|
||||||
iside = 0;
|
|
||||||
delta = -10000;
|
|
||||||
} else if (itheta == 16384)
|
|
||||||
{
|
|
||||||
imid = 0;
|
|
||||||
iside = 32767;
|
|
||||||
delta = 10000;
|
|
||||||
} else {
|
|
||||||
imid = bitexact_cos(itheta);
|
|
||||||
iside = bitexact_cos(16384-itheta);
|
|
||||||
delta = (N-1)*(log2_frac(iside,BITRES+2)-log2_frac(imid,BITRES+2))>>2;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 1
|
|
||||||
if (N==2)
|
|
||||||
{
|
|
||||||
int c;
|
|
||||||
int sign=1;
|
|
||||||
celt_norm v[2], w[2];
|
|
||||||
celt_norm *x2, *y2;
|
|
||||||
mbits = b-qalloc;
|
|
||||||
sbits = 0;
|
|
||||||
if (itheta != 0 && itheta != 16384)
|
|
||||||
sbits = 1<<BITRES;
|
|
||||||
mbits -= sbits;
|
|
||||||
c = itheta > 8192 ? 1 : 0;
|
|
||||||
|
|
||||||
x2 = X;
|
|
||||||
y2 = Y;
|
|
||||||
remaining_bits -= qalloc+sbits;
|
|
||||||
unquant_band(m, i, v, N, mbits, spread, norm+eBands[start], dec, &remaining_bits, LM);
|
|
||||||
if (sbits)
|
|
||||||
sign = 2*ec_dec_bits(dec, 1)-1;
|
|
||||||
else
|
|
||||||
sign = 1;
|
|
||||||
w[0] = -sign*v[1];
|
|
||||||
w[1] = sign*v[0];
|
|
||||||
if (c==0)
|
|
||||||
{
|
|
||||||
x2[0] = v[0];
|
|
||||||
x2[1] = v[1];
|
|
||||||
y2[0] = w[0];
|
|
||||||
y2[1] = w[1];
|
|
||||||
} else {
|
|
||||||
x2[0] = w[0];
|
|
||||||
x2[1] = w[1];
|
|
||||||
y2[0] = v[0];
|
|
||||||
y2[1] = v[1];
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
mbits = (b-qalloc/2-delta)/2;
|
|
||||||
if (mbits > b-qalloc)
|
|
||||||
mbits = b-qalloc;
|
|
||||||
if (mbits<0)
|
|
||||||
mbits=0;
|
|
||||||
sbits = b-qalloc-mbits;
|
|
||||||
remaining_bits -= qalloc;
|
|
||||||
unquant_band(m, i, X, N, mbits, spread, norm+eBands[start], dec, &remaining_bits, LM);
|
|
||||||
unquant_band(m, i, Y, N, sbits, spread, NULL, dec, &remaining_bits, LM);
|
|
||||||
}
|
|
||||||
balance += pulses[i] + tell;
|
balance += pulses[i] + tell;
|
||||||
|
|
||||||
#ifdef FIXED_POINT
|
|
||||||
mid = imid;
|
|
||||||
side = iside;
|
|
||||||
#else
|
|
||||||
mid = (1.f/32768)*imid;
|
|
||||||
side = (1.f/32768)*iside;
|
|
||||||
#endif
|
|
||||||
n = celt_sqrt(SHL32(EXTEND32(N),22));
|
|
||||||
for (j=0;j<N;j++)
|
|
||||||
norm[M*eBands[i]+j] = MULT16_16_Q15(n,X[j]);
|
|
||||||
|
|
||||||
for (j=0;j<N;j++)
|
|
||||||
X[j] = MULT16_16_Q15(X[j], mid);
|
|
||||||
for (j=0;j<N;j++)
|
|
||||||
Y[j] = MULT16_16_Q15(Y[j], side);
|
|
||||||
|
|
||||||
stereo_band_mix(m, X, Y, bandE, 0, i, -1, M);
|
stereo_band_mix(m, X, Y, bandE, 0, i, -1, M);
|
||||||
renormalise_vector(X, Q15ONE, N, 1);
|
renormalise_vector(X, Q15ONE, N, 1);
|
||||||
renormalise_vector(Y, Q15ONE, N, 1);
|
renormalise_vector(Y, Q15ONE, N, 1);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue