blob: a2b7a9844f2b5a05bd0c85df5414d9d1624d90e9 [file] [log] [blame]
Jean-Marc Valin33ddd792008-01-14 17:39:01 +11001/* (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
Jean-Marc Valin02fa9132008-02-20 12:09:29 +110032#ifdef HAVE_CONFIG_H
33#include "config.h"
34#endif
35
Jean-Marc Valin33ddd792008-01-14 17:39:01 +110036#include <math.h>
37#include "modes.h"
38#include "cwrs.h"
39#include "arch.h"
Jean-Marc Valina6631742008-01-16 17:16:04 +110040#include "os_support.h"
Jean-Marc Valin33ddd792008-01-14 17:39:01 +110041
42#include "entcode.h"
Jean-Marc Valinf51ca492008-01-17 10:58:38 +110043#include "rate.h"
Jean-Marc Valin33ddd792008-01-14 17:39:01 +110044
Jean-Marc Valina6631742008-01-16 17:16:04 +110045#define BITRES 4
Jean-Marc Valinc6b43902008-01-16 22:04:17 +110046#define BITROUND 8
Jean-Marc Valinf51ca492008-01-17 10:58:38 +110047#define BITOVERFLOW 10000
Jean-Marc Valina6631742008-01-16 17:16:04 +110048
Jean-Marc Valinc6b43902008-01-16 22:04:17 +110049#define MAX_PULSES 64
50
Jean-Marc Valin25358cd2008-02-19 12:21:32 +110051static int log2_frac(ec_uint32 val, int frac)
Jean-Marc Valin33ddd792008-01-14 17:39:01 +110052{
53 int i;
54 /* EC_ILOG() actually returns log2()+1, go figure */
55 int L = EC_ILOG(val)-1;
Jean-Marc Valina85657b2008-02-20 11:59:30 +110056 /*printf ("in: %d %d ", val, L);*/
Jean-Marc Valin33ddd792008-01-14 17:39:01 +110057 if (L>14)
58 val >>= L-14;
59 else if (L<14)
60 val <<= 14-L;
61 L <<= frac;
Jean-Marc Valina85657b2008-02-20 11:59:30 +110062 /*printf ("%d\n", val);*/
Jean-Marc Valin33ddd792008-01-14 17:39:01 +110063 for (i=0;i<frac;i++)
64 {
65 val = (val*val) >> 15;
Jean-Marc Valina85657b2008-02-20 11:59:30 +110066 /*printf ("%d\n", val);*/
Jean-Marc Valin33ddd792008-01-14 17:39:01 +110067 if (val > 16384)
68 L |= (1<<(frac-i-1));
69 else
70 val <<= 1;
71 }
72 return L;
73}
74
Jean-Marc Valin25358cd2008-02-19 12:21:32 +110075static int log2_frac64(ec_uint64 val, int frac)
Jean-Marc Valin33ddd792008-01-14 17:39:01 +110076{
77 int i;
78 /* EC_ILOG64() actually returns log2()+1, go figure */
79 int L = EC_ILOG64(val)-1;
Jean-Marc Valina85657b2008-02-20 11:59:30 +110080 /*printf ("in: %d %d ", val, L);*/
Jean-Marc Valin33ddd792008-01-14 17:39:01 +110081 if (L>14)
82 val >>= L-14;
83 else if (L<14)
84 val <<= 14-L;
85 L <<= frac;
Jean-Marc Valina85657b2008-02-20 11:59:30 +110086 /*printf ("%d\n", val);*/
Jean-Marc Valin33ddd792008-01-14 17:39:01 +110087 for (i=0;i<frac;i++)
88 {
89 val = (val*val) >> 15;
Jean-Marc Valina85657b2008-02-20 11:59:30 +110090 /*printf ("%d\n", val);*/
Jean-Marc Valin33ddd792008-01-14 17:39:01 +110091 if (val > 16384)
92 L |= (1<<(frac-i-1));
93 else
94 val <<= 1;
95 }
96 return L;
97}
98
Jean-Marc Valin25358cd2008-02-19 12:21:32 +110099void compute_alloc_cache(CELTMode *m)
Jean-Marc Valina6631742008-01-16 17:16:04 +1100100{
101 int i, prevN, BC;
Jean-Marc Valin25358cd2008-02-19 12:21:32 +1100102 int **bits;
Jean-Marc Valina6631742008-01-16 17:16:04 +1100103 const int *eBands = m->eBands;
Jean-Marc Valin25358cd2008-02-19 12:21:32 +1100104
105 bits = celt_alloc(m->nbEBands*sizeof(int*));
Jean-Marc Valinc6b43902008-01-16 22:04:17 +1100106
Jean-Marc Valina6631742008-01-16 17:16:04 +1100107 BC = m->nbMdctBlocks*m->nbChannels;
108 prevN = -1;
Jean-Marc Valin25358cd2008-02-19 12:21:32 +1100109 for (i=0;i<m->nbEBands;i++)
Jean-Marc Valina6631742008-01-16 17:16:04 +1100110 {
111 int N = BC*(eBands[i+1]-eBands[i]);
Jean-Marc Valin01240772008-02-07 21:14:16 +1100112 if (N == prevN && eBands[i] < m->pitchEnd)
Jean-Marc Valina6631742008-01-16 17:16:04 +1100113 {
Jean-Marc Valin25358cd2008-02-19 12:21:32 +1100114 bits[i] = bits[i-1];
Jean-Marc Valina6631742008-01-16 17:16:04 +1100115 } else {
116 int j;
117 /* FIXME: We could save memory here */
Jean-Marc Valin25358cd2008-02-19 12:21:32 +1100118 bits[i] = celt_alloc(MAX_PULSES*sizeof(int));
Jean-Marc Valinc6b43902008-01-16 22:04:17 +1100119 for (j=0;j<MAX_PULSES;j++)
Jean-Marc Valina6631742008-01-16 17:16:04 +1100120 {
Jean-Marc Valin01240772008-02-07 21:14:16 +1100121 int done = 0;
Jean-Marc Valin0e20ca02008-02-11 15:33:53 +1100122 int pulses = j;
123 /* For bands where there's no pitch, id 1 corresponds to intra prediction
Jean-Marc Valin25358cd2008-02-19 12:21:32 +1100124 with no pulse. id 2 means intra prediction with one pulse, and so on.*/
Jean-Marc Valin01240772008-02-07 21:14:16 +1100125 if (eBands[i] >= m->pitchEnd)
Jean-Marc Valin0e20ca02008-02-11 15:33:53 +1100126 pulses -= 1;
127 if (pulses < 0)
Jean-Marc Valin25358cd2008-02-19 12:21:32 +1100128 bits[i][j] = 0;
Jean-Marc Valin0e20ca02008-02-11 15:33:53 +1100129 else {
Jean-Marc Valin25358cd2008-02-19 12:21:32 +1100130 bits[i][j] = log2_frac64(ncwrs64(N, pulses),BITRES);
Jean-Marc Valin0e20ca02008-02-11 15:33:53 +1100131 /* FIXME: Could there be a better test for the max number of pulses that fit in 64 bits? */
Jean-Marc Valin25358cd2008-02-19 12:21:32 +1100132 if (bits[i][j] > (60<<BITRES))
Jean-Marc Valin0e20ca02008-02-11 15:33:53 +1100133 done = 1;
134 /* Add the intra-frame prediction bits */
135 if (eBands[i] >= m->pitchEnd)
136 {
137 int max_pos = 2*eBands[i]-eBands[i+1];
138 if (max_pos > 32)
139 max_pos = 32;
Jean-Marc Valin25358cd2008-02-19 12:21:32 +1100140 bits[i][j] += (1<<BITRES) + log2_frac(max_pos,BITRES);
Jean-Marc Valin0e20ca02008-02-11 15:33:53 +1100141 }
Jean-Marc Valin8f0f4b92008-02-11 13:52:44 +1100142 }
Jean-Marc Valin01240772008-02-07 21:14:16 +1100143 if (done)
Jean-Marc Valina6631742008-01-16 17:16:04 +1100144 break;
145 }
Jean-Marc Valinc6b43902008-01-16 22:04:17 +1100146 for (;j<MAX_PULSES;j++)
Jean-Marc Valin25358cd2008-02-19 12:21:32 +1100147 bits[i][j] = BITOVERFLOW;
Jean-Marc Valina6631742008-01-16 17:16:04 +1100148 prevN = N;
149 }
150 }
Jean-Marc Valin25358cd2008-02-19 12:21:32 +1100151 m->bits = (const int * const *)bits;
Jean-Marc Valina6631742008-01-16 17:16:04 +1100152}
153
Jean-Marc Valin33ddd792008-01-14 17:39:01 +1100154
Jean-Marc Valin25358cd2008-02-19 12:21:32 +1100155int bits2pulses(const CELTMode *m, int band, int bits)
Jean-Marc Valinc6b43902008-01-16 22:04:17 +1100156{
157 int lo, hi;
158 lo = 0;
Jean-Marc Valinf51ca492008-01-17 10:58:38 +1100159 hi = MAX_PULSES-1;
Jean-Marc Valinc6b43902008-01-16 22:04:17 +1100160
161 while (hi-lo != 1)
162 {
163 int mid = (lo+hi)>>1;
Jean-Marc Valin25358cd2008-02-19 12:21:32 +1100164 if (m->bits[band][mid] >= bits)
Jean-Marc Valinc6b43902008-01-16 22:04:17 +1100165 hi = mid;
166 else
167 lo = mid;
168 }
Jean-Marc Valin25358cd2008-02-19 12:21:32 +1100169 if (bits-m->bits[band][lo] <= m->bits[band][hi]-bits)
Jean-Marc Valinc6b43902008-01-16 22:04:17 +1100170 return lo;
171 else
172 return hi;
173}
Jean-Marc Valin33ddd792008-01-14 17:39:01 +1100174
Jean-Marc Valin25358cd2008-02-19 12:21:32 +1100175int vec_bits2pulses(const CELTMode *m, const int *bands, int *bits, int *pulses, int len)
Jean-Marc Valinb86ed072008-01-15 16:33:21 +1100176{
Jean-Marc Valinf51ca492008-01-17 10:58:38 +1100177 int i, BC;
Jean-Marc Valinb86ed072008-01-15 16:33:21 +1100178 int sum=0;
Jean-Marc Valin25358cd2008-02-19 12:21:32 +1100179 BC = m->nbMdctBlocks*m->nbChannels;
Jean-Marc Valinf51ca492008-01-17 10:58:38 +1100180
Jean-Marc Valinb86ed072008-01-15 16:33:21 +1100181 for (i=0;i<len;i++)
182 {
Jean-Marc Valin25358cd2008-02-19 12:21:32 +1100183 pulses[i] = bits2pulses(m, i, bits[i]);
184 sum += m->bits[i][pulses[i]];
Jean-Marc Valinb86ed072008-01-15 16:33:21 +1100185 }
Jean-Marc Valina85657b2008-02-20 11:59:30 +1100186 /*printf ("sum = %d\n", sum);*/
Jean-Marc Valinc6b43902008-01-16 22:04:17 +1100187 return sum;
Jean-Marc Valinb86ed072008-01-15 16:33:21 +1100188}
189
Jean-Marc Valin25358cd2008-02-19 12:21:32 +1100190int interp_bits2pulses(const CELTMode *m, int *bits1, int *bits2, int total, int *pulses, int len)
Jean-Marc Valinc6b43902008-01-16 22:04:17 +1100191{
192 int lo, hi, out;
193 int j;
Jean-Marc Valin0bb05bc2008-02-20 13:43:40 +1100194 int firstpass;
195 VARDECL(int *bits);
Jean-Marc Valin25358cd2008-02-19 12:21:32 +1100196 const int *bands = m->eBands;
Jean-Marc Valin0bb05bc2008-02-20 13:43:40 +1100197 ALLOC(bits, len, int);
Jean-Marc Valinc6b43902008-01-16 22:04:17 +1100198 lo = 0;
199 hi = 1<<BITRES;
200 while (hi-lo != 1)
201 {
202 int mid = (lo+hi)>>1;
203 for (j=0;j<len;j++)
204 bits[j] = ((1<<BITRES)-mid)*bits1[j] + mid*bits2[j];
Jean-Marc Valin25358cd2008-02-19 12:21:32 +1100205 if (vec_bits2pulses(m, bands, bits, pulses, len) > total<<BITRES)
Jean-Marc Valinc6b43902008-01-16 22:04:17 +1100206 hi = mid;
207 else
208 lo = mid;
209 }
Jean-Marc Valina85657b2008-02-20 11:59:30 +1100210 /*printf ("interp bisection gave %d\n", lo);*/
Jean-Marc Valinc6b43902008-01-16 22:04:17 +1100211 for (j=0;j<len;j++)
212 bits[j] = ((1<<BITRES)-lo)*bits1[j] + lo*bits2[j];
Jean-Marc Valin25358cd2008-02-19 12:21:32 +1100213 out = vec_bits2pulses(m, bands, bits, pulses, len);
Jean-Marc Valinccea9ce2008-02-18 22:03:18 +1100214 /* Do some refinement to use up all bits. In the first pass, we can only add pulses to
215 bands that are under their allocated budget. In the second pass, anything goes */
Jean-Marc Valin0bb05bc2008-02-20 13:43:40 +1100216 firstpass = 1;
Jean-Marc Valinc6b43902008-01-16 22:04:17 +1100217 while(1)
218 {
219 int incremented = 0;
220 for (j=0;j<len;j++)
221 {
Jean-Marc Valin25358cd2008-02-19 12:21:32 +1100222 if ((!firstpass || m->bits[j][pulses[j]] < bits[j]) && pulses[j]<MAX_PULSES-1)
Jean-Marc Valinc6b43902008-01-16 22:04:17 +1100223 {
Jean-Marc Valin25358cd2008-02-19 12:21:32 +1100224 if (out+m->bits[j][pulses[j]+1]-m->bits[j][pulses[j]] <= total<<BITRES)
Jean-Marc Valinc6b43902008-01-16 22:04:17 +1100225 {
Jean-Marc Valin25358cd2008-02-19 12:21:32 +1100226 out = out+m->bits[j][pulses[j]+1]-m->bits[j][pulses[j]];
Jean-Marc Valinc6b43902008-01-16 22:04:17 +1100227 pulses[j] += 1;
228 incremented = 1;
229 }
230 }
231 }
232 if (!incremented)
Jean-Marc Valinccea9ce2008-02-18 22:03:18 +1100233 {
234 if (firstpass)
235 firstpass = 0;
236 else
237 break;
238 }
Jean-Marc Valinc6b43902008-01-16 22:04:17 +1100239 }
240 return (out+BITROUND) >> BITRES;
241}
Jean-Marc Valinf51ca492008-01-17 10:58:38 +1100242
Jean-Marc Valin25358cd2008-02-19 12:21:32 +1100243int compute_allocation(const CELTMode *m, int *offsets, int total, int *pulses)
Jean-Marc Valinf51ca492008-01-17 10:58:38 +1100244{
245 int lo, hi, len;
Jean-Marc Valin0bb05bc2008-02-20 13:43:40 +1100246 VARDECL(int *bits1);
247 VARDECL(int *bits2);
248
Jean-Marc Valinf51ca492008-01-17 10:58:38 +1100249 len = m->nbEBands;
Jean-Marc Valin0bb05bc2008-02-20 13:43:40 +1100250 ALLOC(bits1, len, float);
251 ALLOC(bits2, len, float);
Jean-Marc Valinf51ca492008-01-17 10:58:38 +1100252 lo = 0;
253 hi = m->nbAllocVectors - 1;
254 while (hi-lo != 1)
255 {
256 int j;
Jean-Marc Valinf51ca492008-01-17 10:58:38 +1100257 int mid = (lo+hi) >> 1;
258 for (j=0;j<len;j++)
259 {
Jean-Marc Valin0bb05bc2008-02-20 13:43:40 +1100260 bits1[j] = (m->allocVectors[mid*len+j] + offsets[j])<<BITRES;
261 if (bits1[j] < 0)
262 bits1[j] = 0;
Jean-Marc Valina85657b2008-02-20 11:59:30 +1100263 /*printf ("%d ", bits[j]);*/
Jean-Marc Valinf51ca492008-01-17 10:58:38 +1100264 }
Jean-Marc Valina85657b2008-02-20 11:59:30 +1100265 /*printf ("\n");*/
Jean-Marc Valin0bb05bc2008-02-20 13:43:40 +1100266 if (vec_bits2pulses(m, m->eBands, bits1, pulses, len) > total<<BITRES)
Jean-Marc Valinf51ca492008-01-17 10:58:38 +1100267 hi = mid;
268 else
269 lo = mid;
Jean-Marc Valina85657b2008-02-20 11:59:30 +1100270 /*printf ("lo = %d, hi = %d\n", lo, hi);*/
Jean-Marc Valinf51ca492008-01-17 10:58:38 +1100271 }
272 {
Jean-Marc Valinf51ca492008-01-17 10:58:38 +1100273 int j;
274 for (j=0;j<len;j++)
275 {
276 bits1[j] = m->allocVectors[lo*len+j] + offsets[j];
277 bits2[j] = m->allocVectors[hi*len+j] + offsets[j];
278 if (bits1[j] < 0)
279 bits1[j] = 0;
280 if (bits2[j] < 0)
281 bits2[j] = 0;
282 }
Jean-Marc Valin25358cd2008-02-19 12:21:32 +1100283 return interp_bits2pulses(m, bits1, bits2, total, pulses, len);
Jean-Marc Valinf51ca492008-01-17 10:58:38 +1100284 }
285}
Jean-Marc Valinb86ed072008-01-15 16:33:21 +1100286
Jean-Marc Valin33ddd792008-01-14 17:39:01 +1100287#if 0
288int main()
289{
290 int i;
Jean-Marc Valinf51ca492008-01-17 10:58:38 +1100291 printf ("log(128) = %d\n", EC_ILOG(128));
292 for(i=1;i<2000000000;i+=1738)
Jean-Marc Valin33ddd792008-01-14 17:39:01 +1100293 {
Jean-Marc Valinf51ca492008-01-17 10:58:38 +1100294 printf ("%d %d\n", i, log2_frac(i, 10));
Jean-Marc Valin33ddd792008-01-14 17:39:01 +1100295 }
296 return 0;
297}
298#endif
Jean-Marc Valina6631742008-01-16 17:16:04 +1100299#if 0
300int main()
301{
302 int i;
Jean-Marc Valinf51ca492008-01-17 10:58:38 +1100303 int offsets[18] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
Jean-Marc Valina6631742008-01-16 17:16:04 +1100304 int bits[18] = {10, 9, 9, 8, 8, 8, 8, 8, 8, 8, 9, 10, 8, 9, 10, 11, 6, 7};
305 int bits1[18] = {8, 7, 7, 6, 6, 6, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5};
306 int bits2[18] = {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15};
307 int bank[20] = {0, 4, 8, 12, 16, 20, 24, 28, 32, 38, 44, 52, 62, 74, 90,112,142,182, 232,256};
308 int pulses[18];
309 struct alloc_data alloc;
310
311 alloc_init(&alloc, celt_mode0);
Jean-Marc Valinf51ca492008-01-17 10:58:38 +1100312 int b;
313 //b = vec_bits2pulses(&alloc, bank, bits, pulses, 18);
314 //printf ("total: %d bits\n", b);
315 //for (i=0;i<18;i++)
316 // printf ("%d ", pulses[i]);
317 //printf ("\n");
318 //b = interp_bits2pulses(&alloc, bits1, bits2, 162, pulses, 18);
319 b = compute_allocation(&alloc, offsets, 190, pulses);
Jean-Marc Valina6631742008-01-16 17:16:04 +1100320 printf ("total: %d bits\n", b);
321 for (i=0;i<18;i++)
322 printf ("%d ", pulses[i]);
323 printf ("\n");
324
325 alloc_clear(&alloc);
326 return 0;
327}
328#endif