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

Restore cod_tcx_fx.c fix and LTV crash fix for +10dB files

parent f8098d80
Loading
Loading
Loading
Loading
Loading
+110 −17
Original line number Diff line number Diff line
@@ -5384,8 +5384,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;
@@ -5520,7 +5523,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 )];
@@ -5538,30 +5543,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();
@@ -5764,10 +5813,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();
@@ -5787,7 +5842,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();
                    }
                }
            }
        }
@@ -5825,7 +5888,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 )];

@@ -5836,9 +5901,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();
@@ -5910,9 +5989,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();
@@ -5927,7 +6012,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();
                }
            }
        }
    }
+2 −2
Original line number Diff line number Diff line
@@ -679,9 +679,9 @@ void encod_audio_ivas_fx(
     *--------------------------------------------------------------------------------------*/

    edct_16fx( dct_epit, exc, st_fx->L_frame, 7, st_fx->element_mode );
    scale_sig( exc, st_fx->L_frame, sub( Q_new, Q_exc ) );
    Scale_sig( exc, st_fx->L_frame, sub( Q_new, Q_exc ) );
    edct_16fx( exc_wo_nf, exc_wo_nf, st_fx->L_frame, 7, st_fx->element_mode );
    scale_sig( exc_wo_nf, st_fx->L_frame, sub( Q_new, Q_exc ) );
    Scale_sig( exc_wo_nf, st_fx->L_frame, sub( Q_new, Q_exc ) );
    Q_exc = Q_new;
    move16();
    /*--------------------------------------------------------------------------------------*