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
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
431