Commit 45cac969 authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

Merge branch 'ltv_crash_fixes_enc_2' into 'main'

Fix for LTV crashes observed after precision improvements

See merge request !1061
parents 492e1181 e7d76e80
Loading
Loading
Loading
Loading
+34 −34
Original line number Diff line number Diff line
@@ -845,22 +845,14 @@ void computeReferencePower_enc_fx_dirac(
        }
    }

    min_norm = W_norm( reference_power_temp[0] );
    FOR( i = 0; i < num_freq_bands; i++ )
    {
        min_norm = s_min( min_norm, W_norm( reference_power_temp[i] ) ); // Finding minimum norm for the right shifting of entire buffer
    }

    FOR( i = 0; i < num_freq_bands; i++ )
    {
        min_norm = W_norm( reference_power_temp[i] );
        reference_power[i] = W_extract_h( W_shl( reference_power_temp[i], min_norm ) ); // Right shift with min_norm and extract high bits
        move32();
        e_reference[i] = sub( 31, sub( add( sub( 31, e_reference_temp ), min_norm ), 32 ) );
        move16();
    }
#ifdef FIX_1127_IMPROVE_SBA_MLD
    *e_reference = sub( 31, sub( add( sub( 31, e_reference_temp ), min_norm ), 32 ) );
#else
    *e_reference = sub( e_reference_temp, min_norm );
#endif
    move16();

    return;
@@ -1002,7 +994,7 @@ void ivas_dirac_param_est_enc_fx(
    Word16 mrange[2];
    Word16 num_blocks;
    Word32 reference_power_fx[CLDFB_NO_COL_MAX][DIRAC_NO_FB_BANDS_MAX];
    Word16 reference_power_exp;
    Word16 reference_power_exp[CLDFB_NO_COL_MAX][DIRAC_NO_FB_BANDS_MAX];
    Word32 azi_secs_fx[2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS];
    Word32 ele_secs_fx[2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS];
    Word32 diff_secs_fx[2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS];
@@ -1049,8 +1041,10 @@ void ivas_dirac_param_est_enc_fx(
    set16_zero_fx( hDirAC->diffuseness_m_exp, hDirAC->hConfig->nbands );
    set_zero_fx( renormalization_factor_diff_fx, hDirAC->hConfig->nbands );
    set16_zero_fx( renormalization_factor_diff_exp, hDirAC->hConfig->nbands );
    reference_power_exp = 0;
    move16();
    FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ )
    {
        set16_zero_fx( reference_power_exp[i], DIRAC_NO_FB_BANDS_MAX );
    }

    set_zero_fx( azi_secs_fx, 2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS );
    set_zero_fx( ele_secs_fx, 2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS );
@@ -1140,7 +1134,7 @@ void ivas_dirac_param_est_enc_fx(
                Cldfb_ImagBuffer_fx,
                sub( 31, cldfb_q ),
                reference_power_fx[ts],
                &reference_power_exp,
                reference_power_exp[ts],
                hDirAC->hConfig->enc_param_start_band,
                num_freq_bands,
                ivas_format,
@@ -1205,7 +1199,11 @@ void ivas_dirac_param_est_enc_fx(
#endif
            }
            Copy32( reference_power_fx[ts], &( hDirAC->buffer_energy_fx[( index - 1 ) * num_freq_bands] ), num_freq_bands ); /* exp(reference_power_exp) */
            set16_fx( &hDirAC->buffer_energy_q[( index - 1 ) * num_freq_bands], sub( 31, reference_power_exp ), num_freq_bands );
            FOR( i = 0; i < num_freq_bands; i++ )
            {
                hDirAC->buffer_energy_q[( index - 1 ) * num_freq_bands + i] = sub( 31, reference_power_exp[ts][i] );
                move16();
            }

            Word16 buffer_intensity_real_single_q;
            buffer_intensity_real_single_q = hDirAC->buffer_intensity_real_q[0][0][0];
@@ -1279,19 +1277,18 @@ void ivas_dirac_param_est_enc_fx(
                {
                    Word32 tmp_diff = L_shr( diffuseness_vector_fx[band_m_idx], sub( diffuseness_vector_q, 30 ) ); // diffueseness_vector_q -> Q30
                    hDirAC->diffuseness_m_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( hDirAC->diffuseness_m_fx[band_m_idx], hDirAC->diffuseness_m_exp[band_m_idx],
                                                                                     Mpy_32_32( reference_power_fx[ts][band_m_idx], tmp_diff ), add( reference_power_exp, 1 ), &hDirAC->diffuseness_m_exp[band_m_idx] ); /* exp(hDirAC->diffuseness_m_exp) */
                                                                                     Mpy_32_32( reference_power_fx[ts][band_m_idx], tmp_diff ), add( reference_power_exp[ts][band_m_idx], 1 ), &hDirAC->diffuseness_m_exp[band_m_idx] ); /* exp(hDirAC->diffuseness_m_exp) */
                    move32();
                    renormalization_factor_diff_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_diff_fx[band_m_idx], renormalization_factor_diff_exp[band_m_idx], reference_power_fx[ts][band_m_idx], reference_power_exp, &renormalization_factor_diff_exp[band_m_idx] ); /* exp(renormalization_factor_diff_exp) */
                    renormalization_factor_diff_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_diff_fx[band_m_idx], renormalization_factor_diff_exp[band_m_idx], reference_power_fx[ts][band_m_idx], reference_power_exp[ts][band_m_idx], &renormalization_factor_diff_exp[band_m_idx] ); /* exp(renormalization_factor_diff_exp) */
                    move32();
                }
            }
            ELSE
            {
                norm_tmp_exp = add( reference_power_exp, 1 );

                FOR( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ )
                {
                    Word32 tmp_diff = L_shr( diffuseness_vector_fx[band_m_idx], sub( diffuseness_vector_q, 30 ) ); // diffueseness_vector_q -> Q30
                    norm_tmp_exp = add( reference_power_exp[ts][band_m_idx], 1 );
                    norm_tmp_fx = Mpy_32_32( reference_power_fx[ts][band_m_idx], L_sub( ONE_IN_Q30, tmp_diff ) );

                    dir[0][band_m_idx] = W_mult_32_32( norm_tmp_fx, direction_vector_fx[0][band_m_idx] );
@@ -1327,10 +1324,10 @@ void ivas_dirac_param_est_enc_fx(
                    renormalization_factor_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_fx[band_m_idx], renormalization_factor_exp[band_m_idx], norm_tmp_fx, norm_tmp_exp, &renormalization_factor_exp[band_m_idx] ); /* exp(norm_tmp_exp + gbits) */
                    move32();
                    hDirAC->diffuseness_m_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( hDirAC->diffuseness_m_fx[band_m_idx], hDirAC->diffuseness_m_exp[band_m_idx],
                                                                                     Mpy_32_32( reference_power_fx[ts][band_m_idx], tmp_diff ), add( reference_power_exp, 1 ), &hDirAC->diffuseness_m_exp[band_m_idx] ); /* exp(hDirAC->diffuseness_m_exp) */
                                                                                     Mpy_32_32( reference_power_fx[ts][band_m_idx], tmp_diff ), add( reference_power_exp[ts][band_m_idx], 1 ), &hDirAC->diffuseness_m_exp[band_m_idx] ); /* exp(hDirAC->diffuseness_m_exp) */
                    move32();
                    renormalization_factor_diff_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_diff_fx[band_m_idx], renormalization_factor_diff_exp[band_m_idx],
                                                                                           reference_power_fx[ts][band_m_idx], reference_power_exp, &renormalization_factor_diff_exp[band_m_idx] ); /* exp(renormalization_factor_diff_exp) */
                                                                                           reference_power_fx[ts][band_m_idx], reference_power_exp[ts][band_m_idx], &renormalization_factor_diff_exp[band_m_idx] ); /* exp(renormalization_factor_diff_exp) */
                    move32();
                }
            }
