| 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;
|
| }
|
|
|
|
|