Commit c2c31ce3 authored by emerit's avatar emerit
Browse files

Merge branch 'main' into update_crend_v2

parents e35ee730 be68a0d9
Loading
Loading
Loading
Loading
+48 −33
Original line number Diff line number Diff line
@@ -42,6 +42,8 @@
 *-----------------------------------------------------------------------------------------*/

#define BAND_SMOOTH_REST_START_IDX ( 2 )
#define ONEeN20_Q97                0x5E728433 // 1e-20 in Q97  1.584.563.251


/*-----------------------------------------------------------------------------------------*
 * Function ivas_calculate_update_factor_fx()
@@ -87,9 +89,10 @@ static void ivas_calculate_smoothning_factor_fx(
    move16();

    tmp = BASOP_Util_Divide3232_Scale( update_factor, L_shl( L_deposit_l( min_pool_size ), Q22 ), &exp_diff ); // Q(31 - exp_diff)
    *Smoothing_factor = L_shl_sat( L_deposit_l( tmp ), add( Q16, exp_diff ) );                                 // Q31
    *Smoothing_factor = L_shl_sat( L_deposit_h( tmp ), exp_diff );                                             // Q31
    move32();


    IF( NE_32( smooth_mode, COV_SMOOTH_MC ) )
    {
        IF( LT_32( ivas_total_brate, IVAS_24k4 ) )
@@ -264,19 +267,17 @@ void ivas_spar_covar_smooth_enc_close_fx(
    return;
}


/*-----------------------------------------------------------------------------------------*
 * Function ivas_compute_smooth_cov_fx()
 *
 * Compute smooth covariance real/imag.
 *-----------------------------------------------------------------------------------------*/

