1/* Copyright (c) 2007-2008 CSIRO 2 Copyright (c) 2007-2010 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#define CELT_DECODER_C 35 36#include "cpu_support.h" 37#include "os_support.h" 38#include "mdct.h" 39#include <math.h> 40#include "celt.h" 41#include "pitch.h" 42#include "bands.h" 43#include "modes.h" 44#include "entcode.h" 45#include "quant_bands.h" 46#include "rate.h" 47#include "stack_alloc.h" 48#include "mathops.h" 49#include "float_cast.h" 50#include <stdarg.h> 51#include "celt_lpc.h" 52#include "vq.h" 53 54/**********************************************************************/ 55/* */ 56/* DECODER */ 57/* */ 58/**********************************************************************/ 59#define DECODE_BUFFER_SIZE 2048 60 61/** Decoder state 62 @brief Decoder state 63 */ 64struct OpusCustomDecoder { 65 const OpusCustomMode *mode; 66 int overlap; 67 int channels; 68 int stream_channels; 69 70 int downsample; 71 int start, end; 72 int signalling; 73 int arch; 74 75 /* Everything beyond this point gets cleared on a reset */ 76#define DECODER_RESET_START rng 77 78 opus_uint32 rng; 79 int error; 80 int last_pitch_index; 81 int loss_count; 82 int postfilter_period; 83 int postfilter_period_old; 84 opus_val16 postfilter_gain; 85 opus_val16 postfilter_gain_old; 86 int postfilter_tapset; 87 int postfilter_tapset_old; 88 89 celt_sig preemph_memD[2]; 90 91 celt_sig _decode_mem[1]; /* Size = channels*(DECODE_BUFFER_SIZE+mode->overlap) */ 92 /* opus_val16 lpc[], Size = channels*LPC_ORDER */ 93 /* opus_val16 oldEBands[], Size = 2*mode->nbEBands */ 94 /* opus_val16 oldLogE[], Size = 2*mode->nbEBands */ 95 /* opus_val16 oldLogE2[], Size = 2*mode->nbEBands */ 96 /* opus_val16 backgroundLogE[], Size = 2*mode->nbEBands */ 97}; 98 99int celt_decoder_get_size(int channels) 100{ 101 const CELTMode *mode = opus_custom_mode_create(48000, 960, NULL); 102 return opus_custom_decoder_get_size(mode, channels); 103} 104 105OPUS_CUSTOM_NOSTATIC int opus_custom_decoder_get_size(const CELTMode *mode, int channels) 106{ 107 int size = sizeof(struct CELTDecoder) 108 + (channels*(DECODE_BUFFER_SIZE+mode->overlap)-1)*sizeof(celt_sig) 109 + channels*LPC_ORDER*sizeof(opus_val16) 110 + 4*2*mode->nbEBands*sizeof(opus_val16); 111 return size; 112} 113 114#ifdef CUSTOM_MODES 115CELTDecoder *opus_custom_decoder_create(const CELTMode *mode, int channels, int *error) 116{ 117 int ret; 118 CELTDecoder *st = (CELTDecoder *)opus_alloc(opus_custom_decoder_get_size(mode, channels)); 119 ret = opus_custom_decoder_init(st, mode, channels); 120 if (ret != OPUS_OK) 121 { 122 opus_custom_decoder_destroy(st); 123 st = NULL; 124 } 125 if (error) 126 *error = ret; 127 return st; 128} 129#endif /* CUSTOM_MODES */ 130 131int celt_decoder_init(CELTDecoder *st, opus_int32 sampling_rate, int channels) 132{ 133 int ret; 134 ret = opus_custom_decoder_init(st, opus_custom_mode_create(48000, 960, NULL), channels); 135 if (ret != OPUS_OK) 136 return ret; 137 st->downsample = resampling_factor(sampling_rate); 138 if (st->downsample==0) 139 return OPUS_BAD_ARG; 140 else 141 return OPUS_OK; 142} 143 144OPUS_CUSTOM_NOSTATIC int opus_custom_decoder_init(CELTDecoder *st, const CELTMode *mode, int channels) 145{ 146 if (channels < 0 || channels > 2) 147 return OPUS_BAD_ARG; 148 149 if (st==NULL) 150 return OPUS_ALLOC_FAIL; 151 152 OPUS_CLEAR((char*)st, opus_custom_decoder_get_size(mode, channels)); 153 154 st->mode = mode; 155 st->overlap = mode->overlap; 156 st->stream_channels = st->channels = channels; 157 158 st->downsample = 1; 159 st->start = 0; 160 st->end = st->mode->effEBands; 161 st->signalling = 1; 162 st->arch = opus_select_arch(); 163 164 st->loss_count = 0; 165 166 opus_custom_decoder_ctl(st, OPUS_RESET_STATE); 167 168 return OPUS_OK; 169} 170 171#ifdef CUSTOM_MODES 172void opus_custom_decoder_destroy(CELTDecoder *st) 173{ 174 opus_free(st); 175} 176#endif /* CUSTOM_MODES */ 177 178static OPUS_INLINE opus_val16 SIG2WORD16(celt_sig x) 179{ 180#ifdef FIXED_POINT 181 x = PSHR32(x, SIG_SHIFT); 182 x = MAX32(x, -32768); 183 x = MIN32(x, 32767); 184 return EXTRACT16(x); 185#else 186 return (opus_val16)x; 187#endif 188} 189 190#ifndef RESYNTH 191static 192#endif 193void deemphasis(celt_sig *in[], opus_val16 *pcm, int N, int C, int downsample, const opus_val16 *coef, celt_sig *mem, celt_sig * OPUS_RESTRICT scratch) 194{ 195 int c; 196 int Nd; 197 int apply_downsampling=0; 198 opus_val16 coef0; 199 200 coef0 = coef[0]; 201 Nd = N/downsample; 202 c=0; do { 203 int j; 204 celt_sig * OPUS_RESTRICT x; 205 opus_val16 * OPUS_RESTRICT y; 206 celt_sig m = mem[c]; 207 x =in[c]; 208 y = pcm+c; 209#ifdef CUSTOM_MODES 210 if (coef[1] != 0) 211 { 212 opus_val16 coef1 = coef[1]; 213 opus_val16 coef3 = coef[3]; 214 for (j=0;j<N;j++) 215 { 216 celt_sig tmp = x[j] + m + VERY_SMALL; 217 m = MULT16_32_Q15(coef0, tmp) 218 - MULT16_32_Q15(coef1, x[j]); 219 tmp = SHL32(MULT16_32_Q15(coef3, tmp), 2); 220 scratch[j] = tmp; 221 } 222 apply_downsampling=1; 223 } else 224#endif 225 if (downsample>1) 226 { 227 /* Shortcut for the standard (non-custom modes) case */ 228 for (j=0;j<N;j++) 229 { 230 celt_sig tmp = x[j] + m + VERY_SMALL; 231 m = MULT16_32_Q15(coef0, tmp); 232 scratch[j] = tmp; 233 } 234 apply_downsampling=1; 235 } else { 236 /* Shortcut for the standard (non-custom modes) case */ 237 for (j=0;j<N;j++) 238 { 239 celt_sig tmp = x[j] + m + VERY_SMALL; 240 m = MULT16_32_Q15(coef0, tmp); 241 y[j*C] = SCALEOUT(SIG2WORD16(tmp)); 242 } 243 } 244 mem[c] = m; 245 246 if (apply_downsampling) 247 { 248 /* Perform down-sampling */ 249 for (j=0;j<Nd;j++) 250 y[j*C] = SCALEOUT(SIG2WORD16(scratch[j*downsample])); 251 } 252 } while (++c<C); 253} 254 255/** Compute the IMDCT and apply window for all sub-frames and 256 all channels in a frame */ 257#ifndef RESYNTH 258static 259#endif 260void compute_inv_mdcts(const CELTMode *mode, int shortBlocks, celt_sig *X, 261 celt_sig * OPUS_RESTRICT out_mem[], int C, int LM) 262{ 263 int b, c; 264 int B; 265 int N; 266 int shift; 267 const int overlap = OVERLAP(mode); 268 269 if (shortBlocks) 270 { 271 B = shortBlocks; 272 N = mode->shortMdctSize; 273 shift = mode->maxLM; 274 } else { 275 B = 1; 276 N = mode->shortMdctSize<<LM; 277 shift = mode->maxLM-LM; 278 } 279 c=0; do { 280 /* IMDCT on the interleaved the sub-frames, overlap-add is performed by the IMDCT */ 281 for (b=0;b<B;b++) 282 clt_mdct_backward(&mode->mdct, &X[b+c*N*B], out_mem[c]+N*b, mode->window, overlap, shift, B); 283 } while (++c<C); 284} 285 286static void tf_decode(int start, int end, int isTransient, int *tf_res, int LM, ec_dec *dec) 287{ 288 int i, curr, tf_select; 289 int tf_select_rsv; 290 int tf_changed; 291 int logp; 292 opus_uint32 budget; 293 opus_uint32 tell; 294 295 budget = dec->storage*8; 296 tell = ec_tell(dec); 297 logp = isTransient ? 2 : 4; 298 tf_select_rsv = LM>0 && tell+logp+1<=budget; 299 budget -= tf_select_rsv; 300 tf_changed = curr = 0; 301 for (i=start;i<end;i++) 302 { 303 if (tell+logp<=budget) 304 { 305 curr ^= ec_dec_bit_logp(dec, logp); 306 tell = ec_tell(dec); 307 tf_changed |= curr; 308 } 309 tf_res[i] = curr; 310 logp = isTransient ? 4 : 5; 311 } 312 tf_select = 0; 313 if (tf_select_rsv && 314 tf_select_table[LM][4*isTransient+0+tf_changed] != 315 tf_select_table[LM][4*isTransient+2+tf_changed]) 316 { 317 tf_select = ec_dec_bit_logp(dec, 1); 318 } 319 for (i=start;i<end;i++) 320 { 321 tf_res[i] = tf_select_table[LM][4*isTransient+2*tf_select+tf_res[i]]; 322 } 323} 324 325/* The maximum pitch lag to allow in the pitch-based PLC. It's possible to save 326 CPU time in the PLC pitch search by making this smaller than MAX_PERIOD. The 327 current value corresponds to a pitch of 66.67 Hz. */ 328#define PLC_PITCH_LAG_MAX (720) 329/* The minimum pitch lag to allow in the pitch-based PLC. This corresponds to a 330 pitch of 480 Hz. */ 331#define PLC_PITCH_LAG_MIN (100) 332 333static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, opus_val16 * OPUS_RESTRICT pcm, int N, int LM) 334{ 335 int c; 336 int i; 337 const int C = st->channels; 338 celt_sig *decode_mem[2]; 339 celt_sig *out_syn[2]; 340 opus_val16 *lpc; 341 opus_val16 *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE; 342 const OpusCustomMode *mode; 343 int nbEBands; 344 int overlap; 345 int start; 346 int downsample; 347 int loss_count; 348 int noise_based; 349 const opus_int16 *eBands; 350 VARDECL(celt_sig, scratch); 351 SAVE_STACK; 352 353 mode = st->mode; 354 nbEBands = mode->nbEBands; 355 overlap = mode->overlap; 356 eBands = mode->eBands; 357 358 c=0; do { 359 decode_mem[c] = st->_decode_mem + c*(DECODE_BUFFER_SIZE+overlap); 360 out_syn[c] = decode_mem[c]+DECODE_BUFFER_SIZE-N; 361 } while (++c<C); 362 lpc = (opus_val16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+overlap)*C); 363 oldBandE = lpc+C*LPC_ORDER; 364 oldLogE = oldBandE + 2*nbEBands; 365 oldLogE2 = oldLogE + 2*nbEBands; 366 backgroundLogE = oldLogE2 + 2*nbEBands; 367 368 loss_count = st->loss_count; 369 start = st->start; 370 downsample = st->downsample; 371 noise_based = loss_count >= 5 || start != 0; 372 ALLOC(scratch, noise_based?N*C:N, celt_sig); 373 if (noise_based) 374 { 375 /* Noise-based PLC/CNG */ 376 celt_sig *freq; 377 VARDECL(celt_norm, X); 378 opus_uint32 seed; 379 opus_val16 *plcLogE; 380 int end; 381 int effEnd; 382 383 end = st->end; 384 effEnd = IMAX(start, IMIN(end, mode->effEBands)); 385 386 /* Share the interleaved signal MDCT coefficient buffer with the 387 deemphasis scratch buffer. */ 388 freq = scratch; 389 ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */ 390 391 if (loss_count >= 5) 392 plcLogE = backgroundLogE; 393 else { 394 /* Energy decay */ 395 opus_val16 decay = loss_count==0 ? 396 QCONST16(1.5f, DB_SHIFT) : QCONST16(.5f, DB_SHIFT); 397 c=0; do 398 { 399 for (i=start;i<end;i++) 400 oldBandE[c*nbEBands+i] -= decay; 401 } while (++c<C); 402 plcLogE = oldBandE; 403 } 404 seed = st->rng; 405 for (c=0;c<C;c++) 406 { 407 for (i=start;i<effEnd;i++) 408 { 409 int j; 410 int boffs; 411 int blen; 412 boffs = N*c+(eBands[i]<<LM); 413 blen = (eBands[i+1]-eBands[i])<<LM; 414 for (j=0;j<blen;j++) 415 { 416 seed = celt_lcg_rand(seed); 417 X[boffs+j] = (celt_norm)((opus_int32)seed>>20); 418 } 419 renormalise_vector(X+boffs, blen, Q15ONE); 420 } 421 } 422 st->rng = seed; 423 424 denormalise_bands(mode, X, freq, plcLogE, start, effEnd, C, 1<<LM); 425 426 c=0; do { 427 int bound = eBands[effEnd]<<LM; 428 if (downsample!=1) 429 bound = IMIN(bound, N/downsample); 430 for (i=bound;i<N;i++) 431 freq[c*N+i] = 0; 432 } while (++c<C); 433 c=0; do { 434 OPUS_MOVE(decode_mem[c], decode_mem[c]+N, 435 DECODE_BUFFER_SIZE-N+(overlap>>1)); 436 } while (++c<C); 437 compute_inv_mdcts(mode, 0, freq, out_syn, C, LM); 438 } else { 439 /* Pitch-based PLC */ 440 const opus_val16 *window; 441 opus_val16 fade = Q15ONE; 442 int pitch_index; 443 VARDECL(opus_val32, etmp); 444 VARDECL(opus_val16, exc); 445 446 if (loss_count == 0) 447 { 448 VARDECL( opus_val16, lp_pitch_buf ); 449 ALLOC( lp_pitch_buf, DECODE_BUFFER_SIZE>>1, opus_val16 ); 450 pitch_downsample(decode_mem, lp_pitch_buf, 451 DECODE_BUFFER_SIZE, C, st->arch); 452 pitch_search(lp_pitch_buf+(PLC_PITCH_LAG_MAX>>1), lp_pitch_buf, 453 DECODE_BUFFER_SIZE-PLC_PITCH_LAG_MAX, 454 PLC_PITCH_LAG_MAX-PLC_PITCH_LAG_MIN, &pitch_index, st->arch); 455 pitch_index = PLC_PITCH_LAG_MAX-pitch_index; 456 st->last_pitch_index = pitch_index; 457 } else { 458 pitch_index = st->last_pitch_index; 459 fade = QCONST16(.8f,15); 460 } 461 462 ALLOC(etmp, overlap, opus_val32); 463 ALLOC(exc, MAX_PERIOD, opus_val16); 464 window = mode->window; 465 c=0; do { 466 opus_val16 decay; 467 opus_val16 attenuation; 468 opus_val32 S1=0; 469 celt_sig *buf; 470 int extrapolation_offset; 471 int extrapolation_len; 472 int exc_length; 473 int j; 474 475 buf = decode_mem[c]; 476 for (i=0;i<MAX_PERIOD;i++) { 477 exc[i] = ROUND16(buf[DECODE_BUFFER_SIZE-MAX_PERIOD+i], SIG_SHIFT); 478 } 479 480 if (loss_count == 0) 481 { 482 opus_val32 ac[LPC_ORDER+1]; 483 /* Compute LPC coefficients for the last MAX_PERIOD samples before 484 the first loss so we can work in the excitation-filter domain. */ 485 _celt_autocorr(exc, ac, window, overlap, 486 LPC_ORDER, MAX_PERIOD, st->arch); 487 /* Add a noise floor of -40 dB. */ 488#ifdef FIXED_POINT 489 ac[0] += SHR32(ac[0],13); 490#else 491 ac[0] *= 1.0001f; 492#endif 493 /* Use lag windowing to stabilize the Levinson-Durbin recursion. */ 494 for (i=1;i<=LPC_ORDER;i++) 495 { 496 /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/ 497#ifdef FIXED_POINT 498 ac[i] -= MULT16_32_Q15(2*i*i, ac[i]); 499#else 500 ac[i] -= ac[i]*(0.008f*0.008f)*i*i; 501#endif 502 } 503 _celt_lpc(lpc+c*LPC_ORDER, ac, LPC_ORDER); 504 } 505 /* We want the excitation for 2 pitch periods in order to look for a 506 decaying signal, but we can't get more than MAX_PERIOD. */ 507 exc_length = IMIN(2*pitch_index, MAX_PERIOD); 508 /* Initialize the LPC history with the samples just before the start 509 of the region for which we're computing the excitation. */ 510 { 511 opus_val16 lpc_mem[LPC_ORDER]; 512 for (i=0;i<LPC_ORDER;i++) 513 { 514 lpc_mem[i] = 515 ROUND16(buf[DECODE_BUFFER_SIZE-exc_length-1-i], SIG_SHIFT); 516 } 517 /* Compute the excitation for exc_length samples before the loss. */ 518 celt_fir(exc+MAX_PERIOD-exc_length, lpc+c*LPC_ORDER, 519 exc+MAX_PERIOD-exc_length, exc_length, LPC_ORDER, lpc_mem); 520 } 521 522 /* Check if the waveform is decaying, and if so how fast. 523 We do this to avoid adding energy when concealing in a segment 524 with decaying energy. */ 525 { 526 opus_val32 E1=1, E2=1; 527 int decay_length; 528#ifdef FIXED_POINT 529 int shift = IMAX(0,2*celt_zlog2(celt_maxabs16(&exc[MAX_PERIOD-exc_length], exc_length))-20); 530#endif 531 decay_length = exc_length>>1; 532 for (i=0;i<decay_length;i++) 533 { 534 opus_val16 e; 535 e = exc[MAX_PERIOD-decay_length+i]; 536 E1 += SHR32(MULT16_16(e, e), shift); 537 e = exc[MAX_PERIOD-2*decay_length+i]; 538 E2 += SHR32(MULT16_16(e, e), shift); 539 } 540 E1 = MIN32(E1, E2); 541 decay = celt_sqrt(frac_div32(SHR32(E1, 1), E2)); 542 } 543 544 /* Move the decoder memory one frame to the left to give us room to 545 add the data for the new frame. We ignore the overlap that extends 546 past the end of the buffer, because we aren't going to use it. */ 547 OPUS_MOVE(buf, buf+N, DECODE_BUFFER_SIZE-N); 548 549 /* Extrapolate from the end of the excitation with a period of 550 "pitch_index", scaling down each period by an additional factor of 551 "decay". */ 552 extrapolation_offset = MAX_PERIOD-pitch_index; 553 /* We need to extrapolate enough samples to cover a complete MDCT 554 window (including overlap/2 samples on both sides). */ 555 extrapolation_len = N+overlap; 556 /* We also apply fading if this is not the first loss. */ 557 attenuation = MULT16_16_Q15(fade, decay); 558 for (i=j=0;i<extrapolation_len;i++,j++) 559 { 560 opus_val16 tmp; 561 if (j >= pitch_index) { 562 j -= pitch_index; 563 attenuation = MULT16_16_Q15(attenuation, decay); 564 } 565 buf[DECODE_BUFFER_SIZE-N+i] = 566 SHL32(EXTEND32(MULT16_16_Q15(attenuation, 567 exc[extrapolation_offset+j])), SIG_SHIFT); 568 /* Compute the energy of the previously decoded signal whose 569 excitation we're copying. */ 570 tmp = ROUND16( 571 buf[DECODE_BUFFER_SIZE-MAX_PERIOD-N+extrapolation_offset+j], 572 SIG_SHIFT); 573 S1 += SHR32(MULT16_16(tmp, tmp), 8); 574 } 575 576 { 577 opus_val16 lpc_mem[LPC_ORDER]; 578 /* Copy the last decoded samples (prior to the overlap region) to 579 synthesis filter memory so we can have a continuous signal. */ 580 for (i=0;i<LPC_ORDER;i++) 581 lpc_mem[i] = ROUND16(buf[DECODE_BUFFER_SIZE-N-1-i], SIG_SHIFT); 582 /* Apply the synthesis filter to convert the excitation back into 583 the signal domain. */ 584 celt_iir(buf+DECODE_BUFFER_SIZE-N, lpc+c*LPC_ORDER, 585 buf+DECODE_BUFFER_SIZE-N, extrapolation_len, LPC_ORDER, 586 lpc_mem); 587 } 588 589 /* Check if the synthesis energy is higher than expected, which can 590 happen with the signal changes during our window. If so, 591 attenuate. */ 592 { 593 opus_val32 S2=0; 594 for (i=0;i<extrapolation_len;i++) 595 { 596 opus_val16 tmp = ROUND16(buf[DECODE_BUFFER_SIZE-N+i], SIG_SHIFT); 597 S2 += SHR32(MULT16_16(tmp, tmp), 8); 598 } 599 /* This checks for an "explosion" in the synthesis. */ 600#ifdef FIXED_POINT 601 if (!(S1 > SHR32(S2,2))) 602#else 603 /* The float test is written this way to catch NaNs in the output 604 of the IIR filter at the same time. */ 605 if (!(S1 > 0.2f*S2)) 606#endif 607 { 608 for (i=0;i<extrapolation_len;i++) 609 buf[DECODE_BUFFER_SIZE-N+i] = 0; 610 } else if (S1 < S2) 611 { 612 opus_val16 ratio = celt_sqrt(frac_div32(SHR32(S1,1)+1,S2+1)); 613 for (i=0;i<overlap;i++) 614 { 615 opus_val16 tmp_g = Q15ONE 616 - MULT16_16_Q15(window[i], Q15ONE-ratio); 617 buf[DECODE_BUFFER_SIZE-N+i] = 618 MULT16_32_Q15(tmp_g, buf[DECODE_BUFFER_SIZE-N+i]); 619 } 620 for (i=overlap;i<extrapolation_len;i++) 621 { 622 buf[DECODE_BUFFER_SIZE-N+i] = 623 MULT16_32_Q15(ratio, buf[DECODE_BUFFER_SIZE-N+i]); 624 } 625 } 626 } 627 628 /* Apply the pre-filter to the MDCT overlap for the next frame because 629 the post-filter will be re-applied in the decoder after the MDCT 630 overlap. */ 631 comb_filter(etmp, buf+DECODE_BUFFER_SIZE, 632 st->postfilter_period, st->postfilter_period, overlap, 633 -st->postfilter_gain, -st->postfilter_gain, 634 st->postfilter_tapset, st->postfilter_tapset, NULL, 0); 635 636 /* Simulate TDAC on the concealed audio so that it blends with the 637 MDCT of the next frame. */ 638 for (i=0;i<overlap/2;i++) 639 { 640 buf[DECODE_BUFFER_SIZE+i] = 641 MULT16_32_Q15(window[i], etmp[overlap-1-i]) 642 + MULT16_32_Q15(window[overlap-i-1], etmp[i]); 643 } 644 } while (++c<C); 645 } 646 647 deemphasis(out_syn, pcm, N, C, downsample, 648 mode->preemph, st->preemph_memD, scratch); 649 650 st->loss_count = loss_count+1; 651 652 RESTORE_STACK; 653} 654 655int celt_decode_with_ec(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, opus_val16 * OPUS_RESTRICT pcm, int frame_size, ec_dec *dec) 656{ 657 int c, i, N; 658 int spread_decision; 659 opus_int32 bits; 660 ec_dec _dec; 661 VARDECL(celt_sig, freq); 662 VARDECL(celt_norm, X); 663 VARDECL(int, fine_quant); 664 VARDECL(int, pulses); 665 VARDECL(int, cap); 666 VARDECL(int, offsets); 667 VARDECL(int, fine_priority); 668 VARDECL(int, tf_res); 669 VARDECL(unsigned char, collapse_masks); 670 celt_sig *decode_mem[2]; 671 celt_sig *out_syn[2]; 672 opus_val16 *lpc; 673 opus_val16 *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE; 674 675 int shortBlocks; 676 int isTransient; 677 int intra_ener; 678 const int CC = st->channels; 679 int LM, M; 680 int effEnd; 681 int codedBands; 682 int alloc_trim; 683 int postfilter_pitch; 684 opus_val16 postfilter_gain; 685 int intensity=0; 686 int dual_stereo=0; 687 opus_int32 total_bits; 688 opus_int32 balance; 689 opus_int32 tell; 690 int dynalloc_logp; 691 int postfilter_tapset; 692 int anti_collapse_rsv; 693 int anti_collapse_on=0; 694 int silence; 695 int C = st->stream_channels; 696 const OpusCustomMode *mode; 697 int nbEBands; 698 int overlap; 699 const opus_int16 *eBands; 700 ALLOC_STACK; 701 702 mode = st->mode; 703 nbEBands = mode->nbEBands; 704 overlap = mode->overlap; 705 eBands = mode->eBands; 706 frame_size *= st->downsample; 707 708 c=0; do { 709 decode_mem[c] = st->_decode_mem + c*(DECODE_BUFFER_SIZE+overlap); 710 } while (++c<CC); 711 lpc = (opus_val16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+overlap)*CC); 712 oldBandE = lpc+CC*LPC_ORDER; 713 oldLogE = oldBandE + 2*nbEBands; 714 oldLogE2 = oldLogE + 2*nbEBands; 715 backgroundLogE = oldLogE2 + 2*nbEBands; 716 717#ifdef CUSTOM_MODES 718 if (st->signalling && data!=NULL) 719 { 720 int data0=data[0]; 721 /* Convert "standard mode" to Opus header */ 722 if (mode->Fs==48000 && mode->shortMdctSize==120) 723 { 724 data0 = fromOpus(data0); 725 if (data0<0) 726 return OPUS_INVALID_PACKET; 727 } 728 st->end = IMAX(1, mode->effEBands-2*(data0>>5)); 729 LM = (data0>>3)&0x3; 730 C = 1 + ((data0>>2)&0x1); 731 data++; 732 len--; 733 if (LM>mode->maxLM) 734 return OPUS_INVALID_PACKET; 735 if (frame_size < mode->shortMdctSize<<LM) 736 return OPUS_BUFFER_TOO_SMALL; 737 else 738 frame_size = mode->shortMdctSize<<LM; 739 } else { 740#else 741 { 742#endif 743 for (LM=0;LM<=mode->maxLM;LM++) 744 if (mode->shortMdctSize<<LM==frame_size) 745 break; 746 if (LM>mode->maxLM) 747 return OPUS_BAD_ARG; 748 } 749 M=1<<LM; 750 751 if (len<0 || len>1275 || pcm==NULL) 752 return OPUS_BAD_ARG; 753 754 N = M*mode->shortMdctSize; 755 756 effEnd = st->end; 757 if (effEnd > mode->effEBands) 758 effEnd = mode->effEBands; 759 760 if (data == NULL || len<=1) 761 { 762 celt_decode_lost(st, pcm, N, LM); 763 RESTORE_STACK; 764 return frame_size/st->downsample; 765 } 766 767 if (dec == NULL) 768 { 769 ec_dec_init(&_dec,(unsigned char*)data,len); 770 dec = &_dec; 771 } 772 773 if (C==1) 774 { 775 for (i=0;i<nbEBands;i++) 776 oldBandE[i]=MAX16(oldBandE[i],oldBandE[nbEBands+i]); 777 } 778 779 total_bits = len*8; 780 tell = ec_tell(dec); 781 782 if (tell >= total_bits) 783 silence = 1; 784 else if (tell==1) 785 silence = ec_dec_bit_logp(dec, 15); 786 else 787 silence = 0; 788 if (silence) 789 { 790 /* Pretend we've read all the remaining bits */ 791 tell = len*8; 792 dec->nbits_total+=tell-ec_tell(dec); 793 } 794 795 postfilter_gain = 0; 796 postfilter_pitch = 0; 797 postfilter_tapset = 0; 798 if (st->start==0 && tell+16 <= total_bits) 799 { 800 if(ec_dec_bit_logp(dec, 1)) 801 { 802 int qg, octave; 803 octave = ec_dec_uint(dec, 6); 804 postfilter_pitch = (16<<octave)+ec_dec_bits(dec, 4+octave)-1; 805 qg = ec_dec_bits(dec, 3); 806 if (ec_tell(dec)+2<=total_bits) 807 postfilter_tapset = ec_dec_icdf(dec, tapset_icdf, 2); 808 postfilter_gain = QCONST16(.09375f,15)*(qg+1); 809 } 810 tell = ec_tell(dec); 811 } 812 813 if (LM > 0 && tell+3 <= total_bits) 814 { 815 isTransient = ec_dec_bit_logp(dec, 3); 816 tell = ec_tell(dec); 817 } 818 else 819 isTransient = 0; 820 821 if (isTransient) 822 shortBlocks = M; 823 else 824 shortBlocks = 0; 825 826 /* Decode the global flags (first symbols in the stream) */ 827 intra_ener = tell+3<=total_bits ? ec_dec_bit_logp(dec, 3) : 0; 828 /* Get band energies */ 829 unquant_coarse_energy(mode, st->start, st->end, oldBandE, 830 intra_ener, dec, C, LM); 831 832 ALLOC(tf_res, nbEBands, int); 833 tf_decode(st->start, st->end, isTransient, tf_res, LM, dec); 834 835 tell = ec_tell(dec); 836 spread_decision = SPREAD_NORMAL; 837 if (tell+4 <= total_bits) 838 spread_decision = ec_dec_icdf(dec, spread_icdf, 5); 839 840 ALLOC(cap, nbEBands, int); 841 842 init_caps(mode,cap,LM,C); 843 844 ALLOC(offsets, nbEBands, int); 845 846 dynalloc_logp = 6; 847 total_bits<<=BITRES; 848 tell = ec_tell_frac(dec); 849 for (i=st->start;i<st->end;i++) 850 { 851 int width, quanta; 852 int dynalloc_loop_logp; 853 int boost; 854 width = C*(eBands[i+1]-eBands[i])<<LM; 855 /* quanta is 6 bits, but no more than 1 bit/sample 856 and no less than 1/8 bit/sample */ 857 quanta = IMIN(width<<BITRES, IMAX(6<<BITRES, width)); 858 dynalloc_loop_logp = dynalloc_logp; 859 boost = 0; 860 while (tell+(dynalloc_loop_logp<<BITRES) < total_bits && boost < cap[i]) 861 { 862 int flag; 863 flag = ec_dec_bit_logp(dec, dynalloc_loop_logp); 864 tell = ec_tell_frac(dec); 865 if (!flag) 866 break; 867 boost += quanta; 868 total_bits -= quanta; 869 dynalloc_loop_logp = 1; 870 } 871 offsets[i] = boost; 872 /* Making dynalloc more likely */ 873 if (boost>0) 874 dynalloc_logp = IMAX(2, dynalloc_logp-1); 875 } 876 877 ALLOC(fine_quant, nbEBands, int); 878 alloc_trim = tell+(6<<BITRES) <= total_bits ? 879 ec_dec_icdf(dec, trim_icdf, 7) : 5; 880 881 bits = (((opus_int32)len*8)<<BITRES) - ec_tell_frac(dec) - 1; 882 anti_collapse_rsv = isTransient&&LM>=2&&bits>=((LM+2)<<BITRES) ? (1<<BITRES) : 0; 883 bits -= anti_collapse_rsv; 884 885 ALLOC(pulses, nbEBands, int); 886 ALLOC(fine_priority, nbEBands, int); 887 888 codedBands = compute_allocation(mode, st->start, st->end, offsets, cap, 889 alloc_trim, &intensity, &dual_stereo, bits, &balance, pulses, 890 fine_quant, fine_priority, C, LM, dec, 0, 0, 0); 891 892 unquant_fine_energy(mode, st->start, st->end, oldBandE, fine_quant, dec, C); 893 894 /* Decode fixed codebook */ 895 ALLOC(collapse_masks, C*nbEBands, unsigned char); 896 ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */ 897 898 quant_all_bands(0, mode, st->start, st->end, X, C==2 ? X+N : NULL, collapse_masks, 899 NULL, pulses, shortBlocks, spread_decision, dual_stereo, intensity, tf_res, 900 len*(8<<BITRES)-anti_collapse_rsv, balance, dec, LM, codedBands, &st->rng); 901 902 if (anti_collapse_rsv > 0) 903 { 904 anti_collapse_on = ec_dec_bits(dec, 1); 905 } 906 907 unquant_energy_finalise(mode, st->start, st->end, oldBandE, 908 fine_quant, fine_priority, len*8-ec_tell(dec), dec, C); 909 910 if (anti_collapse_on) 911 anti_collapse(mode, X, collapse_masks, LM, C, N, 912 st->start, st->end, oldBandE, oldLogE, oldLogE2, pulses, st->rng); 913 914 ALLOC(freq, IMAX(CC,C)*N, celt_sig); /**< Interleaved signal MDCTs */ 915 916 if (silence) 917 { 918 for (i=0;i<C*nbEBands;i++) 919 oldBandE[i] = -QCONST16(28.f,DB_SHIFT); 920 for (i=0;i<C*N;i++) 921 freq[i] = 0; 922 } else { 923 /* Synthesis */ 924 denormalise_bands(mode, X, freq, oldBandE, st->start, effEnd, C, M); 925 } 926 c=0; do { 927 OPUS_MOVE(decode_mem[c], decode_mem[c]+N, DECODE_BUFFER_SIZE-N+overlap/2); 928 } while (++c<CC); 929 930 c=0; do { 931 int bound = M*eBands[effEnd]; 932 if (st->downsample!=1) 933 bound = IMIN(bound, N/st->downsample); 934 for (i=bound;i<N;i++) 935 freq[c*N+i] = 0; 936 } while (++c<C); 937 938 c=0; do { 939 out_syn[c] = decode_mem[c]+DECODE_BUFFER_SIZE-N; 940 } while (++c<CC); 941 942 if (CC==2&&C==1) 943 { 944 for (i=0;i<N;i++) 945 freq[N+i] = freq[i]; 946 } 947 if (CC==1&&C==2) 948 { 949 for (i=0;i<N;i++) 950 freq[i] = HALF32(ADD32(freq[i],freq[N+i])); 951 } 952 953 /* Compute inverse MDCTs */ 954 compute_inv_mdcts(mode, shortBlocks, freq, out_syn, CC, LM); 955 956 c=0; do { 957 st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD); 958 st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD); 959 comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize, 960 st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset, 961 mode->window, overlap); 962 if (LM!=0) 963 comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctSize, st->postfilter_period, postfilter_pitch, N-mode->shortMdctSize, 964 st->postfilter_gain, postfilter_gain, st->postfilter_tapset, postfilter_tapset, 965 mode->window, overlap); 966 967 } while (++c<CC); 968 st->postfilter_period_old = st->postfilter_period; 969 st->postfilter_gain_old = st->postfilter_gain; 970 st->postfilter_tapset_old = st->postfilter_tapset; 971 st->postfilter_period = postfilter_pitch; 972 st->postfilter_gain = postfilter_gain; 973 st->postfilter_tapset = postfilter_tapset; 974 if (LM!=0) 975 { 976 st->postfilter_period_old = st->postfilter_period; 977 st->postfilter_gain_old = st->postfilter_gain; 978 st->postfilter_tapset_old = st->postfilter_tapset; 979 } 980 981 if (C==1) { 982 for (i=0;i<nbEBands;i++) 983 oldBandE[nbEBands+i]=oldBandE[i]; 984 } 985 986 /* In case start or end were to change */ 987 if (!isTransient) 988 { 989 for (i=0;i<2*nbEBands;i++) 990 oldLogE2[i] = oldLogE[i]; 991 for (i=0;i<2*nbEBands;i++) 992 oldLogE[i] = oldBandE[i]; 993 for (i=0;i<2*nbEBands;i++) 994 backgroundLogE[i] = MIN16(backgroundLogE[i] + M*QCONST16(0.001f,DB_SHIFT), oldBandE[i]); 995 } else { 996 for (i=0;i<2*nbEBands;i++) 997 oldLogE[i] = MIN16(oldLogE[i], oldBandE[i]); 998 } 999 c=0; do 1000 { 1001 for (i=0;i<st->start;i++) 1002 { 1003 oldBandE[c*nbEBands+i]=0; 1004 oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-QCONST16(28.f,DB_SHIFT); 1005 } 1006 for (i=st->end;i<nbEBands;i++) 1007 { 1008 oldBandE[c*nbEBands+i]=0; 1009 oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-QCONST16(28.f,DB_SHIFT); 1010 } 1011 } while (++c<2); 1012 st->rng = dec->rng; 1013 1014 /* We reuse freq[] as scratch space for the de-emphasis */ 1015 deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, freq); 1016 st->loss_count = 0; 1017 RESTORE_STACK; 1018 if (ec_tell(dec) > 8*len) 1019 return OPUS_INTERNAL_ERROR; 1020 if(ec_get_error(dec)) 1021 st->error = 1; 1022 return frame_size/st->downsample; 1023} 1024 1025 1026#ifdef CUSTOM_MODES 1027 1028#ifdef FIXED_POINT 1029int opus_custom_decode(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, opus_int16 * OPUS_RESTRICT pcm, int frame_size) 1030{ 1031 return celt_decode_with_ec(st, data, len, pcm, frame_size, NULL); 1032} 1033 1034#ifndef DISABLE_FLOAT_API 1035int opus_custom_decode_float(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, float * OPUS_RESTRICT pcm, int frame_size) 1036{ 1037 int j, ret, C, N; 1038 VARDECL(opus_int16, out); 1039 ALLOC_STACK; 1040 1041 if (pcm==NULL) 1042 return OPUS_BAD_ARG; 1043 1044 C = st->channels; 1045 N = frame_size; 1046 1047 ALLOC(out, C*N, opus_int16); 1048 ret=celt_decode_with_ec(st, data, len, out, frame_size, NULL); 1049 if (ret>0) 1050 for (j=0;j<C*ret;j++) 1051 pcm[j]=out[j]*(1.f/32768.f); 1052 1053 RESTORE_STACK; 1054 return ret; 1055} 1056#endif /* DISABLE_FLOAT_API */ 1057 1058#else 1059 1060int opus_custom_decode_float(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, float * OPUS_RESTRICT pcm, int frame_size) 1061{ 1062 return celt_decode_with_ec(st, data, len, pcm, frame_size, NULL); 1063} 1064 1065int opus_custom_decode(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, opus_int16 * OPUS_RESTRICT pcm, int frame_size) 1066{ 1067 int j, ret, C, N; 1068 VARDECL(celt_sig, out); 1069 ALLOC_STACK; 1070 1071 if (pcm==NULL) 1072 return OPUS_BAD_ARG; 1073 1074 C = st->channels; 1075 N = frame_size; 1076 ALLOC(out, C*N, celt_sig); 1077 1078 ret=celt_decode_with_ec(st, data, len, out, frame_size, NULL); 1079 1080 if (ret>0) 1081 for (j=0;j<C*ret;j++) 1082 pcm[j] = FLOAT2INT16 (out[j]); 1083 1084 RESTORE_STACK; 1085 return ret; 1086} 1087 1088#endif 1089#endif /* CUSTOM_MODES */ 1090 1091int opus_custom_decoder_ctl(CELTDecoder * OPUS_RESTRICT st, int request, ...) 1092{ 1093 va_list ap; 1094 1095 va_start(ap, request); 1096 switch (request) 1097 { 1098 case CELT_SET_START_BAND_REQUEST: 1099 { 1100 opus_int32 value = va_arg(ap, opus_int32); 1101 if (value<0 || value>=st->mode->nbEBands) 1102 goto bad_arg; 1103 st->start = value; 1104 } 1105 break; 1106 case CELT_SET_END_BAND_REQUEST: 1107 { 1108 opus_int32 value = va_arg(ap, opus_int32); 1109 if (value<1 || value>st->mode->nbEBands) 1110 goto bad_arg; 1111 st->end = value; 1112 } 1113 break; 1114 case CELT_SET_CHANNELS_REQUEST: 1115 { 1116 opus_int32 value = va_arg(ap, opus_int32); 1117 if (value<1 || value>2) 1118 goto bad_arg; 1119 st->stream_channels = value; 1120 } 1121 break; 1122 case CELT_GET_AND_CLEAR_ERROR_REQUEST: 1123 { 1124 opus_int32 *value = va_arg(ap, opus_int32*); 1125 if (value==NULL) 1126 goto bad_arg; 1127 *value=st->error; 1128 st->error = 0; 1129 } 1130 break; 1131 case OPUS_GET_LOOKAHEAD_REQUEST: 1132 { 1133 opus_int32 *value = va_arg(ap, opus_int32*); 1134 if (value==NULL) 1135 goto bad_arg; 1136 *value = st->overlap/st->downsample; 1137 } 1138 break; 1139 case OPUS_RESET_STATE: 1140 { 1141 int i; 1142 opus_val16 *lpc, *oldBandE, *oldLogE, *oldLogE2; 1143 lpc = (opus_val16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+st->overlap)*st->channels); 1144 oldBandE = lpc+st->channels*LPC_ORDER; 1145 oldLogE = oldBandE + 2*st->mode->nbEBands; 1146 oldLogE2 = oldLogE + 2*st->mode->nbEBands; 1147 OPUS_CLEAR((char*)&st->DECODER_RESET_START, 1148 opus_custom_decoder_get_size(st->mode, st->channels)- 1149 ((char*)&st->DECODER_RESET_START - (char*)st)); 1150 for (i=0;i<2*st->mode->nbEBands;i++) 1151 oldLogE[i]=oldLogE2[i]=-QCONST16(28.f,DB_SHIFT); 1152 } 1153 break; 1154 case OPUS_GET_PITCH_REQUEST: 1155 { 1156 opus_int32 *value = va_arg(ap, opus_int32*); 1157 if (value==NULL) 1158 goto bad_arg; 1159 *value = st->postfilter_period; 1160 } 1161 break; 1162 case CELT_GET_MODE_REQUEST: 1163 { 1164 const CELTMode ** value = va_arg(ap, const CELTMode**); 1165 if (value==0) 1166 goto bad_arg; 1167 *value=st->mode; 1168 } 1169 break; 1170 case CELT_SET_SIGNALLING_REQUEST: 1171 { 1172 opus_int32 value = va_arg(ap, opus_int32); 1173 st->signalling = value; 1174 } 1175 break; 1176 case OPUS_GET_FINAL_RANGE_REQUEST: 1177 { 1178 opus_uint32 * value = va_arg(ap, opus_uint32 *); 1179 if (value==0) 1180 goto bad_arg; 1181 *value=st->rng; 1182 } 1183 break; 1184 default: 1185 goto bad_request; 1186 } 1187 va_end(ap); 1188 return OPUS_OK; 1189bad_arg: 1190 va_end(ap); 1191 return OPUS_BAD_ARG; 1192bad_request: 1193 va_end(ap); 1194 return OPUS_UNIMPLEMENTED; 1195} 1196