@@ -1340,24 +1337,27 @@ void ivas_dirac_param_est_enc_fx(
        {
            FOR( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ )
            {
                Word16 tmp_e = shl( direction_vector_exp_tmp[0][block_m_idx][block_m_idx], 1 );

                renormalization_factor_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_fx[band_m_idx], renormalization_factor_exp[block_m_idx], Mpy_32_32( hDirAC->direction_vector_m_fx[0][block_m_idx][band_m_idx], hDirAC->direction_vector_m_fx[0][block_m_idx][band_m_idx] ), tmp_e, &renormalization_factor_exp[block_m_idx] ); /* norm_tmp_exp + ( 31 - direction_vector_q ) + gbits */
                renormalization_factor_fx[band_m_idx] = EPSILON_FX;
                move32();
                renormalization_factor_exp[band_m_idx] = 0;
                move16();
                Word16 tmp_e = shl( direction_vector_exp_tmp[0][block_m_idx][band_m_idx], 1 );
                renormalization_factor_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_fx[band_m_idx], renormalization_factor_exp[band_m_idx], Mpy_32_32( hDirAC->direction_vector_m_fx[0][block_m_idx][band_m_idx], hDirAC->direction_vector_m_fx[0][block_m_idx][band_m_idx] ), tmp_e, &renormalization_factor_exp[band_m_idx] ); /* norm_tmp_exp + ( 31 - direction_vector_q ) + gbits */
                move32();
                tmp_e = shl( direction_vector_exp_tmp[1][block_m_idx][block_m_idx], 1 );
                renormalization_factor_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_fx[band_m_idx], renormalization_factor_exp[block_m_idx], Mpy_32_32( hDirAC->direction_vector_m_fx[1][block_m_idx][band_m_idx], hDirAC->direction_vector_m_fx[1][block_m_idx][band_m_idx] ), tmp_e, &renormalization_factor_exp[block_m_idx] ); /* norm_tmp_exp + ( 31 - direction_vector_q ) + gbits */
                tmp_e = shl( direction_vector_exp_tmp[1][block_m_idx][band_m_idx], 1 );
                renormalization_factor_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_fx[band_m_idx], renormalization_factor_exp[band_m_idx], Mpy_32_32( hDirAC->direction_vector_m_fx[1][block_m_idx][band_m_idx], hDirAC->direction_vector_m_fx[1][block_m_idx][band_m_idx] ), tmp_e, &renormalization_factor_exp[band_m_idx] ); /* norm_tmp_exp + ( 31 - direction_vector_q ) + gbits */
                move32();
                tmp_e = shl( direction_vector_exp_tmp[2][block_m_idx][block_m_idx], 1 );
                renormalization_factor_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_fx[band_m_idx], renormalization_factor_exp[block_m_idx], Mpy_32_32( hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx], hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx] ), tmp_e, &renormalization_factor_exp[block_m_idx] ); /* norm_tmp_exp + ( 31 - direction_vector_q ) + gbits */
                tmp_e = shl( direction_vector_exp_tmp[2][block_m_idx][band_m_idx], 1 );
                renormalization_factor_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_fx[band_m_idx], renormalization_factor_exp[band_m_idx], Mpy_32_32( hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx], hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx] ), tmp_e, &renormalization_factor_exp[band_m_idx] ); /* norm_tmp_exp + ( 31 - direction_vector_q ) + gbits */
                move32();
                IF( renormalization_factor_fx[band_m_idx] == 0 )
                {
                    renormalization_factor_fx[band_m_idx] = EPSILON_FX;
                    move32();
                    renormalization_factor_exp[block_m_idx] = 0;
                    renormalization_factor_exp[band_m_idx] = 0;
                    move16();
                }
                renormalization_factor_fx[band_m_idx] = Sqrt32( renormalization_factor_fx[band_m_idx], &renormalization_factor_exp[block_m_idx] );
                renormalization_factor_fx[band_m_idx] = Sqrt32( renormalization_factor_fx[band_m_idx], &renormalization_factor_exp[band_m_idx] );
                move32();

                IF( GT_32( renormalization_factor_fx[band_m_idx], EPSILON_FX ) )
