Stereo decoding working again (fixed a few issues in the encoder at the same
[opus.git] / libcelt / quant_bands.c
1 /* (C) 2007 Jean-Marc Valin, CSIRO
2 */
3 /*
4    Redistribution and use in source and binary forms, with or without
5    modification, are permitted provided that the following conditions
6    are met:
7    
8    - Redistributions of source code must retain the above copyright
9    notice, this list of conditions and the following disclaimer.
10    
11    - Redistributions in binary form must reproduce the above copyright
12    notice, this list of conditions and the following disclaimer in the
13    documentation and/or other materials provided with the distribution.
14    
15    - Neither the name of the Xiph.org Foundation nor the names of its
16    contributors may be used to endorse or promote products derived from
17    this software without specific prior written permission.
18    
19    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22    A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
23    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32
33 #include "quant_bands.h"
34 #include "laplace.h"
35 #include <math.h>
36 #include "os_support.h"
37
38 static void quant_energy_mono(const CELTMode *m, float *eBands, float *oldEBands, ec_enc *enc)
39 {
40    int i;
41    float prev = 0;
42    for (i=0;i<m->nbEBands;i++)
43    {
44       int qi;
45       float q;
46       float res;
47       float x;
48       float pred = m->ePredCoef*oldEBands[i]+m->eMeans[i];
49       
50       x = 20*log10(.3+eBands[i]);
51       res = .25f*(i+3.f);
52       //res = 1;
53       qi = (int)floor(.5+(x-pred-prev)/res);
54       ec_laplace_encode(enc, qi, m->eDecay[i]);
55       q = qi*res;
56       
57       //printf("%d ", qi);
58       //printf("%f %f ", pred+prev+q, x);
59       //printf("%f ", x-pred);
60       
61       oldEBands[i] = pred+prev+q;
62       eBands[i] = pow(10, .05*oldEBands[i])-.3;
63       if (eBands[i] < 0)
64          eBands[i] = 0;
65       prev = (prev + .5*q);
66    }
67    //printf ("\n");
68 }
69
70 void quant_energy(const CELTMode *m, float *eBands, float *oldEBands, ec_enc *enc)
71 {
72    int C;
73    
74    C = m->nbChannels;
75
76    if (C==1)
77       quant_energy_mono(m, eBands, oldEBands, enc);
78    else 
79 #if 1
80    {
81       int c;
82       for (c=0;c<C;c++)
83       {
84          int i;
85          float E[m->nbEBands];
86          for (i=0;i<m->nbEBands;i++)
87             E[i] = eBands[C*i+c];
88          quant_energy_mono(m, E, oldEBands+c*m->nbEBands, enc);
89          for (i=0;i<m->nbEBands;i++)
90             eBands[C*i+c] = E[i];
91       }
92    }
93 #else
94       if (C==2)
95    {
96       int i;
97       int NB = m->nbEBands;
98       float mid[NB];
99       float side[NB];
100       float left;
101       float right;
102       for (i=0;i<NB;i++)
103       {
104          //left = eBands[C*i];
105          //right = eBands[C*i+1];
106          mid[i] = sqrt(eBands[C*i]*eBands[C*i] + eBands[C*i+1]*eBands[C*i+1]);
107          side[i] = 20*log10((eBands[2*i]+.3)/(eBands[2*i+1]+.3));
108          //printf ("%f %f ", mid[i], side[i]);
109       }
110       //printf ("\n");
111       quant_energy_mono(m, mid, oldEBands, enc);
112       for (i=0;i<NB;i++)
113          side[i] = pow(10.f,floor(.5f+side[i])/10.f);
114          
115       //quant_energy_side(m, side, oldEBands+NB, enc);
116       for (i=0;i<NB;i++)
117       {
118          eBands[C*i] = mid[i]*sqrt(side[i]/(1.f+side[i]));
119          eBands[C*i+1] = mid[i]*sqrt(1.f/(1.f+side[i]));
120          //printf ("%f %f ", mid[i], side[i]);
121       }
122
123    } else {
124       celt_fatal("more than 2 channels not supported");
125    }
126 #endif
127 }
128
129
130 static void unquant_energy_mono(const CELTMode *m, float *eBands, float *oldEBands, ec_dec *dec)
131 {
132    int i;
133    float prev = 0;
134    for (i=0;i<m->nbEBands;i++)
135    {
136       int qi;
137       float q;
138       float res;
139       float pred = m->ePredCoef*oldEBands[i]+m->eMeans[i];
140       
141       res = .25f*(i+3.f);
142       qi = ec_laplace_decode(dec, m->eDecay[i]);
143       q = qi*res;
144       //printf("%f %f ", pred+prev+q, x);
145       //printf("%d ", qi);
146       //printf("%f ", x-pred-prev);
147       
148       oldEBands[i] = pred+prev+q;
149       eBands[i] = pow(10, .05*oldEBands[i])-.3;
150       if (eBands[i] < 0)
151          eBands[i] = 0;
152       prev = (prev + .5*q);
153    }
154    //printf ("\n");
155 }
156
157 void unquant_energy(const CELTMode *m, float *eBands, float *oldEBands, ec_dec *dec)
158 {
159    int C;   
160    C = m->nbChannels;
161
162    if (C==1)
163       unquant_energy_mono(m, eBands, oldEBands, dec);
164    else {
165       int c;
166       for (c=0;c<C;c++)
167       {
168          int i;
169          float E[m->nbEBands];
170          unquant_energy_mono(m, E, oldEBands+c*m->nbEBands, dec);
171          for (i=0;i<m->nbEBands;i++)
172             eBands[C*i+c] = E[i];
173       }
174    }
175 }