blob: 42e68e1cb72f4350fc77b17148ad6235757403ca [file] [log] [blame]
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +00001/* Copyright (c) 2007-2008 CSIRO
2 Copyright (c) 2007-2009 Xiph.Org Foundation
3 Copyright (c) 2008 Gregory Maxwell
4 Written by Jean-Marc Valin and Gregory Maxwell */
5/*
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions
8 are met:
9
10 - Redistributions of source code must retain the above copyright
11 notice, this list of conditions and the following disclaimer.
12
13 - Redistributions in binary form must reproduce the above copyright
14 notice, this list of conditions and the following disclaimer in the
15 documentation and/or other materials provided with the distribution.
16
17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21 OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*/
29
30#ifdef HAVE_CONFIG_H
31#include "config.h"
32#endif
33
34#include "celt.h"
35#include "modes.h"
36#include "rate.h"
37#include "os_support.h"
38#include "stack_alloc.h"
39#include "quant_bands.h"
40
41static const opus_int16 eband5ms[] = {
42/*0 200 400 600 800 1k 1.2 1.4 1.6 2k 2.4 2.8 3.2 4k 4.8 5.6 6.8 8k 9.6 12k 15.6 */
43 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 34, 40, 48, 60, 78, 100
44};
45
46/* Alternate tuning (partially derived from Vorbis) */
47#define BITALLOC_SIZE 11
48/* Bit allocation table in units of 1/32 bit/sample (0.1875 dB SNR) */
49static const unsigned char band_allocation[] = {
50/*0 200 400 600 800 1k 1.2 1.4 1.6 2k 2.4 2.8 3.2 4k 4.8 5.6 6.8 8k 9.6 12k 15.6 */
51 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
52 90, 80, 75, 69, 63, 56, 49, 40, 34, 29, 20, 18, 10, 0, 0, 0, 0, 0, 0, 0, 0,
53110,100, 90, 84, 78, 71, 65, 58, 51, 45, 39, 32, 26, 20, 12, 0, 0, 0, 0, 0, 0,
54118,110,103, 93, 86, 80, 75, 70, 65, 59, 53, 47, 40, 31, 23, 15, 4, 0, 0, 0, 0,
55126,119,112,104, 95, 89, 83, 78, 72, 66, 60, 54, 47, 39, 32, 25, 17, 12, 1, 0, 0,
56134,127,120,114,103, 97, 91, 85, 78, 72, 66, 60, 54, 47, 41, 35, 29, 23, 16, 10, 1,
57144,137,130,124,113,107,101, 95, 88, 82, 76, 70, 64, 57, 51, 45, 39, 33, 26, 15, 1,
58152,145,138,132,123,117,111,105, 98, 92, 86, 80, 74, 67, 61, 55, 49, 43, 36, 20, 1,
59162,155,148,142,133,127,121,115,108,102, 96, 90, 84, 77, 71, 65, 59, 53, 46, 30, 1,
60172,165,158,152,143,137,131,125,118,112,106,100, 94, 87, 81, 75, 69, 63, 56, 45, 20,
61200,200,200,200,200,200,200,200,198,193,188,183,178,173,168,163,158,153,148,129,104,
62};
63
64#ifndef CUSTOM_MODES_ONLY
65 #ifdef FIXED_POINT
66 #include "static_modes_fixed.h"
67 #else
68 #include "static_modes_float.h"
69 #endif
70#endif /* CUSTOM_MODES_ONLY */
71
72#ifndef M_PI
73#define M_PI 3.141592653
74#endif
75
76#ifdef CUSTOM_MODES
77
78/* Defining 25 critical bands for the full 0-20 kHz audio bandwidth
79 Taken from http://ccrma.stanford.edu/~jos/bbt/Bark_Frequency_Scale.html */
80#define BARK_BANDS 25
81static const opus_int16 bark_freq[BARK_BANDS+1] = {
82 0, 100, 200, 300, 400,
83 510, 630, 770, 920, 1080,
84 1270, 1480, 1720, 2000, 2320,
85 2700, 3150, 3700, 4400, 5300,
86 6400, 7700, 9500, 12000, 15500,
87 20000};
88
89static opus_int16 *compute_ebands(opus_int32 Fs, int frame_size, int res, int *nbEBands)
90{
91 opus_int16 *eBands;
92 int i, j, lin, low, high, nBark, offset=0;
93
94 /* All modes that have 2.5 ms short blocks use the same definition */
95 if (Fs == 400*(opus_int32)frame_size)
96 {
97 *nbEBands = sizeof(eband5ms)/sizeof(eband5ms[0])-1;
98 eBands = opus_alloc(sizeof(opus_int16)*(*nbEBands+1));
99 for (i=0;i<*nbEBands+1;i++)
100 eBands[i] = eband5ms[i];
101 return eBands;
102 }
103 /* Find the number of critical bands supported by our sampling rate */
104 for (nBark=1;nBark<BARK_BANDS;nBark++)
105 if (bark_freq[nBark+1]*2 >= Fs)
106 break;
107
108 /* Find where the linear part ends (i.e. where the spacing is more than min_width */
109 for (lin=0;lin<nBark;lin++)
110 if (bark_freq[lin+1]-bark_freq[lin] >= res)
111 break;
112
113 low = (bark_freq[lin]+res/2)/res;
114 high = nBark-lin;
115 *nbEBands = low+high;
116 eBands = opus_alloc(sizeof(opus_int16)*(*nbEBands+2));
117
118 if (eBands==NULL)
119 return NULL;
120
121 /* Linear spacing (min_width) */
122 for (i=0;i<low;i++)
123 eBands[i] = i;
124 if (low>0)
125 offset = eBands[low-1]*res - bark_freq[lin-1];
126 /* Spacing follows critical bands */
127 for (i=0;i<high;i++)
128 {
129 int target = bark_freq[lin+i];
130 /* Round to an even value */
131 eBands[i+low] = (target+offset/2+res)/(2*res)*2;
132 offset = eBands[i+low]*res - target;
133 }
134 /* Enforce the minimum spacing at the boundary */
135 for (i=0;i<*nbEBands;i++)
136 if (eBands[i] < i)
137 eBands[i] = i;
138 /* Round to an even value */
139 eBands[*nbEBands] = (bark_freq[nBark]+res)/(2*res)*2;
140 if (eBands[*nbEBands] > frame_size)
141 eBands[*nbEBands] = frame_size;
142 for (i=1;i<*nbEBands-1;i++)
143 {
144 if (eBands[i+1]-eBands[i] < eBands[i]-eBands[i-1])
145 {
146 eBands[i] -= (2*eBands[i]-eBands[i-1]-eBands[i+1])/2;
147 }
148 }
149 /* Remove any empty bands. */
150 for (i=j=0;i<*nbEBands;i++)
151 if(eBands[i+1]>eBands[j])
152 eBands[++j]=eBands[i+1];
153 *nbEBands=j;
154
155 for (i=1;i<*nbEBands;i++)
156 {
157 /* Every band must be smaller than the last band. */
158 celt_assert(eBands[i]-eBands[i-1]<=eBands[*nbEBands]-eBands[*nbEBands-1]);
159 /* Each band must be no larger than twice the size of the previous one. */
160 celt_assert(eBands[i+1]-eBands[i]<=2*(eBands[i]-eBands[i-1]));
161 }
162
163 return eBands;
164}
165
166static void compute_allocation_table(CELTMode *mode)
167{
168 int i, j;
169 unsigned char *allocVectors;
170 int maxBands = sizeof(eband5ms)/sizeof(eband5ms[0])-1;
171
172 mode->nbAllocVectors = BITALLOC_SIZE;
173 allocVectors = opus_alloc(sizeof(unsigned char)*(BITALLOC_SIZE*mode->nbEBands));
174 if (allocVectors==NULL)
175 return;
176
177 /* Check for standard mode */
178 if (mode->Fs == 400*(opus_int32)mode->shortMdctSize)
179 {
180 for (i=0;i<BITALLOC_SIZE*mode->nbEBands;i++)
181 allocVectors[i] = band_allocation[i];
182 mode->allocVectors = allocVectors;
183 return;
184 }
185 /* If not the standard mode, interpolate */
186 /* Compute per-codec-band allocation from per-critical-band matrix */
187 for (i=0;i<BITALLOC_SIZE;i++)
188 {
189 for (j=0;j<mode->nbEBands;j++)
190 {
191 int k;
192 for (k=0;k<maxBands;k++)
193 {
194 if (400*(opus_int32)eband5ms[k] > mode->eBands[j]*(opus_int32)mode->Fs/mode->shortMdctSize)
195 break;
196 }
197 if (k>maxBands-1)
198 allocVectors[i*mode->nbEBands+j] = band_allocation[i*maxBands + maxBands-1];
199 else {
200 opus_int32 a0, a1;
201 a1 = mode->eBands[j]*(opus_int32)mode->Fs/mode->shortMdctSize - 400*(opus_int32)eband5ms[k-1];
202 a0 = 400*(opus_int32)eband5ms[k] - mode->eBands[j]*(opus_int32)mode->Fs/mode->shortMdctSize;
203 allocVectors[i*mode->nbEBands+j] = (a0*band_allocation[i*maxBands+k-1]
204 + a1*band_allocation[i*maxBands+k])/(a0+a1);
205 }
206 }
207 }
208
209 /*printf ("\n");
210 for (i=0;i<BITALLOC_SIZE;i++)
211 {
212 for (j=0;j<mode->nbEBands;j++)
213 printf ("%d ", allocVectors[i*mode->nbEBands+j]);
214 printf ("\n");
215 }
216 exit(0);*/
217
218 mode->allocVectors = allocVectors;
219}
220
221#endif /* CUSTOM_MODES */
222
223CELTMode *opus_custom_mode_create(opus_int32 Fs, int frame_size, int *error)
224{
225 int i;
226#ifdef CUSTOM_MODES
227 CELTMode *mode=NULL;
228 int res;
229 opus_val16 *window;
230 opus_int16 *logN;
231 int LM;
232 ALLOC_STACK;
233#if !defined(VAR_ARRAYS) && !defined(USE_ALLOCA)
234 if (global_stack==NULL)
235 goto failure;
236#endif
237#endif
238
239#ifndef CUSTOM_MODES_ONLY
240 for (i=0;i<TOTAL_MODES;i++)
241 {
242 int j;
243 for (j=0;j<4;j++)
244 {
245 if (Fs == static_mode_list[i]->Fs &&
246 (frame_size<<j) == static_mode_list[i]->shortMdctSize*static_mode_list[i]->nbShortMdcts)
247 {
248 if (error)
249 *error = OPUS_OK;
250 return (CELTMode*)static_mode_list[i];
251 }
252 }
253 }
254#endif /* CUSTOM_MODES_ONLY */
255
256#ifndef CUSTOM_MODES
257 if (error)
258 *error = OPUS_BAD_ARG;
259 return NULL;
260#else
261
262 /* The good thing here is that permutation of the arguments will automatically be invalid */
263
264 if (Fs < 8000 || Fs > 96000)
265 {
266 if (error)
267 *error = OPUS_BAD_ARG;
268 return NULL;
269 }
270 if (frame_size < 40 || frame_size > 1024 || frame_size%2!=0)
271 {
272 if (error)
273 *error = OPUS_BAD_ARG;
274 return NULL;
275 }
276 /* Frames of less than 1ms are not supported. */
277 if ((opus_int32)frame_size*1000 < Fs)
278 {
279 if (error)
280 *error = OPUS_BAD_ARG;
281 return NULL;
282 }
283
284 if ((opus_int32)frame_size*75 >= Fs && (frame_size%16)==0)
285 {
286 LM = 3;
287 } else if ((opus_int32)frame_size*150 >= Fs && (frame_size%8)==0)
288 {
289 LM = 2;
290 } else if ((opus_int32)frame_size*300 >= Fs && (frame_size%4)==0)
291 {
292 LM = 1;
293 } else
294 {
295 LM = 0;
296 }
297
298 /* Shorts longer than 3.3ms are not supported. */
299 if ((opus_int32)(frame_size>>LM)*300 > Fs)
300 {
301 if (error)
302 *error = OPUS_BAD_ARG;
303 return NULL;
304 }
305
306 mode = opus_alloc(sizeof(CELTMode));
307 if (mode==NULL)
308 goto failure;
309 mode->Fs = Fs;
310
311 /* Pre/de-emphasis depends on sampling rate. The "standard" pre-emphasis
312 is defined as A(z) = 1 - 0.85*z^-1 at 48 kHz. Other rates should
313 approximate that. */
314 if(Fs < 12000) /* 8 kHz */
315 {
316 mode->preemph[0] = QCONST16(0.3500061035f, 15);
317 mode->preemph[1] = -QCONST16(0.1799926758f, 15);
318 mode->preemph[2] = QCONST16(0.2719968125f, SIG_SHIFT); /* exact 1/preemph[3] */
319 mode->preemph[3] = QCONST16(3.6765136719f, 13);
320 } else if(Fs < 24000) /* 16 kHz */
321 {
322 mode->preemph[0] = QCONST16(0.6000061035f, 15);
323 mode->preemph[1] = -QCONST16(0.1799926758f, 15);
324 mode->preemph[2] = QCONST16(0.4424998650f, SIG_SHIFT); /* exact 1/preemph[3] */
325 mode->preemph[3] = QCONST16(2.2598876953f, 13);
326 } else if(Fs < 40000) /* 32 kHz */
327 {
328 mode->preemph[0] = QCONST16(0.7799987793f, 15);
329 mode->preemph[1] = -QCONST16(0.1000061035f, 15);
330 mode->preemph[2] = QCONST16(0.7499771125f, SIG_SHIFT); /* exact 1/preemph[3] */
331 mode->preemph[3] = QCONST16(1.3333740234f, 13);
332 } else /* 48 kHz */
333 {
334 mode->preemph[0] = QCONST16(0.8500061035f, 15);
335 mode->preemph[1] = QCONST16(0.0f, 15);
336 mode->preemph[2] = QCONST16(1.f, SIG_SHIFT);
337 mode->preemph[3] = QCONST16(1.f, 13);
338 }
339
340 mode->maxLM = LM;
341 mode->nbShortMdcts = 1<<LM;
342 mode->shortMdctSize = frame_size/mode->nbShortMdcts;
343 res = (mode->Fs+mode->shortMdctSize)/(2*mode->shortMdctSize);
344
345 mode->eBands = compute_ebands(Fs, mode->shortMdctSize, res, &mode->nbEBands);
346 if (mode->eBands==NULL)
347 goto failure;
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000348#if !defined(SMALL_FOOTPRINT)
349 /* Make sure we don't allocate a band larger than our PVQ table.
350 208 should be enough, but let's be paranoid. */
351 if ((mode->eBands[mode->nbEBands] - mode->eBands[mode->nbEBands-1])<<LM >
352 208) {
353 goto failure;
354 }
355#endif
sergeyu@chromium.org885f2ff2012-10-17 22:31:52 +0000356
357 mode->effEBands = mode->nbEBands;
358 while (mode->eBands[mode->effEBands] > mode->shortMdctSize)
359 mode->effEBands--;
360
361 /* Overlap must be divisible by 4 */
362 mode->overlap = ((mode->shortMdctSize>>2)<<2);
363
364 compute_allocation_table(mode);
365 if (mode->allocVectors==NULL)
366 goto failure;
367
368 window = (opus_val16*)opus_alloc(mode->overlap*sizeof(opus_val16));
369 if (window==NULL)
370 goto failure;
371
372#ifndef FIXED_POINT
373 for (i=0;i<mode->overlap;i++)
374 window[i] = Q15ONE*sin(.5*M_PI* sin(.5*M_PI*(i+.5)/mode->overlap) * sin(.5*M_PI*(i+.5)/mode->overlap));
375#else
376 for (i=0;i<mode->overlap;i++)
377 window[i] = MIN32(32767,floor(.5+32768.*sin(.5*M_PI* sin(.5*M_PI*(i+.5)/mode->overlap) * sin(.5*M_PI*(i+.5)/mode->overlap))));
378#endif
379 mode->window = window;
380
381 logN = (opus_int16*)opus_alloc(mode->nbEBands*sizeof(opus_int16));
382 if (logN==NULL)
383 goto failure;
384
385 for (i=0;i<mode->nbEBands;i++)
386 logN[i] = log2_frac(mode->eBands[i+1]-mode->eBands[i], BITRES);
387 mode->logN = logN;
388
389 compute_pulse_cache(mode, mode->maxLM);
390
391 if (clt_mdct_init(&mode->mdct, 2*mode->shortMdctSize*mode->nbShortMdcts,
392 mode->maxLM) == 0)
393 goto failure;
394
395 if (error)
396 *error = OPUS_OK;
397
398 return mode;
399failure:
400 if (error)
401 *error = OPUS_ALLOC_FAIL;
402 if (mode!=NULL)
403 opus_custom_mode_destroy(mode);
404 return NULL;
405#endif /* !CUSTOM_MODES */
406}
407
408#ifdef CUSTOM_MODES
409void opus_custom_mode_destroy(CELTMode *mode)
410{
411 if (mode == NULL)
412 return;
413#ifndef CUSTOM_MODES_ONLY
414 {
415 int i;
416 for (i=0;i<TOTAL_MODES;i++)
417 {
418 if (mode == static_mode_list[i])
419 {
420 return;
421 }
422 }
423 }
424#endif /* CUSTOM_MODES_ONLY */
425 opus_free((opus_int16*)mode->eBands);
426 opus_free((opus_int16*)mode->allocVectors);
427
428 opus_free((opus_val16*)mode->window);
429 opus_free((opus_int16*)mode->logN);
430
431 opus_free((opus_int16*)mode->cache.index);
432 opus_free((unsigned char*)mode->cache.bits);
433 opus_free((unsigned char*)mode->cache.caps);
434 clt_mdct_clear(&mode->mdct);
435
436 opus_free((CELTMode *)mode);
437}
438#endif