Commit 9951e418 authored by JÜRGEN Gerstacker's avatar JÜRGEN Gerstacker
Browse files

issue _1965_ fix

parent 00bdb3d9
Loading
Loading
Loading
Loading
Loading
+21 −22
Original line number Diff line number Diff line
@@ -1482,11 +1482,15 @@ static void IGF_appl( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in
    Word16 dS[IGF_MAX_SFB];
    Word16 dS_e[IGF_MAX_SFB];
    Word32 energyTmp[24];
#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW
    Word32 L_c;
#endif
    Word16 Hr;
#ifdef BASOP_NOGLOB_DECLARE_LOCAL
    Flag Overflow = 0;
#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW
    Flag Carry = 0;
#endif
    move16();
    move16();
#endif
@@ -1565,6 +1569,7 @@ static void IGF_appl( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in
                                  &dE_e,
                                  negate( tmp ) );

#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW
    L_c = 0;
    move32();
    FOR( tb = 0; tb < 24; tb++ )
@@ -1577,6 +1582,20 @@ static void IGF_appl( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in
        L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow );
    }
    L_tmp = norm_llQ31( L_c, L_tmp, &shift ); // Q31
#else
    {
#if 0
        Word16 shift2=shift;
        
        Word32 L_tmp2 = sum_array_norm(energyTmp, 24, &shift2);
        if (L_tmp != L_tmp2 || shift != shift2) {
            fprintf(stderr, "%s:%d: 0x%08X, %d, 0x%08X, %d\n", __FILE__,__LINE__, L_tmp,shift, L_tmp2,shift2);
        }
#else
        L_tmp = sum_array_norm(energyTmp, 24, &shift);
#endif
    }
#endif
    /* float: dE = (float)sqrt(dE / 24.f); basop: */
    shift = add( sub( shift, 4 ), dE_e ); /* x/24 = (x >> 4) * 1/1.5 */
    dE = Sqrt16norm( extract_h( L_tmp ), &shift );
