ref: 1a8bf37dbaa461d410c101d1be302a67b4927035
parent: 37e788c185a98cde764f391f497d5dc76bd0599d
author: Jean-Marc Valin <[email protected]>
date: Wed Mar 16 18:03:15 EDT 2011
Taking into account the start and end bands in CNG
--- a/libcelt/celt.c
+++ b/libcelt/celt.c
@@ -1988,7 +1988,12 @@
VARDECL(celt_norm, X);
VARDECL(celt_ener, bandE);
celt_uint32 seed;
+ int effEnd;
+ effEnd = st->end;
+ if (effEnd > st->mode->effEBands)
+ effEnd = st->mode->effEBands;
+
ALLOC(freq, C*N, celt_sig); /**< Interleaved signal MDCTs */
ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */
ALLOC(bandE, st->mode->nbEBands*C, celt_ener);
@@ -1998,6 +2003,8 @@
seed = st->rng;
for (c=0;c<C;c++)
{
+ for (i=0;i<(st->mode->eBands[st->start]<<LM);i++)
+ X[c*N+i] = 0;
for (i=0;i<st->mode->effEBands;i++)
{
int j;
@@ -2012,11 +2019,24 @@
}
renormalise_vector(X+boffs, blen, Q15ONE);
}
+ for (i=(st->mode->eBands[st->end]<<LM);i<N;i++)
+ X[c*N+i] = 0;
}
st->rng = seed;
denormalise_bands(st->mode, X, freq, bandE, st->mode->effEBands, C, 1<<LM);
+ c=0; do
+ for (i=0;i<st->mode->eBands[st->start]<<LM;i++)
+ freq[c*N+i] = 0;
+ while (++c<C);
+ c=0; do {
+ int bound = st->mode->eBands[effEnd]<<LM;
+ if (st->downsample!=1)
+ bound = IMIN(bound, N/st->downsample);
+ for (i=bound;i<N;i++)
+ freq[c*N+i] = 0;
+ } while (++c<C);
compute_inv_mdcts(st->mode, 0, freq, out_syn, overlap_mem, C, LM);
plc = 0;
} else if (st->loss_count == 0)