Commit 55f431d5 authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

Merge branch 'ltv_crash_fixes_enc' into 'main'

Crash fixes for LTV encoder, ASAN/MSAN fixes [allow regression]

See merge request !1198
parents 8ffe5d4e 584e1f74
Loading
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -197,7 +197,8 @@ typedef struct TNS_filter_structure
    Word16 order;                           /* Filter order. */
    Word16 coefIndex[TNS_MAX_FILTER_ORDER]; /* Quantized filter coefficients. */
    Word16 predictionGain;                  /* Prediction gain. The ratio of a signal and TNS residual energy. E(PRED_GAIN_E), Q7 */
    Word32 predictionGain32;                /* Prediction gain. The ratio of a signal and TNS residual energy. E(PRED_GAIN_E), Q23 */
    Word32 predictionGain32;                /* Prediction gain. The ratio of a signal and TNS residual energy.  predictionGain_e */
    Word16 predictionGain_e;                /*Exponent for predictionGain32 */
    Word16 avgSqrCoef;                      /* Average squared filter coefficient. E(0), Q15 */
} STnsFilter;

+2 −0
Original line number Diff line number Diff line
@@ -1204,6 +1204,8 @@ void ResetTnsData( STnsData *pTnsData )
        move16();
        pTnsFilter->predictionGain32 = ONE_IN_Q23; /*Q23*/
        move32();
        pTnsFilter->predictionGain_e = PRED_GAIN_E;
        move16();
        pTnsFilter->avgSqrCoef = 0;
        move16();
        pTnsFilter->filterType = TNS_FILTER_OFF; /*Q0*/