@@ -1884,11 +1903,7 @@ static void IGF_appl( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in
        sum = shl( sum, shift ); /* exponent of sum: sub(15, shift) */

        /* divide E by sum */
#ifdef ISSUE_1866_replace_overflow_libdec
        tmp = div_s( shr( round_fx_sat( E ), 1 ), sum ); /* shift E 1 bit to the right in order to make it smaller than sum */
#else
        tmp = div_s( shr( round_fx_o( E, &Overflow ), 1 ), sum ); /* shift E 1 bit to the right in order to make it smaller than sum */
#endif
        tmp_e = sub( add( E_e, 1 ), sub( 15, shift ) );           /* 15Q0 | sum is 15Q0 */

        /* multiply the result by the hopsize */
@@ -2575,11 +2590,7 @@ static void IGF_appl_ivas( IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /**< in
        sum = shl( sum, shift ); /* exponent of sum: sub(15, shift) */

        /* divide E by sum */
#ifdef ISSUE_1866_replace_overflow_libdec
        tmp = div_s( shr( round_fx_sat( E ), 1 ), sum ); /* shift E 1 bit to the right in order to make it smaller than sum */
#else
        tmp = div_s( shr( round_fx_o( E, &Overflow ), 1 ), sum ); /* shift E 1 bit to the right in order to make it smaller than sum */
#endif
        tmp_e = sub( add( E_e, 1 ), sub( 15, shift ) );           /* 15Q0 | sum is 15Q0 */

        /* multiply the result by the hopsize */
@@ -2983,11 +2994,9 @@ static void IGF_RefineGrid( H_IGF_GRID hGrid /**< in
    Word16 sfb;
    Word16 tmp;
    Word16 delta;
#ifndef ISSUE_1866_replace_overflow_libdec
#ifdef BASOP_NOGLOB_DECLARE_LOCAL
    Flag Overflow = 0;
    move16();
#endif
#endif

    set16_fx( a, 0, IGF_MAX_SFB + 1 );
@@ -3002,11 +3011,7 @@ static void IGF_RefineGrid( H_IGF_GRID hGrid /**< in
        move16();
        tmp = add( tmp, 1 );
        delta = sub( hGrid->swb_offset[sfb + 1], hGrid->swb_offset[sfb] );
#ifdef ISSUE_1866_replace_overflow_libdec
        delta = mac_r( 0x00195000, 29491 /*0.45f Q16*/, shl_sat( delta, 5 ) );
#else
        delta = mac_r( 0x00195000, 29491 /*0.45f Q16*/, shl_o( delta, 5, &Overflow ) );
#endif
        a[tmp] = add( hGrid->swb_offset[sfb], shr( delta, 6 ) );
        move16();
        IF( s_and( a[tmp], 1 ) != 0 )
@@ -3037,11 +3042,9 @@ static void IGF_RefineGrid_ivas_fx( H_IGF_GRID hGrid /**< in/out: | IGF grid han
    Word16 sfb;
    Word16 tmp;
    Word16 delta;
#ifndef ISSUE_1866_replace_overflow_libdec
#ifdef BASOP_NOGLOB_DECLARE_LOCAL
    Flag Overflow = 0;
    move16();
#endif
#endif

    set16_fx( a, 0, IGF_MAX_SFB + 1 );
@@ -3056,11 +3059,7 @@ static void IGF_RefineGrid_ivas_fx( H_IGF_GRID hGrid /**< in/out: | IGF grid han
        move16();
        tmp = add( tmp, 1 );
        delta = sub( hGrid->swb_offset[sfb + 1], hGrid->swb_offset[sfb] );
#ifdef ISSUE_1796_replace_shl_o
        delta = mac_r( 0x00195000, 29491 /*0.45f Q16*/, shl_sat( delta, 5 ) );
#else
        delta = mac_r( 0x00195000, 29491 /*0.45f Q16*/, shl_o( delta, 5, &Overflow ) );
#endif
        a[tmp] = add( hGrid->swb_offset[sfb], shr( delta, 6 ) );
        move16();
        // Rounding off delta values >=t+0.5 to t+1
+37 −0
Original line number Diff line number Diff line
@@ -355,10 +355,16 @@ void IGF_ErodeSpectrum( Word16 *highPassEner_exp, /**< ou
    Word16 i;
    Word16 igfBgn;
    Word16 igfEnd;
#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW
    Word32 highPassEner; /* Q31 */
#else
    Word64 highPassEner;
#endif
    Word32 lastLine;
    Word32 nextLine;
#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW
    Word32 L_c;
#endif
    Word32 highPassEner_Ovfl;
    Word16 s;
    Word16 tmploop;
@@ -374,7 +380,9 @@ void IGF_ErodeSpectrum( Word16 *highPassEner_exp, /**< ou

#ifdef BASOP_NOGLOB_DECLARE_LOCAL
    Flag Overflow = 0;
#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW
    Flag Carry = 0;
#endif
    move32();
    move32();
#endif
@@ -409,19 +417,30 @@ void IGF_ErodeSpectrum( Word16 *highPassEner_exp, /**< ou

    IF( igfBgn > 0 )
    {
#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW
        L_c = 0;
#endif
        move32();
        FOR( i = 0; i < igfBgn; i++ )
        {
#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW
            Carry = 0;
            move32();
            highPassEner = L_add_co( highPassEner, Mpy_32_16_1( pPowerSpectrum[i], shl( i, 4 ) /*Q4*/ ) /*Q20, pPowerSpectrum_exp*/, &Carry, &Overflow );
            Overflow = 0;
            move32();
            L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow );
#else
            move32();
            highPassEner = W_add( highPassEner, Mpy_32_16_1( pPowerSpectrum[i], shl( i, 4 ) /*Q4*/ ) /*Q20, pPowerSpectrum_exp*/ );
#endif
        }

#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW
        highPassEner = norm_llQ31( L_c, highPassEner, highPassEner_exp ); /*Q20, highPassEner_exp*/
#else
        highPassEner = w_norm_llQ31( highPassEner, highPassEner_exp ); /*Q20, highPassEner_exp*/
#endif
        *highPassEner_exp = add( *highPassEner_exp, pPowerSpectrum_exp );
        move16();
        test();
@@ -875,21 +894,31 @@ Word16 IGF_getSFM( /**< out: Q15| SFM value
{
    Word16 n, i, s;
    Word32 num;
#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW
    Word32 denom;
#else
    Word64 denom;
#endif
    Word16 denom_exp;
    Word16 invDenom_exp, numf_exp;
    Word16 numf;
    Word32 SFM32;
#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW
    Word32 L_c;
#endif
    Word16 invDenom, SFM;
#ifdef BASOP_NOGLOB_DECLARE_LOCAL
#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW
    Flag Overflow = 0;
    Flag Carry = 0;
#endif
    move32();
    move32();
#endif

#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW
    L_c = 0;
#endif
    move32();
    num = 0;
    move32();
@@ -919,15 +948,23 @@ Word16 IGF_getSFM( /**< out: Q15| SFM value
        n = s_max( 0, n );
        num = L_add( num, L_deposit_l( n ) ); /*Q0*/

#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW
        Carry = 0;
        move32();
        denom = L_add_co( energy[i], denom, &Carry, &Overflow );
        Overflow = 0;
        move32();
        L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow );
#else
        denom = W_add( energy[i], denom );
#endif
    }

#ifndef FIX_ISSUE_1965_REPLACE_CARRY_OVERFLOW
    denom = norm_llQ31( L_c, denom, &denom_exp ); /*Q31*/
#else
    denom = w_norm_llQ31(denom, &denom_exp ); /*Q31*/
#endif
    denom_exp = add( denom_exp, *energy_exp );

    /* calculate SFM only if signal is present */