1/* 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#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
356
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
439