Commit b9e7c3a6 authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

Fixes for crashes in +10dB and -10dB scaled inputs

parent a8bb5e0d
Loading
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -10535,6 +10535,8 @@ void swb_pre_proc_ivas_fx(
    Word16 *new_swb_speech,                                     /* o  : original input signal at 32kHz - Q0      */
    Word32 *new_swb_speech_fx,                                  /* o  : original input signal at 32kHz - Q - q_reImBuffer */
    Word16 *shb_speech,                                         /* o  : SHB target signal (6-14kHz) at 16kHz- Q0 */
    Word32 *shb_speech_32,                                      /* o  : SHB target signal (6-14kHz) at 16kHz- Q - q_reImBuffer */
    Word16 *use_shb32,                                          /* o  : flags valid data in 32-bit shb buffer for better precision. */
    Word32 realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i  : real buffer Q - q_reImbuffer             */
    Word32 imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i  : imag buffer Q - q_reImbuffer             */
    Word16 q_reImBuffer,                                        /* i : scale data of real and imag CLDFB buffers */
+15 −6
Original line number Diff line number Diff line
@@ -91,7 +91,7 @@ ivas_error ivas_core_enc(
    STEREO_TD_ENC_DATA_HANDLE hStereoTD;
    float *inp[CPE_CHANNELS];
    float new_inp_resamp16k[CPE_CHANNELS][L_FRAME16k];            /* new input signal @16kHz, non pre-emphasised, used by the WB TBE/BWE */
    float old_syn_12k8_16k[CPE_CHANNELS][L_FRAME16k];  /* ACELP core synthesis at 12.8kHz or 16kHz to be used by the SWB BWE */
    float old_syn_12k8_16k[CPE_CHANNELS][L_FRAME16k] = { { 0 } }; /* ACELP core synthesis at 12.8kHz or 16kHz to be used by the SWB BWE */
    float shb_speech[L_FRAME16k];
    float hb_speech[L_FRAME16k / 4];
    float *new_swb_speech;
@@ -106,6 +106,7 @@ ivas_error ivas_core_enc(
#ifdef IVAS_FLOAT_FIXED
    Word32 *new_swb_speech_fx;
    Word16 shb_speech_fx[L_FRAME16k];    // Q_shb_spch
    Word32 shb_speech_fx_32[L_FRAME16k]; // Q_shb_spch
    Word16 Q_shb_spch;
    Word32 new_swb_speech_buffer_fx[L_FRAME48k + STEREO_DFT_OVL_MAX];
    Word16 new_inp_resamp16k_fx[CPE_CHANNELS][L_FRAME16k];
@@ -847,6 +848,7 @@ ivas_error ivas_core_enc(
            Word32 realBuffer_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX];
            Word32 imagBuffer_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX];
            Word16 new_swb_speech_16_fx[L_FRAME48k] = { 0 };
            Word16 use_shb32 = 0;
            Word16 q_realImagBuffer = Q_factor_arrL( (float *) &realBuffer[n][0][0], CLDFB_NO_COL_MAX * CLDFB_NO_CHANNELS_MAX );
            q_realImagBuffer = s_min( q_realImagBuffer, Q_factor_arrL( (float *) &imagBuffer[n][0][0], CLDFB_NO_COL_MAX * CLDFB_NO_CHANNELS_MAX ) );
            floatToFixed_arrL32( (float *) &realBuffer[n][0][0], (Word32 *) &realBuffer_fx[0][0], q_realImagBuffer, CLDFB_NO_COL_MAX * CLDFB_NO_CHANNELS_MAX );
@@ -858,7 +860,7 @@ ivas_error ivas_core_enc(
#else
            for ( Word32 idx = 0; idx < ( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ); idx++ )
            {
                st->hSignalBuf->input_buff[idx] = (Word16) st->hSignalBuf->input_buff_flt[0];
                st->hSignalBuf->input_buff[idx] = (Word16) st->hSignalBuf->input_buff_flt[idx];
            }
#endif
            if ( st->element_mode == IVAS_CPE_DFT )
@@ -895,7 +897,7 @@ ivas_error ivas_core_enc(
            }
#endif
#endif
            swb_pre_proc_ivas_fx( st, new_swb_speech_16_fx, new_swb_speech_fx, shb_speech_fx, realBuffer_fx, imagBuffer_fx, q_realImagBuffer, hCPE );
            swb_pre_proc_ivas_fx( st, new_swb_speech_16_fx, new_swb_speech_fx, shb_speech_fx, shb_speech_fx_32, &use_shb32, realBuffer_fx, imagBuffer_fx, q_realImagBuffer, hCPE );
#ifdef IVAS_FLOAT_FIXED_CONVERSIONS
            fixedToFloat_arr( (Word16 *) &st->hBWE_TD->old_speech_shb_fx[0], (float *) &st->hBWE_TD->old_speech_shb[0], 0, L_LOOK_16k + L_SUBFR16k );
            fixedToFloat_arr( (Word16 *) &st->hBWE_FD->old_fdbwe_speech_fx[0], (float *) &st->hBWE_FD->old_fdbwe_speech[0], 0, L_FRAME48k );
@@ -906,7 +908,14 @@ ivas_error ivas_core_enc(
            }
            fixedToFloat_arrL32( (Word32 *) &st->cldfbSynTd->cldfb_state_fx[0], (float *) &st->cldfbSynTd->cldfb_state[0], q_realImagBuffer, st->cldfbSynTd->p_filter_length );
            fixedToFloat_arr( new_swb_speech_16_fx, new_swb_speech, 0, L_FRAME48k );
            if ( use_shb32 == 0 )
            {
                fixedToFloat_arr( shb_speech_fx, shb_speech, 0, L_FRAME16k );
            }
            else
            {
                fixedToFloat_arrL( shb_speech_fx_32, shb_speech, q_realImagBuffer - 1, L_FRAME16k );
            }
            fixedToFloat_arrL32( (Word32 *) &realBuffer_fx[0][0], (float *) &realBuffer[n][0][0], q_realImagBuffer, CLDFB_NO_COL_MAX * CLDFB_NO_CHANNELS_MAX );
            fixedToFloat_arrL32( (Word32 *) &imagBuffer_fx[0][0], (float *) &imagBuffer[n][0][0], q_realImagBuffer, CLDFB_NO_COL_MAX * CLDFB_NO_CHANNELS_MAX );
            st->hBWE_TD->cldfbHBLT_flt = fix16_to_float( st->hBWE_TD->cldfbHBLT, Q13 );
+13 −1
Original line number Diff line number Diff line
@@ -282,6 +282,8 @@ void swb_pre_proc_ivas_fx(
    Word16 *new_swb_speech,                                     /* o  : original input signal at 32kHz - Q0      */
    Word32 *new_swb_speech_fx,                                  /* o  : original input signal at 32kHz - Q - q_reImBuffer */
    Word16 *shb_speech,                                         /* o  : SHB target signal (6-14kHz) at 16kHz- Q0 */
    Word32 *shb_speech_32,                                      /* o  : SHB target signal (6-14kHz) at 16kHz- Q - q_reImBuffer */
    Word16 *use_shb32,                                          /* o  : flags valid data in 32-bit shb buffer for better precision. */
    Word32 realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i  : real buffer Q - q_reImbuffer             */
    Word32 imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i  : imag buffer Q - q_reImbuffer             */
    Word16 q_reImBuffer,                                        /* i : scale data of real and imag CLDFB buffers */
@@ -308,9 +310,11 @@ void swb_pre_proc_ivas_fx(
    Word32 lbEner;
    Word16 exp_lbEner = 0;
    Word16 Sample_Delay_SWB_BWE32k, lMemRecalc32k, dft_ovl32k;
    Word32 shb_speech_32[L_FRAME16k];
    Word32 one_by_50_Q31 = 42949673;

    *use_shb32 = 0;
    move16();

    lMemRecalc32k = NS2SA_FX2( 32000, L_MEM_RECALC_NS );
    move16(); // exp_lbEner
    move16(); // lMemRecalc32k
@@ -783,6 +787,8 @@ void swb_pre_proc_ivas_fx(

            // Copy_Scale_sig_16_32((const Word16 *)&shb_speech[0], (Word32 *)&shb_speech_32[0], L_FRAME16k,Q16);
            cldfbSynthesis_ivas_fx( realBufferFlipped, imagBufferFlipped, shb_speech_32, -1, st->cldfbSynTd );
            *use_shb32 = 1;
            move16();
            Copy_Scale_sig_32_16( (const Word32 *) &shb_speech_32[0], (Word16 *) &shb_speech[0], L_FRAME16k, negate( sub( q_reImBuffer, 1 ) ) );
        }

@@ -888,6 +894,8 @@ void swb_pre_proc_ivas_fx(
        IF( ( EQ_16( st->bwidth, FB ) || st->core == ACELP_CORE ) && ( st->element_mode == EVS_MONO ) )
        {
            InitSWBencBufferStates_fx( st->hBWE_TD, shb_speech );
            *use_shb32 = 0;
            move16();
        }
        ELSE
        {
@@ -932,6 +940,8 @@ void swb_pre_proc_ivas_fx(
            }

            Decimate_allpass_steep_fx( spchTmp, hBWE_TD->state_ana_filt_shb_fx, L_FRAME32k, shb_speech );
            *use_shb32 = 0;
            move16();

            Copy( shb_speech + L_FRAME16k - ( L_LOOK_16k + L_SUBFR16k ), hBWE_TD->old_speech_shb_fx, L_LOOK_16k + L_SUBFR16k );

@@ -971,6 +981,8 @@ void swb_pre_proc_ivas_fx(
            shb_speech[i] = mult_r( mult_r( i, 983 /*0.03f Q15*/ ), shb_speech[2 * delay - 1 - i] );
            move16();
        }
        *use_shb32 = 0;
        move16();
    }

    return;