Commit 4e780ae3 authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

Merge branch 'ltv_crash_fixes_1' into 'main'

Fix for LTV crashes observed with stereo and OMASA formats

See merge request !978
parents d3e377c6 5ae687c3
Loading
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -576,6 +576,7 @@ typedef struct ivas_stereo_classifier_data_structure
    Word32 non_sta_ch1_fx;
    Word16 non_sta_ch1_e;
    Word16 sp_div_ch1_fx;
    Word16 sp_div_ch1_e;
    Word32 ps_sta_ch1_fx, ps_sta_ch2_fx;
    Word16 ps_sta_ch1_e, ps_sta_ch2_e;
    Word32 prev_g_IPD_fx;       // Q29
+12 −2
Original line number Diff line number Diff line
@@ -464,6 +464,8 @@ void stereo_classifier_features_ivas_fx(
    Word16 ener_e;

    Word32 lepsP_ch2_fx, ener_l_fx, ener_r_fx;
    Word32 L_tmp;
    Word16 exp;
    /* combine VAD flags from both channels */
    IF( idchan == 0 )
    {
@@ -710,10 +712,12 @@ void stereo_classifier_features_ivas_fx(
        hStereoClassif->non_sta_ch1_fx = non_staX_fx;
        hStereoClassif->non_sta_ch1_e = non_staX_e;
        hStereoClassif->sp_div_ch1_fx = sp_div_fx;
        hStereoClassif->sp_div_ch1_e = sp_div_e;
        hStereoClassif->xtalk_fv_fx[E_cor_map_sum] = L_shr( cor_map_sum_fx, sub( 16, cor_map_sum_e ) );                                                                                                                              /*q15*/
        hStereoClassif->xtalk_fv_fx[E_nchar] = L_shr( BASOP_Util_Loge( L_add( L_shr( hStereoClassif->nchar_ch1_fx, 1 ), L_shl( 1, sub( 30, hStereoClassif->nchar_ch1_e ) ) ), add( hStereoClassif->nchar_ch1_e, 1 ) ) /*q25*/, 10 ); /*q15*/
        hStereoClassif->xtalk_fv_fx[E_non_sta] = L_shr( non_staX_fx, sub( 16, non_staX_e ) );                                                                                                                                        /*q15*/
        hStereoClassif->xtalk_fv_fx[E_sp_div] = L_shr( BASOP_Util_Loge( L_deposit_h( add( shr( sp_div_fx, 1 ), shl( 1, sub( 15 - 1, sp_div_e ) ) ) ), add( sp_div_e, 1 ) ), 10 );                                                    /*q15*/
        L_tmp = BASOP_Util_Add_Mant32Exp( L_deposit_h( sp_div_fx ), sp_div_e, ONE_IN_Q31, 0, &exp );
        hStereoClassif->xtalk_fv_fx[E_sp_div] = L_shr( BASOP_Util_Loge( L_tmp, exp ), 10 ); /*q15*/
        move32();
        move32();
        move32();
@@ -724,13 +728,19 @@ void stereo_classifier_features_ivas_fx(
        move16();
        move16();
        move16();
        move16();
    }
    ELSE
    {
        hStereoClassif->xtalk_fv_fx[E_d_cor_map_sum] = L_abs( L_sub( L_shr( hStereoClassif->cor_map_sum_ch1_fx, sub( 16, hStereoClassif->cor_map_sum_ch1_e ) ) /*q15*/, L_shr( cor_map_sum_fx, sub( 16, cor_map_sum_e ) ) /*q15*/ ) );                                                                                                                                                                                    /*q15*/
        hStereoClassif->xtalk_fv_fx[E_d_nchar] = L_abs( L_shr( L_sub( BASOP_Util_Loge( L_add( L_shr( hStereoClassif->nchar_ch1_fx, 1 ), L_shl( 1, sub( 30, hStereoClassif->nchar_ch1_e ) ) ), add( hStereoClassif->nchar_ch1_e, 1 ) ), BASOP_Util_Loge( L_add( L_shr( hStereoClassif->nchar_ch2_fx, 1 ), L_shl( 1, sub( 30, hStereoClassif->nchar_ch2_e ) ) ), add( hStereoClassif->nchar_ch2_e, 1 ) ) ) /*q25*/, 10 ) ); /*q15*/
        hStereoClassif->xtalk_fv_fx[E_d_non_sta] = L_abs( L_sub( L_shr( hStereoClassif->non_sta_ch1_fx, sub( 16, hStereoClassif->non_sta_ch1_e ) ) /*q15*/, L_shr( non_staX_fx, sub( 16, non_staX_e ) ) /*q15*/ ) );                                                                                                                                                                                                      /*q15*/
        hStereoClassif->xtalk_fv_fx[E_d_sp_div] = L_abs( L_shr( L_sub( BASOP_Util_Loge( L_deposit_h( add( shr( hStereoClassif->sp_div_ch1_fx, 1 ), shl( 1, sub( 15 - 1, sp_div_e ) ) ) ), add( sp_div_e, 1 ) ), BASOP_Util_Loge( L_deposit_h( add( shr( sp_div_fx, 1 ), shl( 1, sub( 15 - 1, sp_div_e ) ) ) ), add( sp_div_e, 1 ) ) ) /*q25*/, 10 ) );                                                                    /*q15*/
        L_tmp = BASOP_Util_Add_Mant32Exp( L_deposit_h( sp_div_fx ), sp_div_e, ONE_IN_Q31, 0, &exp );
        hStereoClassif->xtalk_fv_fx[E_d_sp_div] = L_shr( BASOP_Util_Loge( L_tmp, exp ), 10 ); /*q15*/
        L_tmp = BASOP_Util_Add_Mant32Exp( L_deposit_h( hStereoClassif->sp_div_ch1_fx ), hStereoClassif->sp_div_ch1_e, ONE_IN_Q31, 0, &exp );
        hStereoClassif->xtalk_fv_fx[E_d_sp_div] = L_abs( L_sub( L_shr( BASOP_Util_Loge( L_tmp, exp ), 10 ), hStereoClassif->xtalk_fv_fx[E_d_sp_div] ) ); /*q15*/
        // hStereoClassif->xtalk_fv_fx[E_d_sp_div] = L_abs( L_shr( L_sub( BASOP_Util_Loge( L_deposit_h( add( shr( hStereoClassif->sp_div_ch1_fx, 1 ), shl( 1, sub( 15 - 1, hStereoClassif->sp_div_ch1_e ) ) ) ), add( hStereoClassif->sp_div_ch1_e, 1 ) ), BASOP_Util_Loge( L_deposit_h( add( shr( sp_div_fx, 1 ), shl( 1, sub( 15 - 1, sp_div_e ) ) ) ), add( sp_div_e, 1 ) ) ) /*q25*/, 10 ) );                                                                    /*q15*/
        move32();
        move32();
        move32();
        move32();
+40 −15
Original line number Diff line number Diff line
@@ -1310,7 +1310,7 @@ void wb_tbe_enc_ivas_fx(
    /*Word16 ramp_flag;*/
    Word32 p2m_in, p2m_out;
    /*Word16 cnt, max =0;*/
    Word16 n_mem, Q_bwe_exc, Q_bwe_exc_ext, exp_out, Q_pow; /* Q_hb_frame; */
    Word16 n_mem, Q_bwe_exc, Q_bwe_exc_ext, exp_out, Q_cur_pow, Q_prev_pow; /* Q_hb_frame; */
    Word32 L_tmp, Lmax;
    Word16 tmp, exp, Q_out, sc;
    Word16 Q_ns = -1;
@@ -1586,18 +1586,43 @@ void wb_tbe_enc_ivas_fx(

    prev_pow = 0;
    move32();
    Q_prev_pow = norm_arr( hBWE_TD->state_syn_shbexc_fx, L_SHB_LAHEAD / 4 );
    /* Compare with the guard bits needed in the subsequent operations.
     * Guard bits for L_SHB_LAHEAD / 4 (expression evaluates to 5) is 3.
     */
    IF( LT_16( Q_prev_pow, 3 ) )
    {
        FOR( i = 0; i < L_SHB_LAHEAD / 4; i++ )
        {
            shaped_wb_exc_scale[i] = shr( hBWE_TD->state_syn_shbexc_fx[i], 3 );
            move16();
        }
        Q_prev_pow = shl_r( sub( sub( st_fx->prev_Q_bwe_exc, 16 ), 3 ), 1 );
        move16();
    }
    ELSE
    {
        FOR( i = 0; i < L_SHB_LAHEAD / 4; i++ )
        {
            shaped_wb_exc_scale[i] = hBWE_TD->state_syn_shbexc_fx[i];
            move16();
        }
        Q_prev_pow = shl_r( sub( st_fx->prev_Q_bwe_exc, 16 ), 1 );
        move16();
    }

    IF( st_fx->element_mode > EVS_MONO )
    {
        tmp = sub( shl( sub( st_fx->prev_Q_bwe_exc, 16 ), 1 ), 31 + 16 );
        tmp = sub( Q_prev_pow, 31 + 16 );
#ifdef BASOP_NOGLOB
        prev_pow = L_shl_sat( 1407374848l /*0.00001f Q47*/, tmp ); /*Q(2*(st_fx->prev_Q_bwe_exc-16))*/
        prev_pow = L_shl_sat( 1407374848l /*0.00001f Q47*/, tmp ); /*Q_prev_pow*/
#else
        prev_pow = L_shl( 1407374848l /*0.00001f Q47*/, tmp );     /*Q(2*(st_fx->prev_Q_bwe_exc-16))*/
        prev_pow = L_shl( 1407374848l /*0.00001f Q47*/, tmp );     /*Q_prev_pow*/
#endif
    }
    FOR( i = 0; i < L_SHB_LAHEAD / 4; i++ )
    {
        prev_pow = L_mac0( prev_pow, hBWE_TD->state_syn_shbexc_fx[i], hBWE_TD->state_syn_shbexc_fx[i] ); /* Q(2*st_fx->prev_Q_bwe_exc) */
        prev_pow = L_mac0( prev_pow, shaped_wb_exc_scale[i], shaped_wb_exc_scale[i] ); /* Q_prev_pow */
    }

    rescale_genWB_mem_enc( st_fx, sub( Q_bwe_exc, st_fx->prev_Q_bwe_exc ) );
@@ -1621,42 +1646,42 @@ void wb_tbe_enc_ivas_fx(

    curr_pow = 0;
    move32();
    Q_pow = norm_arr( &shaped_wb_excitation[L_SHB_LAHEAD / 4], L_SHB_LAHEAD / 4 );
    Q_cur_pow = norm_arr( &shaped_wb_excitation[L_SHB_LAHEAD / 4], L_SHB_LAHEAD / 4 );
    /* Compare with the guard bits needed in the subsequent operations.
     * Guard bits for L_SHB_LAHEAD / 4 (expression evaluates to 5) is 3.
     */
    IF( LT_16( Q_pow, 3 ) )
    IF( LT_16( Q_cur_pow, 3 ) )
    {
        FOR( i = 0; i < L_SHB_LAHEAD / 4; i++ )
        {
            shaped_wb_exc_scale[i] = shr( shaped_wb_excitation[i], 3 );
            shaped_wb_exc_scale[i] = shr( shaped_wb_excitation[i + L_SHB_LAHEAD / 4], 3 );
            move16();
        }
        Q_pow = shl_r( sub( Q_bwe_exc_ext, 3 ), 1 );
        Q_cur_pow = shl_r( sub( Q_bwe_exc_ext, 3 ), 1 );
        move16();
    }
    ELSE
    {
        FOR( i = 0; i < L_SHB_LAHEAD / 4; i++ )
        {
            shaped_wb_exc_scale[i] = shaped_wb_excitation[i];
            shaped_wb_exc_scale[i] = shaped_wb_excitation[i + L_SHB_LAHEAD / 4];
            move16();
        }
        Q_pow = shl_r( Q_bwe_exc_ext, 1 );
        Q_cur_pow = shl_r( Q_bwe_exc_ext, 1 );
        move16();
    }
    IF( st_fx->element_mode > EVS_MONO )
    {
        tmp = sub( Q_pow, 31 + 16 );
        tmp = sub( Q_cur_pow, 31 + 16 );
#ifdef BASOP_NOGLOB
        curr_pow = L_shl_sat( 1407374848l /*0.00001f Q47*/, tmp ); /*Q(Q_pow)*/
        curr_pow = L_shl_sat( 1407374848l /*0.00001f Q47*/, tmp ); /*Q(Q_cur_pow)*/
#else
        curr_pow = L_shl( 1407374848l /*0.00001f Q47*/, tmp );     /* 2*(Q_bwe_exc_ext) */
#endif
    }
    FOR( i = 0; i < L_SHB_LAHEAD / 4; i++ )
    {
        curr_pow = L_mac0( curr_pow, shaped_wb_exc_scale[i], shaped_wb_exc_scale[i] ); /* Q(Q_pow) */
        curr_pow = L_mac0( curr_pow, shaped_wb_exc_scale[i], shaped_wb_exc_scale[i] ); /* Q(Q_cur_pow) */
    }

    IF( GT_16( voice_factors[0], 24576 ) )
@@ -1664,7 +1689,7 @@ void wb_tbe_enc_ivas_fx(
        curr_pow = L_shr( curr_pow, 2 ); /* Q(Q_pow) */
    }

    Lscale = root_a_over_b_fx( curr_pow, Q_pow, prev_pow, shl_r( sub( st_fx->prev_Q_bwe_exc, 16 ), 1 ), &exp );
    Lscale = root_a_over_b_fx( curr_pow, Q_cur_pow, prev_pow, Q_prev_pow, &exp );

    FOR( i = 0; i < L_SHB_LAHEAD / 4 - 1; i++ )
    {