modes.c (16674B)
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 #include "cpu_support.h" 41 42 static const opus_int16 eband5ms[] = { 43 /*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 */ 44 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 34, 40, 48, 60, 78, 100 45 }; 46 47 /* Alternate tuning (partially derived from Vorbis) */ 48 #define BITALLOC_SIZE 11 49 /* Bit allocation table in units of 1/32 bit/sample (0.1875 dB SNR) */ 50 static const unsigned char band_allocation[] = { 51 /*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 */ 52 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53 90, 80, 75, 69, 63, 56, 49, 40, 34, 29, 20, 18, 10, 0, 0, 0, 0, 0, 0, 0, 0, 54 110,100, 90, 84, 78, 71, 65, 58, 51, 45, 39, 32, 26, 20, 12, 0, 0, 0, 0, 0, 0, 55 118,110,103, 93, 86, 80, 75, 70, 65, 59, 53, 47, 40, 31, 23, 15, 4, 0, 0, 0, 0, 56 126,119,112,104, 95, 89, 83, 78, 72, 66, 60, 54, 47, 39, 32, 25, 17, 12, 1, 0, 0, 57 134,127,120,114,103, 97, 91, 85, 78, 72, 66, 60, 54, 47, 41, 35, 29, 23, 16, 10, 1, 58 144,137,130,124,113,107,101, 95, 88, 82, 76, 70, 64, 57, 51, 45, 39, 33, 26, 15, 1, 59 152,145,138,132,123,117,111,105, 98, 92, 86, 80, 74, 67, 61, 55, 49, 43, 36, 20, 1, 60 162,155,148,142,133,127,121,115,108,102, 96, 90, 84, 77, 71, 65, 59, 53, 46, 30, 1, 61 172,165,158,152,143,137,131,125,118,112,106,100, 94, 87, 81, 75, 69, 63, 56, 45, 20, 62 200,200,200,200,200,200,200,200,198,193,188,183,178,173,168,163,158,153,148,129,104, 63 }; 64 65 #ifndef CUSTOM_MODES_ONLY 66 #ifdef FIXED_POINT 67 #include "static_modes_fixed.h" 68 #else 69 #include "static_modes_float.h" 70 #endif 71 #endif /* CUSTOM_MODES_ONLY */ 72 73 #ifndef M_PI 74 #define M_PI 3.1415926535897931 75 #endif 76 77 #ifdef CUSTOM_MODES 78 79 /* Defining 25 critical bands for the full 0-20 kHz audio bandwidth 80 Taken from http://ccrma.stanford.edu/~jos/bbt/Bark_Frequency_Scale.html */ 81 #define BARK_BANDS 25 82 static const opus_int16 bark_freq[BARK_BANDS+1] = { 83 0, 100, 200, 300, 400, 84 510, 630, 770, 920, 1080, 85 1270, 1480, 1720, 2000, 2320, 86 2700, 3150, 3700, 4400, 5300, 87 6400, 7700, 9500, 12000, 15500, 88 20000}; 89 90 static opus_int16 *compute_ebands(opus_int32 Fs, int frame_size, int res, int *nbEBands) 91 { 92 opus_int16 *eBands; 93 int i, j, lin, low, high, nBark, offset=0; 94 95 /* All modes that have 2.5 ms short blocks use the same definition */ 96 if (Fs == 400*(opus_int32)frame_size) 97 { 98 *nbEBands = sizeof(eband5ms)/sizeof(eband5ms[0])-1; 99 eBands = opus_alloc(sizeof(opus_int16)*(*nbEBands+1)); 100 for (i=0;i<*nbEBands+1;i++) 101 eBands[i] = eband5ms[i]; 102 return eBands; 103 } 104 /* Find the number of critical bands supported by our sampling rate */ 105 for (nBark=1;nBark<BARK_BANDS;nBark++) 106 if (bark_freq[nBark+1]*2 >= Fs) 107 break; 108 109 /* Find where the linear part ends (i.e. where the spacing is more than min_width */ 110 for (lin=0;lin<nBark;lin++) 111 if (bark_freq[lin+1]-bark_freq[lin] >= res) 112 break; 113 114 low = (bark_freq[lin]+res/2)/res; 115 high = nBark-lin; 116 *nbEBands = low+high; 117 eBands = opus_alloc(sizeof(opus_int16)*(*nbEBands+2)); 118 119 if (eBands==NULL) 120 return NULL; 121 122 /* Linear spacing (min_width) */ 123 for (i=0;i<low;i++) 124 eBands[i] = i; 125 if (low>0) 126 offset = eBands[low-1]*res - bark_freq[lin-1]; 127 /* Spacing follows critical bands */ 128 for (i=0;i<high;i++) 129 { 130 int target = bark_freq[lin+i]; 131 /* Round to an even value */ 132 eBands[i+low] = (target+offset/2+res)/(2*res)*2; 133 offset = eBands[i+low]*res - target; 134 } 135 /* Enforce the minimum spacing at the boundary */ 136 for (i=0;i<*nbEBands;i++) 137 if (eBands[i] < i) 138 eBands[i] = i; 139 /* Round to an even value */ 140 eBands[*nbEBands] = (bark_freq[nBark]+res)/(2*res)*2; 141 if (eBands[*nbEBands] > frame_size) 142 eBands[*nbEBands] = frame_size; 143 for (i=1;i<*nbEBands-1;i++) 144 { 145 if (eBands[i+1]-eBands[i] < eBands[i]-eBands[i-1]) 146 { 147 eBands[i] -= (2*eBands[i]-eBands[i-1]-eBands[i+1])/2; 148 } 149 } 150 /* Remove any empty bands. */ 151 for (i=j=0;i<*nbEBands;i++) 152 if(eBands[i+1]>eBands[j]) 153 eBands[++j]=eBands[i+1]; 154 *nbEBands=j; 155 156 for (i=1;i<*nbEBands;i++) 157 { 158 /* Every band must be smaller than the last band. */ 159 celt_assert(eBands[i]-eBands[i-1]<=eBands[*nbEBands]-eBands[*nbEBands-1]); 160 /* Each band must be no larger than twice the size of the previous one. */ 161 celt_assert(eBands[i+1]-eBands[i]<=2*(eBands[i]-eBands[i-1])); 162 } 163 164 return eBands; 165 } 166 167 static void compute_allocation_table(CELTMode *mode) 168 { 169 int i, j; 170 unsigned char *allocVectors; 171 int maxBands = sizeof(eband5ms)/sizeof(eband5ms[0])-1; 172 173 mode->nbAllocVectors = BITALLOC_SIZE; 174 allocVectors = opus_alloc(sizeof(unsigned char)*(BITALLOC_SIZE*mode->nbEBands)); 175 if (allocVectors==NULL) 176 { 177 mode->allocVectors = NULL; 178 return; 179 } 180 181 /* Check for standard mode */ 182 if (mode->Fs == 400*(opus_int32)mode->shortMdctSize) 183 { 184 for (i=0;i<BITALLOC_SIZE*mode->nbEBands;i++) 185 allocVectors[i] = band_allocation[i]; 186 mode->allocVectors = allocVectors; 187 return; 188 } 189 /* If not the standard mode, interpolate */ 190 /* Compute per-codec-band allocation from per-critical-band matrix */ 191 for (i=0;i<BITALLOC_SIZE;i++) 192 { 193 for (j=0;j<mode->nbEBands;j++) 194 { 195 int k; 196 for (k=0;k<maxBands;k++) 197 { 198 if (400*(opus_int32)eband5ms[k] > mode->eBands[j]*(opus_int32)mode->Fs/mode->shortMdctSize) 199 break; 200 } 201 if (k>maxBands-1) 202 allocVectors[i*mode->nbEBands+j] = band_allocation[i*maxBands + maxBands-1]; 203 else { 204 opus_int32 a0, a1; 205 a1 = mode->eBands[j]*(opus_int32)mode->Fs/mode->shortMdctSize - 400*(opus_int32)eband5ms[k-1]; 206 a0 = 400*(opus_int32)eband5ms[k] - mode->eBands[j]*(opus_int32)mode->Fs/mode->shortMdctSize; 207 allocVectors[i*mode->nbEBands+j] = (a0*band_allocation[i*maxBands+k-1] 208 + a1*band_allocation[i*maxBands+k])/(a0+a1); 209 } 210 } 211 } 212 213 /*printf ("\n"); 214 for (i=0;i<BITALLOC_SIZE;i++) 215 { 216 for (j=0;j<mode->nbEBands;j++) 217 printf ("%d ", allocVectors[i*mode->nbEBands+j]); 218 printf ("\n"); 219 } 220 exit(0);*/ 221 222 mode->allocVectors = allocVectors; 223 } 224 225 #endif /* CUSTOM_MODES */ 226 227 CELTMode *opus_custom_mode_create(opus_int32 Fs, int frame_size, int *error) 228 { 229 int i; 230 #ifdef CUSTOM_MODES 231 CELTMode *mode=NULL; 232 int res; 233 celt_coef *window; 234 opus_int16 *logN; 235 int LM; 236 int arch = opus_select_arch(); 237 ALLOC_STACK; 238 #if !defined(VAR_ARRAYS) && !defined(USE_ALLOCA) 239 if (global_stack==NULL) 240 goto failure; 241 #endif 242 #endif 243 244 #ifndef CUSTOM_MODES_ONLY 245 for (i=0;i<TOTAL_MODES;i++) 246 { 247 int j; 248 for (j=0;j<4;j++) 249 { 250 if (Fs == static_mode_list[i]->Fs && 251 (frame_size<<j) == static_mode_list[i]->shortMdctSize*static_mode_list[i]->nbShortMdcts) 252 { 253 if (error) 254 *error = OPUS_OK; 255 return (CELTMode*)static_mode_list[i]; 256 } 257 } 258 } 259 #endif /* CUSTOM_MODES_ONLY */ 260 261 #ifndef CUSTOM_MODES 262 if (error) 263 *error = OPUS_BAD_ARG; 264 return NULL; 265 #else 266 267 /* The good thing here is that permutation of the arguments will automatically be invalid */ 268 269 if (Fs < 8000 || Fs > 96000) 270 { 271 if (error) 272 *error = OPUS_BAD_ARG; 273 return NULL; 274 } 275 #ifdef ENABLE_QEXT 276 if (frame_size < 40 || frame_size > 2048 || frame_size%2!=0) 277 #else 278 if (frame_size < 40 || frame_size > 1024 || frame_size%2!=0) 279 #endif 280 { 281 if (error) 282 *error = OPUS_BAD_ARG; 283 return NULL; 284 } 285 /* Frames of less than 1ms are not supported. */ 286 if ((opus_int32)frame_size*1000 < Fs) 287 { 288 if (error) 289 *error = OPUS_BAD_ARG; 290 return NULL; 291 } 292 293 if ((opus_int32)frame_size*75 >= Fs && (frame_size%16)==0) 294 { 295 LM = 3; 296 } else if ((opus_int32)frame_size*150 >= Fs && (frame_size%8)==0) 297 { 298 LM = 2; 299 } else if ((opus_int32)frame_size*300 >= Fs && (frame_size%4)==0) 300 { 301 LM = 1; 302 } else 303 { 304 LM = 0; 305 } 306 307 /* Shorts longer than 3.3ms are not supported. */ 308 if ((opus_int32)(frame_size>>LM)*300 > Fs) 309 { 310 if (error) 311 *error = OPUS_BAD_ARG; 312 return NULL; 313 } 314 315 mode = opus_alloc(sizeof(CELTMode)); 316 if (mode==NULL) 317 goto failure; 318 mode->Fs = Fs; 319 320 /* Pre/de-emphasis depends on sampling rate. The "standard" pre-emphasis 321 is defined as A(z) = 1 - 0.85*z^-1 at 48 kHz. Other rates should 322 approximate that. */ 323 #ifdef ENABLE_QEXT 324 if(Fs == 96000) /* 96 kHz */ 325 { 326 mode->preemph[0] = QCONST16(0.9230041504f, 15); 327 mode->preemph[1] = QCONST16(0.2200012207f, 15); 328 mode->preemph[2] = QCONST16(1.5128347184f, SIG_SHIFT); /* exact 1/preemph[3] */ 329 mode->preemph[3] = QCONST16(0.6610107422f, 13); 330 } else 331 #endif 332 if(Fs < 12000) /* 8 kHz */ 333 { 334 mode->preemph[0] = QCONST16(0.3500061035f, 15); 335 mode->preemph[1] = -QCONST16(0.1799926758f, 15); 336 mode->preemph[2] = QCONST16(0.2719968125f, SIG_SHIFT); /* exact 1/preemph[3] */ 337 mode->preemph[3] = QCONST16(3.6765136719f, 13); 338 } else if(Fs < 24000) /* 16 kHz */ 339 { 340 mode->preemph[0] = QCONST16(0.6000061035f, 15); 341 mode->preemph[1] = -QCONST16(0.1799926758f, 15); 342 mode->preemph[2] = QCONST16(0.4424998650f, SIG_SHIFT); /* exact 1/preemph[3] */ 343 mode->preemph[3] = QCONST16(2.2598876953f, 13); 344 } else if(Fs < 40000) /* 32 kHz */ 345 { 346 mode->preemph[0] = QCONST16(0.7799987793f, 15); 347 mode->preemph[1] = -QCONST16(0.1000061035f, 15); 348 mode->preemph[2] = QCONST16(0.7499771125f, SIG_SHIFT); /* exact 1/preemph[3] */ 349 mode->preemph[3] = QCONST16(1.3333740234f, 13); 350 } else /* 48 kHz */ 351 { 352 mode->preemph[0] = QCONST16(0.8500061035f, 15); 353 mode->preemph[1] = QCONST16(0.0f, 15); 354 mode->preemph[2] = QCONST16(1.f, SIG_SHIFT); 355 mode->preemph[3] = QCONST16(1.f, 13); 356 } 357 358 mode->maxLM = LM; 359 mode->nbShortMdcts = 1<<LM; 360 mode->shortMdctSize = frame_size/mode->nbShortMdcts; 361 res = (mode->Fs+mode->shortMdctSize)/(2*mode->shortMdctSize); 362 363 mode->eBands = compute_ebands(Fs, mode->shortMdctSize, res, &mode->nbEBands); 364 if (mode->eBands==NULL) 365 goto failure; 366 #if !defined(SMALL_FOOTPRINT) 367 /* Make sure we don't allocate a band larger than our PVQ table. 368 208 should be enough, but let's be paranoid. */ 369 if ((mode->eBands[mode->nbEBands] - mode->eBands[mode->nbEBands-1])<<LM > 370 208) { 371 goto failure; 372 } 373 #endif 374 375 mode->effEBands = mode->nbEBands; 376 while (mode->eBands[mode->effEBands] > mode->shortMdctSize) 377 mode->effEBands--; 378 379 /* Overlap must be divisible by 4 */ 380 mode->overlap = ((mode->shortMdctSize>>2)<<2); 381 382 compute_allocation_table(mode); 383 if (mode->allocVectors==NULL) 384 goto failure; 385 386 window = (celt_coef*)opus_alloc(mode->overlap*sizeof(*window)); 387 if (window==NULL) 388 goto failure; 389 390 #ifndef FIXED_POINT 391 for (i=0;i<mode->overlap;i++) 392 window[i] = Q15ONE*sin(.5*M_PI* sin(.5*M_PI*(i+.5)/mode->overlap) * sin(.5*M_PI*(i+.5)/mode->overlap)); 393 #else 394 # ifdef ENABLE_QEXT 395 for (i=0;i<mode->overlap;i++) 396 window[i] = MIN32(2147483647, 2147483648*sin(.5*M_PI* sin(.5*M_PI*(i+.5)/mode->overlap) * sin(.5*M_PI*(i+.5)/mode->overlap))); 397 # else 398 for (i=0;i<mode->overlap;i++) 399 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)))); 400 # endif 401 #endif 402 mode->window = window; 403 404 logN = (opus_int16*)opus_alloc(mode->nbEBands*sizeof(opus_int16)); 405 if (logN==NULL) 406 goto failure; 407 408 for (i=0;i<mode->nbEBands;i++) 409 logN[i] = log2_frac(mode->eBands[i+1]-mode->eBands[i], BITRES); 410 mode->logN = logN; 411 412 compute_pulse_cache(mode, mode->maxLM); 413 #ifdef ENABLE_QEXT 414 OPUS_CLEAR(&mode->qext_cache, 1); 415 if ( (mode->Fs == 48000 && (mode->shortMdctSize==120 || mode->shortMdctSize==90)) || (mode->Fs == 96000 && (mode->shortMdctSize==240 || mode->shortMdctSize==180)) ) { 416 CELTMode dummy; 417 compute_qext_mode(&dummy, mode); 418 compute_pulse_cache(&dummy, dummy.maxLM); 419 OPUS_COPY(&mode->qext_cache, &dummy.cache, 1); 420 } 421 #endif 422 423 if (clt_mdct_init(&mode->mdct, 2*mode->shortMdctSize*mode->nbShortMdcts, 424 mode->maxLM, arch) == 0) 425 goto failure; 426 427 if (error) 428 *error = OPUS_OK; 429 430 return mode; 431 failure: 432 if (error) 433 *error = OPUS_ALLOC_FAIL; 434 if (mode!=NULL) 435 opus_custom_mode_destroy(mode); 436 return NULL; 437 #endif /* !CUSTOM_MODES */ 438 } 439 440 #if defined(CUSTOM_MODES) || defined(ENABLE_OPUS_CUSTOM_API) 441 void opus_custom_mode_destroy(CELTMode *mode) 442 { 443 int arch = opus_select_arch(); 444 445 if (mode == NULL) 446 return; 447 #ifndef CUSTOM_MODES_ONLY 448 { 449 int i; 450 for (i=0;i<TOTAL_MODES;i++) 451 { 452 if (mode == static_mode_list[i]) 453 { 454 return; 455 } 456 } 457 } 458 #endif /* CUSTOM_MODES_ONLY */ 459 #ifdef CUSTOM_MODES 460 #ifdef ENABLE_QEXT 461 if (mode->qext_cache.index) opus_free((opus_int16*)mode->qext_cache.index); 462 if (mode->qext_cache.bits) opus_free((unsigned char*)mode->qext_cache.bits); 463 if (mode->qext_cache.caps) opus_free((unsigned char*)mode->qext_cache.caps); 464 #endif 465 opus_free((opus_int16*)mode->eBands); 466 opus_free((unsigned char*)mode->allocVectors); 467 468 opus_free((opus_val16*)mode->window); 469 opus_free((opus_int16*)mode->logN); 470 471 opus_free((opus_int16*)mode->cache.index); 472 opus_free((unsigned char*)mode->cache.bits); 473 opus_free((unsigned char*)mode->cache.caps); 474 clt_mdct_clear(&mode->mdct, arch); 475 476 opus_free((CELTMode *)mode); 477 #else 478 (void)arch; 479 celt_assert(0); 480 #endif 481 } 482 #endif 483 484 #ifdef ENABLE_QEXT 485 486 static const opus_int16 qext_eBands_180[] = { 487 /* 20k 22k 24k 26k 28k 30k 32k 34k 36k 38k 40k 42k 44k 47k 48k */ 488 74, 82, 90, 98, 106, 114, 122, 130, 138, 146, 154, 162, 168, 174, 180 489 }; 490 491 static const opus_int16 qext_logN_180[] = {24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 21, 21, 21}; 492 493 /* Extra bands. */ 494 static const opus_int16 qext_eBands_240[] = { 495 /* 20k 22k 24k 26k 28k 30k 32k 34k 36k 38k 40k 42k 44k 47k 48k */ 496 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240 497 }; 498 499 static const opus_int16 qext_logN_240[] = {27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27}; 500 501 void compute_qext_mode(CELTMode *qext, const CELTMode *m) 502 { 503 OPUS_COPY(qext, m, 1); 504 if (m->shortMdctSize*48000 == 120*m->Fs) { 505 qext->eBands = qext_eBands_240; 506 qext->logN = qext_logN_240; 507 } else if (m->shortMdctSize*48000 == 90*m->Fs) { 508 qext->eBands = qext_eBands_180; 509 qext->logN = qext_logN_180; 510 } else { 511 celt_assert(0); 512 } 513 qext->nbEBands = qext->effEBands = NB_QEXT_BANDS; 514 while (qext->eBands[qext->effEBands] > qext->shortMdctSize) 515 qext->effEBands--; 516 qext->nbAllocVectors = 0; 517 qext->allocVectors = NULL; 518 OPUS_COPY(&qext->cache, &m->qext_cache, 1); 519 } 520 #endif