Index: silk/control_codec.c |
diff --git a/silk/control_codec.c b/silk/control_codec.c |
index ecc338cec65d6e32fbe09f7c6312a275329de6d5..56ce14c7f9c9ff6a0196724c41b0b510d3009901 100644 |
--- a/silk/control_codec.c |
+++ b/silk/control_codec.c |
@@ -8,11 +8,11 @@ this list of conditions and the following disclaimer. |
- Redistributions in binary form must reproduce the above copyright |
notice, this list of conditions and the following disclaimer in the |
documentation and/or other materials provided with the distribution. |
-- Neither the name of Internet Society, IETF or IETF Trust, nor the |
+- Neither the name of Internet Society, IETF or IETF Trust, nor the |
names of specific contributors, may be used to endorse or promote |
products derived from this software without specific prior written |
permission. |
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” |
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
@@ -35,6 +35,7 @@ POSSIBILITY OF SUCH DAMAGE. |
#include "main_FLP.h" |
#define silk_encoder_state_Fxx silk_encoder_state_FLP |
#endif |
+#include "stack_alloc.h" |
#include "tuning_parameters.h" |
#include "pitch_est_defines.h" |
@@ -137,7 +138,7 @@ static opus_int silk_setup_resamplers( |
) |
{ |
opus_int ret = SILK_NO_ERROR; |
- opus_int32 nSamples_temp; |
+ SAVE_STACK; |
if( psEnc->sCmn.fs_kHz != fs_kHz || psEnc->sCmn.prev_API_fs_Hz != psEnc->sCmn.API_fs_Hz ) |
{ |
@@ -145,44 +146,54 @@ static opus_int silk_setup_resamplers( |
/* Initialize the resampler for enc_API.c preparing resampling from API_fs_Hz to fs_kHz */ |
ret += silk_resampler_init( &psEnc->sCmn.resampler_state, psEnc->sCmn.API_fs_Hz, fs_kHz * 1000, 1 ); |
} else { |
- /* Allocate worst case space for temporary upsampling, 8 to 48 kHz, so a factor 6 */ |
- opus_int16 x_buf_API_fs_Hz[ ( 2 * MAX_FRAME_LENGTH_MS + LA_SHAPE_MS ) * MAX_API_FS_KHZ ]; |
- silk_resampler_state_struct temp_resampler_state; |
+ VARDECL( opus_int16, x_buf_API_fs_Hz ); |
+ VARDECL( silk_resampler_state_struct, temp_resampler_state ); |
#ifdef FIXED_POINT |
opus_int16 *x_bufFIX = psEnc->x_buf; |
#else |
- opus_int16 x_bufFIX[ 2 * MAX_FRAME_LENGTH + LA_SHAPE_MAX ]; |
+ VARDECL( opus_int16, x_bufFIX ); |
+ opus_int32 new_buf_samples; |
#endif |
+ opus_int32 api_buf_samples; |
+ opus_int32 old_buf_samples; |
+ opus_int32 buf_length_ms; |
- nSamples_temp = silk_LSHIFT( psEnc->sCmn.frame_length, 1 ) + LA_SHAPE_MS * psEnc->sCmn.fs_kHz; |
+ buf_length_ms = silk_LSHIFT( psEnc->sCmn.nb_subfr * 5, 1 ) + LA_SHAPE_MS; |
+ old_buf_samples = buf_length_ms * psEnc->sCmn.fs_kHz; |
#ifndef FIXED_POINT |
- silk_float2short_array( x_bufFIX, psEnc->x_buf, nSamples_temp ); |
+ new_buf_samples = buf_length_ms * fs_kHz; |
+ ALLOC( x_bufFIX, silk_max( old_buf_samples, new_buf_samples ), |
+ opus_int16 ); |
+ silk_float2short_array( x_bufFIX, psEnc->x_buf, old_buf_samples ); |
#endif |
/* Initialize resampler for temporary resampling of x_buf data to API_fs_Hz */ |
- ret += silk_resampler_init( &temp_resampler_state, silk_SMULBB( psEnc->sCmn.fs_kHz, 1000 ), psEnc->sCmn.API_fs_Hz, 0 ); |
+ ALLOC( temp_resampler_state, 1, silk_resampler_state_struct ); |
+ ret += silk_resampler_init( temp_resampler_state, silk_SMULBB( psEnc->sCmn.fs_kHz, 1000 ), psEnc->sCmn.API_fs_Hz, 0 ); |
- /* Temporary resampling of x_buf data to API_fs_Hz */ |
- ret += silk_resampler( &temp_resampler_state, x_buf_API_fs_Hz, x_bufFIX, nSamples_temp ); |
+ /* Calculate number of samples to temporarily upsample */ |
+ api_buf_samples = buf_length_ms * silk_DIV32_16( psEnc->sCmn.API_fs_Hz, 1000 ); |
- /* Calculate number of samples that has been temporarily upsampled */ |
- nSamples_temp = silk_DIV32_16( nSamples_temp * psEnc->sCmn.API_fs_Hz, silk_SMULBB( psEnc->sCmn.fs_kHz, 1000 ) ); |
+ /* Temporary resampling of x_buf data to API_fs_Hz */ |
+ ALLOC( x_buf_API_fs_Hz, api_buf_samples, opus_int16 ); |
+ ret += silk_resampler( temp_resampler_state, x_buf_API_fs_Hz, x_bufFIX, old_buf_samples ); |
/* Initialize the resampler for enc_API.c preparing resampling from API_fs_Hz to fs_kHz */ |
ret += silk_resampler_init( &psEnc->sCmn.resampler_state, psEnc->sCmn.API_fs_Hz, silk_SMULBB( fs_kHz, 1000 ), 1 ); |
/* Correct resampler state by resampling buffered data from API_fs_Hz to fs_kHz */ |
- ret += silk_resampler( &psEnc->sCmn.resampler_state, x_bufFIX, x_buf_API_fs_Hz, nSamples_temp ); |
+ ret += silk_resampler( &psEnc->sCmn.resampler_state, x_bufFIX, x_buf_API_fs_Hz, api_buf_samples ); |
#ifndef FIXED_POINT |
- silk_short2float_array( psEnc->x_buf, x_bufFIX, ( 2 * MAX_FRAME_LENGTH_MS + LA_SHAPE_MS ) * fs_kHz ); |
+ silk_short2float_array( psEnc->x_buf, x_bufFIX, new_buf_samples); |
#endif |
} |
} |
psEnc->sCmn.prev_API_fs_Hz = psEnc->sCmn.API_fs_Hz; |
+ RESTORE_STACK; |
return ret; |
} |