diff options
author | Jean-Marc Valin <jean-marc.valin@usherbrooke.ca> | 2011-03-17 05:03:15 +0300 |
---|---|---|
committer | Jean-Marc Valin <jean-marc.valin@usherbrooke.ca> | 2011-03-17 05:03:15 +0300 |
commit | 1a8bf37dbaa461d410c101d1be302a67b4927035 (patch) | |
tree | 4aaa13fa08e5cbb578f4a809e3e64fcf257fa36a | |
parent | 37e788c185a98cde764f391f497d5dc76bd0599d (diff) |
Taking into account the start and end bands in CNG
-rw-r--r-- | libcelt/celt.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/libcelt/celt.c b/libcelt/celt.c index a0ac059..b6711ae 100644 --- a/libcelt/celt.c +++ b/libcelt/celt.c @@ -1988,6 +1988,11 @@ static void celt_decode_lost(CELTDecoder * restrict st, celt_word16 * restrict p 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 */ @@ -1998,6 +2003,8 @@ static void celt_decode_lost(CELTDecoder * restrict st, celt_word16 * restrict p 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 @@ static void celt_decode_lost(CELTDecoder * restrict st, celt_word16 * restrict p } 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) |