diff options
author | Jean-Marc Valin <Jean-Marc.Valin@csiro.au> | 2008-02-11 07:33:53 +0300 |
---|---|---|
committer | Jean-Marc Valin <Jean-Marc.Valin@csiro.au> | 2008-02-11 07:33:53 +0300 |
commit | 0e20ca096970ae9c515a35ae72fd637219241cf5 (patch) | |
tree | cf8de5477cf1d31786696e8aa8e9ddf0aa8df16a /libcelt/bands.c | |
parent | 8f0f4b942166bf9385319fdbbde390e5a21e0f6a (diff) |
Enabling "plain folding" in case we don't even have enough bits for intra-frame
prediction
Diffstat (limited to 'libcelt/bands.c')
-rw-r--r-- | libcelt/bands.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/libcelt/bands.c b/libcelt/bands.c index 599e7fb..c7ffc10 100644 --- a/libcelt/bands.c +++ b/libcelt/bands.c @@ -259,10 +259,16 @@ void quant_bands(const CELTMode *m, float *X, float *P, float *W, struct alloc_d theta = .007*(B*(eBands[i+1]-eBands[i]))/(.1f+abs(q)); /* If pitch isn't available, use intra-frame prediction */ - if (eBands[i] >= m->pitchEnd) - intra_prediction(X+B*eBands[i], W+B*eBands[i], B*(eBands[i+1]-eBands[i]), q, norm, P+B*eBands[i], B, eBands[i], enc); - - if (q != 0) + if (eBands[i] >= m->pitchEnd || q<=0) + { + q -= 1; + if (q<0) + intra_fold(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), q, norm, P+B*eBands[i], B, eBands[i]); + else + intra_prediction(X+B*eBands[i], W+B*eBands[i], B*(eBands[i+1]-eBands[i]), q, norm, P+B*eBands[i], B, eBands[i], enc); + } + + if (q > 0) { exp_rotation(P+B*eBands[i], B*(eBands[i+1]-eBands[i]), theta, -1, B, 8); exp_rotation(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), theta, -1, B, 8); @@ -305,10 +311,16 @@ void unquant_bands(const CELTMode *m, float *X, float *P, struct alloc_data *all theta = .007*(B*(eBands[i+1]-eBands[i]))/(.1f+abs(q)); /* If pitch isn't available, use intra-frame prediction */ - if (eBands[i] >= m->pitchEnd) - intra_unquant(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), q, norm, P+B*eBands[i], B, eBands[i], dec); - - if (q != 0) + if (eBands[i] >= m->pitchEnd || q<=0) + { + q -= 1; + if (q<0) + intra_fold(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), q, norm, P+B*eBands[i], B, eBands[i]); + else + intra_unquant(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), q, norm, P+B*eBands[i], B, eBands[i], dec); + } + + if (q > 0) { exp_rotation(P+B*eBands[i], B*(eBands[i+1]-eBands[i]), theta, -1, B, 8); alg_unquant(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), q, P+B*eBands[i], 0.7, dec); |