| 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 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 #include "entcode.h" | 44 #include "entcode.h" |
| 45 #include "quant_bands.h" | 45 #include "quant_bands.h" |
| 46 #include "rate.h" | 46 #include "rate.h" |
| 47 #include "stack_alloc.h" | 47 #include "stack_alloc.h" |
| 48 #include "mathops.h" | 48 #include "mathops.h" |
| 49 #include "float_cast.h" | 49 #include "float_cast.h" |
| 50 #include <stdarg.h> | 50 #include <stdarg.h> |
| 51 #include "celt_lpc.h" | 51 #include "celt_lpc.h" |
| 52 #include "vq.h" | 52 #include "vq.h" |
| 53 | 53 |
| 54 #if defined(SMALL_FOOTPRINT) && defined(FIXED_POINT) |
| 55 #define NORM_ALIASING_HACK |
| 56 #endif |
| 54 /**********************************************************************/ | 57 /**********************************************************************/ |
| 55 /* */ | 58 /* */ |
| 56 /* DECODER */ | 59 /* DECODER */ |
| 57 /* */ | 60 /* */ |
| 58 /**********************************************************************/ | 61 /**********************************************************************/ |
| 59 #define DECODE_BUFFER_SIZE 2048 | 62 #define DECODE_BUFFER_SIZE 2048 |
| 60 | 63 |
| 61 /** Decoder state | 64 /** Decoder state |
| 62 @brief Decoder state | 65 @brief Decoder state |
| 63 */ | 66 */ |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 return OPUS_OK; | 171 return OPUS_OK; |
| 169 } | 172 } |
| 170 | 173 |
| 171 #ifdef CUSTOM_MODES | 174 #ifdef CUSTOM_MODES |
| 172 void opus_custom_decoder_destroy(CELTDecoder *st) | 175 void opus_custom_decoder_destroy(CELTDecoder *st) |
| 173 { | 176 { |
| 174 opus_free(st); | 177 opus_free(st); |
| 175 } | 178 } |
| 176 #endif /* CUSTOM_MODES */ | 179 #endif /* CUSTOM_MODES */ |
| 177 | 180 |
| 178 static 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 | 181 |
| 190 #ifndef RESYNTH | 182 #ifndef RESYNTH |
| 191 static | 183 static |
| 192 #endif | 184 #endif |
| 193 void deemphasis(celt_sig *in[], opus_val16 *pcm, int N, int C, int downsample, c
onst opus_val16 *coef, celt_sig *mem, celt_sig * OPUS_RESTRICT scratch) | 185 void deemphasis(celt_sig *in[], opus_val16 *pcm, int N, int C, int downsample, c
onst opus_val16 *coef, |
| 186 celt_sig *mem, int accum) |
| 194 { | 187 { |
| 195 int c; | 188 int c; |
| 196 int Nd; | 189 int Nd; |
| 197 int apply_downsampling=0; | 190 int apply_downsampling=0; |
| 198 opus_val16 coef0; | 191 opus_val16 coef0; |
| 199 | 192 VARDECL(celt_sig, scratch); |
| 193 SAVE_STACK; |
| 194 #ifndef FIXED_POINT |
| 195 (void)accum; |
| 196 celt_assert(accum==0); |
| 197 #endif |
| 198 ALLOC(scratch, N, celt_sig); |
| 200 coef0 = coef[0]; | 199 coef0 = coef[0]; |
| 201 Nd = N/downsample; | 200 Nd = N/downsample; |
| 202 c=0; do { | 201 c=0; do { |
| 203 int j; | 202 int j; |
| 204 celt_sig * OPUS_RESTRICT x; | 203 celt_sig * OPUS_RESTRICT x; |
| 205 opus_val16 * OPUS_RESTRICT y; | 204 opus_val16 * OPUS_RESTRICT y; |
| 206 celt_sig m = mem[c]; | 205 celt_sig m = mem[c]; |
| 207 x =in[c]; | 206 x =in[c]; |
| 208 y = pcm+c; | 207 y = pcm+c; |
| 209 #ifdef CUSTOM_MODES | 208 #ifdef CUSTOM_MODES |
| (...skipping 17 matching lines...) Expand all Loading... |
| 227 /* Shortcut for the standard (non-custom modes) case */ | 226 /* Shortcut for the standard (non-custom modes) case */ |
| 228 for (j=0;j<N;j++) | 227 for (j=0;j<N;j++) |
| 229 { | 228 { |
| 230 celt_sig tmp = x[j] + m + VERY_SMALL; | 229 celt_sig tmp = x[j] + m + VERY_SMALL; |
| 231 m = MULT16_32_Q15(coef0, tmp); | 230 m = MULT16_32_Q15(coef0, tmp); |
| 232 scratch[j] = tmp; | 231 scratch[j] = tmp; |
| 233 } | 232 } |
| 234 apply_downsampling=1; | 233 apply_downsampling=1; |
| 235 } else { | 234 } else { |
| 236 /* Shortcut for the standard (non-custom modes) case */ | 235 /* Shortcut for the standard (non-custom modes) case */ |
| 237 for (j=0;j<N;j++) | 236 #ifdef FIXED_POINT |
| 237 if (accum) |
| 238 { | 238 { |
| 239 celt_sig tmp = x[j] + m + VERY_SMALL; | 239 for (j=0;j<N;j++) |
| 240 m = MULT16_32_Q15(coef0, tmp); | 240 { |
| 241 y[j*C] = SCALEOUT(SIG2WORD16(tmp)); | 241 celt_sig tmp = x[j] + m + VERY_SMALL; |
| 242 m = MULT16_32_Q15(coef0, tmp); |
| 243 y[j*C] = SAT16(ADD32(y[j*C], SCALEOUT(SIG2WORD16(tmp)))); |
| 244 } |
| 245 } else |
| 246 #endif |
| 247 { |
| 248 for (j=0;j<N;j++) |
| 249 { |
| 250 celt_sig tmp = x[j] + m + VERY_SMALL; |
| 251 m = MULT16_32_Q15(coef0, tmp); |
| 252 y[j*C] = SCALEOUT(SIG2WORD16(tmp)); |
| 253 } |
| 242 } | 254 } |
| 243 } | 255 } |
| 244 mem[c] = m; | 256 mem[c] = m; |
| 245 | 257 |
| 246 if (apply_downsampling) | 258 if (apply_downsampling) |
| 247 { | 259 { |
| 248 /* Perform down-sampling */ | 260 /* Perform down-sampling */ |
| 249 for (j=0;j<Nd;j++) | 261 #ifdef FIXED_POINT |
| 250 y[j*C] = SCALEOUT(SIG2WORD16(scratch[j*downsample])); | 262 if (accum) |
| 263 { |
| 264 for (j=0;j<Nd;j++) |
| 265 y[j*C] = SAT16(ADD32(y[j*C], SCALEOUT(SIG2WORD16(scratch[j*downsa
mple])))); |
| 266 } else |
| 267 #endif |
| 268 { |
| 269 for (j=0;j<Nd;j++) |
| 270 y[j*C] = SCALEOUT(SIG2WORD16(scratch[j*downsample])); |
| 271 } |
| 251 } | 272 } |
| 252 } while (++c<C); | 273 } while (++c<C); |
| 274 RESTORE_STACK; |
| 253 } | 275 } |
| 254 | 276 |
| 255 /** Compute the IMDCT and apply window for all sub-frames and | |
| 256 all channels in a frame */ | |
| 257 #ifndef RESYNTH | 277 #ifndef RESYNTH |
| 258 static | 278 static |
| 259 #endif | 279 #endif |
| 260 void compute_inv_mdcts(const CELTMode *mode, int shortBlocks, celt_sig *X, | 280 void celt_synthesis(const CELTMode *mode, celt_norm *X, celt_sig * out_syn[], |
| 261 celt_sig * OPUS_RESTRICT out_mem[], int C, int LM) | 281 opus_val16 *oldBandE, int start, int effEnd, int C, int CC, int isTransien
t, |
| 282 int LM, int downsample, int silence) |
| 262 { | 283 { |
| 263 int b, c; | 284 int c, i; |
| 285 int M; |
| 286 int b; |
| 264 int B; | 287 int B; |
| 265 int N; | 288 int N, NB; |
| 266 int shift; | 289 int shift; |
| 267 const int overlap = OVERLAP(mode); | 290 int nbEBands; |
| 291 int overlap; |
| 292 VARDECL(celt_sig, freq); |
| 293 SAVE_STACK; |
| 268 | 294 |
| 269 if (shortBlocks) | 295 overlap = mode->overlap; |
| 296 nbEBands = mode->nbEBands; |
| 297 N = mode->shortMdctSize<<LM; |
| 298 ALLOC(freq, N, celt_sig); /**< Interleaved signal MDCTs */ |
| 299 M = 1<<LM; |
| 300 |
| 301 if (isTransient) |
| 270 { | 302 { |
| 271 B = shortBlocks; | 303 B = M; |
| 272 N = mode->shortMdctSize; | 304 NB = mode->shortMdctSize; |
| 273 shift = mode->maxLM; | 305 shift = mode->maxLM; |
| 274 } else { | 306 } else { |
| 275 B = 1; | 307 B = 1; |
| 276 N = mode->shortMdctSize<<LM; | 308 NB = mode->shortMdctSize<<LM; |
| 277 shift = mode->maxLM-LM; | 309 shift = mode->maxLM-LM; |
| 278 } | 310 } |
| 279 c=0; do { | 311 |
| 280 /* IMDCT on the interleaved the sub-frames, overlap-add is performed by th
e IMDCT */ | 312 if (CC==2&&C==1) |
| 313 { |
| 314 /* Copying a mono streams to two channels */ |
| 315 celt_sig *freq2; |
| 316 denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M, |
| 317 downsample, silence); |
| 318 /* Store a temporary copy in the output buffer because the IMDCT destroys
its input. */ |
| 319 freq2 = out_syn[1]+overlap/2; |
| 320 OPUS_COPY(freq2, freq, N); |
| 281 for (b=0;b<B;b++) | 321 for (b=0;b<B;b++) |
| 282 clt_mdct_backward(&mode->mdct, &X[b+c*N*B], out_mem[c]+N*b, mode->windo
w, overlap, shift, B); | 322 clt_mdct_backward(&mode->mdct, &freq2[b], out_syn[0]+NB*b, mode->window
, overlap, shift, B); |
| 283 } while (++c<C); | 323 for (b=0;b<B;b++) |
| 324 clt_mdct_backward(&mode->mdct, &freq[b], out_syn[1]+NB*b, mode->window,
overlap, shift, B); |
| 325 } else if (CC==1&&C==2) |
| 326 { |
| 327 /* Downmixing a stereo stream to mono */ |
| 328 celt_sig *freq2; |
| 329 freq2 = out_syn[0]+overlap/2; |
| 330 denormalise_bands(mode, X, freq, oldBandE, start, effEnd, M, |
| 331 downsample, silence); |
| 332 /* Use the output buffer as temp array before downmixing. */ |
| 333 denormalise_bands(mode, X+N, freq2, oldBandE+nbEBands, start, effEnd, M, |
| 334 downsample, silence); |
| 335 for (i=0;i<N;i++) |
| 336 freq[i] = HALF32(ADD32(freq[i],freq2[i])); |
| 337 for (b=0;b<B;b++) |
| 338 clt_mdct_backward(&mode->mdct, &freq[b], out_syn[0]+NB*b, mode->window,
overlap, shift, B); |
| 339 } else { |
| 340 /* Normal case (mono or stereo) */ |
| 341 c=0; do { |
| 342 denormalise_bands(mode, X+c*N, freq, oldBandE+c*nbEBands, start, effEnd
, M, |
| 343 downsample, silence); |
| 344 for (b=0;b<B;b++) |
| 345 clt_mdct_backward(&mode->mdct, &freq[b], out_syn[c]+NB*b, mode->wind
ow, overlap, shift, B); |
| 346 } while (++c<CC); |
| 347 } |
| 348 RESTORE_STACK; |
| 284 } | 349 } |
| 285 | 350 |
| 286 static void tf_decode(int start, int end, int isTransient, int *tf_res, int LM,
ec_dec *dec) | 351 static void tf_decode(int start, int end, int isTransient, int *tf_res, int LM,
ec_dec *dec) |
| 287 { | 352 { |
| 288 int i, curr, tf_select; | 353 int i, curr, tf_select; |
| 289 int tf_select_rsv; | 354 int tf_select_rsv; |
| 290 int tf_changed; | 355 int tf_changed; |
| 291 int logp; | 356 int logp; |
| 292 opus_uint32 budget; | 357 opus_uint32 budget; |
| 293 opus_uint32 tell; | 358 opus_uint32 tell; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 323 } | 388 } |
| 324 | 389 |
| 325 /* The maximum pitch lag to allow in the pitch-based PLC. It's possible to save | 390 /* 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 | 391 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. */ | 392 current value corresponds to a pitch of 66.67 Hz. */ |
| 328 #define PLC_PITCH_LAG_MAX (720) | 393 #define PLC_PITCH_LAG_MAX (720) |
| 329 /* The minimum pitch lag to allow in the pitch-based PLC. This corresponds to a | 394 /* The minimum pitch lag to allow in the pitch-based PLC. This corresponds to a |
| 330 pitch of 480 Hz. */ | 395 pitch of 480 Hz. */ |
| 331 #define PLC_PITCH_LAG_MIN (100) | 396 #define PLC_PITCH_LAG_MIN (100) |
| 332 | 397 |
| 333 static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, opus_val16 * OPUS_R
ESTRICT pcm, int N, int LM) | 398 static int celt_plc_pitch_search(celt_sig *decode_mem[2], int C, int arch) |
| 399 { |
| 400 int pitch_index; |
| 401 VARDECL( opus_val16, lp_pitch_buf ); |
| 402 SAVE_STACK; |
| 403 ALLOC( lp_pitch_buf, DECODE_BUFFER_SIZE>>1, opus_val16 ); |
| 404 pitch_downsample(decode_mem, lp_pitch_buf, |
| 405 DECODE_BUFFER_SIZE, C, arch); |
| 406 pitch_search(lp_pitch_buf+(PLC_PITCH_LAG_MAX>>1), lp_pitch_buf, |
| 407 DECODE_BUFFER_SIZE-PLC_PITCH_LAG_MAX, |
| 408 PLC_PITCH_LAG_MAX-PLC_PITCH_LAG_MIN, &pitch_index, arch); |
| 409 pitch_index = PLC_PITCH_LAG_MAX-pitch_index; |
| 410 RESTORE_STACK; |
| 411 return pitch_index; |
| 412 } |
| 413 |
| 414 static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM) |
| 334 { | 415 { |
| 335 int c; | 416 int c; |
| 336 int i; | 417 int i; |
| 337 const int C = st->channels; | 418 const int C = st->channels; |
| 338 celt_sig *decode_mem[2]; | 419 celt_sig *decode_mem[2]; |
| 339 celt_sig *out_syn[2]; | 420 celt_sig *out_syn[2]; |
| 340 opus_val16 *lpc; | 421 opus_val16 *lpc; |
| 341 opus_val16 *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE; | 422 opus_val16 *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE; |
| 342 const OpusCustomMode *mode; | 423 const OpusCustomMode *mode; |
| 343 int nbEBands; | 424 int nbEBands; |
| 344 int overlap; | 425 int overlap; |
| 345 int start; | 426 int start; |
| 346 int downsample; | |
| 347 int loss_count; | 427 int loss_count; |
| 348 int noise_based; | 428 int noise_based; |
| 349 const opus_int16 *eBands; | 429 const opus_int16 *eBands; |
| 350 VARDECL(celt_sig, scratch); | |
| 351 SAVE_STACK; | 430 SAVE_STACK; |
| 352 | 431 |
| 353 mode = st->mode; | 432 mode = st->mode; |
| 354 nbEBands = mode->nbEBands; | 433 nbEBands = mode->nbEBands; |
| 355 overlap = mode->overlap; | 434 overlap = mode->overlap; |
| 356 eBands = mode->eBands; | 435 eBands = mode->eBands; |
| 357 | 436 |
| 358 c=0; do { | 437 c=0; do { |
| 359 decode_mem[c] = st->_decode_mem + c*(DECODE_BUFFER_SIZE+overlap); | 438 decode_mem[c] = st->_decode_mem + c*(DECODE_BUFFER_SIZE+overlap); |
| 360 out_syn[c] = decode_mem[c]+DECODE_BUFFER_SIZE-N; | 439 out_syn[c] = decode_mem[c]+DECODE_BUFFER_SIZE-N; |
| 361 } while (++c<C); | 440 } while (++c<C); |
| 362 lpc = (opus_val16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+overlap)*C); | 441 lpc = (opus_val16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+overlap)*C); |
| 363 oldBandE = lpc+C*LPC_ORDER; | 442 oldBandE = lpc+C*LPC_ORDER; |
| 364 oldLogE = oldBandE + 2*nbEBands; | 443 oldLogE = oldBandE + 2*nbEBands; |
| 365 oldLogE2 = oldLogE + 2*nbEBands; | 444 oldLogE2 = oldLogE + 2*nbEBands; |
| 366 backgroundLogE = oldLogE2 + 2*nbEBands; | 445 backgroundLogE = oldLogE2 + 2*nbEBands; |
| 367 | 446 |
| 368 loss_count = st->loss_count; | 447 loss_count = st->loss_count; |
| 369 start = st->start; | 448 start = st->start; |
| 370 downsample = st->downsample; | |
| 371 noise_based = loss_count >= 5 || start != 0; | 449 noise_based = loss_count >= 5 || start != 0; |
| 372 ALLOC(scratch, noise_based?N*C:N, celt_sig); | |
| 373 if (noise_based) | 450 if (noise_based) |
| 374 { | 451 { |
| 375 /* Noise-based PLC/CNG */ | 452 /* Noise-based PLC/CNG */ |
| 376 celt_sig *freq; | 453 #ifdef NORM_ALIASING_HACK |
| 454 celt_norm *X; |
| 455 #else |
| 377 VARDECL(celt_norm, X); | 456 VARDECL(celt_norm, X); |
| 457 #endif |
| 378 opus_uint32 seed; | 458 opus_uint32 seed; |
| 379 opus_val16 *plcLogE; | 459 opus_val16 *plcLogE; |
| 380 int end; | 460 int end; |
| 381 int effEnd; | 461 int effEnd; |
| 382 | 462 |
| 383 end = st->end; | 463 end = st->end; |
| 384 effEnd = IMAX(start, IMIN(end, mode->effEBands)); | 464 effEnd = IMAX(start, IMIN(end, mode->effEBands)); |
| 385 | 465 |
| 386 /* Share the interleaved signal MDCT coefficient buffer with the | 466 #ifdef NORM_ALIASING_HACK |
| 387 deemphasis scratch buffer. */ | 467 /* This is an ugly hack that breaks aliasing rules and would be easily bro
ken, |
| 388 freq = scratch; | 468 but it saves almost 4kB of stack. */ |
| 469 X = (celt_norm*)(out_syn[C-1]+overlap/2); |
| 470 #else |
| 389 ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */ | 471 ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */ |
| 472 #endif |
| 390 | 473 |
| 391 if (loss_count >= 5) | 474 if (loss_count >= 5) |
| 392 plcLogE = backgroundLogE; | 475 plcLogE = backgroundLogE; |
| 393 else { | 476 else { |
| 394 /* Energy decay */ | 477 /* Energy decay */ |
| 395 opus_val16 decay = loss_count==0 ? | 478 opus_val16 decay = loss_count==0 ? |
| 396 QCONST16(1.5f, DB_SHIFT) : QCONST16(.5f, DB_SHIFT); | 479 QCONST16(1.5f, DB_SHIFT) : QCONST16(.5f, DB_SHIFT); |
| 397 c=0; do | 480 c=0; do |
| 398 { | 481 { |
| 399 for (i=start;i<end;i++) | 482 for (i=start;i<end;i++) |
| 400 oldBandE[c*nbEBands+i] -= decay; | 483 oldBandE[c*nbEBands+i] -= decay; |
| 401 } while (++c<C); | 484 } while (++c<C); |
| 402 plcLogE = oldBandE; | 485 plcLogE = oldBandE; |
| 403 } | 486 } |
| 404 seed = st->rng; | 487 seed = st->rng; |
| 405 for (c=0;c<C;c++) | 488 for (c=0;c<C;c++) |
| 406 { | 489 { |
| 407 for (i=start;i<effEnd;i++) | 490 for (i=start;i<effEnd;i++) |
| 408 { | 491 { |
| 409 int j; | 492 int j; |
| 410 int boffs; | 493 int boffs; |
| 411 int blen; | 494 int blen; |
| 412 boffs = N*c+(eBands[i]<<LM); | 495 boffs = N*c+(eBands[i]<<LM); |
| 413 blen = (eBands[i+1]-eBands[i])<<LM; | 496 blen = (eBands[i+1]-eBands[i])<<LM; |
| 414 for (j=0;j<blen;j++) | 497 for (j=0;j<blen;j++) |
| 415 { | 498 { |
| 416 seed = celt_lcg_rand(seed); | 499 seed = celt_lcg_rand(seed); |
| 417 X[boffs+j] = (celt_norm)((opus_int32)seed>>20); | 500 X[boffs+j] = (celt_norm)((opus_int32)seed>>20); |
| 418 } | 501 } |
| 419 renormalise_vector(X+boffs, blen, Q15ONE); | 502 renormalise_vector(X+boffs, blen, Q15ONE, st->arch); |
| 420 } | 503 } |
| 421 } | 504 } |
| 422 st->rng = seed; | 505 st->rng = seed; |
| 423 | 506 |
| 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 { | 507 c=0; do { |
| 434 OPUS_MOVE(decode_mem[c], decode_mem[c]+N, | 508 OPUS_MOVE(decode_mem[c], decode_mem[c]+N, |
| 435 DECODE_BUFFER_SIZE-N+(overlap>>1)); | 509 DECODE_BUFFER_SIZE-N+(overlap>>1)); |
| 436 } while (++c<C); | 510 } while (++c<C); |
| 437 compute_inv_mdcts(mode, 0, freq, out_syn, C, LM); | 511 |
| 512 celt_synthesis(mode, X, out_syn, plcLogE, start, effEnd, C, C, 0, LM, st->
downsample, 0); |
| 438 } else { | 513 } else { |
| 439 /* Pitch-based PLC */ | 514 /* Pitch-based PLC */ |
| 440 const opus_val16 *window; | 515 const opus_val16 *window; |
| 441 opus_val16 fade = Q15ONE; | 516 opus_val16 fade = Q15ONE; |
| 442 int pitch_index; | 517 int pitch_index; |
| 443 VARDECL(opus_val32, etmp); | 518 VARDECL(opus_val32, etmp); |
| 444 VARDECL(opus_val16, exc); | 519 VARDECL(opus_val16, exc); |
| 445 | 520 |
| 446 if (loss_count == 0) | 521 if (loss_count == 0) |
| 447 { | 522 { |
| 448 VARDECL( opus_val16, lp_pitch_buf ); | 523 st->last_pitch_index = pitch_index = celt_plc_pitch_search(decode_mem,
C, st->arch); |
| 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 { | 524 } else { |
| 458 pitch_index = st->last_pitch_index; | 525 pitch_index = st->last_pitch_index; |
| 459 fade = QCONST16(.8f,15); | 526 fade = QCONST16(.8f,15); |
| 460 } | 527 } |
| 461 | 528 |
| 462 ALLOC(etmp, overlap, opus_val32); | 529 ALLOC(etmp, overlap, opus_val32); |
| 463 ALLOC(exc, MAX_PERIOD, opus_val16); | 530 ALLOC(exc, MAX_PERIOD, opus_val16); |
| 464 window = mode->window; | 531 window = mode->window; |
| 465 c=0; do { | 532 c=0; do { |
| 466 opus_val16 decay; | 533 opus_val16 decay; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 509 of the region for which we're computing the excitation. */ | 576 of the region for which we're computing the excitation. */ |
| 510 { | 577 { |
| 511 opus_val16 lpc_mem[LPC_ORDER]; | 578 opus_val16 lpc_mem[LPC_ORDER]; |
| 512 for (i=0;i<LPC_ORDER;i++) | 579 for (i=0;i<LPC_ORDER;i++) |
| 513 { | 580 { |
| 514 lpc_mem[i] = | 581 lpc_mem[i] = |
| 515 ROUND16(buf[DECODE_BUFFER_SIZE-exc_length-1-i], SIG_SHIFT); | 582 ROUND16(buf[DECODE_BUFFER_SIZE-exc_length-1-i], SIG_SHIFT); |
| 516 } | 583 } |
| 517 /* Compute the excitation for exc_length samples before the loss. */ | 584 /* Compute the excitation for exc_length samples before the loss. */ |
| 518 celt_fir(exc+MAX_PERIOD-exc_length, lpc+c*LPC_ORDER, | 585 celt_fir(exc+MAX_PERIOD-exc_length, lpc+c*LPC_ORDER, |
| 519 exc+MAX_PERIOD-exc_length, exc_length, LPC_ORDER, lpc_mem); | 586 exc+MAX_PERIOD-exc_length, exc_length, LPC_ORDER, lpc_mem, st-
>arch); |
| 520 } | 587 } |
| 521 | 588 |
| 522 /* Check if the waveform is decaying, and if so how fast. | 589 /* Check if the waveform is decaying, and if so how fast. |
| 523 We do this to avoid adding energy when concealing in a segment | 590 We do this to avoid adding energy when concealing in a segment |
| 524 with decaying energy. */ | 591 with decaying energy. */ |
| 525 { | 592 { |
| 526 opus_val32 E1=1, E2=1; | 593 opus_val32 E1=1, E2=1; |
| 527 int decay_length; | 594 int decay_length; |
| 528 #ifdef FIXED_POINT | 595 #ifdef FIXED_POINT |
| 529 int shift = IMAX(0,2*celt_zlog2(celt_maxabs16(&exc[MAX_PERIOD-exc_le
ngth], exc_length))-20); | 596 int shift = IMAX(0,2*celt_zlog2(celt_maxabs16(&exc[MAX_PERIOD-exc_le
ngth], exc_length))-20); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 576 { | 643 { |
| 577 opus_val16 lpc_mem[LPC_ORDER]; | 644 opus_val16 lpc_mem[LPC_ORDER]; |
| 578 /* Copy the last decoded samples (prior to the overlap region) to | 645 /* Copy the last decoded samples (prior to the overlap region) to |
| 579 synthesis filter memory so we can have a continuous signal. */ | 646 synthesis filter memory so we can have a continuous signal. */ |
| 580 for (i=0;i<LPC_ORDER;i++) | 647 for (i=0;i<LPC_ORDER;i++) |
| 581 lpc_mem[i] = ROUND16(buf[DECODE_BUFFER_SIZE-N-1-i], SIG_SHIFT); | 648 lpc_mem[i] = ROUND16(buf[DECODE_BUFFER_SIZE-N-1-i], SIG_SHIFT); |
| 582 /* Apply the synthesis filter to convert the excitation back into | 649 /* Apply the synthesis filter to convert the excitation back into |
| 583 the signal domain. */ | 650 the signal domain. */ |
| 584 celt_iir(buf+DECODE_BUFFER_SIZE-N, lpc+c*LPC_ORDER, | 651 celt_iir(buf+DECODE_BUFFER_SIZE-N, lpc+c*LPC_ORDER, |
| 585 buf+DECODE_BUFFER_SIZE-N, extrapolation_len, LPC_ORDER, | 652 buf+DECODE_BUFFER_SIZE-N, extrapolation_len, LPC_ORDER, |
| 586 lpc_mem); | 653 lpc_mem, st->arch); |
| 587 } | 654 } |
| 588 | 655 |
| 589 /* Check if the synthesis energy is higher than expected, which can | 656 /* Check if the synthesis energy is higher than expected, which can |
| 590 happen with the signal changes during our window. If so, | 657 happen with the signal changes during our window. If so, |
| 591 attenuate. */ | 658 attenuate. */ |
| 592 { | 659 { |
| 593 opus_val32 S2=0; | 660 opus_val32 S2=0; |
| 594 for (i=0;i<extrapolation_len;i++) | 661 for (i=0;i<extrapolation_len;i++) |
| 595 { | 662 { |
| 596 opus_val16 tmp = ROUND16(buf[DECODE_BUFFER_SIZE-N+i], SIG_SHIFT); | 663 opus_val16 tmp = ROUND16(buf[DECODE_BUFFER_SIZE-N+i], SIG_SHIFT); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 637 MDCT of the next frame. */ | 704 MDCT of the next frame. */ |
| 638 for (i=0;i<overlap/2;i++) | 705 for (i=0;i<overlap/2;i++) |
| 639 { | 706 { |
| 640 buf[DECODE_BUFFER_SIZE+i] = | 707 buf[DECODE_BUFFER_SIZE+i] = |
| 641 MULT16_32_Q15(window[i], etmp[overlap-1-i]) | 708 MULT16_32_Q15(window[i], etmp[overlap-1-i]) |
| 642 + MULT16_32_Q15(window[overlap-i-1], etmp[i]); | 709 + MULT16_32_Q15(window[overlap-i-1], etmp[i]); |
| 643 } | 710 } |
| 644 } while (++c<C); | 711 } while (++c<C); |
| 645 } | 712 } |
| 646 | 713 |
| 647 deemphasis(out_syn, pcm, N, C, downsample, | |
| 648 mode->preemph, st->preemph_memD, scratch); | |
| 649 | |
| 650 st->loss_count = loss_count+1; | 714 st->loss_count = loss_count+1; |
| 651 | 715 |
| 652 RESTORE_STACK; | 716 RESTORE_STACK; |
| 653 } | 717 } |
| 654 | 718 |
| 655 int celt_decode_with_ec(CELTDecoder * OPUS_RESTRICT st, const unsigned char *dat
a, int len, opus_val16 * OPUS_RESTRICT pcm, int frame_size, ec_dec *dec) | 719 int celt_decode_with_ec(CELTDecoder * OPUS_RESTRICT st, const unsigned char *dat
a, |
| 720 int len, opus_val16 * OPUS_RESTRICT pcm, int frame_size, ec_dec *dec, int
accum) |
| 656 { | 721 { |
| 657 int c, i, N; | 722 int c, i, N; |
| 658 int spread_decision; | 723 int spread_decision; |
| 659 opus_int32 bits; | 724 opus_int32 bits; |
| 660 ec_dec _dec; | 725 ec_dec _dec; |
| 661 VARDECL(celt_sig, freq); | 726 #ifdef NORM_ALIASING_HACK |
| 727 celt_norm *X; |
| 728 #else |
| 662 VARDECL(celt_norm, X); | 729 VARDECL(celt_norm, X); |
| 730 #endif |
| 663 VARDECL(int, fine_quant); | 731 VARDECL(int, fine_quant); |
| 664 VARDECL(int, pulses); | 732 VARDECL(int, pulses); |
| 665 VARDECL(int, cap); | 733 VARDECL(int, cap); |
| 666 VARDECL(int, offsets); | 734 VARDECL(int, offsets); |
| 667 VARDECL(int, fine_priority); | 735 VARDECL(int, fine_priority); |
| 668 VARDECL(int, tf_res); | 736 VARDECL(int, tf_res); |
| 669 VARDECL(unsigned char, collapse_masks); | 737 VARDECL(unsigned char, collapse_masks); |
| 670 celt_sig *decode_mem[2]; | 738 celt_sig *decode_mem[2]; |
| 671 celt_sig *out_syn[2]; | 739 celt_sig *out_syn[2]; |
| 672 opus_val16 *lpc; | 740 opus_val16 *lpc; |
| 673 opus_val16 *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE; | 741 opus_val16 *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE; |
| 674 | 742 |
| 675 int shortBlocks; | 743 int shortBlocks; |
| 676 int isTransient; | 744 int isTransient; |
| 677 int intra_ener; | 745 int intra_ener; |
| 678 const int CC = st->channels; | 746 const int CC = st->channels; |
| 679 int LM, M; | 747 int LM, M; |
| 748 int start; |
| 749 int end; |
| 680 int effEnd; | 750 int effEnd; |
| 681 int codedBands; | 751 int codedBands; |
| 682 int alloc_trim; | 752 int alloc_trim; |
| 683 int postfilter_pitch; | 753 int postfilter_pitch; |
| 684 opus_val16 postfilter_gain; | 754 opus_val16 postfilter_gain; |
| 685 int intensity=0; | 755 int intensity=0; |
| 686 int dual_stereo=0; | 756 int dual_stereo=0; |
| 687 opus_int32 total_bits; | 757 opus_int32 total_bits; |
| 688 opus_int32 balance; | 758 opus_int32 balance; |
| 689 opus_int32 tell; | 759 opus_int32 tell; |
| 690 int dynalloc_logp; | 760 int dynalloc_logp; |
| 691 int postfilter_tapset; | 761 int postfilter_tapset; |
| 692 int anti_collapse_rsv; | 762 int anti_collapse_rsv; |
| 693 int anti_collapse_on=0; | 763 int anti_collapse_on=0; |
| 694 int silence; | 764 int silence; |
| 695 int C = st->stream_channels; | 765 int C = st->stream_channels; |
| 696 const OpusCustomMode *mode; | 766 const OpusCustomMode *mode; |
| 697 int nbEBands; | 767 int nbEBands; |
| 698 int overlap; | 768 int overlap; |
| 699 const opus_int16 *eBands; | 769 const opus_int16 *eBands; |
| 700 ALLOC_STACK; | 770 ALLOC_STACK; |
| 701 | 771 |
| 702 mode = st->mode; | 772 mode = st->mode; |
| 703 nbEBands = mode->nbEBands; | 773 nbEBands = mode->nbEBands; |
| 704 overlap = mode->overlap; | 774 overlap = mode->overlap; |
| 705 eBands = mode->eBands; | 775 eBands = mode->eBands; |
| 776 start = st->start; |
| 777 end = st->end; |
| 706 frame_size *= st->downsample; | 778 frame_size *= st->downsample; |
| 707 | 779 |
| 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); | 780 lpc = (opus_val16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+overlap)*CC); |
| 712 oldBandE = lpc+CC*LPC_ORDER; | 781 oldBandE = lpc+CC*LPC_ORDER; |
| 713 oldLogE = oldBandE + 2*nbEBands; | 782 oldLogE = oldBandE + 2*nbEBands; |
| 714 oldLogE2 = oldLogE + 2*nbEBands; | 783 oldLogE2 = oldLogE + 2*nbEBands; |
| 715 backgroundLogE = oldLogE2 + 2*nbEBands; | 784 backgroundLogE = oldLogE2 + 2*nbEBands; |
| 716 | 785 |
| 717 #ifdef CUSTOM_MODES | 786 #ifdef CUSTOM_MODES |
| 718 if (st->signalling && data!=NULL) | 787 if (st->signalling && data!=NULL) |
| 719 { | 788 { |
| 720 int data0=data[0]; | 789 int data0=data[0]; |
| 721 /* Convert "standard mode" to Opus header */ | 790 /* Convert "standard mode" to Opus header */ |
| 722 if (mode->Fs==48000 && mode->shortMdctSize==120) | 791 if (mode->Fs==48000 && mode->shortMdctSize==120) |
| 723 { | 792 { |
| 724 data0 = fromOpus(data0); | 793 data0 = fromOpus(data0); |
| 725 if (data0<0) | 794 if (data0<0) |
| 726 return OPUS_INVALID_PACKET; | 795 return OPUS_INVALID_PACKET; |
| 727 } | 796 } |
| 728 st->end = IMAX(1, mode->effEBands-2*(data0>>5)); | 797 st->end = end = IMAX(1, mode->effEBands-2*(data0>>5)); |
| 729 LM = (data0>>3)&0x3; | 798 LM = (data0>>3)&0x3; |
| 730 C = 1 + ((data0>>2)&0x1); | 799 C = 1 + ((data0>>2)&0x1); |
| 731 data++; | 800 data++; |
| 732 len--; | 801 len--; |
| 733 if (LM>mode->maxLM) | 802 if (LM>mode->maxLM) |
| 734 return OPUS_INVALID_PACKET; | 803 return OPUS_INVALID_PACKET; |
| 735 if (frame_size < mode->shortMdctSize<<LM) | 804 if (frame_size < mode->shortMdctSize<<LM) |
| 736 return OPUS_BUFFER_TOO_SMALL; | 805 return OPUS_BUFFER_TOO_SMALL; |
| 737 else | 806 else |
| 738 frame_size = mode->shortMdctSize<<LM; | 807 frame_size = mode->shortMdctSize<<LM; |
| 739 } else { | 808 } else { |
| 740 #else | 809 #else |
| 741 { | 810 { |
| 742 #endif | 811 #endif |
| 743 for (LM=0;LM<=mode->maxLM;LM++) | 812 for (LM=0;LM<=mode->maxLM;LM++) |
| 744 if (mode->shortMdctSize<<LM==frame_size) | 813 if (mode->shortMdctSize<<LM==frame_size) |
| 745 break; | 814 break; |
| 746 if (LM>mode->maxLM) | 815 if (LM>mode->maxLM) |
| 747 return OPUS_BAD_ARG; | 816 return OPUS_BAD_ARG; |
| 748 } | 817 } |
| 749 M=1<<LM; | 818 M=1<<LM; |
| 750 | 819 |
| 751 if (len<0 || len>1275 || pcm==NULL) | 820 if (len<0 || len>1275 || pcm==NULL) |
| 752 return OPUS_BAD_ARG; | 821 return OPUS_BAD_ARG; |
| 753 | 822 |
| 754 N = M*mode->shortMdctSize; | 823 N = M*mode->shortMdctSize; |
| 824 c=0; do { |
| 825 decode_mem[c] = st->_decode_mem + c*(DECODE_BUFFER_SIZE+overlap); |
| 826 out_syn[c] = decode_mem[c]+DECODE_BUFFER_SIZE-N; |
| 827 } while (++c<CC); |
| 755 | 828 |
| 756 effEnd = st->end; | 829 effEnd = end; |
| 757 if (effEnd > mode->effEBands) | 830 if (effEnd > mode->effEBands) |
| 758 effEnd = mode->effEBands; | 831 effEnd = mode->effEBands; |
| 759 | 832 |
| 760 if (data == NULL || len<=1) | 833 if (data == NULL || len<=1) |
| 761 { | 834 { |
| 762 celt_decode_lost(st, pcm, N, LM); | 835 celt_decode_lost(st, N, LM); |
| 836 deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph
_memD, accum); |
| 763 RESTORE_STACK; | 837 RESTORE_STACK; |
| 764 return frame_size/st->downsample; | 838 return frame_size/st->downsample; |
| 765 } | 839 } |
| 766 | 840 |
| 767 if (dec == NULL) | 841 if (dec == NULL) |
| 768 { | 842 { |
| 769 ec_dec_init(&_dec,(unsigned char*)data,len); | 843 ec_dec_init(&_dec,(unsigned char*)data,len); |
| 770 dec = &_dec; | 844 dec = &_dec; |
| 771 } | 845 } |
| 772 | 846 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 788 if (silence) | 862 if (silence) |
| 789 { | 863 { |
| 790 /* Pretend we've read all the remaining bits */ | 864 /* Pretend we've read all the remaining bits */ |
| 791 tell = len*8; | 865 tell = len*8; |
| 792 dec->nbits_total+=tell-ec_tell(dec); | 866 dec->nbits_total+=tell-ec_tell(dec); |
| 793 } | 867 } |
| 794 | 868 |
| 795 postfilter_gain = 0; | 869 postfilter_gain = 0; |
| 796 postfilter_pitch = 0; | 870 postfilter_pitch = 0; |
| 797 postfilter_tapset = 0; | 871 postfilter_tapset = 0; |
| 798 if (st->start==0 && tell+16 <= total_bits) | 872 if (start==0 && tell+16 <= total_bits) |
| 799 { | 873 { |
| 800 if(ec_dec_bit_logp(dec, 1)) | 874 if(ec_dec_bit_logp(dec, 1)) |
| 801 { | 875 { |
| 802 int qg, octave; | 876 int qg, octave; |
| 803 octave = ec_dec_uint(dec, 6); | 877 octave = ec_dec_uint(dec, 6); |
| 804 postfilter_pitch = (16<<octave)+ec_dec_bits(dec, 4+octave)-1; | 878 postfilter_pitch = (16<<octave)+ec_dec_bits(dec, 4+octave)-1; |
| 805 qg = ec_dec_bits(dec, 3); | 879 qg = ec_dec_bits(dec, 3); |
| 806 if (ec_tell(dec)+2<=total_bits) | 880 if (ec_tell(dec)+2<=total_bits) |
| 807 postfilter_tapset = ec_dec_icdf(dec, tapset_icdf, 2); | 881 postfilter_tapset = ec_dec_icdf(dec, tapset_icdf, 2); |
| 808 postfilter_gain = QCONST16(.09375f,15)*(qg+1); | 882 postfilter_gain = QCONST16(.09375f,15)*(qg+1); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 819 isTransient = 0; | 893 isTransient = 0; |
| 820 | 894 |
| 821 if (isTransient) | 895 if (isTransient) |
| 822 shortBlocks = M; | 896 shortBlocks = M; |
| 823 else | 897 else |
| 824 shortBlocks = 0; | 898 shortBlocks = 0; |
| 825 | 899 |
| 826 /* Decode the global flags (first symbols in the stream) */ | 900 /* Decode the global flags (first symbols in the stream) */ |
| 827 intra_ener = tell+3<=total_bits ? ec_dec_bit_logp(dec, 3) : 0; | 901 intra_ener = tell+3<=total_bits ? ec_dec_bit_logp(dec, 3) : 0; |
| 828 /* Get band energies */ | 902 /* Get band energies */ |
| 829 unquant_coarse_energy(mode, st->start, st->end, oldBandE, | 903 unquant_coarse_energy(mode, start, end, oldBandE, |
| 830 intra_ener, dec, C, LM); | 904 intra_ener, dec, C, LM); |
| 831 | 905 |
| 832 ALLOC(tf_res, nbEBands, int); | 906 ALLOC(tf_res, nbEBands, int); |
| 833 tf_decode(st->start, st->end, isTransient, tf_res, LM, dec); | 907 tf_decode(start, end, isTransient, tf_res, LM, dec); |
| 834 | 908 |
| 835 tell = ec_tell(dec); | 909 tell = ec_tell(dec); |
| 836 spread_decision = SPREAD_NORMAL; | 910 spread_decision = SPREAD_NORMAL; |
| 837 if (tell+4 <= total_bits) | 911 if (tell+4 <= total_bits) |
| 838 spread_decision = ec_dec_icdf(dec, spread_icdf, 5); | 912 spread_decision = ec_dec_icdf(dec, spread_icdf, 5); |
| 839 | 913 |
| 840 ALLOC(cap, nbEBands, int); | 914 ALLOC(cap, nbEBands, int); |
| 841 | 915 |
| 842 init_caps(mode,cap,LM,C); | 916 init_caps(mode,cap,LM,C); |
| 843 | 917 |
| 844 ALLOC(offsets, nbEBands, int); | 918 ALLOC(offsets, nbEBands, int); |
| 845 | 919 |
| 846 dynalloc_logp = 6; | 920 dynalloc_logp = 6; |
| 847 total_bits<<=BITRES; | 921 total_bits<<=BITRES; |
| 848 tell = ec_tell_frac(dec); | 922 tell = ec_tell_frac(dec); |
| 849 for (i=st->start;i<st->end;i++) | 923 for (i=start;i<end;i++) |
| 850 { | 924 { |
| 851 int width, quanta; | 925 int width, quanta; |
| 852 int dynalloc_loop_logp; | 926 int dynalloc_loop_logp; |
| 853 int boost; | 927 int boost; |
| 854 width = C*(eBands[i+1]-eBands[i])<<LM; | 928 width = C*(eBands[i+1]-eBands[i])<<LM; |
| 855 /* quanta is 6 bits, but no more than 1 bit/sample | 929 /* quanta is 6 bits, but no more than 1 bit/sample |
| 856 and no less than 1/8 bit/sample */ | 930 and no less than 1/8 bit/sample */ |
| 857 quanta = IMIN(width<<BITRES, IMAX(6<<BITRES, width)); | 931 quanta = IMIN(width<<BITRES, IMAX(6<<BITRES, width)); |
| 858 dynalloc_loop_logp = dynalloc_logp; | 932 dynalloc_loop_logp = dynalloc_logp; |
| 859 boost = 0; | 933 boost = 0; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 878 alloc_trim = tell+(6<<BITRES) <= total_bits ? | 952 alloc_trim = tell+(6<<BITRES) <= total_bits ? |
| 879 ec_dec_icdf(dec, trim_icdf, 7) : 5; | 953 ec_dec_icdf(dec, trim_icdf, 7) : 5; |
| 880 | 954 |
| 881 bits = (((opus_int32)len*8)<<BITRES) - ec_tell_frac(dec) - 1; | 955 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; | 956 anti_collapse_rsv = isTransient&&LM>=2&&bits>=((LM+2)<<BITRES) ? (1<<BITRES)
: 0; |
| 883 bits -= anti_collapse_rsv; | 957 bits -= anti_collapse_rsv; |
| 884 | 958 |
| 885 ALLOC(pulses, nbEBands, int); | 959 ALLOC(pulses, nbEBands, int); |
| 886 ALLOC(fine_priority, nbEBands, int); | 960 ALLOC(fine_priority, nbEBands, int); |
| 887 | 961 |
| 888 codedBands = compute_allocation(mode, st->start, st->end, offsets, cap, | 962 codedBands = compute_allocation(mode, start, end, offsets, cap, |
| 889 alloc_trim, &intensity, &dual_stereo, bits, &balance, pulses, | 963 alloc_trim, &intensity, &dual_stereo, bits, &balance, pulses, |
| 890 fine_quant, fine_priority, C, LM, dec, 0, 0, 0); | 964 fine_quant, fine_priority, C, LM, dec, 0, 0, 0); |
| 891 | 965 |
| 892 unquant_fine_energy(mode, st->start, st->end, oldBandE, fine_quant, dec, C); | 966 unquant_fine_energy(mode, start, end, oldBandE, fine_quant, dec, C); |
| 967 |
| 968 c=0; do { |
| 969 OPUS_MOVE(decode_mem[c], decode_mem[c]+N, DECODE_BUFFER_SIZE-N+overlap/2); |
| 970 } while (++c<CC); |
| 893 | 971 |
| 894 /* Decode fixed codebook */ | 972 /* Decode fixed codebook */ |
| 895 ALLOC(collapse_masks, C*nbEBands, unsigned char); | 973 ALLOC(collapse_masks, C*nbEBands, unsigned char); |
| 974 |
| 975 #ifdef NORM_ALIASING_HACK |
| 976 /* This is an ugly hack that breaks aliasing rules and would be easily broken
, |
| 977 but it saves almost 4kB of stack. */ |
| 978 X = (celt_norm*)(out_syn[CC-1]+overlap/2); |
| 979 #else |
| 896 ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */ | 980 ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */ |
| 981 #endif |
| 897 | 982 |
| 898 quant_all_bands(0, mode, st->start, st->end, X, C==2 ? X+N : NULL, collapse_m
asks, | 983 quant_all_bands(0, mode, start, end, X, C==2 ? X+N : NULL, collapse_masks, |
| 899 NULL, pulses, shortBlocks, spread_decision, dual_stereo, intensity, tf_
res, | 984 NULL, pulses, shortBlocks, spread_decision, dual_stereo, intensity, tf_
res, |
| 900 len*(8<<BITRES)-anti_collapse_rsv, balance, dec, LM, codedBands, &st->r
ng); | 985 len*(8<<BITRES)-anti_collapse_rsv, balance, dec, LM, codedBands, &st->r
ng, st->arch); |
| 901 | 986 |
| 902 if (anti_collapse_rsv > 0) | 987 if (anti_collapse_rsv > 0) |
| 903 { | 988 { |
| 904 anti_collapse_on = ec_dec_bits(dec, 1); | 989 anti_collapse_on = ec_dec_bits(dec, 1); |
| 905 } | 990 } |
| 906 | 991 |
| 907 unquant_energy_finalise(mode, st->start, st->end, oldBandE, | 992 unquant_energy_finalise(mode, start, end, oldBandE, |
| 908 fine_quant, fine_priority, len*8-ec_tell(dec), dec, C); | 993 fine_quant, fine_priority, len*8-ec_tell(dec), dec, C); |
| 909 | 994 |
| 910 if (anti_collapse_on) | 995 if (anti_collapse_on) |
| 911 anti_collapse(mode, X, collapse_masks, LM, C, N, | 996 anti_collapse(mode, X, collapse_masks, LM, C, N, |
| 912 st->start, st->end, oldBandE, oldLogE, oldLogE2, pulses, st->rng); | 997 start, end, oldBandE, oldLogE, oldLogE2, pulses, st->rng, st->arch); |
| 913 | |
| 914 ALLOC(freq, IMAX(CC,C)*N, celt_sig); /**< Interleaved signal MDCTs */ | |
| 915 | 998 |
| 916 if (silence) | 999 if (silence) |
| 917 { | 1000 { |
| 918 for (i=0;i<C*nbEBands;i++) | 1001 for (i=0;i<C*nbEBands;i++) |
| 919 oldBandE[i] = -QCONST16(28.f,DB_SHIFT); | 1002 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 } | 1003 } |
| 952 | 1004 |
| 953 /* Compute inverse MDCTs */ | 1005 celt_synthesis(mode, X, out_syn, oldBandE, start, effEnd, C, CC, isTransient,
LM, st->downsample, silence); |
| 954 compute_inv_mdcts(mode, shortBlocks, freq, out_syn, CC, LM); | |
| 955 | 1006 |
| 956 c=0; do { | 1007 c=0; do { |
| 957 st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD); | 1008 st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD); |
| 958 st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPE
RIOD); | 1009 st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPE
RIOD); |
| 959 comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfil
ter_period, mode->shortMdctSize, | 1010 comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfil
ter_period, mode->shortMdctSize, |
| 960 st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_
old, st->postfilter_tapset, | 1011 st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_
old, st->postfilter_tapset, |
| 961 mode->window, overlap); | 1012 mode->window, overlap); |
| 962 if (LM!=0) | 1013 if (LM!=0) |
| 963 comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctS
ize, st->postfilter_period, postfilter_pitch, N-mode->shortMdctSize, | 1014 comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctS
ize, st->postfilter_period, postfilter_pitch, N-mode->shortMdctSize, |
| 964 st->postfilter_gain, postfilter_gain, st->postfilter_tapset, post
filter_tapset, | 1015 st->postfilter_gain, postfilter_gain, st->postfilter_tapset, post
filter_tapset, |
| 965 mode->window, overlap); | 1016 mode->window, overlap); |
| 966 | 1017 |
| 967 } while (++c<CC); | 1018 } while (++c<CC); |
| 968 st->postfilter_period_old = st->postfilter_period; | 1019 st->postfilter_period_old = st->postfilter_period; |
| 969 st->postfilter_gain_old = st->postfilter_gain; | 1020 st->postfilter_gain_old = st->postfilter_gain; |
| 970 st->postfilter_tapset_old = st->postfilter_tapset; | 1021 st->postfilter_tapset_old = st->postfilter_tapset; |
| 971 st->postfilter_period = postfilter_pitch; | 1022 st->postfilter_period = postfilter_pitch; |
| 972 st->postfilter_gain = postfilter_gain; | 1023 st->postfilter_gain = postfilter_gain; |
| 973 st->postfilter_tapset = postfilter_tapset; | 1024 st->postfilter_tapset = postfilter_tapset; |
| 974 if (LM!=0) | 1025 if (LM!=0) |
| 975 { | 1026 { |
| 976 st->postfilter_period_old = st->postfilter_period; | 1027 st->postfilter_period_old = st->postfilter_period; |
| 977 st->postfilter_gain_old = st->postfilter_gain; | 1028 st->postfilter_gain_old = st->postfilter_gain; |
| 978 st->postfilter_tapset_old = st->postfilter_tapset; | 1029 st->postfilter_tapset_old = st->postfilter_tapset; |
| 979 } | 1030 } |
| 980 | 1031 |
| 981 if (C==1) { | 1032 if (C==1) |
| 982 for (i=0;i<nbEBands;i++) | 1033 OPUS_COPY(&oldBandE[nbEBands], oldBandE, nbEBands); |
| 983 oldBandE[nbEBands+i]=oldBandE[i]; | |
| 984 } | |
| 985 | 1034 |
| 986 /* In case start or end were to change */ | 1035 /* In case start or end were to change */ |
| 987 if (!isTransient) | 1036 if (!isTransient) |
| 988 { | 1037 { |
| 989 for (i=0;i<2*nbEBands;i++) | 1038 OPUS_COPY(oldLogE2, oldLogE, 2*nbEBands); |
| 990 oldLogE2[i] = oldLogE[i]; | 1039 OPUS_COPY(oldLogE, oldBandE, 2*nbEBands); |
| 991 for (i=0;i<2*nbEBands;i++) | |
| 992 oldLogE[i] = oldBandE[i]; | |
| 993 for (i=0;i<2*nbEBands;i++) | 1040 for (i=0;i<2*nbEBands;i++) |
| 994 backgroundLogE[i] = MIN16(backgroundLogE[i] + M*QCONST16(0.001f,DB_SHIF
T), oldBandE[i]); | 1041 backgroundLogE[i] = MIN16(backgroundLogE[i] + M*QCONST16(0.001f,DB_SHIF
T), oldBandE[i]); |
| 995 } else { | 1042 } else { |
| 996 for (i=0;i<2*nbEBands;i++) | 1043 for (i=0;i<2*nbEBands;i++) |
| 997 oldLogE[i] = MIN16(oldLogE[i], oldBandE[i]); | 1044 oldLogE[i] = MIN16(oldLogE[i], oldBandE[i]); |
| 998 } | 1045 } |
| 999 c=0; do | 1046 c=0; do |
| 1000 { | 1047 { |
| 1001 for (i=0;i<st->start;i++) | 1048 for (i=0;i<start;i++) |
| 1002 { | 1049 { |
| 1003 oldBandE[c*nbEBands+i]=0; | 1050 oldBandE[c*nbEBands+i]=0; |
| 1004 oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-QCONST16(28.f,DB_SHIFT); | 1051 oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-QCONST16(28.f,DB_SHIFT); |
| 1005 } | 1052 } |
| 1006 for (i=st->end;i<nbEBands;i++) | 1053 for (i=end;i<nbEBands;i++) |
| 1007 { | 1054 { |
| 1008 oldBandE[c*nbEBands+i]=0; | 1055 oldBandE[c*nbEBands+i]=0; |
| 1009 oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-QCONST16(28.f,DB_SHIFT); | 1056 oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-QCONST16(28.f,DB_SHIFT); |
| 1010 } | 1057 } |
| 1011 } while (++c<2); | 1058 } while (++c<2); |
| 1012 st->rng = dec->rng; | 1059 st->rng = dec->rng; |
| 1013 | 1060 |
| 1014 /* We reuse freq[] as scratch space for the de-emphasis */ | 1061 deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_me
mD, accum); |
| 1015 deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_me
mD, freq); | |
| 1016 st->loss_count = 0; | 1062 st->loss_count = 0; |
| 1017 RESTORE_STACK; | 1063 RESTORE_STACK; |
| 1018 if (ec_tell(dec) > 8*len) | 1064 if (ec_tell(dec) > 8*len) |
| 1019 return OPUS_INTERNAL_ERROR; | 1065 return OPUS_INTERNAL_ERROR; |
| 1020 if(ec_get_error(dec)) | 1066 if(ec_get_error(dec)) |
| 1021 st->error = 1; | 1067 st->error = 1; |
| 1022 return frame_size/st->downsample; | 1068 return frame_size/st->downsample; |
| 1023 } | 1069 } |
| 1024 | 1070 |
| 1025 | 1071 |
| 1026 #ifdef CUSTOM_MODES | 1072 #ifdef CUSTOM_MODES |
| 1027 | 1073 |
| 1028 #ifdef FIXED_POINT | 1074 #ifdef FIXED_POINT |
| 1029 int opus_custom_decode(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data
, int len, opus_int16 * OPUS_RESTRICT pcm, int frame_size) | 1075 int opus_custom_decode(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data
, int len, opus_int16 * OPUS_RESTRICT pcm, int frame_size) |
| 1030 { | 1076 { |
| 1031 return celt_decode_with_ec(st, data, len, pcm, frame_size, NULL); | 1077 return celt_decode_with_ec(st, data, len, pcm, frame_size, NULL, 0); |
| 1032 } | 1078 } |
| 1033 | 1079 |
| 1034 #ifndef DISABLE_FLOAT_API | 1080 #ifndef DISABLE_FLOAT_API |
| 1035 int opus_custom_decode_float(CELTDecoder * OPUS_RESTRICT st, const unsigned char
*data, int len, float * OPUS_RESTRICT pcm, int frame_size) | 1081 int opus_custom_decode_float(CELTDecoder * OPUS_RESTRICT st, const unsigned char
*data, int len, float * OPUS_RESTRICT pcm, int frame_size) |
| 1036 { | 1082 { |
| 1037 int j, ret, C, N; | 1083 int j, ret, C, N; |
| 1038 VARDECL(opus_int16, out); | 1084 VARDECL(opus_int16, out); |
| 1039 ALLOC_STACK; | 1085 ALLOC_STACK; |
| 1040 | 1086 |
| 1041 if (pcm==NULL) | 1087 if (pcm==NULL) |
| 1042 return OPUS_BAD_ARG; | 1088 return OPUS_BAD_ARG; |
| 1043 | 1089 |
| 1044 C = st->channels; | 1090 C = st->channels; |
| 1045 N = frame_size; | 1091 N = frame_size; |
| 1046 | 1092 |
| 1047 ALLOC(out, C*N, opus_int16); | 1093 ALLOC(out, C*N, opus_int16); |
| 1048 ret=celt_decode_with_ec(st, data, len, out, frame_size, NULL); | 1094 ret=celt_decode_with_ec(st, data, len, out, frame_size, NULL, 0); |
| 1049 if (ret>0) | 1095 if (ret>0) |
| 1050 for (j=0;j<C*ret;j++) | 1096 for (j=0;j<C*ret;j++) |
| 1051 pcm[j]=out[j]*(1.f/32768.f); | 1097 pcm[j]=out[j]*(1.f/32768.f); |
| 1052 | 1098 |
| 1053 RESTORE_STACK; | 1099 RESTORE_STACK; |
| 1054 return ret; | 1100 return ret; |
| 1055 } | 1101 } |
| 1056 #endif /* DISABLE_FLOAT_API */ | 1102 #endif /* DISABLE_FLOAT_API */ |
| 1057 | 1103 |
| 1058 #else | 1104 #else |
| 1059 | 1105 |
| 1060 int opus_custom_decode_float(CELTDecoder * OPUS_RESTRICT st, const unsigned char
*data, int len, float * OPUS_RESTRICT pcm, int frame_size) | 1106 int opus_custom_decode_float(CELTDecoder * OPUS_RESTRICT st, const unsigned char
*data, int len, float * OPUS_RESTRICT pcm, int frame_size) |
| 1061 { | 1107 { |
| 1062 return celt_decode_with_ec(st, data, len, pcm, frame_size, NULL); | 1108 return celt_decode_with_ec(st, data, len, pcm, frame_size, NULL, 0); |
| 1063 } | 1109 } |
| 1064 | 1110 |
| 1065 int opus_custom_decode(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data
, int len, opus_int16 * OPUS_RESTRICT pcm, int frame_size) | 1111 int opus_custom_decode(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data
, int len, opus_int16 * OPUS_RESTRICT pcm, int frame_size) |
| 1066 { | 1112 { |
| 1067 int j, ret, C, N; | 1113 int j, ret, C, N; |
| 1068 VARDECL(celt_sig, out); | 1114 VARDECL(celt_sig, out); |
| 1069 ALLOC_STACK; | 1115 ALLOC_STACK; |
| 1070 | 1116 |
| 1071 if (pcm==NULL) | 1117 if (pcm==NULL) |
| 1072 return OPUS_BAD_ARG; | 1118 return OPUS_BAD_ARG; |
| 1073 | 1119 |
| 1074 C = st->channels; | 1120 C = st->channels; |
| 1075 N = frame_size; | 1121 N = frame_size; |
| 1076 ALLOC(out, C*N, celt_sig); | 1122 ALLOC(out, C*N, celt_sig); |
| 1077 | 1123 |
| 1078 ret=celt_decode_with_ec(st, data, len, out, frame_size, NULL); | 1124 ret=celt_decode_with_ec(st, data, len, out, frame_size, NULL, 0); |
| 1079 | 1125 |
| 1080 if (ret>0) | 1126 if (ret>0) |
| 1081 for (j=0;j<C*ret;j++) | 1127 for (j=0;j<C*ret;j++) |
| 1082 pcm[j] = FLOAT2INT16 (out[j]); | 1128 pcm[j] = FLOAT2INT16 (out[j]); |
| 1083 | 1129 |
| 1084 RESTORE_STACK; | 1130 RESTORE_STACK; |
| 1085 return ret; | 1131 return ret; |
| 1086 } | 1132 } |
| 1087 | 1133 |
| 1088 #endif | 1134 #endif |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1186 } | 1232 } |
| 1187 va_end(ap); | 1233 va_end(ap); |
| 1188 return OPUS_OK; | 1234 return OPUS_OK; |
| 1189 bad_arg: | 1235 bad_arg: |
| 1190 va_end(ap); | 1236 va_end(ap); |
| 1191 return OPUS_BAD_ARG; | 1237 return OPUS_BAD_ARG; |
| 1192 bad_request: | 1238 bad_request: |
| 1193 va_end(ap); | 1239 va_end(ap); |
| 1194 return OPUS_UNIMPLEMENTED; | 1240 return OPUS_UNIMPLEMENTED; |
| 1195 } | 1241 } |
| OLD | NEW |