@@ -1368,21 +1368,21 @@ void ivas_dirac_param_est_enc_fx(
                    move32();
                    tmp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( tmp32, renormalization_factor_fx[band_m_idx], &tmp_e ) ); /* exp(tmp_e + ( hDirAC->direction_vector_m_exp[block_m_idx] - renormalization_factor_exp)) */
                    tmp_e = add( tmp_e, sub( direction_vector_exp_tmp[0][block_m_idx][band_m_idx], renormalization_factor_exp[band_m_idx] ) );
                    hDirAC->direction_vector_m_fx[0][block_m_idx][band_m_idx] = L_shr( tmp32, sub( 1, tmp_e ) ); // Q30
                    hDirAC->direction_vector_m_fx[0][block_m_idx][band_m_idx] = L_shr_sat( tmp32, sub( 1, tmp_e ) ); // Q30 saturation needs to check
                    move32();

                    tmp32 = hDirAC->direction_vector_m_fx[1][block_m_idx][band_m_idx]; // Q30
                    move32();
                    tmp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( tmp32, renormalization_factor_fx[band_m_idx], &tmp_e ) ); /* exp(tmp_e + ( hDirAC->direction_vector_m_exp[block_m_idx] - renormalization_factor_exp)) */
                    tmp_e = add( tmp_e, sub( direction_vector_exp_tmp[1][block_m_idx][band_m_idx], renormalization_factor_exp[band_m_idx] ) );
                    hDirAC->direction_vector_m_fx[1][block_m_idx][band_m_idx] = L_shr( tmp32, sub( 1, tmp_e ) ); // Q30
                    hDirAC->direction_vector_m_fx[1][block_m_idx][band_m_idx] = L_shr_sat( tmp32, sub( 1, tmp_e ) ); // Q30 saturation needs to check
                    move32();

                    tmp32 = hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx]; // Q30
                    move32();
                    tmp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( tmp32, renormalization_factor_fx[band_m_idx], &tmp_e ) ); /* exp(tmp_e + ( hDirAC->direction_vector_m_exp[block_m_idx] - renormalization_factor_exp)) */
                    tmp_e = add( tmp_e, sub( direction_vector_exp_tmp[2][block_m_idx][band_m_idx], renormalization_factor_exp[band_m_idx] ) );
                    hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx] = L_shr( tmp32, sub( 1, tmp_e ) ); // Q30
                    hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx] = L_shr_sat( tmp32, sub( 1, tmp_e ) ); // Q30 saturation needs to check
                    move32();
                }
                ELSE
+2 −0
Original line number Diff line number Diff line
@@ -166,6 +166,8 @@ static void GetAttackForTCXDecision_ivas_fx( Word32 const *pSubblockNrg, Word32
    {
        move16();
        bIsAttackPresent = TRUE;
        attackIndex = 0;
        move16();
    }

    FOR( i = 0; i < NSUBBLOCKS; i++ )