OLD | NEW |
1 /*********************************************************************** | 1 /*********************************************************************** |
2 Copyright (c) 2006-2011, Skype Limited. All rights reserved. | 2 Copyright (c) 2006-2011, Skype Limited. All rights reserved. |
3 Redistribution and use in source and binary forms, with or without | 3 Redistribution and use in source and binary forms, with or without |
4 modification, are permitted provided that the following conditions | 4 modification, are permitted provided that the following conditions |
5 are met: | 5 are met: |
6 - Redistributions of source code must retain the above copyright notice, | 6 - Redistributions of source code must retain the above copyright notice, |
7 this list of conditions and the following disclaimer. | 7 this list of conditions and the following disclaimer. |
8 - Redistributions in binary form must reproduce the above copyright | 8 - Redistributions in binary form must reproduce the above copyright |
9 notice, this list of conditions and the following disclaimer in the | 9 notice, this list of conditions and the following disclaimer in the |
10 documentation and/or other materials provided with the distribution. | 10 documentation and/or other materials provided with the distribution. |
(...skipping 12 matching lines...) Expand all Loading... |
23 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 23 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
24 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | 24 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
25 POSSIBILITY OF SUCH DAMAGE. | 25 POSSIBILITY OF SUCH DAMAGE. |
26 ***********************************************************************/ | 26 ***********************************************************************/ |
27 | 27 |
28 #ifdef HAVE_CONFIG_H | 28 #ifdef HAVE_CONFIG_H |
29 #include "config.h" | 29 #include "config.h" |
30 #endif | 30 #endif |
31 | 31 |
32 #include "main.h" | 32 #include "main.h" |
| 33 #include "stack_alloc.h" |
33 #include "PLC.h" | 34 #include "PLC.h" |
34 | 35 |
35 #define NB_ATT 2 | 36 #define NB_ATT 2 |
36 static const opus_int16 HARM_ATT_Q15[NB_ATT] = { 32440, 31130 }; /*
0.99, 0.95 */ | 37 static const opus_int16 HARM_ATT_Q15[NB_ATT] = { 32440, 31130 }; /*
0.99, 0.95 */ |
37 static const opus_int16 PLC_RAND_ATTENUATE_V_Q15[NB_ATT] = { 31130, 26214 }; /*
0.95, 0.8 */ | 38 static const opus_int16 PLC_RAND_ATTENUATE_V_Q15[NB_ATT] = { 31130, 26214 }; /*
0.95, 0.8 */ |
38 static const opus_int16 PLC_RAND_ATTENUATE_UV_Q15[NB_ATT] = { 32440, 29491 }; /*
0.99, 0.9 */ | 39 static const opus_int16 PLC_RAND_ATTENUATE_UV_Q15[NB_ATT] = { 32440, 29491 }; /*
0.99, 0.9 */ |
39 | 40 |
40 static inline void silk_PLC_update( | 41 static inline void silk_PLC_update( |
41 silk_decoder_state *psDec, /* I/O Decoder state
*/ | 42 silk_decoder_state *psDec, /* I/O Decoder state
*/ |
42 silk_decoder_control *psDecCtrl /* I/O Decoder contr
ol */ | 43 silk_decoder_control *psDecCtrl /* I/O Decoder contr
ol */ |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 ) | 172 ) |
172 { | 173 { |
173 opus_int i, j, k; | 174 opus_int i, j, k; |
174 opus_int lag, idx, sLTP_buf_idx, shift1, shift2; | 175 opus_int lag, idx, sLTP_buf_idx, shift1, shift2; |
175 opus_int32 rand_seed, harm_Gain_Q15, rand_Gain_Q15, inv_gain_Q30; | 176 opus_int32 rand_seed, harm_Gain_Q15, rand_Gain_Q15, inv_gain_Q30; |
176 opus_int32 energy1, energy2, *rand_ptr, *pred_lag_ptr; | 177 opus_int32 energy1, energy2, *rand_ptr, *pred_lag_ptr; |
177 opus_int32 LPC_pred_Q10, LTP_pred_Q12; | 178 opus_int32 LPC_pred_Q10, LTP_pred_Q12; |
178 opus_int16 rand_scale_Q14; | 179 opus_int16 rand_scale_Q14; |
179 opus_int16 *B_Q14, *exc_buf_ptr; | 180 opus_int16 *B_Q14, *exc_buf_ptr; |
180 opus_int32 *sLPC_Q14_ptr; | 181 opus_int32 *sLPC_Q14_ptr; |
181 opus_int16 exc_buf[ 2 * MAX_SUB_FRAME_LENGTH ]; | 182 VARDECL( opus_int16, exc_buf ); |
182 opus_int16 A_Q12[ MAX_LPC_ORDER ]; | 183 opus_int16 A_Q12[ MAX_LPC_ORDER ]; |
183 opus_int16 sLTP[ MAX_FRAME_LENGTH ]; | 184 VARDECL( opus_int16, sLTP ); |
184 opus_int32 sLTP_Q14[ 2 * MAX_FRAME_LENGTH ]; | 185 VARDECL( opus_int32, sLTP_Q14 ); |
185 silk_PLC_struct *psPLC = &psDec->sPLC; | 186 silk_PLC_struct *psPLC = &psDec->sPLC; |
186 opus_int32 prevGain_Q10[2]; | 187 opus_int32 prevGain_Q10[2]; |
| 188 SAVE_STACK; |
| 189 |
| 190 ALLOC( exc_buf, 2*psPLC->subfr_length, opus_int16 ); |
| 191 ALLOC( sLTP, psDec->ltp_mem_length, opus_int16 ); |
| 192 ALLOC( sLTP_Q14, psDec->ltp_mem_length + psDec->frame_length, opus_int32 ); |
187 | 193 |
188 prevGain_Q10[0] = silk_RSHIFT( psPLC->prevGain_Q16[ 0 ], 6); | 194 prevGain_Q10[0] = silk_RSHIFT( psPLC->prevGain_Q16[ 0 ], 6); |
189 prevGain_Q10[1] = silk_RSHIFT( psPLC->prevGain_Q16[ 1 ], 6); | 195 prevGain_Q10[1] = silk_RSHIFT( psPLC->prevGain_Q16[ 1 ], 6); |
190 | 196 |
191 if( psDec->first_frame_after_reset ) { | 197 if( psDec->first_frame_after_reset ) { |
192 silk_memset( psPLC->prevLPC_Q12, 0, sizeof( psPLC->prevLPC_Q12 ) ); | 198 silk_memset( psPLC->prevLPC_Q12, 0, sizeof( psPLC->prevLPC_Q12 ) ); |
193 } | 199 } |
194 | 200 |
195 /* Find random noise component */ | 201 /* Find random noise component */ |
196 /* Scale previous excitation signal */ | 202 /* Scale previous excitation signal */ |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
347 silk_memcpy( psDec->sLPC_Q14_buf, &sLPC_Q14_ptr[ psDec->frame_length ], MAX_
LPC_ORDER * sizeof( opus_int32 ) ); | 353 silk_memcpy( psDec->sLPC_Q14_buf, &sLPC_Q14_ptr[ psDec->frame_length ], MAX_
LPC_ORDER * sizeof( opus_int32 ) ); |
348 | 354 |
349 /**************************************/ | 355 /**************************************/ |
350 /* Update states */ | 356 /* Update states */ |
351 /**************************************/ | 357 /**************************************/ |
352 psPLC->rand_seed = rand_seed; | 358 psPLC->rand_seed = rand_seed; |
353 psPLC->randScale_Q14 = rand_scale_Q14; | 359 psPLC->randScale_Q14 = rand_scale_Q14; |
354 for( i = 0; i < MAX_NB_SUBFR; i++ ) { | 360 for( i = 0; i < MAX_NB_SUBFR; i++ ) { |
355 psDecCtrl->pitchL[ i ] = lag; | 361 psDecCtrl->pitchL[ i ] = lag; |
356 } | 362 } |
| 363 RESTORE_STACK; |
357 } | 364 } |
358 | 365 |
359 /* Glues concealed frames with new good recieved frames */ | 366 /* Glues concealed frames with new good received frames */ |
360 void silk_PLC_glue_frames( | 367 void silk_PLC_glue_frames( |
361 silk_decoder_state *psDec, /* I/O decoder state
*/ | 368 silk_decoder_state *psDec, /* I/O decoder state
*/ |
362 opus_int16 frame[], /* I/O signal
*/ | 369 opus_int16 frame[], /* I/O signal
*/ |
363 opus_int length /* I length of signa
l */ | 370 opus_int length /* I length of signa
l */ |
364 ) | 371 ) |
365 { | 372 { |
366 opus_int i, energy_shift; | 373 opus_int i, energy_shift; |
367 opus_int32 energy; | 374 opus_int32 energy; |
368 silk_PLC_struct *psPLC; | 375 silk_PLC_struct *psPLC; |
369 psPLC = &psDec->sPLC; | 376 psPLC = &psDec->sPLC; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
407 gain_Q16 += slope_Q16; | 414 gain_Q16 += slope_Q16; |
408 if( gain_Q16 > (opus_int32)1 << 16 ) { | 415 if( gain_Q16 > (opus_int32)1 << 16 ) { |
409 break; | 416 break; |
410 } | 417 } |
411 } | 418 } |
412 } | 419 } |
413 } | 420 } |
414 psPLC->last_frame_lost = 0; | 421 psPLC->last_frame_lost = 0; |
415 } | 422 } |
416 } | 423 } |
OLD | NEW |