Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/quite/celt.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Marc Valin <Jean-Marc.Valin@csiro.au>2008-02-11 07:33:53 +0300
committerJean-Marc Valin <Jean-Marc.Valin@csiro.au>2008-02-11 07:33:53 +0300
commit0e20ca096970ae9c515a35ae72fd637219241cf5 (patch)
treecf8de5477cf1d31786696e8aa8e9ddf0aa8df16a /libcelt/bands.c
parent8f0f4b942166bf9385319fdbbde390e5a21e0f6a (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.c28
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);