Fix stereo for N=2
This commit is contained in:
parent
79b4533846
commit
5f3ad5f985
1 changed files with 24 additions and 9 deletions
|
@ -703,6 +703,14 @@ static void quant_band(int encode, const CELTMode *m, int i, celt_norm *X, celt_
|
||||||
delta = (N-1)*(log2_frac(iside,BITRES+2)-log2_frac(imid,BITRES+2))>>2;
|
delta = (N-1)*(log2_frac(iside,BITRES+2)-log2_frac(imid,BITRES+2))>>2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef FIXED_POINT
|
||||||
|
mid = imid;
|
||||||
|
side = iside;
|
||||||
|
#else
|
||||||
|
mid = (1.f/32768)*imid;
|
||||||
|
side = (1.f/32768)*iside;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* This is a special case for N=2 that only works for stereo and takes
|
/* This is a special case for N=2 that only works for stereo and takes
|
||||||
advantage of the fact that mid and side are orthogonal to encode
|
advantage of the fact that mid and side are orthogonal to encode
|
||||||
the side with just one bit. */
|
the side with just one bit. */
|
||||||
|
@ -737,20 +745,26 @@ static void quant_band(int encode, const CELTMode *m, int i, celt_norm *X, celt_
|
||||||
quant_band(encode, m, i, x2, NULL, N, mbits, spread, B, tf_change, lowband, resynth, ec, remaining_bits, LM, lowband_out, NULL, level+1, seed, gain, lowband_scratch);
|
quant_band(encode, m, i, x2, NULL, N, mbits, spread, B, tf_change, lowband, resynth, ec, remaining_bits, LM, lowband_out, NULL, level+1, seed, gain, lowband_scratch);
|
||||||
y2[0] = -sign*x2[1];
|
y2[0] = -sign*x2[1];
|
||||||
y2[1] = sign*x2[0];
|
y2[1] = sign*x2[0];
|
||||||
|
if (resynth)
|
||||||
|
{
|
||||||
|
celt_norm tmp;
|
||||||
|
X[0] = MULT16_16_Q15(mid, X[0]);
|
||||||
|
X[1] = MULT16_16_Q15(mid, X[1]);
|
||||||
|
Y[0] = MULT16_16_Q15(side, Y[0]);
|
||||||
|
Y[1] = MULT16_16_Q15(side, Y[1]);
|
||||||
|
tmp = X[0];
|
||||||
|
X[0] = SUB16(tmp,Y[0]);
|
||||||
|
Y[0] = ADD16(tmp,Y[0]);
|
||||||
|
tmp = X[1];
|
||||||
|
X[1] = SUB16(tmp,Y[1]);
|
||||||
|
Y[1] = ADD16(tmp,Y[1]);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/* "Normal" split code */
|
/* "Normal" split code */
|
||||||
celt_norm *next_lowband2=NULL;
|
celt_norm *next_lowband2=NULL;
|
||||||
celt_norm *next_lowband_out1=NULL;
|
celt_norm *next_lowband_out1=NULL;
|
||||||
int next_level=0;
|
int next_level=0;
|
||||||
|
|
||||||
#ifdef FIXED_POINT
|
|
||||||
mid = imid;
|
|
||||||
side = iside;
|
|
||||||
#else
|
|
||||||
mid = (1.f/32768)*imid;
|
|
||||||
side = (1.f/32768)*iside;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Give more bits to low-energy MDCTs than they would otherwise deserve */
|
/* Give more bits to low-energy MDCTs than they would otherwise deserve */
|
||||||
if (B>1 && !stereo)
|
if (B>1 && !stereo)
|
||||||
delta >>= 1;
|
delta >>= 1;
|
||||||
|
@ -808,7 +822,8 @@ static void quant_band(int encode, const CELTMode *m, int i, celt_norm *X, celt_
|
||||||
{
|
{
|
||||||
if (stereo)
|
if (stereo)
|
||||||
{
|
{
|
||||||
stereo_merge(X, Y, mid, side, N);
|
if (N!=2)
|
||||||
|
stereo_merge(X, Y, mid, side, N);
|
||||||
} else if (level == 0)
|
} else if (level == 0)
|
||||||
{
|
{
|
||||||
int k;
|
int k;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue