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 41 static 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) */ 49 static 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, 53 110,100, 90, 84, 78, 71, 65, 58, 51, 45, 39, 32, 26, 20, 12, 0, 0, 0, 0, 0, 0, 54 118,110,103, 93, 86, 80, 75, 70, 65, 59, 53, 47, 40, 31, 23, 15, 4, 0, 0, 0, 0, 55 126,119,112,104, 95, 89, 83, 78, 72, 66, 60, 54, 47, 39, 32, 25, 17, 12, 1, 0, 0, 56 134,127,120,114,103, 97, 91, 85, 78, 72, 66, 60, 54, 47, 41, 35, 29, 23, 16, 10, 1, 57 144,137,130,124,113,107,101, 95, 88, 82, 76, 70, 64, 57, 51, 45, 39, 33, 26, 15, 1, 58 152,145,138,132,123,117,111,105, 98, 92, 86, 80, 74, 67, 61, 55, 49, 43, 36, 20, 1, 59 162,155,148,142,133,127,121,115,108,102, 96, 90, 84, 77, 71, 65, 59, 53, 46, 30, 1, 60 172,165,158,152,143,137,131,125,118,112,106,100, 94, 87, 81, 75, 69, 63, 56, 45, 20, 61 200,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 81 static 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 89 static 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 166 static 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 223 CELTMode *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; 399 failure: 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 409 void 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