| OLD | NEW |
| 1 /* Copyright (c) 2007-2008 CSIRO | 1 /* Copyright (c) 2007-2008 CSIRO |
| 2 Copyright (c) 2007-2010 Xiph.Org Foundation | 2 Copyright (c) 2007-2010 Xiph.Org Foundation |
| 3 Copyright (c) 2008 Gregory Maxwell | 3 Copyright (c) 2008 Gregory Maxwell |
| 4 Written by Jean-Marc Valin and Gregory Maxwell */ | 4 Written by Jean-Marc Valin and Gregory Maxwell */ |
| 5 /* | 5 /* |
| 6 Redistribution and use in source and binary forms, with or without | 6 Redistribution and use in source and binary forms, with or without |
| 7 modification, are permitted provided that the following conditions | 7 modification, are permitted provided that the following conditions |
| 8 are met: | 8 are met: |
| 9 | 9 |
| 10 - Redistributions of source code must retain the above copyright | 10 - Redistributions of source code must retain the above copyright |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 return OPUS_OK; | 168 return OPUS_OK; |
| 169 } | 169 } |
| 170 | 170 |
| 171 #ifdef CUSTOM_MODES | 171 #ifdef CUSTOM_MODES |
| 172 void opus_custom_decoder_destroy(CELTDecoder *st) | 172 void opus_custom_decoder_destroy(CELTDecoder *st) |
| 173 { | 173 { |
| 174 opus_free(st); | 174 opus_free(st); |
| 175 } | 175 } |
| 176 #endif /* CUSTOM_MODES */ | 176 #endif /* CUSTOM_MODES */ |
| 177 | 177 |
| 178 static inline opus_val16 SIG2WORD16(celt_sig x) | 178 static OPUS_INLINE opus_val16 SIG2WORD16(celt_sig x) |
| 179 { | 179 { |
| 180 #ifdef FIXED_POINT | 180 #ifdef FIXED_POINT |
| 181 x = PSHR32(x, SIG_SHIFT); | 181 x = PSHR32(x, SIG_SHIFT); |
| 182 x = MAX32(x, -32768); | 182 x = MAX32(x, -32768); |
| 183 x = MIN32(x, 32767); | 183 x = MIN32(x, 32767); |
| 184 return EXTRACT16(x); | 184 return EXTRACT16(x); |
| 185 #else | 185 #else |
| 186 return (opus_val16)x; | 186 return (opus_val16)x; |
| 187 #endif | 187 #endif |
| 188 } | 188 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 206 celt_sig m = mem[c]; | 206 celt_sig m = mem[c]; |
| 207 x =in[c]; | 207 x =in[c]; |
| 208 y = pcm+c; | 208 y = pcm+c; |
| 209 #ifdef CUSTOM_MODES | 209 #ifdef CUSTOM_MODES |
| 210 if (coef[1] != 0) | 210 if (coef[1] != 0) |
| 211 { | 211 { |
| 212 opus_val16 coef1 = coef[1]; | 212 opus_val16 coef1 = coef[1]; |
| 213 opus_val16 coef3 = coef[3]; | 213 opus_val16 coef3 = coef[3]; |
| 214 for (j=0;j<N;j++) | 214 for (j=0;j<N;j++) |
| 215 { | 215 { |
| 216 celt_sig tmp = x[j] + m; | 216 celt_sig tmp = x[j] + m + VERY_SMALL; |
| 217 m = MULT16_32_Q15(coef0, tmp) | 217 m = MULT16_32_Q15(coef0, tmp) |
| 218 - MULT16_32_Q15(coef1, x[j]); | 218 - MULT16_32_Q15(coef1, x[j]); |
| 219 tmp = SHL32(MULT16_32_Q15(coef3, tmp), 2); | 219 tmp = SHL32(MULT16_32_Q15(coef3, tmp), 2); |
| 220 scratch[j] = tmp; | 220 scratch[j] = tmp; |
| 221 } | 221 } |
| 222 apply_downsampling=1; | 222 apply_downsampling=1; |
| 223 } else | 223 } else |
| 224 #endif | 224 #endif |
| 225 if (downsample>1) | 225 if (downsample>1) |
| 226 { | 226 { |
| 227 /* Shortcut for the standard (non-custom modes) case */ | 227 /* Shortcut for the standard (non-custom modes) case */ |
| 228 for (j=0;j<N;j++) | 228 for (j=0;j<N;j++) |
| 229 { | 229 { |
| 230 celt_sig tmp = x[j] + m; | 230 celt_sig tmp = x[j] + m + VERY_SMALL; |
| 231 m = MULT16_32_Q15(coef0, tmp); | 231 m = MULT16_32_Q15(coef0, tmp); |
| 232 scratch[j] = tmp; | 232 scratch[j] = tmp; |
| 233 } | 233 } |
| 234 apply_downsampling=1; | 234 apply_downsampling=1; |
| 235 } else { | 235 } else { |
| 236 /* Shortcut for the standard (non-custom modes) case */ | 236 /* Shortcut for the standard (non-custom modes) case */ |
| 237 for (j=0;j<N;j++) | 237 for (j=0;j<N;j++) |
| 238 { | 238 { |
| 239 celt_sig tmp = x[j] + m + VERY_SMALL; | 239 celt_sig tmp = x[j] + m + VERY_SMALL; |
| 240 m = MULT16_32_Q15(coef0, tmp); | 240 m = MULT16_32_Q15(coef0, tmp); |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 440 const opus_val16 *window; | 440 const opus_val16 *window; |
| 441 opus_val16 fade = Q15ONE; | 441 opus_val16 fade = Q15ONE; |
| 442 int pitch_index; | 442 int pitch_index; |
| 443 VARDECL(opus_val32, etmp); | 443 VARDECL(opus_val32, etmp); |
| 444 VARDECL(opus_val16, exc); | 444 VARDECL(opus_val16, exc); |
| 445 | 445 |
| 446 if (loss_count == 0) | 446 if (loss_count == 0) |
| 447 { | 447 { |
| 448 VARDECL( opus_val16, lp_pitch_buf ); | 448 VARDECL( opus_val16, lp_pitch_buf ); |
| 449 ALLOC( lp_pitch_buf, DECODE_BUFFER_SIZE>>1, opus_val16 ); | 449 ALLOC( lp_pitch_buf, DECODE_BUFFER_SIZE>>1, opus_val16 ); |
| 450 pitch_downsample(decode_mem, lp_pitch_buf, DECODE_BUFFER_SIZE, C); | 450 pitch_downsample(decode_mem, lp_pitch_buf, |
| 451 DECODE_BUFFER_SIZE, C, st->arch); |
| 451 pitch_search(lp_pitch_buf+(PLC_PITCH_LAG_MAX>>1), lp_pitch_buf, | 452 pitch_search(lp_pitch_buf+(PLC_PITCH_LAG_MAX>>1), lp_pitch_buf, |
| 452 DECODE_BUFFER_SIZE-PLC_PITCH_LAG_MAX, | 453 DECODE_BUFFER_SIZE-PLC_PITCH_LAG_MAX, |
| 453 PLC_PITCH_LAG_MAX-PLC_PITCH_LAG_MIN, &pitch_index); | 454 PLC_PITCH_LAG_MAX-PLC_PITCH_LAG_MIN, &pitch_index, st->arch); |
| 454 pitch_index = PLC_PITCH_LAG_MAX-pitch_index; | 455 pitch_index = PLC_PITCH_LAG_MAX-pitch_index; |
| 455 st->last_pitch_index = pitch_index; | 456 st->last_pitch_index = pitch_index; |
| 456 } else { | 457 } else { |
| 457 pitch_index = st->last_pitch_index; | 458 pitch_index = st->last_pitch_index; |
| 458 fade = QCONST16(.8f,15); | 459 fade = QCONST16(.8f,15); |
| 459 } | 460 } |
| 460 | 461 |
| 461 ALLOC(etmp, overlap, opus_val32); | 462 ALLOC(etmp, overlap, opus_val32); |
| 462 ALLOC(exc, MAX_PERIOD, opus_val16); | 463 ALLOC(exc, MAX_PERIOD, opus_val16); |
| 463 window = mode->window; | 464 window = mode->window; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 474 buf = decode_mem[c]; | 475 buf = decode_mem[c]; |
| 475 for (i=0;i<MAX_PERIOD;i++) { | 476 for (i=0;i<MAX_PERIOD;i++) { |
| 476 exc[i] = ROUND16(buf[DECODE_BUFFER_SIZE-MAX_PERIOD+i], SIG_SHIFT); | 477 exc[i] = ROUND16(buf[DECODE_BUFFER_SIZE-MAX_PERIOD+i], SIG_SHIFT); |
| 477 } | 478 } |
| 478 | 479 |
| 479 if (loss_count == 0) | 480 if (loss_count == 0) |
| 480 { | 481 { |
| 481 opus_val32 ac[LPC_ORDER+1]; | 482 opus_val32 ac[LPC_ORDER+1]; |
| 482 /* Compute LPC coefficients for the last MAX_PERIOD samples before | 483 /* Compute LPC coefficients for the last MAX_PERIOD samples before |
| 483 the first loss so we can work in the excitation-filter domain. */ | 484 the first loss so we can work in the excitation-filter domain. */ |
| 484 _celt_autocorr(exc, ac, window, overlap, LPC_ORDER, MAX_PERIOD); | 485 _celt_autocorr(exc, ac, window, overlap, |
| 486 LPC_ORDER, MAX_PERIOD, st->arch); |
| 485 /* Add a noise floor of -40 dB. */ | 487 /* Add a noise floor of -40 dB. */ |
| 486 #ifdef FIXED_POINT | 488 #ifdef FIXED_POINT |
| 487 ac[0] += SHR32(ac[0],13); | 489 ac[0] += SHR32(ac[0],13); |
| 488 #else | 490 #else |
| 489 ac[0] *= 1.0001f; | 491 ac[0] *= 1.0001f; |
| 490 #endif | 492 #endif |
| 491 /* Use lag windowing to stabilize the Levinson-Durbin recursion. */ | 493 /* Use lag windowing to stabilize the Levinson-Durbin recursion. */ |
| 492 for (i=1;i<=LPC_ORDER;i++) | 494 for (i=1;i<=LPC_ORDER;i++) |
| 493 { | 495 { |
| 494 /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/ | 496 /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/ |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 658 ec_dec _dec; | 660 ec_dec _dec; |
| 659 VARDECL(celt_sig, freq); | 661 VARDECL(celt_sig, freq); |
| 660 VARDECL(celt_norm, X); | 662 VARDECL(celt_norm, X); |
| 661 VARDECL(int, fine_quant); | 663 VARDECL(int, fine_quant); |
| 662 VARDECL(int, pulses); | 664 VARDECL(int, pulses); |
| 663 VARDECL(int, cap); | 665 VARDECL(int, cap); |
| 664 VARDECL(int, offsets); | 666 VARDECL(int, offsets); |
| 665 VARDECL(int, fine_priority); | 667 VARDECL(int, fine_priority); |
| 666 VARDECL(int, tf_res); | 668 VARDECL(int, tf_res); |
| 667 VARDECL(unsigned char, collapse_masks); | 669 VARDECL(unsigned char, collapse_masks); |
| 668 celt_sig *out_mem[2]; | |
| 669 celt_sig *decode_mem[2]; | 670 celt_sig *decode_mem[2]; |
| 670 celt_sig *out_syn[2]; | 671 celt_sig *out_syn[2]; |
| 671 opus_val16 *lpc; | 672 opus_val16 *lpc; |
| 672 opus_val16 *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE; | 673 opus_val16 *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE; |
| 673 | 674 |
| 674 int shortBlocks; | 675 int shortBlocks; |
| 675 int isTransient; | 676 int isTransient; |
| 676 int intra_ener; | 677 int intra_ener; |
| 677 const int CC = st->channels; | 678 const int CC = st->channels; |
| 678 int LM, M; | 679 int LM, M; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 699 ALLOC_STACK; | 700 ALLOC_STACK; |
| 700 | 701 |
| 701 mode = st->mode; | 702 mode = st->mode; |
| 702 nbEBands = mode->nbEBands; | 703 nbEBands = mode->nbEBands; |
| 703 overlap = mode->overlap; | 704 overlap = mode->overlap; |
| 704 eBands = mode->eBands; | 705 eBands = mode->eBands; |
| 705 frame_size *= st->downsample; | 706 frame_size *= st->downsample; |
| 706 | 707 |
| 707 c=0; do { | 708 c=0; do { |
| 708 decode_mem[c] = st->_decode_mem + c*(DECODE_BUFFER_SIZE+overlap); | 709 decode_mem[c] = st->_decode_mem + c*(DECODE_BUFFER_SIZE+overlap); |
| 709 out_mem[c] = decode_mem[c]+DECODE_BUFFER_SIZE-MAX_PERIOD; | |
| 710 } while (++c<CC); | 710 } while (++c<CC); |
| 711 lpc = (opus_val16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+overlap)*CC); | 711 lpc = (opus_val16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+overlap)*CC); |
| 712 oldBandE = lpc+CC*LPC_ORDER; | 712 oldBandE = lpc+CC*LPC_ORDER; |
| 713 oldLogE = oldBandE + 2*nbEBands; | 713 oldLogE = oldBandE + 2*nbEBands; |
| 714 oldLogE2 = oldLogE + 2*nbEBands; | 714 oldLogE2 = oldLogE + 2*nbEBands; |
| 715 backgroundLogE = oldLogE2 + 2*nbEBands; | 715 backgroundLogE = oldLogE2 + 2*nbEBands; |
| 716 | 716 |
| 717 #ifdef CUSTOM_MODES | 717 #ifdef CUSTOM_MODES |
| 718 if (st->signalling && data!=NULL) | 718 if (st->signalling && data!=NULL) |
| 719 { | 719 { |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 929 | 929 |
| 930 c=0; do { | 930 c=0; do { |
| 931 int bound = M*eBands[effEnd]; | 931 int bound = M*eBands[effEnd]; |
| 932 if (st->downsample!=1) | 932 if (st->downsample!=1) |
| 933 bound = IMIN(bound, N/st->downsample); | 933 bound = IMIN(bound, N/st->downsample); |
| 934 for (i=bound;i<N;i++) | 934 for (i=bound;i<N;i++) |
| 935 freq[c*N+i] = 0; | 935 freq[c*N+i] = 0; |
| 936 } while (++c<C); | 936 } while (++c<C); |
| 937 | 937 |
| 938 c=0; do { | 938 c=0; do { |
| 939 out_syn[c] = out_mem[c]+MAX_PERIOD-N; | 939 out_syn[c] = decode_mem[c]+DECODE_BUFFER_SIZE-N; |
| 940 } while (++c<CC); | 940 } while (++c<CC); |
| 941 | 941 |
| 942 if (CC==2&&C==1) | 942 if (CC==2&&C==1) |
| 943 { | 943 { |
| 944 for (i=0;i<N;i++) | 944 for (i=0;i<N;i++) |
| 945 freq[N+i] = freq[i]; | 945 freq[N+i] = freq[i]; |
| 946 } | 946 } |
| 947 if (CC==1&&C==2) | 947 if (CC==1&&C==2) |
| 948 { | 948 { |
| 949 for (i=0;i<N;i++) | 949 for (i=0;i<N;i++) |
| (...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1186 } | 1186 } |
| 1187 va_end(ap); | 1187 va_end(ap); |
| 1188 return OPUS_OK; | 1188 return OPUS_OK; |
| 1189 bad_arg: | 1189 bad_arg: |
| 1190 va_end(ap); | 1190 va_end(ap); |
| 1191 return OPUS_BAD_ARG; | 1191 return OPUS_BAD_ARG; |
| 1192 bad_request: | 1192 bad_request: |
| 1193 va_end(ap); | 1193 va_end(ap); |
| 1194 return OPUS_UNIMPLEMENTED; | 1194 return OPUS_UNIMPLEMENTED; |
| 1195 } | 1195 } |
| OLD | NEW |