Loading lib_dec/igf_dec_fx.c +21 −22 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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++ ) Loading @@ -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 ); Loading Loading @@ -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 */ Loading Loading @@ -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 */ Loading Loading @@ -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 ); Loading @@ -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 ) Loading Loading @@ -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 ); Loading @@ -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 Loading lib_enc/igf_enc_fx.c +37 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading Loading @@ -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(); Loading Loading @@ -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(); Loading Loading @@ -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 */ Loading Loading
lib_dec/igf_dec_fx.c +21 −22 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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++ ) Loading @@ -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 ); Loading Loading @@ -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 */ Loading Loading @@ -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 */ Loading Loading @@ -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 ); Loading @@ -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 ) Loading Loading @@ -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 ); Loading @@ -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 Loading
lib_enc/igf_enc_fx.c +37 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading Loading @@ -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(); Loading Loading @@ -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(); Loading Loading @@ -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 */ Loading