+110 −17
Original line number Diff line number Diff line
@@ -74,8 +74,11 @@ void TNSAnalysisStereo_fx(
    TCX_ENC_HANDLE hTcxEnc = NULL;
    Word16 individual_decision[NB_DIV];
    Word32 maxPredictionGain_fx = 0, meanPredictionGain_fx;
    move32();
    Word16 maxPredictionGain_e = Q31, meanPredictionGain_e;
    move16();
    Word16 sum_e = 0;
    move16();

    individual_decision[0] = 0;
    move16();
    individual_decision[1] = 0;
@@ -210,7 +213,9 @@ void TNSAnalysisStereo_fx(
                test();
                IF( sts[0]->hTcxCfg->fIsTNSAllowed && NE_16( individual_decision[k], 1 ) && ( !bWhitenedDomain || sts[0]->hTcxEnc->bTnsOnWhithenedSpectra[k] ) )
                {
                    Word32 maxPredGain_fx = -ONE_IN_Q23;
                    Word32 maxPredGain_fx = -ONE_IN_Q31;
                    move32();
                    Word16 maxPredGain_e = 0;
                    move16();
                    sts[0]->hTcxCfg->pCurrentTnsConfig = &sts[0]->hTcxCfg->tnsConfig[sts[0]->hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( sts[0]->last_core == ACELP_CORE )];
                    sts[1]->hTcxCfg->pCurrentTnsConfig = &sts[1]->hTcxCfg->tnsConfig[sts[1]->hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( sts[1]->last_core == ACELP_CORE )];
@@ -228,30 +233,74 @@ void TNSAnalysisStereo_fx(
                         * both filters for the decision
                         */

                        meanPredictionGain_fx = L_add( Mpy_32_16_1( pFilter[0]->predictionGain32, 16384 /*0.5f Q15*/ ), Mpy_32_16_1( pFilter[1]->predictionGain32, 16384 /*0.5f Q15*/ ) ); // Q23
                        maxPredictionGain_fx = L_max( maxPredictionGain_fx, meanPredictionGain_fx );                                                                                       // Q23

                        meanPredictionGain_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( pFilter[0]->predictionGain32, 16384 /*0.5f Q15*/ ), pFilter[0]->predictionGain_e, Mpy_32_16_1( pFilter[1]->predictionGain32, 16384 /*0.5f Q15*/ ), pFilter[1]->predictionGain_e, &meanPredictionGain_e ); // meanPredictionGain_e
                        Word16 flag = BASOP_Util_Cmp_Mant32Exp( maxPredictionGain_fx, maxPredictionGain_e, meanPredictionGain_fx, meanPredictionGain_e );
                        IF( flag < 0 )
                        {
                            maxPredictionGain_fx = meanPredictionGain_fx;
                            maxPredictionGain_e = meanPredictionGain_e;
                            move32();
                            move16();
                        }
                        flag = BASOP_Util_Cmp_Mant32Exp( pFilter[0]->predictionGain32, pFilter[0]->predictionGain_e, L_deposit_h( pTnsParameters[0]->minPredictionGain ), PRED_GAIN_E );
                        if ( flag < 0 )
                        {
                            flag = 0;
                            move16();
                        }
                        Word16 flag_1 = BASOP_Util_Cmp_Mant32Exp( pFilter[1]->predictionGain32, pFilter[1]->predictionGain_e, L_deposit_h( pTnsParameters[1]->minPredictionGain ), PRED_GAIN_E );
                        if ( flag_1 < 0 )
                        {
                            flag_1 = 0;
                            move16();
                        }
                        test();
                        test();
                        test();
                        IF( GT_32( pFilter[0]->predictionGain32, L_shl( pTnsParameters[0]->minPredictionGain, 16 ) ) && LT_32( sts[0]->element_brate, IVAS_80k ) &&
                            GT_32( pFilter[1]->predictionGain32, L_shl( pTnsParameters[1]->minPredictionGain, 16 ) ) && EQ_16( sts[0]->hTcxEnc->tnsData[k].nFilters, sts[1]->hTcxEnc->tnsData[k].nFilters ) )
                        IF( flag && LT_32( sts[0]->element_brate, IVAS_80k ) &&
                            flag_1 && EQ_16( sts[0]->hTcxEnc->tnsData[k].nFilters, sts[1]->hTcxEnc->tnsData[k].nFilters ) )
                        {
                            pFilter[0]->predictionGain32 = pFilter[1]->predictionGain32 = meanPredictionGain_fx; /* more TNS filter sync at 48kbps */
                            move32();
                            move32();
                            pFilter[0]->predictionGain_e = pFilter[1]->predictionGain_e = meanPredictionGain_e; /* more TNS filter sync at 48kbps */
                            move16();
                            move16();
                            pFilter[0]->predictionGain = pFilter[1]->predictionGain = shl_sat( extract_h( meanPredictionGain_fx ), sub( meanPredictionGain_e, PRED_GAIN_E ) ); /* Q7 */
                            move16();
                            move16();
                        }
                        flag = BASOP_Util_Cmp_Mant32Exp( Mpy_32_16_1( meanPredictionGain_fx, SIMILAR_TNS_THRESHOLD_FX_IN_Q15 ), meanPredictionGain_e, L_abs( BASOP_Util_Add_Mant32Exp( pFilter[0]->predictionGain32, pFilter[0]->predictionGain_e, L_negate( pFilter[1]->predictionGain32 ), pFilter[1]->predictionGain_e, &sum_e ) ), sum_e );
                        if ( flag < 0 )
                        {
                            flag = 0;
                            move16();
                        }
                        test();
                        IF( LT_32( L_abs( L_sub( pFilter[0]->predictionGain32, pFilter[1]->predictionGain32 ) ), Mpy_32_16_1( meanPredictionGain_fx, SIMILAR_TNS_THRESHOLD_FX_IN_Q15 ) ) &&
                        IF( flag &&
                            ( EQ_16( sts[0]->hTcxEnc->tnsData[k].nFilters, sts[1]->hTcxEnc->tnsData[k].nFilters ) ) )
                        {

                            Word16 maxAvgSqrCoef_fx = s_max( pFilter[0]->avgSqrCoef, pFilter[1]->avgSqrCoef ); // Q15
                            Word16 meanLtpGain_fx = add( shr( sts[0]->hTcxEnc->tcxltp_gain, 1 ), shr( sts[1]->hTcxEnc->tcxltp_gain, 1 ) );
                            maxPredGain_fx = L_max( maxPredGain_fx, meanPredictionGain_fx );
                            // maxPredGain_fx = L_max( maxPredGain_fx, meanPredictionGain_fx );
                            flag = BASOP_Util_Cmp_Mant32Exp( maxPredGain_fx, maxPredGain_e, meanPredictionGain_fx, meanPredictionGain_e );
                            IF( flag < 0 )
                            {
                                maxPredGain_fx = meanPredictionGain_fx;
                                maxPredGain_e = meanPredictionGain_e;
                                move32();
                                move16();
                            }
                            flag = BASOP_Util_Cmp_Mant32Exp( meanPredictionGain_fx, meanPredictionGain_e, L_deposit_h( pTnsParameters[0]->minPredictionGain ), PRED_GAIN_E );
                            if ( flag < 0 )
                            {
                                flag = 0;
                                move16();
                            }
                            test();
                            test();
                            IF( GT_32( meanPredictionGain_fx, L_shl( pTnsParameters[0]->minPredictionGain, 16 ) ) || GT_16( maxAvgSqrCoef_fx, pTnsParameters[0]->minAvgSqrCoef ) )
                            IF( flag || GT_16( maxAvgSqrCoef_fx, pTnsParameters[0]->minAvgSqrCoef ) )
                            {
                                test();
                                test();
@@ -454,10 +503,16 @@ void TNSAnalysisStereo_fx(
                            move16();
                        }
                    }
                    Word16 flag = BASOP_Util_Cmp_Mant32Exp( TNS_GAIN_THRESHOLD_FOR_WHITE_FX_IN_Q23, PRED_GAIN_E, maxPredGain_fx, maxPredGain_e );
                    if ( flag < 0 )
                    {
                        flag = 0;
                        move16();
                    }
                    test();
                    test();
                    test();
                    IF( !bWhitenedDomain && individual_decision[k] == 0 && LT_32( maxPredGain_fx, TNS_GAIN_THRESHOLD_FOR_WHITE_FX_IN_Q23 ) && NE_16( sts[0]->hTcxEnc->transform_type[k], TCX_5 ) )
                    IF( !bWhitenedDomain && individual_decision[k] == 0 && flag && NE_16( sts[0]->hTcxEnc->transform_type[k], TCX_5 ) )
                    {
                        sts[0]->hTcxEnc->bTnsOnWhithenedSpectra[k] = 1;
                        move16();
@@ -477,7 +532,15 @@ void TNSAnalysisStereo_fx(
                            ClearTnsFilterCoefficients( sts[1]->hTcxEnc->tnsData[k].filter + iFilter );
                        }
                    }
                    maxPredictionGain_fx = L_max( maxPredictionGain_fx, maxPredGain_fx );
                    //   maxPredictionGain_fx = L_max( maxPredictionGain_fx, maxPredGain_fx );
                    flag = BASOP_Util_Cmp_Mant32Exp( maxPredictionGain_fx, maxPredictionGain_e, maxPredGain_fx, maxPredGain_e );
                    IF( flag < 0 )
                    {
                        maxPredictionGain_fx = maxPredGain_fx;
                        maxPredictionGain_e = maxPredGain_e;
                        move32();
                        move16();
                    }
                }
            }
        }
@@ -515,7 +578,9 @@ void TNSAnalysisStereo_fx(
            IF( sts[ch]->hTcxCfg->fIsTNSAllowed && ( individual_decision[k] || mct_on ) &&
                ( !bWhitenedDomain || sts[ch]->hTcxEnc->bTnsOnWhithenedSpectra[k] ) )
            {
                Word32 maxPredGain_fx = -ONE_IN_Q23; // Q23
                Word32 maxPredGain_fx = -ONE_IN_Q31; // Q31
                move32();
                Word16 maxPredGain_e = 0;
                move16();
                sts[ch]->hTcxCfg->pCurrentTnsConfig = &sts[ch]->hTcxCfg->tnsConfig[sts[ch]->hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( sts[ch]->last_core == ACELP_CORE )];

@@ -526,9 +591,23 @@ void TNSAnalysisStereo_fx(
                    pFilter = sts[ch]->hTcxEnc->tnsData[k].filter + iFilter;
                    pTnsParameters = sts[ch]->hTcxCfg->pCurrentTnsConfig->pTnsParameters + iFilter;

                    maxPredGain_fx = L_max( maxPredGain_fx, pFilter->predictionGain32 );
                    // maxPredGain_fx = L_max( maxPredGain_fx, pFilter->predictionGain32 );
                    Word16 flag = BASOP_Util_Cmp_Mant32Exp( maxPredGain_fx, maxPredGain_e, pFilter->predictionGain32, pFilter->predictionGain_e );
                    IF( flag < 0 )
                    {
                        maxPredGain_fx = pFilter->predictionGain32;
                        move32();
                        maxPredGain_e = pFilter->predictionGain_e;
                        move16();
                    }
                    flag = BASOP_Util_Cmp_Mant32Exp( pFilter->predictionGain32, pFilter->predictionGain_e, L_deposit_h( pTnsParameters->minPredictionGain ), PRED_GAIN_E );
                    if ( flag < 0 )
                    {
                        flag = 0;
                        move16();
                    }
                    test();
                    IF( GT_32( pFilter->predictionGain32, L_shl( pTnsParameters->minPredictionGain, 16 ) ) || GT_16( pFilter->avgSqrCoef, pTnsParameters->minAvgSqrCoef ) )
                    IF( flag || GT_16( pFilter->avgSqrCoef, pTnsParameters->minAvgSqrCoef ) )
                    {
                        test();
                        test();
@@ -600,9 +679,15 @@ void TNSAnalysisStereo_fx(
                    sts[ch]->hTcxEnc->fUseTns[k] = 0;
                }
                move16();
                Word16 flag = BASOP_Util_Cmp_Mant32Exp( TNS_GAIN_THRESHOLD_FOR_WHITE_FX_IN_Q23, PRED_GAIN_E, maxPredGain_fx, maxPredGain_e );
                if ( flag < 0 )
                {
                    flag = 0;
                    move16();
                }
                test();
                test();
                IF( !bWhitenedDomain && LT_32( maxPredGain_fx, TNS_GAIN_THRESHOLD_FOR_WHITE_FX_IN_Q23 ) && NE_16( sts[ch]->hTcxEnc->transform_type[k], TCX_5 ) )
                IF( !bWhitenedDomain && flag && NE_16( sts[ch]->hTcxEnc->transform_type[k], TCX_5 ) )
                {
                    sts[ch]->hTcxEnc->fUseTns[k] = 0;
                    move16();
@@ -617,7 +702,15 @@ void TNSAnalysisStereo_fx(
                        move16();
                    }
                }
                maxPredictionGain_fx = L_max( maxPredictionGain_fx, maxPredGain_fx );
                // maxPredictionGain_fx = L_max( maxPredictionGain_fx, maxPredGain_fx );
                flag = BASOP_Util_Cmp_Mant32Exp( maxPredictionGain_fx, maxPredictionGain_e, maxPredGain_fx, maxPredGain_e );
                IF( flag < 0 )
                {
                    maxPredictionGain_fx = maxPredGain_fx;
                    maxPredictionGain_e = maxPredGain_e;
                    move32();
                    move16();
                }
            }
        }
    }
+4 −0
Original line number Diff line number Diff line
@@ -1372,7 +1372,11 @@ void core_signal_analysis_high_bitrate_ivas_fx(
            IF( st->igf )
            {
                Word16 q_spectrum = sub( Q31, hTcxEnc->spectrum_e[frameno] );
#ifndef MSAN_FIX
                ProcessIGF_ivas_fx( st, hTcxEnc->spectrum_fx[frameno], hTcxEnc->spectrum_fx[frameno], &q_spectrum, powerSpec, powerSpec_e, transform_type[frameno] == TCX_20, frameno, 0, vad_hover_flag );
#else
                ProcessIGF_ivas_fx( st, N_MAX + L_MDCT_OVLP_MAX, hTcxEnc->spectrum_fx[frameno], hTcxEnc->spectrum_fx[frameno], &q_spectrum, powerSpec, powerSpec_e, transform_type[frameno] == TCX_20, frameno, 0, vad_hover_flag );
#endif
            }
        }
    }
+12 −1
Original line number Diff line number Diff line
@@ -2578,6 +2578,9 @@ Word16 IGFEncWriteConcatenatedBitstream(

void IGFEncApplyMono_ivas_fx(
    Encoder_State *st, /* i  : Encoder state                                          */
#ifdef MSAN_FIX
    Word16 powerSpectrum_len, /* i: length of pPowerSpectrum_fx buffer */
#endif
    const Word16 igfGridIdx,       /* i  : IGF grid index                                         */
    Word32 *pMDCTSpectrum_fx,      /* i/o: MDCT spectrum                                          */
    Word16 e_mdct,                 /* i : exponent of pMDCTspectrum							   */
@@ -2658,12 +2661,20 @@ void IGFEncApplyMono_ivas_fx(

    IF( pPowerSpectrumParameter_fx )
    {
#ifndef MSAN_FIX
        FOR( Word16 i = 0; i < N_MAX + L_MDCT_OVLP_MAX; i++ )
#else
        FOR( Word16 i = 0; i < powerSpectrum_len; i++ )
#endif
        {
            common_pPowerSpectrum_exp = s_max( common_pPowerSpectrum_exp, pPowerSpectrumParameter_exp[i] );
        }

#ifndef MSAN_FIX
        FOR( Word16 i = 0; i < N_MAX + L_MDCT_OVLP_MAX; i++ )
#else
        FOR( Word16 i = 0; i < powerSpectrum_len; i++ )
#endif
        {
            common_pPowerSpectrum_fx[i] = L_shl( pPowerSpectrumParameter_fx[i], sub( pPowerSpectrumParameter_exp[i], common_pPowerSpectrum_exp ) );
            move16();
Loading