blob: ed204d7d9c4184a96c79af2ea9e3f4a888dd7ba2 [file] [log] [blame]
Alexandre Lision744f7422013-09-25 11:39:37 -04001/* 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;
348
349 mode->effEBands = mode->nbEBands;
350 while (mode->eBands[mode->effEBands] > mode->shortMdctSize)
351 mode->effEBands--;
352
353 /* Overlap must be divisible by 4 */
354 mode->overlap = ((mode->shortMdctSize>>2)<<2);
355
356 compute_allocation_table(mode);
357 if (mode->allocVectors==NULL)
358 goto failure;
359
360 window = (opus_val16*)opus_alloc(mode->overlap*sizeof(opus_val16));
361 if (window==NULL)
362 goto failure;
363
364#ifndef FIXED_POINT
365 for (i=0;i<mode->overlap;i++)
366 window[i] = Q15ONE*sin(.5*M_PI* sin(.5*M_PI*(i+.5)/mode->overlap) * sin(.5*M_PI*(i+.5)/mode->overlap));
367#else
368 for (i=0;i<mode->overlap;i++)
369 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))));
370#endif
371 mode->window = window;
372
373 logN = (opus_int16*)opus_alloc(mode->nbEBands*sizeof(opus_int16));
374 if (logN==NULL)
375 goto failure;
376
377 for (i=0;i<mode->nbEBands;i++)
378 logN[i] = log2_frac(mode->eBands[i+1]-mode->eBands[i], BITRES);
379 mode->logN = logN;
380
381 compute_pulse_cache(mode, mode->maxLM);
382
383 if (clt_mdct_init(&mode->mdct, 2*mode->shortMdctSize*mode->nbShortMdcts,
384 mode->maxLM) == 0)
385 goto failure;
386
387 if (error)
388 *error = OPUS_OK;
389
390 return mode;
391failure:
392 if (error)
393 *error = OPUS_ALLOC_FAIL;
394 if (mode!=NULL)
395 opus_custom_mode_destroy(mode);
396 return NULL;
397#endif /* !CUSTOM_MODES */
398}
399
400#ifdef CUSTOM_MODES
401void opus_custom_mode_destroy(CELTMode *mode)
402{
403 if (mode == NULL)
404 return;
405#ifndef CUSTOM_MODES_ONLY
406 {
407 int i;
408 for (i=0;i<TOTAL_MODES;i++)
409 {
410 if (mode == static_mode_list[i])
411 {
412 return;
413 }
414 }
415 }
416#endif /* CUSTOM_MODES_ONLY */
417 opus_free((opus_int16*)mode->eBands);
418 opus_free((opus_int16*)mode->allocVectors);
419
420 opus_free((opus_val16*)mode->window);
421 opus_free((opus_int16*)mode->logN);
422
423 opus_free((opus_int16*)mode->cache.index);
424 opus_free((unsigned char*)mode->cache.bits);
425 opus_free((unsigned char*)mode->cache.caps);
426 clt_mdct_clear(&mode->mdct);
427
428 opus_free((CELTMode *)mode);
429}
430#endif