static void ivas_compute_smooth_cov_fx(
    ivas_cov_smooth_state_t *hCovState,
    ivas_filterbank_t *pFb,
    Word32 *pCov_buf[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],       // i/o: Q(q_cov[i][j])
    Word32 *pPrior_cov_buf[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], // i: hCovState->q_cov_real_per_band[i][j][k]
    const Word32 fac,
    const Word32 fac,                                           // i: ONEeN20_Q97 (1e-20 in Q97)
    const Word16 start_band,
    const Word16 end_band,
    const Word16 num_ch,
@@ -285,10 +286,15 @@ static void ivas_compute_smooth_cov_fx(
{
    Word16 i, j, k;
    Word16 prev_idx = hCovState->prior_bank_idx;
    Word32 factor = 0, L_tmp, L_tmp1;
    Word32 factor = 0, L_tmp0, L_tmp1;

    const Word16 q_fac = 97;
    const Word16 fac_e = sub( Q31, q_fac );

    Word16 cov_buf_e;

    Word16 sm_b;
    Word16 non_sm_b_idx;
    Word16 q_tmp[IVAS_MAX_NUM_BANDS];

    sm_b = BAND_SMOOTH_REST_START_IDX;
    move16();
@@ -296,7 +302,6 @@ static void ivas_compute_smooth_cov_fx(
    move32();

    assert( end_band <= pFb->filterbank_num_bands );

    test();
    IF( EQ_16( prev_idx, -1 ) || EQ_16( transient_det[1], 1 ) )
    {
@@ -311,9 +316,11 @@ static void ivas_compute_smooth_cov_fx(
        {
            FOR( k = start_band; k < end_band; k++ )
            {
                L_tmp = Mpy_32_32( hCovState->pSmoothing_factor_fx[k], fac );                                                        // (Q31, Q31) -> Q31
                pCov_buf[i][i][k] = L_add( pCov_buf[i][i][k], L_shl( L_tmp, sub( hCovState->q_cov_real_per_band[i][i][k], Q31 ) ) ); // hCovState->q_cov_real_per_band[i][j][k]
                /* ref: pCov_buf[i][i][k] += ( hCovState->pSmoothing_factor[k] * fac ); */
                pCov_buf[i][i][k] = BASOP_Util_Add_Mant32Exp( pCov_buf[i][i][k], sub( Q31, q_cov[i][i] ), Mpy_32_32( hCovState->pSmoothing_factor_fx[k], fac ), fac_e, &cov_buf_e );
                move32();
                hCovState->q_cov_real_per_band[i][i][k] = sub( Q31, cov_buf_e );
                move16();
            }
        }
    }
@@ -326,38 +333,45 @@ static void ivas_compute_smooth_cov_fx(
            {
                IF( EQ_16( i, j ) )
                {
                    factor = fac; // Q31
                    factor = fac; // Q97
                    move32();
                }
                ELSE
                {
                    factor = 0;
                    factor = 0; // Q97
                    move32();
                }

                set16_fx( q_tmp, q_cov[i][j], sub( end_band, start_band ) );
                FOR( k = start_band; k < non_sm_b_idx; k++ )
                {
                    L_tmp = Mpy_32_32( hCovState->pSmoothing_factor_fx[k], pCov_buf[i][j][k] );                                                                                   // (Q31, q_cov[i][j]) -> q_cov[i][j]
                    L_tmp1 = Mpy_32_32( L_sub( ONE_IN_Q31, hCovState->pSmoothing_factor_fx[k] ), pPrior_cov_buf[i][j][k] );                                                       // (Q31, hCovState->q_cov_real_per_band[i][j][k]) -> hCovState->q_cov_real_per_band[i][j][k]
                    pCov_buf[i][j][k] = BASOP_Util_Add_Mant32Exp( L_tmp, sub( Q31, q_cov[i][j] ), L_tmp1, sub( Q31, hCovState->q_prior_cov_real_per_band[i][j][k] ), &q_tmp[k] ); // Q(31 - q_tmp[k])
                    /* ref: pCov_buf[i][j][k] = pPrior_cov_buf[i][j][k] + ( hCovState->pSmoothing_factor[k] * ( pCov_buf[i][j][k] - pPrior_cov_buf[i][j][k] + factor ) ); */
                    /* mod: pCov_buf[i][j][k] = pCov_buf[i][j][k] * hCovState->pSmoothing_factor[k] +
                                                    pPrior_cov_buf[i][j][k] * (1.0 - hCovState->pSmoothing_factor[k]) +
                                                        factor * hCovState->pSmoothing_factor[k] ); */
                    L_tmp0 = Mpy_32_32( hCovState->pSmoothing_factor_fx[k], pCov_buf[i][j][k] );                            // q_tmp0: q_cov[i][j]                                                                                  // (Q31, q_cov[i][j]) -> q_cov[i][j]
                    L_tmp1 = Mpy_32_32( L_sub( ONE_IN_Q31, hCovState->pSmoothing_factor_fx[k] ), pPrior_cov_buf[i][j][k] ); // q_tmp1: hCovState->q_prior_cov_real_per_band[i][j][k]
                    L_tmp0 = BASOP_Util_Add_Mant32Exp( L_tmp0, sub( Q31, q_cov[i][j] ), L_tmp1, sub( Q31, hCovState->q_prior_cov_real_per_band[i][j][k] ), &cov_buf_e );
                    pCov_buf[i][j][k] = BASOP_Util_Add_Mant32Exp( L_tmp0, cov_buf_e, Mpy_32_32( hCovState->pSmoothing_factor_fx[k], factor ), fac_e, &cov_buf_e );
                    move32();
                    q_tmp[k] = sub( Q31, q_tmp[k] ); // Q of pConv_buf[i][j][k] is now q_tmp[k]
                    hCovState->q_cov_real_per_band[i][j][k] = sub( Q31, cov_buf_e ); // Q of pCov_buf[i][j][k]
                    move16();
                }
                FOR( ; k < end_band; k++ )
                {
                    hCovState->q_cov_real_per_band[i][j][k] = q_cov[i][j];
                    move16();
                    L_tmp = L_shl( Mpy_32_32( hCovState->pSmoothing_factor_fx[k], factor ), sub( q_tmp[k], Q31 ) ); // ((Q31, Q31) -> Q31) -> q_tmp[k]
                    pCov_buf[i][j][k] = L_add( pCov_buf[i][j][k], L_tmp );                                          // q_tmp[k]
                    move32();
                }
                Copy( q_tmp, hCovState->q_cov_real_per_band[i][j], sub( end_band, start_band ) ); // Q of pCov_buf[i][j][k] is hCovState->q_cov_real_per_band[i][j][j]
            }
        }
        FOR( i = 0; i < num_ch; i++ )
        {
            FOR( k = non_sm_b_idx; k < end_band; k++ )
            {
                L_tmp = Mpy_32_32( hCovState->pSmoothing_factor_fx[k], fac );                                                        // (Q31, Q31) -> Q31
                pCov_buf[i][i][k] = L_add( pCov_buf[i][i][k], L_shl( L_tmp, sub( hCovState->q_cov_real_per_band[i][i][k], Q31 ) ) ); // hCovState->q_cov_real_per_band[i][j][j]
                /* ref: pCov_buf[i][i][k] += ( hCovState->pSmoothing_factor[k] * fac ); */
                pCov_buf[i][i][k] = BASOP_Util_Add_Mant32Exp( pCov_buf[i][i][k], sub( Q31, q_cov[i][i] ), Mpy_32_32( hCovState->pSmoothing_factor_fx[k], fac ), fac_e, &cov_buf_e );
                move32();
                hCovState->q_cov_real_per_band[i][i][k] = sub( Q31, cov_buf_e ); // Q of pCov_buf[i][i][k]
                move16();
            }
        }
    }
@@ -369,28 +383,29 @@ static void ivas_compute_smooth_cov_fx(
            {
                IF( EQ_16( i, j ) )
                {
                    factor = fac; // Q31
                    factor = fac; // Q97
                    move32();
                }
                ELSE
                {
                    factor = 0;
                    factor = 0; // Q97
                    move32();
                }

                FOR( k = start_band; k < end_band; k++ )
                {
                    L_tmp = Mpy_32_32( hCovState->pSmoothing_factor_fx[k], pCov_buf[i][j][k] );                                                                                   // (Q31, q_cov[i][j]) -> q_cov[i][j]
                    L_tmp1 = Mpy_32_32( L_sub( ONE_IN_Q31, hCovState->pSmoothing_factor_fx[k] ), pPrior_cov_buf[i][j][k] );                                                       // (Q31, hCovState->q_cov_real_per_band[i][j][k]) -> hCovState->q_cov_real_per_band[i][j][k]
                    pCov_buf[i][j][k] = BASOP_Util_Add_Mant32Exp( L_tmp, sub( Q31, q_cov[i][j] ), L_tmp1, sub( Q31, hCovState->q_prior_cov_real_per_band[i][j][k] ), &q_tmp[k] ); // Q(31 - q_tmp[k])
                    /* ref: pCov_buf[i][j][k] = pPrior_cov_buf[i][j][k] + ( hCovState->pSmoothing_factor[k] * ( pCov_buf[i][j][k] - pPrior_cov_buf[i][j][k] + factor ) ); */
                    /* mod: pCov_buf[i][j][k] = pCov_buf[i][j][k] * hCovState->pSmoothing_factor[k] +
                                                pPrior_cov_buf[i][j][k] * (1.0 - hCovState->pSmoothing_factor[k]) +
                                                factor * hCovState->pSmoothing_factor[k] ); */
                    L_tmp0 = Mpy_32_32( hCovState->pSmoothing_factor_fx[k], pCov_buf[i][j][k] );                            // q_tmp0: q_cov[i][j]                                                                                  // (Q31, q_cov[i][j]) -> q_cov[i][j]
                    L_tmp1 = Mpy_32_32( L_sub( ONE_IN_Q31, hCovState->pSmoothing_factor_fx[k] ), pPrior_cov_buf[i][j][k] ); // q_tmp1: hCovState->q_prior_cov_real_per_band[i][j][k]
                    L_tmp0 = BASOP_Util_Add_Mant32Exp( L_tmp0, sub( Q31, q_cov[i][j] ), L_tmp1, sub( Q31, hCovState->q_prior_cov_real_per_band[i][j][k] ), &cov_buf_e );
                    pCov_buf[i][j][k] = BASOP_Util_Add_Mant32Exp( L_tmp0, cov_buf_e, Mpy_32_32( hCovState->pSmoothing_factor_fx[k], factor ), fac_e, &cov_buf_e );
                    move32();
                    q_tmp[k] = sub( Q31, q_tmp[k] ); // Q of pConv_buf[i][j][k] is now q_tmp[k]
                    hCovState->q_cov_real_per_band[i][j][k] = sub( Q31, cov_buf_e ); // Q of pCov_buf[i][j][k]
                    move16();
                    L_tmp = L_shl( Mpy_32_32( hCovState->pSmoothing_factor_fx[k], factor ), sub( q_tmp[k], Q31 ) ); // ((Q31, Q31) -> Q31) -> q_tmp[k]
                    pCov_buf[i][j][k] = L_add( pCov_buf[i][j][k], L_tmp );                                          // q_tmp[k]
                    move32();
                }
                Copy( q_tmp, hCovState->q_cov_real_per_band[i][j], sub( end_band, start_band ) ); // Q of pCov_buf[i][j][k] is hCovState->q_cov_real_per_band[i][j][j]
            }
        }
    }
@@ -418,7 +433,7 @@ void ivas_cov_smooth_process_fx(
    Word16 i, j, k;
    Word16 num_bands = sub( end_band, start_band );

    ivas_compute_smooth_cov_fx( hCovState, pFb, cov_real, hCovState->pPrior_cov_real_fx, 0, start_band, end_band, num_ch, transient_det, q_cov );
    ivas_compute_smooth_cov_fx( hCovState, pFb, cov_real, hCovState->pPrior_cov_real_fx, ONEeN20_Q97, start_band, end_band, num_ch, transient_det, q_cov );

    FOR( i = 0; i < num_ch; i++ )
    {
+72 −109
Original line number Diff line number Diff line
@@ -51,24 +51,16 @@
 * Local constants
 *------------------------------------------------------------------------------------------*/

#define IVAS_FLT_EPS ( 1e-10F )
#define IVAS_FIX_EPS     ( 1 )
#define IVAS_DBL_EPS ( (double) 1e-20 )
#define IVAS_FIX_EPS_Q40 ( 110 )

#define IVAS_REMIX_MULT_FAC ( 0.5f )

#define IVAS_ACTIVEW_DM_F                        ( 1.0f )
#define IVAS_ACTIVEW_DM_F_Q30                    ( ONE_IN_Q30 ) /*1 Q30*/
#define IVAS_ACTIVEW_DM_F_DTX                    ( 0.25f )
#define IVAS_ACTIVEW_DM_F_DTX_Q30                ( 268435456 )  /*0.25 Q30*/
#define IVAS_ACTIVEW_DM_F_VLBR                   ( 0.25f )
#define IVAS_ACTIVEW_DM_F_VLBR_Q30               ( 268435456 )  /*0.25 Q30*/
#define IVAS_LIN_ACTIVEW_QUAD_ACTIVEW_THRESH     ( 3.0f )
#define IVAS_LIN_ACTIVEW_QUAD_ACTIVEW_THRESH_Q29 ( 1610612736 ) /*3 Q29*/

#define IVAS_P_NORM_SCALING        ( 1.0f )
#define IVAS_P_NORM_SCALING_FX     ( ONE_IN_Q31 ) // 1 Q31
#define IVAS_P_NORM_SCALING_DTX    ( 0.75f )
#define IVAS_P_NORM_SCALING_DTX_FX ( 1610612736 ) // 0.75 Q31

#define IVAS_MAT_DIM_3 ( 3 )
@@ -1626,8 +1618,18 @@ static void ivas_get_Wscaling_factor_enc_fx(
                ivas_calc_post_pred_per_band_enc_fx( cov_real, q_cov_real, mixer_mat, q_mixer_mat, num_ch, b, postpred_cov_re, &q_postpred_cov_re );
            }

            Gw_sq = BASOP_Util_Divide3232_Scale( cov_real[0][0][b], L_max( postpred_cov_re[0][0], IVAS_FIX_EPS ), &tmp_exp ); // 15-(tmp_exp-(q_cov_real[0][0][b]- q_postpred_cov_re))
            tmp = L_shl_sat( IVAS_FIX_EPS_Q40, sub( q_postpred_cov_re, 40 ) );

            IF( LE_32( postpred_cov_re[0][0], tmp ) )
            {
                Gw_sq = Mpy_32_32( cov_real[0][0][b], 1250000000 ); /*1/1e-10 = 1250000000 Q(-4)*/
                q_Gw_sq = add( q_cov_real[0][0][b], -4 - 31 );
            }
            ELSE
            {
                Gw_sq = BASOP_Util_Divide3232_Scale( cov_real[0][0][b], postpred_cov_re[0][0], &tmp_exp ); // 15-(tmp_exp-(q_cov_real[0][0][b]- q_postpred_cov_re))
                q_Gw_sq = add( sub( 15, tmp_exp ), sub( q_cov_real[0][0][b], q_postpred_cov_re ) );
            }

            shift = MAX16B;
            move16();
@@ -1992,12 +1994,15 @@ static void ivas_calc_post_pred_per_band_enc_fx(
    Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_postpred_cov_re*/
    Word16 *q_postpred_cov_re )
{
    Word16 i, j, k, guard_bits, tmp, q_temp_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], q_tmp_re, q_W_tmp;
    Word16 i, j, k;
    Word32 dmx_mat_conj[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
    Word32 temp_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
    Word32 max_val;
    Word64 tmp_re, W_tmp;
    Word16 q_postpred_cov_re_per_value[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
    Word16 temp_mat_e[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
    Word16 q_postpred_cov_re_buf[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
    Word16 min_val;
    Word32 tmp_re;
    Word16 tmp_q;
    Word16 tmp_e;

    FOR( i = 0; i < num_ch; i++ )
    {
@@ -2014,135 +2019,71 @@ static void ivas_calc_post_pred_per_band_enc_fx(
        set32_fx( postpred_cov_re[i], 0, num_ch );
    }

    max_val = 1;
    move32();
    min_val = MAX16B;
    move16();
    /* num_ch x num_ch mult */
    FOR( i = 0; i < num_ch; i++ )
    {
        FOR( j = 0; j < num_ch; j++ )
        {
            tmp_re = 0;
            move64();
            q_tmp_re = 31;
            temp_mat[i][j] = 0;
            move32();
            temp_mat_e[i][j] = 0;
            move16();
            FOR( k = 0; k < num_ch; k++ )
            {
                W_tmp = W_shr( W_mult0_32_32( cov_real[i][k][band_idx], dmx_mat_conj[k][j] ), q_mixer_mat ); /*q_cov_real[i][k][band_idx]*/
                IF( LT_16( q_cov_real[i][k][band_idx], q_tmp_re ) )
                {
                    tmp_re = W_add( W_shr( tmp_re, sub( q_tmp_re, q_cov_real[i][k][band_idx] ) ), W_tmp ); /*q_cov_real[i][k][band_idx]*/
                    q_tmp_re = q_cov_real[i][k][band_idx];
                    move16();
                }
                ELSE
                {
                    tmp_re = W_add( tmp_re, W_shr( W_tmp, sub( q_cov_real[i][k][band_idx], q_tmp_re ) ) ); /*q_tmp_re*/
                }
            }
            IF( tmp_re == 0 )
            {
                q_temp_mat[i][j] = 31;
                move16();
                temp_mat[i][j] = 0;
                move32();
            }
            ELSE
                tmp_re = Mpy_32_32( cov_real[i][k][band_idx], dmx_mat_conj[k][j] );
                tmp_e = sub( 62, add( q_cov_real[i][k][band_idx], q_mixer_mat ) );
                IF( tmp_re )
                {
                q_temp_mat[i][j] = q_tmp_re;
                move16();
                q_tmp_re = W_norm( tmp_re );
                temp_mat[i][j] = W_extract_h( W_shl( tmp_re, q_tmp_re ) ); /*q_temp_mat[i][j]+ q_tmp_re -32*/
                    temp_mat[i][j] = BASOP_Util_Add_Mant32Exp( temp_mat[i][j], temp_mat_e[i][j], tmp_re, tmp_e, &temp_mat_e[i][j] );
                    move32();
                q_temp_mat[i][j] = sub( add( q_temp_mat[i][j], q_tmp_re ), 32 );
                move16();
                }
            max_val = L_max( max_val, L_abs( temp_mat[i][j] ) );
            }
        }

    guard_bits = find_guarded_bits_fx( num_ch );

    tmp = norm_l( max_val );
    IF( LT_16( tmp, guard_bits ) )
    {
        guard_bits = sub( guard_bits, tmp );
    }
    ELSE
    {
        guard_bits = 0;
        move16();
    }

    *q_postpred_cov_re = 31;
    move16();
    /* num_ch x num_ch mult */
    FOR( i = 0; i < num_ch; i++ )
    {
        FOR( j = i; j < num_ch; j++ )
        {
            tmp_re = 0;
            move64();
            q_tmp_re = 31;
            q_postpred_cov_re_buf[i][j] = *q_postpred_cov_re;
            move16();
            FOR( k = 0; k < num_ch; k++ )
            {
                W_tmp = W_shr( W_mult0_32_32( mixer_mat[i][k][band_idx], temp_mat[k][j] ), guard_bits ); // q_temp_mat[k][j]+ q_mixer_mat-guard_bits
                q_W_tmp = sub( add( q_temp_mat[k][j], q_mixer_mat ), guard_bits );
                IF( LT_16( q_W_tmp, q_tmp_re ) )
                tmp_re = Mpy_32_32( mixer_mat[i][k][band_idx], temp_mat[k][j] );
                tmp_q = sub( q_mixer_mat, temp_mat_e[k][j] );
                IF( tmp_re )
                {
                    tmp_re = W_add( W_shr( tmp_re, sub( q_tmp_re, q_W_tmp ) ), W_tmp ); // q_W_tmp
                    q_tmp_re = q_W_tmp;
                    tmp_e = sub( 31, q_postpred_cov_re_buf[i][j] );
                    postpred_cov_re[i][j] = BASOP_Util_Add_Mant32Exp( postpred_cov_re[i][j], tmp_e, tmp_re, sub( Q31, tmp_q ), &tmp_e );
                    move32();
                    q_postpred_cov_re_buf[i][j] = sub( 31, tmp_e );
                    move16();
                }
                ELSE
                {
                    tmp_re = W_add( tmp_re, W_shr( W_tmp, sub( q_W_tmp, q_tmp_re ) ) ); // q_tmp_re
            }
            }

            if ( LT_64( W_abs( tmp_re ), L_shl( IVAS_FIX_EPS, guard_bits ) ) )
            IF( postpred_cov_re[i][j] )
            {
                tmp_re = 0;
                move64();
            }

            q_postpred_cov_re_per_value[i][j] = q_tmp_re;
            move16();
            IF( tmp_re == 0 )
            {
                postpred_cov_re[i][j] = W_extract_l( tmp_re ); /* q_tmp_re*/
                move32();
            }
            ELSE
            {
                q_tmp_re = W_norm( tmp_re );
                postpred_cov_re[i][j] = W_extract_h( W_shl( tmp_re, q_tmp_re ) ); /* q_tmp_re+ q_postpred_cov_re_per_value[i][j] -32*/
                move32();
                q_postpred_cov_re_per_value[i][j] = sub( add( q_tmp_re, q_postpred_cov_re_per_value[i][j] ), 32 );
                move16();
                min_val = s_min( min_val, q_postpred_cov_re_buf[i][j] );
            }
            *q_postpred_cov_re = s_min( *q_postpred_cov_re, q_postpred_cov_re_per_value[i][j] );
            move16();
        }
    }

    /*Changing Q of postpred_cov_re to min_val*/
    FOR( i = 0; i < num_ch; i++ )
    {
        FOR( j = i; j < num_ch; j++ )
        {
            IF( postpred_cov_re[i][j] >= 0 )
            {
                postpred_cov_re[i][j] = L_shr( postpred_cov_re[i][j], sub( q_postpred_cov_re_per_value[i][j], *q_postpred_cov_re ) ); //*q_postpred_cov_re
                move32();
            }
            ELSE
            IF( postpred_cov_re[i][j] )
            {
                postpred_cov_re[i][j] = L_negate( L_shr( L_negate( postpred_cov_re[i][j] ), sub( q_postpred_cov_re_per_value[i][j], *q_postpred_cov_re ) ) ); //*q_postpred_cov_re
                postpred_cov_re[i][j] = L_shl( postpred_cov_re[i][j], sub( min_val, q_postpred_cov_re_buf[i][j] ) );
                move32();
            }
        }
    }


    FOR( i = 0; i < num_ch; i++ )
    {
        FOR( j = 0; j < i; j++ )
@@ -2152,6 +2093,14 @@ static void ivas_calc_post_pred_per_band_enc_fx(
        }
    }

    if ( EQ_16( min_val, MAX16B ) )
    {
        min_val = Q31;
        move16();
    }
    *q_postpred_cov_re = min_val;
    move16();

    return;
}

@@ -2687,7 +2636,8 @@ static void ivas_calc_p_coeffs_per_band_enc_fx(
            trace = W_add( trace, W_deposit32_l( L_abs( cov_uu_re[i - num_dmx][i - num_dmx] ) ) ); // q_cov_uu_re
        }

        factor = L_max( IVAS_FIX_EPS, postpred_cov_re[0][0] ); // q_postpred_cov_re
        factor = postpred_cov_re[0][0]; // q_postpred_cov_re
        move32();
        q_factor = q_postpred_cov_re;
        move16();
        IF( trace != 0 )
@@ -2708,10 +2658,20 @@ static void ivas_calc_p_coeffs_per_band_enc_fx(
            factor = L_max( factor, tmp ); // q_factor
        }

        tmp = L_shl_sat( IVAS_FIX_EPS_Q40, sub( q_factor, 40 ) );

        Word16 factor_exp = 0;
        move16();
        IF( LE_32( factor, tmp ) )
        {
            factor = 1250000000;
            factor_exp = Q31 - ( -4 );
        }
        ELSE
        {
            factor = BASOP_Util_Divide3232_Scale( 1, factor, &factor_exp ); // q=15-(factor_exp+31-(31-q_factor))
            factor_exp = add( factor_exp, q_factor );
        }

        /* normalise Hermitian (except for rounding) cov_uu */
        FOR( i = num_dmx; i < num_ch; i++ )
@@ -3311,6 +3271,9 @@ void ivas_calc_c_p_coeffs_enc_fx(
    Word16 i, j, q_postpred_cov_re;
    Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];

    q_postpred_cov_re = 0;
    move16();

    FOR( i = 0; i < IVAS_SPAR_MAX_CH; i++ )
    {
        set_zero_fx( postpred_cov_re[i], IVAS_SPAR_MAX_CH );
+2 −0
Original line number Diff line number Diff line
@@ -83,6 +83,8 @@
#define BASOP_NOGLOB_DECLARE_LOCAL
#endif

#define FIX_1378_ACELP_OUT_OF_BOUNDS

/* Note: each compile switch (FIX_1101_...) is independent from the other ones */
//#define OPT_STEREO_32KBPS_V1                    /* Optimization made in stereo decoding path for 32kbps decoding */
#define OPT_AVOID_STATE_BUF_RESCALE             /* Optimization made to avoid rescale of synth state buffer */
+12 −0
Original line number Diff line number Diff line
@@ -169,6 +169,7 @@ void D_ACELP_indexing_fx(
        pulses = pulsestrack[0];
        move16();

#ifndef FIX_1378_ACELP_OUT_OF_BOUNDS
        /* safety check in case of bit errors */
        IF( GE_64( s, pulsestostates[16][pulses - 1] ) )
        {
@@ -177,9 +178,20 @@ void D_ACELP_indexing_fx(
            move16();
            return;
        }
#endif

        IF( pulses )
        {
#ifdef FIX_1378_ACELP_OUT_OF_BOUNDS
            /* safety check in case of bit errors */
            IF( GE_64( s, pulsestostates[16][pulses - 1] ) )
            {
                set16_fx( code, 0, L_SUBFR );
                *BER_detect = 1;
                move16();
                return;
            }
#endif
            D_ACELP_decode_arithtrack_fx( code, s, pulses, num_tracks, 16 );
        }
        ELSE
+75 −79

File changed.

Preview size limit exceeded, changes collapsed.

Loading