Index: silk/dec_API.c |
diff --git a/silk/dec_API.c b/silk/dec_API.c |
index 60beef6eb948ebea3e2806cf8ef16a0e7bc1d61c..68403b7c05b1445ca6884572d0db79a744dd8863 100644 |
--- a/silk/dec_API.c |
+++ b/silk/dec_API.c |
@@ -30,6 +30,7 @@ POSSIBILITY OF SUCH DAMAGE. |
#endif |
#include "API.h" |
#include "main.h" |
+#include "stack_alloc.h" |
/************************/ |
/* Decoder Super Struct */ |
@@ -85,14 +86,16 @@ opus_int silk_Decode( /* O Returns error co |
{ |
opus_int i, n, decode_only_middle = 0, ret = SILK_NO_ERROR; |
opus_int32 nSamplesOutDec, LBRR_symbol; |
- opus_int16 samplesOut1_tmp[ 2 ][ MAX_FS_KHZ * MAX_FRAME_LENGTH_MS + 2 ]; |
- opus_int16 samplesOut2_tmp[ MAX_API_FS_KHZ * MAX_FRAME_LENGTH_MS ]; |
+ opus_int16 *samplesOut1_tmp[ 2 ]; |
+ VARDECL( opus_int16, samplesOut1_tmp_storage ); |
+ VARDECL( opus_int16, samplesOut2_tmp ); |
opus_int32 MS_pred_Q13[ 2 ] = { 0 }; |
opus_int16 *resample_out_ptr; |
silk_decoder *psDec = ( silk_decoder * )decState; |
silk_decoder_state *channel_state = psDec->channel_state; |
opus_int has_side; |
opus_int stereo_to_mono; |
+ SAVE_STACK; |
/**********************************/ |
/* Test if first frame in payload */ |
@@ -132,11 +135,13 @@ opus_int silk_Decode( /* O Returns error co |
channel_state[ n ].nb_subfr = 4; |
} else { |
silk_assert( 0 ); |
+ RESTORE_STACK; |
return SILK_DEC_INVALID_FRAME_SIZE; |
} |
fs_kHz_dec = ( decControl->internalSampleRate >> 10 ) + 1; |
if( fs_kHz_dec != 8 && fs_kHz_dec != 12 && fs_kHz_dec != 16 ) { |
silk_assert( 0 ); |
+ RESTORE_STACK; |
return SILK_DEC_INVALID_SAMPLING_FREQUENCY; |
} |
ret += silk_decoder_set_fs( &channel_state[ n ], fs_kHz_dec, decControl->API_sampleRate ); |
@@ -153,6 +158,7 @@ opus_int silk_Decode( /* O Returns error co |
if( decControl->API_sampleRate > (opus_int32)MAX_API_FS_KHZ * 1000 || decControl->API_sampleRate < 8000 ) { |
ret = SILK_DEC_INVALID_SAMPLING_FREQUENCY; |
+ RESTORE_STACK; |
return( ret ); |
} |
@@ -240,6 +246,14 @@ opus_int silk_Decode( /* O Returns error co |
psDec->channel_state[ 1 ].first_frame_after_reset = 1; |
} |
+ ALLOC( samplesOut1_tmp_storage, |
+ decControl->nChannelsInternal*( |
+ channel_state[ 0 ].frame_length + 2 ), |
+ opus_int16 ); |
+ samplesOut1_tmp[ 0 ] = samplesOut1_tmp_storage; |
+ samplesOut1_tmp[ 1 ] = samplesOut1_tmp_storage |
+ + channel_state[ 0 ].frame_length + 2; |
+ |
if( lostFlag == FLAG_DECODE_NORMAL ) { |
has_side = !decode_only_middle; |
} else { |
@@ -285,6 +299,8 @@ opus_int silk_Decode( /* O Returns error co |
*nSamplesOut = silk_DIV32( nSamplesOutDec * decControl->API_sampleRate, silk_SMULBB( channel_state[ 0 ].fs_kHz, 1000 ) ); |
/* Set up pointers to temp buffers */ |
+ ALLOC( samplesOut2_tmp, |
+ decControl->nChannelsAPI == 2 ? *nSamplesOut : 0, opus_int16 ); |
if( decControl->nChannelsAPI == 2 ) { |
resample_out_ptr = samplesOut2_tmp; |
} else { |
@@ -337,6 +353,7 @@ opus_int silk_Decode( /* O Returns error co |
} else { |
psDec->prev_decode_only_middle = decode_only_middle; |
} |
+ RESTORE_STACK; |
return ret; |
} |